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 }