mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 12:28:07 +02:00
gallivm: Always use floating-point operators for floating-point types
This fixes the assert added in LLVM 2.8:
assert(getType()->isIntOrIntVectorTy() &&
"Tried to create an integer operation on a non-integer type!")
But it also fixes some subtle bugs, since we should've been doing this
since LLVM 2.6 anyway.
Includes a modified patch from steckdenis@yahoo.fr for the
FNeg instructions in emit_fetch(); thanks for pointing those out.
http://bugs.freedesktop.org/29404
http://bugs.freedesktop.org/29407
Signed-off-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
parent
65b9747a54
commit
fc9a49b638
7 changed files with 137 additions and 92 deletions
|
|
@ -173,9 +173,15 @@ lp_build_comp(struct lp_build_context *bld,
|
|||
}
|
||||
|
||||
if(LLVMIsConstant(a))
|
||||
return LLVMConstSub(bld->one, a);
|
||||
if (type.floating)
|
||||
return LLVMConstFSub(bld->one, a);
|
||||
else
|
||||
return LLVMConstSub(bld->one, a);
|
||||
else
|
||||
return LLVMBuildSub(bld->builder, bld->one, a, "");
|
||||
if (type.floating)
|
||||
return LLVMBuildFSub(bld->builder, bld->one, a, "");
|
||||
else
|
||||
return LLVMBuildSub(bld->builder, bld->one, a, "");
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -220,9 +226,15 @@ lp_build_add(struct lp_build_context *bld,
|
|||
}
|
||||
|
||||
if(LLVMIsConstant(a) && LLVMIsConstant(b))
|
||||
res = LLVMConstAdd(a, b);
|
||||
if (type.floating)
|
||||
res = LLVMConstFAdd(a, b);
|
||||
else
|
||||
res = LLVMConstAdd(a, b);
|
||||
else
|
||||
res = LLVMBuildAdd(bld->builder, a, b, "");
|
||||
if (type.floating)
|
||||
res = LLVMBuildFAdd(bld->builder, a, b, "");
|
||||
else
|
||||
res = LLVMBuildAdd(bld->builder, a, b, "");
|
||||
|
||||
/* clamp to ceiling of 1.0 */
|
||||
if(bld->type.norm && (bld->type.floating || bld->type.fixed))
|
||||
|
|
@ -256,9 +268,16 @@ lp_build_sum_vector(struct lp_build_context *bld,
|
|||
|
||||
for (i = 1; i < type.length; i++) {
|
||||
index = LLVMConstInt(LLVMInt32Type(), i, 0);
|
||||
res = LLVMBuildAdd(bld->builder, res,
|
||||
LLVMBuildExtractElement(bld->builder, a, index, ""),
|
||||
"");
|
||||
if (type.floating)
|
||||
res = LLVMBuildFAdd(bld->builder, res,
|
||||
LLVMBuildExtractElement(bld->builder,
|
||||
a, index, ""),
|
||||
"");
|
||||
else
|
||||
res = LLVMBuildAdd(bld->builder, res,
|
||||
LLVMBuildExtractElement(bld->builder,
|
||||
a, index, ""),
|
||||
"");
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
@ -306,9 +325,15 @@ lp_build_sub(struct lp_build_context *bld,
|
|||
}
|
||||
|
||||
if(LLVMIsConstant(a) && LLVMIsConstant(b))
|
||||
res = LLVMConstSub(a, b);
|
||||
if (type.floating)
|
||||
res = LLVMConstFSub(a, b);
|
||||
else
|
||||
res = LLVMConstSub(a, b);
|
||||
else
|
||||
res = LLVMBuildSub(bld->builder, a, b, "");
|
||||
if (type.floating)
|
||||
res = LLVMBuildFSub(bld->builder, a, b, "");
|
||||
else
|
||||
res = LLVMBuildSub(bld->builder, a, b, "");
|
||||
|
||||
if(bld->type.norm && (bld->type.floating || bld->type.fixed))
|
||||
res = lp_build_max_simple(bld, res, bld->zero);
|
||||
|
|
@ -442,7 +467,10 @@ lp_build_mul(struct lp_build_context *bld,
|
|||
shift = NULL;
|
||||
|
||||
if(LLVMIsConstant(a) && LLVMIsConstant(b)) {
|
||||
res = LLVMConstMul(a, b);
|
||||
if (type.floating)
|
||||
res = LLVMConstFMul(a, b);
|
||||
else
|
||||
res = LLVMConstMul(a, b);
|
||||
if(shift) {
|
||||
if(type.sign)
|
||||
res = LLVMConstAShr(res, shift);
|
||||
|
|
@ -451,7 +479,10 @@ lp_build_mul(struct lp_build_context *bld,
|
|||
}
|
||||
}
|
||||
else {
|
||||
res = LLVMBuildMul(bld->builder, a, b, "");
|
||||
if (type.floating)
|
||||
res = LLVMBuildFMul(bld->builder, a, b, "");
|
||||
else
|
||||
res = LLVMBuildMul(bld->builder, a, b, "");
|
||||
if(shift) {
|
||||
if(type.sign)
|
||||
res = LLVMBuildAShr(bld->builder, res, shift, "");
|
||||
|
|
@ -481,7 +512,10 @@ lp_build_mul_imm(struct lp_build_context *bld,
|
|||
return a;
|
||||
|
||||
if(b == -1)
|
||||
return LLVMBuildNeg(bld->builder, a, "");
|
||||
if (bld->type.floating)
|
||||
return LLVMBuildFNeg(bld->builder, a, "");
|
||||
else
|
||||
return LLVMBuildNeg(bld->builder, a, "");
|
||||
|
||||
if(b == 2 && bld->type.floating)
|
||||
return lp_build_add(bld, a, a);
|
||||
|
|
@ -714,7 +748,12 @@ LLVMValueRef
|
|||
lp_build_negate(struct lp_build_context *bld,
|
||||
LLVMValueRef a)
|
||||
{
|
||||
return LLVMBuildNeg(bld->builder, a, "");
|
||||
if (bld->type.floating)
|
||||
a = LLVMBuildFNeg(bld->builder, a, "");
|
||||
else
|
||||
a = LLVMBuildNeg(bld->builder, a, "");
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1033,7 +1072,7 @@ lp_build_iround(struct lp_build_context *bld,
|
|||
half = LLVMBuildOr(bld->builder, sign, half, "");
|
||||
half = LLVMBuildBitCast(bld->builder, half, vec_type, "");
|
||||
|
||||
res = LLVMBuildAdd(bld->builder, a, half, "");
|
||||
res = LLVMBuildFAdd(bld->builder, a, half, "");
|
||||
}
|
||||
|
||||
res = LLVMBuildFPToSI(bld->builder, res, int_vec_type, "");
|
||||
|
|
@ -1082,7 +1121,7 @@ lp_build_ifloor(struct lp_build_context *bld,
|
|||
offset = LLVMBuildAnd(bld->builder, offset, sign, "");
|
||||
offset = LLVMBuildBitCast(bld->builder, offset, vec_type, "ifloor.offset");
|
||||
|
||||
res = LLVMBuildAdd(bld->builder, a, offset, "ifloor.res");
|
||||
res = LLVMBuildFAdd(bld->builder, a, offset, "ifloor.res");
|
||||
}
|
||||
|
||||
/* round to nearest (toward zero) */
|
||||
|
|
@ -1132,7 +1171,7 @@ lp_build_iceil(struct lp_build_context *bld,
|
|||
offset = LLVMBuildAnd(bld->builder, offset, sign, "");
|
||||
offset = LLVMBuildBitCast(bld->builder, offset, vec_type, "iceil.offset");
|
||||
|
||||
res = LLVMBuildAdd(bld->builder, a, offset, "iceil.res");
|
||||
res = LLVMBuildFAdd(bld->builder, a, offset, "iceil.res");
|
||||
}
|
||||
|
||||
/* round to nearest (toward zero) */
|
||||
|
|
@ -1197,9 +1236,9 @@ lp_build_rcp(struct lp_build_context *bld,
|
|||
|
||||
rcp_a = lp_build_intrinsic_unary(bld->builder, "llvm.x86.sse.rcp.ps", lp_build_vec_type(type), a);
|
||||
|
||||
res = LLVMBuildMul(bld->builder, a, rcp_a, "");
|
||||
res = LLVMBuildSub(bld->builder, two, res, "");
|
||||
res = LLVMBuildMul(bld->builder, res, rcp_a, "");
|
||||
res = LLVMBuildFMul(bld->builder, a, rcp_a, "");
|
||||
res = LLVMBuildFSub(bld->builder, two, res, "");
|
||||
res = LLVMBuildFMul(bld->builder, res, rcp_a, "");
|
||||
|
||||
return rcp_a;
|
||||
#else
|
||||
|
|
@ -1282,7 +1321,7 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
*/
|
||||
|
||||
LLVMValueRef FOPi = lp_build_const_v4sf(1.27323954473516);
|
||||
LLVMValueRef scale_y = LLVMBuildMul(b, x_abs, FOPi, "scale_y");
|
||||
LLVMValueRef scale_y = LLVMBuildFMul(b, x_abs, FOPi, "scale_y");
|
||||
|
||||
/*
|
||||
* store the integer part of y in mm0
|
||||
|
|
@ -1356,9 +1395,9 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
* xmm2 = _mm_mul_ps(y, xmm2);
|
||||
* xmm3 = _mm_mul_ps(y, xmm3);
|
||||
*/
|
||||
LLVMValueRef xmm1 = LLVMBuildMul(b, y_2, DP1, "xmm1");
|
||||
LLVMValueRef xmm2 = LLVMBuildMul(b, y_2, DP2, "xmm2");
|
||||
LLVMValueRef xmm3 = LLVMBuildMul(b, y_2, DP3, "xmm3");
|
||||
LLVMValueRef xmm1 = LLVMBuildFMul(b, y_2, DP1, "xmm1");
|
||||
LLVMValueRef xmm2 = LLVMBuildFMul(b, y_2, DP2, "xmm2");
|
||||
LLVMValueRef xmm3 = LLVMBuildFMul(b, y_2, DP3, "xmm3");
|
||||
|
||||
/*
|
||||
* x = _mm_add_ps(x, xmm1);
|
||||
|
|
@ -1366,16 +1405,16 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
* x = _mm_add_ps(x, xmm3);
|
||||
*/
|
||||
|
||||
LLVMValueRef x_1 = LLVMBuildAdd(b, x_abs, xmm1, "x_1");
|
||||
LLVMValueRef x_2 = LLVMBuildAdd(b, x_1, xmm2, "x_2");
|
||||
LLVMValueRef x_3 = LLVMBuildAdd(b, x_2, xmm3, "x_3");
|
||||
LLVMValueRef x_1 = LLVMBuildFAdd(b, x_abs, xmm1, "x_1");
|
||||
LLVMValueRef x_2 = LLVMBuildFAdd(b, x_1, xmm2, "x_2");
|
||||
LLVMValueRef x_3 = LLVMBuildFAdd(b, x_2, xmm3, "x_3");
|
||||
|
||||
/*
|
||||
* Evaluate the first polynom (0 <= x <= Pi/4)
|
||||
*
|
||||
* z = _mm_mul_ps(x,x);
|
||||
*/
|
||||
LLVMValueRef z = LLVMBuildMul(b, x_3, x_3, "z");
|
||||
LLVMValueRef z = LLVMBuildFMul(b, x_3, x_3, "z");
|
||||
|
||||
/*
|
||||
* _PS_CONST(coscof_p0, 2.443315711809948E-005);
|
||||
|
|
@ -1390,12 +1429,12 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
* y = *(v4sf*)_ps_coscof_p0;
|
||||
* y = _mm_mul_ps(y, z);
|
||||
*/
|
||||
LLVMValueRef y_3 = LLVMBuildMul(b, z, coscof_p0, "y_3");
|
||||
LLVMValueRef y_4 = LLVMBuildAdd(b, y_3, coscof_p1, "y_4");
|
||||
LLVMValueRef y_5 = LLVMBuildMul(b, y_4, z, "y_5");
|
||||
LLVMValueRef y_6 = LLVMBuildAdd(b, y_5, coscof_p2, "y_6");
|
||||
LLVMValueRef y_7 = LLVMBuildMul(b, y_6, z, "y_7");
|
||||
LLVMValueRef y_8 = LLVMBuildMul(b, y_7, z, "y_8");
|
||||
LLVMValueRef y_3 = LLVMBuildFMul(b, z, coscof_p0, "y_3");
|
||||
LLVMValueRef y_4 = LLVMBuildFAdd(b, y_3, coscof_p1, "y_4");
|
||||
LLVMValueRef y_5 = LLVMBuildFMul(b, y_4, z, "y_5");
|
||||
LLVMValueRef y_6 = LLVMBuildFAdd(b, y_5, coscof_p2, "y_6");
|
||||
LLVMValueRef y_7 = LLVMBuildFMul(b, y_6, z, "y_7");
|
||||
LLVMValueRef y_8 = LLVMBuildFMul(b, y_7, z, "y_8");
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -1404,10 +1443,10 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
* y = _mm_add_ps(y, *(v4sf*)_ps_1);
|
||||
*/
|
||||
LLVMValueRef half = lp_build_const_v4sf(0.5);
|
||||
LLVMValueRef tmp = LLVMBuildMul(b, z, half, "tmp");
|
||||
LLVMValueRef y_9 = LLVMBuildSub(b, y_8, tmp, "y_8");
|
||||
LLVMValueRef tmp = LLVMBuildFMul(b, z, half, "tmp");
|
||||
LLVMValueRef y_9 = LLVMBuildFSub(b, y_8, tmp, "y_8");
|
||||
LLVMValueRef one = lp_build_const_v4sf(1.0);
|
||||
LLVMValueRef y_10 = LLVMBuildAdd(b, y_9, one, "y_9");
|
||||
LLVMValueRef y_10 = LLVMBuildFAdd(b, y_9, one, "y_9");
|
||||
|
||||
/*
|
||||
* _PS_CONST(sincof_p0, -1.9515295891E-4);
|
||||
|
|
@ -1431,13 +1470,13 @@ lp_build_sin(struct lp_build_context *bld,
|
|||
* y2 = _mm_add_ps(y2, x);
|
||||
*/
|
||||
|
||||
LLVMValueRef y2_3 = LLVMBuildMul(b, z, sincof_p0, "y2_3");
|
||||
LLVMValueRef y2_4 = LLVMBuildAdd(b, y2_3, sincof_p1, "y2_4");
|
||||
LLVMValueRef y2_5 = LLVMBuildMul(b, y2_4, z, "y2_5");
|
||||
LLVMValueRef y2_6 = LLVMBuildAdd(b, y2_5, sincof_p2, "y2_6");
|
||||
LLVMValueRef y2_7 = LLVMBuildMul(b, y2_6, z, "y2_7");
|
||||
LLVMValueRef y2_8 = LLVMBuildMul(b, y2_7, x_3, "y2_8");
|
||||
LLVMValueRef y2_9 = LLVMBuildAdd(b, y2_8, x_3, "y2_9");
|
||||
LLVMValueRef y2_3 = LLVMBuildFMul(b, z, sincof_p0, "y2_3");
|
||||
LLVMValueRef y2_4 = LLVMBuildFAdd(b, y2_3, sincof_p1, "y2_4");
|
||||
LLVMValueRef y2_5 = LLVMBuildFMul(b, y2_4, z, "y2_5");
|
||||
LLVMValueRef y2_6 = LLVMBuildFAdd(b, y2_5, sincof_p2, "y2_6");
|
||||
LLVMValueRef y2_7 = LLVMBuildFMul(b, y2_6, z, "y2_7");
|
||||
LLVMValueRef y2_8 = LLVMBuildFMul(b, y2_7, x_3, "y2_8");
|
||||
LLVMValueRef y2_9 = LLVMBuildFAdd(b, y2_8, x_3, "y2_9");
|
||||
|
||||
/*
|
||||
* select the correct result from the two polynoms
|
||||
|
|
@ -1493,7 +1532,7 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
*/
|
||||
|
||||
LLVMValueRef FOPi = lp_build_const_v4sf(1.27323954473516);
|
||||
LLVMValueRef scale_y = LLVMBuildMul(b, x_abs, FOPi, "scale_y");
|
||||
LLVMValueRef scale_y = LLVMBuildFMul(b, x_abs, FOPi, "scale_y");
|
||||
|
||||
/*
|
||||
* store the integer part of y in mm0
|
||||
|
|
@ -1573,9 +1612,9 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
* xmm2 = _mm_mul_ps(y, xmm2);
|
||||
* xmm3 = _mm_mul_ps(y, xmm3);
|
||||
*/
|
||||
LLVMValueRef xmm1 = LLVMBuildMul(b, y_2, DP1, "xmm1");
|
||||
LLVMValueRef xmm2 = LLVMBuildMul(b, y_2, DP2, "xmm2");
|
||||
LLVMValueRef xmm3 = LLVMBuildMul(b, y_2, DP3, "xmm3");
|
||||
LLVMValueRef xmm1 = LLVMBuildFMul(b, y_2, DP1, "xmm1");
|
||||
LLVMValueRef xmm2 = LLVMBuildFMul(b, y_2, DP2, "xmm2");
|
||||
LLVMValueRef xmm3 = LLVMBuildFMul(b, y_2, DP3, "xmm3");
|
||||
|
||||
/*
|
||||
* x = _mm_add_ps(x, xmm1);
|
||||
|
|
@ -1583,16 +1622,16 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
* x = _mm_add_ps(x, xmm3);
|
||||
*/
|
||||
|
||||
LLVMValueRef x_1 = LLVMBuildAdd(b, x_abs, xmm1, "x_1");
|
||||
LLVMValueRef x_2 = LLVMBuildAdd(b, x_1, xmm2, "x_2");
|
||||
LLVMValueRef x_3 = LLVMBuildAdd(b, x_2, xmm3, "x_3");
|
||||
LLVMValueRef x_1 = LLVMBuildFAdd(b, x_abs, xmm1, "x_1");
|
||||
LLVMValueRef x_2 = LLVMBuildFAdd(b, x_1, xmm2, "x_2");
|
||||
LLVMValueRef x_3 = LLVMBuildFAdd(b, x_2, xmm3, "x_3");
|
||||
|
||||
/*
|
||||
* Evaluate the first polynom (0 <= x <= Pi/4)
|
||||
*
|
||||
* z = _mm_mul_ps(x,x);
|
||||
*/
|
||||
LLVMValueRef z = LLVMBuildMul(b, x_3, x_3, "z");
|
||||
LLVMValueRef z = LLVMBuildFMul(b, x_3, x_3, "z");
|
||||
|
||||
/*
|
||||
* _PS_CONST(coscof_p0, 2.443315711809948E-005);
|
||||
|
|
@ -1607,12 +1646,12 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
* y = *(v4sf*)_ps_coscof_p0;
|
||||
* y = _mm_mul_ps(y, z);
|
||||
*/
|
||||
LLVMValueRef y_3 = LLVMBuildMul(b, z, coscof_p0, "y_3");
|
||||
LLVMValueRef y_4 = LLVMBuildAdd(b, y_3, coscof_p1, "y_4");
|
||||
LLVMValueRef y_5 = LLVMBuildMul(b, y_4, z, "y_5");
|
||||
LLVMValueRef y_6 = LLVMBuildAdd(b, y_5, coscof_p2, "y_6");
|
||||
LLVMValueRef y_7 = LLVMBuildMul(b, y_6, z, "y_7");
|
||||
LLVMValueRef y_8 = LLVMBuildMul(b, y_7, z, "y_8");
|
||||
LLVMValueRef y_3 = LLVMBuildFMul(b, z, coscof_p0, "y_3");
|
||||
LLVMValueRef y_4 = LLVMBuildFAdd(b, y_3, coscof_p1, "y_4");
|
||||
LLVMValueRef y_5 = LLVMBuildFMul(b, y_4, z, "y_5");
|
||||
LLVMValueRef y_6 = LLVMBuildFAdd(b, y_5, coscof_p2, "y_6");
|
||||
LLVMValueRef y_7 = LLVMBuildFMul(b, y_6, z, "y_7");
|
||||
LLVMValueRef y_8 = LLVMBuildFMul(b, y_7, z, "y_8");
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -1621,10 +1660,10 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
* y = _mm_add_ps(y, *(v4sf*)_ps_1);
|
||||
*/
|
||||
LLVMValueRef half = lp_build_const_v4sf(0.5);
|
||||
LLVMValueRef tmp = LLVMBuildMul(b, z, half, "tmp");
|
||||
LLVMValueRef y_9 = LLVMBuildSub(b, y_8, tmp, "y_8");
|
||||
LLVMValueRef tmp = LLVMBuildFMul(b, z, half, "tmp");
|
||||
LLVMValueRef y_9 = LLVMBuildFSub(b, y_8, tmp, "y_8");
|
||||
LLVMValueRef one = lp_build_const_v4sf(1.0);
|
||||
LLVMValueRef y_10 = LLVMBuildAdd(b, y_9, one, "y_9");
|
||||
LLVMValueRef y_10 = LLVMBuildFAdd(b, y_9, one, "y_9");
|
||||
|
||||
/*
|
||||
* _PS_CONST(sincof_p0, -1.9515295891E-4);
|
||||
|
|
@ -1648,13 +1687,13 @@ lp_build_cos(struct lp_build_context *bld,
|
|||
* y2 = _mm_add_ps(y2, x);
|
||||
*/
|
||||
|
||||
LLVMValueRef y2_3 = LLVMBuildMul(b, z, sincof_p0, "y2_3");
|
||||
LLVMValueRef y2_4 = LLVMBuildAdd(b, y2_3, sincof_p1, "y2_4");
|
||||
LLVMValueRef y2_5 = LLVMBuildMul(b, y2_4, z, "y2_5");
|
||||
LLVMValueRef y2_6 = LLVMBuildAdd(b, y2_5, sincof_p2, "y2_6");
|
||||
LLVMValueRef y2_7 = LLVMBuildMul(b, y2_6, z, "y2_7");
|
||||
LLVMValueRef y2_8 = LLVMBuildMul(b, y2_7, x_3, "y2_8");
|
||||
LLVMValueRef y2_9 = LLVMBuildAdd(b, y2_8, x_3, "y2_9");
|
||||
LLVMValueRef y2_3 = LLVMBuildFMul(b, z, sincof_p0, "y2_3");
|
||||
LLVMValueRef y2_4 = LLVMBuildFAdd(b, y2_3, sincof_p1, "y2_4");
|
||||
LLVMValueRef y2_5 = LLVMBuildFMul(b, y2_4, z, "y2_5");
|
||||
LLVMValueRef y2_6 = LLVMBuildFAdd(b, y2_5, sincof_p2, "y2_6");
|
||||
LLVMValueRef y2_7 = LLVMBuildFMul(b, y2_6, z, "y2_7");
|
||||
LLVMValueRef y2_8 = LLVMBuildFMul(b, y2_7, x_3, "y2_8");
|
||||
LLVMValueRef y2_9 = LLVMBuildFAdd(b, y2_8, x_3, "y2_9");
|
||||
|
||||
/*
|
||||
* select the correct result from the two polynoms
|
||||
|
|
@ -1829,7 +1868,7 @@ lp_build_exp2_approx(struct lp_build_context *bld,
|
|||
ipart = lp_build_floor(bld, x);
|
||||
|
||||
/* fpart = x - ipart */
|
||||
fpart = LLVMBuildSub(bld->builder, x, ipart, "");
|
||||
fpart = LLVMBuildFSub(bld->builder, x, ipart, "");
|
||||
}
|
||||
|
||||
if(p_exp2_int_part || p_exp2) {
|
||||
|
|
@ -1844,7 +1883,7 @@ lp_build_exp2_approx(struct lp_build_context *bld,
|
|||
expfpart = lp_build_polynomial(bld, fpart, lp_build_exp2_polynomial,
|
||||
Elements(lp_build_exp2_polynomial));
|
||||
|
||||
res = LLVMBuildMul(bld->builder, expipart, expfpart, "");
|
||||
res = LLVMBuildFMul(bld->builder, expipart, expfpart, "");
|
||||
}
|
||||
|
||||
if(p_exp2_int_part)
|
||||
|
|
@ -1957,9 +1996,9 @@ lp_build_log2_approx(struct lp_build_context *bld,
|
|||
Elements(lp_build_log2_polynomial));
|
||||
|
||||
/* This effectively increases the polynomial degree by one, but ensures that log2(1) == 0*/
|
||||
logmant = LLVMBuildMul(bld->builder, logmant, LLVMBuildSub(bld->builder, mant, bld->one, ""), "");
|
||||
logmant = LLVMBuildFMul(bld->builder, logmant, LLVMBuildFSub(bld->builder, mant, bld->one, ""), "");
|
||||
|
||||
res = LLVMBuildAdd(bld->builder, logmant, logexp, "");
|
||||
res = LLVMBuildFAdd(bld->builder, logmant, logexp, "");
|
||||
}
|
||||
|
||||
if(p_exp) {
|
||||
|
|
|
|||
|
|
@ -117,8 +117,8 @@ lp_build_clamped_float_to_unsigned_norm(LLVMBuilderRef builder,
|
|||
scale = (double)mask/ubound;
|
||||
bias = (double)((unsigned long long)1 << (mantissa - n));
|
||||
|
||||
res = LLVMBuildMul(builder, src, lp_build_const_vec(src_type, scale), "");
|
||||
res = LLVMBuildAdd(builder, res, lp_build_const_vec(src_type, bias), "");
|
||||
res = LLVMBuildFMul(builder, src, lp_build_const_vec(src_type, scale), "");
|
||||
res = LLVMBuildFAdd(builder, res, lp_build_const_vec(src_type, bias), "");
|
||||
res = LLVMBuildBitCast(builder, res, int_vec_type, "");
|
||||
|
||||
if(dst_width > n) {
|
||||
|
|
@ -175,6 +175,8 @@ lp_build_unsigned_norm_to_float(LLVMBuilderRef builder,
|
|||
double scale;
|
||||
double bias;
|
||||
|
||||
assert(dst_type.floating);
|
||||
|
||||
mantissa = lp_mantissa(dst_type);
|
||||
|
||||
n = MIN2(mantissa, src_width);
|
||||
|
|
@ -199,8 +201,8 @@ lp_build_unsigned_norm_to_float(LLVMBuilderRef builder,
|
|||
|
||||
res = LLVMBuildBitCast(builder, res, vec_type, "");
|
||||
|
||||
res = LLVMBuildSub(builder, res, bias_, "");
|
||||
res = LLVMBuildMul(builder, res, lp_build_const_vec(dst_type, scale), "");
|
||||
res = LLVMBuildFSub(builder, res, bias_, "");
|
||||
res = LLVMBuildFMul(builder, res, lp_build_const_vec(dst_type, scale), "");
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
@ -296,7 +298,7 @@ lp_build_conv(LLVMBuilderRef builder,
|
|||
if (dst_scale != 1.0) {
|
||||
LLVMValueRef scale = lp_build_const_vec(tmp_type, dst_scale);
|
||||
for(i = 0; i < num_tmps; ++i)
|
||||
tmp[i] = LLVMBuildMul(builder, tmp[i], scale, "");
|
||||
tmp[i] = LLVMBuildFMul(builder, tmp[i], scale, "");
|
||||
}
|
||||
|
||||
/* Use an equally sized integer for intermediate computations */
|
||||
|
|
@ -391,7 +393,7 @@ lp_build_conv(LLVMBuilderRef builder,
|
|||
if (src_scale != 1.0) {
|
||||
LLVMValueRef scale = lp_build_const_vec(tmp_type, 1.0/src_scale);
|
||||
for(i = 0; i < num_tmps; ++i)
|
||||
tmp[i] = LLVMBuildMul(builder, tmp[i], scale, "");
|
||||
tmp[i] = LLVMBuildFMul(builder, tmp[i], scale, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ lp_build_unpack_arith_rgba_aos(LLVMBuilderRef builder,
|
|||
*/
|
||||
|
||||
if (normalized)
|
||||
scaled = LLVMBuildMul(builder, casted, LLVMConstVector(scales, 4), "");
|
||||
scaled = LLVMBuildFMul(builder, casted, LLVMConstVector(scales, 4), "");
|
||||
else
|
||||
scaled = casted;
|
||||
|
||||
|
|
@ -322,7 +322,7 @@ lp_build_pack_rgba_aos(LLVMBuilderRef builder,
|
|||
}
|
||||
|
||||
if (normalized)
|
||||
scaled = LLVMBuildMul(builder, unswizzled, LLVMConstVector(scales, 4), "");
|
||||
scaled = LLVMBuildFMul(builder, unswizzled, LLVMConstVector(scales, 4), "");
|
||||
else
|
||||
scaled = unswizzled;
|
||||
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
|
|||
if (format_desc->channel[chan].normalized) {
|
||||
double scale = 1.0 / ((1 << (format_desc->channel[chan].size - 1)) - 1);
|
||||
LLVMValueRef scale_val = lp_build_const_vec(type, scale);
|
||||
input = LLVMBuildMul(builder, input, scale_val, "");
|
||||
input = LLVMBuildFMul(builder, input, scale_val, "");
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
@ -227,7 +227,7 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
|
|||
double scale = 1.0 / ((1 << (format_desc->channel[chan].size/2)) - 1);
|
||||
LLVMValueRef scale_val = lp_build_const_vec(type, scale);
|
||||
input = LLVMBuildSIToFP(builder, input, lp_build_vec_type(type), "");
|
||||
input = LLVMBuildMul(builder, input, scale_val, "");
|
||||
input = LLVMBuildFMul(builder, input, scale_val, "");
|
||||
}
|
||||
else {
|
||||
/* FIXME */
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ lp_build_scalar_ddx(struct lp_build_context *bld,
|
|||
LLVMValueRef idx_right = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_TOP_RIGHT, 0);
|
||||
LLVMValueRef a_left = LLVMBuildExtractElement(bld->builder, a, idx_left, "");
|
||||
LLVMValueRef a_right = LLVMBuildExtractElement(bld->builder, a, idx_right, "");
|
||||
return LLVMBuildSub(bld->builder, a_right, a_left, "");
|
||||
return lp_build_sub(bld, a_right, a_left);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -97,5 +97,5 @@ lp_build_scalar_ddy(struct lp_build_context *bld,
|
|||
LLVMValueRef idx_bottom = LLVMConstInt(LLVMInt32Type(), LP_BLD_QUAD_BOTTOM_LEFT, 0);
|
||||
LLVMValueRef a_top = LLVMBuildExtractElement(bld->builder, a, idx_top, "");
|
||||
LLVMValueRef a_bottom = LLVMBuildExtractElement(bld->builder, a, idx_bottom, "");
|
||||
return LLVMBuildSub(bld->builder, a_bottom, a_top, "");
|
||||
return lp_build_sub(bld, a_bottom, a_top);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -888,17 +888,17 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
|
|||
/* Compute rho = max of all partial derivatives scaled by texture size.
|
||||
* XXX this could be vectorized somewhat
|
||||
*/
|
||||
rho = LLVMBuildMul(bld->builder,
|
||||
rho = LLVMBuildFMul(bld->builder,
|
||||
lp_build_max(float_bld, dsdx, dsdy),
|
||||
lp_build_int_to_float(float_bld, width), "");
|
||||
if (dims > 1) {
|
||||
LLVMValueRef max;
|
||||
max = LLVMBuildMul(bld->builder,
|
||||
max = LLVMBuildFMul(bld->builder,
|
||||
lp_build_max(float_bld, dtdx, dtdy),
|
||||
lp_build_int_to_float(float_bld, height), "");
|
||||
rho = lp_build_max(float_bld, rho, max);
|
||||
if (dims > 2) {
|
||||
max = LLVMBuildMul(bld->builder,
|
||||
max = LLVMBuildFMul(bld->builder,
|
||||
lp_build_max(float_bld, drdx, drdy),
|
||||
lp_build_int_to_float(float_bld, depth), "");
|
||||
rho = lp_build_max(float_bld, rho, max);
|
||||
|
|
@ -912,12 +912,12 @@ lp_build_lod_selector(struct lp_build_sample_context *bld,
|
|||
if (lod_bias) {
|
||||
lod_bias = LLVMBuildExtractElement(bld->builder, lod_bias,
|
||||
index0, "");
|
||||
lod = LLVMBuildAdd(bld->builder, lod, lod_bias, "shader_lod_bias");
|
||||
lod = LLVMBuildFAdd(bld->builder, lod, lod_bias, "shader_lod_bias");
|
||||
}
|
||||
}
|
||||
|
||||
/* add sampler lod bias */
|
||||
lod = LLVMBuildAdd(bld->builder, lod, sampler_lod_bias, "sampler_lod_bias");
|
||||
lod = LLVMBuildFAdd(bld->builder, lod, sampler_lod_bias, "sampler_lod_bias");
|
||||
|
||||
/* clamp lod */
|
||||
lod = lp_build_clamp(float_bld, lod, min_lod, max_lod);
|
||||
|
|
@ -2029,6 +2029,8 @@ lp_build_sample_soa(LLVMBuilderRef builder,
|
|||
debug_printf("Sample from %s\n", util_format_name(fmt));
|
||||
}
|
||||
|
||||
assert(type.floating);
|
||||
|
||||
/* Setup our build context */
|
||||
memset(&bld, 0, sizeof bld);
|
||||
bld.builder = builder;
|
||||
|
|
|
|||
|
|
@ -506,6 +506,7 @@ emit_fetch(
|
|||
const unsigned chan_index )
|
||||
{
|
||||
const struct tgsi_full_src_register *reg = &inst->Src[src_op];
|
||||
const struct lp_type type = bld->base.type;
|
||||
const unsigned swizzle =
|
||||
tgsi_util_get_full_src_register_swizzle(reg, chan_index);
|
||||
LLVMValueRef res;
|
||||
|
|
@ -612,11 +613,12 @@ emit_fetch(
|
|||
case TGSI_UTIL_SIGN_SET:
|
||||
/* TODO: Use bitwese OR for floating point */
|
||||
res = lp_build_abs( &bld->base, res );
|
||||
res = LLVMBuildNeg( bld->base.builder, res, "" );
|
||||
break;
|
||||
|
||||
/* fall through */
|
||||
case TGSI_UTIL_SIGN_TOGGLE:
|
||||
res = LLVMBuildNeg( bld->base.builder, res, "" );
|
||||
if (type.floating)
|
||||
res = LLVMBuildFNeg( bld->base.builder, res, "" );
|
||||
else
|
||||
res = LLVMBuildNeg( bld->base.builder, res, "" );
|
||||
break;
|
||||
|
||||
case TGSI_UTIL_SIGN_KEEP:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue