aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-05 01:04:41 +0100
committerMike Pall <mike>2011-02-05 01:04:41 +0100
commit618b4516488a4fec332bb1ff29ece18821767917 (patch)
treeedae8c6674c2e1160cede448e1aadbbadfbaa307 /src
parent1abf5d4d26e83573d273e0f183f195cb2fd89bb6 (diff)
downloadluajit-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.c6
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 }