# HG changeset patch # User Josef Eisl # Date 1427722704 -7200 # Node ID 5a42f9b582c62d30d4ab4d6e4bfc86bad8702b4c # Parent 8529bfcef6f5c8c72dd04650b4307d0196d8a8b4 AMD64Assembler: introduce DEC and incrementq/decrementq macros for AMD64Addresses. diff -r 8529bfcef6f5 -r 5a42f9b582c6 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Mar 30 16:51:26 2015 +0200 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Mar 30 15:38:24 2015 +0200 @@ -27,6 +27,7 @@ import static com.oracle.graal.asm.NumUtil.*; import static com.oracle.graal.asm.amd64.AMD64AsmOptions.*; import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.*; +import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64MOp.*; import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.*; import com.oracle.graal.amd64.*; @@ -729,6 +730,7 @@ public static final AMD64MOp DIV = new AMD64MOp("DIV", 0xF7, 6); public static final AMD64MOp IDIV = new AMD64MOp("IDIV", 0xF7, 7); public static final AMD64MOp INC = new AMD64MOp("INC", 0xFF, 0); + public static final AMD64MOp DEC = new AMD64MOp("DEC", 0xFF, 1); // @formatter:on private final int ext; @@ -1961,6 +1963,10 @@ ADD.getMIOpcode(QWORD, isByte(imm32)).emit(this, QWORD, dst, imm32); } + public final void addq(AMD64Address dst, int imm32) { + ADD.getMIOpcode(QWORD, isByte(imm32)).emit(this, QWORD, dst, imm32); + } + public final void addq(Register dst, Register src) { ADD.rmOp.emit(this, QWORD, dst, src); } @@ -2024,6 +2030,10 @@ emitByte(0xC8 | encode); } + public final void decq(AMD64Address dst) { + DEC.emit(this, QWORD, dst); + } + public final void incq(Register dst) { // Don't use it directly. Use Macroincrementq() instead. // Use two-byte form (one-byte from is a REX prefix in 64-bit mode) @@ -2032,6 +2042,10 @@ emitByte(0xC0 | encode); } + public final void incq(AMD64Address dst) { + INC.emit(this, QWORD, dst); + } + public final void movq(Register dst, long imm64) { int encode = prefixqAndEncode(dst.encoding); emitByte(0xB8 | encode); @@ -2130,6 +2144,10 @@ SUB.getMIOpcode(QWORD, isByte(imm32)).emit(this, QWORD, dst, imm32); } + public final void subq(AMD64Address dst, int imm32) { + SUB.getMIOpcode(QWORD, isByte(imm32)).emit(this, QWORD, dst, imm32); + } + public final void subqWide(Register dst, int imm32) { // don't use the sign-extending version, forcing a 32-bit immediate SUB.getMIOpcode(QWORD, false).emit(this, QWORD, dst, imm32); diff -r 8529bfcef6f5 -r 5a42f9b582c6 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64MacroAssembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64MacroAssembler.java Mon Mar 30 16:51:26 2015 +0200 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64MacroAssembler.java Mon Mar 30 15:38:24 2015 +0200 @@ -56,6 +56,25 @@ } } + public final void decrementq(AMD64Address dst, int value) { + if (value == Integer.MIN_VALUE) { + subq(dst, value); + return; + } + if (value < 0) { + incrementq(dst, -value); + return; + } + if (value == 0) { + return; + } + if (value == 1 && UseIncDec) { + decq(dst); + } else { + subq(dst, value); + } + } + public void incrementq(Register reg, int value) { if (value == Integer.MIN_VALUE) { addq(reg, value); @@ -75,6 +94,25 @@ } } + public final void incrementq(AMD64Address dst, int value) { + if (value == Integer.MIN_VALUE) { + addq(dst, value); + return; + } + if (value < 0) { + decrementq(dst, -value); + return; + } + if (value == 0) { + return; + } + if (value == 1 && UseIncDec) { + incq(dst); + } else { + addq(dst, value); + } + } + public final void movptr(Register dst, AMD64Address src) { movq(dst, src); }