diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/c.zig | 21 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 18 |
2 files changed, 29 insertions, 10 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index fc3848df21..5d7bdcee55 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1446,7 +1446,20 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO .mul_sat => try airSatOp(f, inst, "muls_"), .shl_sat => try airSatOp(f, inst, "shls_"), - .sqrt => try airSqrt(f, inst), + .sqrt, + .sin, + .cos, + .exp, + .exp2, + .log, + .log2, + .log10, + .fabs, + .floor, + .ceil, + .round, + .trunc_float, + => |tag| return f.fail("TODO: C backend: implement unary op for tag '{s}'", .{@tagName(tag)}), .add_with_overflow => try airAddWithOverflow(f, inst), .sub_with_overflow => try airSubWithOverflow(f, inst), @@ -3395,12 +3408,6 @@ fn airPrefetch(f: *Function, inst: Air.Inst.Index) !CValue { return CValue.none; } -fn airSqrt(f: *Function, inst: Air.Inst.Index) !CValue { - _ = f; - _ = inst; - return f.fail("TODO: C backend: implement sqrt", .{}); -} - fn toMemoryOrder(order: std.builtin.AtomicOrder) [:0]const u8 { return switch (order) { .Unordered => "memory_order_relaxed", diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 5a2c21eece..9c9bf0d0f2 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2050,7 +2050,19 @@ pub const FuncGen = struct { .shr => try self.airShr(inst, false), .shr_exact => try self.airShr(inst, true), - .sqrt => try self.airSqrt(inst), + .sqrt => try self.airUnaryOp(inst, "llvm.sqrt"), + .sin => try self.airUnaryOp(inst, "llvm.sin"), + .cos => try self.airUnaryOp(inst, "llvm.cos"), + .exp => try self.airUnaryOp(inst, "llvm.exp"), + .exp2 => try self.airUnaryOp(inst, "llvm.exp2"), + .log => try self.airUnaryOp(inst, "llvm.log"), + .log2 => try self.airUnaryOp(inst, "llvm.log2"), + .log10 => try self.airUnaryOp(inst, "llvm.log10"), + .fabs => try self.airUnaryOp(inst, "llvm.fabs"), + .floor => try self.airUnaryOp(inst, "llvm.floor"), + .ceil => try self.airUnaryOp(inst, "llvm.ceil"), + .round => try self.airUnaryOp(inst, "llvm.round"), + .trunc_float => try self.airUnaryOp(inst, "llvm.trunc"), .cmp_eq => try self.airCmp(inst, .eq), .cmp_gt => try self.airCmp(inst, .gt), @@ -4213,7 +4225,7 @@ pub const FuncGen = struct { } } - fn airSqrt(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + fn airUnaryOp(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; const un_op = self.air.instructions.items(.data)[inst].un_op; @@ -4221,7 +4233,7 @@ pub const FuncGen = struct { const operand_ty = self.air.typeOf(un_op); const operand_llvm_ty = try self.dg.llvmType(operand_ty); - const fn_val = self.getIntrinsic("llvm.sqrt", &.{operand_llvm_ty}); + const fn_val = self.getIntrinsic(llvm_fn_name, &.{operand_llvm_ty}); const params = [_]*const llvm.Value{operand}; return self.builder.buildCall(fn_val, ¶ms, params.len, .C, .Auto, ""); |
