mirror of
https://github.com/ziglang/zig.git
synced 2026-01-17 12:55:16 +00:00
Merge pull request #15640 from jacobly0/min-max
llvm: fix `@max`/`@min` of unsupported float types
This commit is contained in:
commit
c857959372
@ -7034,7 +7034,7 @@ pub const FuncGen = struct {
|
||||
const rhs = try self.resolveInst(bin_op.rhs);
|
||||
const scalar_ty = self.air.typeOfIndex(inst).scalarType();
|
||||
|
||||
if (scalar_ty.isAnyFloat()) return self.builder.buildMinNum(lhs, rhs, "");
|
||||
if (scalar_ty.isAnyFloat()) return self.buildFloatOp(.fmin, scalar_ty, 2, .{ lhs, rhs });
|
||||
if (scalar_ty.isSignedInt()) return self.builder.buildSMin(lhs, rhs, "");
|
||||
return self.builder.buildUMin(lhs, rhs, "");
|
||||
}
|
||||
@ -7045,7 +7045,7 @@ pub const FuncGen = struct {
|
||||
const rhs = try self.resolveInst(bin_op.rhs);
|
||||
const scalar_ty = self.air.typeOfIndex(inst).scalarType();
|
||||
|
||||
if (scalar_ty.isAnyFloat()) return self.builder.buildMaxNum(lhs, rhs, "");
|
||||
if (scalar_ty.isAnyFloat()) return self.buildFloatOp(.fmax, scalar_ty, 2, .{ lhs, rhs });
|
||||
if (scalar_ty.isSignedInt()) return self.builder.buildSMax(lhs, rhs, "");
|
||||
return self.builder.buildUMax(lhs, rhs, "");
|
||||
}
|
||||
|
||||
@ -96,6 +96,31 @@ test "@min for vectors" {
|
||||
comptime try S.doTheTest();
|
||||
}
|
||||
|
||||
test "@min/max for floats" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(comptime T: type) !void {
|
||||
var x: T = -3.14;
|
||||
var y: T = 5.27;
|
||||
try expectEqual(x, @min(x, y));
|
||||
try expectEqual(x, @min(y, x));
|
||||
try expectEqual(y, @max(x, y));
|
||||
try expectEqual(y, @max(y, x));
|
||||
}
|
||||
};
|
||||
|
||||
inline for (.{ f16, f32, f64, f80, f128, c_longdouble }) |T| {
|
||||
try S.doTheTest(T);
|
||||
comptime try S.doTheTest(T);
|
||||
}
|
||||
comptime try S.doTheTest(comptime_float);
|
||||
}
|
||||
|
||||
test "@min/@max on lazy values" {
|
||||
const A = extern struct { u8_4: [4]u8 };
|
||||
const B = extern struct { u8_16: [16]u8 };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user