mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-16 23:50:37 +01:00
gallivm: Fix bitwise operations for floats, division for integers
http://bugs.freedesktop.org/29407 Signed-off-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
parent
a44a6960fa
commit
20b3e40f16
2 changed files with 27 additions and 5 deletions
|
|
@ -588,13 +588,24 @@ lp_build_div(struct lp_build_context *bld,
|
|||
if(a == bld->undef || b == bld->undef)
|
||||
return bld->undef;
|
||||
|
||||
if(LLVMIsConstant(a) && LLVMIsConstant(b))
|
||||
return LLVMConstFDiv(a, b);
|
||||
if(LLVMIsConstant(a) && LLVMIsConstant(b)) {
|
||||
if (type.floating)
|
||||
return LLVMConstFDiv(a, b);
|
||||
else if (type.sign)
|
||||
return LLVMConstSDiv(a, b);
|
||||
else
|
||||
return LLVMConstUDiv(a, b);
|
||||
}
|
||||
|
||||
if(util_cpu_caps.has_sse && type.width == 32 && type.length == 4)
|
||||
return lp_build_mul(bld, a, lp_build_rcp(bld, b));
|
||||
|
||||
return LLVMBuildFDiv(bld->builder, a, b, "");
|
||||
if (type.floating)
|
||||
return LLVMBuildFDiv(bld->builder, a, b, "");
|
||||
else if (type.sign)
|
||||
return LLVMBuildSDiv(bld->builder, a, b, "");
|
||||
else
|
||||
return LLVMBuildUDiv(bld->builder, a, b, "");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -550,11 +550,22 @@ lp_build_select_aos(struct lp_build_context *bld,
|
|||
LLVMValueRef
|
||||
lp_build_andc(struct lp_build_context *bld, LLVMValueRef a, LLVMValueRef b)
|
||||
{
|
||||
assert(lp_check_value(bld->type, a));
|
||||
assert(lp_check_value(bld->type, b));
|
||||
const struct lp_type type = bld->type;
|
||||
|
||||
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(bld->builder, a, bld->int_vec_type, "");
|
||||
b = LLVMBuildBitCast(bld->builder, b, bld->int_vec_type, "");
|
||||
}
|
||||
|
||||
b = LLVMBuildNot(bld->builder, b, "");
|
||||
b = LLVMBuildAnd(bld->builder, a, b, "");
|
||||
|
||||
if(type.floating) {
|
||||
b = LLVMBuildBitCast(bld->builder, b, bld->vec_type, "");
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue