diff options
| author | Mike Pall <mike> | 2011-02-05 01:04:41 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-02-05 01:04:41 +0100 |
| commit | 618b4516488a4fec332bb1ff29ece18821767917 (patch) | |
| tree | edae8c6674c2e1160cede448e1aadbbadfbaa307 /src | |
| parent | 1abf5d4d26e83573d273e0f183f195cb2fd89bb6 (diff) | |
| download | luajit-618b4516488a4fec332bb1ff29ece18821767917.tar.gz luajit-618b4516488a4fec332bb1ff29ece18821767917.tar.bz2 luajit-618b4516488a4fec332bb1ff29ece18821767917.zip | |
FFI: Avoid intermediate boxes for tonumber(), too.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_crecord.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 1ba98ae8..1223eb8e 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
| @@ -855,6 +855,12 @@ void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | |||
| 855 | if (ctype_isref(s->info)) { | 855 | if (ctype_isref(s->info)) { |
| 856 | sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_CDATA_PTR); | 856 | sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_CDATA_PTR); |
| 857 | s = ctype_rawchild(cts, s); | 857 | s = ctype_rawchild(cts, s); |
| 858 | } else if (ctype_isnum(s->info) && s->size == 8) { | ||
| 859 | IRType t = (s->info & CTF_UNSIGNED) ? IRT_U64 : IRT_I64; | ||
| 860 | TRef tr = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64); | ||
| 861 | J->base[0] = emitconv(tr, IRT_NUM, t, 0); | ||
| 862 | lj_needsplit(J); | ||
| 863 | return; | ||
| 858 | } else { | 864 | } else { |
| 859 | sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); | 865 | sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); |
| 860 | } | 866 | } |
