From 1613846ab0cb0f0920d8cea0075c7581d0fccd0d Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 16 Aug 2017 23:11:05 +0100 Subject: [PATCH] reg_alloc: Handle XMM registers in LoadImmediate --- src/backend_x64/reg_alloc.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/backend_x64/reg_alloc.cpp b/src/backend_x64/reg_alloc.cpp index 46ab522f..72d26f24 100644 --- a/src/backend_x64/reg_alloc.cpp +++ b/src/backend_x64/reg_alloc.cpp @@ -398,14 +398,27 @@ void RegAlloc::DefineValueImpl(IR::Inst* def_inst, const IR::Value& use_inst) { HostLoc RegAlloc::LoadImmediate(IR::Value imm, HostLoc host_loc) { ASSERT_MSG(imm.IsImmediate(), "imm is not an immediate"); - Xbyak::Reg64 reg = HostLocToReg64(host_loc); + if (HostLocIsGPR(host_loc)) { + Xbyak::Reg64 reg = HostLocToReg64(host_loc); + u64 imm_value = ImmediateToU64(imm); + if (imm_value == 0) + code->xor_(reg.cvt32(), reg.cvt32()); + else + code->mov(reg, imm_value); + return host_loc; + } - u64 imm_value = ImmediateToU64(imm); - if (imm_value == 0) - code->xor_(reg.cvt32(), reg.cvt32()); - else - code->mov(reg, imm_value); - return host_loc; + if (HostLocIsXMM(host_loc)) { + Xbyak::Xmm reg = HostLocToXmm(host_loc); + u64 imm_value = ImmediateToU64(imm); + if (imm_value == 0) + code->pxor(reg, reg); + else + code->movdqa(reg, code->MConst(imm_value)); // TODO: movaps/movapd more appropriate sometimes + return host_loc; + } + + UNREACHABLE(); } void RegAlloc::Move(HostLoc to, HostLoc from) {