summaryrefslogtreecommitdiff
path: root/src/lj_record.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-02-23 02:09:19 +0100
committerMike Pall <mike>2013-02-23 02:09:19 +0100
commit73ef845fcaf65937ad63e9cf6b681cb3e61f4504 (patch)
tree078cfae62c78ae9b9c0cfe5afe6000643ffc805d /src/lj_record.c
parentb359ce804bb52585815fc52d7846202db4341acb (diff)
downloadluajit-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.c16
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);