aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-02 22:21:10 +0100
committerMike Pall <mike>2011-01-02 22:21:10 +0100
commitb2c74c52cc9e850d53f2f7b06ffe2b096884f77a (patch)
treee700b5dd894ca8fcb2d91d5350445dde2771a874 /src
parent331b14873731a4377b7487a247a33dfc6fba1f0b (diff)
downloadluajit-b2c74c52cc9e850d53f2f7b06ffe2b096884f77a.tar.gz
luajit-b2c74c52cc9e850d53f2f7b06ffe2b096884f77a.tar.bz2
luajit-b2c74c52cc9e850d53f2f7b06ffe2b096884f77a.zip
FFI: Add support for cdata constants to IR.
Diffstat (limited to 'src')
-rw-r--r--src/lj_opt_fold.c65
-rw-r--r--src/lj_record.c5
2 files changed, 57 insertions, 13 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index e05d6b7b..04dd713d 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -439,6 +439,34 @@ LJFOLDF(kfold_strcmp)
439 return NEXTFOLD; 439 return NEXTFOLD;
440} 440}
441 441
442/* -- Constant folding of pointer arithmetic ------------------------------ */
443
444LJFOLD(ADD KGC KINT)
445LJFOLD(ADD KGC KINT64)
446LJFOLDF(kfold_add_kgc)
447{
448 GCobj *o = ir_kgc(fleft);
449#if LJ_64
450 ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;
451#else
452 ptrdiff_t ofs = fright->i;
453#endif
454 return lj_ir_kptr(J, (char *)o + ofs);
455}
456
457LJFOLD(ADD KPTR KINT)
458LJFOLD(ADD KPTR KINT64)
459LJFOLDF(kfold_add_kptr)
460{
461 void *p = ir_kptr(fleft);
462#if LJ_64
463 ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;
464#else
465 ptrdiff_t ofs = fright->i;
466#endif
467 return lj_ir_kptr(J, (char *)p + ofs);
468}
469
442/* -- Constant folding of conversions ------------------------------------- */ 470/* -- Constant folding of conversions ------------------------------------- */
443 471
444LJFOLD(TOBIT KNUM KNUM) 472LJFOLD(TOBIT KNUM KNUM)
@@ -1462,18 +1490,23 @@ LJFOLDF(comm_bxor)
1462 1490
1463/* -- Simplification of compound expressions ------------------------------ */ 1491/* -- Simplification of compound expressions ------------------------------ */
1464 1492
1465static int32_t kfold_xload(IRIns *ir, const void *p) 1493static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p)
1466{ 1494{
1495 int32_t k;
1467#if !LJ_TARGET_X86ORX64 1496#if !LJ_TARGET_X86ORX64
1468#error "Missing support for unaligned loads" 1497#error "Missing support for unaligned loads"
1469#endif 1498#endif
1470 switch (irt_type(ir->t)) { 1499 switch (irt_type(ir->t)) {
1471 case IRT_I8: return (int32_t)*(int8_t *)p; 1500 case IRT_NUM: return lj_ir_knum_u64(J, *(uint64_t *)p);
1472 case IRT_U8: return (int32_t)*(uint8_t *)p; 1501 case IRT_I8: k = (int32_t)*(int8_t *)p; break;
1473 case IRT_I16: return (int32_t)*(int16_t *)p; 1502 case IRT_U8: k = (int32_t)*(uint8_t *)p; break;
1474 case IRT_U16: return (int32_t)*(uint16_t *)p; 1503 case IRT_I16: k = (int32_t)*(int16_t *)p; break;
1475 default: lua_assert(irt_isint(ir->t)); return (int32_t)*(int32_t *)p; 1504 case IRT_U16: k = (int32_t)*(uint16_t *)p; break;
1505 case IRT_INT: case IRT_U32: k = *(int32_t *)p; break;
1506 case IRT_I64: case IRT_U64: return lj_ir_kint64(J, *(uint64_t *)p);
1507 default: return 0;
1476 } 1508 }
1509 return lj_ir_kint(J, k);
1477} 1510}
1478 1511
1479/* Turn: string.sub(str, a, b) == kstr 1512/* Turn: string.sub(str, a, b) == kstr
@@ -1508,7 +1541,7 @@ LJFOLDF(merge_eqne_snew_kgc)
1508 IRTI(IR_XLOAD)); 1541 IRTI(IR_XLOAD));
1509 TRef tmp = emitir(ot, strref, 1542 TRef tmp = emitir(ot, strref,
1510 IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0)); 1543 IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0));
1511 TRef val = lj_ir_kint(J, kfold_xload(IR(tref_ref(tmp)), strdata(kstr))); 1544 TRef val = kfold_xload(J, IR(tref_ref(tmp)), strdata(kstr));
1512 if (len == 3) 1545 if (len == 3)
1513 tmp = emitir(IRTI(IR_BAND), tmp, 1546 tmp = emitir(IRTI(IR_BAND), tmp,
1514 lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00))); 1547 lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00)));
@@ -1672,9 +1705,17 @@ LJFOLDF(fload_str_len_snew)
1672} 1705}
1673 1706
1674/* The C type ID of cdata objects is immutable. */ 1707/* The C type ID of cdata objects is immutable. */
1708LJFOLD(FLOAD KGC IRFL_CDATA_TYPEID)
1709LJFOLDF(fload_cdata_typeid_kgc)
1710{
1711 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1712 return INTFOLD((int32_t)ir_kcdata(fleft)->typeid);
1713 return NEXTFOLD;
1714}
1715
1675LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) 1716LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID)
1676LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID) 1717LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID)
1677LJFOLDF(fload_cdata_typeid_cnewi) 1718LJFOLDF(fload_cdata_typeid_cnew)
1678{ 1719{
1679 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1720 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1680 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWP op1 is const. */ 1721 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWP op1 is const. */
@@ -1683,7 +1724,7 @@ LJFOLDF(fload_cdata_typeid_cnewi)
1683 1724
1684/* Pointer cdata objects are immutable. */ 1725/* Pointer cdata objects are immutable. */
1685LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR) 1726LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR)
1686LJFOLDF(fload_cdata_ptr_cnewi) 1727LJFOLDF(fload_cdata_ptr_cnew)
1687{ 1728{
1688 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1729 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1689 return fleft->op2; /* Fold even across PHI to avoid allocations. */ 1730 return fleft->op2; /* Fold even across PHI to avoid allocations. */
@@ -1716,10 +1757,8 @@ LJFOLDF(fwd_sload)
1716LJFOLD(XLOAD KPTR any) 1757LJFOLD(XLOAD KPTR any)
1717LJFOLDF(xload_kptr) 1758LJFOLDF(xload_kptr)
1718{ 1759{
1719 /* Only fold read-only integer loads for now. */ 1760 TRef tr = kfold_xload(J, fins, ir_kptr(fleft));
1720 if ((fins->op2 & IRXLOAD_READONLY) && irt_isinteger(fins->t)) 1761 return tr ? tr : NEXTFOLD;
1721 return INTFOLD(kfold_xload(fins, ir_kptr(fleft)));
1722 return NEXTFOLD;
1723} 1762}
1724 1763
1725LJFOLD(XLOAD any any) 1764LJFOLD(XLOAD any any)
diff --git a/src/lj_record.c b/src/lj_record.c
index ec03afe1..2aaded14 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1563,6 +1563,11 @@ void lj_record_ins(jit_State *J)
1563 J->base[ra++] = TREF_NIL; 1563 J->base[ra++] = TREF_NIL;
1564 if (rc >= J->maxslot) J->maxslot = rc+1; 1564 if (rc >= J->maxslot) J->maxslot = rc+1;
1565 break; 1565 break;
1566#if LJ_HASFFI
1567 case BC_KCDATA:
1568 rc = lj_ir_kgc(J, proto_kgc(J->pt, ~(ptrdiff_t)rc), IRT_CDATA);
1569 break;
1570#endif
1566 1571
1567 /* -- Upvalue and function ops ------------------------------------------ */ 1572 /* -- Upvalue and function ops ------------------------------------------ */
1568 1573