[libclc] 560e229 - Revert "[libclc] replace float remquo with amd ocml implementation" (#181443)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 13 17:49:32 PST 2026


Author: Wenju He
Date: 2026-02-14T09:49:28+08:00
New Revision: 560e22926804f6ca818952e815ec63c434460039

URL: https://github.com/llvm/llvm-project/commit/560e22926804f6ca818952e815ec63c434460039
DIFF: https://github.com/llvm/llvm-project/commit/560e22926804f6ca818952e815ec63c434460039.diff

LOG: Revert "[libclc] replace float remquo with amd ocml implementation" (#181443)

Reverts llvm/llvm-project#177131
It broke SPIRV target: error in backend: unable to legalize instruction:
%88:fid(s32) = G_FCANONICALIZE

Added: 
    

Modified: 
    libclc/clc/lib/generic/math/clc_remquo.cl
    libclc/clc/lib/generic/math/clc_remquo.inc

Removed: 
    


################################################################################
diff  --git a/libclc/clc/lib/generic/math/clc_remquo.cl b/libclc/clc/lib/generic/math/clc_remquo.cl
index db7ab8ceaa073..fd83ead06d89a 100644
--- a/libclc/clc/lib/generic/math/clc_remquo.cl
+++ b/libclc/clc/lib/generic/math/clc_remquo.cl
@@ -7,23 +7,14 @@
 //===----------------------------------------------------------------------===//
 
 #include <clc/clc_convert.h>
-#include <clc/float/definitions.h>
 #include <clc/integer/clc_clz.h>
 #include <clc/internal/clc.h>
-#include <clc/math/clc_copysign.h>
-#include <clc/math/clc_fabs.h>
 #include <clc/math/clc_floor.h>
 #include <clc/math/clc_fma.h>
-#include <clc/math/clc_frexp.h>
 #include <clc/math/clc_ldexp.h>
-#include <clc/math/clc_nan.h>
-#include <clc/math/clc_native_recip.h>
-#include <clc/math/clc_rint.h>
-#include <clc/math/clc_sincos_helpers.h>
+#include <clc/math/clc_subnormal_config.h>
 #include <clc/math/clc_trunc.h>
 #include <clc/math/math.h>
-#include <clc/relational/clc_isfinite.h>
-#include <clc/relational/clc_isnan.h>
 #include <clc/shared/clc_max.h>
 
 #define __CLC_ADDRESS_SPACE private

diff  --git a/libclc/clc/lib/generic/math/clc_remquo.inc b/libclc/clc/lib/generic/math/clc_remquo.inc
index 79eef077bf691..3a76ffed7f039 100644
--- a/libclc/clc/lib/generic/math/clc_remquo.inc
+++ b/libclc/clc/lib/generic/math/clc_remquo.inc
@@ -8,82 +8,69 @@
 
 _CLC_DEF _CLC_OVERLOAD float __clc_remquo(float x, float y,
                                           __CLC_ADDRESS_SPACE int *quo) {
-  const int bits = 12;
-  float ax = __clc_fabs(x);
-  float ay = __clc_fabs(y);
-  float ret;
-  int q7;
-  if (ax > ay) {
-    int ex, ey;
-    {
-      int _exp;
-      float _mant = __clc_frexp(ax, &_exp);
-      ex = _exp - 1;
-      ax = __clc_ldexp(_mant, bits);
-    }
-    {
-      int _exp;
-      float _mant = __clc_frexp(ay, &_exp);
-      ey = _exp - 1;
-      ay = __clc_ldexp(_mant, 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_elementwise_canonicalize(x);
-    q7 = c ? qsgn : q7;
-    ret = ax == ay ? __clc_copysign(0.0f, x) : ret;
-    q7 = ax == ay ? qsgn : q7;
+  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;
   }
 
-  ret = y == 0.0f ? __clc_nan(0) : ret;
-  q7 = y == 0.0f ? 0 : q7;
-  bool c = !__clc_isnan(y) && __clc_isfinite(x);
-  ret = c ? ret : __clc_nan(0);
-  q7 = c ? q7 : 0;
+  c = xr > yr;
+  q = (q << 1) | c;
+  xr -= c ? yr : 0.0f;
 
-  *quo = q7;
-  return ret;
+  int lt = ex < ey;
+
+  q = lt ? 0 : q;
+  xr = lt ? xa : xr;
+  yr = lt ? ya : yr;
+
+  c = (yr < 2.0f * xr) | ((yr == 2.0f * xr) & ((q & 0x1) == 0x1));
+  xr -= c ? yr : 0.0f;
+  q += c;
+
+  float s = __clc_as_float(ey << EXPSHIFTBITS_SP32);
+  xr *= lt ? 1.0f : s;
+
+  int qsgn = sx == sy ? 1 : -1;
+  int quot = (q & 0x7f) * qsgn;
+
+  c = ax == ay;
+  quot = c ? qsgn : quot;
+  xr = c ? 0.0f : xr;
+
+  xr = __clc_as_float(sx ^ __clc_as_int(xr));
+
+  c = ax > PINFBITPATT_SP32 | ay > PINFBITPATT_SP32 | ax == PINFBITPATT_SP32 |
+      ay == 0;
+  quot = c ? 0 : quot;
+  xr = c ? __clc_as_float(QNANBITPATT_SP32) : xr;
+
+  *quo = quot;
+
+  return xr;
 }
 
 // remquo signature is special, we don't have macro for this


        


More information about the cfe-commits mailing list