gallivm: add bitarit xor and not ops.
authorDave Airlie <airlied@redhat.com>
Fri, 17 Feb 2012 19:02:21 +0000 (19:02 +0000)
committerDave Airlie <airlied@redhat.com>
Tue, 28 Feb 2012 10:42:17 +0000 (10:42 +0000)
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
src/gallium/auxiliary/gallivm/lp_bld_bitarit.h

index a9c57d682f2df649bbeabfb6baeb6fb2652ae4db..97ae1622c27b94edac6d49c34e5f532da4fe016b 100644 (file)
@@ -62,6 +62,31 @@ lp_build_or(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
    return res;
 }
 
+/* bitwise XOR (a ^ b) */
+LLVMValueRef
+lp_build_xor(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
+{
+   LLVMBuilderRef builder = bld->gallivm->builder;
+   const struct lp_type type = bld->type;
+   LLVMValueRef res;
+
+   assert(lp_check_value(type, a));
+   assert(lp_check_value(type, b));
+
+   /* can't do bitwise ops on floating-point values */
+   if (type.floating) {
+      a = LLVMBuildBitCast(builder, a, bld->int_vec_type, "");
+      b = LLVMBuildBitCast(builder, b, bld->int_vec_type, "");
+   }
+
+   res = LLVMBuildXor(builder, a, b, "");
+
+   if (type.floating) {
+      res = LLVMBuildBitCast(builder, res, bld->vec_type, "");
+   }
+
+   return res;
+}
 
 /**
  * Return (a & b)
@@ -121,6 +146,25 @@ lp_build_andnot(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
    return res;
 }
 
+/* bitwise NOT */
+LLVMValueRef
+lp_build_not(struct lp_build_context *bld, LLVMValueRef a)
+{
+   LLVMBuilderRef builder = bld->gallivm->builder;
+   const struct lp_type type = bld->type;
+   LLVMValueRef res;
+
+   assert(lp_check_value(type, a));
+
+   if (type.floating) {
+      a = LLVMBuildBitCast(builder, a, bld->int_vec_type, "");
+   }
+   res = LLVMBuildNot(builder, a, "");
+   if (type.floating) {
+      res = LLVMBuildBitCast(builder, res, bld->vec_type, "");
+   }
+   return res;
+}
 
 /**
  * Shift left.
index 5c5b981851921e2bef4d1fb5b51a0975326b3fa6..29f5def9b5880727b7a2f2c849435099b9ed7403 100644 (file)
@@ -47,6 +47,9 @@ struct lp_build_context;
 LLVMValueRef
 lp_build_or(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b);
 
+LLVMValueRef
+lp_build_xor(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b);
+
 LLVMValueRef
 lp_build_and(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b);
 
@@ -65,5 +68,7 @@ lp_build_shl_imm(struct lp_build_context *bld, LLVMValueRef a, unsigned imm);
 LLVMValueRef
 lp_build_shr_imm(struct lp_build_context *bld, LLVMValueRef a, unsigned imm);
 
+LLVMValueRef
+lp_build_not(struct lp_build_context *bld, LLVMValueRef a);
 
 #endif /* !LP_BLD_ARIT_H */