Преглед на файлове

[MERGE #2146 @Cellule] WASM - f64.mul/div interpreter precision on x86

Merge pull request #2146 from Cellule:wasm/f64_precision

Wasm: Manually implement div/mul for double to have the same precision in interpreter and jitted code.

Fixes #2145

Revert "Disable tests in float_misc.wast until fix has been found"

This reverts commit 1e77788b7d40cf77f9a80baffc535e498ba2c081.
Michael Ferris преди 9 години
родител
ревизия
971638df6e

+ 2 - 2
lib/Backend/JnHelperMethodList.h

@@ -564,8 +564,8 @@ HELPERCALL(DirectMath_Exp, nullptr, 0)
 HELPERCALL(DirectMath_Log, nullptr, 0)
 HELPERCALL(DirectMath_Sin, nullptr, 0)
 HELPERCALL(DirectMath_Tan, nullptr, 0)
-HELPERCALL(DirectMath_Int64DivS, ((int64(*)(int64, int64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivOverflow<int64, &Wasm::WasmMath::Div<int64>, LONGLONG_MIN>), AttrCanThrow)
-HELPERCALL(DirectMath_Int64DivU, ((uint64(*)(uint64, uint64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivRemCheck<uint64, &Wasm::WasmMath::Div<uint64>>), AttrCanThrow)
+HELPERCALL(DirectMath_Int64DivS, ((int64(*)(int64, int64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivOverflow<int64, &Js::AsmJsMath::Div<int64>, LONGLONG_MIN>), AttrCanThrow)
+HELPERCALL(DirectMath_Int64DivU, ((uint64(*)(uint64, uint64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivRemCheck<uint64, &Js::AsmJsMath::Div<uint64>>), AttrCanThrow)
 HELPERCALL(DirectMath_Int64RemS, ((int64(*)(int64, int64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivRemCheck<int64, &Wasm::WasmMath::Rem<int64>>), AttrCanThrow)
 HELPERCALL(DirectMath_Int64RemU, ((uint64(*)(uint64, uint64, Js::ScriptContext*)) Js::InterpreterStackFrame::OP_DivRemCheck<uint64, &Wasm::WasmMath::Rem<uint64>>), AttrCanThrow)
 HELPERCALL(DirectMath_Int64Mul , (int64(*)(int64,int64)) Js::AsmJsMath::Mul<int64>, 0)

+ 2 - 2
lib/Runtime/Language/InterpreterHandlerAsmJs.inl

@@ -128,8 +128,8 @@ EXDEF2    (NOPASMJS          , InvalidOpCode, Empty
   DEF2_WMS( L2toL1Mem        , Add_Long     , AsmJsMath::Add<int64>)
   DEF2_WMS( L2toL1Mem        , Sub_Long     , AsmJsMath::Sub<int64>)
   DEF2_WMS( L2toL1Mem        , Mul_Long     , AsmJsMath::Mul<int64>)
-  DEF2_WMS( L2toL1Ctx        , Div_Long     , (OP_DivOverflow<int64,  &Wasm::WasmMath::Div<int64>, LONGLONG_MIN>) )
-  DEF2_WMS( L2toL1Ctx        , Div_ULong    , (OP_DivRemCheck<uint64, &Wasm::WasmMath::Div<uint64>>)   )
+  DEF2_WMS( L2toL1Ctx        , Div_Long     , (OP_DivOverflow<int64,  &AsmJsMath::Div<int64>, LONGLONG_MIN>) )
+  DEF2_WMS( L2toL1Ctx        , Div_ULong    , (OP_DivRemCheck<uint64, &AsmJsMath::Div<uint64>>)   )
   DEF2_WMS( L2toL1Ctx        , Rem_Long     , (OP_DivRemCheck<int64,  &Wasm::WasmMath::Rem<int64>>)    )
   DEF2_WMS( L2toL1Ctx        , Rem_ULong    , (OP_DivRemCheck<uint64, &Wasm::WasmMath::Rem<uint64>>)   )
   DEF2_WMS( L2toL1Mem        , And_Long     , AsmJsMath::And<int64>)

+ 1 - 2
lib/Runtime/Language/JavascriptMathOperators.h

@@ -5,6 +5,5 @@
 #pragma once
 
 #include "JavascriptMath.h"
-#include "AsmJsMath.h"
-#include "WasmMath.h"
+
 

+ 0 - 2
lib/Runtime/Language/JavascriptMathOperators.inl

@@ -5,5 +5,3 @@
 #pragma once
 
 #include "../Math/JavascriptMath.inl"
-#include "../Math/AsmJsMath.inl"
-#include "../Math/WasmMath.inl"

+ 20 - 2
lib/Runtime/Math/AsmJsMath.cpp

@@ -6,9 +6,27 @@
 
 namespace Js
 {
+    // These implementations need to be compiled with /arch:sse2
+#define DivImpl(type) template<> type AsmJsMath::Div(type aLeft, type aRight) { return aLeft / aRight; }
+#define MulImpl(type) template<> type AsmJsMath::Mul(type aLeft, type aRight) { return aLeft * aRight; }
+#define DivMulImpl(type) DivImpl(type) MulImpl(type)
 
+    DivMulImpl(float)
+    DivMulImpl(double)
+    DivMulImpl(int64)
+    DivMulImpl(uint64)
+    MulImpl(int32)
+    MulImpl(uint32)
 
+    template<>
+    int32 AsmJsMath::Div<int32>(int32 aLeft, int32 aRight)
+    {
+        return aRight == 0 ? 0 : (aLeft == (1 << 31) && aRight == -1) ? aLeft : aLeft / aRight;
+    }
 
-
-
+    template<>
+    uint32 AsmJsMath::Div<uint32>(uint32 aLeft, uint32 aRight)
+    {
+        return aRight == 0 ? 0 : aLeft / aRight;
+    }
 }

+ 2 - 3
lib/Runtime/Math/AsmJsMath.h

@@ -37,7 +37,6 @@ namespace Js
         template<typename T> static int CmpEq( T aLeft, T aRight );
         template<typename T> static int CmpNe( T aLeft, T aRight );
     };
-
-
-
 }
+
+#include "AsmJsMath.inl"

+ 1 - 24
lib/Runtime/Math/AsmJsMath.inl

@@ -2,6 +2,7 @@
 // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
 // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
 //-------------------------------------------------------------------------------------------------------
+
 namespace Js
 {
 
@@ -91,30 +92,6 @@ namespace Js
         return aLeft + aRight;
     }
 
-    template<>
-    inline int32 AsmJsMath::Div<int32>( int32 aLeft, int32 aRight )
-    {
-        return aRight == 0 ? 0 : ( aLeft == (1<<31) && aRight == -1) ? aLeft : aLeft / aRight;
-    }
-
-    template<>
-    inline uint32 AsmJsMath::Div<uint32>(uint32 aLeft, uint32 aRight)
-    {
-        return aRight == 0 ? 0 : aLeft / aRight;
-    }
-
-    template<typename T>
-    inline T AsmJsMath::Div( T aLeft, T aRight )
-    {
-        return aLeft / aRight;
-    }
-
-    template<typename T>
-    inline T AsmJsMath::Mul( T aLeft, T aRight )
-    {
-        return aLeft * aRight;
-    }
-
     template<typename T>
     inline T AsmJsMath::Sub( T aLeft, T aRight )
     {

+ 1 - 1
lib/Runtime/Math/JavascriptSSE2MathOperators.inl

@@ -6,4 +6,4 @@
 
 #define SSE2MATH
 #include "JavascriptMath.inl"
-#undef SSE2MATH
+#undef SSE2MATH

+ 3 - 1
lib/Runtime/Math/RuntimeMathPch.h

@@ -5,4 +5,6 @@
 #pragma once
 #include "Runtime.h"
 #include "Math/JavascriptSSE2MathOperators.h"
-#include "Math/JavascriptSSE2MathOperators.inl"
+#include "Math/JavascriptSSE2MathOperators.inl"
+#include "AsmJsMath.h"
+#include "WasmMath.h"

+ 1 - 1
lib/Runtime/Math/WasmMath.h

@@ -11,7 +11,6 @@ class WasmMath
 {
 public:
     template<typename T> static int Eqz(T value);
-    template<typename T> static T Div( T aLeft, T aRight );
     template<typename T> static T Rem( T aLeft, T aRight );
     template<typename T> static T Shl( T aLeft, T aRight );
     template<typename T> static T Shr( T aLeft, T aRight );
@@ -33,3 +32,4 @@ public:
 
 } //namespace Wasm
 
+#include "WasmMath.inl"

+ 0 - 11
lib/Runtime/Math/WasmMath.inl

@@ -6,31 +6,20 @@
 
 namespace Wasm
 {
-
-template<typename T>
-inline T WasmMath::Div( T aLeft, T aRight )
-{
-    // Todo:: Trap on aRight == 0 for int64 and uint64
-    return aLeft / aRight;
-}
-
 const uint64 specialDivLeftValue = (uint64)1 << 63;
 
 template<>
 inline int64 WasmMath::Rem( int64 aLeft, int64 aRight )
 {
-    // Todo:: Trap on aRight == 0
     return (aLeft == specialDivLeftValue && aRight == -1) ? 0 : aLeft % aRight;
 }
 
 template<>
 inline uint64 WasmMath::Rem( uint64 aLeft, uint64 aRight )
 {
-    // Todo:: Trap on aRight == 0
     return (aLeft == specialDivLeftValue && aRight == -1) ? specialDivLeftValue : aLeft % aRight;
 }
 
-
 template<typename T> 
 inline T WasmMath::Shl( T aLeft, T aRight )
 {

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

@@ -1 +1 @@
-394/394 tests passed.
+405/405 tests passed.

BIN
test/WasmSpec/testsuite-bin/float_misc.0.wasm


+ 262 - 207
test/WasmSpec/testsuite-bin/float_misc.json

@@ -935,1040 +935,1095 @@
       "type": "assert_return",
       "name": "$assert_return_186",
       "file": "float_misc.wast",
-      "line": 320
+      "line": 313
     }, {
       "type": "assert_return",
       "name": "$assert_return_187",
       "file": "float_misc.wast",
-      "line": 321
+      "line": 314
     }, {
       "type": "assert_return",
       "name": "$assert_return_188",
       "file": "float_misc.wast",
-      "line": 322
+      "line": 315
     }, {
       "type": "assert_return",
       "name": "$assert_return_189",
       "file": "float_misc.wast",
-      "line": 323
+      "line": 316
     }, {
       "type": "assert_return",
       "name": "$assert_return_190",
       "file": "float_misc.wast",
-      "line": 324
+      "line": 317
     }, {
       "type": "assert_return",
       "name": "$assert_return_191",
       "file": "float_misc.wast",
-      "line": 327
+      "line": 320
     }, {
       "type": "assert_return",
       "name": "$assert_return_192",
       "file": "float_misc.wast",
-      "line": 328
+      "line": 321
     }, {
       "type": "assert_return",
       "name": "$assert_return_193",
       "file": "float_misc.wast",
-      "line": 329
+      "line": 322
     }, {
       "type": "assert_return",
       "name": "$assert_return_194",
       "file": "float_misc.wast",
-      "line": 330
+      "line": 323
     }, {
       "type": "assert_return",
       "name": "$assert_return_195",
       "file": "float_misc.wast",
-      "line": 333
+      "line": 324
     }, {
       "type": "assert_return",
       "name": "$assert_return_196",
       "file": "float_misc.wast",
-      "line": 334
+      "line": 327
     }, {
       "type": "assert_return",
       "name": "$assert_return_197",
       "file": "float_misc.wast",
-      "line": 335
+      "line": 328
     }, {
       "type": "assert_return",
       "name": "$assert_return_198",
       "file": "float_misc.wast",
-      "line": 336
+      "line": 329
     }, {
       "type": "assert_return",
       "name": "$assert_return_199",
       "file": "float_misc.wast",
-      "line": 340
+      "line": 330
     }, {
       "type": "assert_return",
       "name": "$assert_return_200",
       "file": "float_misc.wast",
-      "line": 341
+      "line": 333
     }, {
       "type": "assert_return",
       "name": "$assert_return_201",
       "file": "float_misc.wast",
-      "line": 344
+      "line": 334
     }, {
       "type": "assert_return",
       "name": "$assert_return_202",
       "file": "float_misc.wast",
-      "line": 345
+      "line": 335
     }, {
       "type": "assert_return",
       "name": "$assert_return_203",
       "file": "float_misc.wast",
-      "line": 346
+      "line": 336
     }, {
       "type": "assert_return",
       "name": "$assert_return_204",
       "file": "float_misc.wast",
-      "line": 347
+      "line": 340
     }, {
       "type": "assert_return",
       "name": "$assert_return_205",
       "file": "float_misc.wast",
-      "line": 348
+      "line": 341
     }, {
       "type": "assert_return",
       "name": "$assert_return_206",
       "file": "float_misc.wast",
-      "line": 349
+      "line": 344
     }, {
       "type": "assert_return",
       "name": "$assert_return_207",
       "file": "float_misc.wast",
-      "line": 350
+      "line": 345
     }, {
       "type": "assert_return",
       "name": "$assert_return_208",
       "file": "float_misc.wast",
-      "line": 351
+      "line": 346
     }, {
       "type": "assert_return",
       "name": "$assert_return_209",
       "file": "float_misc.wast",
-      "line": 352
+      "line": 347
     }, {
       "type": "assert_return",
       "name": "$assert_return_210",
       "file": "float_misc.wast",
-      "line": 353
+      "line": 348
     }, {
       "type": "assert_return",
       "name": "$assert_return_211",
       "file": "float_misc.wast",
-      "line": 357
+      "line": 349
     }, {
       "type": "assert_return",
       "name": "$assert_return_212",
       "file": "float_misc.wast",
-      "line": 358
+      "line": 350
     }, {
       "type": "assert_return",
       "name": "$assert_return_213",
       "file": "float_misc.wast",
-      "line": 361
+      "line": 351
     }, {
       "type": "assert_return",
       "name": "$assert_return_214",
       "file": "float_misc.wast",
-      "line": 362
+      "line": 352
     }, {
       "type": "assert_return",
       "name": "$assert_return_215",
       "file": "float_misc.wast",
-      "line": 363
+      "line": 353
     }, {
       "type": "assert_return",
       "name": "$assert_return_216",
       "file": "float_misc.wast",
-      "line": 364
+      "line": 357
     }, {
       "type": "assert_return",
       "name": "$assert_return_217",
       "file": "float_misc.wast",
-      "line": 365
+      "line": 358
     }, {
       "type": "assert_return",
       "name": "$assert_return_218",
       "file": "float_misc.wast",
-      "line": 366
+      "line": 361
     }, {
       "type": "assert_return",
       "name": "$assert_return_219",
       "file": "float_misc.wast",
-      "line": 367
+      "line": 362
     }, {
       "type": "assert_return",
       "name": "$assert_return_220",
       "file": "float_misc.wast",
-      "line": 368
+      "line": 363
     }, {
       "type": "assert_return",
       "name": "$assert_return_221",
       "file": "float_misc.wast",
-      "line": 369
+      "line": 364
     }, {
       "type": "assert_return",
       "name": "$assert_return_222",
       "file": "float_misc.wast",
-      "line": 370
+      "line": 365
     }, {
       "type": "assert_return",
       "name": "$assert_return_223",
       "file": "float_misc.wast",
-      "line": 373
+      "line": 366
     }, {
       "type": "assert_return",
       "name": "$assert_return_224",
       "file": "float_misc.wast",
-      "line": 374
+      "line": 367
     }, {
       "type": "assert_return",
       "name": "$assert_return_225",
       "file": "float_misc.wast",
-      "line": 375
+      "line": 368
     }, {
       "type": "assert_return",
       "name": "$assert_return_226",
       "file": "float_misc.wast",
-      "line": 376
+      "line": 369
     }, {
       "type": "assert_return",
       "name": "$assert_return_227",
       "file": "float_misc.wast",
-      "line": 377
+      "line": 370
     }, {
       "type": "assert_return",
       "name": "$assert_return_228",
       "file": "float_misc.wast",
-      "line": 378
+      "line": 373
     }, {
       "type": "assert_return",
       "name": "$assert_return_229",
       "file": "float_misc.wast",
-      "line": 379
+      "line": 374
     }, {
       "type": "assert_return",
       "name": "$assert_return_230",
       "file": "float_misc.wast",
-      "line": 380
+      "line": 375
     }, {
       "type": "assert_return",
       "name": "$assert_return_231",
       "file": "float_misc.wast",
-      "line": 381
+      "line": 376
     }, {
       "type": "assert_return",
       "name": "$assert_return_232",
       "file": "float_misc.wast",
-      "line": 382
+      "line": 377
     }, {
       "type": "assert_return",
       "name": "$assert_return_233",
       "file": "float_misc.wast",
-      "line": 385
+      "line": 378
     }, {
       "type": "assert_return",
       "name": "$assert_return_234",
       "file": "float_misc.wast",
-      "line": 386
+      "line": 379
     }, {
       "type": "assert_return",
       "name": "$assert_return_235",
       "file": "float_misc.wast",
-      "line": 387
+      "line": 380
     }, {
       "type": "assert_return",
       "name": "$assert_return_236",
       "file": "float_misc.wast",
-      "line": 388
+      "line": 381
     }, {
       "type": "assert_return",
       "name": "$assert_return_237",
       "file": "float_misc.wast",
-      "line": 389
+      "line": 382
     }, {
       "type": "assert_return",
       "name": "$assert_return_238",
       "file": "float_misc.wast",
-      "line": 390
+      "line": 385
     }, {
       "type": "assert_return",
       "name": "$assert_return_239",
       "file": "float_misc.wast",
-      "line": 391
+      "line": 386
     }, {
       "type": "assert_return",
       "name": "$assert_return_240",
       "file": "float_misc.wast",
-      "line": 392
+      "line": 387
     }, {
       "type": "assert_return",
       "name": "$assert_return_241",
       "file": "float_misc.wast",
-      "line": 393
+      "line": 388
     }, {
       "type": "assert_return",
       "name": "$assert_return_242",
       "file": "float_misc.wast",
-      "line": 394
+      "line": 389
     }, {
       "type": "assert_return",
       "name": "$assert_return_243",
       "file": "float_misc.wast",
-      "line": 397
+      "line": 390
     }, {
       "type": "assert_return",
       "name": "$assert_return_244",
       "file": "float_misc.wast",
-      "line": 398
+      "line": 391
     }, {
       "type": "assert_return",
       "name": "$assert_return_245",
       "file": "float_misc.wast",
-      "line": 399
+      "line": 392
     }, {
       "type": "assert_return",
       "name": "$assert_return_246",
       "file": "float_misc.wast",
-      "line": 400
+      "line": 393
     }, {
       "type": "assert_return",
       "name": "$assert_return_247",
       "file": "float_misc.wast",
-      "line": 401
+      "line": 394
     }, {
       "type": "assert_return",
       "name": "$assert_return_248",
       "file": "float_misc.wast",
-      "line": 412
+      "line": 397
     }, {
       "type": "assert_return",
       "name": "$assert_return_249",
       "file": "float_misc.wast",
-      "line": 413
+      "line": 398
     }, {
       "type": "assert_return",
       "name": "$assert_return_250",
       "file": "float_misc.wast",
-      "line": 414
+      "line": 399
     }, {
       "type": "assert_return",
       "name": "$assert_return_251",
       "file": "float_misc.wast",
-      "line": 415
+      "line": 400
     }, {
       "type": "assert_return",
       "name": "$assert_return_252",
       "file": "float_misc.wast",
-      "line": 416
+      "line": 401
     }, {
       "type": "assert_return",
       "name": "$assert_return_253",
       "file": "float_misc.wast",
-      "line": 417
+      "line": 404
     }, {
       "type": "assert_return",
       "name": "$assert_return_254",
       "file": "float_misc.wast",
-      "line": 418
+      "line": 405
     }, {
       "type": "assert_return",
       "name": "$assert_return_255",
       "file": "float_misc.wast",
-      "line": 419
+      "line": 406
     }, {
       "type": "assert_return",
       "name": "$assert_return_256",
       "file": "float_misc.wast",
-      "line": 420
+      "line": 407
     }, {
       "type": "assert_return",
       "name": "$assert_return_257",
       "file": "float_misc.wast",
-      "line": 421
+      "line": 408
     }, {
       "type": "assert_return",
       "name": "$assert_return_258",
       "file": "float_misc.wast",
-      "line": 424
+      "line": 409
     }, {
       "type": "assert_return",
       "name": "$assert_return_259",
       "file": "float_misc.wast",
-      "line": 425
+      "line": 412
     }, {
       "type": "assert_return",
       "name": "$assert_return_260",
       "file": "float_misc.wast",
-      "line": 426
+      "line": 413
     }, {
       "type": "assert_return",
       "name": "$assert_return_261",
       "file": "float_misc.wast",
-      "line": 427
+      "line": 414
     }, {
       "type": "assert_return",
       "name": "$assert_return_262",
       "file": "float_misc.wast",
-      "line": 428
+      "line": 415
     }, {
       "type": "assert_return",
       "name": "$assert_return_263",
       "file": "float_misc.wast",
-      "line": 431
+      "line": 416
     }, {
       "type": "assert_return",
       "name": "$assert_return_264",
       "file": "float_misc.wast",
-      "line": 432
+      "line": 417
     }, {
       "type": "assert_return",
       "name": "$assert_return_265",
       "file": "float_misc.wast",
-      "line": 433
+      "line": 418
     }, {
       "type": "assert_return",
       "name": "$assert_return_266",
       "file": "float_misc.wast",
-      "line": 434
+      "line": 419
     }, {
       "type": "assert_return",
       "name": "$assert_return_267",
       "file": "float_misc.wast",
-      "line": 437
+      "line": 420
     }, {
       "type": "assert_return",
       "name": "$assert_return_268",
       "file": "float_misc.wast",
-      "line": 438
+      "line": 421
     }, {
       "type": "assert_return",
       "name": "$assert_return_269",
       "file": "float_misc.wast",
-      "line": 439
+      "line": 424
     }, {
       "type": "assert_return",
       "name": "$assert_return_270",
       "file": "float_misc.wast",
-      "line": 440
+      "line": 425
     }, {
       "type": "assert_return",
       "name": "$assert_return_271",
       "file": "float_misc.wast",
-      "line": 443
+      "line": 426
     }, {
       "type": "assert_return",
       "name": "$assert_return_272",
       "file": "float_misc.wast",
-      "line": 444
+      "line": 427
     }, {
       "type": "assert_return",
       "name": "$assert_return_273",
       "file": "float_misc.wast",
-      "line": 445
+      "line": 428
     }, {
       "type": "assert_return",
       "name": "$assert_return_274",
       "file": "float_misc.wast",
-      "line": 446
+      "line": 431
     }, {
       "type": "assert_return",
       "name": "$assert_return_275",
       "file": "float_misc.wast",
-      "line": 449
+      "line": 432
     }, {
       "type": "assert_return",
       "name": "$assert_return_276",
       "file": "float_misc.wast",
-      "line": 450
+      "line": 433
     }, {
       "type": "assert_return",
       "name": "$assert_return_277",
       "file": "float_misc.wast",
-      "line": 451
+      "line": 434
     }, {
       "type": "assert_return",
       "name": "$assert_return_278",
       "file": "float_misc.wast",
-      "line": 452
+      "line": 437
     }, {
       "type": "assert_return",
       "name": "$assert_return_279",
       "file": "float_misc.wast",
-      "line": 456
+      "line": 438
     }, {
       "type": "assert_return",
       "name": "$assert_return_280",
       "file": "float_misc.wast",
-      "line": 457
+      "line": 439
     }, {
       "type": "assert_return",
       "name": "$assert_return_281",
       "file": "float_misc.wast",
-      "line": 467
+      "line": 440
     }, {
       "type": "assert_return",
       "name": "$assert_return_282",
       "file": "float_misc.wast",
-      "line": 468
+      "line": 443
     }, {
       "type": "assert_return",
       "name": "$assert_return_283",
       "file": "float_misc.wast",
-      "line": 469
+      "line": 444
     }, {
       "type": "assert_return",
       "name": "$assert_return_284",
       "file": "float_misc.wast",
-      "line": 470
+      "line": 445
     }, {
       "type": "assert_return",
       "name": "$assert_return_285",
       "file": "float_misc.wast",
-      "line": 471
+      "line": 446
     }, {
       "type": "assert_return",
       "name": "$assert_return_286",
       "file": "float_misc.wast",
-      "line": 472
+      "line": 449
     }, {
       "type": "assert_return",
       "name": "$assert_return_287",
       "file": "float_misc.wast",
-      "line": 476
+      "line": 450
     }, {
       "type": "assert_return",
       "name": "$assert_return_288",
       "file": "float_misc.wast",
-      "line": 477
+      "line": 451
     }, {
       "type": "assert_return",
       "name": "$assert_return_289",
       "file": "float_misc.wast",
-      "line": 478
+      "line": 452
     }, {
       "type": "assert_return",
       "name": "$assert_return_290",
       "file": "float_misc.wast",
-      "line": 479
+      "line": 456
     }, {
       "type": "assert_return",
       "name": "$assert_return_291",
       "file": "float_misc.wast",
-      "line": 482
+      "line": 457
     }, {
       "type": "assert_return",
       "name": "$assert_return_292",
       "file": "float_misc.wast",
-      "line": 483
+      "line": 467
     }, {
       "type": "assert_return",
       "name": "$assert_return_293",
       "file": "float_misc.wast",
-      "line": 484
+      "line": 468
     }, {
       "type": "assert_return",
       "name": "$assert_return_294",
       "file": "float_misc.wast",
-      "line": 485
+      "line": 469
     }, {
       "type": "assert_return",
       "name": "$assert_return_295",
       "file": "float_misc.wast",
-      "line": 486
+      "line": 470
     }, {
       "type": "assert_return",
       "name": "$assert_return_296",
       "file": "float_misc.wast",
-      "line": 490
+      "line": 471
     }, {
       "type": "assert_return",
       "name": "$assert_return_297",
       "file": "float_misc.wast",
-      "line": 493
+      "line": 472
     }, {
       "type": "assert_return",
       "name": "$assert_return_298",
       "file": "float_misc.wast",
-      "line": 494
+      "line": 476
     }, {
       "type": "assert_return",
       "name": "$assert_return_299",
       "file": "float_misc.wast",
-      "line": 495
+      "line": 477
     }, {
       "type": "assert_return",
       "name": "$assert_return_300",
       "file": "float_misc.wast",
-      "line": 496
+      "line": 478
     }, {
       "type": "assert_return",
       "name": "$assert_return_301",
       "file": "float_misc.wast",
-      "line": 497
+      "line": 479
     }, {
       "type": "assert_return",
       "name": "$assert_return_302",
       "file": "float_misc.wast",
-      "line": 498
+      "line": 482
     }, {
       "type": "assert_return",
       "name": "$assert_return_303",
       "file": "float_misc.wast",
-      "line": 499
+      "line": 483
     }, {
       "type": "assert_return",
       "name": "$assert_return_304",
       "file": "float_misc.wast",
-      "line": 500
+      "line": 484
     }, {
       "type": "assert_return",
       "name": "$assert_return_305",
       "file": "float_misc.wast",
-      "line": 501
+      "line": 485
     }, {
       "type": "assert_return",
       "name": "$assert_return_306",
       "file": "float_misc.wast",
-      "line": 502
+      "line": 486
     }, {
       "type": "assert_return",
       "name": "$assert_return_307",
       "file": "float_misc.wast",
-      "line": 505
+      "line": 490
     }, {
       "type": "assert_return",
       "name": "$assert_return_308",
       "file": "float_misc.wast",
-      "line": 506
+      "line": 493
     }, {
       "type": "assert_return",
       "name": "$assert_return_309",
       "file": "float_misc.wast",
-      "line": 507
+      "line": 494
     }, {
       "type": "assert_return",
       "name": "$assert_return_310",
       "file": "float_misc.wast",
-      "line": 508
+      "line": 495
     }, {
       "type": "assert_return",
       "name": "$assert_return_311",
       "file": "float_misc.wast",
-      "line": 509
+      "line": 496
     }, {
       "type": "assert_return",
       "name": "$assert_return_312",
       "file": "float_misc.wast",
-      "line": 510
+      "line": 497
     }, {
       "type": "assert_return",
       "name": "$assert_return_313",
       "file": "float_misc.wast",
-      "line": 511
+      "line": 498
     }, {
       "type": "assert_return",
       "name": "$assert_return_314",
       "file": "float_misc.wast",
-      "line": 512
+      "line": 499
     }, {
       "type": "assert_return",
       "name": "$assert_return_315",
       "file": "float_misc.wast",
-      "line": 513
+      "line": 500
     }, {
       "type": "assert_return",
       "name": "$assert_return_316",
       "file": "float_misc.wast",
-      "line": 514
+      "line": 501
     }, {
       "type": "assert_return",
       "name": "$assert_return_317",
       "file": "float_misc.wast",
-      "line": 517
+      "line": 502
     }, {
       "type": "assert_return",
       "name": "$assert_return_318",
       "file": "float_misc.wast",
-      "line": 518
+      "line": 505
     }, {
       "type": "assert_return",
       "name": "$assert_return_319",
       "file": "float_misc.wast",
-      "line": 519
+      "line": 506
     }, {
       "type": "assert_return",
       "name": "$assert_return_320",
       "file": "float_misc.wast",
-      "line": 520
+      "line": 507
     }, {
       "type": "assert_return",
       "name": "$assert_return_321",
       "file": "float_misc.wast",
-      "line": 521
+      "line": 508
     }, {
       "type": "assert_return",
       "name": "$assert_return_322",
       "file": "float_misc.wast",
-      "line": 522
+      "line": 509
     }, {
       "type": "assert_return",
       "name": "$assert_return_323",
       "file": "float_misc.wast",
-      "line": 523
+      "line": 510
     }, {
       "type": "assert_return",
       "name": "$assert_return_324",
       "file": "float_misc.wast",
-      "line": 524
+      "line": 511
     }, {
       "type": "assert_return",
       "name": "$assert_return_325",
       "file": "float_misc.wast",
-      "line": 525
+      "line": 512
     }, {
       "type": "assert_return",
       "name": "$assert_return_326",
       "file": "float_misc.wast",
+      "line": 513
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_327",
+      "file": "float_misc.wast",
+      "line": 514
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_328",
+      "file": "float_misc.wast",
+      "line": 517
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_329",
+      "file": "float_misc.wast",
+      "line": 518
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_330",
+      "file": "float_misc.wast",
+      "line": 519
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_331",
+      "file": "float_misc.wast",
+      "line": 520
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_332",
+      "file": "float_misc.wast",
+      "line": 521
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_333",
+      "file": "float_misc.wast",
+      "line": 522
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_334",
+      "file": "float_misc.wast",
+      "line": 523
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_335",
+      "file": "float_misc.wast",
+      "line": 524
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_336",
+      "file": "float_misc.wast",
+      "line": 525
+    }, {
+      "type": "assert_return",
+      "name": "$assert_return_337",
+      "file": "float_misc.wast",
       "line": 526
     }, {
       "type": "assert_return_nan",
-      "name": "$assert_return_nan_327",
+      "name": "$assert_return_nan_338",
       "file": "float_misc.wast",
       "line": 529
     }, {
       "type": "assert_return",
-      "name": "$assert_return_328",
+      "name": "$assert_return_339",
       "file": "float_misc.wast",
       "line": 530
     }, {
       "type": "assert_return",
-      "name": "$assert_return_329",
+      "name": "$assert_return_340",
       "file": "float_misc.wast",
       "line": 531
     }, {
       "type": "assert_return",
-      "name": "$assert_return_330",
+      "name": "$assert_return_341",
       "file": "float_misc.wast",
       "line": 532
     }, {
       "type": "assert_return",
-      "name": "$assert_return_331",
+      "name": "$assert_return_342",
       "file": "float_misc.wast",
       "line": 533
     }, {
       "type": "assert_return",
-      "name": "$assert_return_332",
+      "name": "$assert_return_343",
       "file": "float_misc.wast",
       "line": 536
     }, {
       "type": "assert_return",
-      "name": "$assert_return_333",
+      "name": "$assert_return_344",
       "file": "float_misc.wast",
       "line": 537
     }, {
       "type": "assert_return",
-      "name": "$assert_return_334",
+      "name": "$assert_return_345",
       "file": "float_misc.wast",
       "line": 538
     }, {
       "type": "assert_return",
-      "name": "$assert_return_335",
+      "name": "$assert_return_346",
       "file": "float_misc.wast",
       "line": 539
     }, {
       "type": "assert_return",
-      "name": "$assert_return_336",
+      "name": "$assert_return_347",
       "file": "float_misc.wast",
       "line": 543
     }, {
       "type": "assert_return",
-      "name": "$assert_return_337",
+      "name": "$assert_return_348",
       "file": "float_misc.wast",
       "line": 544
     }, {
       "type": "assert_return",
-      "name": "$assert_return_338",
+      "name": "$assert_return_349",
       "file": "float_misc.wast",
       "line": 547
     }, {
       "type": "assert_return",
-      "name": "$assert_return_339",
+      "name": "$assert_return_350",
       "file": "float_misc.wast",
       "line": 548
     }, {
       "type": "assert_return",
-      "name": "$assert_return_340",
+      "name": "$assert_return_351",
       "file": "float_misc.wast",
       "line": 549
     }, {
       "type": "assert_return",
-      "name": "$assert_return_341",
+      "name": "$assert_return_352",
       "file": "float_misc.wast",
       "line": 550
     }, {
       "type": "assert_return",
-      "name": "$assert_return_342",
+      "name": "$assert_return_353",
       "file": "float_misc.wast",
       "line": 552
     }, {
       "type": "assert_return",
-      "name": "$assert_return_343",
+      "name": "$assert_return_354",
       "file": "float_misc.wast",
       "line": 553
     }, {
       "type": "assert_return",
-      "name": "$assert_return_344",
+      "name": "$assert_return_355",
       "file": "float_misc.wast",
       "line": 556
     }, {
       "type": "assert_return",
-      "name": "$assert_return_345",
+      "name": "$assert_return_356",
       "file": "float_misc.wast",
       "line": 557
     }, {
       "type": "assert_return",
-      "name": "$assert_return_346",
+      "name": "$assert_return_357",
       "file": "float_misc.wast",
       "line": 558
     }, {
       "type": "assert_return",
-      "name": "$assert_return_347",
+      "name": "$assert_return_358",
       "file": "float_misc.wast",
       "line": 559
     }, {
       "type": "assert_return",
-      "name": "$assert_return_348",
+      "name": "$assert_return_359",
       "file": "float_misc.wast",
       "line": 561
     }, {
       "type": "assert_return",
-      "name": "$assert_return_349",
+      "name": "$assert_return_360",
       "file": "float_misc.wast",
       "line": 562
     }, {
       "type": "assert_return",
-      "name": "$assert_return_350",
+      "name": "$assert_return_361",
       "file": "float_misc.wast",
       "line": 563
     }, {
       "type": "assert_return",
-      "name": "$assert_return_351",
+      "name": "$assert_return_362",
       "file": "float_misc.wast",
       "line": 564
     }, {
       "type": "assert_return",
-      "name": "$assert_return_352",
+      "name": "$assert_return_363",
       "file": "float_misc.wast",
       "line": 569
     }, {
       "type": "assert_return",
-      "name": "$assert_return_353",
+      "name": "$assert_return_364",
       "file": "float_misc.wast",
       "line": 570
     }, {
       "type": "assert_return",
-      "name": "$assert_return_354",
+      "name": "$assert_return_365",
       "file": "float_misc.wast",
       "line": 571
     }, {
       "type": "assert_return",
-      "name": "$assert_return_355",
+      "name": "$assert_return_366",
       "file": "float_misc.wast",
       "line": 572
     }, {
       "type": "assert_return",
-      "name": "$assert_return_356",
+      "name": "$assert_return_367",
       "file": "float_misc.wast",
       "line": 579
     }, {
       "type": "assert_return",
-      "name": "$assert_return_357",
+      "name": "$assert_return_368",
       "file": "float_misc.wast",
       "line": 580
     }, {
       "type": "assert_return",
-      "name": "$assert_return_358",
+      "name": "$assert_return_369",
       "file": "float_misc.wast",
       "line": 581
     }, {
       "type": "assert_return",
-      "name": "$assert_return_359",
+      "name": "$assert_return_370",
       "file": "float_misc.wast",
       "line": 582
     }, {
       "type": "assert_return",
-      "name": "$assert_return_360",
+      "name": "$assert_return_371",
       "file": "float_misc.wast",
       "line": 585
     }, {
       "type": "assert_return",
-      "name": "$assert_return_361",
+      "name": "$assert_return_372",
       "file": "float_misc.wast",
       "line": 586
     }, {
       "type": "assert_return",
-      "name": "$assert_return_362",
+      "name": "$assert_return_373",
       "file": "float_misc.wast",
       "line": 587
     }, {
       "type": "assert_return",
-      "name": "$assert_return_363",
+      "name": "$assert_return_374",
       "file": "float_misc.wast",
       "line": 588
     }, {
       "type": "assert_return",
-      "name": "$assert_return_364",
+      "name": "$assert_return_375",
       "file": "float_misc.wast",
       "line": 591
     }, {
       "type": "assert_return",
-      "name": "$assert_return_365",
+      "name": "$assert_return_376",
       "file": "float_misc.wast",
       "line": 592
     }, {
       "type": "assert_return",
-      "name": "$assert_return_366",
+      "name": "$assert_return_377",
       "file": "float_misc.wast",
       "line": 593
     }, {
       "type": "assert_return",
-      "name": "$assert_return_367",
+      "name": "$assert_return_378",
       "file": "float_misc.wast",
       "line": 594
     }, {
       "type": "assert_return",
-      "name": "$assert_return_368",
+      "name": "$assert_return_379",
       "file": "float_misc.wast",
       "line": 597
     }, {
       "type": "assert_return",
-      "name": "$assert_return_369",
+      "name": "$assert_return_380",
       "file": "float_misc.wast",
       "line": 598
     }, {
       "type": "assert_return",
-      "name": "$assert_return_370",
+      "name": "$assert_return_381",
       "file": "float_misc.wast",
       "line": 599
     }, {
       "type": "assert_return",
-      "name": "$assert_return_371",
+      "name": "$assert_return_382",
       "file": "float_misc.wast",
       "line": 600
     }, {
       "type": "assert_return",
-      "name": "$assert_return_372",
+      "name": "$assert_return_383",
       "file": "float_misc.wast",
       "line": 603
     }, {
       "type": "assert_return",
-      "name": "$assert_return_373",
+      "name": "$assert_return_384",
       "file": "float_misc.wast",
       "line": 604
     }, {
       "type": "assert_return",
-      "name": "$assert_return_374",
+      "name": "$assert_return_385",
       "file": "float_misc.wast",
       "line": 605
     }, {
       "type": "assert_return",
-      "name": "$assert_return_375",
+      "name": "$assert_return_386",
       "file": "float_misc.wast",
       "line": 606
     }, {
       "type": "assert_return",
-      "name": "$assert_return_376",
+      "name": "$assert_return_387",
       "file": "float_misc.wast",
       "line": 611
     }, {
       "type": "assert_return",
-      "name": "$assert_return_377",
+      "name": "$assert_return_388",
       "file": "float_misc.wast",
       "line": 612
     }, {
       "type": "assert_return",
-      "name": "$assert_return_378",
+      "name": "$assert_return_389",
       "file": "float_misc.wast",
       "line": 613
     }, {
       "type": "assert_return",
-      "name": "$assert_return_379",
+      "name": "$assert_return_390",
       "file": "float_misc.wast",
       "line": 614
     }, {
       "type": "assert_return",
-      "name": "$assert_return_380",
+      "name": "$assert_return_391",
       "file": "float_misc.wast",
       "line": 615
     }, {
       "type": "assert_return",
-      "name": "$assert_return_381",
+      "name": "$assert_return_392",
       "file": "float_misc.wast",
       "line": 616
     }, {
       "type": "assert_return",
-      "name": "$assert_return_382",
+      "name": "$assert_return_393",
       "file": "float_misc.wast",
       "line": 617
     }, {
       "type": "assert_return",
-      "name": "$assert_return_383",
+      "name": "$assert_return_394",
       "file": "float_misc.wast",
       "line": 618
     }, {
       "type": "assert_return",
-      "name": "$assert_return_384",
+      "name": "$assert_return_395",
       "file": "float_misc.wast",
       "line": 622
     }, {
       "type": "assert_return",
-      "name": "$assert_return_385",
+      "name": "$assert_return_396",
       "file": "float_misc.wast",
       "line": 623
     }, {
       "type": "assert_return",
-      "name": "$assert_return_386",
+      "name": "$assert_return_397",
       "file": "float_misc.wast",
       "line": 624
     }, {
       "type": "assert_return",
-      "name": "$assert_return_387",
+      "name": "$assert_return_398",
       "file": "float_misc.wast",
       "line": 625
     }, {
       "type": "assert_return",
-      "name": "$assert_return_388",
+      "name": "$assert_return_399",
       "file": "float_misc.wast",
       "line": 626
     }, {
       "type": "assert_return",
-      "name": "$assert_return_389",
+      "name": "$assert_return_400",
       "file": "float_misc.wast",
       "line": 627
     }, {
       "type": "assert_return",
-      "name": "$assert_return_390",
+      "name": "$assert_return_401",
       "file": "float_misc.wast",
       "line": 630
     }, {
       "type": "assert_return",
-      "name": "$assert_return_391",
+      "name": "$assert_return_402",
       "file": "float_misc.wast",
       "line": 631
     }, {
       "type": "assert_return",
-      "name": "$assert_return_392",
+      "name": "$assert_return_403",
       "file": "float_misc.wast",
       "line": 632
     }, {
       "type": "assert_return",
-      "name": "$assert_return_393",
+      "name": "$assert_return_404",
       "file": "float_misc.wast",
       "line": 633
     }]

+ 11 - 11
test/WasmSpec/testsuite/float_misc.wast

@@ -310,11 +310,11 @@
 (assert_return (invoke "f64.mul" (f64.const -0x1.848981b6e694ap-276) (f64.const 0x1.f5aacb64a0d19p+896)) (f64.const -0x1.7cb2296e6c2e5p+621))
 
 ;; Computations that round differently on x87 in double-precision mode.
-;;(assert_return (invoke "f64.mul" (f64.const 0x1.db3bd2a286944p-599) (f64.const 0x1.ce910af1d55cap-425)) (f64.const 0x0.d6accdd538a39p-1022))
-;;(assert_return (invoke "f64.mul" (f64.const -0x1.aca223916012p-57) (f64.const -0x1.2b2b4958dd228p-966)) (f64.const 0x0.fa74eccae5615p-1022))
-;;(assert_return (invoke "f64.mul" (f64.const -0x1.bd062def16cffp-488) (f64.const -0x1.7ddd91a0c4c0ep-536)) (f64.const 0x0.a5f4d7769d90dp-1022))
-;;(assert_return (invoke "f64.mul" (f64.const -0x1.c6a56169e9cep-772) (f64.const 0x1.517d55a474122p-255)) (f64.const -0x0.12baf260afb77p-1022))
-;;(assert_return (invoke "f64.mul" (f64.const -0x1.08951b0b41705p-516) (f64.const -0x1.102dc27168d09p-507)) (f64.const 0x0.8ca6dbf3f592bp-1022))
+(assert_return (invoke "f64.mul" (f64.const 0x1.db3bd2a286944p-599) (f64.const 0x1.ce910af1d55cap-425)) (f64.const 0x0.d6accdd538a39p-1022))
+(assert_return (invoke "f64.mul" (f64.const -0x1.aca223916012p-57) (f64.const -0x1.2b2b4958dd228p-966)) (f64.const 0x0.fa74eccae5615p-1022))
+(assert_return (invoke "f64.mul" (f64.const -0x1.bd062def16cffp-488) (f64.const -0x1.7ddd91a0c4c0ep-536)) (f64.const 0x0.a5f4d7769d90dp-1022))
+(assert_return (invoke "f64.mul" (f64.const -0x1.c6a56169e9cep-772) (f64.const 0x1.517d55a474122p-255)) (f64.const -0x0.12baf260afb77p-1022))
+(assert_return (invoke "f64.mul" (f64.const -0x1.08951b0b41705p-516) (f64.const -0x1.102dc27168d09p-507)) (f64.const 0x0.8ca6dbf3f592bp-1022))
 
 ;; Computations that round differently when computed via f32.
 (assert_return (invoke "f64.mul" (f64.const 0x1.8d0dea50c8c9bp+852) (f64.const 0x1.21cac31d87a24p-881)) (f64.const 0x1.c177311f7cd73p-29))
@@ -401,12 +401,12 @@
 (assert_return (invoke "f64.div" (f64.const -0x1.e251d762163ccp+825) (f64.const 0x1.3ee63581e1796p+349)) (f64.const -0x1.8330077d90a07p+476))
 
 ;; Computations that round differently on x87 in double-precision mode.
-;;(assert_return (invoke "f64.div" (f64.const 0x1.dcbf69f10006dp+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.772fda7c4001bp-1022))
-;;(assert_return (invoke "f64.div" (f64.const 0x1.e14169442fbcap-1011) (f64.const 0x1.505451d62ff7dp+12)) (f64.const 0x0.b727e85f38b39p-1022))
-;;(assert_return (invoke "f64.div" (f64.const -0x1.d3ebe726ec964p-144) (f64.const -0x1.4a7bfc0b83608p+880)) (f64.const 0x0.5a9d8c50cbf87p-1022))
-;;(assert_return (invoke "f64.div" (f64.const -0x1.6c3def770aee1p-393) (f64.const -0x1.8b84724347598p+631)) (f64.const 0x0.3af0707fcd0c7p-1022))
-;;(assert_return (invoke "f64.div" (f64.const 0x1.16abda1bb3cb3p-856) (f64.const 0x1.6c9c7198eb1e6p+166)) (f64.const 0x0.c3a8fd6741649p-1022))
-;;(assert_return (invoke "f64.div" (f64.const 0x1.7057d6ab553cap-1005) (f64.const -0x1.2abf1e98660ebp+23)) (f64.const -0x0.04ee8d8ec01cdp-1022))
+(assert_return (invoke "f64.div" (f64.const 0x1.dcbf69f10006dp+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.772fda7c4001bp-1022))
+(assert_return (invoke "f64.div" (f64.const 0x1.e14169442fbcap-1011) (f64.const 0x1.505451d62ff7dp+12)) (f64.const 0x0.b727e85f38b39p-1022))
+(assert_return (invoke "f64.div" (f64.const -0x1.d3ebe726ec964p-144) (f64.const -0x1.4a7bfc0b83608p+880)) (f64.const 0x0.5a9d8c50cbf87p-1022))
+(assert_return (invoke "f64.div" (f64.const -0x1.6c3def770aee1p-393) (f64.const -0x1.8b84724347598p+631)) (f64.const 0x0.3af0707fcd0c7p-1022))
+(assert_return (invoke "f64.div" (f64.const 0x1.16abda1bb3cb3p-856) (f64.const 0x1.6c9c7198eb1e6p+166)) (f64.const 0x0.c3a8fd6741649p-1022))
+(assert_return (invoke "f64.div" (f64.const 0x1.7057d6ab553cap-1005) (f64.const -0x1.2abf1e98660ebp+23)) (f64.const -0x0.04ee8d8ec01cdp-1022))
 
 ;; Computations that round differently when div is mul by reciprocal.
 (assert_return (invoke "f32.div" (f32.const 0x1.ada9aap+89) (f32.const 0x1.69884cp+42)) (f32.const 0x1.303e2ep+47))