https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112432
--- Comment #2 from Li Pan <pan2.li at intel dot com> --- (In reply to Richard Biener from comment #1) > Is there a corresponding C API? We don't have "generic" versions in > builtins.def either (with _VAR). > > That said, what's the testcase here? I found some FLOATN like api from glibc doc, when given N is 16. long int lrintfN (_FloatN x); long int lroundfN (_FloatN x); https://www.gnu.org/software/libc/manual/2.38/html_mono/libc.html The context comes from the autovec for the lrintf and lrintf16. For example as below void test_lrintf16 (long *out, _Float16 *in, unsigned count) { for (unsigned i = 0; i < count; i++) out[i] = __builtin_lrintf16 (in[i]); } void test_lrintf (long *out, float *in, unsigned count) { for (unsigned i = 0; i < count; i++) out[i] = __builtin_lrintf (in[i]); } We may have similar rtl code when compile with "-march=rv64gcv_zvfh_zfh -mabi=lp64d -O3 -ftree-vectorize -ffast-math". void test_lrintf16 (long *out, _Float16 *in, unsigned count) { # ivtmp.8_28 = PHI <ivtmp.8_27(4), ivtmp.8_26(3)> # ivtmp.9_25 = PHI <ivtmp.9_24(4), ivtmp.9_23(3)> _22 = (void *) ivtmp.8_28; _4 = MEM[(_Float16 *)_22]; _7 = __builtin_lrintf16 (_4); _21 = (void *) ivtmp.9_25; MEM[(long int *)_21] = _7; ivtmp.8_27 = ivtmp.8_28 + 2; ivtmp.9_24 = ivtmp.9_25 + 8; } void test_lrintf (long *out, float *in, unsigned count) { # ivtmp.37_32 = PHI <ivtmp.37_48(5), ivtmp.37_28(4)> # ivtmp.40_26 = PHI <ivtmp.40_25(5), ivtmp.40_24(4)> _23 = (void *) ivtmp.37_32; vect__4.21_40 = MEM <vector(16) float> [(float *)_23]; vect__7.22_41 = .LRINT (vect__4.21_40); // Expand lrint<m><n> _22 = (void *) ivtmp.40_26; MEM <vector(16) long int> [(long int *)_22] = vect__7.22_41; ivtmp.37_48 = ivtmp.37_32 + 64; ivtmp.40_25 = ivtmp.40_26 + 128; }