[Mesa-dev] [PATCH 1/3] gallivm: add bitarit xor and not ops.
Dave Airlie
airlied at gmail.com
Fri Feb 17 11:02:21 PST 2012
From: Dave Airlie <airlied at redhat.com>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/gallium/auxiliary/gallivm/lp_bld_bitarit.c | 42 ++++++++++++++++++++++++
src/gallium/auxiliary/gallivm/lp_bld_bitarit.h | 5 +++
2 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
index a9c57d6..0a1ace1 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
@@ -62,6 +62,30 @@ lp_build_or(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
return res;
}
+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 +145,24 @@ lp_build_andnot(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
return res;
}
+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.
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
index 5c5b981..29f5def 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
@@ -48,6 +48,9 @@ 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);
LLVMValueRef
@@ -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 */
--
1.7.7.6
More information about the mesa-dev
mailing list