summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-03-10 18:07:13 -0700
committerBrian Paul <[email protected]>2010-03-10 18:09:49 -0700
commita599f552f2ee86004216fe062bf4885de9c9ae96 (patch)
tree862650746cca3e756d9f1885f8f6994e83516723
parent22bb7ffd04ca9296bcafa929f448203880cbcb2b (diff)
gallivm: handle scalar floats in lp_build_floor() and lp_build_iround()
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_arit.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
index e2c67883972..f55d2b6d15e 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
@@ -883,6 +883,10 @@ lp_build_floor(struct lp_build_context *bld,
assert(type.floating);
+ if (type.length == 1) {
+ return LLVMBuildFPTrunc(bld->builder, a, LLVMFloatType(), "");
+ }
+
if(util_cpu_caps.has_sse4_1)
return lp_build_round_sse41(bld, a, LP_BUILD_ROUND_SSE41_FLOOR);
else {
@@ -953,6 +957,9 @@ lp_build_itrunc(struct lp_build_context *bld,
}
+/**
+ * Convert float[] to int[] with round().
+ */
LLVMValueRef
lp_build_iround(struct lp_build_context *bld,
LLVMValueRef a)
@@ -1013,6 +1020,14 @@ lp_build_ifloor(struct lp_build_context *bld,
LLVMValueRef res;
assert(type.floating);
+
+ if (type.length == 1) {
+ /* scalar float to int */
+ LLVMTypeRef int_type = LLVMIntType(type.width);
+ res = LLVMBuildFPToSI(bld->builder, a, int_type, "");
+ return res;
+ }
+
assert(lp_check_value(type, a));
if(util_cpu_caps.has_sse4_1) {