compiler-rt: math functions reorg
* unify the logic for exporting math functions from compiler-rt,
with the appropriate suffixes and prefixes.
- add all missing f128 and f80 exports. Functions with missing
implementations call other functions and have TODO comments.
- also add f16 functions
* move math functions from freestanding libc to compiler-rt (#7265)
* enable all the f128 and f80 code in the stage2 compiler and behavior
tests (#11161).
* update std lib to use builtins rather than `std.math`.
This commit is contained in:
@@ -15,28 +15,28 @@ pub fn log(comptime T: type, base: T, x: T) T {
|
||||
} else if (base == 10) {
|
||||
return math.log10(x);
|
||||
} else if ((@typeInfo(T) == .Float or @typeInfo(T) == .ComptimeFloat) and base == math.e) {
|
||||
return math.ln(x);
|
||||
return @log(x);
|
||||
}
|
||||
|
||||
const float_base = math.lossyCast(f64, base);
|
||||
switch (@typeInfo(T)) {
|
||||
.ComptimeFloat => {
|
||||
return @as(comptime_float, math.ln(@as(f64, x)) / math.ln(float_base));
|
||||
return @as(comptime_float, @log(@as(f64, x)) / @log(float_base));
|
||||
},
|
||||
.ComptimeInt => {
|
||||
return @as(comptime_int, math.floor(math.ln(@as(f64, x)) / math.ln(float_base)));
|
||||
return @as(comptime_int, @floor(@log(@as(f64, x)) / @log(float_base)));
|
||||
},
|
||||
|
||||
// TODO implement integer log without using float math
|
||||
.Int => |IntType| switch (IntType.signedness) {
|
||||
.signed => @compileError("log not implemented for signed integers"),
|
||||
.unsigned => return @floatToInt(T, math.floor(math.ln(@intToFloat(f64, x)) / math.ln(float_base))),
|
||||
.unsigned => return @floatToInt(T, @floor(@log(@intToFloat(f64, x)) / @log(float_base))),
|
||||
},
|
||||
|
||||
.Float => {
|
||||
switch (T) {
|
||||
f32 => return @floatCast(f32, math.ln(@as(f64, x)) / math.ln(float_base)),
|
||||
f64 => return math.ln(x) / math.ln(float_base),
|
||||
f32 => return @floatCast(f32, @log(@as(f64, x)) / @log(float_base)),
|
||||
f64 => return @log(x) / @log(float_base),
|
||||
else => @compileError("log not implemented for " ++ @typeName(T)),
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user