< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Move.java

Print this page

        

@@ -22,24 +22,24 @@
  */
 
 
 package org.graalvm.compiler.lir.aarch64;
 
-import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.COMPOSITE;
-import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT;
-import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
-import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK;
-import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.UNINITIALIZED;
-import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
-import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
 import static jdk.vm.ci.aarch64.AArch64.sp;
 import static jdk.vm.ci.aarch64.AArch64.zr;
 import static jdk.vm.ci.code.ValueUtil.asAllocatableValue;
 import static jdk.vm.ci.code.ValueUtil.asRegister;
 import static jdk.vm.ci.code.ValueUtil.asStackSlot;
 import static jdk.vm.ci.code.ValueUtil.isRegister;
 import static jdk.vm.ci.code.ValueUtil.isStackSlot;
+import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.COMPOSITE;
+import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT;
+import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
+import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK;
+import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.UNINITIALIZED;
+import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant;
+import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
 
 import org.graalvm.compiler.asm.aarch64.AArch64Address;
 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.ScratchRegister;
 import org.graalvm.compiler.core.common.LIRKind;

@@ -54,10 +54,11 @@
 import org.graalvm.compiler.lir.StandardOp.ValueMoveOp;
 import org.graalvm.compiler.lir.VirtualStackSlot;
 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
 
 import jdk.vm.ci.aarch64.AArch64Kind;
+import jdk.vm.ci.code.MemoryBarriers;
 import jdk.vm.ci.code.Register;
 import jdk.vm.ci.code.StackSlot;
 import jdk.vm.ci.meta.AllocatableValue;
 import jdk.vm.ci.meta.Constant;
 import jdk.vm.ci.meta.JavaConstant;

@@ -210,18 +211,24 @@
         @Override
         // The odd-looking @SuppressWarnings("all") is here because of
         // a compiler bug which warns that crb is unused, and also
         // warns that @SuppressWarnings("unused") is unnecessary.
         public void emitCode(@SuppressWarnings("all") CompilationResultBuilder crb, AArch64MacroAssembler masm) {
-            // As I understand it load acquire/store release have the same semantics as on IA64
-            // and allow us to handle LoadStore, LoadLoad and StoreStore without an explicit
-            // barrier.
-            // But Graal support to figure out if a load/store is volatile is non-existant so for
-            // now just use memory barriers everywhere.
-            // if ((barrier & MemoryBarriers.STORE_LOAD) != 0) {
-            masm.dmb(AArch64MacroAssembler.BarrierKind.ANY_ANY);
-            // }
+            assert barriers >= MemoryBarriers.LOAD_LOAD && barriers <= (MemoryBarriers.STORE_STORE | MemoryBarriers.STORE_LOAD | MemoryBarriers.LOAD_STORE | MemoryBarriers.LOAD_LOAD);
+            switch (barriers) {
+                case MemoryBarriers.STORE_STORE:
+                    masm.dmb(AArch64MacroAssembler.BarrierKind.STORE_STORE);
+                    break;
+                case MemoryBarriers.LOAD_LOAD:
+                case MemoryBarriers.LOAD_STORE:
+                case MemoryBarriers.LOAD_LOAD | MemoryBarriers.LOAD_STORE:
+                    masm.dmb(AArch64MacroAssembler.BarrierKind.LOAD_LOAD);
+                    break;
+                default:
+                    masm.dmb(AArch64MacroAssembler.BarrierKind.ANY_ANY);
+                    break;
+            }
         }
     }
 
     abstract static class MemOp extends AArch64LIRInstruction implements StandardOp.ImplicitNullCheck {
 
< prev index next >