From 63de9b2820196261734e1f40389f0d1cbe22b461 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 10 Nov 2014 14:04:06 -0500 Subject: [PATCH] [jit] Use xmm5 as an fp scratch register on winx64. --- mono/mini/mini-amd64.c | 14 +++++++------- mono/mini/mini-amd64.h | 9 ++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index 53c70eaf9c4..34d0174e31b 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -4442,8 +4442,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_STORER4_MEMBASE_REG: /* This requires a double->single conversion */ - amd64_sse_cvtsd2ss_reg_reg (code, AMD64_XMM15, ins->sreg1); - amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, AMD64_XMM15); + amd64_sse_cvtsd2ss_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); + amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, MONO_ARCH_FP_SCRATCH_REG); break; case OP_LOADR4_MEMBASE: amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); @@ -5346,8 +5346,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_EXTRACT_I8: if (ins->inst_c0) { - amd64_movhlps_reg_reg (code, AMD64_XMM15, ins->sreg1); - amd64_movd_reg_xreg_size (code, ins->dreg, AMD64_XMM15, 8); + amd64_movhlps_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); + amd64_movd_reg_xreg_size (code, ins->dreg, MONO_ARCH_FP_SCRATCH_REG, 8); } else { amd64_movd_reg_xreg_size (code, ins->dreg, ins->sreg1, 8); } @@ -5399,11 +5399,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_sse_pinsrw_reg_reg_imm (code, ins->dreg, ins->sreg2, ins->inst_c0 * 2 + 1); break; case OP_INSERTX_I8_SLOW: - amd64_movd_xreg_reg_size(code, AMD64_XMM15, ins->sreg2, 8); + amd64_movd_xreg_reg_size(code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg2, 8); if (ins->inst_c0) - amd64_movlhps_reg_reg (code, ins->dreg, AMD64_XMM15); + amd64_movlhps_reg_reg (code, ins->dreg, MONO_ARCH_FP_SCRATCH_REG); else - amd64_sse_movsd_reg_reg (code, ins->dreg, AMD64_XMM15); + amd64_sse_movsd_reg_reg (code, ins->dreg, MONO_ARCH_FP_SCRATCH_REG); break; case OP_INSERTX_R4_SLOW: diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h index 393fb86fbc2..299fa7fea34 100644 --- a/mono/mini/mini-amd64.h +++ b/mono/mini/mini-amd64.h @@ -102,14 +102,17 @@ struct sigcontext { #define MONO_ARCH_FP_RETURN_REG AMD64_XMM0 -/* xmm15 is reserved for use by some opcodes */ #ifdef TARGET_WIN32 -#define MONO_ARCH_CALLEE_FREGS 0x3f +/* xmm5 is used as a scratch register */ +#define MONO_ARCH_CALLEE_FREGS 0x1f /* xmm6:xmm15 */ -#define MONO_ARCH_CALLEE_SAVED_FREGS (0x7fff - 0x3f) +#define MONO_ARCH_CALLEE_SAVED_FREGS (0xffff - 0x3f) +#define MONO_ARCH_FP_SCRATCH_REG AMD64_XMM5 #else +/* xmm15 is used as a scratch register */ #define MONO_ARCH_CALLEE_FREGS 0x7fff #define MONO_ARCH_CALLEE_SAVED_FREGS 0 +#define MONO_ARCH_FP_SCRATCH_REG AMD64_XMM15 #endif #define MONO_MAX_XREGS MONO_MAX_FREGS -- GitLab