Skip to content

Instantly share code, notes, and snippets.

@MasterDuke17
Last active March 4, 2023 05:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MasterDuke17/7c8c1862d593a8ea09e84051c6d2f435 to your computer and use it in GitHub Desktop.
Save MasterDuke17/7c8c1862d593a8ea09e84051c6d2f435 to your computer and use it in GitHub Desktop.
diff --git lib/MAST/Ops.nqp lib/MAST/Ops.nqp
index 1adf3fc4a..8c4075191 100644
--- lib/MAST/Ops.nqp
+++ lib/MAST/Ops.nqp
@@ -478,369 +478,369 @@ BEGIN {
1156,
1157,
1160,
- 1163,
- 1166,
- 1169,
- 1172,
- 1175,
+ 1164,
+ 1167,
+ 1170,
+ 1173,
1176,
1177,
- 1179,
- 1181,
+ 1178,
+ 1180,
1182,
1183,
1184,
- 1188,
- 1190,
- 1195,
- 1197,
- 1199,
- 1203,
- 1206,
- 1209,
+ 1185,
+ 1189,
+ 1191,
+ 1196,
+ 1198,
+ 1200,
+ 1204,
+ 1207,
1210,
1211,
1212,
- 1214,
- 1217,
- 1220,
- 1223,
+ 1213,
+ 1215,
+ 1218,
+ 1221,
1224,
1225,
1226,
1227,
1228,
1229,
- 1232,
+ 1230,
1233,
1234,
1235,
- 1243,
+ 1236,
1244,
1245,
1246,
- 1248,
+ 1247,
1249,
- 1252,
+ 1250,
1253,
- 1255,
+ 1254,
1256,
- 1258,
- 1261,
- 1264,
- 1267,
- 1269,
- 1272,
- 1275,
- 1278,
- 1280,
+ 1257,
+ 1259,
+ 1262,
+ 1265,
+ 1268,
+ 1270,
+ 1273,
+ 1276,
+ 1279,
1281,
1282,
1283,
1284,
- 1292,
- 1294,
- 1296,
- 1298,
- 1302,
- 1304,
- 1307,
- 1309,
- 1314,
+ 1285,
+ 1293,
+ 1295,
+ 1297,
+ 1299,
+ 1303,
+ 1305,
+ 1308,
+ 1310,
1315,
- 1318,
- 1320,
- 1322,
- 1324,
+ 1316,
+ 1319,
+ 1321,
+ 1323,
1325,
1326,
- 1328,
- 1331,
- 1335,
- 1338,
- 1340,
- 1344,
+ 1327,
+ 1329,
+ 1332,
+ 1336,
+ 1339,
+ 1341,
1345,
- 1348,
- 1348,
- 1350,
- 1353,
- 1356,
- 1359,
- 1363,
- 1370,
- 1374,
+ 1346,
+ 1349,
+ 1349,
+ 1351,
+ 1354,
+ 1357,
+ 1360,
+ 1364,
+ 1371,
1375,
1376,
- 1378,
- 1378,
+ 1377,
+ 1379,
1379,
1380,
1381,
1382,
- 1384,
+ 1383,
1385,
- 1388,
+ 1386,
1389,
1390,
1391,
- 1393,
- 1397,
- 1399,
- 1401,
- 1407,
+ 1392,
+ 1394,
+ 1398,
+ 1400,
+ 1402,
1408,
- 1415,
- 1420,
- 1426,
- 1433,
- 1436,
- 1442,
- 1447,
- 1453,
- 1455,
- 1457,
+ 1409,
+ 1416,
+ 1421,
+ 1427,
+ 1434,
+ 1437,
+ 1443,
+ 1448,
+ 1454,
+ 1456,
1458,
- 1460,
- 1462,
- 1464,
- 1467,
- 1470,
- 1473,
- 1476,
- 1480,
- 1484,
- 1488,
- 1492,
- 1492,
- 1496,
- 1503,
- 1505,
+ 1459,
+ 1461,
+ 1463,
+ 1465,
+ 1468,
+ 1471,
+ 1474,
+ 1477,
+ 1481,
+ 1485,
+ 1489,
+ 1493,
+ 1493,
+ 1497,
+ 1504,
1506,
1507,
- 1509,
- 1511,
- 1511,
- 1516,
- 1518,
- 1520,
- 1523,
- 1525,
- 1527,
- 1530,
- 1532,
- 1535,
- 1537,
- 1539,
- 1541,
- 1543,
- 1545,
- 1547,
- 1549,
- 1551,
- 1553,
+ 1508,
+ 1510,
+ 1512,
+ 1512,
+ 1517,
+ 1519,
+ 1521,
+ 1524,
+ 1526,
+ 1528,
+ 1531,
+ 1533,
+ 1536,
+ 1538,
+ 1540,
+ 1542,
+ 1544,
+ 1546,
+ 1548,
+ 1550,
+ 1552,
1554,
- 1556,
- 1556,
- 1558,
- 1560,
- 1562,
- 1564,
- 1566,
- 1568,
- 1571,
- 1574,
- 1577,
- 1582,
- 1587,
- 1592,
- 1596,
- 1600,
- 1604,
- 1606,
- 1610,
- 1613,
- 1615,
- 1618,
- 1620,
- 1624,
- 1627,
+ 1555,
+ 1557,
+ 1557,
+ 1559,
+ 1561,
+ 1563,
+ 1565,
+ 1567,
+ 1569,
+ 1572,
+ 1575,
+ 1578,
+ 1583,
+ 1588,
+ 1593,
+ 1597,
+ 1601,
+ 1605,
+ 1607,
+ 1611,
+ 1614,
+ 1616,
+ 1619,
+ 1621,
+ 1625,
1628,
1629,
1630,
- 1634,
- 1638,
- 1642,
- 1646,
- 1651,
- 1656,
- 1661,
- 1666,
- 1669,
- 1672,
- 1675,
- 1678,
- 1682,
- 1686,
- 1690,
- 1694,
- 1699,
- 1704,
- 1709,
- 1714,
- 1717,
- 1720,
- 1723,
- 1726,
- 1728,
- 1730,
- 1732,
- 1734,
- 1736,
- 1738,
- 1740,
- 1745,
- 1750,
- 1752,
- 1755,
- 1758,
- 1761,
- 1763,
- 1770,
- 1774,
- 1782,
- 1784,
- 1786,
+ 1631,
+ 1635,
+ 1639,
+ 1643,
+ 1647,
+ 1652,
+ 1657,
+ 1662,
+ 1667,
+ 1670,
+ 1673,
+ 1676,
+ 1679,
+ 1683,
+ 1687,
+ 1691,
+ 1695,
+ 1700,
+ 1705,
+ 1710,
+ 1715,
+ 1718,
+ 1721,
+ 1724,
+ 1727,
+ 1729,
+ 1731,
+ 1733,
+ 1735,
+ 1737,
+ 1739,
+ 1741,
+ 1746,
+ 1751,
+ 1753,
+ 1756,
+ 1759,
+ 1762,
+ 1764,
+ 1771,
+ 1775,
+ 1783,
+ 1785,
1787,
- 1790,
- 1795,
- 1799,
- 1801,
- 1803,
- 1805,
- 1807,
- 1810,
- 1812,
- 1814,
- 1816,
- 1818,
- 1820,
- 1822,
- 1824,
- 1829,
- 1833,
- 1838,
- 1840,
- 1842,
- 1844,
- 1846,
- 1848,
- 1851,
- 1853,
- 1856,
- 1859,
- 1863,
- 1866,
- 1869,
- 1871,
+ 1788,
+ 1791,
+ 1796,
+ 1800,
+ 1802,
+ 1804,
+ 1806,
+ 1808,
+ 1811,
+ 1813,
+ 1815,
+ 1817,
+ 1819,
+ 1821,
+ 1823,
+ 1825,
+ 1830,
+ 1834,
+ 1839,
+ 1841,
+ 1843,
+ 1845,
+ 1847,
+ 1849,
+ 1852,
+ 1854,
+ 1857,
+ 1860,
+ 1864,
+ 1867,
+ 1870,
1872,
- 1874,
- 1877,
- 1880,
+ 1873,
+ 1875,
+ 1878,
1881,
- 1884,
- 1887,
- 1889,
- 1891,
- 1894,
- 1896,
- 1898,
- 1902,
- 1904,
- 1908,
- 1910,
- 1912,
+ 1882,
+ 1885,
+ 1888,
+ 1890,
+ 1892,
+ 1895,
+ 1897,
+ 1899,
+ 1903,
+ 1905,
+ 1909,
+ 1911,
1913,
- 1919,
- 1921,
- 1923,
- 1927,
- 1929,
+ 1914,
+ 1920,
+ 1922,
+ 1924,
+ 1928,
1930,
- 1934,
- 1938,
- 1941,
- 1945,
- 1949,
- 1953,
- 1955,
- 1957,
- 1960,
- 1962,
- 1964,
- 1966,
- 1968,
- 1968,
+ 1931,
+ 1935,
+ 1939,
+ 1942,
+ 1946,
+ 1950,
+ 1954,
+ 1956,
+ 1958,
+ 1961,
+ 1963,
+ 1965,
+ 1967,
+ 1969,
1969,
- 1971,
- 1974,
- 1977,
- 1980,
- 1983,
- 1985,
- 1987,
- 1989,
- 1991,
- 1994,
- 2000,
- 2005,
- 2009,
- 2014,
+ 1970,
+ 1972,
+ 1975,
+ 1978,
+ 1981,
+ 1984,
+ 1986,
+ 1988,
+ 1990,
+ 1992,
+ 1995,
+ 2001,
+ 2006,
+ 2010,
2015,
2016,
- 2020,
- 2023,
- 2025,
- 2027,
+ 2017,
+ 2021,
+ 2024,
+ 2026,
2028,
2029,
2030,
- 2034,
- 2038,
- 2044,
- 2047,
- 2049,
- 2051,
- 2053,
- 2056,
- 2058,
+ 2031,
+ 2035,
+ 2039,
+ 2045,
+ 2048,
+ 2050,
+ 2052,
+ 2054,
+ 2057,
2059,
- 2061,
- 2065,
- 2069,
- 2073,
- 2077,
- 2081,
- 2085,
- 2089,
- 2091,
+ 2060,
+ 2062,
+ 2066,
+ 2070,
+ 2074,
+ 2078,
+ 2082,
+ 2086,
+ 2090,
2092,
2093,
2094,
- 2096,
+ 2095,
2097,
2098,
- 2100,
- 2103,
- 2106,
- 2109,
- 2112,
- 2114,
- 2117,
- 2120,
- 2123,
- 2125,
- 2127);
+ 2099,
+ 2101,
+ 2104,
+ 2107,
+ 2110,
+ 2113,
+ 2115,
+ 2118,
+ 2121,
+ 2124,
+ 2126,
+ 2128);
MAST::Ops.WHO<@counts> := nqp::list_i(0,
2,
2,
@@ -1315,7 +1315,7 @@ BEGIN {
3,
1,
3,
- 3,
+ 4,
3,
3,
3,
@@ -2839,8 +2839,9 @@ BEGIN {
162,
56,
104,
- 58,
- 57,
+ 66,
+ 65,
+ 65,
57,
57,
57,
@@ -3417,8 +3418,8 @@ BEGIN {
65,
58,
57,
- 65,
- 65,
+ 66,
+ 56,
162,
65,
33,
@@ -4250,6 +4251,7 @@ BEGIN {
'open_fh', 471,
'close_fh', 472,
'dispatch_u', 473,
+ 'getattrsref_u', 474,
'atposnd_u', 476,
'seek_fh', 477,
'lock_fh', 478,
@@ -4460,6 +4462,7 @@ BEGIN {
'ctxcode', 691,
'isrwcont', 692,
'fc', 693,
+ 'getlexref_nu', 694,
'atpos3d_u', 695,
'encoderep', 696,
'istty_fh', 697,
@@ -5023,6 +5026,7 @@ BEGIN {
'open_fh',
'close_fh',
'dispatch_u',
+ 'getattrsref_u',
'atposnd_u',
'seek_fh',
'lock_fh',
@@ -5233,6 +5237,7 @@ BEGIN {
'ctxcode',
'isrwcont',
'fc',
+ 'getlexref_nu',
'atpos3d_u',
'encoderep',
'istty_fh',
@@ -8666,6 +8671,15 @@ BEGIN {
my int $arg-offset := $elems + 10;
for @arg-indices -> $offset { nqp::writeuint($bytecode, $arg-offset, nqp::unbox_u($offset), 5); $arg-offset := $arg-offset + 2; }
},
+ 'getattrsref_u', sub ($frame, $op0, $op1, $op2, $op3) {
+ my $bytecode := $frame.bytecode;
+ my uint $elems := nqp::elems($bytecode);
+ nqp::writeuint($bytecode, $elems, 474, 5);
+ my uint $index0 := nqp::unbox_u($op0); nqp::writeuint($bytecode, nqp::add_i($elems, 2), $index0, 5);
+ my uint $index1 := nqp::unbox_u($op1); nqp::writeuint($bytecode, nqp::add_i($elems, 4), $index1, 5);
+ my uint $index2 := nqp::unbox_u($op2); nqp::writeuint($bytecode, nqp::add_i($elems, 6), $index2, 5);
+ my uint $index3 := nqp::unbox_u($op3); nqp::writeuint($bytecode, nqp::add_i($elems, 8), $index3, 5);
+ },
'atposnd_u', sub ($frame, $op0, $op1, $op2) {
my $bytecode := $frame.bytecode;
my uint $elems := nqp::elems($bytecode);
@@ -10263,6 +10277,13 @@ BEGIN {
my uint $index0 := nqp::unbox_u($op0); nqp::writeuint($bytecode, nqp::add_i($elems, 2), $index0, 5);
my uint $index1 := nqp::unbox_u($op1); nqp::writeuint($bytecode, nqp::add_i($elems, 4), $index1, 5);
},
+ 'getlexref_nu', sub ($frame, $op0, str $op1) {
+ my $bytecode := $frame.bytecode;
+ my uint $elems := nqp::elems($bytecode);
+ nqp::writeuint($bytecode, $elems, 694, 5);
+ my uint $index0 := nqp::unbox_u($op0); nqp::writeuint($bytecode, nqp::add_i($elems, 2), $index0, 5);
+ my uint $index1 := $frame.add-string($op1); nqp::writeuint($bytecode, nqp::add_i($elems, 4), $index1, 9);
+ },
'atpos3d_u', sub ($frame, $op0, $op1, $op2, $op3, $op4) {
my $bytecode := $frame.bytecode;
my uint $elems := nqp::elems($bytecode);
diff --git src/6model/reprs/NativeRef.c src/6model/reprs/NativeRef.c
index 00cfe7d6a..78b8d4475 100644
--- src/6model/reprs/NativeRef.c
+++ src/6model/reprs/NativeRef.c
@@ -345,6 +345,17 @@ MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name) {
return lexref_by_name(tc, ref_type, name, LEXREF_ANY_INT);
MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL");
}
+MVMObject * MVM_nativeref_lex_name_u(MVMThreadContext *tc, MVMString *name) {
+ MVMObject *ref_type;
+ MVMROOT(tc, name, {
+ MVM_frame_force_to_heap(tc, tc->cur_frame);
+ });
+ ref_type = MVM_hll_current(tc)->uint_lex_ref;
+ if (ref_type)
+ /* LEXREF_ANY_INT will allow int8..int64 as well as uint8..uint64 */
+ return lexref_by_name(tc, ref_type, name, LEXREF_ANY_INT);
+ MVM_exception_throw_adhoc(tc, "No uint lexical reference type registered for current HLL");
+}
MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name) {
MVMObject *ref_type;
MVMROOT(tc, name, {
diff --git src/6model/reprs/NativeRef.h src/6model/reprs/NativeRef.h
index bfb8b42a5..c8384d37e 100644
--- src/6model/reprs/NativeRef.h
+++ src/6model/reprs/NativeRef.h
@@ -54,6 +54,7 @@ MVMObject * MVM_nativeref_lex_u(MVMThreadContext *tc, MVMuint16 outers, MVMuint1
MVMObject * MVM_nativeref_lex_n(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx);
MVMObject * MVM_nativeref_lex_s(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx);
MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name);
+MVMObject * MVM_nativeref_lex_name_u(MVMThreadContext *tc, MVMString *name);
MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name);
MVMObject * MVM_nativeref_lex_name_s(MVMThreadContext *tc, MVMString *name);
MVMObject * MVM_nativeref_attr_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name);
diff --git src/6model/reprs/P6opaque.c src/6model/reprs/P6opaque.c
index 744a0b9e8..858d56e0c 100644
--- src/6model/reprs/P6opaque.c
+++ src/6model/reprs/P6opaque.c
@@ -1706,6 +1706,33 @@ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpes
}
break;
}
+ case MVM_OP_getattr_u:
+ case MVM_OP_getattrs_u: {
+ MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]);
+ MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]);
+ MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_u);
+ if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type
+ && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) {
+ MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name);
+ if (slot >= 0 && repr_data->flattened_stables[slot]) {
+ MVMSTable *flat_st = repr_data->flattened_stables[slot];
+ const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st);
+ add_slot_name_comment(tc, g, ins, name, ch_facts, st);
+ if (flat_st->REPR->ID == MVM_REPR_ID_P6int &&
+ (flat_ss->bits == 64 || flat_ss->bits == 32)) {
+ if (opcode == MVM_OP_getattrs_u)
+ MVM_spesh_usages_delete_by_reg(tc, g, ins->operands[3], ins);
+ MVM_spesh_usages_delete_by_reg(tc, g, ins->operands[2], ins);
+ ins->info = MVM_op_get_op(
+ flat_ss->bits == 64 ? MVM_OP_sp_p6oget_u
+ : MVM_OP_sp_p6oget_u32
+ );
+ ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot];
+ }
+ }
+ }
+ break;
+ }
case MVM_OP_getattr_n:
case MVM_OP_getattrs_n: {
MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]);
@@ -1806,6 +1833,34 @@ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpes
}
break;
}
+ case MVM_OP_bindattr_u:
+ case MVM_OP_bindattrs_u: {
+ MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]);
+ MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]);
+ MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_u);
+ if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type
+ && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) {
+ MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name);
+ if (slot >= 0 && repr_data->flattened_stables[slot]) {
+ MVMSTable *flat_st = repr_data->flattened_stables[slot];
+ const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st);
+ if (flat_st->REPR->ID == MVM_REPR_ID_P6int &&
+ (flat_ss->bits == 64 || flat_ss->bits == 32)) {
+ add_slot_name_comment(tc, g, ins, name, ch_facts, st);
+ if (opcode == MVM_OP_bindattrs_u)
+ MVM_spesh_usages_delete_by_reg(tc, g, ins->operands[2], ins);
+ MVM_spesh_usages_delete_by_reg(tc, g, ins->operands[1], ins);
+ ins->info = MVM_op_get_op(
+ flat_ss->bits == 64 ? MVM_OP_sp_p6obind_u
+ : MVM_OP_sp_p6obind_u32
+ );
+ ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot];
+ ins->operands[2] = ins->operands[3];
+ }
+ }
+ }
+ break;
+ }
case MVM_OP_bindattr_n:
case MVM_OP_bindattrs_n: {
MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]);
@@ -1888,6 +1943,41 @@ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpes
}
}
break;
+ case MVM_OP_box_u:
+ if (repr_data->num_attributes == 1 && repr_data->unbox_uint_slot >= 0 &&
+ !(st->mode_flags & MVM_FINALIZE_TYPE)) {
+ MVMSTable *embedded_st = repr_data->flattened_stables[repr_data->unbox_uint_slot];
+ if (embedded_st->REPR->ID == MVM_REPR_ID_P6bigint) {
+ MVMSpeshFacts *value_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]);
+
+ /* Turn into a sp_fastbox_bi[_ic] instruction. */
+ MVMint32 int_cache_type_idx = MVM_intcache_type_index(tc, st->WHAT);
+ MVMSpeshFacts *tgt_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]);
+ MVMSpeshOperand *orig_operands = ins->operands;
+ ins->info = MVM_op_get_op(int_cache_type_idx < 0
+ ? MVM_OP_sp_fastbox_bi
+ : MVM_OP_sp_fastbox_bi_ic);
+ ins->operands = MVM_spesh_alloc(tc, g, 6 * sizeof(MVMSpeshOperand));
+ ins->operands[0] = orig_operands[0];
+ ins->operands[1].lit_i16 = st->size;
+ ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st);
+ ins->operands[3].lit_i16 = sizeof(MVMObject) +
+ repr_data->attribute_offsets[repr_data->unbox_uint_slot];
+ ins->operands[4] = orig_operands[1];
+ ins->operands[5].lit_i16 = (MVMint16)int_cache_type_idx;
+ MVM_spesh_usages_delete_by_reg(tc, g, orig_operands[2], ins);
+ tgt_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_KNOWN_BOX_SRC;
+ tgt_facts->type = st->WHAT;
+
+ MVM_spesh_graph_add_comment(tc, g, ins, "box_u into a %s",
+ MVM_6model_get_stable_debug_name(tc, st));
+
+ if (value_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) {
+ MVM_spesh_graph_add_comment(tc, g, ins, "could have made literal");
+ }
+ }
+ }
+ break;
case MVM_OP_box_n:
if (repr_data->num_attributes == 1 && repr_data->unbox_num_slot >= 0 &&
!(st->mode_flags & MVM_FINALIZE_TYPE)) {
@@ -2021,6 +2111,68 @@ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpes
}
}
break;
+ case MVM_OP_unbox_u:
+ case MVM_OP_decont_u:
+ if (repr_data->unbox_uint_slot >= 0) {
+ MVMSTable *embedded_st = repr_data->flattened_stables[repr_data->unbox_uint_slot];
+ if (embedded_st->REPR->ID == MVM_REPR_ID_P6bigint) {
+ MVMSpeshFacts *facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]);
+ int have_value = 0;
+ MVMint64 value;
+
+ if ((facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) && IS_CONCRETE(facts->value.o)) {
+ /* Effectively this is the call chain for
+ * MVM_repr_get_uint(tc, facts->value.o)
+ * inlined all the way to P6bigint.c:mp_get_u64
+ * We have to do this because that will throw for an out of
+ * range integer, whereas we need to handle that case here.
+ */
+ void * data = OBJECT_BODY(facts->value.o);
+ data = MVM_p6opaque_real_data(tc, data);
+ MVMP6bigintBody *body = (MVMP6bigintBody *)((char *)data + repr_data->attribute_offsets[repr_data->unbox_uint_slot]);
+
+ if (MVM_BIGINT_IS_BIG(body)) {
+ mp_int *i = body->u.bigint;
+ const int bits = mp_count_bits(i);
+ if (bits <= 63) {
+ value = mp_get_mag_ull(i);
+ have_value = 1;
+ }
+ //else if (bits == 64
+ // && MP_NEG == i->sign
+ // && mp_get_mag_ull(i) == 9223372036854775808ULL) {
+ // value = -9223372036854775807ULL - 1;
+ // have_value = 1;
+ //}
+ }
+ else {
+ value = body->u.smallint.value;
+ have_value = 1;
+ }
+ }
+
+ if (have_value) {
+ MVMSpeshFacts *target_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]);
+ MVM_spesh_graph_add_comment(tc, g, ins, "unboxed literal to value %ld", value);
+ ins->info = MVM_op_get_op(MVM_OP_const_i64);
+ MVM_spesh_usages_delete_by_reg(tc, g, ins->operands[1], ins);
+ ins->operands[1].lit_i64 = value;
+ target_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE;
+ target_facts->value.i = value;
+ }
+ else if (facts->flags & MVM_SPESH_FACT_CONCRETE) {
+ MVMSpeshOperand *orig_operands = ins->operands;
+ MVM_spesh_graph_add_comment(tc, g, ins, "%s a %s",
+ ins->info->name, MVM_6model_get_stable_debug_name(tc, st));
+ ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_bi);
+ ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand));
+ ins->operands[0] = orig_operands[0];
+ ins->operands[1] = orig_operands[1];
+ ins->operands[2].lit_i16 = repr_data->attribute_offsets[repr_data->unbox_uint_slot];
+ }
+ }
+ }
+ break;
case MVM_OP_unbox_n:
case MVM_OP_decont_n:
if (repr_data->unbox_num_slot >= 0) {
diff --git src/core/frame.c src/core/frame.c
index 7fca4b9c7..3389496fc 100644
--- src/core/frame.c
+++ src/core/frame.c
@@ -1547,6 +1547,18 @@ void MVM_frame_getdynlex_with_frame_walker(MVMThreadContext *tc, MVMSpeshFrameWa
OBJECT_BODY(result), lex_reg->i64);
MVM_gc_root_temp_pop(tc);
break;
+ case MVM_reg_uint64:
+ result_type = (*tc->interp_cu)->body.hll_config->int_box_type;
+ if (!result_type)
+ MVM_exception_throw_adhoc(tc, "missing int box type (for a uint)");
+ result = REPR(result_type)->allocate(tc, STABLE(result_type));
+ MVM_gc_root_temp_push(tc, (MVMCollectable **)&result);
+ if (REPR(result)->initialize)
+ REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result));
+ REPR(result)->box_funcs.set_uint(tc, STABLE(result), result,
+ OBJECT_BODY(result), lex_reg->u64);
+ MVM_gc_root_temp_pop(tc);
+ break;
case MVM_reg_num64:
result_type = (*tc->interp_cu)->body.hll_config->num_box_type;
if (!result_type)
diff --git src/core/interp.c src/core/interp.c
index 4b5ce4459..26c5e7562 100644
--- src/core/interp.c
+++ src/core/interp.c
@@ -4331,6 +4331,11 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)));
cur_op += 6;
goto NEXT;
+ OP(getlexref_nu):
+ GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_u(tc,
+ MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)));
+ cur_op += 6;
+ goto NEXT;
OP(getlexref_nn):
GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_n(tc,
MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)));
@@ -4386,6 +4391,12 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
GET_REG(cur_op, 6).s);
cur_op += 8;
goto NEXT;
+ OP(getattrsref_u):
+ GET_REG(cur_op, 0).o = MVM_nativeref_attr_u(tc,
+ GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o,
+ GET_REG(cur_op, 6).s);
+ cur_op += 8;
+ goto NEXT;
OP(getattrsref_n):
GET_REG(cur_op, 0).o = MVM_nativeref_attr_n(tc,
GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o,
@@ -5951,6 +5962,12 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 4;
goto NEXT;
}
+ OP(sp_getarg_u): {
+ MVMArgs *args = &(tc->cur_frame->params.arg_info);
+ GET_REG(cur_op, 0).u64 = args->source[args->map[GET_UI16(cur_op, 2)]].u64;
+ cur_op += 4;
+ goto NEXT;
+ }
OP(sp_getarg_n): {
MVMArgs *args = &(tc->cur_frame->params.arg_info);
GET_REG(cur_op, 0).n64 = args->source[args->map[GET_UI16(cur_op, 2)]].n64;
@@ -5999,6 +6016,22 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
GET_REG(cur_op, 0).i64 = *((MVMint8 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
cur_op += 6;
goto NEXT;
+ OP(sp_get_u64):
+ GET_REG(cur_op, 0).u64 = *((MVMuint64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
+ OP(sp_get_u32):
+ GET_REG(cur_op, 0).u64 = *((MVMuint32 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
+ OP(sp_get_u16):
+ GET_REG(cur_op, 0).u64 = *((MVMuint16 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
+ OP(sp_get_u8):
+ GET_REG(cur_op, 0).u64 = *((MVMuint8 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
OP(sp_get_n):
GET_REG(cur_op, 0).n64 = *((MVMnum64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4)));
cur_op += 6;
@@ -6038,6 +6071,30 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 6;
goto NEXT;
}
+ OP(sp_bind_u64): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ *((MVMuint64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
+ OP(sp_bind_u32): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ *((MVMuint32 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
+ OP(sp_bind_u16): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ *((MVMuint16 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
+ OP(sp_bind_u8): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ *((MVMuint8 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
OP(sp_bind_n): {
MVMObject *o = GET_REG(cur_op, 0).o;
*((MVMnum64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).n64;
@@ -6099,6 +6156,13 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 6;
goto NEXT;
}
+ OP(sp_p6oget_u): {
+ MVMObject *o = GET_REG(cur_op, 2).o;
+ char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
+ GET_REG(cur_op, 0).u64 = *((MVMuint64 *)(data + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
+ }
OP(sp_p6oget_n): {
MVMObject *o = GET_REG(cur_op, 2).o;
char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
@@ -6138,6 +6202,13 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 6;
goto NEXT;
}
+ OP(sp_p6obind_u): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
+ *((MVMint64 *)(data + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
OP(sp_p6obind_n): {
MVMObject *o = GET_REG(cur_op, 0).o;
char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
@@ -6167,6 +6238,20 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 6;
goto NEXT;
}
+ OP(sp_p6oget_u32): {
+ MVMObject *o = GET_REG(cur_op, 2).o;
+ char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
+ GET_REG(cur_op, 0).u64 = *((MVMuint32 *)(data + GET_UI16(cur_op, 4)));
+ cur_op += 6;
+ goto NEXT;
+ }
+ OP(sp_p6obind_u32): {
+ MVMObject *o = GET_REG(cur_op, 0).o;
+ char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o));
+ *((MVMuint32 *)(data + GET_UI16(cur_op, 2))) = (MVMuint32)GET_REG(cur_op, 4).u64;
+ cur_op += 6;
+ goto NEXT;
+ }
OP(sp_getvt_o): {
MVMObject *o = GET_REG(cur_op, 2).o;
char *data = (char *)o;
@@ -6202,6 +6287,13 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 10;
goto NEXT;
}
+ OP(sp_fastbox_u): {
+ MVMObject *obj = fastcreate(tc, cur_op);
+ *((MVMuint64 *)((char *)obj + GET_UI16(cur_op, 6))) = GET_REG(cur_op, 8).u64;
+ GET_REG(cur_op, 0).o = obj;
+ cur_op += 10;
+ goto NEXT;
+ }
OP(sp_fastbox_bi): {
MVMObject *obj = fastcreate(tc, cur_op);
MVMP6bigintBody *body = (MVMP6bigintBody *)((char *)obj + GET_UI16(cur_op, 6));
@@ -6231,6 +6323,20 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
cur_op += 12;
goto NEXT;
}
+ OP(sp_fastbox_u_ic): {
+ MVMuint64 value = GET_REG(cur_op, 8).u64;
+ if (value < 15) {
+ MVMint16 slot = GET_UI16(cur_op, 10);
+ GET_REG(cur_op, 0).o = tc->instance->int_const_cache->cache[slot][value + 1];
+ }
+ else {
+ MVMObject *obj = fastcreate(tc, cur_op);
+ *((MVMuint64 *)((char *)obj + GET_UI16(cur_op, 6))) = value;
+ GET_REG(cur_op, 0).o = obj;
+ }
+ cur_op += 12;
+ goto NEXT;
+ }
OP(sp_fastbox_bi_ic): {
MVMint64 value = GET_REG(cur_op, 8).i64;
if (value >= -1 && value < 15) {
@@ -6831,10 +6937,6 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex
goto NEXT;
/* The compiler compiles faster if all deprecated are together and at the end
* even though the op numbers are technically out of order. */
- OP(DEPRECATED_25):
- MVM_exception_throw_adhoc(tc, "The setinputlineseps op was removed in MoarVM 2017.06.");
- OP(DEPRECATED_27):
- MVM_exception_throw_adhoc(tc, "The slurp op was removed in MoarVM 2017.06.");
OP(DEPRECATED_28):
MVM_exception_throw_adhoc(tc, "The spew op was removed in MoarVM 2017.06.");
OP(DEPRECATED_29):
diff --git src/core/oplabels.h src/core/oplabels.h
index 83ed414cf..b47cc166c 100644
--- src/core/oplabels.h
+++ src/core/oplabels.h
@@ -475,7 +475,7 @@ static const void * const LABELS[] = {
&&OP_open_fh,
&&OP_close_fh,
&&OP_dispatch_u,
- &&OP_DEPRECATED_27,
+ &&OP_getattrsref_u,
&&OP_DEPRECATED_28,
&&OP_atposnd_u,
&&OP_seek_fh,
@@ -695,7 +695,7 @@ static const void * const LABELS[] = {
&&OP_ctxcode,
&&OP_isrwcont,
&&OP_fc,
- &&OP_DEPRECATED_25,
+ &&OP_getlexref_nu,
&&OP_atpos3d_u,
&&OP_encoderep,
&&OP_istty_fh,
@@ -869,6 +869,7 @@ static const void * const LABELS[] = {
&&OP_sp_dispatch_o,
&&OP_sp_getarg_o,
&&OP_sp_getarg_i,
+ &&OP_sp_getarg_u,
&&OP_sp_getarg_n,
&&OP_sp_getarg_s,
&&OP_sp_paramnamesused,
@@ -879,6 +880,10 @@ static const void * const LABELS[] = {
&&OP_sp_get_i32,
&&OP_sp_get_i16,
&&OP_sp_get_i8,
+ &&OP_sp_get_u64,
+ &&OP_sp_get_u32,
+ &&OP_sp_get_u16,
+ &&OP_sp_get_u8,
&&OP_sp_get_n,
&&OP_sp_get_s,
&&OP_sp_bind_o,
@@ -886,6 +891,10 @@ static const void * const LABELS[] = {
&&OP_sp_bind_i32,
&&OP_sp_bind_i16,
&&OP_sp_bind_i8,
+ &&OP_sp_bind_u64,
+ &&OP_sp_bind_u32,
+ &&OP_sp_bind_u16,
+ &&OP_sp_bind_u8,
&&OP_sp_bind_n,
&&OP_sp_bind_s,
&&OP_sp_bind_s_nowb,
@@ -893,20 +902,26 @@ static const void * const LABELS[] = {
&&OP_sp_p6ogetvt_o,
&&OP_sp_p6ogetvc_o,
&&OP_sp_p6oget_i,
+ &&OP_sp_p6oget_u,
&&OP_sp_p6oget_n,
&&OP_sp_p6oget_s,
&&OP_sp_p6oget_bi,
&&OP_sp_p6obind_o,
&&OP_sp_p6obind_i,
+ &&OP_sp_p6obind_u,
&&OP_sp_p6obind_n,
&&OP_sp_p6obind_s,
&&OP_sp_p6oget_i32,
+ &&OP_sp_p6oget_u32,
&&OP_sp_p6obind_i32,
+ &&OP_sp_p6obind_u32,
&&OP_sp_getvt_o,
&&OP_sp_getvc_o,
&&OP_sp_fastbox_i,
+ &&OP_sp_fastbox_u,
&&OP_sp_fastbox_bi,
&&OP_sp_fastbox_i_ic,
+ &&OP_sp_fastbox_u_ic,
&&OP_sp_fastbox_bi_ic,
&&OP_sp_deref_get_i64,
&&OP_sp_deref_get_n,
@@ -1010,21 +1025,6 @@ static const void * const LABELS[] = {
NULL,
NULL,
NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
&&OP_CALL_EXTOP,
&&OP_CALL_EXTOP,
&&OP_CALL_EXTOP,
diff --git src/core/oplist src/core/oplist
index 362f67e56..1728a0b5b 100644
--- src/core/oplist
+++ src/core/oplist
@@ -526,7 +526,7 @@ close_dir r(obj)
open_fh w(obj) r(str) r(str)
close_fh r(obj)
dispatch_u .d w(uint64) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
-DEPRECATED_27 w(str) r(str) r(str)
+getattrsref_u w(obj) r(obj) r(obj) r(str) :pure :useshll
DEPRECATED_28 r(str) r(str) r(str)
atposnd_u w(uint64) r(obj) r(obj) :pure :specializable
seek_fh r(obj) r(int64) r(int64)
@@ -747,7 +747,7 @@ numdimensions w(int64) r(obj) :pure :specializable
ctxcode w(obj) r(obj)
isrwcont w(int64) r(obj) :pure :specializable
fc w(str) r(str) :pure
-DEPRECATED_25 r(obj) r(obj)
+getlexref_nu w(obj) str :pure :noinline :useshll
atpos3d_u w(uint64) r(obj) r(int64) r(int64) r(int64) :pure :specializable
encoderep w(obj) r(str) r(str) r(str) r(obj)
istty_fh w(int64) r(obj) :pure
@@ -967,6 +967,7 @@ sp_dispatch_o .s w(obj) str callsite sslot uint32 :maycausedeopt :invokish
# Following are for fast, unchecked grabbing of args from the arg buffer.
sp_getarg_o .s w(obj) int16 :pure
sp_getarg_i .s w(int64) int16 :pure
+sp_getarg_u .s w(uint64) int16 :pure
sp_getarg_n .s w(num64) int16 :pure
sp_getarg_s .s w(str) int16 :pure
@@ -987,6 +988,10 @@ sp_get_i64 .s w(int64) r(obj) int16 :pure
sp_get_i32 .s w(int64) r(obj) int16 :pure
sp_get_i16 .s w(int64) r(obj) int16 :pure
sp_get_i8 .s w(int64) r(obj) int16 :pure
+sp_get_u64 .s w(uint64) r(obj) int16 :pure
+sp_get_u32 .s w(uint64) r(obj) int16 :pure
+sp_get_u16 .s w(uint64) r(obj) int16 :pure
+sp_get_u8 .s w(uint64) r(obj) int16 :pure
sp_get_n .s w(num64) r(obj) int16 :pure
sp_get_s .s w(str) r(obj) int16 :pure
sp_bind_o .s r(obj) int16 r(obj)
@@ -994,6 +999,10 @@ sp_bind_i64 .s r(obj) int16 r(int64)
sp_bind_i32 .s r(obj) int16 r(int64)
sp_bind_i16 .s r(obj) int16 r(int64)
sp_bind_i8 .s r(obj) int16 r(int64)
+sp_bind_u64 .s r(obj) int16 r(uint64)
+sp_bind_u32 .s r(obj) int16 r(uint64)
+sp_bind_u16 .s r(obj) int16 r(uint64)
+sp_bind_u8 .s r(obj) int16 r(uint64)
sp_bind_n .s r(obj) int16 r(num64)
sp_bind_s .s r(obj) int16 r(str)
sp_bind_s_nowb .s r(obj) int16 r(str)
@@ -1006,15 +1015,19 @@ sp_p6oget_o .s w(obj) r(obj) int16 :pure
sp_p6ogetvt_o .s w(obj) r(obj) int16 sslot
sp_p6ogetvc_o .s w(obj) r(obj) int16 sslot
sp_p6oget_i .s w(int64) r(obj) int16 :pure
+sp_p6oget_u .s w(uint64) r(obj) int16 :pure
sp_p6oget_n .s w(num64) r(obj) int16 :pure
sp_p6oget_s .s w(str) r(obj) int16 :pure
sp_p6oget_bi .s w(int64) r(obj) int16 :pure
sp_p6obind_o .s r(obj) int16 r(obj)
sp_p6obind_i .s r(obj) int16 r(int64)
+sp_p6obind_u .s r(obj) int16 r(uint64)
sp_p6obind_n .s r(obj) int16 r(num64)
sp_p6obind_s .s r(obj) int16 r(str)
sp_p6oget_i32 .s w(int64) r(obj) int16 :pure
+sp_p6oget_u32 .s w(uint64) r(obj) int16 :pure
sp_p6obind_i32 .s r(obj) int16 r(int64) :pure
+sp_p6obind_u32 .s r(obj) int16 r(uint64) :pure
# Simple vivifying forms of attribute access; used when we know we don't
# have any kind of mixin type. Offset is from start of the object's memory.
@@ -1028,8 +1041,10 @@ sp_getvc_o .s w(obj) r(obj) int16 sslot
# argument which is the type index in the integer cache; they do a lookup in
# the integer cache before performing a box operation.
sp_fastbox_i .s w(obj) int16 sslot int16 r(int64) :pure
+sp_fastbox_u .s w(obj) int16 sslot int16 r(uint64) :pure
sp_fastbox_bi .s w(obj) int16 sslot int16 r(int64) :pure
sp_fastbox_i_ic .s w(obj) int16 sslot int16 r(int64) int16 :pure
+sp_fastbox_u_ic .s w(obj) int16 sslot int16 r(uint64) int16 :pure
sp_fastbox_bi_ic .s w(obj) int16 sslot int16 r(int64) int16 :pure
# Follow a pointer at an offset to an object and get/store a value there.
diff --git src/core/ops.c src/core/ops.c
index 54acf304e..e74945fb4 100644
--- src/core/ops.c
+++ src/core/ops.c
@@ -7586,20 +7586,20 @@ static const MVMOpInfo MVM_op_infos[] = {
{ MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_str, MVM_operand_callsite }
},
{
- MVM_OP_DEPRECATED_27,
- "DEPRECATED_27",
- 3,
- 0,
- 0,
+ MVM_OP_getattrsref_u,
+ "getattrsref_u",
+ 4,
+ 1,
0,
0,
0,
0,
0,
0,
+ 1,
0,
0,
- { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str }
+ { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str }
},
{
MVM_OP_DEPRECATED_28,
@@ -11106,20 +11106,20 @@ static const MVMOpInfo MVM_op_infos[] = {
{ MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str }
},
{
- MVM_OP_DEPRECATED_25,
- "DEPRECATED_25",
+ MVM_OP_getlexref_nu,
+ "getlexref_nu",
2,
+ 1,
0,
0,
0,
0,
+ 1,
0,
+ 1,
0,
0,
- 0,
- 0,
- 0,
- { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj }
+ { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str }
},
{
MVM_OP_atpos3d_u,
@@ -13889,6 +13889,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16 }
},
+ {
+ MVM_OP_sp_getarg_u,
+ "sp_getarg_u",
+ 2,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_int16 }
+ },
{
MVM_OP_sp_getarg_n,
"sp_getarg_n",
@@ -14049,6 +14065,70 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
},
+ {
+ MVM_OP_sp_get_u64,
+ "sp_get_u64",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
+ {
+ MVM_OP_sp_get_u32,
+ "sp_get_u32",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
+ {
+ MVM_OP_sp_get_u16,
+ "sp_get_u16",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
+ {
+ MVM_OP_sp_get_u8,
+ "sp_get_u8",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
{
MVM_OP_sp_get_n,
"sp_get_n",
@@ -14161,6 +14241,70 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 }
},
+ {
+ MVM_OP_sp_bind_u64,
+ "sp_bind_u64",
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
+ {
+ MVM_OP_sp_bind_u32,
+ "sp_bind_u32",
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
+ {
+ MVM_OP_sp_bind_u16,
+ "sp_bind_u16",
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
+ {
+ MVM_OP_sp_bind_u8,
+ "sp_bind_u8",
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
{
MVM_OP_sp_bind_n,
"sp_bind_n",
@@ -14273,6 +14417,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
},
+ {
+ MVM_OP_sp_p6oget_u,
+ "sp_p6oget_u",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
{
MVM_OP_sp_p6oget_n,
"sp_p6oget_n",
@@ -14353,6 +14513,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 }
},
+ {
+ MVM_OP_sp_p6obind_u,
+ "sp_p6obind_u",
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
{
MVM_OP_sp_p6obind_n,
"sp_p6obind_n",
@@ -14401,6 +14577,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
},
+ {
+ MVM_OP_sp_p6oget_u32,
+ "sp_p6oget_u32",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 }
+ },
{
MVM_OP_sp_p6obind_i32,
"sp_p6obind_i32",
@@ -14417,6 +14609,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 }
},
+ {
+ MVM_OP_sp_p6obind_u32,
+ "sp_p6obind_u32",
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
{
MVM_OP_sp_getvt_o,
"sp_getvt_o",
@@ -14465,6 +14673,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 }
},
+ {
+ MVM_OP_sp_fastbox_u,
+ "sp_fastbox_u",
+ 5,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64 }
+ },
{
MVM_OP_sp_fastbox_bi,
"sp_fastbox_bi",
@@ -14497,6 +14721,22 @@ static const MVMOpInfo MVM_op_infos[] = {
0,
{ MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16 }
},
+ {
+ MVM_OP_sp_fastbox_u_ic,
+ "sp_fastbox_u_ic",
+ 6,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_uint64, MVM_operand_int16 }
+ },
{
MVM_OP_sp_fastbox_bi_ic,
"sp_fastbox_bi_ic",
@@ -15331,7 +15571,7 @@ static const MVMOpInfo MVM_op_infos[] = {
},
};
-static const unsigned short MVM_op_counts = 958;
+static const unsigned short MVM_op_counts = 973;
static const MVMuint16 last_op_allowed = 837;
diff --git src/core/ops.h src/core/ops.h
index b949e6068..11f4601b3 100644
--- src/core/ops.h
+++ src/core/ops.h
@@ -475,7 +475,7 @@
#define MVM_OP_open_fh 471
#define MVM_OP_close_fh 472
#define MVM_OP_dispatch_u 473
-#define MVM_OP_DEPRECATED_27 474
+#define MVM_OP_getattrsref_u 474
#define MVM_OP_DEPRECATED_28 475
#define MVM_OP_atposnd_u 476
#define MVM_OP_seek_fh 477
@@ -695,7 +695,7 @@
#define MVM_OP_ctxcode 691
#define MVM_OP_isrwcont 692
#define MVM_OP_fc 693
-#define MVM_OP_DEPRECATED_25 694
+#define MVM_OP_getlexref_nu 694
#define MVM_OP_atpos3d_u 695
#define MVM_OP_encoderep 696
#define MVM_OP_istty_fh 697
@@ -869,96 +869,111 @@
#define MVM_OP_sp_dispatch_o 865
#define MVM_OP_sp_getarg_o 866
#define MVM_OP_sp_getarg_i 867
-#define MVM_OP_sp_getarg_n 868
-#define MVM_OP_sp_getarg_s 869
-#define MVM_OP_sp_paramnamesused 870
-#define MVM_OP_sp_getspeshslot 871
-#define MVM_OP_sp_fastcreate 872
-#define MVM_OP_sp_get_o 873
-#define MVM_OP_sp_get_i64 874
-#define MVM_OP_sp_get_i32 875
-#define MVM_OP_sp_get_i16 876
-#define MVM_OP_sp_get_i8 877
-#define MVM_OP_sp_get_n 878
-#define MVM_OP_sp_get_s 879
-#define MVM_OP_sp_bind_o 880
-#define MVM_OP_sp_bind_i64 881
-#define MVM_OP_sp_bind_i32 882
-#define MVM_OP_sp_bind_i16 883
-#define MVM_OP_sp_bind_i8 884
-#define MVM_OP_sp_bind_n 885
-#define MVM_OP_sp_bind_s 886
-#define MVM_OP_sp_bind_s_nowb 887
-#define MVM_OP_sp_p6oget_o 888
-#define MVM_OP_sp_p6ogetvt_o 889
-#define MVM_OP_sp_p6ogetvc_o 890
-#define MVM_OP_sp_p6oget_i 891
-#define MVM_OP_sp_p6oget_n 892
-#define MVM_OP_sp_p6oget_s 893
-#define MVM_OP_sp_p6oget_bi 894
-#define MVM_OP_sp_p6obind_o 895
-#define MVM_OP_sp_p6obind_i 896
-#define MVM_OP_sp_p6obind_n 897
-#define MVM_OP_sp_p6obind_s 898
-#define MVM_OP_sp_p6oget_i32 899
-#define MVM_OP_sp_p6obind_i32 900
-#define MVM_OP_sp_getvt_o 901
-#define MVM_OP_sp_getvc_o 902
-#define MVM_OP_sp_fastbox_i 903
-#define MVM_OP_sp_fastbox_bi 904
-#define MVM_OP_sp_fastbox_i_ic 905
-#define MVM_OP_sp_fastbox_bi_ic 906
-#define MVM_OP_sp_deref_get_i64 907
-#define MVM_OP_sp_deref_get_n 908
-#define MVM_OP_sp_deref_bind_i64 909
-#define MVM_OP_sp_deref_bind_n 910
-#define MVM_OP_sp_getlexvia_o 911
-#define MVM_OP_sp_getlexvia_ins 912
-#define MVM_OP_sp_bindlexvia_os 913
-#define MVM_OP_sp_bindlexvia_in 914
-#define MVM_OP_sp_getstringfrom 915
-#define MVM_OP_sp_getwvalfrom 916
-#define MVM_OP_sp_jit_enter 917
-#define MVM_OP_sp_istrue_n 918
-#define MVM_OP_sp_boolify_iter 919
-#define MVM_OP_sp_boolify_iter_arr 920
-#define MVM_OP_sp_boolify_iter_hash 921
-#define MVM_OP_sp_cas_o 922
-#define MVM_OP_sp_atomicload_o 923
-#define MVM_OP_sp_atomicstore_o 924
-#define MVM_OP_sp_add_I 925
-#define MVM_OP_sp_sub_I 926
-#define MVM_OP_sp_mul_I 927
-#define MVM_OP_sp_bool_I 928
-#define MVM_OP_sp_runbytecode_v 929
-#define MVM_OP_sp_runbytecode_i 930
-#define MVM_OP_sp_runbytecode_u 931
-#define MVM_OP_sp_runbytecode_n 932
-#define MVM_OP_sp_runbytecode_s 933
-#define MVM_OP_sp_runbytecode_o 934
-#define MVM_OP_sp_runcfunc_v 935
-#define MVM_OP_sp_runcfunc_i 936
-#define MVM_OP_sp_runcfunc_u 937
-#define MVM_OP_sp_runcfunc_n 938
-#define MVM_OP_sp_runcfunc_s 939
-#define MVM_OP_sp_runcfunc_o 940
-#define MVM_OP_sp_runnativecall_v 941
-#define MVM_OP_sp_runnativecall_i 942
-#define MVM_OP_sp_runnativecall_u 943
-#define MVM_OP_sp_runnativecall_n 944
-#define MVM_OP_sp_runnativecall_s 945
-#define MVM_OP_sp_runnativecall_o 946
-#define MVM_OP_sp_resumption 947
-#define MVM_OP_prof_enter 948
-#define MVM_OP_prof_enterspesh 949
-#define MVM_OP_prof_enterinline 950
-#define MVM_OP_prof_enternative 951
-#define MVM_OP_prof_exit 952
-#define MVM_OP_prof_allocated 953
-#define MVM_OP_prof_replaced 954
-#define MVM_OP_ctw_check 955
-#define MVM_OP_coverage_log 956
-#define MVM_OP_breakpoint 957
+#define MVM_OP_sp_getarg_u 868
+#define MVM_OP_sp_getarg_n 869
+#define MVM_OP_sp_getarg_s 870
+#define MVM_OP_sp_paramnamesused 871
+#define MVM_OP_sp_getspeshslot 872
+#define MVM_OP_sp_fastcreate 873
+#define MVM_OP_sp_get_o 874
+#define MVM_OP_sp_get_i64 875
+#define MVM_OP_sp_get_i32 876
+#define MVM_OP_sp_get_i16 877
+#define MVM_OP_sp_get_i8 878
+#define MVM_OP_sp_get_u64 879
+#define MVM_OP_sp_get_u32 880
+#define MVM_OP_sp_get_u16 881
+#define MVM_OP_sp_get_u8 882
+#define MVM_OP_sp_get_n 883
+#define MVM_OP_sp_get_s 884
+#define MVM_OP_sp_bind_o 885
+#define MVM_OP_sp_bind_i64 886
+#define MVM_OP_sp_bind_i32 887
+#define MVM_OP_sp_bind_i16 888
+#define MVM_OP_sp_bind_i8 889
+#define MVM_OP_sp_bind_u64 890
+#define MVM_OP_sp_bind_u32 891
+#define MVM_OP_sp_bind_u16 892
+#define MVM_OP_sp_bind_u8 893
+#define MVM_OP_sp_bind_n 894
+#define MVM_OP_sp_bind_s 895
+#define MVM_OP_sp_bind_s_nowb 896
+#define MVM_OP_sp_p6oget_o 897
+#define MVM_OP_sp_p6ogetvt_o 898
+#define MVM_OP_sp_p6ogetvc_o 899
+#define MVM_OP_sp_p6oget_i 900
+#define MVM_OP_sp_p6oget_u 901
+#define MVM_OP_sp_p6oget_n 902
+#define MVM_OP_sp_p6oget_s 903
+#define MVM_OP_sp_p6oget_bi 904
+#define MVM_OP_sp_p6obind_o 905
+#define MVM_OP_sp_p6obind_i 906
+#define MVM_OP_sp_p6obind_u 907
+#define MVM_OP_sp_p6obind_n 908
+#define MVM_OP_sp_p6obind_s 909
+#define MVM_OP_sp_p6oget_i32 910
+#define MVM_OP_sp_p6oget_u32 911
+#define MVM_OP_sp_p6obind_i32 912
+#define MVM_OP_sp_p6obind_u32 913
+#define MVM_OP_sp_getvt_o 914
+#define MVM_OP_sp_getvc_o 915
+#define MVM_OP_sp_fastbox_i 916
+#define MVM_OP_sp_fastbox_u 917
+#define MVM_OP_sp_fastbox_bi 918
+#define MVM_OP_sp_fastbox_i_ic 919
+#define MVM_OP_sp_fastbox_u_ic 920
+#define MVM_OP_sp_fastbox_bi_ic 921
+#define MVM_OP_sp_deref_get_i64 922
+#define MVM_OP_sp_deref_get_n 923
+#define MVM_OP_sp_deref_bind_i64 924
+#define MVM_OP_sp_deref_bind_n 925
+#define MVM_OP_sp_getlexvia_o 926
+#define MVM_OP_sp_getlexvia_ins 927
+#define MVM_OP_sp_bindlexvia_os 928
+#define MVM_OP_sp_bindlexvia_in 929
+#define MVM_OP_sp_getstringfrom 930
+#define MVM_OP_sp_getwvalfrom 931
+#define MVM_OP_sp_jit_enter 932
+#define MVM_OP_sp_istrue_n 933
+#define MVM_OP_sp_boolify_iter 934
+#define MVM_OP_sp_boolify_iter_arr 935
+#define MVM_OP_sp_boolify_iter_hash 936
+#define MVM_OP_sp_cas_o 937
+#define MVM_OP_sp_atomicload_o 938
+#define MVM_OP_sp_atomicstore_o 939
+#define MVM_OP_sp_add_I 940
+#define MVM_OP_sp_sub_I 941
+#define MVM_OP_sp_mul_I 942
+#define MVM_OP_sp_bool_I 943
+#define MVM_OP_sp_runbytecode_v 944
+#define MVM_OP_sp_runbytecode_i 945
+#define MVM_OP_sp_runbytecode_u 946
+#define MVM_OP_sp_runbytecode_n 947
+#define MVM_OP_sp_runbytecode_s 948
+#define MVM_OP_sp_runbytecode_o 949
+#define MVM_OP_sp_runcfunc_v 950
+#define MVM_OP_sp_runcfunc_i 951
+#define MVM_OP_sp_runcfunc_u 952
+#define MVM_OP_sp_runcfunc_n 953
+#define MVM_OP_sp_runcfunc_s 954
+#define MVM_OP_sp_runcfunc_o 955
+#define MVM_OP_sp_runnativecall_v 956
+#define MVM_OP_sp_runnativecall_i 957
+#define MVM_OP_sp_runnativecall_u 958
+#define MVM_OP_sp_runnativecall_n 959
+#define MVM_OP_sp_runnativecall_s 960
+#define MVM_OP_sp_runnativecall_o 961
+#define MVM_OP_sp_resumption 962
+#define MVM_OP_prof_enter 963
+#define MVM_OP_prof_enterspesh 964
+#define MVM_OP_prof_enterinline 965
+#define MVM_OP_prof_enternative 966
+#define MVM_OP_prof_exit 967
+#define MVM_OP_prof_allocated 968
+#define MVM_OP_prof_replaced 969
+#define MVM_OP_ctw_check 970
+#define MVM_OP_coverage_log 971
+#define MVM_OP_breakpoint 972
#define MVM_OP_EXT_BASE 1024
#define MVM_OP_EXT_CU_LIMIT 1024
diff --git src/jit/graph.c src/jit/graph.c
index 099bc559a..6e6e09023 100644
--- src/jit/graph.c
+++ src/jit/graph.c
@@ -116,6 +116,7 @@ static void * op_to_func(MVMThreadContext *tc, MVMint16 opcode) {
case MVM_OP_captureposelems: return MVM_capture_num_pos_args;
case MVM_OP_captureposarg: return MVM_capture_arg_pos_o;
case MVM_OP_captureposarg_i: return MVM_capture_arg_pos_i;
+ case MVM_OP_captureposarg_u: return MVM_capture_arg_pos_u;
case MVM_OP_captureposarg_n: return MVM_capture_arg_pos_n;
case MVM_OP_captureposarg_s: return MVM_capture_arg_pos_s;
case MVM_OP_captureposprimspec: return MVM_capture_arg_pos_primspec;
@@ -393,6 +394,7 @@ static void * op_to_func(MVMThreadContext *tc, MVMint16 opcode) {
case MVM_OP_getattrref_n: return MVM_nativeref_attr_n;
case MVM_OP_getattrref_s: return MVM_nativeref_attr_s;
case MVM_OP_getattrsref_i: return MVM_nativeref_attr_i;
+ case MVM_OP_getattrsref_u: return MVM_nativeref_attr_u;
case MVM_OP_getattrsref_n: return MVM_nativeref_attr_n;
case MVM_OP_getattrsref_s: return MVM_nativeref_attr_s;
case MVM_OP_atposref_i: return MVM_nativeref_pos_i;
@@ -853,7 +855,7 @@ static MVMint32 consume_reprop(MVMThreadContext *tc, MVMJitGraph *jg,
MVMint32 value = ins->operands[2].reg.orig;
MVMint32 kind = op == MVM_OP_bindpos_i || op == MVM_OP_bindkey_i ? MVM_reg_int64 :
- op == MVM_OP_bindpos_u ? MVM_reg_int64 :
+ op == MVM_OP_bindpos_u ? MVM_reg_uint64 :
op == MVM_OP_bindpos_n || op == MVM_OP_bindkey_n ? MVM_reg_num64 :
op == MVM_OP_bindpos_s || op == MVM_OP_bindkey_s ? MVM_reg_str :
MVM_reg_obj;
@@ -1647,7 +1649,9 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
case MVM_OP_div_i:
case MVM_OP_mod_i:
case MVM_OP_inc_i:
+ case MVM_OP_inc_u:
case MVM_OP_dec_i:
+ case MVM_OP_dec_u:
case MVM_OP_neg_i:
case MVM_OP_band_i:
case MVM_OP_bor_i:
@@ -1666,7 +1670,9 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
case MVM_OP_coerce_iu:
case MVM_OP_coerce_ui:
case MVM_OP_coerce_ni:
+ case MVM_OP_coerce_nu:
case MVM_OP_coerce_in:
+ case MVM_OP_coerce_un:
case MVM_OP_extend_i8:
case MVM_OP_extend_u8:
case MVM_OP_extend_i16:
@@ -1732,26 +1738,34 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
case MVM_OP_sp_p6oget_o:
case MVM_OP_sp_p6oget_s:
case MVM_OP_sp_p6oget_i:
+ case MVM_OP_sp_p6oget_u:
case MVM_OP_sp_p6oget_n:
case MVM_OP_sp_p6ogetvc_o:
case MVM_OP_sp_p6ogetvt_o:
case MVM_OP_sp_p6oget_bi:
case MVM_OP_sp_p6oget_i32:
+ case MVM_OP_sp_p6oget_u32:
case MVM_OP_sp_getvc_o:
case MVM_OP_sp_getvt_o:
case MVM_OP_sp_p6obind_i:
+ case MVM_OP_sp_p6obind_u:
case MVM_OP_sp_p6obind_n:
case MVM_OP_sp_p6obind_s:
case MVM_OP_sp_p6obind_o:
case MVM_OP_sp_p6obind_i32:
+ case MVM_OP_sp_p6obind_u32:
case MVM_OP_sp_bind_i64:
+ case MVM_OP_sp_bind_u64:
case MVM_OP_sp_bind_i32:
+ case MVM_OP_sp_bind_u32:
case MVM_OP_sp_bind_n:
case MVM_OP_sp_bind_s:
case MVM_OP_sp_bind_s_nowb:
case MVM_OP_sp_bind_o:
case MVM_OP_sp_get_i64:
+ case MVM_OP_sp_get_u64:
case MVM_OP_sp_get_i32:
+ case MVM_OP_sp_get_u32:
case MVM_OP_sp_get_n:
case MVM_OP_sp_get_s:
case MVM_OP_sp_get_o:
@@ -1850,7 +1864,9 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
case MVM_OP_sp_atomicstore_o:
/* Specialized boxings */
case MVM_OP_sp_fastbox_i:
+ case MVM_OP_sp_fastbox_u:
case MVM_OP_sp_fastbox_i_ic:
+ case MVM_OP_sp_fastbox_u_ic:
case MVM_OP_sp_fastbox_bi:
case MVM_OP_sp_fastbox_bi_ic:
/* Specialized boxings */
@@ -1860,6 +1876,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
case MVM_OP_sp_bool_I:
/* Specialized argument reading */
case MVM_OP_sp_getarg_i:
+ case MVM_OP_sp_getarg_u:
case MVM_OP_sp_getarg_n:
case MVM_OP_sp_getarg_s:
case MVM_OP_sp_getarg_o:
@@ -2181,6 +2198,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst);
break;
}
+ case MVM_OP_captureposarg_u:
case MVM_OP_captureposarg_i: {
MVMint16 dst = ins->operands[0].reg.orig;
MVMint16 capture = ins->operands[1].reg.orig;
@@ -3500,6 +3518,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
}
/* native references (as simple function calls for now) */
case MVM_OP_iscont_i:
+ case MVM_OP_iscont_u:
case MVM_OP_iscont_n:
case MVM_OP_iscont_s:
case MVM_OP_isrwcont: {
@@ -3589,6 +3608,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
break;
}
case MVM_OP_getattrsref_i:
+ case MVM_OP_getattrsref_u:
case MVM_OP_getattrsref_n:
case MVM_OP_getattrsref_s: {
MVMint16 dst = ins->operands[0].reg.orig;
@@ -3797,6 +3817,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
}
case MVM_OP_sp_runbytecode_v:
case MVM_OP_sp_runbytecode_i:
+ case MVM_OP_sp_runbytecode_u:
case MVM_OP_sp_runbytecode_s:
case MVM_OP_sp_runbytecode_n:
case MVM_OP_sp_runbytecode_o: {
@@ -3816,11 +3837,13 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
? MVM_RETURN_VOID
: op == MVM_OP_sp_runbytecode_i
? MVM_RETURN_INT
- : op == MVM_OP_sp_runbytecode_s
- ? MVM_RETURN_STR
- : op == MVM_OP_sp_runbytecode_n
- ? MVM_RETURN_NUM
- : MVM_RETURN_OBJ;
+ : op == MVM_OP_sp_runbytecode_u
+ ? MVM_RETURN_UINT
+ : op == MVM_OP_sp_runbytecode_s
+ ? MVM_RETURN_STR
+ : op == MVM_OP_sp_runbytecode_n
+ ? MVM_RETURN_NUM
+ : MVM_RETURN_OBJ;
node->u.runbytecode.return_register = dst;
node->u.runbytecode.map = &ins->operands[3 + start];
node->u.runbytecode.code_register = code;
@@ -3833,6 +3856,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
}
case MVM_OP_sp_runcfunc_v:
case MVM_OP_sp_runcfunc_i:
+ case MVM_OP_sp_runcfunc_u:
case MVM_OP_sp_runcfunc_s:
case MVM_OP_sp_runcfunc_n:
case MVM_OP_sp_runcfunc_o: {
@@ -3851,11 +3875,13 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
? MVM_RETURN_VOID
: op == MVM_OP_sp_runcfunc_i
? MVM_RETURN_INT
- : op == MVM_OP_sp_runcfunc_s
- ? MVM_RETURN_STR
- : op == MVM_OP_sp_runcfunc_n
- ? MVM_RETURN_NUM
- : MVM_RETURN_OBJ;
+ : op == MVM_OP_sp_runcfunc_u
+ ? MVM_RETURN_UINT
+ : op == MVM_OP_sp_runcfunc_s
+ ? MVM_RETURN_STR
+ : op == MVM_OP_sp_runcfunc_n
+ ? MVM_RETURN_NUM
+ : MVM_RETURN_OBJ;
node->u.runccode.return_register = dst;
node->u.runccode.code_register = code;
node->u.runccode.map = &ins->operands[2 + start];
@@ -3866,6 +3892,7 @@ static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg,
break;
}
case MVM_OP_sp_runnativecall_v:
+ case MVM_OP_sp_runnativecall_u:
case MVM_OP_sp_runnativecall_i: {
int start = (op == MVM_OP_sp_runnativecall_v) ? 0 : 1;
MVMint16 dst = ins->operands[0].reg.orig;
diff --git src/jit/x64/emit.dasc src/jit/x64/emit.dasc
index 9c28814d7..81b3a95b2 100644
--- src/jit/x64/emit.dasc
+++ src/jit/x64/emit.dasc
@@ -709,6 +709,7 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
case MVM_OP_sp_getarg_o:
case MVM_OP_sp_getarg_n:
case MVM_OP_sp_getarg_s:
+ case MVM_OP_sp_getarg_u:
case MVM_OP_sp_getarg_i: {
MVMint32 reg = ins->operands[0].reg.orig;
MVMuint16 idx = ins->operands[1].callsite_idx;
@@ -722,7 +723,9 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
break;
}
case MVM_OP_sp_p6oget_i:
+ case MVM_OP_sp_p6oget_u:
case MVM_OP_sp_p6oget_i32:
+ case MVM_OP_sp_p6oget_u32:
case MVM_OP_sp_p6oget_n:
case MVM_OP_sp_p6oget_s:
case MVM_OP_sp_p6oget_bi:
@@ -821,7 +824,7 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
| callp &MVM_p6bigint_get_int64;
| mov TMP3, RV;
| 6:
- } else if (op == MVM_OP_sp_p6oget_i32) {
+ } else if (op == MVM_OP_sp_p6oget_i32 || op == MVM_OP_sp_p6oget_u32) {
| movsxd TMP3, dword [TMP2];
}
else {
@@ -833,7 +836,9 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
break;
}
case MVM_OP_sp_bind_i64:
+ case MVM_OP_sp_bind_u64:
case MVM_OP_sp_bind_i32:
+ case MVM_OP_sp_bind_u32:
case MVM_OP_sp_bind_n:
case MVM_OP_sp_bind_s:
case MVM_OP_sp_bind_s_nowb:
@@ -862,6 +867,7 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
break;
}
case MVM_OP_sp_get_i64:
+ case MVM_OP_sp_get_u64:
case MVM_OP_sp_get_n:
case MVM_OP_sp_get_s: {
MVMint16 dst = ins->operands[0].reg.orig;
@@ -885,6 +891,7 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
| mov WORK[dst], TMP2;
break;
}
+ case MVM_OP_sp_get_u32:
case MVM_OP_sp_get_i32: {
MVMint16 dst = ins->operands[0].reg.orig;
MVMint16 obj = ins->operands[1].reg.orig;
@@ -918,7 +925,9 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
break;
}
case MVM_OP_sp_p6obind_i:
+ case MVM_OP_sp_p6obind_u:
case MVM_OP_sp_p6obind_i32:
+ case MVM_OP_sp_p6obind_u32:
case MVM_OP_sp_p6obind_n:
case MVM_OP_sp_p6obind_s:
case MVM_OP_sp_p6obind_o: {
@@ -1243,11 +1252,13 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
| mov WORK[dst], rdx;
break;
}
+ case MVM_OP_inc_u:
case MVM_OP_inc_i: {
MVMint32 reg = ins->operands[0].reg.orig;
| add qword WORK[reg], 1;
break;
}
+ case MVM_OP_dec_u:
case MVM_OP_dec_i: {
MVMint32 reg = ins->operands[0].reg.orig;
| sub qword WORK[reg], 1;
@@ -2375,7 +2386,8 @@ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJ
emit_fastcreate(tc, compiler, jg, ins);
| mov aword WORK[dst], RV;
| mov TMP3, WORK[val];
- if (op == MVM_OP_sp_fastbox_i || op == MVM_OP_sp_fastbox_i_ic) {
+ if (op == MVM_OP_sp_fastbox_i || op == MVM_OP_sp_fastbox_i_ic ||
+ op == MVM_OP_sp_fastbox_u || op == MVM_OP_sp_fastbox_u_ic) {
/* Normal integer */
| mov qword [RV+offset], TMP3;
}
diff --git src/profiler/instrument.c src/profiler/instrument.c
index 3c28221fe..7e8e419bc 100644
--- src/profiler/instrument.c
+++ src/profiler/instrument.c
@@ -48,6 +48,7 @@ static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) {
while (ins) {
switch (ins->info->opcode) {
case MVM_OP_return_i:
+ case MVM_OP_return_u:
case MVM_OP_return_n:
case MVM_OP_return_s:
case MVM_OP_return_o:
@@ -145,6 +146,7 @@ static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) {
case MVM_OP_loadbytecode:
case MVM_OP_loadbytecodefh:
case MVM_OP_multidimref_i:
+ case MVM_OP_multidimref_u:
case MVM_OP_multidimref_n:
case MVM_OP_multidimref_s:
case MVM_OP_asyncudp:
@@ -270,15 +272,19 @@ static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) {
case MVM_OP_getlexref_n32:
case MVM_OP_getlexref_s:
case MVM_OP_getlexref_ni:
+ case MVM_OP_getlexref_nu:
case MVM_OP_getlexref_nn:
case MVM_OP_getlexref_ns:
case MVM_OP_atposref_i:
+ case MVM_OP_atposref_u:
case MVM_OP_atposref_n:
case MVM_OP_atposref_s:
case MVM_OP_getattrref_i:
+ case MVM_OP_getattrref_u:
case MVM_OP_getattrref_n:
case MVM_OP_getattrref_s:
case MVM_OP_getattrsref_i:
+ case MVM_OP_getattrsref_u:
case MVM_OP_getattrsref_n:
case MVM_OP_getattrsref_s:
case MVM_OP_nativecallcast:
diff --git src/spesh/args.c src/spesh/args.c
index 1568f034e..990ddff74 100644
--- src/spesh/args.c
+++ src/spesh/args.c
@@ -161,7 +161,7 @@ static void insert_getarg_and_box(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpe
unboxed_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_uint64);
box_op = MVM_OP_box_u;
hlltype_op = MVM_OP_hllboxtype_i;
- fetch_op = MVM_OP_sp_getarg_i;
+ fetch_op = MVM_OP_sp_getarg_u;
break;
case MVM_CALLSITE_ARG_NUM:
unboxed_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_num64);
@@ -480,7 +480,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
if (arg_type != MVM_CALLSITE_ARG_OBJ ||
!cmp_prim_spec(tc, type_tuple, i, MVM_STORAGE_SPEC_BP_UINT64)) {
MVM_spesh_graph_add_comment(tc, g, pos_ins[i],
- "bailed argument spesh: expected arg flag %d to be uint or box a uint; type at position was %s", i, type_tuple && type_tuple[i].type ? MVM_6model_get_debug_name(tc, type_tuple[i].type) : "null type tuple");
+ "bailed argument spesh: expected arg flag %d of type %d to be uint or box a uint; type at position was %s", i, arg_type, type_tuple && type_tuple[i].type ? MVM_6model_get_debug_name(tc, type_tuple[i].type) : "null type tuple");
goto cleanup;
}
break;
@@ -685,7 +685,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
case MVM_OP_param_rp_u:
case MVM_OP_param_op_u:
if (arg_type == MVM_CALLSITE_ARG_UINT) {
- pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i);
+ pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_u);
}
else {
pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_decont_u));
@@ -737,7 +737,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
else if (arg_type == MVM_CALLSITE_ARG_UINT) {
pos_box(tc, g, pos_bb[i], pos_ins[i],
MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_u),
- MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_uint64);
+ MVM_op_get_op(MVM_OP_sp_getarg_u), MVM_reg_uint64);
pos_added[i] += 2;
}
else if (arg_type == MVM_CALLSITE_ARG_NUM) {
@@ -828,7 +828,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
break;
case MVM_OP_param_rn_u:
if (found_flag & MVM_CALLSITE_ARG_UINT) {
- named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i);
+ named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_u);
named_ins[i]->operands[1].lit_i16 = found_idx;
named_used_bit_field |= (MVMuint64)1 << cur_named;
}
@@ -887,7 +887,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
else if (found_flag & MVM_CALLSITE_ARG_UINT)
pos_box(tc, g, named_bb[i], named_ins[i],
MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_u),
- MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_uint64);
+ MVM_op_get_op(MVM_OP_sp_getarg_u), MVM_reg_uint64);
else if (found_flag & MVM_CALLSITE_ARG_NUM)
pos_box(tc, g, named_bb[i], named_ins[i],
MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n),
@@ -933,7 +933,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb);
}
else if (found_flag & MVM_CALLSITE_ARG_UINT) {
- named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i);
+ named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_u);
named_ins[i]->operands[1].lit_i16 = found_idx;
MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i],
named_ins[i]->operands[2].ins_bb);
@@ -1036,7 +1036,7 @@ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs,
else if (found_flag & MVM_CALLSITE_ARG_UINT)
pos_box(tc, g, named_bb[i], named_ins[i],
MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_u),
- MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_uint64);
+ MVM_op_get_op(MVM_OP_sp_getarg_u), MVM_reg_uint64);
else if (found_flag & MVM_CALLSITE_ARG_NUM)
pos_box(tc, g, named_bb[i], named_ins[i],
MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n),
diff --git src/spesh/disp.c src/spesh/disp.c
index fcbf7d2b0..a3dc66c25 100644
--- src/spesh/disp.c
+++ src/spesh/disp.c
@@ -1196,6 +1196,14 @@ static int translate_dispatch_program(MVMThreadContext *tc, MVMSpeshGraph *g,
base_op = MVM_op_get_op(MVM_OP_sp_runnativecall_i);
box_return_value = 1;
break;
+ case MVM_NATIVECALL_ARG_UCHAR:
+ case MVM_NATIVECALL_ARG_USHORT:
+ case MVM_NATIVECALL_ARG_UINT:
+ case MVM_NATIVECALL_ARG_ULONG:
+ case MVM_NATIVECALL_ARG_ULONGLONG:
+ base_op = MVM_op_get_op(MVM_OP_sp_runnativecall_u);
+ box_return_value = 1;
+ break;
}
}
diff --git src/spesh/facts.c src/spesh/facts.c
index 028744338..b35b18df5 100644
--- src/spesh/facts.c
+++ src/spesh/facts.c
@@ -460,8 +460,10 @@ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb,
break;
case MVM_OP_sp_fastcreate:
case MVM_OP_sp_fastbox_i:
+ case MVM_OP_sp_fastbox_u:
case MVM_OP_sp_fastbox_bi:
case MVM_OP_sp_fastbox_i_ic:
+ case MVM_OP_sp_fastbox_u_ic:
case MVM_OP_sp_fastbox_bi_ic:
case MVM_OP_sp_add_I:
case MVM_OP_sp_sub_I:
@@ -649,6 +651,7 @@ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb,
ins->operands[0].reg.orig, ins->operands[0].reg.i,
g->sf->body.cu->body.hll_config->int_lex_ref);
break;
+ case MVM_OP_getlexref_u:
case MVM_OP_getlexref_u32:
case MVM_OP_getlexref_u16:
case MVM_OP_getlexref_u8:
@@ -673,6 +676,12 @@ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb,
ins->operands[0].reg.orig, ins->operands[0].reg.i,
g->sf->body.cu->body.hll_config->int_attr_ref);
break;
+ case MVM_OP_getattrref_u:
+ case MVM_OP_getattrsref_u:
+ create_facts_with_type(tc, g,
+ ins->operands[0].reg.orig, ins->operands[0].reg.i,
+ g->sf->body.cu->body.hll_config->uint_attr_ref);
+ break;
case MVM_OP_getattrref_n:
case MVM_OP_getattrsref_n:
create_facts_with_type(tc, g,
@@ -690,6 +699,11 @@ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb,
ins->operands[0].reg.orig, ins->operands[0].reg.i,
g->sf->body.cu->body.hll_config->int_pos_ref);
break;
+ case MVM_OP_atposref_u:
+ create_facts_with_type(tc, g,
+ ins->operands[0].reg.orig, ins->operands[0].reg.i,
+ g->sf->body.cu->body.hll_config->uint_pos_ref);
+ break;
case MVM_OP_atposref_n:
create_facts_with_type(tc, g,
ins->operands[0].reg.orig, ins->operands[0].reg.i,
diff --git src/spesh/graph.c src/spesh/graph.c
index 697f084de..21a94b5bb 100644
--- src/spesh/graph.c
+++ src/spesh/graph.c
@@ -180,16 +180,19 @@ int MVM_spesh_graph_ins_ends_bb(MVMThreadContext *tc, const MVMOpInfo *info) {
case MVM_OP_sp_dispatch_o:
case MVM_OP_sp_runbytecode_v:
case MVM_OP_sp_runbytecode_i:
+ case MVM_OP_sp_runbytecode_u:
case MVM_OP_sp_runbytecode_n:
case MVM_OP_sp_runbytecode_s:
case MVM_OP_sp_runbytecode_o:
case MVM_OP_sp_runcfunc_v:
case MVM_OP_sp_runcfunc_i:
+ case MVM_OP_sp_runcfunc_u:
case MVM_OP_sp_runcfunc_n:
case MVM_OP_sp_runcfunc_s:
case MVM_OP_sp_runcfunc_o:
case MVM_OP_sp_runnativecall_v:
case MVM_OP_sp_runnativecall_i:
+ case MVM_OP_sp_runnativecall_u:
case MVM_OP_sp_runnativecall_n:
case MVM_OP_sp_runnativecall_s:
case MVM_OP_sp_runnativecall_o:
diff --git src/spesh/inline.c src/spesh/inline.c
index 4743555e7..6f48acdfb 100644
--- src/spesh/inline.c
+++ src/spesh/inline.c
@@ -165,6 +165,7 @@ static int is_graph_inlineable(MVMThreadContext *tc, MVMSpeshGraph *inliner,
* instruction, because we can't uninline in such a case. */
else if (opcode == MVM_OP_sp_getarg_o ||
opcode == MVM_OP_sp_getarg_i ||
+ opcode == MVM_OP_sp_getarg_u ||
opcode == MVM_OP_sp_getarg_n ||
opcode == MVM_OP_sp_getarg_s) {
if (ins->operands[1].lit_i16 >= MAX_ARGS_FOR_OPT) {
@@ -900,6 +901,10 @@ static MVMSpeshBB * merge_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner,
inliner->inlines[total_inlines - 1].res_reg = runbytecode_ins->operands[0].reg.orig;
inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_INT;
break;
+ case MVM_OP_sp_runbytecode_u:
+ inliner->inlines[total_inlines - 1].res_reg = runbytecode_ins->operands[0].reg.orig;
+ inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_UINT;
+ break;
case MVM_OP_sp_runbytecode_n:
inliner->inlines[total_inlines - 1].res_reg = runbytecode_ins->operands[0].reg.orig;
inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_NUM;
@@ -1175,7 +1180,7 @@ static void rewrite_uint_return(MVMThreadContext *tc, MVMSpeshGraph *g,
break;
default:
MVM_oops(tc,
- "Spesh inline: unhandled case (%s) of return_i", runbytecode_ins->info->name);
+ "Spesh inline: unhandled case (%s) of return_u", runbytecode_ins->info->name);
}
}
static void rewrite_num_return(MVMThreadContext *tc, MVMSpeshGraph *g,
@@ -1228,6 +1233,9 @@ static void rewrite_obj_return(MVMThreadContext *tc, MVMSpeshGraph *g,
case MVM_OP_sp_runbytecode_i:
return_to_op(tc, g, return_ins, runbytecode_ins->operands[0], MVM_OP_unbox_i);
break;
+ case MVM_OP_sp_runbytecode_u:
+ return_to_op(tc, g, return_ins, runbytecode_ins->operands[0], MVM_OP_unbox_u);
+ break;
case MVM_OP_sp_runbytecode_n:
return_to_op(tc, g, return_ins, runbytecode_ins->operands[0], MVM_OP_unbox_n);
break;
@@ -1357,6 +1365,7 @@ static void rewrite_args(MVMThreadContext *tc, MVMSpeshGraph *inliner,
switch (opcode) {
case MVM_OP_sp_getarg_o:
case MVM_OP_sp_getarg_i:
+ case MVM_OP_sp_getarg_u:
case MVM_OP_sp_getarg_n:
case MVM_OP_sp_getarg_s: {
MVMuint16 idx = ins->operands[1].lit_i16;
diff --git src/spesh/optimize.c src/spesh/optimize.c
index 4b5c2ef3b..b3c240906 100644
--- src/spesh/optimize.c
+++ src/spesh/optimize.c
@@ -770,6 +770,9 @@ static void optimize_container_check(MVMThreadContext *tc, MVMSpeshGraph *g,
case MVM_STORAGE_SPEC_BP_INT:
known_result = ins->info->opcode == MVM_OP_iscont_i;
break;
+ case MVM_STORAGE_SPEC_BP_UINT64:
+ known_result = ins->info->opcode == MVM_OP_iscont_u;
+ break;
case MVM_STORAGE_SPEC_BP_NUM:
known_result = ins->info->opcode == MVM_OP_iscont_n;
break;
@@ -2095,6 +2098,7 @@ static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshB
optimize_signedness_coerce(tc, g, bb, ins);
break;
case MVM_OP_coerce_in:
+ case MVM_OP_coerce_un:
optimize_coerce(tc, g, bb, ins);
break;
case MVM_OP_islist:
@@ -2144,18 +2148,22 @@ static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshB
case MVM_OP_setelemspos:
case MVM_OP_splice:
case MVM_OP_bindattr_i:
+ case MVM_OP_bindattr_u:
case MVM_OP_bindattr_n:
case MVM_OP_bindattr_s:
case MVM_OP_bindattr_o:
case MVM_OP_bindattrs_i:
+ case MVM_OP_bindattrs_u:
case MVM_OP_bindattrs_n:
case MVM_OP_bindattrs_s:
case MVM_OP_bindattrs_o:
case MVM_OP_assign_i:
+ case MVM_OP_assign_u:
case MVM_OP_assign_n:
optimize_repr_op(tc, g, bb, ins, 0);
break;
case MVM_OP_atpos_i:
+ case MVM_OP_atpos_u:
case MVM_OP_atpos_n:
case MVM_OP_atpos_s:
case MVM_OP_atpos_o:
@@ -2175,10 +2183,12 @@ static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshB
case MVM_OP_existskey:
case MVM_OP_existspos:
case MVM_OP_getattr_i:
+ case MVM_OP_getattr_u:
case MVM_OP_getattr_n:
case MVM_OP_getattr_s:
case MVM_OP_getattr_o:
case MVM_OP_getattrs_i:
+ case MVM_OP_getattrs_u:
case MVM_OP_getattrs_n:
case MVM_OP_getattrs_s:
case MVM_OP_getattrs_o:
@@ -2250,6 +2260,7 @@ static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshB
case MVM_OP_iscont:
case MVM_OP_isrwcont:
case MVM_OP_iscont_i:
+ case MVM_OP_iscont_u:
case MVM_OP_iscont_n:
case MVM_OP_iscont_s:
optimize_container_check(tc, g, bb, ins);
@@ -2571,7 +2582,7 @@ static void walk_set_looking_for_unbool(MVMThreadContext *tc, MVMSpeshGraph *g,
const MVMOpInfo *opinfo = user->info;
MVMuint16 opcode = opinfo->opcode;
- if (opcode == MVM_OP_sp_runcfunc_i) {
+ if (opcode == MVM_OP_sp_runcfunc_i || opcode == MVM_OP_sp_runcfunc_u) {
MVMSpeshFacts *dispatch_facts = MVM_spesh_get_facts(tc, g, user->operands[1]);
if (is_syscall(tc, dispatch_facts, MVM_disp_syscall_boolify_boxed_int_impl))
try_eliminate_one_box_unbox(tc, g, bb, box_ins, user);
@@ -2590,7 +2601,7 @@ static void try_eliminate_bool_unbool_pair(MVMThreadContext *tc, MVMSpeshGraph *
const MVMOpInfo *opinfo = user->info;
MVMuint16 opcode = opinfo->opcode;
- if (opcode == MVM_OP_sp_runcfunc_i) {
+ if (opcode == MVM_OP_sp_runcfunc_i || opcode == MVM_OP_sp_runcfunc_u) {
MVMSpeshFacts *dispatch_facts = MVM_spesh_get_facts(tc, g, user->operands[1]);
if (is_syscall(tc, dispatch_facts, MVM_disp_syscall_boolify_boxed_int_impl))
try_eliminate_one_box_unbox(tc, g, bb, ins, user);
diff --git src/spesh/pea.c src/spesh/pea.c
index 401801775..0211a10a8 100644
--- src/spesh/pea.c
+++ src/spesh/pea.c
@@ -220,6 +220,7 @@ static void apply_transform(MVMThreadContext *tc, MVMSpeshGraph *g, GraphState *
ins->info = MVM_op_get_op(MVM_OP_null);
break;
case MVM_OP_sp_p6oget_i:
+ case MVM_OP_sp_p6oget_u:
ins->info = MVM_op_get_op(MVM_OP_const_i64_16);
ins->operands[1].lit_i16 = 0;
break;
@@ -583,11 +584,13 @@ static MVMuint32 analyze(MVMThreadContext *tc, MVMSpeshGraph *g, GraphState *gs)
break;
}
case MVM_OP_sp_bind_i64:
+ case MVM_OP_sp_bind_u64:
case MVM_OP_sp_bind_n:
case MVM_OP_sp_bind_s:
case MVM_OP_sp_bind_s_nowb:
case MVM_OP_sp_bind_o:
case MVM_OP_sp_p6obind_i:
+ case MVM_OP_sp_p6obind_u:
case MVM_OP_sp_p6obind_n:
case MVM_OP_sp_p6obind_s:
case MVM_OP_sp_p6obind_o: {
@@ -597,6 +600,7 @@ static MVMuint32 analyze(MVMThreadContext *tc, MVMSpeshGraph *g, GraphState *gs)
MVMSpeshPEAAllocation *alloc = target->pea.allocation;
if (allocation_tracked(alloc)) {
MVMint32 is_p6o_op = opcode == MVM_OP_sp_p6obind_i ||
+ opcode == MVM_OP_sp_p6obind_u ||
opcode == MVM_OP_sp_p6obind_n ||
opcode == MVM_OP_sp_p6obind_s ||
opcode == MVM_OP_sp_p6obind_o;
@@ -627,6 +631,7 @@ static MVMuint32 analyze(MVMThreadContext *tc, MVMSpeshGraph *g, GraphState *gs)
break;
}
case MVM_OP_sp_p6oget_i:
+ case MVM_OP_sp_p6oget_u:
case MVM_OP_sp_p6oget_n:
case MVM_OP_sp_p6oget_s:
case MVM_OP_sp_p6oget_o:
diff --git tools/check-roots.py tools/check-roots.py
index a30a08e7d..00bb31019 100644
--- tools/check-roots.py
+++ tools/check-roots.py
@@ -75,6 +75,7 @@ allocators = [
'MVM_args_assert_void_return_ok',
'MVM_args_bind_failed',
'MVM_args_set_result_int',
+'MVM_args_set_result_uint',
'MVM_args_set_result_num',
'MVM_args_set_result_obj',
'MVM_args_set_result_str',
@@ -179,18 +180,23 @@ allocators = [
'MVM_nativecall_invoke',
'MVM_nativecall_jit_graph_for_caller_code',
'MVM_nativeref_attr_i',
+'MVM_nativeref_attr_u',
'MVM_nativeref_attr_n',
'MVM_nativeref_attr_s',
'MVM_nativeref_lex_i',
+'MVM_nativeref_lex_u',
'MVM_nativeref_lex_n',
'MVM_nativeref_lex_name_i',
+'MVM_nativeref_lex_name_u',
'MVM_nativeref_lex_name_n',
'MVM_nativeref_lex_name_s',
'MVM_nativeref_lex_s',
'MVM_nativeref_multidim_i',
+'MVM_nativeref_multidim_u',
'MVM_nativeref_multidim_n',
'MVM_nativeref_multidim_s',
'MVM_nativeref_pos_i',
+'MVM_nativeref_pos_u',
'MVM_nativeref_pos_n',
'MVM_nativeref_pos_s',
'MVM_proc_getenvhash',
@@ -388,6 +394,7 @@ allocators = [
'MVM_args_bind_failed',
'MVM_args_save_capture',
'MVM_args_set_result_int',
+'MVM_args_set_result_uint',
'MVM_args_set_result_num',
'MVM_args_set_result_str',
'MVM_args_use_capture',
@@ -492,6 +499,8 @@ allocators = [
'at_pos',
'boot_typed_array',
'box_i',
+'box_u',
+'box_n',
'box_s',
'call_resolver',
'callback_handler',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment