aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-03-10 01:41:58 +0100
committerMike Pall <mike>2011-03-10 01:41:58 +0100
commit3f26e3a89d54dfb761ca02fc89aaf15326f5f514 (patch)
treedd795b23fd364f9ccee1d70c120eed74c5f95026 /src
parent1c9981ae4c9618c046756333fcc6d33c9492f2ae (diff)
downloadluajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.tar.gz
luajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.tar.bz2
luajit-3f26e3a89d54dfb761ca02fc89aaf15326f5f514.zip
FFI: Fix and optimize recording of cdata[cdata].
Diffstat (limited to 'src')
-rw-r--r--src/lj_crecord.c15
-rw-r--r--src/lj_opt_fold.c30
2 files changed, 41 insertions, 4 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index d689b81b..c93cece3 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -503,10 +503,17 @@ void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)
503 IRType t; 503 IRType t;
504 if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk); 504 if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk);
505 if (ctype_isinteger(ctk->info) && (t = crec_ct2irt(ctk)) != IRT_CDATA) { 505 if (ctype_isinteger(ctk->info) && (t = crec_ct2irt(ctk)) != IRT_CDATA) {
506 idx = emitir(IRT(IR_ADD, IRT_PTR), idx, lj_ir_kintp(J, sizeof(GCcdata))); 506 if (ctk->size == 8) {
507 idx = emitir(IRT(IR_XLOAD, t), idx, 0); 507 idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64);
508 if (!LJ_64 && (t == IRT_I64 || t == IRT_U64)) { 508 } else {
509 idx = emitconv(idx, IRT_INT, t, 0); 509 idx = emitir(IRT(IR_ADD, IRT_PTR), idx,
510 lj_ir_kintp(J, sizeof(GCcdata)));
511 idx = emitir(IRT(IR_XLOAD, t), idx, 0);
512 }
513 if (LJ_64 && ctk->size < sizeof(intptr_t) && !(ctk->info & CTF_UNSIGNED))
514 idx = emitconv(idx, IRT_INTP, IRT_INT, IRCONV_SEXT);
515 if (!LJ_64 && ctk->size > sizeof(intptr_t)) {
516 idx = emitconv(idx, IRT_INTP, t, 0);
510 lj_needsplit(J); 517 lj_needsplit(J);
511 } 518 }
512 goto integer_key; 519 goto integer_key;
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
900LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT */
901LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT */
902LJFOLDF(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. */
901LJFOLD(TOBIT CONV KNUM) 911LJFOLD(TOBIT CONV KNUM)
902LJFOLDF(simplify_tobit_conv) 912LJFOLDF(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. */
970LJFOLD(CONV ADD IRCONV_INT_I64)
971LJFOLD(CONV SUB IRCONV_INT_I64)
972LJFOLD(CONV MUL IRCONV_INT_I64)
973LJFOLD(CONV ADD IRCONV_INT_U64)
974LJFOLD(CONV SUB IRCONV_INT_U64)
975LJFOLD(CONV MUL IRCONV_INT_U64)
976LJFOLDF(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. */
960LJFOLD(CONV any any) 990LJFOLD(CONV any any)
961LJFOLDF(cse_conv) 991LJFOLDF(cse_conv)