diff options
author | Mike Pall <mike> | 2011-01-02 22:21:10 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-01-02 22:21:10 +0100 |
commit | b2c74c52cc9e850d53f2f7b06ffe2b096884f77a (patch) | |
tree | e700b5dd894ca8fcb2d91d5350445dde2771a874 /src | |
parent | 331b14873731a4377b7487a247a33dfc6fba1f0b (diff) | |
download | luajit-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.c | 65 | ||||
-rw-r--r-- | src/lj_record.c | 5 |
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 | |||
444 | LJFOLD(ADD KGC KINT) | ||
445 | LJFOLD(ADD KGC KINT64) | ||
446 | LJFOLDF(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 | |||
457 | LJFOLD(ADD KPTR KINT) | ||
458 | LJFOLD(ADD KPTR KINT64) | ||
459 | LJFOLDF(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 | ||
444 | LJFOLD(TOBIT KNUM KNUM) | 472 | LJFOLD(TOBIT KNUM KNUM) |
@@ -1462,18 +1490,23 @@ LJFOLDF(comm_bxor) | |||
1462 | 1490 | ||
1463 | /* -- Simplification of compound expressions ------------------------------ */ | 1491 | /* -- Simplification of compound expressions ------------------------------ */ |
1464 | 1492 | ||
1465 | static int32_t kfold_xload(IRIns *ir, const void *p) | 1493 | static 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. */ |
1708 | LJFOLD(FLOAD KGC IRFL_CDATA_TYPEID) | ||
1709 | LJFOLDF(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 | |||
1675 | LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) | 1716 | LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) |
1676 | LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID) | 1717 | LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID) |
1677 | LJFOLDF(fload_cdata_typeid_cnewi) | 1718 | LJFOLDF(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. */ |
1685 | LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR) | 1726 | LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR) |
1686 | LJFOLDF(fload_cdata_ptr_cnewi) | 1727 | LJFOLDF(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) | |||
1716 | LJFOLD(XLOAD KPTR any) | 1757 | LJFOLD(XLOAD KPTR any) |
1717 | LJFOLDF(xload_kptr) | 1758 | LJFOLDF(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 | ||
1725 | LJFOLD(XLOAD any any) | 1764 | LJFOLD(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 | ||