From f9d753787e6c566d3481cca07dee939239eb7071 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 15 Mar 2010 10:29:04 -0600 Subject: gallivm: fix incorrect floor(), itrunc() LLVMBuildFPTrunc() should be used for double->float conversion, not float->int conversion. There should be a better way to compute floor(), ceil(), etc that doesn't involve float->int->float conversion. --- src/gallium/auxiliary/gallivm/lp_bld_arit.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index aa47338b32..c39b062d10 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -930,7 +930,10 @@ lp_build_floor(struct lp_build_context *bld, assert(type.floating); if (type.length == 1) { - return LLVMBuildFPTrunc(bld->builder, a, LLVMFloatType(), ""); + LLVMValueRef res; + res = lp_build_ifloor(bld, a); + res = LLVMBuildSIToFP(bld->builder, res, LLVMFloatType(), ""); + return res; } if(util_cpu_caps.has_sse4_1) @@ -993,7 +996,7 @@ lp_build_itrunc(struct lp_build_context *bld, if (type.length == 1) { LLVMTypeRef int_type = LLVMIntType(type.width); - return LLVMBuildFPTrunc(bld->builder, a, int_type, ""); + return LLVMBuildFPToSI(bld->builder, a, int_type, ""); } else { LLVMTypeRef int_vec_type = lp_build_int_vec_type(type); -- cgit v1.2.3