diff options
author | Mike Pall <mike> | 2013-02-23 02:09:19 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-23 02:09:19 +0100 |
commit | 73ef845fcaf65937ad63e9cf6b681cb3e61f4504 (patch) | |
tree | 078cfae62c78ae9b9c0cfe5afe6000643ffc805d /src/lj_record.c | |
parent | b359ce804bb52585815fc52d7846202db4341acb (diff) | |
download | luajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.tar.gz luajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.tar.bz2 luajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.zip |
Add special bytecodes for builtins.
BC_ISTYPE, BC_ISNUM: fast type checks/coercions.
BC_TGETR, BC_TSETR: fast rawgeti/rawseti, no type checks for table/key.
Diffstat (limited to 'src/lj_record.c')
-rw-r--r-- | src/lj_record.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/lj_record.c b/src/lj_record.c index 7336e0ac..003910a9 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -1826,6 +1826,18 @@ void lj_record_ins(jit_State *J) | |||
1826 | J->maxslot = bc_a(pc[1]); /* Shrink used slots. */ | 1826 | J->maxslot = bc_a(pc[1]); /* Shrink used slots. */ |
1827 | break; | 1827 | break; |
1828 | 1828 | ||
1829 | case BC_ISTYPE: case BC_ISNUM: | ||
1830 | /* These coercions need to correspond with lj_meta_istype(). */ | ||
1831 | if (LJ_DUALNUM && rc == ~LJ_TNUMX+1) | ||
1832 | ra = lj_opt_narrow_toint(J, ra); | ||
1833 | else if (rc == ~LJ_TNUMX+2) | ||
1834 | ra = lj_ir_tonum(J, ra); | ||
1835 | else if (rc == ~LJ_TSTR+1) | ||
1836 | ra = lj_ir_tostr(J, ra); | ||
1837 | /* else: type specialization suffices. */ | ||
1838 | J->base[bc_a(ins)] = ra; | ||
1839 | break; | ||
1840 | |||
1829 | /* -- Unary ops --------------------------------------------------------- */ | 1841 | /* -- Unary ops --------------------------------------------------------- */ |
1830 | 1842 | ||
1831 | case BC_NOT: | 1843 | case BC_NOT: |
@@ -1937,6 +1949,10 @@ void lj_record_ins(jit_State *J) | |||
1937 | ix.idxchain = LJ_MAX_IDXCHAIN; | 1949 | ix.idxchain = LJ_MAX_IDXCHAIN; |
1938 | rc = lj_record_idx(J, &ix); | 1950 | rc = lj_record_idx(J, &ix); |
1939 | break; | 1951 | break; |
1952 | case BC_TGETR: case BC_TSETR: | ||
1953 | ix.idxchain = 0; | ||
1954 | rc = lj_record_idx(J, &ix); | ||
1955 | break; | ||
1940 | 1956 | ||
1941 | case BC_TNEW: | 1957 | case BC_TNEW: |
1942 | rc = rec_tnew(J, rc); | 1958 | rc = rec_tnew(J, rc); |