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 | ||
