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);