Mercurial > hg > graal-compiler
changeset 22408:fe430002c001
[SPARC] Assembler: ld/st with size parameter
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Wed, 05 Aug 2015 11:54:04 +0200 |
parents | 92ead19b1c4a |
children | 9f4aa375fd5b |
files | graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java |
diffstat | 1 files changed, 58 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Wed Aug 05 01:03:28 2015 +0200 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Wed Aug 05 11:54:04 2015 +0200 @@ -1513,7 +1513,7 @@ } protected void op3(Op3s op3, Register rs1, int simm13, Register rd) { - assert isSimm13(simm13); + assert isSimm13(simm13) : simm13; int i = 1 << 13; int simm13WithX = simm13 | getXBit(op3); fmt(op3.op.value, rd.encoding, op3.value, rs1.encoding, i | simm13WithX & ((1 << 13) - 1)); @@ -2301,40 +2301,75 @@ } public void ld(SPARCAddress src, Register dst, int bytes, boolean signed) { - if (signed) { + if (SPARC.isCPURegister(dst)) { + if (signed) { + switch (bytes) { + case 1: + ldub(src, dst); + break; + case 2: + lduh(src, dst); + break; + case 4: + lduw(src, dst); + break; + case 8: + ldx(src, dst); + break; + default: + throw new InternalError(); + } + } else { + switch (bytes) { + case 1: + ldsb(src, dst); + break; + case 2: + ldsh(src, dst); + break; + case 4: + ldsw(src, dst); + break; + case 8: + ldx(src, dst); + break; + default: + throw new InternalError(); + } + } + } else if (SPARC.isDoubleFloatRegister(dst) && bytes == 8) { + lddf(src, dst); + } else if (SPARC.isSingleFloatRegister(dst) && bytes == 4) { + ldf(src, dst); + } else { + throw new InternalError(); + } + } + + public void st(Register src, SPARCAddress dst, int bytes) { + if (SPARC.isCPURegister(src)) { switch (bytes) { case 1: - ldub(src, dst); + stb(src, dst); break; case 2: - lduh(src, dst); + sth(src, dst); break; case 4: - lduw(src, dst); + stw(src, dst); break; case 8: - ldx(src, dst); + stx(src, dst); break; default: - throw new InternalError(); + throw new InternalError(Integer.toString(bytes)); } + } else if (SPARC.isDoubleFloatRegister(src) && bytes == 8) { + stdf(src, dst); + } else if (SPARC.isSingleFloatRegister(src) && bytes == 4) { + stf(src, dst); } else { - switch (bytes) { - case 1: - ldsb(src, dst); - break; - case 2: - ldsh(src, dst); - break; - case 4: - ldsw(src, dst); - break; - case 8: - ldx(src, dst); - break; - default: - throw new InternalError(); - } + throw new InternalError(); } }