gallivm: add bitarit xor and not ops.
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user