summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-02 02:29:37 +0100
committerMike Pall <mike>2011-02-02 02:29:37 +0100
commitb613216efc7447dae645d8834e4d6f3185cd1bcc (patch)
tree0859fed377f00ebeada70ba45d02496b7fb4a249 /src/lj_opt_fold.c
parentc539c0cac8f668e66a5ce9e5fd645cb45e3c5063 (diff)
downloadluajit-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.c25
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
541LJFOLD(CONV KNUM IRCONV_U32_NUM)
542LJFOLDF(kfold_conv_knum_u32_num)
543{
544 lua_assert((fins->op2 & IRCONV_TRUNC));
545 return INTFOLD((int32_t)(uint32_t)knumleft);
546}
547
541LJFOLD(CONV KNUM IRCONV_I64_NUM) 548LJFOLD(CONV KNUM IRCONV_I64_NUM)
542LJFOLDF(kfold_conv_knum_i64_num) 549LJFOLDF(kfold_conv_knum_i64_num)
543{ 550{
@@ -805,6 +812,7 @@ LJFOLDF(simplify_conv_u32_num)
805} 812}
806 813
807LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/ 814LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/
815LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32*/
808LJFOLDF(simplify_conv_i64_num) 816LJFOLDF(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
829LJFOLD(CONV CONV IRCONV_U64_NUM) /* _U32*/
830LJFOLDF(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. */
847LJFOLD(TOBIT CONV KNUM) 838LJFOLD(TOBIT CONV KNUM)
848LJFOLDF(simplify_tobit_conv) 839LJFOLDF(simplify_tobit_conv)