Mercurial > hg > truffle
comparison graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java @ 20149:b1a8928fc4b9
[SPARC] Implement new instructions in assembler/enhance assertion error-message in MoveResolver
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Thu, 02 Apr 2015 18:45:28 +0200 |
parents | 422e60a2f4b9 |
children | d3b276db28b8 |
comparison
equal
deleted
inserted
replaced
20144:921eeb012866 | 20149:b1a8928fc4b9 |
---|---|
27 import static com.oracle.graal.asm.sparc.SPARCAssembler.Op.*; | 27 import static com.oracle.graal.asm.sparc.SPARCAssembler.Op.*; |
28 import static com.oracle.graal.asm.sparc.SPARCAssembler.Op3s.*; | 28 import static com.oracle.graal.asm.sparc.SPARCAssembler.Op3s.*; |
29 import static com.oracle.graal.asm.sparc.SPARCAssembler.Opfs.*; | 29 import static com.oracle.graal.asm.sparc.SPARCAssembler.Opfs.*; |
30 import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; | 30 import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; |
31 import static com.oracle.graal.sparc.SPARC.*; | 31 import static com.oracle.graal.sparc.SPARC.*; |
32 import static java.lang.String.*; | |
32 | 33 |
33 import com.oracle.graal.api.code.*; | 34 import com.oracle.graal.api.code.*; |
34 import com.oracle.graal.api.meta.*; | 35 import com.oracle.graal.api.meta.*; |
35 import com.oracle.graal.asm.*; | 36 import com.oracle.graal.asm.*; |
36 import com.oracle.graal.compiler.common.*; | 37 import com.oracle.graal.compiler.common.*; |
259 Rd (0b10_1000, "rd", Op10), | 260 Rd (0b10_1000, "rd", Op10), |
260 Wr (0b11_0000, "wr", Op10), | 261 Wr (0b11_0000, "wr", Op10), |
261 Fcmp (0b11_0101, "fcmp", Op10), | 262 Fcmp (0b11_0101, "fcmp", Op10), |
262 | 263 |
263 Ldxa (0b01_1011, "ldxa", Op11), | 264 Ldxa (0b01_1011, "ldxa", Op11), |
264 Lduwa (0b01_0000, "lduwa", Op11); | 265 Lduwa (0b01_0000, "lduwa", Op11), |
266 | |
267 Tcc(0b11_1010, "tcc", Op10); | |
265 | 268 |
266 // @formatter:on | 269 // @formatter:on |
267 | 270 |
268 private final int value; | 271 private final int value; |
269 private final String operator; | 272 private final String operator; |
1096 assert isSimm(rs2, 5); | 1099 assert isSimm(rs2, 5); |
1097 cbcond(1, 1, cf, rs1, rs2 & ((1 << 5) - 1), lab); | 1100 cbcond(1, 1, cf, rs1, rs2 & ((1 << 5) - 1), lab); |
1098 } | 1101 } |
1099 | 1102 |
1100 private void cbcond(int cc2, int i, ConditionFlag cf, Register rs1, int rs2, Label l) { | 1103 private void cbcond(int cc2, int i, ConditionFlag cf, Register rs1, int rs2, Label l) { |
1101 int d10 = !l.isBound() ? patchUnbound(l) : (l.position() - position()) / 4; | 1104 int disp10 = !l.isBound() ? patchUnbound(l) : (l.position() - position()) / 4; |
1102 assert isSimm(d10, 10) && isImm(rs2, 5); | 1105 assert isSimm(disp10, 10) && isImm(rs2, 5); |
1103 d10 &= (1 << 10) - 1; | 1106 disp10 &= (1 << 10) - 1; |
1104 final int cLo = cf.value & 0b111; | 1107 final int cLo = cf.value & 0b111; |
1105 final int cHi = cf.value >> 3; | 1108 final int cHi = cf.value >> 3; |
1106 final int d10Lo = d10 & ((1 << 8) - 1); | 1109 final int d10Lo = disp10 & ((1 << 8) - 1); |
1107 final int d10Hi = d10 >> 8; | 1110 final int d10Hi = disp10 >> 8; |
1108 int a = cHi << 4 | 0b1000 | cLo; | 1111 int a = cHi << 4 | 0b1000 | cLo; |
1109 int b = cc2 << 21 | d10Hi << D10HI_SHIFT | rs1.encoding << 14 | i << 13 | d10Lo << D10LO_SHIFT | rs2; | 1112 int b = cc2 << 21 | d10Hi << D10HI_SHIFT | rs1.encoding << 14 | i << 13 | d10Lo << D10LO_SHIFT | rs2; |
1110 fmt00(a, Op2s.Bpr.value, b); | 1113 fmt00(a, Op2s.Bpr.value, b); |
1111 } | 1114 } |
1112 | 1115 |
1198 public void andncc(Register rs1, int simm13, Register rd) { | 1201 public void andncc(Register rs1, int simm13, Register rd) { |
1199 op3(Andncc, rs1, simm13, rd); | 1202 op3(Andncc, rs1, simm13, rd); |
1200 } | 1203 } |
1201 | 1204 |
1202 public void movwtos(Register rs2, Register rd) { | 1205 public void movwtos(Register rs2, Register rd) { |
1206 assert isSingleFloatRegister(rd) && isCPURegister(rs2) : String.format("%s %s", rs2, rd); | |
1203 op3(Impdep1, Movwtos, null, rs2, rd); | 1207 op3(Impdep1, Movwtos, null, rs2, rd); |
1204 } | 1208 } |
1205 | 1209 |
1206 public void umulxhi(Register rs1, Register rs2, Register rd) { | 1210 public void umulxhi(Register rs1, Register rs2, Register rd) { |
1207 op3(Impdep1, UMulxhi, rs1, rs2, rd); | 1211 op3(Impdep1, UMulxhi, rs1, rs2, rd); |
1208 } | 1212 } |
1209 | 1213 |
1210 public void fdtos(Register rs2, Register rd) { | 1214 public void fdtos(Register rs2, Register rd) { |
1215 assert isSingleFloatRegister(rd) && isDoubleFloatRegister(rs2) : String.format("%s %s", rs2, rd); | |
1211 op3(Fpop1, Fdtos, null, rs2, rd); | 1216 op3(Fpop1, Fdtos, null, rs2, rd); |
1212 } | 1217 } |
1213 | 1218 |
1214 public void movstouw(Register rs2, Register rd) { | 1219 public void movstouw(Register rs2, Register rd) { |
1220 assert isSingleFloatRegister(rs2) && isCPURegister(rd) : String.format("%s %s", rs2, rd); | |
1215 op3(Impdep1, Movstosw, null, rs2, rd); | 1221 op3(Impdep1, Movstosw, null, rs2, rd); |
1216 } | 1222 } |
1217 | 1223 |
1218 public void movstosw(Register rs2, Register rd) { | 1224 public void movstosw(Register rs2, Register rd) { |
1225 assert isSingleFloatRegister(rs2) && isCPURegister(rd) : String.format("%s %s", rs2, rd); | |
1219 op3(Impdep1, Movstosw, null, rs2, rd); | 1226 op3(Impdep1, Movstosw, null, rs2, rd); |
1220 } | 1227 } |
1221 | 1228 |
1222 public void movdtox(Register rs2, Register rd) { | 1229 public void movdtox(Register rs2, Register rd) { |
1230 assert isDoubleFloatRegister(rs2) && isCPURegister(rd) : String.format("%s %s", rs2, rd); | |
1223 op3(Impdep1, Movdtox, null, rs2, rd); | 1231 op3(Impdep1, Movdtox, null, rs2, rd); |
1224 } | 1232 } |
1225 | 1233 |
1226 public void movxtod(Register rs2, Register rd) { | 1234 public void movxtod(Register rs2, Register rd) { |
1235 assert isCPURegister(rs2) && isDoubleFloatRegister(rd) : String.format("%s %s", rs2, rd); | |
1227 op3(Impdep1, Movxtod, null, rs2, rd); | 1236 op3(Impdep1, Movxtod, null, rs2, rd); |
1228 } | 1237 } |
1229 | 1238 |
1230 public void fadds(Register rs1, Register rs2, Register rd) { | 1239 public void fadds(Register rs1, Register rs2, Register rd) { |
1231 op3(Fpop1, Fadds, rs1, rs2, rd); | 1240 op3(Fpop1, Fadds, rs1, rs2, rd); |
1454 public void mulx(Register rs1, int simm13, Register rd) { | 1463 public void mulx(Register rs1, int simm13, Register rd) { |
1455 op3(Mulx, rs1, simm13, rd); | 1464 op3(Mulx, rs1, simm13, rd); |
1456 } | 1465 } |
1457 | 1466 |
1458 public void or(Register rs1, Register rs2, Register rd) { | 1467 public void or(Register rs1, Register rs2, Register rd) { |
1468 assert isCPURegister(rs1, rs2, rd) : String.format("%s %s %s", rs1, rs2, rd); | |
1459 op3(Or, rs1, rs2, rd); | 1469 op3(Or, rs1, rs2, rd); |
1460 } | 1470 } |
1461 | 1471 |
1462 public void or(Register rs1, int simm13, Register rd) { | 1472 public void or(Register rs1, int simm13, Register rd) { |
1473 assert isCPURegister(rs1, rd) : String.format("%s %s", rs1, rd); | |
1463 op3(Or, rs1, simm13, rd); | 1474 op3(Or, rs1, simm13, rd); |
1464 } | 1475 } |
1465 | 1476 |
1466 public void popc(Register rs2, Register rd) { | 1477 public void popc(Register rs2, Register rd) { |
1467 op3(Popc, g0, rs2, rd); | 1478 op3(Popc, g0, rs2, rd); |
1596 } | 1607 } |
1597 | 1608 |
1598 public void tcc(CC cc, ConditionFlag flag, int trap) { | 1609 public void tcc(CC cc, ConditionFlag flag, int trap) { |
1599 assert isImm(trap, 8); | 1610 assert isImm(trap, 8); |
1600 int b = cc.value << 11; | 1611 int b = cc.value << 11; |
1612 b |= 1 << 13; | |
1601 b |= trap; | 1613 b |= trap; |
1602 fmt10(flag.value, trap, 0, b); | 1614 fmt10(flag.value, Op3s.Tcc.getValue(), 0, b); |
1603 } | 1615 } |
1604 | 1616 |
1605 public void wrccr(Register rs1, Register rs2) { | 1617 public void wrccr(Register rs1, Register rs2) { |
1606 op3(Wr, rs1, rs2, r2); | 1618 op3(Wr, rs1, rs2, r2); |
1607 } | 1619 } |
1657 protected void ld(Op3s op3, SPARCAddress addr, Register rd) { | 1669 protected void ld(Op3s op3, SPARCAddress addr, Register rd) { |
1658 ld(op3, addr, rd, null); | 1670 ld(op3, addr, rd, null); |
1659 } | 1671 } |
1660 | 1672 |
1661 public void lddf(SPARCAddress src, Register dst) { | 1673 public void lddf(SPARCAddress src, Register dst) { |
1674 assert isDoubleFloatRegister(dst) : dst; | |
1662 ld(Lddf, src, dst); | 1675 ld(Lddf, src, dst); |
1663 } | 1676 } |
1664 | 1677 |
1665 public void ldf(SPARCAddress src, Register dst) { | 1678 public void ldf(SPARCAddress src, Register dst) { |
1679 assert isSingleFloatRegister(dst) : dst; | |
1666 ld(Ldf, src, dst); | 1680 ld(Ldf, src, dst); |
1667 } | 1681 } |
1668 | 1682 |
1669 public void lduh(SPARCAddress src, Register dst) { | 1683 public void lduh(SPARCAddress src, Register dst) { |
1684 assert isCPURegister(dst) : dst; | |
1670 ld(Lduh, src, dst); | 1685 ld(Lduh, src, dst); |
1671 } | 1686 } |
1672 | 1687 |
1673 public void ldsh(SPARCAddress src, Register dst) { | 1688 public void ldsh(SPARCAddress src, Register dst) { |
1689 assert isCPURegister(dst) : dst; | |
1674 ld(Ldsh, src, dst); | 1690 ld(Ldsh, src, dst); |
1675 } | 1691 } |
1676 | 1692 |
1677 public void ldub(SPARCAddress src, Register dst) { | 1693 public void ldub(SPARCAddress src, Register dst) { |
1694 assert isCPURegister(dst) : dst; | |
1678 ld(Ldub, src, dst); | 1695 ld(Ldub, src, dst); |
1679 } | 1696 } |
1680 | 1697 |
1681 public void ldsb(SPARCAddress src, Register dst) { | 1698 public void ldsb(SPARCAddress src, Register dst) { |
1699 assert isCPURegister(dst) : dst; | |
1682 ld(Ldsb, src, dst); | 1700 ld(Ldsb, src, dst); |
1683 } | 1701 } |
1684 | 1702 |
1685 public void lduw(SPARCAddress src, Register dst) { | 1703 public void lduw(SPARCAddress src, Register dst) { |
1704 assert isCPURegister(dst) : dst; | |
1686 ld(Lduw, src, dst); | 1705 ld(Lduw, src, dst); |
1687 } | 1706 } |
1688 | 1707 |
1689 public void ldsw(SPARCAddress src, Register dst) { | 1708 public void ldsw(SPARCAddress src, Register dst) { |
1709 assert isCPURegister(dst) : dst; | |
1690 ld(Ldsw, src, dst); | 1710 ld(Ldsw, src, dst); |
1691 } | 1711 } |
1692 | 1712 |
1693 public void ldx(SPARCAddress src, Register dst) { | 1713 public void ldx(SPARCAddress src, Register dst) { |
1714 assert isCPURegister(dst) : dst; | |
1694 ld(Ldx, src, dst); | 1715 ld(Ldx, src, dst); |
1695 } | 1716 } |
1696 | 1717 |
1697 public void ldxa(Register rs1, Register rs2, Register rd, Asi asi) { | 1718 public void ldxa(Register rs1, Register rs2, Register rd, Asi asi) { |
1719 assert SPARC.isCPURegister(rs1, rs2, rd) : format("%s %s %s", rs1, rs2, rd); | |
1698 ld(Ldxa, new SPARCAddress(rs1, rs2), rd, asi); | 1720 ld(Ldxa, new SPARCAddress(rs1, rs2), rd, asi); |
1699 } | 1721 } |
1700 | 1722 |
1701 public void lduwa(Register rs1, Register rs2, Register rd, Asi asi) { | 1723 public void lduwa(Register rs1, Register rs2, Register rd, Asi asi) { |
1724 assert SPARC.isCPURegister(rs1, rs2, rd) : format("%s %s %s", rs1, rs2, rd); | |
1702 ld(Lduwa, new SPARCAddress(rs1, rs2), rd, asi); | 1725 ld(Lduwa, new SPARCAddress(rs1, rs2), rd, asi); |
1703 } | 1726 } |
1704 | 1727 |
1705 protected void st(Op3s op3, Register rs1, SPARCAddress dest) { | 1728 protected void st(Op3s op3, Register rs1, SPARCAddress dest) { |
1706 ld(op3, dest, rs1); | 1729 ld(op3, dest, rs1); |
1707 } | 1730 } |
1708 | 1731 |
1709 public void stdf(Register rd, SPARCAddress addr) { | 1732 public void stdf(Register rd, SPARCAddress addr) { |
1733 assert isDoubleFloatRegister(rd) : rd; | |
1710 st(Stdf, rd, addr); | 1734 st(Stdf, rd, addr); |
1711 } | 1735 } |
1712 | 1736 |
1713 public void stf(Register rd, SPARCAddress addr) { | 1737 public void stf(Register rd, SPARCAddress addr) { |
1738 assert isSingleFloatRegister(rd) : rd; | |
1714 st(Stf, rd, addr); | 1739 st(Stf, rd, addr); |
1715 } | 1740 } |
1716 | 1741 |
1717 public void stb(Register rd, SPARCAddress addr) { | 1742 public void stb(Register rd, SPARCAddress addr) { |
1743 assert isCPURegister(rd) : rd; | |
1718 st(Stb, rd, addr); | 1744 st(Stb, rd, addr); |
1719 } | 1745 } |
1720 | 1746 |
1721 public void sth(Register rd, SPARCAddress addr) { | 1747 public void sth(Register rd, SPARCAddress addr) { |
1748 assert isCPURegister(rd) : rd; | |
1722 st(Sth, rd, addr); | 1749 st(Sth, rd, addr); |
1723 } | 1750 } |
1724 | 1751 |
1725 public void stw(Register rd, SPARCAddress addr) { | 1752 public void stw(Register rd, SPARCAddress addr) { |
1753 assert isCPURegister(rd) : rd; | |
1726 st(Stw, rd, addr); | 1754 st(Stw, rd, addr); |
1727 } | 1755 } |
1728 | 1756 |
1729 public void stx(Register rd, SPARCAddress addr) { | 1757 public void stx(Register rd, SPARCAddress addr) { |
1758 assert isCPURegister(rd) : rd; | |
1730 st(Stx, rd, addr); | 1759 st(Stx, rd, addr); |
1731 } | 1760 } |
1732 | 1761 |
1733 public void membar(int barriers) { | 1762 public void membar(int barriers) { |
1734 op3(Membar, r15, barriers, g0); | 1763 op3(Membar, r15, barriers, g0); |
1755 assert (inst & (1 << 13)) != 0 : String.format("0x%x", inst); | 1784 assert (inst & (1 << 13)) != 0 : String.format("0x%x", inst); |
1756 inst = inst & (~((1 << 13) - 1)); | 1785 inst = inst & (~((1 << 13) - 1)); |
1757 inst |= simm13 & ((1 << 12) - 1); | 1786 inst |= simm13 & ((1 << 12) - 1); |
1758 emitInt(inst, position); | 1787 emitInt(inst, position); |
1759 } | 1788 } |
1789 | |
1790 public void fpadd32(Register rs1, Register rs2, Register rd) { | |
1791 op3(Impdep1, Fpadd32, rs1, rs2, rd); | |
1792 } | |
1760 } | 1793 } |