package org.graalvm.compiler.hotspot.sparc;
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
import static jdk.vm.ci.code.ValueUtil.asRegister;
import static jdk.vm.ci.sparc.SPARC.g0;
import static jdk.vm.ci.sparc.SPARC.l7;
import static jdk.vm.ci.sparc.SPARC.sp;
import org.graalvm.compiler.asm.sparc.SPARCAddress;
import org.graalvm.compiler.asm.sparc.SPARCAssembler.CC;
import org.graalvm.compiler.asm.sparc.SPARCAssembler.ConditionFlag;
import org.graalvm.compiler.asm.sparc.SPARCMacroAssembler;
import org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister;
import org.graalvm.compiler.lir.LIRInstructionClass;
import org.graalvm.compiler.lir.Opcode;
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.meta.AllocatableValue;
@Opcode("JUMP_TO_EXCEPTION_HANDLER_IN_CALLER")
final class SPARCHotSpotJumpToExceptionHandlerInCallerOp extends SPARCHotSpotEpilogueOp {
public static final LIRInstructionClass<SPARCHotSpotJumpToExceptionHandlerInCallerOp> TYPE = LIRInstructionClass.create(SPARCHotSpotJumpToExceptionHandlerInCallerOp.class);
public static final SizeEstimate SIZE = SizeEstimate.create(5);
@Use(REG) AllocatableValue handlerInCallerPc;
@Use(REG) AllocatableValue exception;
@Use(REG) AllocatableValue exceptionPc;
private final Register thread;
private final int isMethodHandleReturnOffset;
SPARCHotSpotJumpToExceptionHandlerInCallerOp(AllocatableValue handlerInCallerPc, AllocatableValue exception, AllocatableValue exceptionPc, int isMethodHandleReturnOffset, Register thread) {
super(TYPE, SIZE);
this.handlerInCallerPc = handlerInCallerPc;
this.exception = exception;
this.exceptionPc = exceptionPc;
this.isMethodHandleReturnOffset = isMethodHandleReturnOffset;
this.thread = thread;
}
@Override
public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
SPARCAddress dst = new SPARCAddress(thread, isMethodHandleReturnOffset);
try (ScratchRegister scratch = masm.getScratchRegister()) {
Register scratchReg = scratch.getRegister();
masm.lduw(dst, scratchReg);
masm.cmp(scratchReg, scratchReg);
masm.movcc(ConditionFlag.NotZero, CC.Icc, l7, sp);
}
masm.jmpl(asRegister(handlerInCallerPc), 0, g0);
leaveFrame(crb);
}
}