diff options
author | Mike Pall <mike> | 2011-02-02 02:29:37 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-02 02:29:37 +0100 |
commit | b613216efc7447dae645d8834e4d6f3185cd1bcc (patch) | |
tree | 0859fed377f00ebeada70ba45d02496b7fb4a249 /src/lj_opt_fold.c | |
parent | c539c0cac8f668e66a5ce9e5fd645cb45e3c5063 (diff) | |
download | luajit-b613216efc7447dae645d8834e4d6f3185cd1bcc.tar.gz luajit-b613216efc7447dae645d8834e4d6f3185cd1bcc.tar.bz2 luajit-b613216efc7447dae645d8834e4d6f3185cd1bcc.zip |
Add SPLIT pass to split 64 bit IR instructions for 32 bit CPUs.
Add generic HIOP instruction for extra backend functionality.
Add support for HIOP to x86 backend.
Use POWI for 64 bit integer x^k, too.
POWI is lowered to a call by SPLIT or the x64 backend.
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 2d08e187..03caf80d 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -538,6 +538,13 @@ LJFOLDF(kfold_conv_knum_int_num) | |||
538 | } | 538 | } |
539 | } | 539 | } |
540 | 540 | ||
541 | LJFOLD(CONV KNUM IRCONV_U32_NUM) | ||
542 | LJFOLDF(kfold_conv_knum_u32_num) | ||
543 | { | ||
544 | lua_assert((fins->op2 & IRCONV_TRUNC)); | ||
545 | return INTFOLD((int32_t)(uint32_t)knumleft); | ||
546 | } | ||
547 | |||
541 | LJFOLD(CONV KNUM IRCONV_I64_NUM) | 548 | LJFOLD(CONV KNUM IRCONV_I64_NUM) |
542 | LJFOLDF(kfold_conv_knum_i64_num) | 549 | LJFOLDF(kfold_conv_knum_i64_num) |
543 | { | 550 | { |
@@ -805,6 +812,7 @@ LJFOLDF(simplify_conv_u32_num) | |||
805 | } | 812 | } |
806 | 813 | ||
807 | LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/ | 814 | LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/ |
815 | LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32*/ | ||
808 | LJFOLDF(simplify_conv_i64_num) | 816 | LJFOLDF(simplify_conv_i64_num) |
809 | { | 817 | { |
810 | PHIBARRIER(fleft); | 818 | PHIBARRIER(fleft); |
@@ -826,23 +834,6 @@ LJFOLDF(simplify_conv_i64_num) | |||
826 | return NEXTFOLD; | 834 | return NEXTFOLD; |
827 | } | 835 | } |
828 | 836 | ||
829 | LJFOLD(CONV CONV IRCONV_U64_NUM) /* _U32*/ | ||
830 | LJFOLDF(simplify_conv_u64_num) | ||
831 | { | ||
832 | PHIBARRIER(fleft); | ||
833 | if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { | ||
834 | #if LJ_TARGET_X64 | ||
835 | return fleft->op1; | ||
836 | #else | ||
837 | /* Reduce to a zero-extension. */ | ||
838 | fins->op1 = fleft->op1; | ||
839 | fins->op2 = (IRT_U64<<5)|IRT_U32; | ||
840 | return RETRYFOLD; | ||
841 | #endif | ||
842 | } | ||
843 | return NEXTFOLD; | ||
844 | } | ||
845 | |||
846 | /* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ | 837 | /* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ |
847 | LJFOLD(TOBIT CONV KNUM) | 838 | LJFOLD(TOBIT CONV KNUM) |
848 | LJFOLDF(simplify_tobit_conv) | 839 | LJFOLDF(simplify_tobit_conv) |