diff options
author | Mike Pall <mike> | 2011-01-03 03:35:35 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-01-03 03:35:35 +0100 |
commit | eaf88dfb3a30c88b262e1705fdc343c7e861a003 (patch) | |
tree | 83ca7252ced8ccb5721e2f8e18d01dce24fd6670 /src | |
parent | 44a22b9889b7366f0313f4f98b64bc142f2d2fed (diff) | |
download | luajit-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.c | 6 | ||||
-rw-r--r-- | src/lj_crecord.c | 35 | ||||
-rw-r--r-- | src/lj_ir.h | 7 |
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) | |||
235 | uint64_t lj_cdata_powi64(uint64_t x, uint64_t k, int isunsigned) | 235 | uint64_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 | ||
565 | static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm) | 565 | static 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 | ||
571 | static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm) | 602 | static 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) \ |