Title: [204480] trunk/Source/_javascript_Core
Revision
204480
Author
[email protected]
Date
2016-08-15 14:04:49 -0700 (Mon, 15 Aug 2016)

Log Message

[JSC] B3 Neg opcode should support float
https://bugs.webkit.org/show_bug.cgi?id=160795

Patch by Benjamin Poulain <[email protected]> on 2016-08-15
Reviewed by Geoffrey Garen.

This is required to implement WASM f32.neg opcode.

* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::negateFloat):
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::lower):
* b3/B3ReduceDoubleToFloat.cpp:
* b3/air/AirOpcode.opcodes:
* b3/testb3.cpp:
(JSC::B3::testNegDouble):
(JSC::B3::testNegFloat):
(JSC::B3::testNegFloatWithUselessDoubleConversion):
(JSC::B3::run):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (204479 => 204480)


--- trunk/Source/_javascript_Core/ChangeLog	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-08-15 21:04:49 UTC (rev 204480)
@@ -1,3 +1,24 @@
+2016-08-15  Benjamin Poulain  <[email protected]>
+
+        [JSC] B3 Neg opcode should support float
+        https://bugs.webkit.org/show_bug.cgi?id=160795
+
+        Reviewed by Geoffrey Garen.
+
+        This is required to implement WASM f32.neg opcode.
+
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::negateFloat):
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::lower):
+        * b3/B3ReduceDoubleToFloat.cpp:
+        * b3/air/AirOpcode.opcodes:
+        * b3/testb3.cpp:
+        (JSC::B3::testNegDouble):
+        (JSC::B3::testNegFloat):
+        (JSC::B3::testNegFloatWithUselessDoubleConversion):
+        (JSC::B3::run):
+
 2016-08-15  Joseph Pecoraro  <[email protected]>
 
         Use #pragma once in inspector headers

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (204479 => 204480)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2016-08-15 21:04:49 UTC (rev 204480)
@@ -1856,6 +1856,11 @@
         m_assembler.fneg<64>(dest, src);
     }
 
+    void negateFloat(FPRegisterID src, FPRegisterID dest)
+    {
+        m_assembler.fneg<32>(dest, src);
+    }
+
     void sqrtDouble(FPRegisterID src, FPRegisterID dest)
     {
         m_assembler.fsqrt<64>(dest, src);

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (204479 => 204480)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2016-08-15 21:04:49 UTC (rev 204480)
@@ -1835,7 +1835,7 @@
                 }
             }
 
-            appendUnOp<Neg32, Neg64, NegateDouble, Air::Oops>(m_value->child(0));
+            appendUnOp<Neg32, Neg64, NegateDouble, NegateFloat>(m_value->child(0));
             return;
         }
 

Modified: trunk/Source/_javascript_Core/b3/B3ReduceDoubleToFloat.cpp (204479 => 204480)


--- trunk/Source/_javascript_Core/b3/B3ReduceDoubleToFloat.cpp	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/B3ReduceDoubleToFloat.cpp	2016-08-15 21:04:49 UTC (rev 204480)
@@ -302,6 +302,7 @@
                 case Abs:
                 case Ceil:
                 case Floor:
+                case Neg:
                 case Sqrt: {
                     Value* child = value->child(0);
                     if (canBeTransformedToFloat(child)) {

Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (204479 => 204480)


--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2016-08-15 21:04:49 UTC (rev 204480)
@@ -205,6 +205,9 @@
 arm64: NegateDouble U:F:64, D:F:64
     Tmp, Tmp
 
+arm64: NegateFloat U:F:32, D:F:32
+    Tmp, Tmp
+
 Mul32 U:G:32, UZD:G:32
     Tmp, Tmp
     x86: Addr, Tmp

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (204479 => 204480)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2016-08-15 21:04:49 UTC (rev 204480)
@@ -2170,6 +2170,48 @@
     CHECK(isIdentical(effect, static_cast<double>(a) - static_cast<double>(b)));
 }
 
+void testNegDouble(double a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    root->appendNewControlValue(
+        proc, Return, Origin(),
+        root->appendNew<Value>(
+            proc, Neg, Origin(),
+            root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, a), -a));
+}
+
+void testNegFloat(float a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument32 = root->appendNew<Value>(proc, Trunc, Origin(),
+        root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+    Value* floatValue = root->appendNew<Value>(proc, BitwiseCast, Origin(), argument32);
+    root->appendNewControlValue(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Neg, Origin(), floatValue));
+
+    CHECK(isIdentical(compileAndRun<float>(proc, bitwise_cast<int32_t>(a)), -a));
+}
+
+void testNegFloatWithUselessDoubleConversion(float a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argumentInt32 = root->appendNew<Value>(proc, Trunc, Origin(),
+        root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+    Value* floatValue = root->appendNew<Value>(proc, BitwiseCast, Origin(), argumentInt32);
+    Value* asDouble = root->appendNew<Value>(proc, FloatToDouble, Origin(), floatValue);
+    Value* result = root->appendNew<Value>(proc, Neg, Origin(), asDouble);
+    Value* floatResult = root->appendNew<Value>(proc, DoubleToFloat, Origin(), result);
+    root->appendNewControlValue(proc, Return, Origin(), floatResult);
+
+    CHECK(isIdentical(compileAndRun<float>(proc, bitwise_cast<int32_t>(a)), -a));
+}
+
 void testBitAndArgs(int64_t a, int64_t b)
 {
     Procedure proc;
@@ -13166,6 +13208,10 @@
     RUN_BINARY(testSubArgsFloatWithUselessDoubleConversion, floatingPointOperands<float>(), floatingPointOperands<float>());
     RUN_BINARY(testSubArgsFloatWithEffectfulDoubleConversion, floatingPointOperands<float>(), floatingPointOperands<float>());
 
+    RUN_UNARY(testNegDouble, floatingPointOperands<double>());
+    RUN_UNARY(testNegFloat, floatingPointOperands<float>());
+    RUN_UNARY(testNegFloatWithUselessDoubleConversion, floatingPointOperands<float>());
+
     RUN(testBitAndArgs(43, 43));
     RUN(testBitAndArgs(43, 0));
     RUN(testBitAndArgs(10, 3));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to