17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25
26 package org.graalvm.compiler.core.aarch64;
27
28 import static org.graalvm.compiler.lir.LIRValueUtil.asConstant;
29 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
30 import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue;
31
32 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
33 import org.graalvm.compiler.core.common.type.DataPointerConstant;
34 import org.graalvm.compiler.debug.GraalError;
35 import org.graalvm.compiler.lir.LIRInstruction;
36 import org.graalvm.compiler.lir.aarch64.AArch64AddressValue;
37 import org.graalvm.compiler.lir.aarch64.AArch64Move;
38 import org.graalvm.compiler.lir.aarch64.AArch64Move.LoadAddressOp;
39 import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory;
40
41 import jdk.vm.ci.meta.AllocatableValue;
42 import jdk.vm.ci.meta.Constant;
43 import jdk.vm.ci.meta.JavaConstant;
44 import jdk.vm.ci.meta.Value;
45
46 public class AArch64MoveFactory implements MoveFactory {
47
48 @Override
49 public LIRInstruction createMove(AllocatableValue dst, Value src) {
50 boolean srcIsSlot = isStackSlotValue(src);
51 boolean dstIsSlot = isStackSlotValue(dst);
52 if (isConstantValue(src)) {
53 return createLoad(dst, asConstant(src));
54 } else if (src instanceof AArch64AddressValue) {
55 return new LoadAddressOp(dst, (AArch64AddressValue) src);
56 } else {
57 assert src instanceof AllocatableValue;
58 if (srcIsSlot && dstIsSlot) {
59 throw GraalError.shouldNotReachHere(src.getClass() + " " + dst.getClass());
60 } else {
61 return new AArch64Move.Move(dst, (AllocatableValue) src);
62 }
63 }
64 }
65
66 @Override
67 public LIRInstruction createStackMove(AllocatableValue result, AllocatableValue input) {
68 return new AArch64Move.Move(result, input);
69 }
70
71 @Override
72 public LIRInstruction createLoad(AllocatableValue dst, Constant src) {
73 if (src instanceof JavaConstant) {
74 JavaConstant javaConstant = (JavaConstant) src;
75 if (canInlineConstant(javaConstant)) {
76 return new AArch64Move.LoadInlineConstant(javaConstant, dst);
77 } else {
78 // return new AArch64Move.LoadConstantFromTable(javaConstant,
79 // constantTableBaseProvider.getConstantTableBase(), dst);
80 return new AArch64Move.LoadInlineConstant(javaConstant, dst);
81 }
82 } else if (src instanceof DataPointerConstant) {
83 return new AArch64Move.LoadDataOp(dst, (DataPointerConstant) src);
84 } else {
85 // throw GraalError.shouldNotReachHere(src.getClass().toString());
86 throw GraalError.unimplemented();
87 }
88 }
89
90 @Override
91 public LIRInstruction createStackLoad(AllocatableValue result, Constant input) {
92 return createLoad(result, input);
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25
26 package org.graalvm.compiler.core.aarch64;
27
28 import static org.graalvm.compiler.lir.LIRValueUtil.asConstant;
29 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
30 import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue;
31
32 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
33 import org.graalvm.compiler.core.common.type.DataPointerConstant;
34 import org.graalvm.compiler.debug.GraalError;
35 import org.graalvm.compiler.lir.LIRInstruction;
36 import org.graalvm.compiler.lir.aarch64.AArch64AddressValue;
37 import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction;
38 import org.graalvm.compiler.lir.aarch64.AArch64Move;
39 import org.graalvm.compiler.lir.aarch64.AArch64Move.LoadAddressOp;
40 import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory;
41
42 import jdk.vm.ci.meta.AllocatableValue;
43 import jdk.vm.ci.meta.Constant;
44 import jdk.vm.ci.meta.JavaConstant;
45 import jdk.vm.ci.meta.Value;
46
47 public class AArch64MoveFactory implements MoveFactory {
48
49 @Override
50 public LIRInstruction createMove(AllocatableValue dst, Value src) {
51 boolean srcIsSlot = isStackSlotValue(src);
52 boolean dstIsSlot = isStackSlotValue(dst);
53 if (isConstantValue(src)) {
54 return createLoad(dst, asConstant(src));
55 } else if (src instanceof AArch64AddressValue) {
56 return new LoadAddressOp(dst, (AArch64AddressValue) src);
57 } else {
58 assert src instanceof AllocatableValue;
59 if (srcIsSlot && dstIsSlot) {
60 throw GraalError.shouldNotReachHere(src.getClass() + " " + dst.getClass());
61 } else {
62 return new AArch64Move.Move(dst, (AllocatableValue) src);
63 }
64 }
65 }
66
67 @Override
68 public LIRInstruction createStackMove(AllocatableValue result, AllocatableValue input) {
69 return new AArch64Move.Move(result, input);
70 }
71
72 @Override
73 public AArch64LIRInstruction createLoad(AllocatableValue dst, Constant src) {
74 if (src instanceof JavaConstant) {
75 JavaConstant javaConstant = (JavaConstant) src;
76 if (canInlineConstant(javaConstant)) {
77 return new AArch64Move.LoadInlineConstant(javaConstant, dst);
78 } else {
79 // return new AArch64Move.LoadConstantFromTable(javaConstant,
80 // constantTableBaseProvider.getConstantTableBase(), dst);
81 return new AArch64Move.LoadInlineConstant(javaConstant, dst);
82 }
83 } else if (src instanceof DataPointerConstant) {
84 return new AArch64Move.LoadDataOp(dst, (DataPointerConstant) src);
85 } else {
86 // throw GraalError.shouldNotReachHere(src.getClass().toString());
87 throw GraalError.unimplemented();
88 }
89 }
90
91 @Override
92 public LIRInstruction createStackLoad(AllocatableValue result, Constant input) {
93 return createLoad(result, input);
|