gallivm: add bitarit xor and not ops.

Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie
2012-02-17 19:02:21 +00:00
parent 72931ca4b9
commit aec11e4daa
2 changed files with 49 additions and 0 deletions
@@ -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.
@@ -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 */