[Beignet] [PATCH] Fix a long DIV/REM hang.

Yang Rong rong.r.yang at intel.com
Fri Feb 21 00:54:39 PST 2014


There is a jumpi in long DIV/REM, with predication is any16/any8. So
MUST AND the predication register with emask, otherwise may dead loop.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/backend/gen_context.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index 7a74856..44dbee2 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -1364,6 +1364,7 @@ namespace gbe
     GenRegister l = ra->genReg(insn.dst(12));
     GenRegister m = ra->genReg(insn.dst(13));
     GenRegister flagReg = checkFlagRegister(ra->genReg(insn.dst(14)));
+    GenRegister emaskReg = ra->genReg(GenRegister::uw1grf(ir::ocl::emask));
     GenRegister zero = GenRegister::immud(0),
                 one = GenRegister::immud(1),
                 imm31 = GenRegister::immud(31);
@@ -1445,6 +1446,11 @@ namespace gbe
       p->curr.predicate = GEN_PREDICATE_NONE;
       p->curr.useFlag(flagReg.flag_nr(), flagReg.flag_subnr());
       p->CMP(GEN_CONDITIONAL_L, m, GenRegister::immud(64));
+
+      p->curr.execWidth = 1;
+      p->curr.noMask = 1;
+      p->AND(flagReg, flagReg, emaskReg);
+
       p->curr.predicate = GEN_PREDICATE_NORMAL;
       // under condition, jump back to start point
       if (simdWidth == 8)
@@ -1453,8 +1459,6 @@ namespace gbe
         p->curr.predicate = GEN_PREDICATE_ALIGN1_ANY16H;
       else
         NOT_IMPLEMENTED;
-      p->curr.execWidth = 1;
-      p->curr.noMask = 1;
       int jip = -(int)(p->n_instruction() - loop_start + 1) * 2;
       p->JMPI(zero);
       p->patchJMPI(p->n_instruction()-2, jip);
-- 
1.8.3.2



More information about the Beignet mailing list