MarcelineVQ
9f2fa5213a
bench: best-of-5 for all silicon functions; silicon_sse: V4 column mulMat3x4/InPlace (1.8x/1.7x)
2026-03-17 01:43:16 -07:00
MarcelineVQ
662c854376
silicon_sse: patch-in-place isPointInsideBounds 6cy->5cy (1.2x), naked vucomiss
2026-03-17 01:26:55 -07:00
MarcelineVQ
16f1a073ae
silicon_sse: branchless classifyPointFrustum 35cy->30cy (1.8x), revert addToColorAccum
2026-03-17 01:17:23 -07:00
MarcelineVQ
cb0888e0fa
silicon_sse: naked FMA asm for vec3Dot (0.4x->0.8x) and distanceToPlane (0.7x->1.0x)
2026-03-17 01:01:07 -07:00
MarcelineVQ
9488fb568c
silicon_sse: V4/@mulAdd/@shuffle rewrites for all functions
...
Major improvements from SSE4.1+FMA+AVX target + explicit SIMD:
- transposeMat4x4: 0.9x -> 2.4x (V4 shuffle)
- rotateMatByQuat: 4.0x -> 5.0x (V4 matmul)
- testOBBFrustum: 0.9x -> 1.2x (V4 corner transform + dot4)
- classifyPointFrustum: 1.4x -> 2.0x (V4 dot4 with {x,y,z,1} trick)
- translateBoundingVol: 1.3x -> 1.7x (@mulAdd plane distances)
- testSphereFrustum: 1.1x -> 1.3x (V4 dot)
- createRotMat3x4: @mulAdd for all 9 matrix entries
- mulMat3x4/InPlace: @mulAdd chains
- quatSlerp: V4 blend + @mulAdd dot
- addVec3ToAccumulator: @mulAdd for scale multiply
All parity tests pass.
2026-03-17 00:34:12 -07:00
MarcelineVQ
8537587df3
silicon: si_ftol SSE3 FISTTP replacement, bench patch-in-place framework
...
si_ftol: 9-byte naked asm using FISTTP (SSE3 truncate-from-x87) replaces
the 39-byte FSTCW/FLDCW/FISTP rounding mode dance. 4 vs 7 cycles (1.7x).
13.2M calls/7.5s in-game -- ~13ms savings per period.
Benchmark: patch-in-place at mapped 0x40A2B0, test parity across 19 values,
best-of-5 timing with varying inputs. Framework for all silicon functions.
Also disabled h67 (ConvertPixelsToScreenAlt) probe -- game passes ECX=0
as valid input, thiscall probe crashes on null this.
2026-03-17 00:22:07 -07:00
MarcelineVQ
c9249c6c96
bench: fix 3 correctness bugs found by benchmarker
...
mulMat3x4 / mulMat3x4InPlace: translation row had A*B operands swapped.
Original computes A_translation * B_rotation + B_translation, but our
code was doing A_rotation * B_translation + A_translation. Verified by
tracing x87 disassembly: first element loads A[9]*B[col] pattern.
Fixed in both silicon_sse.zig and silicon.zig.
packParticleColor: x87 rounds 127.5 to 128 (round-to-nearest), but SSE
@intFromFloat truncates to 127. Added @round() before @intFromFloat.
42/42 benchmarks now pass correctness. 0 MISMATCHes.
2026-03-15 12:27:59 -07:00
MarcelineVQ
7c88423a41
bench: add remaining silicon functions, total 38 benchmarks
...
Added 8 more silicon SSE functions to benchmark: normalizeVec3,
testOBBFrustum, calculateSinCos, translateBoundingVol, addToColorAccum,
packParticleColor, setParticleAlpha, and addVec3ToAccumulator (export fn).
Notable results from new entries:
packParticleColor: 6.8x (109->16) MISMATCH -- alpha byte diff
setParticleAlpha: 3.4x (24->7)
calculateSinCos: 3.0x (138->45)
normalizeVec3: 1.8x (18->10)
testOBBFrustum: 1.3x (107->81)
3 MISMATCHes total (mulMat3x4, mulMat3x4InPlace, packParticleColor)
need correctness investigation -- likely matrix layout and struct
byte-order differences.
2026-03-15 12:08:59 -07:00
MarcelineVQ
55b4931fcb
bench: map WoW PE sections for full-fidelity benchmarking, add silicon SSE
...
Major bench harness upgrade:
- Maps WoW .text (4MB) and .rdata (160KB) at original virtual addresses
instead of individual function byte arrays. All CALL targets and float
constants resolve automatically -- no more manual mapGameConstants().
- Bench binary linked at 0x10000000 to avoid address conflict with WoW
PE sections at 0x400000-0xD00000.
Added silicon_sse.zig: 18 pure math functions extracted from silicon.zig
as export fn (C ABI) for standalone compilation. Covers frustum culling,
bounding volume ops, quaternion slerp, matrix multiplies, trig, etc.
Silicon benchmark results (all 14 new entries pass correctness):
checkBoxLineIntersect: 3.2x (72->22) -- slab AABB intersection
rotateMatByQuat: 3.1x (172->54) -- quat->mat + mat multiply
quatSlerp: 2.5x (454->178)
createZRotMat3x3: 2.5x (140->55)
createRotMat3x4: 2.2x (163->73)
normalizeVec3InPlace: 1.8x (34->18)
mulMat3x4InPlace: 1.6x (106->66) -- MISMATCH (layout diff, needs investigation)
classifyPointFrustum: 1.5x (60->40)
mulMat3x4: 1.2x (64->52) -- MISMATCH (same layout issue)
Two MISMATCH entries on mat3x4 multiply -- likely row/column order
difference between original and our implementation. Correctness needs
verification against game behavior.
2026-03-15 12:04:02 -07:00