// Expansion activations are functions of the 256 E4M3 codes, not arbitrary floats. Each row packs binary16 // sigmoid, tanh and the separate-half-op gate .5*tanh(.5*x)+.5. This avoids GLSL half transcendental lowering, // which differs from the accuracy reference by one half ulp and then crosses normalized-store thresholds. // Computed by gen_activation_m.py from those formulas alone (sigmoid's f32 exp2(-1.442695*x), correctly rounded // binary16 tanh); `gen_activation_m.py --check` verifies this table. All four expansion surfaces replay // bit-identically against the captured reset frame with it. const uvec2 ACT[256] = uvec2[256]( uvec2(0x00003800u, 0x00003800u), uvec2(0x18003801u, 0x00003801u), uvec2(0x1c003802u, 0x00003802u), uvec2(0x1e003803u, 0x00003803u), uvec2(0x20003804u, 0x00003804u), uvec2(0x21003805u, 0x00003805u), uvec2(0x22003806u, 0x00003806u), uvec2(0x23003807u, 0x00003807u), uvec2(0x24003808u, 0x00003808u), uvec2(0x24803809u, 0x00003809u), uvec2(0x2500380au, 0x0000380au), uvec2(0x2580380bu, 0x0000380bu), uvec2(0x2600380cu, 0x0000380cu), uvec2(0x2680380du, 0x0000380du), uvec2(0x2700380eu, 0x0000380eu), uvec2(0x277f380fu, 0x0000380fu), uvec2(0x27ff3810u, 0x00003810u), uvec2(0x28803812u, 0x00003812u), uvec2(0x28ff3814u, 0x00003814u), uvec2(0x297f3816u, 0x00003816u), uvec2(0x29ff3818u, 0x00003818u), uvec2(0x2a7f381au, 0x0000381au), uvec2(0x2afe381cu, 0x0000381cu), uvec2(0x2b7e381eu, 0x0000381eu), uvec2(0x2bfd3820u, 0x00003820u), uvec2(0x2c7e3824u, 0x00003824u), uvec2(0x2cfd3828u, 0x00003828u), uvec2(0x2d7d382cu, 0x0000382cu), uvec2(0x2dfc3830u, 0x00003830u), uvec2(0x2e7a3834u, 0x00003834u), uvec2(0x2ef93838u, 0x00003838u), uvec2(0x2f77383cu, 0x0000383cu), uvec2(0x2ff53840u, 0x00003840u), uvec2(0x30783848u, 0x00003848u), uvec2(0x30f63850u, 0x00003850u), uvec2(0x31723858u, 0x00003858u), uvec2(0x31ee3860u, 0x00003860u), uvec2(0x32693868u, 0x00003868u), uvec2(0x32e43870u, 0x00003870u), uvec2(0x335e3877u, 0x00003877u), uvec2(0x33d6387fu, 0x0000387fu), uvec2(0x3463388fu, 0x0000388fu), uvec2(0x34d8389fu, 0x0000389fu), uvec2(0x354b38aeu, 0x000038aeu), uvec2(0x35bc38beu, 0x000038beu), uvec2(0x362a38cdu, 0x000038cdu), uvec2(0x369638dcu, 0x000038dcu), uvec2(0x36ff38ecu, 0x000038ecu), uvec2(0x376538fbu, 0x000038fbu), uvec2(0x38143919u, 0x00003919u), uvec2(0x38703936u, 0x00003936u), uvec2(0x38c53953u, 0x00003953u), uvec2(0x3915396fu, 0x0000396fu), uvec2(0x395e398bu, 0x0000398au), uvec2(0x39a239a5u, 0x000039a6u), uvec2(0x39df39c0u, 0x000039c0u), uvec2(0x3a1839d9u, 0x000039d9u), uvec2(0x3a793a0au, 0x00003a0au), uvec2(0x3ac93a38u, 0x00003a38u), uvec2(0x3b0a3a63u, 0x00003a62u), uvec2(0x3b3e3a8au, 0x00003a8au), uvec2(0x3b673aafu, 0x00003aafu), uvec2(0x3b883ad1u, 0x00003ad1u), uvec2(0x3ba23af0u, 0x00003af0u), uvec2(0x3bb63b0cu, 0x00003b0cu), uvec2(0x3bd33b3du, 0x00003b3cu), uvec2(0x3be53b65u, 0x00003b64u), uvec2(0x3bef3b85u, 0x00003b85u), uvec2(0x3bf63b9fu, 0x00003b9fu), uvec2(0x3bfa3bb4u, 0x00003bb4u), uvec2(0x3bfc3bc4u, 0x00003bc4u), uvec2(0x3bfe3bd1u, 0x00003bd1u), uvec2(0x3bff3bdbu, 0x00003bdbu), uvec2(0x3bff3be9u, 0x00003beau), uvec2(0x3c003bf2u, 0x00003bf2u), uvec2(0x3c003bf8u, 0x00003bf8u), uvec2(0x3c003bfbu, 0x00003bfbu), uvec2(0x3c003bfdu, 0x00003bfdu), uvec2(0x3c003bfeu, 0x00003bfeu), uvec2(0x3c003bffu, 0x00003bffu), uvec2(0x3c003bffu, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x3c003c00u, 0x00003c00u), uvec2(0x7e007e00u, 0x00007e00u), uvec2(0x80003800u, 0x00003800u), uvec2(0x980037feu, 0x000037feu), uvec2(0x9c0037fcu, 0x000037fcu), uvec2(0x9e0037fau, 0x000037fau), uvec2(0xa00037f8u, 0x000037f8u), uvec2(0xa10037f6u, 0x000037f6u), uvec2(0xa20037f4u, 0x000037f4u), uvec2(0xa30037f2u, 0x000037f2u), uvec2(0xa40037f0u, 0x000037f0u), uvec2(0xa48037eeu, 0x000037eeu), uvec2(0xa50037ecu, 0x000037ecu), uvec2(0xa58037eau, 0x000037eau), uvec2(0xa60037e8u, 0x000037e8u), uvec2(0xa68037e6u, 0x000037e6u), uvec2(0xa70037e4u, 0x000037e4u), uvec2(0xa77f37e2u, 0x000037e2u), uvec2(0xa7ff37e0u, 0x000037e0u), uvec2(0xa88037dcu, 0x000037dcu), uvec2(0xa8ff37d8u, 0x000037d8u), uvec2(0xa97f37d4u, 0x000037d4u), uvec2(0xa9ff37d0u, 0x000037d0u), uvec2(0xaa7f37ccu, 0x000037ccu), uvec2(0xaafe37c8u, 0x000037c8u), uvec2(0xab7e37c4u, 0x000037c4u), uvec2(0xabfd37c0u, 0x000037c0u), uvec2(0xac7e37b8u, 0x000037b8u), uvec2(0xacfd37b0u, 0x000037b0u), uvec2(0xad7d37a8u, 0x000037a8u), uvec2(0xadfc37a0u, 0x000037a0u), uvec2(0xae7a3798u, 0x00003798u), uvec2(0xaef93790u, 0x00003790u), uvec2(0xaf773788u, 0x00003788u), uvec2(0xaff53780u, 0x00003780u), uvec2(0xb0783770u, 0x00003770u), uvec2(0xb0f63760u, 0x00003760u), uvec2(0xb1723750u, 0x00003750u), uvec2(0xb1ee3741u, 0x00003740u), uvec2(0xb2693731u, 0x00003731u), uvec2(0xb2e43721u, 0x00003721u), uvec2(0xb35e3711u, 0x00003711u), uvec2(0xb3d63701u, 0x00003701u), uvec2(0xb46336e2u, 0x000036e2u), uvec2(0xb4d836c3u, 0x000036c2u), uvec2(0xb54b36a3u, 0x000036a4u), uvec2(0xb5bc3684u, 0x00003684u), uvec2(0xb62a3666u, 0x00003666u), uvec2(0xb6963647u, 0x00003647u), uvec2(0xb6ff3629u, 0x00003628u), uvec2(0xb765360au, 0x0000360au), uvec2(0xb81435cfu, 0x000035ceu), uvec2(0xb8703594u, 0x00003594u), uvec2(0xb8c5355au, 0x0000355au), uvec2(0xb9153522u, 0x00003522u), uvec2(0xb95e34ebu, 0x000034ebu), uvec2(0xb9a234b5u, 0x000034b5u), uvec2(0xb9df3481u, 0x00003480u), uvec2(0xba18344eu, 0x0000344eu), uvec2(0xba7933d8u, 0x000033d8u), uvec2(0xbac93320u, 0x00003320u), uvec2(0xbb0a3275u, 0x00003276u), uvec2(0xbb3e31d6u, 0x000031d6u), uvec2(0xbb673144u, 0x00003144u), uvec2(0xbb8830bdu, 0x000030bcu), uvec2(0xbba23041u, 0x00003042u), uvec2(0xbbb62fa1u, 0x00002fa0u), uvec2(0xbbd32e1au, 0x00002e1cu), uvec2(0xbbe52cdbu, 0x00002cdcu), uvec2(0xbbef2bb1u, 0x00002bb0u), uvec2(0xbbf62a12u, 0x00002a10u), uvec2(0xbbfa28c7u, 0x000028c8u), uvec2(0xbbfc2781u, 0x00002780u), uvec2(0xbbfe25e2u, 0x000025e0u), uvec2(0xbbff249bu, 0x000024a0u), uvec2(0xbbff21a0u, 0x000021a0u), uvec2(0xbc001edau, 0x00001ec0u), uvec2(0xbc001c2bu, 0x00001c40u), uvec2(0xbc001910u, 0x00001900u), uvec2(0xbc001626u, 0x00001600u), uvec2(0xbc001377u, 0x00001400u), uvec2(0xbc001087u, 0x00001000u), uvec2(0xbc000d7fu, 0x00000c00u), uvec2(0xbc00080bu, 0x00000c00u), uvec2(0xbc0002fau, 0x00000000u), uvec2(0xbc000118u, 0x00000000u), uvec2(0xbc000067u, 0x00000000u), uvec2(0xbc000026u, 0x00000000u), uvec2(0xbc00000eu, 0x00000000u), uvec2(0xbc000005u, 0x00000000u), uvec2(0xbc000002u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0xbc000000u, 0x00000000u), uvec2(0x7e00fe00u, 0x00007e00u) ); uint actIndex(float16_t v) { uint h = uint(float16BitsToUint16(v)); uint a = h & 32767u; if (a > 0x7c00u) return ((h >> 8u) & 128u) | 127u; return ((h >> 8u) & 128u) | (a >= 0x2400u ? (a >> 7u) - 64u : uint(abs(float(v)) * 512.0)); } float16_t sig16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].x & 65535u)); } float16_t tan16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].x >> 16u)); } float16_t gate16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].y)); } f16vec4 tan16(f16vec4 v) { return f16vec4(tan16(v.x),tan16(v.y),tan16(v.z),tan16(v.w)); } f16vec4 gate16(f16vec4 v) { return f16vec4(gate16(v.x),gate16(v.y),gate16(v.z),gate16(v.w)); }