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 /src | |
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).
Diffstat (limited to 'src')
-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) |