aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-03 03:35:35 +0100
committerMike Pall <mike>2011-01-03 03:35:35 +0100
commiteaf88dfb3a30c88b262e1705fdc343c7e861a003 (patch)
tree83ca7252ced8ccb5721e2f8e18d01dce24fd6670 /src
parent44a22b9889b7366f0313f4f98b64bc142f2d2fed (diff)
downloadluajit-eaf88dfb3a30c88b262e1705fdc343c7e861a003.tar.gz
luajit-eaf88dfb3a30c88b262e1705fdc343c7e861a003.tar.bz2
luajit-eaf88dfb3a30c88b262e1705fdc343c7e861a003.zip
FFI: Record 64 bit integer arithmetic.
Currently NYI in the x86 backend.
Diffstat (limited to 'src')
-rw-r--r--src/lj_cdata.c6
-rw-r--r--src/lj_crecord.c35
-rw-r--r--src/lj_ir.h7
3 files changed, 40 insertions, 8 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index 71453e27..7c7eed43 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -235,7 +235,6 @@ void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o, CTInfo qual)
235uint64_t lj_cdata_powi64(uint64_t x, uint64_t k, int isunsigned) 235uint64_t lj_cdata_powi64(uint64_t x, uint64_t k, int isunsigned)
236{ 236{
237 uint64_t y = 0; 237 uint64_t y = 0;
238 int sign = 0;
239 if (k == 0) 238 if (k == 0)
240 return 1; 239 return 1;
241 if (!isunsigned) { 240 if (!isunsigned) {
@@ -249,10 +248,6 @@ uint64_t lj_cdata_powi64(uint64_t x, uint64_t k, int isunsigned)
249 else 248 else
250 return 0; 249 return 0;
251 } 250 }
252 if ((int64_t)x < 0) {
253 x = -x;
254 sign = (k & 1);
255 }
256 } 251 }
257 for (; (k & 1) == 0; k >>= 1) x *= x; 252 for (; (k & 1) == 0; k >>= 1) x *= x;
258 y = x; 253 y = x;
@@ -265,7 +260,6 @@ uint64_t lj_cdata_powi64(uint64_t x, uint64_t k, int isunsigned)
265 } 260 }
266 y *= x; 261 y *= x;
267 } 262 }
268 if (sign) y = (uint64_t)-(int64_t)y;
269 return y; 263 return y;
270} 264}
271 265
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 81d53dfc..a02f1c4d 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -564,8 +564,39 @@ void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd)
564 564
565static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm) 565static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm)
566{ 566{
567 UNUSED(J); UNUSED(sp); UNUSED(s); UNUSED(mm); 567 if (ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) {
568 return 0; /* NYI: 64 bit integer arithmetic. */ 568 IRType dt;
569 CTypeID id;
570 TRef tr, dp, ptr;
571 MSize i;
572 if (((s[0]->info & CTF_UNSIGNED) && s[0]->size == 8) ||
573 ((s[1]->info & CTF_UNSIGNED) && s[1]->size == 8)) {
574 dt = IRT_U64; id = CTID_UINT64;
575 } else {
576 dt = IRT_I64; id = CTID_INT64;
577 }
578 for (i = 0; i < 2; i++) {
579 IRType st = tref_type(sp[i]);
580 if (st == IRT_NUM || st == IRT_FLOAT)
581 sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY);
582 else if (!(st == IRT_I64 || st == IRT_U64))
583 sp[i] = emitconv(sp[i], dt, IRT_INT,
584 ((st - IRT_I8) & 1) ? 0 : IRCONV_SEXT);
585 }
586 if (mm == MM_pow) {
587 tr = lj_ir_call(J, IRCALL_lj_cdata_powi64, sp[0], sp[1],
588 lj_ir_kint(J, (int)dt-(int)IRT_I64));
589 } else {
590 if (mm == MM_div || mm == MM_mod)
591 return 0; /* NYI: integer div, mod. */
592 tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, dt), sp[0], sp[1]);
593 }
594 dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, id), TREF_NIL);
595 ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)));
596 emitir(IRT(IR_XSTORE, dt), ptr, tr);
597 return dp;
598 }
599 return 0;
569} 600}
570 601
571static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm) 602static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm)
diff --git a/src/lj_ir.h b/src/lj_ir.h
index 7d1e6daf..a8e890c5 100644
--- a/src/lj_ir.h
+++ b/src/lj_ir.h
@@ -251,6 +251,12 @@ typedef struct CCallInfo {
251#define CCI_FASTCALL 0x0800 /* Fastcall convention. */ 251#define CCI_FASTCALL 0x0800 /* Fastcall convention. */
252 252
253/* Function definitions for CALL* instructions. */ 253/* Function definitions for CALL* instructions. */
254#if LJ_HASFFI
255#define IRCALLDEF_FFI(_) \
256 _(lj_cdata_powi64, 3, N, U64, CCI_NOFPRCLOBBER)
257#else
258#define IRCALLDEF_FFI(_)
259#endif
254#define IRCALLDEF(_) \ 260#define IRCALLDEF(_) \
255 _(lj_str_cmp, 2, FN, INT, CCI_NOFPRCLOBBER) \ 261 _(lj_str_cmp, 2, FN, INT, CCI_NOFPRCLOBBER) \
256 _(lj_str_new, 3, S, STR, CCI_L) \ 262 _(lj_str_new, 3, S, STR, CCI_L) \
@@ -265,6 +271,7 @@ typedef struct CCallInfo {
265 _(lj_gc_barrieruv, 2, FS, NIL, 0) \ 271 _(lj_gc_barrieruv, 2, FS, NIL, 0) \
266 _(lj_mem_newgco, 2, FS, P32, CCI_L) \ 272 _(lj_mem_newgco, 2, FS, P32, CCI_L) \
267 _(lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_NOFPRCLOBBER) \ 273 _(lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_NOFPRCLOBBER) \
274 IRCALLDEF_FFI(_) \
268 _(sinh, 1, N, NUM, 0) \ 275 _(sinh, 1, N, NUM, 0) \
269 _(cosh, 1, N, NUM, 0) \ 276 _(cosh, 1, N, NUM, 0) \
270 _(tanh, 1, N, NUM, 0) \ 277 _(tanh, 1, N, NUM, 0) \