Commit f7c06785 authored by Zack Rusin's avatar Zack Rusin
Browse files

gallivm: add a log function that handles edge cases



Same as log2_safe, which means that it can handle infs, 0s and
nans.
Signed-off-by: default avatarZack Rusin <zackr@vmware.com>
Reviewed-by: default avatarJose Fonseca <jfonseca@vmware.com>
Reviewed-by: default avatarRoland Scheidegger <sroland@vmware.com>
parent 018c69ac
......@@ -3080,6 +3080,7 @@ lp_build_exp(struct lp_build_context *bld,
/**
* Generate log(x)
* Behavior is undefined with infs, 0s and nans
*/
LLVMValueRef
lp_build_log(struct lp_build_context *bld,
......@@ -3094,6 +3095,22 @@ lp_build_log(struct lp_build_context *bld,
return lp_build_mul(bld, log2, lp_build_log2(bld, x));
}
/**
* Generate log(x) that handles edge cases (infs, 0s and nans)
*/
LLVMValueRef
lp_build_log_safe(struct lp_build_context *bld,
LLVMValueRef x)
{
/* log(2) */
LLVMValueRef log2 = lp_build_const_vec(bld->gallivm, bld->type,
0.69314718055994529);
assert(lp_check_value(bld->type, x));
return lp_build_mul(bld, log2, lp_build_log2_safe(bld, x));
}
/**
* Generate polynomial.
......
......@@ -291,6 +291,10 @@ LLVMValueRef
lp_build_log(struct lp_build_context *bld,
LLVMValueRef a);
LLVMValueRef
lp_build_log_safe(struct lp_build_context *bld,
LLVMValueRef a);
LLVMValueRef
lp_build_exp2(struct lp_build_context *bld,
LLVMValueRef a);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment