[Beignet] [PATCH] enable signed 64-bit version of "abs_diff"

Homer Hsing homer.xing at intel.com
Sun Aug 18 23:55:29 PDT 2013


fixed operand type in IR instruction "move".
used one less flag register in 64-bit integer comparing.

Signed-off-by: Homer Hsing <homer.xing at intel.com>
---
 backend/src/backend/gen_context.cpp        | 22 +++++++++++-----------
 backend/src/backend/gen_insn_selection.cpp |  9 ++++++---
 backend/src/ocl_stdlib.tmpl.h              |  4 +++-
 3 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index 8d4bc7a..e8b5c41 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -535,10 +535,11 @@ namespace gbe
     int flag = p->curr.flag, subFlag = p->curr.subFlag;
     GenRegister f1 = GenRegister::retype(tmp2, GEN_TYPE_UW),
                 f2 = GenRegister::suboffset(f1, 1),
-                f3 = GenRegister::suboffset(f1, 2);
+                f3 = GenRegister::suboffset(f1, 2),
+                f4 = GenRegister::suboffset(f1, 3);
     p->push();
     p->curr.predicate = GEN_PREDICATE_NONE;
-    p->curr.flag = 0, p->curr.subFlag = 1;
+    saveFlag(f4, flag, subFlag);
     loadTopHalf(tmp0, src0);
     loadTopHalf(tmp1, src1);
     switch(insn.extra.function) {
@@ -554,14 +555,14 @@ namespace gbe
             cmpTopHalf = GEN_CONDITIONAL_G;
           p->CMP(cmpTopHalf, tmp0, tmp1);
         }
-        saveFlag(f1, 0, 1);
+        saveFlag(f1, flag, subFlag);
         p->CMP(GEN_CONDITIONAL_EQ, tmp0, tmp1);
-        saveFlag(f2, 0, 1);
+        saveFlag(f2, flag, subFlag);
         tmp0.type = tmp1.type = GEN_TYPE_UD;
         loadBottomHalf(tmp0, src0);
         loadBottomHalf(tmp1, src1);
         p->CMP(insn.extra.function, tmp0, tmp1);
-        saveFlag(f3, 0, 1);
+        saveFlag(f3, flag, subFlag);
         p->push();
         p->curr.execWidth = 1;
         p->AND(f2, f2, f3);
@@ -570,12 +571,12 @@ namespace gbe
         break;
       case GEN_CONDITIONAL_EQ:
         p->CMP(GEN_CONDITIONAL_EQ, tmp0, tmp1);
-        saveFlag(f1, 0, 1);
+        saveFlag(f1, flag, subFlag);
         tmp0.type = tmp1.type = GEN_TYPE_UD;
         loadBottomHalf(tmp0, src0);
         loadBottomHalf(tmp1, src1);
         p->CMP(GEN_CONDITIONAL_EQ, tmp0, tmp1);
-        saveFlag(f2, 0, 1);
+        saveFlag(f2, flag, subFlag);
         p->push();
         p->curr.execWidth = 1;
         p->AND(f1, f1, f2);
@@ -583,12 +584,12 @@ namespace gbe
         break;
       case GEN_CONDITIONAL_NEQ:
         p->CMP(GEN_CONDITIONAL_NEQ, tmp0, tmp1);
-        saveFlag(f1, 0, 1);
+        saveFlag(f1, flag, subFlag);
         tmp0.type = tmp1.type = GEN_TYPE_UD;
         loadBottomHalf(tmp0, src0);
         loadBottomHalf(tmp1, src1);
         p->CMP(GEN_CONDITIONAL_NEQ, tmp0, tmp1);
-        saveFlag(f2, 0, 1);
+        saveFlag(f2, flag, subFlag);
         p->push();
         p->curr.execWidth = 1;
         p->OR(f1, f1, f2);
@@ -597,9 +598,8 @@ namespace gbe
       default:
         NOT_IMPLEMENTED;
     }
-    saveFlag(f2, flag, subFlag);
     p->curr.execWidth = 1;
-    p->AND(f1, f1, f2);
+    p->AND(f1, f1, f4);
     p->MOV(GenRegister::flag(flag, subFlag), f1);
     p->pop();
   }
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index 90ffd7c..55db48e 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -1384,7 +1384,9 @@ namespace gbe
   /*! Unary instruction patterns */
   DECL_PATTERN(UnaryInstruction)
   {
-    static ir::Type getType(const ir::Opcode opcode) {
+    static ir::Type getType(const ir::Opcode opcode, const ir::Type insnType) {
+      if (insnType == ir::TYPE_S64 || insnType == ir::TYPE_U64)
+        return insnType;
       if (opcode == ir::OP_FBH || opcode == ir::OP_FBL)
         return ir::TYPE_U32;
       return ir::TYPE_FLOAT;
@@ -1392,8 +1394,9 @@ namespace gbe
 
     INLINE bool emitOne(Selection::Opaque &sel, const ir::UnaryInstruction &insn) const {
       const ir::Opcode opcode = insn.getOpcode();
-      const GenRegister dst = sel.selReg(insn.getDst(0), getType(opcode));
-      const GenRegister src = sel.selReg(insn.getSrc(0), getType(opcode));
+      const ir::Type insnType = insn.getType();
+      const GenRegister dst = sel.selReg(insn.getDst(0), getType(opcode, insnType));
+      const GenRegister src = sel.selReg(insn.getSrc(0), getType(opcode, insnType));
       switch (opcode) {
         case ir::OP_ABS:
           if (insn.getType() == ir::TYPE_S32) {
diff --git a/backend/src/ocl_stdlib.tmpl.h b/backend/src/ocl_stdlib.tmpl.h
index 59c0f6b..c428fac 100644
--- a/backend/src/ocl_stdlib.tmpl.h
+++ b/backend/src/ocl_stdlib.tmpl.h
@@ -508,7 +508,9 @@ INLINE_OVERLOADABLE uint abs_diff (int x, int y) {
 }
 
 INLINE_OVERLOADABLE ulong abs_diff (long x, long y) {
-  return 0;
+  if ((x >= 0 && y >= 0) || (x <= 0 && y <= 0))
+    return abs(x - y);
+  return abs(x) + abs(y);
 }
 INLINE_OVERLOADABLE ulong abs_diff (ulong x, ulong y) {
   return y > x ? (y - x) : (x - y);
-- 
1.8.1.2



More information about the Beignet mailing list