authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 13:53:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 21:43:57-07:00
log1adb15098c711973d1c75061f122b907aaf09a7c
tree909567541bc2d85f8043252d5e7359af69cba4cb
parent9eceba248511849ff77a90876424f9930bf7f9f9

LLVM: clean up airUnaryOp to call callFloatUnary

and make callFloatUnary support vectors. I tried to make it use getIntrinsic, but that resulted in tripping `assert(id != 0)`.

1 files changed, 29 insertions(+), 22 deletions(-)

src/codegen/llvm.zig+29-22
...@@ -3200,19 +3200,19 @@ pub const FuncGen = struct {...@@ -3200,19 +3200,19 @@ pub const FuncGen = struct {
3200 .shr => try self.airShr(inst, false),3200 .shr => try self.airShr(inst, false),
3201 .shr_exact => try self.airShr(inst, true),3201 .shr_exact => try self.airShr(inst, true),
32023202
3203 .sqrt => try self.airUnaryOp(inst, "llvm.sqrt"),3203 .sqrt => try self.airUnaryOp(inst, "sqrt"),
3204 .sin => try self.airUnaryOp(inst, "llvm.sin"),3204 .sin => try self.airUnaryOp(inst, "sin"),
3205 .cos => try self.airUnaryOp(inst, "llvm.cos"),3205 .cos => try self.airUnaryOp(inst, "cos"),
3206 .exp => try self.airUnaryOp(inst, "llvm.exp"),3206 .exp => try self.airUnaryOp(inst, "exp"),
3207 .exp2 => try self.airUnaryOp(inst, "llvm.exp2"),3207 .exp2 => try self.airUnaryOp(inst, "exp2"),
3208 .log => try self.airUnaryOp(inst, "llvm.log"),3208 .log => try self.airUnaryOp(inst, "log"),
3209 .log2 => try self.airUnaryOp(inst, "llvm.log2"),3209 .log2 => try self.airUnaryOp(inst, "log2"),
3210 .log10 => try self.airUnaryOp(inst, "llvm.log10"),3210 .log10 => try self.airUnaryOp(inst, "log10"),
3211 .fabs => try self.airUnaryOp(inst, "llvm.fabs"),3211 .fabs => try self.airUnaryOp(inst, "fabs"),
3212 .floor => try self.airUnaryOp(inst, "llvm.floor"),3212 .floor => try self.airUnaryOp(inst, "floor"),
3213 .ceil => try self.airUnaryOp(inst, "llvm.ceil"),3213 .ceil => try self.airUnaryOp(inst, "ceil"),
3214 .round => try self.airUnaryOp(inst, "llvm.round"),3214 .round => try self.airUnaryOp(inst, "round"),
3215 .trunc_float => try self.airUnaryOp(inst, "llvm.trunc"),3215 .trunc_float => try self.airUnaryOp(inst, "trunc"),
32163216
3217 .cmp_eq => try self.airCmp(inst, .eq),3217 .cmp_eq => try self.airCmp(inst, .eq),
3218 .cmp_gt => try self.airCmp(inst, .gt),3218 .cmp_gt => try self.airCmp(inst, .gt),
...@@ -5751,11 +5751,7 @@ pub const FuncGen = struct {...@@ -5751,11 +5751,7 @@ pub const FuncGen = struct {
5751 const operand = try self.resolveInst(un_op);5751 const operand = try self.resolveInst(un_op);
5752 const operand_ty = self.air.typeOf(un_op);5752 const operand_ty = self.air.typeOf(un_op);
57535753
5754 const operand_llvm_ty = try self.dg.llvmType(operand_ty);5754 return self.callFloatUnary(operand, operand_ty, llvm_fn_name);
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, "");
5759 }5755 }
57605756
5761 fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !?*const llvm.Value {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,13 +6439,24 @@ pub const FuncGen = struct {
6443 return self.callFloatUnary(arg, ty, "trunc");6439 return self.callFloatUnary(arg, ty, "trunc");
6444 }6440 }
64456441
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 const target = self.dg.module.getTarget();6448 const target = self.dg.module.getTarget();
64486449
6449 var fn_name_buf: [100]u8 = undefined;6450 var fn_name_buf: [100]u8 = undefined;
6450 const llvm_fn_name = std.fmt.bufPrintZ(&fn_name_buf, "llvm.{s}.f{d}", .{6451 const llvm_fn_name = switch (ty.zigTypeTag()) {
6451 name, ty.floatBits(target),6452 .Vector => std.fmt.bufPrintZ(&fn_name_buf, "llvm.{s}.v{d}f{d}", .{
6452 }) catch unreachable;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 };
64536460
6454 const llvm_fn = self.dg.object.llvm_module.getNamedFunction(llvm_fn_name) orelse blk: {6461 const llvm_fn = self.dg.object.llvm_module.getNamedFunction(llvm_fn_name) orelse blk: {
6455 const operand_llvm_ty = try self.dg.llvmType(ty);6462 const operand_llvm_ty = try self.dg.llvmType(ty);