gallivm: handle scalar floats in lp_build_floor() and lp_build_iround()
authorBrian Paul <brianp@vmware.com>
Thu, 11 Mar 2010 01:07:13 +0000 (18:07 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 11 Mar 2010 01:09:49 +0000 (18:09 -0700)
src/gallium/auxiliary/gallivm/lp_bld_arit.c

index e2c67883972e032f4c75f551237242ce9fb169d3..f55d2b6d15e230abb51a94d1774c1d352bf069f2 100644 (file)
@@ -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) {