Modified: trunk/Source/_javascript_Core/ChangeLog (142145 => 142146)
--- trunk/Source/_javascript_Core/ChangeLog 2013-02-07 18:03:17 UTC (rev 142145)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-02-07 18:04:04 UTC (rev 142146)
@@ -1,3 +1,16 @@
+2013-02-07 Zoltan Herczeg <[email protected]>
+
+ Invalid code is generated for storing constants with baseindex addressing modes on ARM traditional.
+ https://bugs.webkit.org/show_bug.cgi?id=109050
+
+ Reviewed by Oliver Hunt.
+
+ The S! scratch register is reused, but it should contain the constant value.
+
+ * assembler/ARMAssembler.cpp:
+ (JSC::ARMAssembler::baseIndexTransfer32):
+ (JSC::ARMAssembler::baseIndexTransfer16):
+
2013-02-07 Andras Becsi <[email protected]>
[Qt] Use GNU ar's thin archive format for intermediate static libs
Modified: trunk/Source/_javascript_Core/assembler/ARMAssembler.cpp (142145 => 142146)
--- trunk/Source/_javascript_Core/assembler/ARMAssembler.cpp 2013-02-07 18:03:17 UTC (rev 142145)
+++ trunk/Source/_javascript_Core/assembler/ARMAssembler.cpp 2013-02-07 18:04:04 UTC (rev 142146)
@@ -297,8 +297,15 @@
return;
}
- add(ARMRegisters::S1, base, op2);
- dataTransfer32(transferType, srcDst, ARMRegisters::S1, offset);
+ if (offset <= 0xfffff && offset >= -0xfffff) {
+ add(ARMRegisters::S0, base, op2);
+ dataTransfer32(transferType, srcDst, ARMRegisters::S0, offset);
+ return;
+ }
+
+ moveImm(offset, ARMRegisters::S0);
+ add(ARMRegisters::S0, ARMRegisters::S0, op2);
+ dtrUpRegister(transferType, srcDst, base, ARMRegisters::S0);
}
void ARMAssembler::dataTransfer16(DataTransferTypeB transferType, RegisterID srcDst, RegisterID base, int32_t offset)
@@ -333,8 +340,17 @@
return;
}
- add(ARMRegisters::S1, base, lsl(index, scale));
- dataTransfer16(transferType, srcDst, ARMRegisters::S1, offset);
+ ARMWord op2 = lsl(index, scale);
+
+ if (offset <= 0xffff && offset >= -0xffff) {
+ add(ARMRegisters::S0, base, op2);
+ dataTransfer16(transferType, srcDst, ARMRegisters::S0, offset);
+ return;
+ }
+
+ moveImm(offset, ARMRegisters::S0);
+ add(ARMRegisters::S0, ARMRegisters::S0, op2);
+ halfDtrUpRegister(transferType, srcDst, base, ARMRegisters::S0);
}
void ARMAssembler::dataTransferFloat(DataTransferTypeFloat transferType, FPRegisterID srcDst, RegisterID base, int32_t offset)