From 8bcc5ed021b9c683d7e254dc9e0937eaa40f6d64 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 30 Dec 2010 00:36:33 +0100 Subject: Add support for IRT_FLOAT to XLOAD/XSTORE. --- src/lj_asm.c | 7 +++++-- src/lj_target_x86.h | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lj_asm.c b/src/lj_asm.c index d75858f8..eb6f00e7 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -2130,6 +2130,7 @@ static void asm_fxload(ASMState *as, IRIns *ir) case IRT_I16: xo = XO_MOVSXw; break; case IRT_U16: xo = XO_MOVZXw; break; case IRT_NUM: xo = XMM_MOVRM(as); break; + case IRT_FLOAT: xo = XO_MOVSS; break; default: if (LJ_64 && irt_is64(ir->t)) dest |= REX_64; @@ -2149,9 +2150,10 @@ static void asm_fxstore(ASMState *as, IRIns *ir) /* The IRT_I16/IRT_U16 stores should never be simplified for constant ** values since mov word [mem], imm16 has a length-changing prefix. */ - if (irt_isi16(ir->t) || irt_isu16(ir->t) || irt_isnum(ir->t) || + if (irt_isi16(ir->t) || irt_isu16(ir->t) || + irt_isnum(ir->t) || irt_isfloat(ir->t) || !asm_isk32(as, ir->op2, &k)) { - RegSet allow8 = irt_isnum(ir->t) ? RSET_FPR : + RegSet allow8 = (irt_isnum(ir->t) || irt_isfloat(ir->t)) ? RSET_FPR : (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR; src = osrc = ra_alloc1(as, ir->op2, allow8); if (!LJ_64 && !rset_test(allow8, src)) { /* Already in wrong register. */ @@ -2171,6 +2173,7 @@ static void asm_fxstore(ASMState *as, IRIns *ir) case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break; case IRT_I16: case IRT_U16: xo = XO_MOVtow; break; case IRT_NUM: xo = XO_MOVSDto; break; + case IRT_FLOAT: xo = XO_MOVSSto; break; #if LJ_64 case IRT_LIGHTUD: lua_assert(0); /* NYI: mask 64 bit lightuserdata. */ #endif diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h index 67590eb3..eb287f03 100644 --- a/src/lj_target_x86.h +++ b/src/lj_target_x86.h @@ -235,6 +235,8 @@ typedef enum { XO_MOVSD = XO_f20f(10), XO_MOVSDto = XO_f20f(11), + XO_MOVSS = XO_f30f(10), + XO_MOVSSto = XO_f30f(11), XO_MOVLPD = XO_660f(12), XO_MOVAPS = XO_0f(28), XO_XORPS = XO_0f(57), -- cgit v1.2.3-55-g6feb