diff options
| author | John Schmidt <john.schmidt.h@gmail.com> | 2022-02-04 20:21:15 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-02-09 20:29:41 -0500 |
| commit | 7f0cf395aa74eb5ea250bd28f7525b3036790a6a (patch) | |
| tree | e2faf4e4a19836331d3e47180438fab4db4fb178 /src/codegen/llvm.zig | |
| parent | 44b5fdf3266f11607313bc9990a876b5a7f9e174 (diff) | |
| download | zig-7f0cf395aa74eb5ea250bd28f7525b3036790a6a.tar.gz zig-7f0cf395aa74eb5ea250bd28f7525b3036790a6a.zip | |
stage2: implement all builtin floatops for f{16,32,64}
- Merge `floatop.zig` and `floatop_stage1.zig` since most tests now pass
on stage2.
- Add more behavior tests for a bunch of functions.
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 18 |
1 files changed, 15 insertions, 3 deletions
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, ""); |
