diff options
| author | David Rubin <david@vortan.dev> | 2025-08-28 07:46:12 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-28 15:46:12 +0100 |
| commit | 73a0b5441be3dc6adb666ca672f3c4f7972cf73e (patch) | |
| tree | aa88a8e771daaf3ac83aa8909a5d29f444c80299 /lib | |
| parent | a31950aa578824e0933b49109f6ac55c84979b6d (diff) | |
| download | zig-73a0b5441be3dc6adb666ca672f3c4f7972cf73e.tar.gz zig-73a0b5441be3dc6adb666ca672f3c4f7972cf73e.zip | |
AstGen: forward result type through unary float builtins
Uses a new `float_op_result_ty` ZIR instruction tag.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/zig/AstGen.zig | 47 | ||||
| -rw-r--r-- | lib/std/zig/AstRlAnnotate.zig | 26 | ||||
| -rw-r--r-- | lib/std/zig/Zir.zig | 6 |
3 files changed, 53 insertions, 26 deletions
diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index c208661359..f39edb78cd 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -9390,24 +9390,25 @@ fn builtinCall( .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .slice_const_u8_type } }, params[0], .embed_file), .error_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .coerced_ty = .anyerror_type } }, params[0], .error_name), .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, coerced_bool_ri, params[0], .set_runtime_safety), - .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt), - .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin), - .cos => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .cos), - .tan => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tan), - .exp => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp), - .exp2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .exp2), - .log => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log), - .log2 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log2), - .log10 => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .log10), .abs => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .abs), - .floor => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .floor), - .ceil => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .ceil), - .trunc => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .trunc), - .round => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .round), .tag_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .tag_name), .type_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .type_name), .Frame => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .frame_type), + .sqrt => return floatUnOp(gz, scope, ri, node, params[0], .sqrt), + .sin => return floatUnOp(gz, scope, ri, node, params[0], .sin), + .cos => return floatUnOp(gz, scope, ri, node, params[0], .cos), + .tan => return floatUnOp(gz, scope, ri, node, params[0], .tan), + .exp => return floatUnOp(gz, scope, ri, node, params[0], .exp), + .exp2 => return floatUnOp(gz, scope, ri, node, params[0], .exp2), + .log => return floatUnOp(gz, scope, ri, node, params[0], .log), + .log2 => return floatUnOp(gz, scope, ri, node, params[0], .log2), + .log10 => return floatUnOp(gz, scope, ri, node, params[0], .log10), + .floor => return floatUnOp(gz, scope, ri, node, params[0], .floor), + .ceil => return floatUnOp(gz, scope, ri, node, params[0], .ceil), + .trunc => return floatUnOp(gz, scope, ri, node, params[0], .trunc), + .round => return floatUnOp(gz, scope, ri, node, params[0], .round), + .int_from_float => return typeCast(gz, scope, ri, node, params[0], .int_from_float, builtin_name), .float_from_int => return typeCast(gz, scope, ri, node, params[0], .float_from_int, builtin_name), .ptr_from_int => return typeCast(gz, scope, ri, node, params[0], .ptr_from_int, builtin_name), @@ -9860,6 +9861,26 @@ fn simpleUnOp( return rvalue(gz, ri, result, node); } +fn floatUnOp( + gz: *GenZir, + scope: *Scope, + ri: ResultInfo, + node: Ast.Node.Index, + operand_node: Ast.Node.Index, + tag: Zir.Inst.Tag, +) InnerError!Zir.Inst.Ref { + const result_type = try ri.rl.resultType(gz, node); + const operand_ri: ResultInfo.Loc = if (result_type) |rt| .{ + .ty = try gz.addExtendedPayload(.float_op_result_ty, Zir.Inst.UnNode{ + .node = gz.nodeIndexToRelative(node), + .operand = rt, + }), + } else .none; + const operand = try expr(gz, scope, .{ .rl = operand_ri }, operand_node); + const result = try gz.addUnNode(tag, operand, node); + return rvalue(gz, ri, result, node); +} + fn negation( gz: *GenZir, scope: *Scope, diff --git a/lib/std/zig/AstRlAnnotate.zig b/lib/std/zig/AstRlAnnotate.zig index cf0699cc01..758d329136 100644 --- a/lib/std/zig/AstRlAnnotate.zig +++ b/lib/std/zig/AstRlAnnotate.zig @@ -889,6 +889,19 @@ fn builtinCall(astrl: *AstRlAnnotate, block: ?*Block, ri: ResultInfo, node: Ast. .frame_address => return true, // These builtins take a single argument with a known result type, but do not consume their // result pointer. + .sqrt, + .sin, + .cos, + .tan, + .exp, + .exp2, + .log, + .log2, + .log10, + .floor, + .ceil, + .trunc, + .round, .size_of, .bit_size_of, .align_of, @@ -918,20 +931,7 @@ fn builtinCall(astrl: *AstRlAnnotate, block: ?*Block, ri: ResultInfo, node: Ast. // result pointer. .int_from_ptr, .int_from_enum, - .sqrt, - .sin, - .cos, - .tan, - .exp, - .exp2, - .log, - .log2, - .log10, .abs, - .floor, - .ceil, - .trunc, - .round, .tag_name, .type_name, .Frame, diff --git a/lib/std/zig/Zir.zig b/lib/std/zig/Zir.zig index b00d0d78c9..e4728dc7ad 100644 --- a/lib/std/zig/Zir.zig +++ b/lib/std/zig/Zir.zig @@ -2111,6 +2111,11 @@ pub const Inst = struct { /// This instruction is always `noreturn`, however, it is not considered as such by ZIR-level queries. This allows AstGen to assume that /// any code may have gone here, avoiding false-positive "unreachable code" errors. astgen_error, + /// Given a type, strips away any error unions or optionals stacked + /// on top and returns the base type. That base type must be a float. + /// For example: Provided with error{Foo}!?f64, returns f64. + /// `operand` is `operand: Air.Inst.Ref`. + float_op_result_ty, pub const InstData = struct { opcode: Extended, @@ -4436,6 +4441,7 @@ fn findTrackableInner( .tuple_decl, .dbg_empty_stmt, .astgen_error, + .float_op_result_ty, => return, // `@TypeOf` has a body. |
