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 /src | |
| parent | 89e4650baef2f67b12b2a7d9c91a8809f552568a (diff) | |
| download | luajit-1651684417e3839d757f034fefea55fba7494ab2.tar.gz luajit-1651684417e3839d757f034fefea55fba7494ab2.tar.bz2 luajit-1651684417e3839d757f034fefea55fba7494ab2.zip | |
Add missing FOLD rules for U32 conversions.
Diffstat (limited to 'src')
| -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; |
