[Compiler] Improve spills and register backups (#175)

* xmm spill

* improve getting stack variables

* improve symbol getting

* update changelog
This commit is contained in:
water111
2020-12-31 15:59:11 -05:00
committed by GitHub
parent a80b331c27
commit c8d382b35c
15 changed files with 535 additions and 121 deletions
+80
View File
@@ -3802,3 +3802,83 @@ TEST(EmitterSlow, xmm32_move) {
}
}
}
TEST(Emitter, LEA) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::lea_reg_plus_off(RDI, RSP, -3));
tester.emit(IGen::lea_reg_plus_off(RDI, R12, -3));
tester.emit(IGen::lea_reg_plus_off(R13, RSP, -3));
tester.emit(IGen::lea_reg_plus_off(R13, R12, -3));
tester.emit(IGen::lea_reg_plus_off(RDI, RSP, -300));
tester.emit(IGen::lea_reg_plus_off(RDI, R12, -300));
tester.emit(IGen::lea_reg_plus_off(R13, RSP, -300));
tester.emit(IGen::lea_reg_plus_off(R13, R12, -300));
EXPECT_EQ(tester.dump_to_hex_string(true),
"488D7C24FD498D7C24FD4C8D6C24FD4D8D6C24FD488DBC24D4FEFFFF498DBC24D4FEFFFF4C8DAC24D4FEFF"
"FF4D8DAC24D4FEFFFF");
}
TEST(EmitterXMM, StackLoad32) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::load32_xmm32_gpr64_plus_s32(XMM0 + 3, RSP, -1234));
tester.emit(IGen::load32_xmm32_gpr64_plus_s32(XMM0 + 13, RSP, -1234));
EXPECT_EQ(tester.dump_to_hex_string(true), "F30F109C242EFBFFFFF3440F10AC242EFBFFFF");
}
TEST(EmitterXMM, StackLoad8) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::load32_xmm32_gpr64_plus_s8(XMM0 + 3, RSP, -12));
tester.emit(IGen::load32_xmm32_gpr64_plus_s8(XMM0 + 13, RSP, -12));
EXPECT_EQ(tester.dump_to_hex_string(true), "F30F105C24F4F3440F106C24F4");
}
TEST(EmitterXMM, StackLoadFull32) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::load128_xmm128_gpr64_s32(XMM0 + 3, RSP, -1234));
tester.emit(IGen::load128_xmm128_gpr64_s32(XMM0 + 13, RSP, -1234));
EXPECT_EQ(tester.dump_to_hex_string(true), "660F6F9C242EFBFFFF66440F6FAC242EFBFFFF");
}
TEST(EmitterXMM, StackLoadFull8) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::load128_xmm128_gpr64_s8(XMM0 + 3, RSP, -12));
tester.emit(IGen::load128_xmm128_gpr64_s8(XMM0 + 13, RSP, -12));
EXPECT_EQ(tester.dump_to_hex_string(true), "660F6F5C24F466440F6F6C24F4");
}
TEST(EmitterXMM, StackStore32) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::store32_xmm32_gpr64_plus_s32(RSP, XMM0 + 3, -1234));
tester.emit(IGen::store32_xmm32_gpr64_plus_s32(RSP, XMM0 + 13, -1234));
EXPECT_EQ(tester.dump_to_hex_string(true), "F30F119C242EFBFFFFF3440F11AC242EFBFFFF");
}
TEST(EmitterXMM, StackStore8) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::store32_xmm32_gpr64_plus_s8(RSP, XMM0 + 3, -12));
tester.emit(IGen::store32_xmm32_gpr64_plus_s8(RSP, XMM0 + 13, -12));
EXPECT_EQ(tester.dump_to_hex_string(true), "F30F115C24F4F3440F116C24F4");
}
TEST(EmitterXMM, StackStoreFull32) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::store128_gpr64_xmm128_s32(RSP, XMM0 + 3, -1234));
tester.emit(IGen::store128_gpr64_xmm128_s32(RSP, XMM0 + 13, -1234));
EXPECT_EQ(tester.dump_to_hex_string(true), "660F7F9C242EFBFFFF66440F7FAC242EFBFFFF");
}
TEST(EmitterXMM, StackStoreFull8) {
CodeTester tester;
tester.init_code_buffer(1024);
tester.emit(IGen::store128_gpr64_xmm128_s8(RSP, XMM0 + 3, -12));
tester.emit(IGen::store128_gpr64_xmm128_s8(RSP, XMM0 + 13, -12));
EXPECT_EQ(tester.dump_to_hex_string(true), "660F7F5C24F466440F7F6C24F4");
}