aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-01-21 16:49:03 +0100
committerMike Pall <mike>2013-01-21 16:49:03 +0100
commit1651684417e3839d757f034fefea55fba7494ab2 (patch)
tree750739a92d0414c7cb46542b60cce105f3c5f8e5
parent89e4650baef2f67b12b2a7d9c91a8809f552568a (diff)
downloadluajit-1651684417e3839d757f034fefea55fba7494ab2.tar.gz
luajit-1651684417e3839d757f034fefea55fba7494ab2.tar.bz2
luajit-1651684417e3839d757f034fefea55fba7494ab2.zip
Add missing FOLD rules for U32 conversions.
-rw-r--r--src/lj_opt_fold.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 7561fb9c..c10f3c73 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -938,25 +938,18 @@ LJFOLDF(shortcut_conv_num_int)
938} 938}
939 939
940LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ 940LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */
941LJFOLDF(simplify_conv_int_num)
942{
943 /* Fold even across PHI to avoid expensive num->int conversions in loop. */
944 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT)
945 return fleft->op1;
946 return NEXTFOLD;
947}
948
949LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ 941LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/
950LJFOLDF(simplify_conv_u32_num) 942LJFOLDF(simplify_conv_int_num)
951{ 943{
952 /* Fold even across PHI to avoid expensive num->int conversions in loop. */ 944 /* Fold even across PHI to avoid expensive num->int conversions in loop. */
953 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) 945 if ((fleft->op2 & IRCONV_SRCMASK) ==
946 ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH))
954 return fleft->op1; 947 return fleft->op1;
955 return NEXTFOLD; 948 return NEXTFOLD;
956} 949}
957 950
958LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/ 951LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32 */
959LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32*/ 952LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32 */
960LJFOLDF(simplify_conv_i64_num) 953LJFOLDF(simplify_conv_i64_num)
961{ 954{
962 PHIBARRIER(fleft); 955 PHIBARRIER(fleft);
@@ -978,13 +971,24 @@ LJFOLDF(simplify_conv_i64_num)
978 return NEXTFOLD; 971 return NEXTFOLD;
979} 972}
980 973
981LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT */ 974LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */
982LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT */ 975LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */
976LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */
977LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */
983LJFOLDF(simplify_conv_int_i64) 978LJFOLDF(simplify_conv_int_i64)
984{ 979{
980 int src;
985 PHIBARRIER(fleft); 981 PHIBARRIER(fleft);
986 if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) 982 src = (fleft->op2 & IRCONV_SRCMASK);
987 return fleft->op1; 983 if (src == IRT_INT || src == IRT_U32) {
984 if (src == ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) {
985 return fleft->op1;
986 } else {
987 fins->op2 = ((fins->op2 & IRCONV_DSTMASK) | src);
988 fins->op1 = fleft->op1;
989 return RETRYFOLD;
990 }
991 }
988 return NEXTFOLD; 992 return NEXTFOLD;
989} 993}
990 994
@@ -1064,14 +1068,21 @@ LJFOLD(CONV MUL IRCONV_INT_I64)
1064LJFOLD(CONV ADD IRCONV_INT_U64) 1068LJFOLD(CONV ADD IRCONV_INT_U64)
1065LJFOLD(CONV SUB IRCONV_INT_U64) 1069LJFOLD(CONV SUB IRCONV_INT_U64)
1066LJFOLD(CONV MUL IRCONV_INT_U64) 1070LJFOLD(CONV MUL IRCONV_INT_U64)
1071LJFOLD(CONV ADD IRCONV_U32_I64)
1072LJFOLD(CONV SUB IRCONV_U32_I64)
1073LJFOLD(CONV MUL IRCONV_U32_I64)
1074LJFOLD(CONV ADD IRCONV_U32_U64)
1075LJFOLD(CONV SUB IRCONV_U32_U64)
1076LJFOLD(CONV MUL IRCONV_U32_U64)
1067LJFOLDF(simplify_conv_narrow) 1077LJFOLDF(simplify_conv_narrow)
1068{ 1078{
1069 IROp op = (IROp)fleft->o; 1079 IROp op = (IROp)fleft->o;
1080 IRType t = irt_type(fins->t);
1070 IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2; 1081 IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2;
1071 PHIBARRIER(fleft); 1082 PHIBARRIER(fleft);
1072 op1 = emitir(IRTI(IR_CONV), op1, mode); 1083 op1 = emitir(IRTI(IR_CONV), op1, mode);
1073 op2 = emitir(IRTI(IR_CONV), op2, mode); 1084 op2 = emitir(IRTI(IR_CONV), op2, mode);
1074 fins->ot = IRTI(op); 1085 fins->ot = IRT(op, t);
1075 fins->op1 = op1; 1086 fins->op1 = op1;
1076 fins->op2 = op2; 1087 fins->op2 = op2;
1077 return RETRYFOLD; 1088 return RETRYFOLD;