diff options
author | Mike Pall <mike> | 2011-03-10 01:41:58 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-03-10 01:41:58 +0100 |
commit | 3f26e3a89d54dfb761ca02fc89aaf15326f5f514 (patch) | |
tree | dd795b23fd364f9ccee1d70c120eed74c5f95026 /src/lj_opt_fold.c | |
parent | 1c9981ae4c9618c046756333fcc6d33c9492f2ae (diff) | |
download | luajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.tar.gz luajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.tar.bz2 luajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.zip |
FFI: Fix and optimize recording of cdata[cdata].
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 495b784d..471a4b29 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -897,6 +897,16 @@ LJFOLDF(simplify_conv_i64_num) | |||
897 | return NEXTFOLD; | 897 | return NEXTFOLD; |
898 | } | 898 | } |
899 | 899 | ||
900 | LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT */ | ||
901 | LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT */ | ||
902 | LJFOLDF(simplify_conv_int_i64) | ||
903 | { | ||
904 | PHIBARRIER(fleft); | ||
905 | if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) | ||
906 | return fleft->op1; | ||
907 | return NEXTFOLD; | ||
908 | } | ||
909 | |||
900 | /* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ | 910 | /* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ |
901 | LJFOLD(TOBIT CONV KNUM) | 911 | LJFOLD(TOBIT CONV KNUM) |
902 | LJFOLDF(simplify_tobit_conv) | 912 | LJFOLDF(simplify_tobit_conv) |
@@ -956,6 +966,26 @@ LJFOLDF(simplify_conv_sext) | |||
956 | return NEXTFOLD; | 966 | return NEXTFOLD; |
957 | } | 967 | } |
958 | 968 | ||
969 | /* Strength reduction of narrowing. */ | ||
970 | LJFOLD(CONV ADD IRCONV_INT_I64) | ||
971 | LJFOLD(CONV SUB IRCONV_INT_I64) | ||
972 | LJFOLD(CONV MUL IRCONV_INT_I64) | ||
973 | LJFOLD(CONV ADD IRCONV_INT_U64) | ||
974 | LJFOLD(CONV SUB IRCONV_INT_U64) | ||
975 | LJFOLD(CONV MUL IRCONV_INT_U64) | ||
976 | LJFOLDF(simplify_conv_narrow) | ||
977 | { | ||
978 | IROp op = (IROp)fleft->o; | ||
979 | IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2; | ||
980 | PHIBARRIER(fleft); | ||
981 | op1 = emitir(IRTI(IR_CONV), op1, mode); | ||
982 | op2 = emitir(IRTI(IR_CONV), op2, mode); | ||
983 | fins->ot = IRTI(op); | ||
984 | fins->op1 = op1; | ||
985 | fins->op2 = op2; | ||
986 | return RETRYFOLD; | ||
987 | } | ||
988 | |||
959 | /* Special CSE rule for CONV. */ | 989 | /* Special CSE rule for CONV. */ |
960 | LJFOLD(CONV any any) | 990 | LJFOLD(CONV any any) |
961 | LJFOLDF(cse_conv) | 991 | LJFOLDF(cse_conv) |