aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-19 02:05:26 +0100
committerMike Pall <mike>2011-01-19 02:05:26 +0100
commitd20e53c322332f8197f401d6125f48071488b711 (patch)
tree4f7acb83c9897897617ac380d5d8808979691016 /src
parent8407ac0eca109d466b388d04b29f12f21265a1e0 (diff)
downloadluajit-d20e53c322332f8197f401d6125f48071488b711.tar.gz
luajit-d20e53c322332f8197f401d6125f48071488b711.tar.bz2
luajit-d20e53c322332f8197f401d6125f48071488b711.zip
Combine i8/u8 XLOAD with BAND+comparison into test byte mrm, imm8.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c
index bda86fc4..cc2ae597 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -2945,8 +2945,28 @@ static void asm_comp_(ASMState *as, IRIns *ir, int cc)
2945 if (!asm_isk32(as, irl->op2, &imm)) { 2945 if (!asm_isk32(as, irl->op2, &imm)) {
2946 left = ra_alloc1(as, irl->op2, allow); 2946 left = ra_alloc1(as, irl->op2, allow);
2947 rset_clear(allow, left); 2947 rset_clear(allow, left);
2948 } else { /* Try to Fuse IRT_I8/IRT_U8 loads, too. See below. */
2949 IRIns *irll = IR(irl->op1);
2950 if (opisfusableload((IROp)irll->o) &&
2951 (irt_isi8(irll->t) || irt_isu8(irll->t))) {
2952 IRType1 origt = irll->t; /* Temporarily flip types. */
2953 irll->t.irt = (irll->t.irt & ~IRT_TYPE) | IRT_INT;
2954 as->curins--; /* Skip to BAND to avoid failing in noconflict(). */
2955 right = asm_fuseload(as, irl->op1, RSET_GPR);
2956 as->curins++;
2957 irll->t = origt;
2958 if (right != RID_MRM) goto test_nofuse;
2959 /* Fusion succeeded, emit test byte mrm, imm8. */
2960 asm_guardcc(as, cc);
2961 emit_i8(as, (imm & 0xff));
2962 emit_mrm(as, XO_GROUP3b, XOg_TEST, RID_MRM);
2963 return;
2964 }
2948 } 2965 }
2966 as->curins--; /* Skip to BAND to avoid failing in noconflict(). */
2949 right = asm_fuseload(as, irl->op1, allow); 2967 right = asm_fuseload(as, irl->op1, allow);
2968 as->curins++; /* Undo the above. */
2969 test_nofuse:
2950 asm_guardcc(as, cc); 2970 asm_guardcc(as, cc);
2951 if (ra_noreg(left)) { 2971 if (ra_noreg(left)) {
2952 emit_i32(as, imm); 2972 emit_i32(as, imm);