瀏覽代碼

convert_u bug fixes

Nikolay Korovaiko 9 年之前
父節點
當前提交
06b69c1ac2

+ 2 - 2
lib/Backend/amd64/EncoderMD.cpp

@@ -613,7 +613,7 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress)
 
     if (opr1)
     {
-        instrSize = this->GetOpndSize(opr1);
+        instrSize = this->GetOpndSize(opdope & DREXSRC ? opr2 : opr1);
 
 #if DBG
         switch (instr->m_opcode)
@@ -859,7 +859,7 @@ EncoderMD::Encode(IR::Instr *instr, BYTE *pc, BYTE* beginCodeAddress)
             }
             else if (opr1->IsRegOpnd())
             {
-                rexByte    |= this->GetRexByte(this->REXR, opr1);
+                rexByte |= this->GetRexByte(this->REXR, opr1);
                 rexByte    |= this->EmitModRM(instr, opr2, this->GetRegEncode(opr1->AsRegOpnd()));
                 if ((*form) & DBIT)
                 {

+ 1 - 1
lib/Backend/amd64/MdOpCodes.h

@@ -74,7 +74,7 @@ MACRO(CVTDQ2PS, Reg2,   None,          RNON,   f(MODRM),   o(CVTDQ2PS),DDST|DNO1
 
 MACRO(CVTSD2SI, Reg2,   None,          RNON,   f(MODRM),   o(CVTSD2SI),DDST|DNO16|DF2,              OLB_0F)
 MACRO(CVTSI2SD, Reg2,   None,          RNON,   f(MODRM),   o(CVTSI2SD),DDST|DNO16|DF2,              OLB_0F)
-MACRO(CVTSI2SS, Reg2,   None,          RNON,   f(MODRM),   o(CVTSI2SS),DDST|DNO16|DF3,              OLB_0F)
+MACRO(CVTSI2SS, Reg2,   None,          RNON,   f(MODRM),   o(CVTSI2SS),DDST|DNO16|DF3|DREXSRC,      OLB_0F)
 MACRO(CVTPD2PS, Reg2,   None,          RNON,   f(MODRM),   o(CVTPD2PS),DDST|DNO16|D66,              OLB_0F)
 
 MACRO(CVTPS2PD, Reg2,   None,          RNON,   f(MODRM),   o(CVTPS2PD),DDST|DNO16,                  OLB_0F)

+ 1 - 0
lib/Backend/amd64/X64Encode.h

@@ -42,6 +42,7 @@
 #define DMOV    0x10000  /* Instruction is a MOV or a synonym for MOV (e.g., MOV_TRUNC) */
 #define D66     0x100000 // 0x66 0x0F style WNI form (usually 128-bit DP FP)
 #define DF2     0x200000 /* 0xF2 0x0F style WNI form (usually 64-bit DP FP) */
+#define DREXSRC  0x400000 /* Use src1's size to generate REX byte */
 
 // 2nd 3 bits is options
 #define SBIT 0x20

+ 12 - 0
lib/Backend/i386/LowererMDArch.cpp

@@ -2529,6 +2529,13 @@ LowererMDArch::EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrIns
     // We should only generate this if sse2 is available
     Assert(AutoSystemInfo::Data.SSE2Available());
 
+    IR::Opnd* origDst = nullptr;
+    if (dst->IsFloat32())
+    {
+        origDst = dst;
+        dst = IR::RegOpnd::New(TyFloat64, this->m_func);
+    }
+
     this->lowererMD->EmitIntToFloat(dst, src, instrInsert);
 
     IR::RegOpnd * highestBitOpnd = IR::RegOpnd::New(TyInt32, this->m_func);
@@ -2550,6 +2557,11 @@ LowererMDArch::EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrIns
     instr = IR::Instr::New(Js::OpCode::ADDSD, dst, dst, IR::IndirOpnd::New(baseOpnd,
         highestBitOpnd, IndirScale8, TyFloat64, this->m_func), this->m_func);
     instrInsert->InsertBefore(instr);
+
+    if (origDst)
+    {
+        instrInsert->InsertBefore(IR::Instr::New(Js::OpCode::CVTSD2SS, origDst, dst, this->m_func));
+    }
 }
 
 void

+ 1 - 1
test/WasmSpec/baselines/float_exprs.baseline

@@ -8,4 +8,4 @@ $action_1 = undefined
 $action_2 = undefined
 $action_3 = undefined
 $action_8 = undefined
-688/688 tests passed.
+693/693 tests passed.

二進制
test/WasmSpec/testsuite-bin/float_exprs.37.wasm


+ 46 - 21
test/WasmSpec/testsuite-bin/float_exprs.json

@@ -1516,111 +1516,136 @@
       "type": "assert_return",
       "name": "$assert_return_5",
       "file": "float_exprs.wast",
-      "line": 702
+      "line": 698
     }, {
       "type": "assert_return",
       "name": "$assert_return_6",
       "file": "float_exprs.wast",
-      "line": 703
+      "line": 699
     }, {
       "type": "assert_return",
       "name": "$assert_return_7",
       "file": "float_exprs.wast",
-      "line": 704
+      "line": 700
     }, {
       "type": "assert_return",
       "name": "$assert_return_8",
       "file": "float_exprs.wast",
-      "line": 705
+      "line": 702
     }, {
       "type": "assert_return",
       "name": "$assert_return_9",
       "file": "float_exprs.wast",
-      "line": 706
+      "line": 703
     }, {
       "type": "assert_return",
       "name": "$assert_return_10",
       "file": "float_exprs.wast",
-      "line": 707
+      "line": 704
     }, {
       "type": "assert_return",
       "name": "$assert_return_11",
       "file": "float_exprs.wast",
-      "line": 711
+      "line": 705
     }, {
       "type": "assert_return",
       "name": "$assert_return_12",
       "file": "float_exprs.wast",
-      "line": 712
+      "line": 706
     }, {
       "type": "assert_return",
       "name": "$assert_return_13",
       "file": "float_exprs.wast",
-      "line": 713
+      "line": 707
     }, {
       "type": "assert_return",
       "name": "$assert_return_14",
       "file": "float_exprs.wast",
-      "line": 714
+      "line": 708
     }, {
       "type": "assert_return",
       "name": "$assert_return_15",
       "file": "float_exprs.wast",
-      "line": 715
+      "line": 709
     }, {
       "type": "assert_return",
       "name": "$assert_return_16",
       "file": "float_exprs.wast",
-      "line": 716
+      "line": 711
     }, {
       "type": "assert_return",
       "name": "$assert_return_17",
       "file": "float_exprs.wast",
-      "line": 717
+      "line": 712
     }, {
       "type": "assert_return",
       "name": "$assert_return_18",
       "file": "float_exprs.wast",
-      "line": 718
+      "line": 713
     }, {
       "type": "assert_return",
       "name": "$assert_return_19",
       "file": "float_exprs.wast",
-      "line": 720
+      "line": 714
     }, {
       "type": "assert_return",
       "name": "$assert_return_20",
       "file": "float_exprs.wast",
-      "line": 721
+      "line": 715
     }, {
       "type": "assert_return",
       "name": "$assert_return_21",
       "file": "float_exprs.wast",
-      "line": 722
+      "line": 716
     }, {
       "type": "assert_return",
       "name": "$assert_return_22",
       "file": "float_exprs.wast",
-      "line": 723
+      "line": 717
     }, {
       "type": "assert_return",
       "name": "$assert_return_23",
       "file": "float_exprs.wast",
-      "line": 724
+      "line": 718
     }, {
       "type": "assert_return",
       "name": "$assert_return_24",
       "file": "float_exprs.wast",
-      "line": 725
+      "line": 720
     }, {
       "type": "assert_return",
       "name": "$assert_return_25",
       "file": "float_exprs.wast",
-      "line": 726
+      "line": 721
     }, {
       "type": "assert_return",
       "name": "$assert_return_26",
       "file": "float_exprs.wast",
+      "line": 722
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_27",
+      "file": "float_exprs.wast",
+      "line": 723
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_28",
+      "file": "float_exprs.wast",
+      "line": 724
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_29",
+      "file": "float_exprs.wast",
+      "line": 725
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_30",
+      "file": "float_exprs.wast",
+      "line": 726
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_31",
+      "file": "float_exprs.wast",
       "line": 727
     }]
   }, {

+ 5 - 5
test/WasmSpec/testsuite/float_exprs.wast

@@ -695,9 +695,9 @@
 (assert_return (invoke "f32.i32.no_fold_trunc_u_convert_s" (f32.const 1.5)) (f32.const 1.0)) ;; see issue #1957
 (assert_return (invoke "f32.i32.no_fold_trunc_u_convert_s" (f32.const -0.5)) (f32.const 0.0)) ;; see issue #1957
 (assert_return (invoke "f32.i32.no_fold_trunc_s_convert_u" (f32.const 1.5)) (f32.const 1.0))
-;;(assert_return (invoke "f32.i32.no_fold_trunc_s_convert_u" (f32.const -1.5)) (f32.const 0x1p+32)) ;; See #1967
-;;(assert_return (invoke "f32.i32.no_fold_trunc_u_convert_u" (f32.const 1.5)) (f32.const 1.0)) ;; See #1967
-;;(assert_return (invoke "f32.i32.no_fold_trunc_u_convert_u" (f32.const -0.5)) (f32.const 0.0)) ;; See #1967
+(assert_return (invoke "f32.i32.no_fold_trunc_s_convert_u" (f32.const -1.5)) (f32.const 0x1p+32)) ;; See #1967
+(assert_return (invoke "f32.i32.no_fold_trunc_u_convert_u" (f32.const 1.5)) (f32.const 1.0)) ;; See #1967
+(assert_return (invoke "f32.i32.no_fold_trunc_u_convert_u" (f32.const -0.5)) (f32.const 0.0)) ;; See #1967
 
 (assert_return (invoke "f64.i32.no_fold_trunc_s_convert_s" (f64.const 1.5)) (f64.const 1.0))
 (assert_return (invoke "f64.i32.no_fold_trunc_s_convert_s" (f64.const -1.5)) (f64.const -1.0))
@@ -705,8 +705,8 @@
 (assert_return (invoke "f64.i32.no_fold_trunc_u_convert_s" (f64.const -0.5)) (f64.const 0.0)) ;; See #1957
 (assert_return (invoke "f64.i32.no_fold_trunc_s_convert_u" (f64.const 1.5)) (f64.const 1.0))
 (assert_return (invoke "f64.i32.no_fold_trunc_s_convert_u" (f64.const -1.5)) (f64.const 0x1.fffffffep+31))
-;;(assert_return (invoke "f64.i32.no_fold_trunc_u_convert_u" (f64.const 1.5)) (f64.const 1.0)) ;; See #1957
-;;(assert_return (invoke "f64.i32.no_fold_trunc_u_convert_u" (f64.const -0.5)) (f64.const 0.0)) ;; See #1957
+(assert_return (invoke "f64.i32.no_fold_trunc_u_convert_u" (f64.const 1.5)) (f64.const 1.0)) ;; See #1957
+(assert_return (invoke "f64.i32.no_fold_trunc_u_convert_u" (f64.const -0.5)) (f64.const 0.0)) ;; See #1957
 
 (assert_return (invoke "f32.i64.no_fold_trunc_s_convert_s" (f32.const 1.5)) (f32.const 1.0))
 (assert_return (invoke "f32.i64.no_fold_trunc_s_convert_s" (f32.const -1.5)) (f32.const -1.0))