diff options
author | Mike Pall <mike> | 2011-06-02 01:46:23 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-06-02 01:46:23 +0200 |
commit | fff2fb31f9c453e38643787b76f41cfc35141c06 (patch) | |
tree | 1575854a0cf3d6633e1a66720d64208413d1cd54 | |
parent | a770bf3741bbd9ae79a1395bc2faf23f8dd2221a (diff) | |
download | luajit-fff2fb31f9c453e38643787b76f41cfc35141c06.tar.gz luajit-fff2fb31f9c453e38643787b76f41cfc35141c06.tar.bz2 luajit-fff2fb31f9c453e38643787b76f41cfc35141c06.zip |
ARM: Don't generate unaligned XLOADs.
-rw-r--r-- | src/lj_opt_fold.c | 15 |
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 | */ |
1684 | LJFOLD(EQ SNEW KGC) | 1684 | LJFOLD(EQ SNEW KGC) |
1685 | LJFOLD(NE SNEW KGC) | 1685 | LJFOLD(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, |