aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorTravis Staloch <twostepted@gmail.com>2021-09-08 15:19:03 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-28 17:03:41 -0700
commitb9a95f2dd94e6175322d3388c3936eb600ec90ea (patch)
tree186a31fd920ca47bc15c3a426b9dfa8d67756ada /src/Sema.zig
parent29f41896ed9d99e82a88f4b63efa182ca0d2f93c (diff)
downloadzig-b9a95f2dd94e6175322d3388c3936eb600ec90ea.tar.gz
zig-b9a95f2dd94e6175322d3388c3936eb600ec90ea.zip
sat-arithmetic: add c backend support
- modify AstGen binOpExt()/assignBinOpExt() to accept generic extended payload T - rework Sema zirSatArithmetic() to use existing sema.analyzeArithmetic() by adding an `opt_extended` parameter. - add airSatOp() to codegen/c.zig - add saturating functions to src/link/C/zig.h
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index de94a8c6b8..a41d330285 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -694,10 +694,11 @@ fn zirExtended(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr
.c_define => return sema.zirCDefine( block, extended),
.wasm_memory_size => return sema.zirWasmMemorySize( block, extended),
.wasm_memory_grow => return sema.zirWasmMemoryGrow( block, extended),
- .add_with_saturation=> return sema.zirSatArithmetic( block, extended),
- .sub_with_saturation=> return sema.zirSatArithmetic( block, extended),
- .mul_with_saturation=> return sema.zirSatArithmetic( block, extended),
- .shl_with_saturation=> return sema.zirSatArithmetic( block, extended),
+ .add_with_saturation,
+ .sub_with_saturation,
+ .mul_with_saturation,
+ .shl_with_saturation,
+ => return sema.zirSatArithmetic( block, extended),
// zig fmt: on
}
}
@@ -6163,7 +6164,7 @@ fn zirNegate(
const lhs = sema.resolveInst(.zero);
const rhs = sema.resolveInst(inst_data.operand);
- return sema.analyzeArithmetic(block, tag_override, lhs, rhs, src, lhs_src, rhs_src);
+ return sema.analyzeArithmetic(block, tag_override, lhs, rhs, src, lhs_src, rhs_src, null);
}
fn zirArithmetic(
@@ -6183,7 +6184,7 @@ fn zirArithmetic(
const lhs = sema.resolveInst(extra.lhs);
const rhs = sema.resolveInst(extra.rhs);
- return sema.analyzeArithmetic(block, zir_tag, lhs, rhs, sema.src, lhs_src, rhs_src);
+ return sema.analyzeArithmetic(block, zir_tag, lhs, rhs, sema.src, lhs_src, rhs_src, null);
}
fn zirOverflowArithmetic(
@@ -6209,10 +6210,17 @@ fn zirSatArithmetic(
defer tracy.end();
const extra = sema.code.extraData(Zir.Inst.SaturatingArithmetic, extended.operand).data;
- const src: LazySrcLoc = .{ .node_offset = extra.node };
- return sema.mod.fail(&block.base, src, "TODO implement Sema.zirSatArithmetic", .{});
+ sema.src = .{ .node_offset_bin_op = extra.node };
+ const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = extra.node };
+ const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = extra.node };
+ const lhs = sema.resolveInst(extra.lhs);
+ const rhs = sema.resolveInst(extra.rhs);
+
+ return sema.analyzeArithmetic(block, .extended, lhs, rhs, sema.src, lhs_src, rhs_src, extended);
}
+// TODO: audit - not sure if its a good idea to reuse this, adding `opt_extended` param
+// FIXME: somehow, rhs of <<| is required to be Log2T. this should accept T
fn analyzeArithmetic(
sema: *Sema,
block: *Scope.Block,
@@ -6223,6 +6231,7 @@ fn analyzeArithmetic(
src: LazySrcLoc,
lhs_src: LazySrcLoc,
rhs_src: LazySrcLoc,
+ opt_extended: ?Zir.Inst.Extended.InstData,
) CompileError!Air.Inst.Ref {
const lhs_ty = sema.typeOf(lhs);
const rhs_ty = sema.typeOf(rhs);