Title: [207051] releases/WebKitGTK/webkit-2.14/Source/_javascript_Core
Revision
207051
Author
carlo...@webkit.org
Date
2016-10-10 23:36:49 -0700 (Mon, 10 Oct 2016)

Log Message

Merge r205656 - Add support for a ternary sub32 emitter for ARM64 and 32-bit ARM.
https://bugs.webkit.org/show_bug.cgi?id=161724

Reviewed by Filip Pizlo.

ARM architectures support ternary sub instructions.  We should make use of them
in emitAllocateWithNonNullAllocator().

* assembler/MacroAssemblerARM.h:
(JSC::MacroAssemblerARM::sub32):
* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::sub32):
* assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::sub32):
* assembler/MacroAssemblerSH4.h:
(JSC::MacroAssemblerSH4::sub32):
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::sub32):
* b3/air/AirOpcode.opcodes:
* b3/testb3.cpp:
(JSC::B3::testTernarySubInstructionSelection):
(JSC::B3::run):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/ChangeLog (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/ChangeLog	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/ChangeLog	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1,3 +1,30 @@
+2016-09-08  Mark Lam  <mark....@apple.com>
+
+        Add support for a ternary sub32 emitter for ARM64 and 32-bit ARM.
+        https://bugs.webkit.org/show_bug.cgi?id=161724
+
+        Reviewed by Filip Pizlo.
+
+        ARM architectures support ternary sub instructions.  We should make use of them
+        in emitAllocateWithNonNullAllocator().
+
+        * assembler/MacroAssemblerARM.h:
+        (JSC::MacroAssemblerARM::sub32):
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::sub32):
+        * assembler/MacroAssemblerARMv7.h:
+        (JSC::MacroAssemblerARMv7::sub32):
+        * assembler/MacroAssemblerSH4.h:
+        (JSC::MacroAssemblerSH4::sub32):
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::sub32):
+        * b3/air/AirOpcode.opcodes:
+        * b3/testb3.cpp:
+        (JSC::B3::testTernarySubInstructionSelection):
+        (JSC::B3::run):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
+
 2016-09-07  Andy VanWagoner  <thetalecraf...@gmail.com>
 
         [INTL] some valid language tags cause errors in Intl constructors

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2013-2015 Apple Inc.
+ * Copyright (C) 2008, 2013-2016 Apple Inc.
  * Copyright (C) 2009, 2010 University of Szeged
  * All rights reserved.
  *
@@ -314,6 +314,11 @@
         m_assembler.subs(dest, dest, src);
     }
 
+    void sub32(RegisterID left, RegisterID right, RegisterID dest)
+    {
+        m_assembler.subs(dest, left, right);
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         m_assembler.subs(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012, 2014, 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014-2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -705,6 +705,11 @@
         m_assembler.sub<32>(dest, dest, src);
     }
 
+    void sub32(RegisterID left, RegisterID right, RegisterID dest)
+    {
+        m_assembler.sub<32>(dest, left, right);
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         if (isUInt12(imm.m_value)) {

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010, 2014-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2010, 2014-2016 Apple Inc. All rights reserved.
  * Copyright (C) 2010 University of Szeged
  *
  * Redistribution and use in source and binary forms, with or without
@@ -462,6 +462,11 @@
         m_assembler.sub(dest, dest, src);
     }
 
+    void sub32(RegisterID left, RegisterID right, RegisterID dest)
+    {
+        m_assembler.sub(dest, left, right);
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value);

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerSH4.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerSH4.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2013 Cisco Systems, Inc. All rights reserved.
  * Copyright (C) 2009-2011 STMicroelectronics. All rights reserved.
- * Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2014, 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -419,6 +419,17 @@
         m_assembler.sublRegReg(src, dest);
     }
 
+    void sub32(RegisterID left, RegisterID right, RegisterID dest)
+    {
+        if (dest == right) {
+            neg32(dest);
+            add32(left, dest);
+            return;
+        }
+        move(left, dest);
+        sub32(right, dest);
+    }
+
     void sub32(TrustedImm32 imm, AbsoluteAddress address)
     {
         if (!imm.m_value)

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -560,7 +560,18 @@
     {
         m_assembler.subl_rr(src, dest);
     }
-    
+
+    void sub32(RegisterID left, RegisterID right, RegisterID dest)
+    {
+        if (dest == right) {
+            neg32(dest);
+            add32(left, dest);
+            return;
+        }
+        move(left, dest);
+        sub32(right, dest);
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         if (imm.m_value == 1)

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/air/AirOpcode.opcodes (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2016-10-11 06:36:49 UTC (rev 207051)
@@ -170,6 +170,9 @@
     x86: Addr, Tmp
     x86: Tmp, Addr
 
+arm64: Sub32 U:G:32, U:G:32, D:G:32
+    Tmp, Tmp, Tmp
+
 64: Sub64 U:G:64, UD:G:64
     Tmp, Tmp
     x86: Imm, Addr
@@ -177,6 +180,9 @@
     x86: Addr, Tmp
     x86: Tmp, Addr
 
+arm64: Sub64 U:G:64, U:G:64, D:G:64
+    Tmp, Tmp, Tmp
+
 SubDouble U:F:64, U:F:64, D:F:64
     arm64: Tmp, Tmp, Tmp
     x86: Tmp, Addr, Tmp

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/testb3.cpp (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/testb3.cpp	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/b3/testb3.cpp	2016-10-11 06:36:49 UTC (rev 207051)
@@ -2170,6 +2170,39 @@
     CHECK(isIdentical(effect, static_cast<double>(a) - static_cast<double>(b)));
 }
 
+void testTernarySubInstructionSelection(B3::Opcode valueModifier, Type valueType, Air::Opcode expectedOpcode)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+
+    Value* left = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
+    Value* right = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
+
+    if (valueModifier == Trunc) {
+        left = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), left);
+        right = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), right);
+    }
+
+    root->appendNewControlValue(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Sub, Origin(), left, right));
+
+    lowerToAirForTesting(proc);
+
+    auto block = proc.code()[0];
+    unsigned numberOfSubInstructions = 0;
+    for (auto instruction : *block) {
+        if (instruction.opcode == expectedOpcode) {
+            CHECK_EQ(instruction.args.size(), 3ul);
+            CHECK_EQ(instruction.args[0].kind(), Air::Arg::Tmp);
+            CHECK_EQ(instruction.args[1].kind(), Air::Arg::Tmp);
+            CHECK_EQ(instruction.args[2].kind(), Air::Arg::Tmp);
+            numberOfSubInstructions++;
+        }
+    }
+    CHECK_EQ(numberOfSubInstructions, 1ul);
+}
+
 void testNegDouble(double a)
 {
     Procedure proc;
@@ -14425,6 +14458,11 @@
         RUN(testBranchBitAndImmFusion(Load, Int64, 1, Air::BranchTest32, Air::Arg::Addr));
     }
 
+    if (isARM64()) {
+        RUN(testTernarySubInstructionSelection(Identity, Int64, Air::Sub64));
+        RUN(testTernarySubInstructionSelection(Trunc, Int32, Air::Sub32));
+    }
+
     if (tasks.isEmpty())
         usage();
 

Modified: releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/jit/AssemblyHelpers.h (207050 => 207051)


--- releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/jit/AssemblyHelpers.h	2016-10-11 06:23:49 UTC (rev 207050)
+++ releases/WebKitGTK/webkit-2.14/Source/_javascript_Core/jit/AssemblyHelpers.h	2016-10-11 06:36:49 UTC (rev 207051)
@@ -1431,10 +1431,8 @@
                 move(resultGPR, scratchGPR);
                 sub32(Address(allocatorGPR, MarkedAllocator::offsetOfCellSize()), scratchGPR);
             } else {
-                // FIXME: We need a 3-operand sub, and ARM totally has it!
                 load32(Address(allocatorGPR, MarkedAllocator::offsetOfCellSize()), scratchGPR);
-                neg32(scratchGPR);
-                add32(resultGPR, scratchGPR);
+                sub32(resultGPR, scratchGPR, scratchGPR);
             }
         }
         negPtr(resultGPR);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to