diff --git a/src/compiler/codegen/gen_common.cc b/src/compiler/codegen/gen_common.cc
index c548376..649ae82 100644
--- a/src/compiler/codegen/gen_common.cc
+++ b/src/compiler/codegen/gen_common.cc
@@ -15,6 +15,9 @@
  */
 
 #include "oat/runtime/oat_support_entrypoints.h"
+#include "../compiler_ir.h"
+#include "ralloc_util.h"
+#include "codegen_util.h"
 
 namespace art {
 
@@ -610,9 +613,8 @@
     } else {
       rlSrc = loadValue(cUnit, rlSrc, kAnyReg);
     }
-//FIXME: need to generalize the barrier call
     if (isVolatile) {
-      oatGenMemBarrier(cUnit, kST);
+      oatGenMemBarrier(cUnit, kStoreStore);
     }
     if (isLongOrDouble) {
       storeBaseDispWide(cUnit, rBase, fieldOffset, rlSrc.lowReg,
@@ -621,7 +623,7 @@
       storeWordDisp(cUnit, rBase, fieldOffset, rlSrc.lowReg);
     }
     if (isVolatile) {
-      oatGenMemBarrier(cUnit, kSY);
+      oatGenMemBarrier(cUnit, kStoreLoad);
     }
     if (isObject) {
       markGCCard(cUnit, rlSrc.lowReg, rBase);
@@ -698,7 +700,7 @@
     // rBase now holds static storage base
     RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true);
     if (isVolatile) {
-      oatGenMemBarrier(cUnit, kSY);
+      oatGenMemBarrier(cUnit, kLoadLoad);
     }
     if (isLongOrDouble) {
       loadBaseDispWide(cUnit, rBase, fieldOffset, rlResult.lowReg,
@@ -894,7 +896,7 @@
         loadBaseDispWide(cUnit, rlObj.lowReg, fieldOffset, rlResult.lowReg,
                          rlResult.highReg, rlObj.sRegLow);
         if (isVolatile) {
-          oatGenMemBarrier(cUnit, kSY);
+          oatGenMemBarrier(cUnit, kLoadLoad);
         }
       } else {
         int regPtr = oatAllocTemp(cUnit);
@@ -902,7 +904,7 @@
         rlResult = oatEvalLoc(cUnit, rlDest, regClass, true);
         loadPair(cUnit, regPtr, rlResult.lowReg, rlResult.highReg);
         if (isVolatile) {
-          oatGenMemBarrier(cUnit, kSY);
+          oatGenMemBarrier(cUnit, kLoadLoad);
         }
         oatFreeTemp(cUnit, regPtr);
       }
@@ -913,7 +915,7 @@
       loadBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlResult.lowReg,
                    kWord, rlObj.sRegLow);
       if (isVolatile) {
-        oatGenMemBarrier(cUnit, kSY);
+        oatGenMemBarrier(cUnit, kLoadLoad);
       }
       storeValue(cUnit, rlDest, rlResult);
     }
@@ -951,22 +953,22 @@
       regPtr = oatAllocTemp(cUnit);
       opRegRegImm(cUnit, kOpAdd, regPtr, rlObj.lowReg, fieldOffset);
       if (isVolatile) {
-        oatGenMemBarrier(cUnit, kST);
+        oatGenMemBarrier(cUnit, kStoreStore);
       }
       storeBaseDispWide(cUnit, regPtr, 0, rlSrc.lowReg, rlSrc.highReg);
       if (isVolatile) {
-        oatGenMemBarrier(cUnit, kSY);
+        oatGenMemBarrier(cUnit, kLoadLoad);
       }
       oatFreeTemp(cUnit, regPtr);
     } else {
       rlSrc = loadValue(cUnit, rlSrc, regClass);
       genNullCheck(cUnit, rlObj.sRegLow, rlObj.lowReg, optFlags);
       if (isVolatile) {
-        oatGenMemBarrier(cUnit, kST);
+        oatGenMemBarrier(cUnit, kStoreStore);
       }
       storeBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlSrc.lowReg, kWord);
       if (isVolatile) {
-        oatGenMemBarrier(cUnit, kSY);
+        oatGenMemBarrier(cUnit, kLoadLoad);
       }
       if (isObject) {
         markGCCard(cUnit, rlSrc.lowReg, rlObj.lowReg);
