diff options
author | Mike Pall <mike> | 2013-01-21 16:49:03 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-01-21 16:49:03 +0100 |
commit | 1651684417e3839d757f034fefea55fba7494ab2 (patch) | |
tree | 750739a92d0414c7cb46542b60cce105f3c5f8e5 | |
parent | 89e4650baef2f67b12b2a7d9c91a8809f552568a (diff) | |
download | luajit-1651684417e3839d757f034fefea55fba7494ab2.tar.gz luajit-1651684417e3839d757f034fefea55fba7494ab2.tar.bz2 luajit-1651684417e3839d757f034fefea55fba7494ab2.zip |
Add missing FOLD rules for U32 conversions.
-rw-r--r-- | src/lj_opt_fold.c | 45 |
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 | ||
940 | LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ | 940 | LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ |
941 | LJFOLDF(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 | |||
949 | LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ | 941 | LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ |
950 | LJFOLDF(simplify_conv_u32_num) | 942 | LJFOLDF(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 | ||
958 | LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32*/ | 951 | LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32 */ |
959 | LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32*/ | 952 | LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32 */ |
960 | LJFOLDF(simplify_conv_i64_num) | 953 | LJFOLDF(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 | ||
981 | LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT */ | 974 | LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */ |
982 | LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT */ | 975 | LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */ |
976 | LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */ | ||
977 | LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */ | ||
983 | LJFOLDF(simplify_conv_int_i64) | 978 | LJFOLDF(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) | |||
1064 | LJFOLD(CONV ADD IRCONV_INT_U64) | 1068 | LJFOLD(CONV ADD IRCONV_INT_U64) |
1065 | LJFOLD(CONV SUB IRCONV_INT_U64) | 1069 | LJFOLD(CONV SUB IRCONV_INT_U64) |
1066 | LJFOLD(CONV MUL IRCONV_INT_U64) | 1070 | LJFOLD(CONV MUL IRCONV_INT_U64) |
1071 | LJFOLD(CONV ADD IRCONV_U32_I64) | ||
1072 | LJFOLD(CONV SUB IRCONV_U32_I64) | ||
1073 | LJFOLD(CONV MUL IRCONV_U32_I64) | ||
1074 | LJFOLD(CONV ADD IRCONV_U32_U64) | ||
1075 | LJFOLD(CONV SUB IRCONV_U32_U64) | ||
1076 | LJFOLD(CONV MUL IRCONV_U32_U64) | ||
1067 | LJFOLDF(simplify_conv_narrow) | 1077 | LJFOLDF(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; |