Skip to content

Commit 75fb7cc

Browse files
committed
8259228: Zero: rewrite (put|get)field from if-else chains to switches
Reviewed-by: aph, coleenp
1 parent 9730266 commit 75fb7cc

File tree

1 file changed

+132
-78
lines changed

1 file changed

+132
-78
lines changed

src/hotspot/share/interpreter/zero/bytecodeInterpreter.cpp

Lines changed: 132 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1636,46 +1636,74 @@ void BytecodeInterpreter::run(interpreterState istate) {
16361636
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
16371637
OrderAccess::fence();
16381638
}
1639-
if (tos_type == atos) {
1640-
VERIFY_OOP(obj->obj_field_acquire(field_offset));
1641-
SET_STACK_OBJECT(obj->obj_field_acquire(field_offset), -1);
1642-
} else if (tos_type == itos) {
1643-
SET_STACK_INT(obj->int_field_acquire(field_offset), -1);
1644-
} else if (tos_type == ltos) {
1645-
SET_STACK_LONG(obj->long_field_acquire(field_offset), 0);
1646-
MORE_STACK(1);
1647-
} else if (tos_type == btos || tos_type == ztos) {
1648-
SET_STACK_INT(obj->byte_field_acquire(field_offset), -1);
1649-
} else if (tos_type == ctos) {
1650-
SET_STACK_INT(obj->char_field_acquire(field_offset), -1);
1651-
} else if (tos_type == stos) {
1652-
SET_STACK_INT(obj->short_field_acquire(field_offset), -1);
1653-
} else if (tos_type == ftos) {
1654-
SET_STACK_FLOAT(obj->float_field_acquire(field_offset), -1);
1655-
} else {
1656-
SET_STACK_DOUBLE(obj->double_field_acquire(field_offset), 0);
1657-
MORE_STACK(1);
1639+
switch (tos_type) {
1640+
case btos:
1641+
case ztos:
1642+
SET_STACK_INT(obj->byte_field_acquire(field_offset), -1);
1643+
break;
1644+
case ctos:
1645+
SET_STACK_INT(obj->char_field_acquire(field_offset), -1);
1646+
break;
1647+
case stos:
1648+
SET_STACK_INT(obj->short_field_acquire(field_offset), -1);
1649+
break;
1650+
case itos:
1651+
SET_STACK_INT(obj->int_field_acquire(field_offset), -1);
1652+
break;
1653+
case ftos:
1654+
SET_STACK_FLOAT(obj->float_field_acquire(field_offset), -1);
1655+
break;
1656+
case ltos:
1657+
SET_STACK_LONG(obj->long_field_acquire(field_offset), 0);
1658+
MORE_STACK(1);
1659+
break;
1660+
case dtos:
1661+
SET_STACK_DOUBLE(obj->double_field_acquire(field_offset), 0);
1662+
MORE_STACK(1);
1663+
break;
1664+
case atos: {
1665+
oop val = obj->obj_field_acquire(field_offset);
1666+
VERIFY_OOP(val);
1667+
SET_STACK_OBJECT(val, -1);
1668+
break;
1669+
}
1670+
default:
1671+
ShouldNotReachHere();
16581672
}
16591673
} else {
1660-
if (tos_type == atos) {
1661-
VERIFY_OOP(obj->obj_field(field_offset));
1662-
SET_STACK_OBJECT(obj->obj_field(field_offset), -1);
1663-
} else if (tos_type == itos) {
1664-
SET_STACK_INT(obj->int_field(field_offset), -1);
1665-
} else if (tos_type == ltos) {
1666-
SET_STACK_LONG(obj->long_field(field_offset), 0);
1667-
MORE_STACK(1);
1668-
} else if (tos_type == btos || tos_type == ztos) {
1669-
SET_STACK_INT(obj->byte_field(field_offset), -1);
1670-
} else if (tos_type == ctos) {
1671-
SET_STACK_INT(obj->char_field(field_offset), -1);
1672-
} else if (tos_type == stos) {
1673-
SET_STACK_INT(obj->short_field(field_offset), -1);
1674-
} else if (tos_type == ftos) {
1675-
SET_STACK_FLOAT(obj->float_field(field_offset), -1);
1676-
} else {
1677-
SET_STACK_DOUBLE(obj->double_field(field_offset), 0);
1678-
MORE_STACK(1);
1674+
switch (tos_type) {
1675+
case btos:
1676+
case ztos:
1677+
SET_STACK_INT(obj->byte_field(field_offset), -1);
1678+
break;
1679+
case ctos:
1680+
SET_STACK_INT(obj->char_field(field_offset), -1);
1681+
break;
1682+
case stos:
1683+
SET_STACK_INT(obj->short_field(field_offset), -1);
1684+
break;
1685+
case itos:
1686+
SET_STACK_INT(obj->int_field(field_offset), -1);
1687+
break;
1688+
case ftos:
1689+
SET_STACK_FLOAT(obj->float_field(field_offset), -1);
1690+
break;
1691+
case ltos:
1692+
SET_STACK_LONG(obj->long_field(field_offset), 0);
1693+
MORE_STACK(1);
1694+
break;
1695+
case dtos:
1696+
SET_STACK_DOUBLE(obj->double_field(field_offset), 0);
1697+
MORE_STACK(1);
1698+
break;
1699+
case atos: {
1700+
oop val = obj->obj_field(field_offset);
1701+
VERIFY_OOP(val);
1702+
SET_STACK_OBJECT(val, -1);
1703+
break;
1704+
}
1705+
default:
1706+
ShouldNotReachHere();
16791707
}
16801708
}
16811709

@@ -1745,49 +1773,75 @@ void BytecodeInterpreter::run(interpreterState istate) {
17451773
//
17461774
int field_offset = cache->f2_as_index();
17471775
if (cache->is_volatile()) {
1748-
if (tos_type == itos) {
1749-
obj->release_int_field_put(field_offset, STACK_INT(-1));
1750-
} else if (tos_type == atos) {
1751-
VERIFY_OOP(STACK_OBJECT(-1));
1752-
obj->release_obj_field_put(field_offset, STACK_OBJECT(-1));
1753-
} else if (tos_type == btos) {
1754-
obj->release_byte_field_put(field_offset, STACK_INT(-1));
1755-
} else if (tos_type == ztos) {
1756-
int bool_field = STACK_INT(-1); // only store LSB
1757-
obj->release_byte_field_put(field_offset, (bool_field & 1));
1758-
} else if (tos_type == ltos) {
1759-
obj->release_long_field_put(field_offset, STACK_LONG(-1));
1760-
} else if (tos_type == ctos) {
1761-
obj->release_char_field_put(field_offset, STACK_INT(-1));
1762-
} else if (tos_type == stos) {
1763-
obj->release_short_field_put(field_offset, STACK_INT(-1));
1764-
} else if (tos_type == ftos) {
1765-
obj->release_float_field_put(field_offset, STACK_FLOAT(-1));
1766-
} else {
1767-
obj->release_double_field_put(field_offset, STACK_DOUBLE(-1));
1776+
switch (tos_type) {
1777+
case ztos:
1778+
obj->release_byte_field_put(field_offset, (STACK_INT(-1) & 1)); // only store LSB
1779+
break;
1780+
case btos:
1781+
obj->release_byte_field_put(field_offset, STACK_INT(-1));
1782+
break;
1783+
case ctos:
1784+
obj->release_char_field_put(field_offset, STACK_INT(-1));
1785+
break;
1786+
case stos:
1787+
obj->release_short_field_put(field_offset, STACK_INT(-1));
1788+
break;
1789+
case itos:
1790+
obj->release_int_field_put(field_offset, STACK_INT(-1));
1791+
break;
1792+
case ftos:
1793+
obj->release_float_field_put(field_offset, STACK_FLOAT(-1));
1794+
break;
1795+
case ltos:
1796+
obj->release_long_field_put(field_offset, STACK_LONG(-1));
1797+
break;
1798+
case dtos:
1799+
obj->release_double_field_put(field_offset, STACK_DOUBLE(-1));
1800+
break;
1801+
case atos: {
1802+
oop val = STACK_OBJECT(-1);
1803+
VERIFY_OOP(val);
1804+
obj->release_obj_field_put(field_offset, val);
1805+
break;
1806+
}
1807+
default:
1808+
ShouldNotReachHere();
17681809
}
17691810
OrderAccess::storeload();
17701811
} else {
1771-
if (tos_type == itos) {
1772-
obj->int_field_put(field_offset, STACK_INT(-1));
1773-
} else if (tos_type == atos) {
1774-
VERIFY_OOP(STACK_OBJECT(-1));
1775-
obj->obj_field_put(field_offset, STACK_OBJECT(-1));
1776-
} else if (tos_type == btos) {
1777-
obj->byte_field_put(field_offset, STACK_INT(-1));
1778-
} else if (tos_type == ztos) {
1779-
int bool_field = STACK_INT(-1); // only store LSB
1780-
obj->byte_field_put(field_offset, (bool_field & 1));
1781-
} else if (tos_type == ltos) {
1782-
obj->long_field_put(field_offset, STACK_LONG(-1));
1783-
} else if (tos_type == ctos) {
1784-
obj->char_field_put(field_offset, STACK_INT(-1));
1785-
} else if (tos_type == stos) {
1786-
obj->short_field_put(field_offset, STACK_INT(-1));
1787-
} else if (tos_type == ftos) {
1788-
obj->float_field_put(field_offset, STACK_FLOAT(-1));
1789-
} else {
1790-
obj->double_field_put(field_offset, STACK_DOUBLE(-1));
1812+
switch (tos_type) {
1813+
case ztos:
1814+
obj->byte_field_put(field_offset, (STACK_INT(-1) & 1)); // only store LSB
1815+
break;
1816+
case btos:
1817+
obj->byte_field_put(field_offset, STACK_INT(-1));
1818+
break;
1819+
case ctos:
1820+
obj->char_field_put(field_offset, STACK_INT(-1));
1821+
break;
1822+
case stos:
1823+
obj->short_field_put(field_offset, STACK_INT(-1));
1824+
break;
1825+
case itos:
1826+
obj->int_field_put(field_offset, STACK_INT(-1));
1827+
break;
1828+
case ftos:
1829+
obj->float_field_put(field_offset, STACK_FLOAT(-1));
1830+
break;
1831+
case ltos:
1832+
obj->long_field_put(field_offset, STACK_LONG(-1));
1833+
break;
1834+
case dtos:
1835+
obj->double_field_put(field_offset, STACK_DOUBLE(-1));
1836+
break;
1837+
case atos: {
1838+
oop val = STACK_OBJECT(-1);
1839+
VERIFY_OOP(val);
1840+
obj->obj_field_put(field_offset, val);
1841+
break;
1842+
}
1843+
default:
1844+
ShouldNotReachHere();
17911845
}
17921846
}
17931847

0 commit comments

Comments
 (0)