aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-05-30 00:22:45 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2025-05-31 18:54:28 -0400
commitb483defc5a5c2f93eb8a445974ab831ae4e4b321 (patch)
tree0fa6fa6721e8731b294f8aafed6ca8f02a0242ae /src/codegen.zig
parentc1e9ef9eaabb2219a3762c5957b1c63ad20bf1ed (diff)
downloadzig-b483defc5a5c2f93eb8a445974ab831ae4e4b321.tar.gz
zig-b483defc5a5c2f93eb8a445974ab831ae4e4b321.zip
Legalize: implement scalarization of binary operations
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index f5108162ca..dc1e7735ba 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -32,8 +32,9 @@ fn devFeatureForBackend(comptime backend: std.builtin.CompilerBackend) dev.Featu
return @field(dev.Feature, @tagName(backend)["stage2_".len..] ++ "_backend");
}
-pub fn importBackend(comptime backend: std.builtin.CompilerBackend) ?type {
+fn importBackend(comptime backend: std.builtin.CompilerBackend) type {
return switch (backend) {
+ .other, .stage1 => unreachable,
.stage2_aarch64 => @import("arch/aarch64/CodeGen.zig"),
.stage2_arm => @import("arch/arm/CodeGen.zig"),
.stage2_c => @import("codegen/c.zig"),
@@ -42,11 +43,35 @@ pub fn importBackend(comptime backend: std.builtin.CompilerBackend) ?type {
.stage2_riscv64 => @import("arch/riscv64/CodeGen.zig"),
.stage2_sparc64 => @import("arch/sparc64/CodeGen.zig"),
.stage2_spirv64 => @import("codegen/spirv.zig"),
- .stage2_x86_64 => @import("arch/x86_64/CodeGen.zig"),
- else => null,
+ .stage2_wasm => @import("arch/wasm/CodeGen.zig"),
+ .stage2_x86, .stage2_x86_64 => @import("arch/x86_64/CodeGen.zig"),
+ _ => unreachable,
};
}
+pub fn legalizeFeatures(pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) *const Air.Legalize.Features {
+ const zcu = pt.zcu;
+ const target = &zcu.navFileScope(nav_index).mod.?.resolved_target.result;
+ switch (target_util.zigBackend(target.*, zcu.comp.config.use_llvm)) {
+ else => unreachable,
+ inline .stage2_llvm,
+ .stage2_c,
+ .stage2_wasm,
+ .stage2_arm,
+ .stage2_x86_64,
+ .stage2_aarch64,
+ .stage2_x86,
+ .stage2_riscv64,
+ .stage2_sparc64,
+ .stage2_spirv64,
+ .stage2_powerpc,
+ => |backend| {
+ const Backend = importBackend(backend);
+ return if (@hasDecl(Backend, "legalizeFeatures")) Backend.legalizeFeatures(target) else &.initEmpty();
+ },
+ }
+}
+
pub fn generateFunction(
lf: *link.File,
pt: Zcu.PerThread,
@@ -60,7 +85,7 @@ pub fn generateFunction(
const zcu = pt.zcu;
const func = zcu.funcInfo(func_index);
const target = zcu.navFileScope(func.owner_nav).mod.?.resolved_target.result;
- switch (target_util.zigBackend(target, false)) {
+ switch (target_util.zigBackend(target, zcu.comp.config.use_llvm)) {
else => unreachable,
inline .stage2_aarch64,
.stage2_arm,
@@ -70,7 +95,7 @@ pub fn generateFunction(
.stage2_x86_64,
=> |backend| {
dev.check(devFeatureForBackend(backend));
- return importBackend(backend).?.generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output);
+ return importBackend(backend).generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output);
},
}
}
@@ -88,14 +113,14 @@ pub fn generateLazyFunction(
zcu.fileByIndex(inst_index.resolveFile(&zcu.intern_pool)).mod.?.resolved_target.result
else
zcu.getTarget();
- switch (target_util.zigBackend(target, false)) {
+ switch (target_util.zigBackend(target, zcu.comp.config.use_llvm)) {
else => unreachable,
inline .stage2_powerpc,
.stage2_riscv64,
.stage2_x86_64,
=> |backend| {
dev.check(devFeatureForBackend(backend));
- return importBackend(backend).?.generateLazy(lf, pt, src_loc, lazy_sym, code, debug_output);
+ return importBackend(backend).generateLazy(lf, pt, src_loc, lazy_sym, code, debug_output);
},
}
}