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.
This commit is contained in:
@@ -87,6 +87,14 @@ pub fn build(b: *std.Build) void {
|
||||
.optimize = .ReleaseFast,
|
||||
}),
|
||||
});
|
||||
const silicon_sse_obj = b.addObject(.{
|
||||
.name = "silicon_sse",
|
||||
.root_module = b.createModule(.{
|
||||
.root_source_file = b.path("src/silicon/silicon_sse.zig"),
|
||||
.target = target,
|
||||
.optimize = .ReleaseFast,
|
||||
}),
|
||||
});
|
||||
|
||||
const lib = b.addLibrary(.{
|
||||
.name = "weirdutils",
|
||||
@@ -105,6 +113,7 @@ pub fn build(b: *std.Build) void {
|
||||
lib.root_module.addObject(bone_sse_obj);
|
||||
lib.root_module.addObject(bone_sse_ref_obj);
|
||||
lib.root_module.addObject(math_sse_obj);
|
||||
lib.root_module.addObject(silicon_sse_obj);
|
||||
b.installArtifact(lib);
|
||||
|
||||
// Benchmark harness — native x86 Linux executable for profiling SSE replacements
|
||||
@@ -131,7 +140,19 @@ pub fn build(b: *std.Build) void {
|
||||
.optimize = bench_optimize,
|
||||
}),
|
||||
});
|
||||
// Link at high address so WoW PE sections (0x400000-0xD00000) can be
|
||||
// mapped at their original virtual addresses for benchmarking.
|
||||
bench.image_base = 0x10000000;
|
||||
const bench_silicon_sse = b.addObject(.{
|
||||
.name = "bench_silicon_sse",
|
||||
.root_module = b.createModule(.{
|
||||
.root_source_file = b.path("src/silicon/silicon_sse.zig"),
|
||||
.target = bench_target,
|
||||
.optimize = .ReleaseFast,
|
||||
}),
|
||||
});
|
||||
bench.root_module.addObject(bench_math_sse);
|
||||
bench.root_module.addObject(bench_silicon_sse);
|
||||
bench.root_module.linkSystemLibrary("m", .{});
|
||||
const install_bench = b.addInstallArtifact(bench, .{});
|
||||
const bench_step = b.step("bench", "Build math_sse benchmark harness (x86 Linux)");
|
||||
|
||||
Reference in New Issue
Block a user