GBE: Fix a bug when setting flag register
authorRuiling Song <ruiling.song@intel.com>
Fri, 10 Oct 2014 07:01:25 +0000 (15:01 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Sat, 11 Oct 2014 08:39:30 +0000 (16:39 +0800)
we should use simd1, instead of simd8/simd16.

Signed-off-by: Ruiling Song <ruiling.song@intel.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
backend/src/backend/gen_context.cpp
backend/src/backend/gen_context.hpp

index c2412d8..991214d 100644 (file)
@@ -764,14 +764,14 @@ namespace gbe
         p->SHL(c, e, a);
         p->SHL(d, f, a);
         p->OR(e, d, b);
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
         p->SEL(d, d, e);
         p->curr.predicate = GEN_PREDICATE_NONE;
         p->AND(a, a, GenRegister::immud(32));
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
@@ -792,14 +792,14 @@ namespace gbe
         p->SHR(c, f, a);
         p->SHR(d, e, a);
         p->OR(e, d, b);
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
         p->SEL(d, d, e);
         p->curr.predicate = GEN_PREDICATE_NONE;
         p->AND(a, a, GenRegister::immud(32));
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
@@ -821,7 +821,7 @@ namespace gbe
         p->ASR(c, f, a);
         p->SHR(d, e, a);
         p->OR(e, d, b);
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
@@ -829,7 +829,7 @@ namespace gbe
         p->curr.predicate = GEN_PREDICATE_NONE;
         p->AND(a, a, GenRegister::immud(32));
         p->ASR(f, f, GenRegister::immd(31));
-        p->MOV(flagReg, GenRegister::immuw(0xFFFF));
+        setFlag(flagReg, GenRegister::immuw(0xFFFF));
         p->curr.predicate = GEN_PREDICATE_NORMAL;
         p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
         p->CMP(GEN_CONDITIONAL_Z, a, zero);
@@ -843,6 +843,14 @@ namespace gbe
         NOT_IMPLEMENTED;
     }
   }
+  void GenContext::setFlag(GenRegister flagReg, GenRegister src) {
+    p->push();
+    p->curr.noMask = 1;
+    p->curr.execWidth = 1;
+    p->curr.predicate = GEN_PREDICATE_NONE;
+    p->MOV(flagReg, src);
+    p->pop();
+  }
 
   void GenContext::saveFlag(GenRegister dest, int flag, int subFlag) {
     p->push();
index 0be225a..3e67a1e 100644 (file)
@@ -118,6 +118,7 @@ namespace gbe
     void I64FullAdd(GenRegister high1, GenRegister low1, GenRegister high2, GenRegister low2);
     void I32FullMult(GenRegister high, GenRegister low, GenRegister src0, GenRegister src1);
     void I64FullMult(GenRegister dst1, GenRegister dst2, GenRegister dst3, GenRegister dst4, GenRegister x_high, GenRegister x_low, GenRegister y_high, GenRegister y_low);
+    void setFlag(GenRegister flag, GenRegister src);
     void saveFlag(GenRegister dest, int flag, int subFlag);
     void UnsignedI64ToFloat(GenRegister dst, GenRegister high, GenRegister low, GenRegister exp, GenRegister mantissa, GenRegister tmp, GenRegister flag);