aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-31 22:49:23 +0100
committerMike Pall <mike>2010-12-31 22:49:23 +0100
commit3b47eba9ccf3324f790a90c99f0c50f04ba9ce1e (patch)
tree1151c649a845c498877edd9822509cf56798f6fd /src
parent007067bdd86c45809b831d386bbb90a02600c49d (diff)
downloadluajit-3b47eba9ccf3324f790a90c99f0c50f04ba9ce1e.tar.gz
luajit-3b47eba9ccf3324f790a90c99f0c50f04ba9ce1e.tar.bz2
luajit-3b47eba9ccf3324f790a90c99f0c50f04ba9ce1e.zip
Add 8/16 to 32 bit sign/zero-extension variants to CONV.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index b01edfbf..8127b2eb 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -1676,7 +1676,30 @@ static void asm_conv(ASMState *as, IRIns *ir)
1676 (irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0), 1676 (irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0),
1677 left); 1677 left);
1678 } 1678 }
1679 } else { /* Integer to integer conversion. Only need 32/64 bit variants. */ 1679 } else if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */
1680 Reg left, dest = ra_dest(as, ir, RSET_GPR);
1681 RegSet allow = RSET_GPR;
1682 x86Op op;
1683 lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));
1684 if (st == IRT_I8) {
1685 op = XO_MOVSXb; allow = RSET_GPR8; dest |= FORCE_REX;
1686 } else if (st == IRT_U8) {
1687 op = XO_MOVZXb; allow = RSET_GPR8; dest |= FORCE_REX;
1688 } else if (st == IRT_I16) {
1689 op = XO_MOVSXw;
1690 } else {
1691 op = XO_MOVZXw;
1692 }
1693 left = asm_fuseload(as, ir->op1, allow);
1694 /* Add extra MOV if source is already in wrong register. */
1695 if (!LJ_64 && left != RID_MRM && !rset_test(allow, left)) {
1696 Reg tmp = ra_scratch(as, allow);
1697 emit_rr(as, op, dest, tmp);
1698 emit_rr(as, XO_MOV, tmp, left);
1699 } else {
1700 emit_mrm(as, op, dest, left);
1701 }
1702 } else { /* 32/64 bit integer conversions. */
1680 if (irt_is64(ir->t)) { 1703 if (irt_is64(ir->t)) {
1681#if LJ_32 1704#if LJ_32
1682 /* NYI: conversion to 64 bit integers. */ 1705 /* NYI: conversion to 64 bit integers. */