| ... | ... | @@ -3200,19 +3200,19 @@ pub const FuncGen = struct { |
| 3200 | 3200 | .shr => try self.airShr(inst, false), |
| 3201 | 3201 | .shr_exact => try self.airShr(inst, true), |
| 3202 | 3202 | |
| 3203 | | .sqrt => try self.airUnaryOp(inst, "llvm.sqrt"), |
| 3204 | | .sin => try self.airUnaryOp(inst, "llvm.sin"), |
| 3205 | | .cos => try self.airUnaryOp(inst, "llvm.cos"), |
| 3206 | | .exp => try self.airUnaryOp(inst, "llvm.exp"), |
| 3207 | | .exp2 => try self.airUnaryOp(inst, "llvm.exp2"), |
| 3208 | | .log => try self.airUnaryOp(inst, "llvm.log"), |
| 3209 | | .log2 => try self.airUnaryOp(inst, "llvm.log2"), |
| 3210 | | .log10 => try self.airUnaryOp(inst, "llvm.log10"), |
| 3211 | | .fabs => try self.airUnaryOp(inst, "llvm.fabs"), |
| 3212 | | .floor => try self.airUnaryOp(inst, "llvm.floor"), |
| 3213 | | .ceil => try self.airUnaryOp(inst, "llvm.ceil"), |
| 3214 | | .round => try self.airUnaryOp(inst, "llvm.round"), |
| 3215 | | .trunc_float => try self.airUnaryOp(inst, "llvm.trunc"), |
| 3203 | .sqrt => try self.airUnaryOp(inst, "sqrt"), |
| 3204 | .sin => try self.airUnaryOp(inst, "sin"), |
| 3205 | .cos => try self.airUnaryOp(inst, "cos"), |
| 3206 | .exp => try self.airUnaryOp(inst, "exp"), |
| 3207 | .exp2 => try self.airUnaryOp(inst, "exp2"), |
| 3208 | .log => try self.airUnaryOp(inst, "log"), |
| 3209 | .log2 => try self.airUnaryOp(inst, "log2"), |
| 3210 | .log10 => try self.airUnaryOp(inst, "log10"), |
| 3211 | .fabs => try self.airUnaryOp(inst, "fabs"), |
| 3212 | .floor => try self.airUnaryOp(inst, "floor"), |
| 3213 | .ceil => try self.airUnaryOp(inst, "ceil"), |
| 3214 | .round => try self.airUnaryOp(inst, "round"), |
| 3215 | .trunc_float => try self.airUnaryOp(inst, "trunc"), |
| 3216 | 3216 | |
| 3217 | 3217 | .cmp_eq => try self.airCmp(inst, .eq), |
| 3218 | 3218 | .cmp_gt => try self.airCmp(inst, .gt), |
| ... | ... | @@ -5751,11 +5751,7 @@ pub const FuncGen = struct { |
| 5751 | 5751 | const operand = try self.resolveInst(un_op); |
| 5752 | 5752 | const operand_ty = self.air.typeOf(un_op); |
| 5753 | 5753 | |
| 5754 | | const operand_llvm_ty = try self.dg.llvmType(operand_ty); |
| 5755 | | const fn_val = self.getIntrinsic(llvm_fn_name, &.{operand_llvm_ty}); |
| 5756 | | const params = [_]*const llvm.Value{operand}; |
| 5757 | | |
| 5758 | | return self.builder.buildCall(fn_val, &params, params.len, .C, .Auto, ""); |
| 5754 | return self.callFloatUnary(operand, operand_ty, llvm_fn_name); |
| 5759 | 5755 | } |
| 5760 | 5756 | |
| 5761 | 5757 | fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !?*const llvm.Value { |
| ... | ... | @@ -6443,13 +6439,24 @@ pub const FuncGen = struct { |
| 6443 | 6439 | return self.callFloatUnary(arg, ty, "trunc"); |
| 6444 | 6440 | } |
| 6445 | 6441 | |
| 6446 | | fn callFloatUnary(self: *FuncGen, arg: *const llvm.Value, ty: Type, name: []const u8) !*const llvm.Value { |
| 6442 | fn callFloatUnary( |
| 6443 | self: *FuncGen, |
| 6444 | arg: *const llvm.Value, |
| 6445 | ty: Type, |
| 6446 | name: []const u8, |
| 6447 | ) !*const llvm.Value { |
| 6447 | 6448 | const target = self.dg.module.getTarget(); |
| 6448 | 6449 | |
| 6449 | 6450 | var fn_name_buf: [100]u8 = undefined; |
| 6450 | | const llvm_fn_name = std.fmt.bufPrintZ(&fn_name_buf, "llvm.{s}.f{d}", .{ |
| 6451 | | name, ty.floatBits(target), |
| 6452 | | }) catch unreachable; |
| 6451 | const llvm_fn_name = switch (ty.zigTypeTag()) { |
| 6452 | .Vector => std.fmt.bufPrintZ(&fn_name_buf, "llvm.{s}.v{d}f{d}", .{ |
| 6453 | name, ty.vectorLen(), ty.childType().floatBits(target), |
| 6454 | }) catch unreachable, |
| 6455 | .Float => std.fmt.bufPrintZ(&fn_name_buf, "llvm.{s}.f{d}", .{ |
| 6456 | name, ty.floatBits(target), |
| 6457 | }) catch unreachable, |
| 6458 | else => unreachable, |
| 6459 | }; |
| 6453 | 6460 | |
| 6454 | 6461 | const llvm_fn = self.dg.object.llvm_module.getNamedFunction(llvm_fn_name) orelse blk: { |
| 6455 | 6462 | const operand_llvm_ty = try self.dg.llvmType(ty); |