================
@@ -8,69 +8,97 @@
_CLC_DEF _CLC_OVERLOAD float __clc_remquo(float x, float y,
__CLC_ADDRESS_SPACE int *quo) {
- x = __clc_flush_denormal_if_not_supported(x);
- y = __clc_flush_denormal_if_not_supported(y);
- int ux = __clc_as_int(x);
- int ax = ux & EXSIGNBIT_SP32;
- float xa = __clc_as_float(ax);
- int sx = ux ^ ax;
- int ex = ax >> EXPSHIFTBITS_SP32;
-
- int uy = __clc_as_int(y);
- int ay = uy & EXSIGNBIT_SP32;
- float ya = __clc_as_float(ay);
- int sy = uy ^ ay;
- int ey = ay >> EXPSHIFTBITS_SP32;
-
- float xr = __clc_as_float(0x3f800000 | (ax & 0x007fffff));
- float yr = __clc_as_float(0x3f800000 | (ay & 0x007fffff));
- int c;
- int k = ex - ey;
-
- uint q = 0;
-
- while (k > 0) {
- c = xr >= yr;
- q = (q << 1) | c;
- xr -= c ? yr : 0.0f;
- xr += xr;
- --k;
+ const int bits = 12;
+ float ax = __clc_fabs(x);
+ float ay = __clc_fabs(y);
+ float ret;
+ int q7;
+ if (ax > ay) {
+ int ex, ey;
+ ex = ({
+ int _exp;
+ __clc_frexp(ax, &_exp);
+ _exp;
+ }) -
+ 1;
+ ax = __clc_ldexp(({
+ int _exp;
+ __clc_frexp(ax, &_exp);
+ }),
+ bits);
+ ey = ({
+ int _exp;
+ __clc_frexp(ay, &_exp);
+ _exp;
+ }) -
+ 1;
+ ay = __clc_ldexp(({
+ int _exp;
+ __clc_frexp(ay, &_exp);
+ }),
+ 1);
+ int nb = ex - ey;
+ float ayinv = __clc_native_recip(ay);
+ int qacc = 0;
+ while (nb > bits) {
+ float q = __clc_rint(ax * ayinv);
+ ax = __clc_fma(-q, ay, ax);
+ int clt = ax < 0.0f;
+ float axp = ax + ay;
+ ax = clt ? axp : ax;
+
+ int iq = (int)q;
+ iq -= clt;
+ qacc = (qacc << bits) | iq;
+
+ ax = __clc_ldexp(ax, bits);
+ nb -= bits;
+ }
+ ax = __clc_ldexp(ax, nb - bits + 1);
+ {
+ float q = __clc_rint(ax * ayinv);
+ ax = __clc_fma(-q, ay, ax);
+ int clt = ax < 0.0f;
+ float axp = ax + ay;
+ ax = clt ? axp : ax;
+ int iq = (int)q;
+ iq -= clt;
+ qacc = (qacc << (nb + 1)) | iq;
+ }
+ int aq = (2.0f * ax > ay) | ((qacc & 0x1) & (2.0f * ax == ay));
+ ax = ax - (aq ? ay : 0.0f);
+ qacc += aq;
+ int qneg = (__clc_as_int(x) ^ __clc_as_int(y)) >> 31;
+ q7 = ((qacc & 0x7f) ^ qneg) - qneg;
+ ax = __clc_ldexp(ax, ey);
+ ret =
+ __clc_as_float((__clc_as_int(x) & (int)0x80000000) ^ __clc_as_int(ax));
+ } else {
+ ret = x;
+ q7 = 0;
+ bool c = (ay<0x1.0p+127f & 2.0f * ax> ay) | (ax > 0.5f * ay);
+
+ int qsgn = 1 + (((__clc_as_int(x) ^ __clc_as_int(y)) >> 31) << 1);
+ float t = __clc_fma(y, -(float)qsgn, x);
+ ret = c ? t
+ : (__builtin_isfpclass(__builtin_canonicalizef(0x1p-149f), 0x0040)
----------------
wenju-he wrote:
done, changed to unconditionally canonicalize
https://github.com/llvm/llvm-project/pull/177131
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits