Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (191741 => 191742)
--- trunk/Source/_javascript_Core/ChangeLog 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-10-29 19:01:04 UTC (rev 191742)
@@ -1,3 +1,33 @@
+2015-10-28 Filip Pizlo <fpi...@apple.com>
+
+ Air::spillEverything() should try to replace tmps with spill slots without using registers whenever possible
+ https://bugs.webkit.org/show_bug.cgi?id=150657
+
+ Reviewed by Geoffrey Garen.
+
+ Also added the ability to store an immediate to memory.
+
+ * assembler/MacroAssembler.h:
+ (JSC::MacroAssembler::storePtr):
+ * assembler/MacroAssemblerARM64.h:
+ (JSC::MacroAssemblerARM64::store64):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::store64):
+ * b3/B3LowerToAir.cpp:
+ (JSC::B3::Air::LowerToAir::imm):
+ (JSC::B3::Air::LowerToAir::immAnyInt):
+ (JSC::B3::Air::LowerToAir::immOrTmp):
+ (JSC::B3::Air::LowerToAir::tryStore):
+ * b3/air/AirOpcode.opcodes:
+ * b3/air/AirSpillEverything.cpp:
+ (JSC::B3::Air::spillEverything):
+ * b3/testb3.cpp:
+ (JSC::B3::testStore):
+ (JSC::B3::testStoreConstant):
+ (JSC::B3::testStoreConstantPtr):
+ (JSC::B3::testTrunc):
+ (JSC::B3::run):
+
2015-10-28 Joseph Pecoraro <pecor...@apple.com>
Web Inspector: Rename InspectorResourceAgent to InspectorNetworkAgent
Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (191741 => 191742)
--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2015-10-29 19:01:04 UTC (rev 191742)
@@ -880,6 +880,11 @@
store64(TrustedImm64(imm), address);
}
+ void storePtr(TrustedImm32 imm, ImplicitAddress address)
+ {
+ store64(imm, address);
+ }
+
void storePtr(TrustedImmPtr imm, BaseIndex address)
{
store64(TrustedImm64(imm), address);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (191741 => 191742)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2015-10-29 19:01:04 UTC (rev 191742)
@@ -1000,6 +1000,11 @@
store<64>(src, address);
}
+ void store64(TrustedImm32 imm, ImplicitAddress address)
+ {
+ store64(TrustedImm64(imm), address);
+ }
+
void store64(TrustedImm64 imm, ImplicitAddress address)
{
if (!imm.m_value) {
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (191741 => 191742)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2015-10-29 19:01:04 UTC (rev 191742)
@@ -480,14 +480,20 @@
}
}
+ void store64(TrustedImm32 imm, ImplicitAddress address)
+ {
+ m_assembler.movq_i32m(imm.m_value, address.offset, address.base);
+ }
+
void store64(TrustedImm64 imm, ImplicitAddress address)
{
- if (CAN_SIGN_EXTEND_32_64(imm.m_value))
- m_assembler.movq_i32m(static_cast<int>(imm.m_value), address.offset, address.base);
- else {
- move(imm, scratchRegister);
- store64(scratchRegister, address);
+ if (CAN_SIGN_EXTEND_32_64(imm.m_value)) {
+ store64(TrustedImm32(static_cast<int32_t>(imm.m_value)), address);
+ return;
}
+
+ move(imm, scratchRegister);
+ store64(scratchRegister, address);
}
void store64(TrustedImm64 imm, BaseIndex address)
Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (191741 => 191742)
--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-10-29 19:01:04 UTC (rev 191742)
@@ -187,6 +187,17 @@
return Arg();
}
+ Arg immAnyInt(Value* value)
+ {
+ if (value->hasInt()) {
+ int64_t fullValue = value->asInt();
+ int32_t immediateValue = static_cast<int32_t>(fullValue);
+ if (fullValue == immediateValue)
+ return Arg::imm(immediateValue);
+ }
+ return Arg();
+ }
+
Arg immOrTmp(Value* value)
{
if (Arg result = imm(value))
@@ -541,6 +552,15 @@
bool tryStore(Value* value, Value* address)
{
+ Air::Opcode move = moveForType(value->type());
+ Arg destination = effectiveAddr(address);
+
+ Arg imm = immAnyInt(value);
+ if (imm && isValidForm(move, Arg::Imm, destination.kind())) {
+ append(moveForType(value->type()), imm, effectiveAddr(address, currentValue));
+ return true;
+ }
+
append(moveForType(value->type()), tmp(value), effectiveAddr(address, currentValue));
return true;
}
Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (191741 => 191742)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-10-29 19:01:04 UTC (rev 191742)
@@ -108,6 +108,7 @@
Index, Tmp as loadPtr
Tmp, Addr as storePtr
Tmp, Index as storePtr
+ Imm, Addr as storePtr
Move32 U:G, D:G
Tmp, Tmp as zeroExtend32ToPtr
Modified: trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp (191741 => 191742)
--- trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/air/AirSpillEverything.cpp 2015-10-29 19:01:04 UTC (rev 191742)
@@ -91,11 +91,29 @@
RegisterSet& setBefore = usedRegisters[block][instIndex];
RegisterSet& setAfter = usedRegisters[block][instIndex + 1];
Inst& inst = block->at(instIndex);
+
+ // First try to spill directly.
+ for (unsigned i = 0; i < inst.args.size(); ++i) {
+ Arg& arg = inst.args[i];
+
+ if (arg.isTmp()) {
+ if (arg.isReg())
+ continue;
+
+ if (inst.admitsStack(i)) {
+ StackSlot* stackSlot = allStackSlots[arg.type()][arg.tmpIndex()];
+ arg = Arg::stack(stackSlot);
+ continue;
+ }
+ }
+ }
+
+ // Now fall back on spilling using separate Move's to load/store the tmp.
inst.forEachTmp(
[&] (Tmp& tmp, Arg::Role role, Arg::Type type) {
if (tmp.isReg())
return;
-
+
StackSlot* stackSlot = allStackSlots[type][tmp.tmpIndex()];
Arg arg = Arg::stack(stackSlot);
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (191741 => 191742)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2015-10-29 18:45:11 UTC (rev 191741)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2015-10-29 19:01:04 UTC (rev 191742)
@@ -148,6 +148,42 @@
CHECK(slot == value);
}
+void testStoreConstant(int value)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ int slot = 0xbaadbeef;
+ root->appendNew<MemoryValue>(
+ proc, Store, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), value),
+ root->appendNew<ConstPtrValue>(proc, Origin(), &slot));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(), root->appendNew<Const32Value>(proc, Origin(), 0));
+
+ CHECK(!compileAndRun<int>(proc));
+ CHECK(slot == value);
+}
+
+void testStoreConstantPtr(intptr_t value)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ intptr_t slot;
+ if (is64Bit())
+ slot = (static_cast<intptr_t>(0xbaadbeef) << 32) + static_cast<intptr_t>(0xbaadbeef);
+ else
+ slot = 0xbaadbeef;
+ root->appendNew<MemoryValue>(
+ proc, Store, Origin(),
+ root->appendNew<ConstPtrValue>(proc, Origin(), value),
+ root->appendNew<ConstPtrValue>(proc, Origin(), &slot));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(), root->appendNew<Const32Value>(proc, Origin(), 0));
+
+ CHECK(!compileAndRun<int>(proc));
+ CHECK(slot == value);
+}
+
void testTrunc(int64_t value)
{
Procedure proc;
@@ -337,6 +373,8 @@
RUN(testAddArgs32(1, 1));
RUN(testAddArgs32(1, 2));
RUN(testStore(44));
+ RUN(testStoreConstant(49));
+ RUN(testStoreConstantPtr(49));
RUN(testTrunc((static_cast<int64_t>(1) << 40) + 42));
RUN(testAdd1(45));
RUN(testStoreAddLoad(46));