gallivm: added clamp and int_to_float functions
authorBrian Paul <brianp@vmware.com>
Wed, 24 Feb 2010 04:16:18 +0000 (21:16 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 24 Feb 2010 04:16:18 +0000 (21:16 -0700)
src/gallium/auxiliary/gallivm/lp_bld_arit.c
src/gallium/auxiliary/gallivm/lp_bld_arit.h

index 54b31befe6da7a576551c9c2610f8e55645865ee..bbce31f9eb20ee7870c767d913b759570719bea1 100644 (file)
@@ -613,6 +613,22 @@ lp_build_max(struct lp_build_context *bld,
 }
 
 
+/**
+ * Generate clamp(a, min, max)
+ * Do checks for special cases.
+ */
+LLVMValueRef
+lp_build_clamp(struct lp_build_context *bld,
+               LLVMValueRef a,
+               LLVMValueRef min,
+               LLVMValueRef max)
+{
+   a = lp_build_min(bld, a, max);
+   a = lp_build_max(bld, a, min);
+   return a;
+}
+
+
 /**
  * Generate abs(a)
  */
@@ -693,6 +709,29 @@ lp_build_sgn(struct lp_build_context *bld,
 }
 
 
+/**
+ * Convert vector of int to vector of float.
+ */
+LLVMValueRef
+lp_build_int_to_float(struct lp_build_context *bld,
+                      LLVMValueRef a)
+{
+   const struct lp_type type = bld->type;
+
+   assert(type.floating);
+   /*assert(lp_check_value(type, a));*/
+
+   {
+      LLVMTypeRef vec_type = lp_build_vec_type(type);
+      /*LLVMTypeRef int_vec_type = lp_build_int_vec_type(type);*/
+      LLVMValueRef res;
+      res = LLVMBuildSIToFP(bld->builder, a, vec_type, "");
+      return res;
+   }
+}
+
+
+
 enum lp_build_round_sse41_mode
 {
    LP_BUILD_ROUND_SSE41_NEAREST = 0,
@@ -819,7 +858,7 @@ lp_build_ceil(struct lp_build_context *bld,
 
 /**
  * Convert to integer, through whichever rounding method that's fastest,
- * typically truncating to zero.
+ * typically truncating toward zero.
  */
 LLVMValueRef
 lp_build_itrunc(struct lp_build_context *bld,
index 62be4b9aee18abfe85734106325d0d92f6628a15..da84b7ca02db061ca5c79ced23f4a9c805464c32 100644 (file)
@@ -106,6 +106,12 @@ lp_build_max(struct lp_build_context *bld,
              LLVMValueRef a,
              LLVMValueRef b);
 
+LLVMValueRef
+lp_build_clamp(struct lp_build_context *bld,
+               LLVMValueRef a,
+               LLVMValueRef min,
+               LLVMValueRef max);
+
 LLVMValueRef
 lp_build_abs(struct lp_build_context *bld,
              LLVMValueRef a);
@@ -114,6 +120,10 @@ LLVMValueRef
 lp_build_sgn(struct lp_build_context *bld,
              LLVMValueRef a);
 
+LLVMValueRef
+lp_build_int_to_float(struct lp_build_context *bld,
+                      LLVMValueRef a);
+
 LLVMValueRef
 lp_build_round(struct lp_build_context *bld,
                LLVMValueRef a);