package com.oracle.svm.core.graal.aarch64;
import org.graalvm.compiler.asm.aarch64.AArch64Address;
import org.graalvm.compiler.asm.aarch64.AArch64Assembler;
import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister;
import org.graalvm.compiler.lir.LIRInstructionClass;
import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction;
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
import com.oracle.svm.core.ReservedRegisters;
import com.oracle.svm.core.SubstrateOptions;
import com.oracle.svm.core.nodes.SafepointCheckNode;
import com.oracle.svm.core.thread.Safepoint;
import com.oracle.svm.core.thread.ThreadingSupportImpl;
import jdk.vm.ci.code.Register;
public class AArch64SafepointCheckOp extends AArch64LIRInstruction {
public static final LIRInstructionClass<AArch64SafepointCheckOp> TYPE = LIRInstructionClass.create(AArch64SafepointCheckOp.class);
protected AArch64SafepointCheckOp() {
super(TYPE);
}
@Override
public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
assert SubstrateOptions.MultiThreaded.getValue();
int safepointSize = 32;
AArch64Address safepointAddress = AArch64Address.createImmediateAddress(safepointSize, AArch64Address.AddressingMode.IMMEDIATE_UNSIGNED_SCALED,
ReservedRegisters.singleton().getThreadRegister(),
Math.toIntExact(Safepoint.getThreadLocalSafepointRequestedOffset()));
try (ScratchRegister scratchRegister = masm.getScratchRegister()) {
Register scratch = scratchRegister.getRegister();
masm.ldr(safepointSize, scratch, safepointAddress);
masm.subs(safepointSize, scratch, scratch, 1);
if (ThreadingSupportImpl.isRecurringCallbackSupported()) {
masm.str(safepointSize, scratch, safepointAddress);
}
}
}
public AArch64Assembler.ConditionFlag getConditionFlag() {
return AArch64Assembler.ConditionFlag.LE;
}
}