diff options
author | Mike Pall <mike> | 2010-12-31 22:49:23 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-12-31 22:49:23 +0100 |
commit | 3b47eba9ccf3324f790a90c99f0c50f04ba9ce1e (patch) | |
tree | 1151c649a845c498877edd9822509cf56798f6fd /src | |
parent | 007067bdd86c45809b831d386bbb90a02600c49d (diff) | |
download | luajit-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.c | 25 |
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. */ |