hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
changeset 33193 c7ffe5c06513
parent 33175 c8f3d95c66bc
child 33198 b37ad9fbf681
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Fri Oct 16 02:05:54 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Tue Oct 13 16:25:50 2015 +0000
@@ -1709,6 +1709,20 @@
   return idivq_offset;
 }
 
+void MacroAssembler::membar(Membar_mask_bits order_constraint) {
+  address prev = pc() - NativeMembar::instruction_size;
+  if (prev == code()->last_membar()) {
+    NativeMembar *bar = NativeMembar_at(prev);
+    // We are merging two memory barrier instructions.  On AArch64 we
+    // can do this simply by ORing them together.
+    bar->set_kind(bar->get_kind() | order_constraint);
+    BLOCK_COMMENT("merged membar");
+  } else {
+    code()->set_last_membar(pc());
+    dmb(Assembler::barrier(order_constraint));
+  }
+}
+
 // MacroAssembler routines found actually to be needed
 
 void MacroAssembler::push(Register src)