assert(type.floating);
assert(lp_check_value(type, a));
+ if (type.width == 16) {
+ char intrinsic[64];
+ lp_format_intrinsic(intrinsic, 64, "llvm.trunc", bld->vec_type);
+ return lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, a);
+ }
+
if (arch_rounding_available(type)) {
return lp_build_round_arch(bld, a, LP_BUILD_ROUND_TRUNCATE);
}
assert(type.floating);
assert(lp_check_value(type, a));
+ if (type.width == 16) {
+ char intrinsic[64];
+ lp_format_intrinsic(intrinsic, 64, "llvm.round", bld->vec_type);
+ return lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, a);
+ }
+
if (arch_rounding_available(type)) {
return lp_build_round_arch(bld, a, LP_BUILD_ROUND_NEAREST);
}
#include "lp_bld_logic.h"
#include "lp_bld_quad.h"
#include "lp_bld_flow.h"
+#include "lp_bld_intr.h"
#include "lp_bld_struct.h"
#include "lp_bld_debug.h"
#include "lp_bld_printf.h"
result = lp_build_rcp(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
break;
case nir_op_fround_even:
- result = lp_build_round(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
+ if (src_bit_size[0] == 16) {
+ struct lp_build_context *bld = get_flt_bld(bld_base, 16);
+ char intrinsic[64];
+ lp_format_intrinsic(intrinsic, 64, "llvm.roundeven", bld->vec_type);
+ result = lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, src[0]);
+ } else
+ result = lp_build_round(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
break;
case nir_op_frsq:
result = lp_build_rsqrt(get_flt_bld(bld_base, src_bit_size[0]), src[0]);