23 */
24
25
26 package org.graalvm.compiler.lir.aarch64;
27
28 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
29 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL;
30 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
31 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK;
32 import static jdk.vm.ci.aarch64.AArch64.r8;
33 import static jdk.vm.ci.code.ValueUtil.asRegister;
34 import static jdk.vm.ci.code.ValueUtil.isRegister;
35
36 import org.graalvm.compiler.asm.Label;
37 import org.graalvm.compiler.asm.aarch64.AArch64Assembler;
38 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
39 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
40 import org.graalvm.compiler.lir.LIRFrameState;
41 import org.graalvm.compiler.lir.LIRInstructionClass;
42 import org.graalvm.compiler.lir.Opcode;
43 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
44
45 import jdk.vm.ci.code.Register;
46 import jdk.vm.ci.meta.InvokeTarget;
47 import jdk.vm.ci.meta.ResolvedJavaMethod;
48 import jdk.vm.ci.meta.Value;
49
50 public class AArch64Call {
51
52 public abstract static class CallOp extends AArch64LIRInstruction {
53 @Def({REG, ILLEGAL}) protected Value result;
54 @Use({REG, STACK}) protected Value[] parameters;
55 @Temp({REG, STACK}) protected Value[] temps;
56 @State protected LIRFrameState state;
57
58 protected CallOp(LIRInstructionClass<? extends CallOp> c, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
59 super(c);
60 this.result = result;
61 this.parameters = parameters;
62 this.state = state;
109 }
110
111 @Opcode("CALL_DIRECT")
112 public abstract static class DirectCallOp extends MethodCallOp {
113 public static final LIRInstructionClass<DirectCallOp> TYPE = LIRInstructionClass.create(DirectCallOp.class);
114
115 public DirectCallOp(ResolvedJavaMethod target, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
116 super(TYPE, target, result, parameters, temps, state);
117 }
118
119 protected DirectCallOp(LIRInstructionClass<? extends DirectCallOp> c, ResolvedJavaMethod callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
120 super(c, callTarget, result, parameters, temps, state);
121 }
122
123 @Override
124 public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
125 directCall(crb, masm, callTarget, null, state);
126 }
127 }
128
129 public abstract static class ForeignCallOp extends CallOp {
130 protected final ForeignCallLinkage callTarget;
131 protected final Label label;
132
133 protected ForeignCallOp(LIRInstructionClass<? extends ForeignCallOp> c, ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state, Label label) {
134 super(c, result, parameters, temps, state);
135 this.callTarget = callTarget;
136 this.label = label;
137 }
138
139 @Override
140 public boolean destroysCallerSavedRegisters() {
141 return callTarget.destroysRegisters();
142 }
143
144 @Override
145 public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
146 emitCall(crb, masm);
147 }
148
149 protected abstract void emitCall(CompilationResultBuilder crb, AArch64MacroAssembler masm);
150 }
151
152 @Opcode("NEAR_FOREIGN_CALL")
153 public static class DirectNearForeignCallOp extends ForeignCallOp {
154 public static final LIRInstructionClass<DirectNearForeignCallOp> TYPE = LIRInstructionClass.create(DirectNearForeignCallOp.class);
155
156 public DirectNearForeignCallOp(ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state, Label label) {
157 super(TYPE, callTarget, result, parameters, temps, state, label);
158 }
159
160 @Override
161 protected void emitCall(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
162 directCall(crb, masm, callTarget, null, state, label);
163 }
164 }
165
166 @Opcode("FAR_FOREIGN_CALL")
167 public static class DirectFarForeignCallOp extends ForeignCallOp {
168 public static final LIRInstructionClass<DirectFarForeignCallOp> TYPE = LIRInstructionClass.create(DirectFarForeignCallOp.class);
169
|
23 */
24
25
26 package org.graalvm.compiler.lir.aarch64;
27
28 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
29 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL;
30 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
31 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK;
32 import static jdk.vm.ci.aarch64.AArch64.r8;
33 import static jdk.vm.ci.code.ValueUtil.asRegister;
34 import static jdk.vm.ci.code.ValueUtil.isRegister;
35
36 import org.graalvm.compiler.asm.Label;
37 import org.graalvm.compiler.asm.aarch64.AArch64Assembler;
38 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
39 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
40 import org.graalvm.compiler.lir.LIRFrameState;
41 import org.graalvm.compiler.lir.LIRInstructionClass;
42 import org.graalvm.compiler.lir.Opcode;
43 import org.graalvm.compiler.lir.StandardOp.LabelHoldingOp;
44 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
45
46 import jdk.vm.ci.code.Register;
47 import jdk.vm.ci.meta.InvokeTarget;
48 import jdk.vm.ci.meta.ResolvedJavaMethod;
49 import jdk.vm.ci.meta.Value;
50
51 public class AArch64Call {
52
53 public abstract static class CallOp extends AArch64LIRInstruction {
54 @Def({REG, ILLEGAL}) protected Value result;
55 @Use({REG, STACK}) protected Value[] parameters;
56 @Temp({REG, STACK}) protected Value[] temps;
57 @State protected LIRFrameState state;
58
59 protected CallOp(LIRInstructionClass<? extends CallOp> c, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
60 super(c);
61 this.result = result;
62 this.parameters = parameters;
63 this.state = state;
110 }
111
112 @Opcode("CALL_DIRECT")
113 public abstract static class DirectCallOp extends MethodCallOp {
114 public static final LIRInstructionClass<DirectCallOp> TYPE = LIRInstructionClass.create(DirectCallOp.class);
115
116 public DirectCallOp(ResolvedJavaMethod target, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
117 super(TYPE, target, result, parameters, temps, state);
118 }
119
120 protected DirectCallOp(LIRInstructionClass<? extends DirectCallOp> c, ResolvedJavaMethod callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state) {
121 super(c, callTarget, result, parameters, temps, state);
122 }
123
124 @Override
125 public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
126 directCall(crb, masm, callTarget, null, state);
127 }
128 }
129
130 public abstract static class ForeignCallOp extends CallOp implements LabelHoldingOp {
131 protected final ForeignCallLinkage callTarget;
132 protected final Label label;
133
134 protected ForeignCallOp(LIRInstructionClass<? extends ForeignCallOp> c, ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state, Label label) {
135 super(c, result, parameters, temps, state);
136 this.callTarget = callTarget;
137 this.label = label;
138 }
139
140 @Override
141 public boolean destroysCallerSavedRegisters() {
142 return callTarget.destroysRegisters();
143 }
144
145 @Override
146 public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
147 emitCall(crb, masm);
148 }
149
150 protected abstract void emitCall(CompilationResultBuilder crb, AArch64MacroAssembler masm);
151
152 @Override
153 public Label getLabel() {
154 return label;
155 }
156 }
157
158 @Opcode("NEAR_FOREIGN_CALL")
159 public static class DirectNearForeignCallOp extends ForeignCallOp {
160 public static final LIRInstructionClass<DirectNearForeignCallOp> TYPE = LIRInstructionClass.create(DirectNearForeignCallOp.class);
161
162 public DirectNearForeignCallOp(ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state, Label label) {
163 super(TYPE, callTarget, result, parameters, temps, state, label);
164 }
165
166 @Override
167 protected void emitCall(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
168 directCall(crb, masm, callTarget, null, state, label);
169 }
170 }
171
172 @Opcode("FAR_FOREIGN_CALL")
173 public static class DirectFarForeignCallOp extends ForeignCallOp {
174 public static final LIRInstructionClass<DirectFarForeignCallOp> TYPE = LIRInstructionClass.create(DirectFarForeignCallOp.class);
175
|