Diff
Modified: trunk/LayoutTests/ChangeLog (208449 => 208450)
--- trunk/LayoutTests/ChangeLog 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/LayoutTests/ChangeLog 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1,3 +1,15 @@
+2016-11-07 Yusuke Suzuki <[email protected]>
+
+ [JSC] The implementation of 8 bit operation in MacroAssembler should care about uint8_t / int8_t
+ https://bugs.webkit.org/show_bug.cgi?id=164432
+
+ Reviewed by Michael Saboff.
+
+ Use ownerDocument. Once DOMJIT for ownerDocument is landed, this will use branch8.
+
+ * js/dom/domjit-accessor-owner-document-type-check-expected.txt: Added.
+ * js/dom/domjit-accessor-owner-document-type-check.html: Added.
+
2016-11-08 Antoine Quint <[email protected]>
[Modern Media Controls] UI Library: macOS fullscreen controls
Added: trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check-expected.txt (0 => 208450)
--- trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check-expected.txt (rev 0)
+++ trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check-expected.txt 2016-11-09 19:10:42 UTC (rev 208450)
@@ -0,0 +1,10 @@
+Test DOMJIT ownerDocument accessor works on ARM environments.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS done
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check.html (0 => 208450)
--- trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check.html (rev 0)
+++ trunk/LayoutTests/js/dom/domjit-accessor-owner-document-type-check.html 2016-11-09 19:10:42 UTC (rev 208450)
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description('Test DOMJIT ownerDocument accessor works on ARM environments.');
+
+function runTest()
+{
+ function ownerDocument(doc)
+ {
+ // If DOMJIT is enabled, it will perform Document type check, and it uses branch8 with a number that has MSB.
+ return doc.ownerDocument;
+ }
+ noInline(ownerDocument);
+
+ for (var i = 0; i < 1e4; ++i) {
+ if (null !== ownerDocument(document))
+ throw new Error('Error');
+ }
+ testPassed("done");
+}
+runTest();
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/Source/_javascript_Core/ChangeLog (208449 => 208450)
--- trunk/Source/_javascript_Core/ChangeLog 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/ChangeLog 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1,3 +1,75 @@
+2016-11-07 Yusuke Suzuki <[email protected]>
+
+ [JSC] The implementation of 8 bit operation in MacroAssembler should care about uint8_t / int8_t
+ https://bugs.webkit.org/show_bug.cgi?id=164432
+
+ Reviewed by Michael Saboff.
+
+ Except for X86, our supported MacroAssemblers do not have native 8bit instructions.
+ It means that all the 8bit instructions are converted to 32bit operations by using
+ scratch registers. For example, ARM64 branch8 implementation is the following.
+
+ Jump branch8(RelationCondition cord, Address left, TrustedImm32 right)
+ {
+ TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ load8(left, getCachedMemoryTempRegisterIDAndInvalidate());
+ return branch32(cone, memoryTempRegister, right8);
+ }
+
+ The problem is that we exclusively use zero-extended load instruction (load8). Even
+ for signed RelationConditions, we do not perform sign extension. It makes signed
+ operations with negative numbers incorrect! Consider the |left| address holds `-1`
+ in int8_t form. However load8 will load it as 255 into 32bit register. On the other hand,
+ |right| will be sign extended. If you pass 0 as |right| and LessThan condition, this
+ branch8 should jump based on the answer of `-1 < 0`. But the current MacroAssembler
+ performs `255 < 0` in int32_t context and returns the incorrect result.
+
+ We should follow the x86 model. So we should select the appropriate load operation and masking
+ operation based on the RelationCondition. This patch introduces mask8OnCondition and load8OnCondition.
+ And we use them in 8bit operations including branch8, branchTest8, compare8, and test8.
+
+ We intentionally do not change anything on x86 assembler since it has the native signed 8bit operations.
+
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * assembler/AbstractMacroAssembler.h:
+ * assembler/MacroAssembler.h:
+ (JSC::MacroAssembler::isSigned):
+ (JSC::MacroAssembler::isUnsigned):
+ (JSC::MacroAssembler::branchTest8):
+ * assembler/MacroAssemblerARM.h:
+ (JSC::MacroAssemblerARM::branch8):
+ (JSC::MacroAssemblerARM::branchTest8):
+ (JSC::MacroAssemblerARM::compare8):
+ (JSC::MacroAssemblerARM::test8):
+ * assembler/MacroAssemblerARM64.h:
+ (JSC::MacroAssemblerARM64::load8SignedExtendTo32):
+ (JSC::MacroAssemblerARM64::branch8):
+ (JSC::MacroAssemblerARM64::branchTest8):
+ (JSC::MacroAssemblerARM64::compare8):
+ (JSC::MacroAssemblerARM64::test8):
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::branch8):
+ (JSC::MacroAssemblerARMv7::branchTest8):
+ (JSC::MacroAssemblerARMv7::compare8):
+ (JSC::MacroAssemblerARMv7::test8):
+ * assembler/MacroAssemblerHelpers.h: Added.
+ (JSC::MacroAssemblerHelpers::isSigned):
+ (JSC::MacroAssemblerHelpers::isUnsigned):
+ (JSC::MacroAssemblerHelpers::mask8OnCondition):
+ (JSC::MacroAssemblerHelpers::load8OnCondition):
+ * assembler/MacroAssemblerMIPS.h:
+ (JSC::MacroAssemblerMIPS::branch8):
+ (JSC::MacroAssemblerMIPS::compare8):
+ (JSC::MacroAssemblerMIPS::branchTest8):
+ (JSC::MacroAssemblerMIPS::test8):
+ * assembler/MacroAssemblerSH4.h:
+ (JSC::MacroAssemblerSH4::branchTest8):
+ (JSC::MacroAssemblerSH4::branch8):
+ (JSC::MacroAssemblerSH4::compare8):
+ (JSC::MacroAssemblerSH4::test8):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::branch8):
+
2016-11-08 Geoffrey Garen <[email protected]>
REGRESSION: date-format-tofte.js is super slow
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (208449 => 208450)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2016-11-09 19:10:42 UTC (rev 208450)
@@ -2197,6 +2197,7 @@
E328DAE91D38D005001A2529 /* BytecodeGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D264281D38C042000BE174 /* BytecodeGraph.h */; settings = {ATTRIBUTES = (Private, ); }; };
E328DAEA1D38D005001A2529 /* BytecodeRewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D264291D38C042000BE174 /* BytecodeRewriter.cpp */; };
E328DAEB1D38D005001A2529 /* BytecodeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D2642A1D38C042000BE174 /* BytecodeRewriter.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */; settings = {ATTRIBUTES = (Private, ); }; };
E32FF1EA1DA7571C00A8BF21 /* DOMJITSlowPathCalls.h in Headers */ = {isa = PBXBuildFile; fileRef = E3CB1E241DA7540A00FA1E56 /* DOMJITSlowPathCalls.h */; settings = {ATTRIBUTES = (Private, ); }; };
E33637A51B63220200EE0840 /* ReflectObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33637A31B63220200EE0840 /* ReflectObject.cpp */; };
E33637A61B63220200EE0840 /* ReflectObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E33637A41B63220200EE0840 /* ReflectObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4665,6 +4666,7 @@
E3794E741B77EB97005543AE /* ModuleAnalyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleAnalyzer.h; sourceTree = "<group>"; };
E37AD83A1DA4928000F3D412 /* DOMJITPatchpointParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITPatchpointParams.h; sourceTree = "<group>"; };
E37AD83B1DA4928000F3D412 /* DOMJITReg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITReg.h; sourceTree = "<group>"; };
+ E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerHelpers.h; sourceTree = "<group>"; };
E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodesAnalyzeModule.cpp; sourceTree = "<group>"; };
E39D9D841D39000600667282 /* InterpreterInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterpreterInlines.h; sourceTree = "<group>"; };
E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleRecord.cpp; sourceTree = "<group>"; };
@@ -7064,6 +7066,7 @@
86ADD1440FDDEA980006EEC2 /* MacroAssemblerARMv7.h */,
0F6DB7EB1D617D0F00CDBF8E /* MacroAssemblerCodeRef.cpp */,
863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */,
+ E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */,
86C568DE11A213EE0007F7F0 /* MacroAssemblerMIPS.h */,
FE68C6351B90DDD90042BCB3 /* MacroAssemblerPrinter.cpp */,
FE68C6361B90DDD90042BCB3 /* MacroAssemblerPrinter.h */,
@@ -8048,6 +8051,7 @@
0F40E4A81C497F7400A577FA /* AirOpcodeGenerated.h in Headers */,
0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */,
0F6237981AE45CA700D402EA /* DFGPhantomInsertionPhase.h in Headers */,
+ E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */,
0FFFC95C14EF90AF00C72532 /* DFGPhase.h in Headers */,
0F2B9CEB19D0BA7D00B1D1B5 /* DFGPhiChildren.h in Headers */,
A78A977B179738B8009DF744 /* DFGPlan.h in Headers */,
Modified: trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -31,6 +31,7 @@
#include "CPU.h"
#include "CodeLocation.h"
#include "MacroAssemblerCodeRef.h"
+#include "MacroAssemblerHelpers.h"
#include "Options.h"
#include <wtf/CryptographicallyRandomNumber.h>
#include <wtf/Noncopyable.h>
Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -65,6 +65,8 @@
#error "The MacroAssembler is not supported on this platform."
#endif
+#include "MacroAssemblerHelpers.h"
+
namespace JSC {
class MacroAssembler : public MacroAssemblerBase {
@@ -140,7 +142,6 @@
static const double twoToThe32; // This is super useful for some double code.
// Utilities used by the DFG JIT.
-#if ENABLE(DFG_JIT)
using MacroAssemblerBase::invert;
static DoubleCondition invert(DoubleCondition cond)
@@ -233,45 +234,26 @@
return Equal;
}
- // True if this:
- // branch8(cond, value, value)
- // Is the same as this:
- // branch32(cond, signExt8(value), signExt8(value))
static bool isSigned(RelationalCondition cond)
{
- switch (cond) {
- case Equal:
- case NotEqual:
- case GreaterThan:
- case GreaterThanOrEqual:
- case LessThan:
- case LessThanOrEqual:
- return true;
- default:
- return false;
- }
+ return MacroAssemblerHelpers::isSigned<MacroAssembler>(cond);
}
- // True if this:
- // branch8(cond, value, value)
- // Is the same as this:
- // branch32(cond, zeroExt8(value), zeroExt8(value))
static bool isUnsigned(RelationalCondition cond)
{
- switch (cond) {
- case Equal:
- case NotEqual:
- case Above:
- case AboveOrEqual:
- case Below:
- case BelowOrEqual:
- return true;
- default:
- return false;
- }
+ return MacroAssemblerHelpers::isUnsigned<MacroAssembler>(cond);
}
-#endif
+ static bool isSigned(ResultCondition cond)
+ {
+ return MacroAssemblerHelpers::isSigned<MacroAssembler>(cond);
+ }
+
+ static bool isUnsigned(ResultCondition cond)
+ {
+ return MacroAssemblerHelpers::isUnsigned<MacroAssembler>(cond);
+ }
+
// Platform agnostic convenience functions,
// described in terms of other macro assembly methods.
void pop()
@@ -797,8 +779,7 @@
using MacroAssemblerBase::branchTest8;
Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask8);
+ return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask);
}
#else // !CPU(X86_64)
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -632,23 +632,23 @@
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, ARMRegisters::S1);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1);
return branch32(cond, ARMRegisters::S1, right8);
}
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, ARMRegisters::S1);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1);
return branch32(cond, ARMRegisters::S1, right8);
}
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
move(TrustedImmPtr(left.m_ptr), ARMRegisters::S1);
- load8(Address(ARMRegisters::S1), ARMRegisters::S1);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(ARMRegisters::S1), ARMRegisters::S1);
return branch32(cond, ARMRegisters::S1, right8);
}
@@ -702,23 +702,23 @@
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, ARMRegisters::S1);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1);
return branchTest32(cond, ARMRegisters::S1, mask8);
}
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, ARMRegisters::S1);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1);
return branchTest32(cond, ARMRegisters::S1, mask8);
}
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
move(TrustedImmPtr(address.m_ptr), ARMRegisters::S1);
- load8(Address(ARMRegisters::S1), ARMRegisters::S1);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(ARMRegisters::S1), ARMRegisters::S1);
return branchTest32(cond, ARMRegisters::S1, mask8);
}
@@ -985,8 +985,8 @@
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, ARMRegisters::S1);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1);
compare32(cond, ARMRegisters::S1, right8, dest);
}
@@ -1008,8 +1008,8 @@
void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, ARMRegisters::S1);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1);
test32(cond, ARMRegisters::S1, mask8, dest);
}
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1200,6 +1200,14 @@
m_assembler.ldrsb<32>(dest, address.base, memoryTempRegister);
}
+ void load8SignedExtendTo32(const void* address, RegisterID dest)
+ {
+ moveToCachedReg(TrustedImmPtr(address), cachedMemoryTempRegister());
+ m_assembler.ldrsb<32>(dest, memoryTempRegister, ARM64Registers::zr);
+ if (dest == memoryTempRegister)
+ cachedMemoryTempRegister().invalidate();
+ }
+
void zeroExtend8To32(RegisterID src, RegisterID dest)
{
m_assembler.uxtb<32>(dest, src);
@@ -2424,22 +2432,22 @@
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, getCachedMemoryTempRegisterIDAndInvalidate());
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate());
return branch32(cond, memoryTempRegister, right8);
}
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, getCachedMemoryTempRegisterIDAndInvalidate());
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate());
return branch32(cond, memoryTempRegister, right8);
}
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate());
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate());
return branch32(cond, memoryTempRegister, right8);
}
@@ -2583,30 +2591,35 @@
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, getCachedDataTempRegisterIDAndInvalidate());
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedDataTempRegisterIDAndInvalidate());
return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());
return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
move(TrustedImmPtr(reinterpret_cast<void*>(address.offset)), getCachedDataTempRegisterIDAndInvalidate());
- m_assembler.ldrb(dataTempRegister, address.base, dataTempRegister);
+
+ if (MacroAssemblerHelpers::isUnsigned<MacroAssemblerARM64>(cond))
+ m_assembler.ldrb(dataTempRegister, address.base, dataTempRegister);
+ else
+ m_assembler.ldrsb<32>(dataTempRegister, address.base, dataTempRegister);
+
return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, getCachedDataTempRegisterIDAndInvalidate());
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedDataTempRegisterIDAndInvalidate());
return branchTest32(cond, dataTempRegister, mask8);
}
@@ -3023,8 +3036,8 @@
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, getCachedMemoryTempRegisterIDAndInvalidate());
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate());
move(right8, getCachedDataTempRegisterIDAndInvalidate());
compare32(cond, memoryTempRegister, dataTempRegister, dest);
}
@@ -3049,8 +3062,8 @@
void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, getCachedMemoryTempRegisterIDAndInvalidate());
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate());
test32(cond, memoryTempRegister, mask8, dest);
}
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1490,7 +1490,7 @@
Jump branch8(RelationalCondition cond, RegisterID left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
compare32AndSetFlags(left, right8);
return Jump(makeBranch(cond));
}
@@ -1498,8 +1498,8 @@
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
// use addressTempRegister incase the branch8 we call uses dataTempRegister. :-/
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, addressTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
return branch8(cond, addressTempRegister, right8);
}
@@ -1506,8 +1506,8 @@
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
// use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, addressTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
return branch32(cond, addressTempRegister, right8);
}
@@ -1514,9 +1514,9 @@
Jump branch8(RelationalCondition cond, AbsoluteAddress address, TrustedImm32 right)
{
// Use addressTempRegister instead of dataTempRegister, since branch32 uses dataTempRegister.
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
move(TrustedImmPtr(address.m_ptr), addressTempRegister);
- load8(Address(addressTempRegister), addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);
return branch32(cond, addressTempRegister, right8);
}
@@ -1551,8 +1551,8 @@
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
// use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, addressTempRegister);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);
return branchTest32(cond, addressTempRegister, mask8);
}
@@ -1559,8 +1559,8 @@
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
// use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, addressTempRegister);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);
return branchTest32(cond, addressTempRegister, mask8);
}
@@ -1567,9 +1567,9 @@
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
// use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
move(TrustedImmPtr(address.m_ptr), addressTempRegister);
- load8(Address(addressTempRegister), addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);
return branchTest32(cond, addressTempRegister, mask8);
}
@@ -1797,8 +1797,8 @@
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, addressTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
compare32(cond, addressTempRegister, right8, dest);
}
@@ -1825,8 +1825,8 @@
void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, dataTempRegister);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
test32(dataTempRegister, mask8);
m_assembler.it(armV7Condition(cond), false);
m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1));
Added: trunk/Source/_javascript_Core/assembler/MacroAssemblerHelpers.h (0 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerHelpers.h (rev 0)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerHelpers.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace JSC {
+namespace MacroAssemblerHelpers {
+
+// True if this:
+// branch8(cond, value, value)
+// Is the same as this:
+// branch32(cond, signExt8(value), signExt8(value))
+template<typename MacroAssemblerType>
+inline bool isSigned(typename MacroAssemblerType::RelationalCondition cond)
+{
+ switch (cond) {
+ case MacroAssemblerType::Equal:
+ case MacroAssemblerType::NotEqual:
+ case MacroAssemblerType::GreaterThan:
+ case MacroAssemblerType::GreaterThanOrEqual:
+ case MacroAssemblerType::LessThan:
+ case MacroAssemblerType::LessThanOrEqual:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// True if this:
+// branch8(cond, value, value)
+// Is the same as this:
+// branch32(cond, zeroExt8(value), zeroExt8(value))
+template<typename MacroAssemblerType>
+inline bool isUnsigned(typename MacroAssemblerType::RelationalCondition cond)
+{
+ switch (cond) {
+ case MacroAssemblerType::Equal:
+ case MacroAssemblerType::NotEqual:
+ case MacroAssemblerType::Above:
+ case MacroAssemblerType::AboveOrEqual:
+ case MacroAssemblerType::Below:
+ case MacroAssemblerType::BelowOrEqual:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// True if this:
+// test8(cond, value, value)
+// Is the same as this:
+// test32(cond, signExt8(value), signExt8(value))
+template<typename MacroAssemblerType>
+inline bool isSigned(typename MacroAssemblerType::ResultCondition cond)
+{
+ switch (cond) {
+ case MacroAssemblerType::Signed:
+ case MacroAssemblerType::PositiveOrZero:
+ case MacroAssemblerType::Zero:
+ case MacroAssemblerType::NonZero:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// True if this:
+// test8(cond, value, value)
+// Is the same as this:
+// test32(cond, zeroExt8(value), zeroExt8(value))
+template<typename MacroAssemblerType>
+inline bool isUnsigned(typename MacroAssemblerType::ResultCondition cond)
+{
+ switch (cond) {
+ case MacroAssemblerType::Zero:
+ case MacroAssemblerType::NonZero:
+ return true;
+ default:
+ return false;
+ }
+}
+
+template<typename MacroAssemblerType>
+inline typename MacroAssemblerType::TrustedImm32 mask8OnCondition(MacroAssemblerType&, typename MacroAssemblerType::RelationalCondition cond, typename MacroAssemblerType::TrustedImm32 value)
+{
+ if (isUnsigned<MacroAssemblerType>(cond))
+ return typename MacroAssemblerType::TrustedImm32(static_cast<uint8_t>(value.m_value));
+ return typename MacroAssemblerType::TrustedImm32(static_cast<int8_t>(value.m_value));
+}
+
+template<typename MacroAssemblerType>
+inline typename MacroAssemblerType::TrustedImm32 mask8OnCondition(MacroAssemblerType&, typename MacroAssemblerType::ResultCondition cond, typename MacroAssemblerType::TrustedImm32 value)
+{
+ if (isUnsigned<MacroAssemblerType>(cond))
+ return typename MacroAssemblerType::TrustedImm32(static_cast<uint8_t>(value.m_value));
+ ASSERT_WITH_MESSAGE(cond != MacroAssemblerType::Overflow, "Overflow is not used for 8bit test operations.");
+ ASSERT(isSigned<MacroAssemblerType>(cond));
+ return typename MacroAssemblerType::TrustedImm32(static_cast<int8_t>(value.m_value));
+}
+
+template<typename MacroAssemblerType, typename Condition, typename ...Args>
+void load8OnCondition(MacroAssemblerType& jit, Condition cond, Args... args)
+{
+ if (isUnsigned<MacroAssemblerType>(cond))
+ return jit.load8(std::forward<Args>(args)...);
+ return jit.load8SignedExtendTo32(std::forward<Args>(args)...);
+}
+
+} } // namespace JSC
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1445,8 +1445,8 @@
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, dataTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
move(right8, immTempRegister);
return branch32(cond, dataTempRegister, immTempRegister);
}
@@ -1453,8 +1453,8 @@
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, dataTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
move(right8, immTempRegister);
return branch32(cond, dataTempRegister, immTempRegister);
}
@@ -1461,8 +1461,8 @@
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, dataTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
move(right8, immTempRegister);
compare32(cond, dataTempRegister, immTempRegister, dest);
}
@@ -1469,8 +1469,8 @@
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
- load8(left, dataTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
// Be careful that the previous load8() uses immTempRegister.
// So, we need to put move() after load8().
move(right8, immTempRegister);
@@ -1628,23 +1628,23 @@
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, dataTempRegister);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, dataTempRegister);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
move(TrustedImmPtr(address.m_ptr), dataTempRegister);
- load8(Address(dataTempRegister), dataTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(dataTempRegister), dataTempRegister);
return branchTest32(cond, dataTempRegister, mask8);
}
@@ -2218,9 +2218,9 @@
void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
{
ASSERT((cond == Zero) || (cond == NonZero));
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
- load8(address, dataTempRegister);
- if (mask8.m_value == -1 && !m_fixedWidth) {
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
+ if ((mask8.m_value & 0xff) == 0xff && !m_fixedWidth) {
if (cond == Zero)
m_assembler.sltiu(dest, dataTempRegister, 1);
else
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1605,9 +1605,9 @@
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
RegisterID addressTempRegister = claimScratch();
- load8(address, addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);
Jump jmp = branchTest32(cond, addressTempRegister, mask8);
releaseScratch(addressTempRegister);
return jmp;
@@ -1615,9 +1615,9 @@
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
RegisterID addressTempRegister = claimScratch();
- load8(address, addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);
Jump jmp = branchTest32(cond, addressTempRegister, mask8);
releaseScratch(addressTempRegister);
return jmp;
@@ -1625,10 +1625,10 @@
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
RegisterID addressTempRegister = claimScratch();
move(TrustedImmPtr(address.m_ptr), addressTempRegister);
- load8(Address(addressTempRegister), addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);
Jump jmp = branchTest32(cond, addressTempRegister, mask8);
releaseScratch(addressTempRegister);
return jmp;
@@ -1646,9 +1646,9 @@
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
RegisterID addressTempRegister = claimScratch();
- load8(left, addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
Jump jmp = branch32(cond, addressTempRegister, right8);
releaseScratch(addressTempRegister);
return jmp;
@@ -1656,9 +1656,9 @@
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
RegisterID addressTempRegister = claimScratch();
- load8(left, addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
Jump jmp = branch32(cond, addressTempRegister, right8);
releaseScratch(addressTempRegister);
return jmp;
@@ -1666,9 +1666,9 @@
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
RegisterID addressTempRegister = claimScratch();
- load8(left, addressTempRegister);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);
compare32(cond, addressTempRegister, right8, dest);
releaseScratch(addressTempRegister);
}
@@ -1841,10 +1841,10 @@
{
ASSERT((cond == Zero) || (cond == NonZero));
- TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
- load8(address, dest);
- if (mask8.m_value == -1)
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dest);
+ if ((mask8.m_value & 0xff) == 0xff)
compare32(0, dest, static_cast<RelationalCondition>(cond));
else
testlImm(mask8.m_value, dest);
@@ -1965,12 +1965,12 @@
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
RegisterID lefttmp = claimScratch();
loadEffectiveAddress(left, lefttmp);
- load8(lefttmp, lefttmp);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, lefttmp, lefttmp);
RegisterID righttmp = claimScratch();
m_assembler.loadConstant(right8.m_value, righttmp);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (208449 => 208450)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2016-11-09 19:10:15 UTC (rev 208449)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2016-11-09 19:10:42 UTC (rev 208450)
@@ -1220,9 +1220,8 @@
using MacroAssemblerX86Common::branch8;
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- TrustedImm32 right8(static_cast<int8_t>(right.m_value));
MacroAssemblerX86Common::move(TrustedImmPtr(left.m_ptr), scratchRegister());
- return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister()), right8);
+ return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister()), right);
}
using MacroAssemblerX86Common::branchTest8;