OLD | NEW |
1 // Derived from Inferno utils/6l/obj.c and utils/6l/span.c | 1 // Derived from Inferno utils/6l/obj.c and utils/6l/span.c |
2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c | 2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c |
3 // http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c | 3 // http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c |
4 // | 4 // |
5 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. | 5 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
6 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) | 6 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
7 // Portions Copyright © 1997-1999 Vita Nuova Limited | 7 // Portions Copyright © 1997-1999 Vita Nuova Limited |
8 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) | 8 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) |
9 // Portions Copyright © 2004,2006 Bruce Ellis | 9 // Portions Copyright © 2004,2006 Bruce Ellis |
10 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) | 10 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 } | 675 } |
676 | 676 |
677 int32 | 677 int32 |
678 ieeedtof(Ieee *e) | 678 ieeedtof(Ieee *e) |
679 { | 679 { |
680 int exp; | 680 int exp; |
681 int32 v; | 681 int32 v; |
682 | 682 |
683 if(e->h == 0) | 683 if(e->h == 0) |
684 return 0; | 684 return 0; |
| 685 if(e->h == (int32)1<<31) |
| 686 return (int32)1<<31; |
685 exp = (e->h>>20) & ((1L<<11)-1L); | 687 exp = (e->h>>20) & ((1L<<11)-1L); |
686 exp -= (1L<<10) - 2L; | 688 exp -= (1L<<10) - 2L; |
687 v = (e->h & 0xfffffL) << 3; | 689 v = (e->h & 0xfffffL) << 3; |
688 v |= (e->l >> 29) & 0x7L; | 690 v |= (e->l >> 29) & 0x7L; |
689 if((e->l >> 28) & 1) { | 691 if((e->l >> 28) & 1) { |
690 v++; | 692 v++; |
691 if(v & 0x800000L) { | 693 if(v & 0x800000L) { |
692 v = (v & 0x7fffffL) >> 1; | 694 v = (v & 0x7fffffL) >> 1; |
693 exp++; | 695 exp++; |
694 } | 696 } |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1066 } | 1068 } |
1067 | 1069 |
1068 uint64 | 1070 uint64 |
1069 be64(uchar *b) | 1071 be64(uchar *b) |
1070 { | 1072 { |
1071 return (uvlong)be32(b)<<32 | be32(b+4); | 1073 return (uvlong)be32(b)<<32 | be32(b+4); |
1072 } | 1074 } |
1073 | 1075 |
1074 Endian be = { be16, be32, be64 }; | 1076 Endian be = { be16, be32, be64 }; |
1075 Endian le = { le16, le32, le64 }; | 1077 Endian le = { le16, le32, le64 }; |
OLD | NEW |