< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Assembler.java
Print this page
*** 20,33 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.asm.amd64;
! import static org.graalvm.compiler.core.common.NumUtil.isByte;
! import static org.graalvm.compiler.core.common.NumUtil.isInt;
! import static org.graalvm.compiler.core.common.NumUtil.isShiftCount;
! import static org.graalvm.compiler.core.common.NumUtil.isUByte;
import static org.graalvm.compiler.asm.amd64.AMD64AsmOptions.UseAddressNop;
import static org.graalvm.compiler.asm.amd64.AMD64AsmOptions.UseNormalNop;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.ADD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.AND;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
--- 20,37 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.asm.amd64;
! import static jdk.vm.ci.amd64.AMD64.CPU;
! import static jdk.vm.ci.amd64.AMD64.XMM;
! import static jdk.vm.ci.amd64.AMD64.r12;
! import static jdk.vm.ci.amd64.AMD64.r13;
! import static jdk.vm.ci.amd64.AMD64.rbp;
! import static jdk.vm.ci.amd64.AMD64.rip;
! import static jdk.vm.ci.amd64.AMD64.rsp;
! import static jdk.vm.ci.code.MemoryBarriers.STORE_LOAD;
import static org.graalvm.compiler.asm.amd64.AMD64AsmOptions.UseAddressNop;
import static org.graalvm.compiler.asm.amd64.AMD64AsmOptions.UseNormalNop;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.ADD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.AND;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.CMP;
*** 45,73 ****
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.QWORD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.SD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.SS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.WORD;
! import static jdk.vm.ci.amd64.AMD64.CPU;
! import static jdk.vm.ci.amd64.AMD64.XMM;
! import static jdk.vm.ci.amd64.AMD64.r12;
! import static jdk.vm.ci.amd64.AMD64.r13;
! import static jdk.vm.ci.amd64.AMD64.rbp;
! import static jdk.vm.ci.amd64.AMD64.rip;
! import static jdk.vm.ci.amd64.AMD64.rsp;
! import static jdk.vm.ci.code.MemoryBarriers.STORE_LOAD;
import org.graalvm.compiler.asm.Assembler;
import org.graalvm.compiler.asm.Label;
- import org.graalvm.compiler.core.common.NumUtil;
import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
import jdk.vm.ci.amd64.AMD64;
import jdk.vm.ci.amd64.AMD64.CPUFeature;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.code.Register.RegisterCategory;
import jdk.vm.ci.code.TargetDescription;
/**
* This class implements an assembler that can encode most X86 instructions.
*/
public class AMD64Assembler extends Assembler {
--- 49,76 ----
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.PS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.QWORD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.SD;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.SS;
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize.WORD;
! import static org.graalvm.compiler.core.common.NumUtil.isByte;
! import static org.graalvm.compiler.core.common.NumUtil.isInt;
! import static org.graalvm.compiler.core.common.NumUtil.isShiftCount;
! import static org.graalvm.compiler.core.common.NumUtil.isUByte;
import org.graalvm.compiler.asm.Assembler;
import org.graalvm.compiler.asm.Label;
import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
+ import org.graalvm.compiler.core.common.NumUtil;
+ import org.graalvm.compiler.debug.GraalError;
import jdk.vm.ci.amd64.AMD64;
import jdk.vm.ci.amd64.AMD64.CPUFeature;
+ import jdk.vm.ci.amd64.AMD64Kind;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.code.Register.RegisterCategory;
import jdk.vm.ci.code.TargetDescription;
+ import jdk.vm.ci.meta.PlatformKind;
/**
* This class implements an assembler that can encode most X86 instructions.
*/
public class AMD64Assembler extends Assembler {
*** 223,233 ****
/**
* The x86 operand sizes.
*/
public enum OperandSize {
! BYTE(1) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
assert imm == (byte) imm;
asm.emitByte(imm);
}
--- 226,236 ----
/**
* The x86 operand sizes.
*/
public enum OperandSize {
! BYTE(1, AMD64Kind.BYTE) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
assert imm == (byte) imm;
asm.emitByte(imm);
}
*** 236,246 ****
protected int immediateSize() {
return 1;
}
},
! WORD(2, 0x66) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
assert imm == (short) imm;
asm.emitShort(imm);
}
--- 239,249 ----
protected int immediateSize() {
return 1;
}
},
! WORD(2, AMD64Kind.WORD, 0x66) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
assert imm == (short) imm;
asm.emitShort(imm);
}
*** 249,259 ****
protected int immediateSize() {
return 2;
}
},
! DWORD(4) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
asm.emitInt(imm);
}
--- 252,262 ----
protected int immediateSize() {
return 2;
}
},
! DWORD(4, AMD64Kind.DWORD) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
asm.emitInt(imm);
}
*** 261,271 ****
protected int immediateSize() {
return 4;
}
},
! QWORD(8) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
asm.emitInt(imm);
}
--- 264,274 ----
protected int immediateSize() {
return 4;
}
},
! QWORD(8, AMD64Kind.QWORD) {
@Override
protected void emitImmediate(AMD64Assembler asm, int imm) {
asm.emitInt(imm);
}
*** 273,310 ****
protected int immediateSize() {
return 4;
}
},
! SS(4, 0xF3, true),
! SD(8, 0xF2, true),
! PS(16, true),
! PD(16, 0x66, true);
private final int sizePrefix;
-
private final int bytes;
private final boolean xmm;
! OperandSize(int bytes) {
! this(bytes, 0);
}
! OperandSize(int bytes, int sizePrefix) {
! this(bytes, sizePrefix, false);
}
! OperandSize(int bytes, boolean xmm) {
! this(bytes, 0, xmm);
}
! OperandSize(int bytes, int sizePrefix, boolean xmm) {
this.sizePrefix = sizePrefix;
this.bytes = bytes;
this.xmm = xmm;
}
public int getBytes() {
return bytes;
--- 276,314 ----
protected int immediateSize() {
return 4;
}
},
! SS(4, AMD64Kind.SINGLE, 0xF3, true),
! SD(8, AMD64Kind.DOUBLE, 0xF2, true),
! PS(16, AMD64Kind.V128_SINGLE, true),
! PD(16, AMD64Kind.V128_DOUBLE, 0x66, true);
private final int sizePrefix;
private final int bytes;
private final boolean xmm;
+ private final AMD64Kind kind;
! OperandSize(int bytes, AMD64Kind kind) {
! this(bytes, kind, 0);
}
! OperandSize(int bytes, AMD64Kind kind, int sizePrefix) {
! this(bytes, kind, sizePrefix, false);
}
! OperandSize(int bytes, AMD64Kind kind, boolean xmm) {
! this(bytes, kind, 0, xmm);
}
! OperandSize(int bytes, AMD64Kind kind, int sizePrefix, boolean xmm) {
this.sizePrefix = sizePrefix;
this.bytes = bytes;
+ this.kind = kind;
this.xmm = xmm;
}
public int getBytes() {
return bytes;
*** 312,321 ****
--- 316,338 ----
public boolean isXmmType() {
return xmm;
}
+ public AMD64Kind getKind() {
+ return kind;
+ }
+
+ public static OperandSize get(PlatformKind kind) {
+ for (OperandSize operandSize : OperandSize.values()) {
+ if (operandSize.kind.equals(kind)) {
+ return operandSize;
+ }
+ }
+ throw GraalError.shouldNotReachHere("Unexpected kind: " + kind.toString());
+ }
+
/**
* Emit an immediate of this size. Note that immediate {@link #QWORD} operands are encoded
* as sign-extended 32-bit values.
*
* @param asm
*** 2228,2237 ****
--- 2245,2262 ----
emitByte(0x0F);
emitByte(0xB6);
emitOperandHelper(dst, src, 0);
}
+ public final void movzbl(Register dst, Register src) {
+ AMD64RMOp.MOVZXB.emit(this, OperandSize.DWORD, dst, src);
+ }
+
+ public final void movzbq(Register dst, Register src) {
+ AMD64RMOp.MOVZXB.emit(this, OperandSize.QWORD, dst, src);
+ }
+
public final void movzwl(Register dst, AMD64Address src) {
prefix(src, dst);
emitByte(0x0F);
emitByte(0xB7);
emitOperandHelper(dst, src, 0);
*** 3196,3205 ****
--- 3221,3237 ----
emitByte(0x0F);
emitByte(0x40 | cc.getValue());
emitByte(0xC0 | encode);
}
+ public final void setb(ConditionFlag cc, Register dst) {
+ int encode = prefixAndEncode(dst.encoding, true);
+ emitByte(0x0F);
+ emitByte(0x90 | cc.getValue());
+ emitByte(0xC0 | encode);
+ }
+
public final void cmovq(ConditionFlag cc, Register dst, AMD64Address src) {
prefixq(src, dst);
emitByte(0x0F);
emitByte(0x40 | cc.getValue());
emitOperandHelper(dst, src, 0);
< prev index next >