diff options
| author | Matthew Lugg <mlugg@mlugg.co.uk> | 2025-11-09 15:16:49 +0000 |
|---|---|---|
| committer | Matthew Lugg <mlugg@mlugg.co.uk> | 2025-11-12 16:00:16 +0000 |
| commit | 69f39868b4125e79e4070a88bbdfcd3643dbc90d (patch) | |
| tree | 7e90f08d2b5d1cb234957dbe0b6a48034afe4e30 /src/codegen/wasm/CodeGen.zig | |
| parent | 99a7884308d288bd39df9192c9094439b179ff60 (diff) | |
| download | zig-69f39868b4125e79e4070a88bbdfcd3643dbc90d.tar.gz zig-69f39868b4125e79e4070a88bbdfcd3643dbc90d.zip | |
Air.Legalize: revert to loops for scalarizations
I had tried unrolling the loops to avoid requiring the
`vector_store_elem` instruction, but it's arguably a problem to generate
O(N) code for an operation on `@Vector(N, T)`. In addition, that
lowering emitted a lot of `.aggregate_init` instructions, which is
itself a quite difficult operation to codegen.
This requires reintroducing runtime vector indexing internally. However,
I've put it in a couple of instructions which are intended only for use
by `Air.Legalize`, named `legalize_vec_elem_val` (like `array_elem_val`,
but for indexing a vector with a runtime-known index) and
`legalize_vec_store_elem` (like the old `vector_store_elem`
instruction). These are explicitly documented as *not* being emitted by
Sema, so need only be implemented by backends if they actually use an
`Air.Legalize.Feature` which emits them (otherwise they can be marked as
`unreachable`).
Diffstat (limited to 'src/codegen/wasm/CodeGen.zig')
| -rw-r--r-- | src/codegen/wasm/CodeGen.zig | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/codegen/wasm/CodeGen.zig b/src/codegen/wasm/CodeGen.zig index b7f7aa151d..684513bf82 100644 --- a/src/codegen/wasm/CodeGen.zig +++ b/src/codegen/wasm/CodeGen.zig @@ -1786,6 +1786,10 @@ fn buildPointerOffset(cg: *CodeGen, ptr_value: WValue, offset: u64, action: enum fn genInst(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void { const air_tags = cg.air.instructions.items(.tag); return switch (air_tags[@intFromEnum(inst)]) { + // No "scalarize" legalizations are enabled, so these instructions never appear. + .legalize_vec_elem_val => unreachable, + .legalize_vec_store_elem => unreachable, + .inferred_alloc, .inferred_alloc_comptime => unreachable, .add => cg.airBinOp(inst, .add), |
