aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2011-06-02 01:46:23 +0200
committerMike Pall <mike>2011-06-02 01:46:23 +0200
commitfff2fb31f9c453e38643787b76f41cfc35141c06 (patch)
tree1575854a0cf3d6633e1a66720d64208413d1cd54
parenta770bf3741bbd9ae79a1395bc2faf23f8dd2221a (diff)
downloadluajit-fff2fb31f9c453e38643787b76f41cfc35141c06.tar.gz
luajit-fff2fb31f9c453e38643787b76f41cfc35141c06.tar.bz2
luajit-fff2fb31f9c453e38643787b76f41cfc35141c06.zip
ARM: Don't generate unaligned XLOADs.
-rw-r--r--src/lj_opt_fold.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index f2980e6f..0fc73683 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -1679,7 +1679,7 @@ static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p)
1679 1679
1680/* Turn: string.sub(str, a, b) == kstr 1680/* Turn: string.sub(str, a, b) == kstr
1681** into: string.byte(str, a) == string.byte(kstr, 1) etc. 1681** into: string.byte(str, a) == string.byte(kstr, 1) etc.
1682** Note: this creates unaligned XLOADs! 1682** Note: this creates unaligned XLOADs on x86/x64.
1683*/ 1683*/
1684LJFOLD(EQ SNEW KGC) 1684LJFOLD(EQ SNEW KGC)
1685LJFOLD(NE SNEW KGC) 1685LJFOLD(NE SNEW KGC)
@@ -1688,7 +1688,16 @@ LJFOLDF(merge_eqne_snew_kgc)
1688 GCstr *kstr = ir_kstr(fright); 1688 GCstr *kstr = ir_kstr(fright);
1689 int32_t len = (int32_t)kstr->len; 1689 int32_t len = (int32_t)kstr->len;
1690 lua_assert(irt_isstr(fins->t)); 1690 lua_assert(irt_isstr(fins->t));
1691 if (len <= 4) { /* Handle string lengths 0, 1, 2, 3, 4. */ 1691
1692#if LJ_TARGET_X86ORX64
1693#define FOLD_SNEW_MAX_LEN 4 /* Handle string lengths 0, 1, 2, 3, 4. */
1694#define FOLD_SNEW_TYPE8 IRT_I8 /* Creates shorter immediates. */
1695#else
1696#define FOLD_SNEW_MAX_LEN 1 /* Handle string lengths 0 or 1. */
1697#define FOLD_SNEW_TYPE8 IRT_U8 /* Prefer unsigned loads. */
1698#endif
1699
1700 if (len <= FOLD_SNEW_MAX_LEN) {
1692 IROp op = (IROp)fins->o; 1701 IROp op = (IROp)fins->o;
1693 IRRef strref = fleft->op1; 1702 IRRef strref = fleft->op1;
1694 lua_assert(IR(strref)->o == IR_STRREF); 1703 lua_assert(IR(strref)->o == IR_STRREF);
@@ -1704,7 +1713,7 @@ LJFOLDF(merge_eqne_snew_kgc)
1704 } 1713 }
1705 if (len > 0) { 1714 if (len > 0) {
1706 /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */ 1715 /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */
1707 uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, IRT_I8) : 1716 uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, FOLD_SNEW_TYPE8) :
1708 len == 2 ? IRT(IR_XLOAD, IRT_U16) : 1717 len == 2 ? IRT(IR_XLOAD, IRT_U16) :
1709 IRTI(IR_XLOAD)); 1718 IRTI(IR_XLOAD));
1710 TRef tmp = emitir(ot, strref, 1719 TRef tmp = emitir(ot, strref,