diff options
| author | Mike Pall <mike> | 2012-06-04 15:39:16 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2012-06-04 15:39:16 +0200 |
| commit | 5032e6d87f2873d3c4712bbbdc3438d6404499a9 (patch) | |
| tree | aedb0e1aecea9e24b2e0b5445f03473b20dbe7a7 | |
| parent | 5bd133d6c89fb9ef5c501eb27d2d6221ec44d11d (diff) | |
| download | luajit-5032e6d87f2873d3c4712bbbdc3438d6404499a9.tar.gz luajit-5032e6d87f2873d3c4712bbbdc3438d6404499a9.tar.bz2 luajit-5032e6d87f2873d3c4712bbbdc3438d6404499a9.zip | |
FFI: Use CNEWI/FLOAD to box/access ffi.new("int", x) (for varargs).
| -rw-r--r-- | src/lj_crecord.c | 37 | ||||
| -rw-r--r-- | src/lj_ir.h | 1 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 4 |
3 files changed, 23 insertions, 19 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 268800e4..8859c3ee 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
| @@ -413,34 +413,32 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval) | |||
| 413 | sid = CTID_A_CCHAR; | 413 | sid = CTID_A_CCHAR; |
| 414 | } | 414 | } |
| 415 | } else { /* NYI: tref_istab(sp), tref_islightud(sp). */ | 415 | } else { /* NYI: tref_istab(sp), tref_islightud(sp). */ |
| 416 | IRType t; | ||
| 416 | sid = argv2cdata(J, sp, sval)->typeid; | 417 | sid = argv2cdata(J, sp, sval)->typeid; |
| 417 | s = ctype_raw(cts, sid); | 418 | s = ctype_raw(cts, sid); |
| 418 | svisnz = cdataptr(cdataV(sval)); | 419 | svisnz = cdataptr(cdataV(sval)); |
| 420 | if (ctype_isref(s->info)) { | ||
| 421 | svisnz = *(void **)svisnz; | ||
| 422 | s = ctype_rawchild(cts, s); | ||
| 423 | sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_CDATA_PTR); | ||
| 424 | } | ||
| 425 | if (ctype_isenum(s->info)) s = ctype_child(cts, s); | ||
| 426 | t = crec_ct2irt(s); | ||
| 419 | if (ctype_isptr(s->info)) { | 427 | if (ctype_isptr(s->info)) { |
| 420 | IRType t = (LJ_64 && s->size == 8) ? IRT_P64 : IRT_P32; | ||
| 421 | sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR); | 428 | sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR); |
| 422 | if (ctype_isref(s->info)) { | 429 | goto doconv; |
| 423 | svisnz = *(void **)svisnz; | ||
| 424 | s = ctype_rawchild(cts, s); | ||
| 425 | } else { | ||
| 426 | goto doconv; /* The pointer value was loaded, don't load number. */ | ||
| 427 | } | ||
| 428 | } else if (ctype_isinteger(s->info) && s->size == 8) { | 430 | } else if (ctype_isinteger(s->info) && s->size == 8) { |
| 429 | IRType t = (s->info & CTF_UNSIGNED) ? IRT_U64 : IRT_I64; | ||
| 430 | sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64); | 431 | sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64); |
| 431 | lj_needsplit(J); | 432 | lj_needsplit(J); |
| 432 | goto doconv; | 433 | goto doconv; |
| 434 | } else if (ctype_isinteger(s->info) && s->size == 4) { | ||
| 435 | sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT); | ||
| 436 | goto doconv; | ||
| 433 | } else { | 437 | } else { |
| 434 | sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); | 438 | sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); |
| 435 | } | 439 | } |
| 436 | if (ctype_isenum(s->info)) s = ctype_child(cts, s); | 440 | if (ctype_isnum(s->info) && t != IRT_CDATA) |
| 437 | if (ctype_isnum(s->info)) { /* Load number value. */ | 441 | sp = emitir(IRT(IR_XLOAD, t), sp, 0); /* Load number value. */ |
| 438 | IRType t = crec_ct2irt(s); | ||
| 439 | if (t != IRT_CDATA) { | ||
| 440 | sp = emitir(IRT(IR_XLOAD, t), sp, 0); | ||
| 441 | if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J); | ||
| 442 | } | ||
| 443 | } | ||
| 444 | goto doconv; | 442 | goto doconv; |
| 445 | } | 443 | } |
| 446 | s = ctype_get(cts, sid); | 444 | s = ctype_get(cts, sid); |
| @@ -559,6 +557,8 @@ again: | |||
| 559 | ctype_isinteger(ctk->info) && (t = crec_ct2irt(ctk)) != IRT_CDATA) { | 557 | ctype_isinteger(ctk->info) && (t = crec_ct2irt(ctk)) != IRT_CDATA) { |
| 560 | if (ctk->size == 8) { | 558 | if (ctk->size == 8) { |
| 561 | idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64); | 559 | idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64); |
| 560 | } else if (ctk->size == 4) { | ||
| 561 | idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT); | ||
| 562 | } else { | 562 | } else { |
| 563 | idx = emitir(IRT(IR_ADD, IRT_PTR), idx, | 563 | idx = emitir(IRT(IR_ADD, IRT_PTR), idx, |
| 564 | lj_ir_kintp(J, sizeof(GCcdata))); | 564 | lj_ir_kintp(J, sizeof(GCcdata))); |
| @@ -654,10 +654,11 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) | |||
| 654 | if (sz == 0 || sz > 64 || (info & CTF_VLA) || ctype_align(info) > CT_MEMALIGN) | 654 | if (sz == 0 || sz > 64 || (info & CTF_VLA) || ctype_align(info) > CT_MEMALIGN) |
| 655 | lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: large/special allocations. */ | 655 | lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: large/special allocations. */ |
| 656 | trid = lj_ir_kint(J, id); | 656 | trid = lj_ir_kint(J, id); |
| 657 | /* Use special instruction to box pointer or 64 bit integer. */ | 657 | /* Use special instruction to box pointer or 32/64 bit integer. */ |
| 658 | if (ctype_isptr(info) || (ctype_isinteger(info) && sz == 8)) { | 658 | if (ctype_isptr(info) || (ctype_isinteger(info) && (sz == 4 || sz == 8))) { |
| 659 | TRef sp = J->base[1] ? crec_ct_tv(J, d, 0, J->base[1], &rd->argv[1]) : | 659 | TRef sp = J->base[1] ? crec_ct_tv(J, d, 0, J->base[1], &rd->argv[1]) : |
| 660 | ctype_isptr(info) ? lj_ir_kptr(J, NULL) : | 660 | ctype_isptr(info) ? lj_ir_kptr(J, NULL) : |
| 661 | sz == 4 ? lj_ir_kint(J, 0) : | ||
| 661 | (lj_needsplit(J), lj_ir_kint64(J, 0)); | 662 | (lj_needsplit(J), lj_ir_kint64(J, 0)); |
| 662 | J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, sp); | 663 | J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, sp); |
| 663 | } else { | 664 | } else { |
diff --git a/src/lj_ir.h b/src/lj_ir.h index 99ad8d9c..a8f48ffb 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
| @@ -195,6 +195,7 @@ IRFPMDEF(FPMENUM) | |||
| 195 | _(UDATA_FILE, sizeof(GCudata)) \ | 195 | _(UDATA_FILE, sizeof(GCudata)) \ |
| 196 | _(CDATA_TYPEID, offsetof(GCcdata, typeid)) \ | 196 | _(CDATA_TYPEID, offsetof(GCcdata, typeid)) \ |
| 197 | _(CDATA_PTR, sizeof(GCcdata)) \ | 197 | _(CDATA_PTR, sizeof(GCcdata)) \ |
| 198 | _(CDATA_INT, sizeof(GCcdata)) \ | ||
| 198 | _(CDATA_INT64, sizeof(GCcdata)) \ | 199 | _(CDATA_INT64, sizeof(GCcdata)) \ |
| 199 | _(CDATA_INT64_4, sizeof(GCcdata) + 4) | 200 | _(CDATA_INT64_4, sizeof(GCcdata) + 4) |
| 200 | 201 | ||
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 9b0307fb..41d1ff8a 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -1968,8 +1968,9 @@ LJFOLDF(fload_cdata_typeid_cnew) | |||
| 1968 | return NEXTFOLD; | 1968 | return NEXTFOLD; |
| 1969 | } | 1969 | } |
| 1970 | 1970 | ||
| 1971 | /* Pointer and int64 cdata objects are immutable. */ | 1971 | /* Pointer, int and int64 cdata objects are immutable. */ |
| 1972 | LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR) | 1972 | LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR) |
| 1973 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INT) | ||
| 1973 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64) | 1974 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64) |
| 1974 | LJFOLDF(fload_cdata_ptr_int64_cnew) | 1975 | LJFOLDF(fload_cdata_ptr_int64_cnew) |
| 1975 | { | 1976 | { |
| @@ -1981,6 +1982,7 @@ LJFOLDF(fload_cdata_ptr_int64_cnew) | |||
| 1981 | LJFOLD(FLOAD any IRFL_STR_LEN) | 1982 | LJFOLD(FLOAD any IRFL_STR_LEN) |
| 1982 | LJFOLD(FLOAD any IRFL_CDATA_TYPEID) | 1983 | LJFOLD(FLOAD any IRFL_CDATA_TYPEID) |
| 1983 | LJFOLD(FLOAD any IRFL_CDATA_PTR) | 1984 | LJFOLD(FLOAD any IRFL_CDATA_PTR) |
| 1985 | LJFOLD(FLOAD any IRFL_CDATA_INT) | ||
| 1984 | LJFOLD(FLOAD any IRFL_CDATA_INT64) | 1986 | LJFOLD(FLOAD any IRFL_CDATA_INT64) |
| 1985 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ | 1987 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ |
| 1986 | LJFOLDX(lj_opt_cse) | 1988 | LJFOLDX(lj_opt_cse) |
