< 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 >