{"id":"86xkyvLFEu","url":"https://pastebin.ca/86xkyvLFEu","raw_url":"https://raw.anybin.ca/86xkyvLFEu","visibility":"public","access":"public","created_at":1791798104837,"expires_at":1792402904837,"fetch_limit":null,"fetches_used":0,"reads_remaining":null,"size_bytes":7037,"syntax_hint":null,"title":null,"filename":null,"change_note":null,"cipher":null,"cipher_meta":null,"parent_id":null,"root_id":"86xkyvLFEu","version":1,"owner_id":null,"recipient_id":null,"body":"--- original_noise_math.h\n+++ noise_math_optimized.h\n@@ -1490,73 +1490,87 @@\n     return f;\n }\n \n+/* Unsigned arithmetic preserves the Java long wraparound. */\n+static inline __attribute__((const, always_inline)) uint64_t\n+noiseopt_biome_hash_step(uint64_t v, uint64_t salt) {\n+    return v * (v * UINT64_C(6364136223846793005) +\n+                UINT64_C(1442695040888963407)) + salt;\n+}\n+\n+/* This comparison idiom maps to hardware MINPD for non-NaN inputs. */\n+static inline __attribute__((const, always_inline)) double\n+noiseopt_biome_min(double a, double b) {\n+    return a > b ? b : a;\n+}\n+\n __attribute__((const)) uint32_t\n math_biome_access_sample(const int64_t theSeed, const int32_t x, const int32_t y, const int32_t z) {\n-    const int32_t var0 = x - 2;\n-    const int32_t var1 = y - 2;\n-    const int32_t var2 = z - 2;\n-    const int32_t var3 = var0 >> 2;\n-    const int32_t var4 = var1 >> 2;\n-    const int32_t var5 = var2 >> 2;\n-    const double var6 = (double) (var0 & 3) / 4.0;\n-    const double var7 = (double) (var1 & 3) / 4.0;\n-    const double var8 = (double) (var2 & 3) / 4.0;\n-    uint32_t var9 = 0;\n-    double var10 = DBL_MAX;\n+    /* Java integer subtraction wraps modulo 2^32. */\n+    const int32_t xx = (int32_t)((uint32_t)x - 2u);\n+    const int32_t yy = (int32_t)((uint32_t)y - 2u);\n+    const int32_t zz = (int32_t)((uint32_t)z - 2u);\n+\n+    const int32_t cx = xx >> 2;\n+    const int32_t cy = yy >> 2;\n+    const int32_t cz = zz >> 2;\n+    const double fx = (double)(xx & 3) * 0.25;\n+    const double fy = (double)(yy & 3) * 0.25;\n+    const double fz = (double)(zz & 3) * 0.25;\n+\n+    const uint64_t seed = (uint64_t)theSeed;\n+    const uint64_t x0 = (uint64_t)(int64_t)cx;\n+    const uint64_t x1 = (uint64_t)(int64_t)(cx + 1);\n+    const uint64_t y0 = (uint64_t)(int64_t)cy;\n+    const uint64_t y1 = (uint64_t)(int64_t)(cy + 1);\n+    const uint64_t z0 = (uint64_t)(int64_t)cz;\n+    const uint64_t z1 = (uint64_t)(int64_t)(cz + 1);\n \n-    double var28s[8];\n \n+\n+    double distance[8];\n #pragma clang loop vectorize_width(NOISEOPT_DOUBLE_LANES) interleave_count(NOISEOPT_BIOME_INTERLEAVE)\n-    for (uint32_t var11 = 0; var11 < 8; ++var11) {\n-        uint32_t var12 = var11 & 4;\n-        uint32_t var13 = var11 & 2;\n-        uint32_t var14 = var11 & 1;\n-        int64_t var15 = var12 ? var3 + 1 : var3;\n-        int64_t var16 = var13 ? var4 + 1 : var4;\n-        int64_t var17 = var14 ? var5 + 1 : var5;\n-        double var18 = var12 ? var6 - 1.0 : var6;\n-        double var19 = var13 ? var7 - 1.0 : var7;\n-        double var20 = var14 ? var8 - 1.0 : var8;\n-        int64_t var21 = theSeed * (theSeed * 6364136223846793005L + 1442695040888963407L) + var15;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + var16;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + var17;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + var15;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + var16;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + var17;\n-        double var22 = (double) ((var21 >> 24) & 1023) / 1024.0;\n-        double var23 = (var22 - 0.5) * 0.9;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + theSeed;\n-        double var24 = (double) ((var21 >> 24) & 1023) / 1024.0;\n-        double var25 = (var24 - 0.5) * 0.9;\n-        var21 = var21 * (var21 * 6364136223846793005L + 1442695040888963407L) + theSeed;\n-        double var26 = (double) ((var21 >> 24) & 1023) / 1024.0;\n-        double var27 = (var26 - 0.5) * 0.9;\n-        double var28 = math_square(var20 + var27) + math_square(var19 + var25) + math_square(var18 + var23);\n-        __builtin_assume(!__builtin_isnan(var28) && !__builtin_signbit(var28));\n-        var28s[var11] = var28;\n+    for (uint32_t i = 0; i < 8; ++i) {\n+        const uint64_t ix = (i & 4) ? x1 : x0;\n+        const uint64_t iy = (i & 2) ? y1 : y0;\n+        const uint64_t iz = (i & 1) ? z1 : z0;\n+        const double dx = (i & 4) ? fx - 1.0 : fx;\n+        const double dy = (i & 2) ? fy - 1.0 : fy;\n+        const double dz = (i & 1) ? fz - 1.0 : fz;\n+\n+        uint64_t h = noiseopt_biome_hash_step(noiseopt_biome_hash_step(seed, ix), iy);\n+        h = noiseopt_biome_hash_step(h, iz);\n+        h = noiseopt_biome_hash_step(h, ix);\n+        h = noiseopt_biome_hash_step(h, iy);\n+        h = noiseopt_biome_hash_step(h, iz);\n+\n+        const double rx = ((double)((h >> 24) & 1023u) / 1024.0 - 0.5) * 0.9;\n+        h = noiseopt_biome_hash_step(h, seed);\n+        const double ry = ((double)((h >> 24) & 1023u) / 1024.0 - 0.5) * 0.9;\n+        h = noiseopt_biome_hash_step(h, seed);\n+        const double rz = ((double)((h >> 24) & 1023u) / 1024.0 - 0.5) * 0.9;\n+\n+        distance[i] = math_square(dz + rz) + math_square(dy + ry) + math_square(dx + rx);\n     }\n \n-    // use bmin or use >= produces different asm\n-    double m04 = __builtin_fmin(var28s[0], var28s[4]);\n-    double m15 = __builtin_fmin(var28s[1], var28s[5]);\n-    double m26 = __builtin_fmin(var28s[2], var28s[6]);\n-    double m37 = __builtin_fmin(var28s[3], var28s[7]);\n-    double m0426 = __builtin_fmin(m04, m26);\n-    double m1537 = __builtin_fmin(m15, m37);\n-    double minimum = __builtin_fmin(m0426, m1537);\n-\n-    uint8_t bitmap = (uint8_t)(var28s[0] == minimum)\n-               | (uint8_t)((var28s[1] == minimum) << 1)\n-               | (uint8_t)((var28s[2] == minimum) << 2)\n-               | (uint8_t)((var28s[3] == minimum) << 3)\n-               | (uint8_t)((var28s[4] == minimum) << 4)\n-               | (uint8_t)((var28s[5] == minimum) << 5)\n-               | (uint8_t)((var28s[6] == minimum) << 6)\n-               | (uint8_t)((var28s[7] == minimum) << 7);\n- \n-    return __builtin_ctz(bitmap);\n+    const double m04 = noiseopt_biome_min(distance[0], distance[4]);\n+    const double m15 = noiseopt_biome_min(distance[1], distance[5]);\n+    const double m26 = noiseopt_biome_min(distance[2], distance[6]);\n+    const double m37 = noiseopt_biome_min(distance[3], distance[7]);\n+    const double m0426 = noiseopt_biome_min(m04, m26);\n+    const double m1537 = noiseopt_biome_min(m15, m37);\n+    const double minimum = noiseopt_biome_min(m0426, m1537);\n+\n+    /* Distances are finite and >= +0.0, so at least one lane matches. */\n+    const unsigned mask = ((unsigned)(distance[0] == minimum) << 0)\n+                        | ((unsigned)(distance[1] == minimum) << 1)\n+                        | ((unsigned)(distance[2] == minimum) << 2)\n+                        | ((unsigned)(distance[3] == minimum) << 3)\n+                        | ((unsigned)(distance[4] == minimum) << 4)\n+                        | ((unsigned)(distance[5] == minimum) << 5)\n+                        | ((unsigned)(distance[6] == minimum) << 6)\n+                        | ((unsigned)(distance[7] == minimum) << 7);\n+    return (uint32_t)__builtin_ctz(mask);\n }\n-\n typedef const struct aquifer_data {\n     int32_t startX;\n     int32_t startY;\n"}