]> granicus.if.org Git - yasm/commitdiff
Add support for IEEE-754r "half precision" (16-bit) float format.
authorPeter Johnson <peter@tortall.net>
Sun, 16 Sep 2007 20:41:16 +0000 (20:41 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 16 Sep 2007 20:41:16 +0000 (20:41 -0000)
This format is used by SSE5.
Update minor tests; more extensive tests will be added soon.

svn path=/trunk/yasm/; revision=1954

libyasm/floatnum.c
modules/objfmts/bin/tests/float-err.asm
modules/objfmts/bin/tests/float-err.errwarn
modules/objfmts/bin/tests/float.asm
modules/objfmts/bin/tests/float.hex

index 951e17ca3bac38c2e7d2ad103866190eca476b07..a7cfcb7e905c9d7f2d5ad973c977aece2633c358 100644 (file)
@@ -631,7 +631,17 @@ floatnum_get_common(const yasm_floatnum *flt, /*@out@*/ unsigned char *ptr,
     return retval;
 }
 
-/* IEEE-754 (Intel) "single precision" format:
+/* IEEE-754r "half precision" format:
+ * 16 bits:
+ * 15     9      Bit 0
+ * |      |          |
+ * seee eemm mmmm mmmm
+ *
+ * e = bias 15 exponent
+ * s = sign bit
+ * m = mantissa bits, bit 10 is an implied one bit.
+ *
+ * IEEE-754 (Intel) "single precision" format:
  * 32 bits:
  * Bit 31    Bit 22              Bit 0
  * |         |                       |
@@ -672,6 +682,9 @@ yasm_floatnum_get_sized(const yasm_floatnum *flt, unsigned char *ptr,
         yasm_internal_error(N_("unsupported floatnum functionality"));
     }
     switch (destsize) {
+        case 2:
+            retval = floatnum_get_common(flt, ptr, 2, 10, 1, 5);
+            break;
         case 4:
             retval = floatnum_get_common(flt, ptr, 4, 23, 1, 8);
             break;
@@ -702,6 +715,7 @@ int
 yasm_floatnum_check_size(/*@unused@*/ const yasm_floatnum *flt, size_t size)
 {
     switch (size) {
+        case 16:
         case 32:
         case 64:
         case 80:
index 56a766c2d478e06103935d943a92eed4c3ca11c8..7c608ba02aa6bbc33c545007257d8742b5c2dfc4 100644 (file)
@@ -1,6 +1,6 @@
 ; Tests illegal float handling
 db 1.2
-dw 3.14
+dw 3.14e500
 dd 5.12e100000
 dq 3.141592653589793e-158105
 dt 5653894745.318293470142875104710284019245e-1999
index 3efe445d71bd78fcbc5d03cda3bea5c80b5ddb78..33fcebec8929816b2634218c084edb2f3f10fcf3 100644 (file)
@@ -1,8 +1,8 @@
 -:2: invalid floating point constant size
--:3: invalid floating point constant size
+-:3: warning: overflow in floating point expression
 -:4: warning: overflow in floating point expression
 -:5: warning: underflow in floating point expression
 -:8: invalid floating point constant size
--:9: invalid floating point constant size
+-:9: warning: overflow in floating point expression
 -:11: warning: overflow in floating point expression
 -:12: warning: underflow in floating point expression
index a2823f35eb2e68ed873495d359d362a5e5a702b4..32d2777bfb5c175956f59af7b7c02fc085a382b8 100644 (file)
@@ -1,8 +1,10 @@
 ; Tests float handling
+dw 3.14
 dd 5.12
 dq 3.141592653589793
 dt 5653894745.318293470142875104710284019245e335
 
+dw -62000.0
 dd -47102940.467103581
 dq -45102571092751092341095.5827509174509178450917845019
 dt -1.e-1000
index 066fa76eba53b00119b89f8d1868d2845676e27d..33b0d9787c9f260a43c5dc6ad479c0dd14511162 100644 (file)
@@ -1,3 +1,5 @@
+48 
+42 
 0a 
 d7 
 a3 
@@ -20,6 +22,8 @@ f1
 97 
 78 
 44 
+92 
+fb 
 f7 
 ae 
 33