diff options
author | Mike Pall <mike> | 2010-12-30 00:36:33 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-12-30 00:36:33 +0100 |
commit | 8bcc5ed021b9c683d7e254dc9e0937eaa40f6d64 (patch) | |
tree | 655ce19a65e3beb0bc9657c643e3a2be2aa0145b | |
parent | 2ca2de7f0ec03a388ec86728847949ed495bdbf4 (diff) | |
download | luajit-8bcc5ed021b9c683d7e254dc9e0937eaa40f6d64.tar.gz luajit-8bcc5ed021b9c683d7e254dc9e0937eaa40f6d64.tar.bz2 luajit-8bcc5ed021b9c683d7e254dc9e0937eaa40f6d64.zip |
Add support for IRT_FLOAT to XLOAD/XSTORE.
-rw-r--r-- | src/lj_asm.c | 7 | ||||
-rw-r--r-- | src/lj_target_x86.h | 2 |
2 files changed, 7 insertions, 2 deletions
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) | |||
2130 | case IRT_I16: xo = XO_MOVSXw; break; | 2130 | case IRT_I16: xo = XO_MOVSXw; break; |
2131 | case IRT_U16: xo = XO_MOVZXw; break; | 2131 | case IRT_U16: xo = XO_MOVZXw; break; |
2132 | case IRT_NUM: xo = XMM_MOVRM(as); break; | 2132 | case IRT_NUM: xo = XMM_MOVRM(as); break; |
2133 | case IRT_FLOAT: xo = XO_MOVSS; break; | ||
2133 | default: | 2134 | default: |
2134 | if (LJ_64 && irt_is64(ir->t)) | 2135 | if (LJ_64 && irt_is64(ir->t)) |
2135 | dest |= REX_64; | 2136 | dest |= REX_64; |
@@ -2149,9 +2150,10 @@ static void asm_fxstore(ASMState *as, IRIns *ir) | |||
2149 | /* The IRT_I16/IRT_U16 stores should never be simplified for constant | 2150 | /* The IRT_I16/IRT_U16 stores should never be simplified for constant |
2150 | ** values since mov word [mem], imm16 has a length-changing prefix. | 2151 | ** values since mov word [mem], imm16 has a length-changing prefix. |
2151 | */ | 2152 | */ |
2152 | if (irt_isi16(ir->t) || irt_isu16(ir->t) || irt_isnum(ir->t) || | 2153 | if (irt_isi16(ir->t) || irt_isu16(ir->t) || |
2154 | irt_isnum(ir->t) || irt_isfloat(ir->t) || | ||
2153 | !asm_isk32(as, ir->op2, &k)) { | 2155 | !asm_isk32(as, ir->op2, &k)) { |
2154 | RegSet allow8 = irt_isnum(ir->t) ? RSET_FPR : | 2156 | RegSet allow8 = (irt_isnum(ir->t) || irt_isfloat(ir->t)) ? RSET_FPR : |
2155 | (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR; | 2157 | (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR; |
2156 | src = osrc = ra_alloc1(as, ir->op2, allow8); | 2158 | src = osrc = ra_alloc1(as, ir->op2, allow8); |
2157 | if (!LJ_64 && !rset_test(allow8, src)) { /* Already in wrong register. */ | 2159 | if (!LJ_64 && !rset_test(allow8, src)) { /* Already in wrong register. */ |
@@ -2171,6 +2173,7 @@ static void asm_fxstore(ASMState *as, IRIns *ir) | |||
2171 | case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break; | 2173 | case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break; |
2172 | case IRT_I16: case IRT_U16: xo = XO_MOVtow; break; | 2174 | case IRT_I16: case IRT_U16: xo = XO_MOVtow; break; |
2173 | case IRT_NUM: xo = XO_MOVSDto; break; | 2175 | case IRT_NUM: xo = XO_MOVSDto; break; |
2176 | case IRT_FLOAT: xo = XO_MOVSSto; break; | ||
2174 | #if LJ_64 | 2177 | #if LJ_64 |
2175 | case IRT_LIGHTUD: lua_assert(0); /* NYI: mask 64 bit lightuserdata. */ | 2178 | case IRT_LIGHTUD: lua_assert(0); /* NYI: mask 64 bit lightuserdata. */ |
2176 | #endif | 2179 | #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 { | |||
235 | 235 | ||
236 | XO_MOVSD = XO_f20f(10), | 236 | XO_MOVSD = XO_f20f(10), |
237 | XO_MOVSDto = XO_f20f(11), | 237 | XO_MOVSDto = XO_f20f(11), |
238 | XO_MOVSS = XO_f30f(10), | ||
239 | XO_MOVSSto = XO_f30f(11), | ||
238 | XO_MOVLPD = XO_660f(12), | 240 | XO_MOVLPD = XO_660f(12), |
239 | XO_MOVAPS = XO_0f(28), | 241 | XO_MOVAPS = XO_0f(28), |
240 | XO_XORPS = XO_0f(57), | 242 | XO_XORPS = XO_0f(57), |