diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index fee5ec4..135b79b 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -37,17 +37,42 @@
var a = document.querySelector('.version > a')
var href = a?.href.match(/^(.*\/)tag(\/.*)$/);
var version = a?.title.match(/^Version ([0-9.]*)(\(([0-9]*)?\))?/);
- if (!href || !version || !navigator.userAgentData)
- throw 0;
+ if (!href || !version) throw 0;
- navigator.userAgentData.getHighEntropyValues(["architecture", "platform", "bitness"])
- .then(function(browser) {
- if (browser.platform != "Windows" || browser.bitness != "64") return;
-
- var architecture = browser.architecture == "arm" ? "arm64" : "64-bit";
+ const setDownloadURL = (architecture) => {
var url = href[1] + 'download' + href[2] + '/Git-' + version[1] + '-' + architecture + '.exe';
document.getElementById("download").href = url;
- })
+ };
+ if (!navigator.userAgentData) {
+ if (!navigator.userAgent?.includes('Windows')) throw 0;
+ /*
+ * Infinity - Infinity is an invalid floating-point operation. On x86,
+ * that operation conventionally produces the “real indefinite” negative
+ * NaN, whose float32 representation is 0xffc00000. ARM64 normally
+ * produces positive canonical NaN, 0x7fc00000.
+ *
+ * This trick was found by Marat Dukhan, as per
+ * https://github.com/google/XNNPACK/commit/466b52379d (Use GEMM/IGEMM
+ * micro-kernels with Swizzle on WAsm SIMD, 2019-10-09).
+ */
+ const architecture = {
+ "ffc00000": "64-bit",
+ "7fc00000": "arm64",
+ }[
+ (new Uint32Array((new Float32Array([Infinity - Infinity])).buffer))[0]
+ .toString(16)
+ .padStart(8, "0")
+ ];
+ if (!architecture) throw 0;
+ setDownloadURL(architecture);
+ } else {
+ navigator.userAgentData.getHighEntropyValues(["architecture", "platform", "bitness"])
+ .then(function(browser) {
+ if (browser.platform != "Windows" || browser.bitness != "64") return;
+
+ setDownloadURL(browser.architecture == "arm" ? "arm64" : "64-bit");
+ })
+ }
} catch(e) {}
{{ end -}}
});