Add math functions for `f16` and `f128` · patricklam/verify-rust-std@c6407b0

@@ -85,6 +85,11 @@ fn main() {

8585

println!("cargo:rustc-check-cfg=cfg(reliable_f16)");

8686

println!("cargo:rustc-check-cfg=cfg(reliable_f128)");

878788+

// This is a step beyond only having the types and basic functions available. Math functions

89+

// aren't consistently available or correct.

90+

println!("cargo:rustc-check-cfg=cfg(reliable_f16_math)");

91+

println!("cargo:rustc-check-cfg=cfg(reliable_f128_math)");

92+8893

let has_reliable_f16 = match (target_arch.as_str(), target_os.as_str()) {

8994

// Selection failure until recent LLVM <https://github.com/llvm/llvm-project/issues/93894>

9095

// FIXME(llvm19): can probably be removed at the version bump

@@ -130,10 +135,42 @@ fn main() {

130135

_ => false,

131136

};

132137138+

// These are currently empty, but will fill up as some platforms move from completely

139+

// unreliable to reliable basics but unreliable math.

140+141+

// LLVM is currenlty adding missing routines, <https://github.com/llvm/llvm-project/issues/93566>

142+

let has_reliable_f16_math = has_reliable_f16

143+

&& match (target_arch.as_str(), target_os.as_str()) {

144+

// Currently nothing special. Hooray!

145+

// This will change as platforms gain better better support for standard ops but math

146+

// lags behind.

147+

_ => true,

148+

};

149+150+

let has_reliable_f128_math = has_reliable_f128

151+

&& match (target_arch.as_str(), target_os.as_str()) {

152+

// LLVM lowers `fp128` math to `long double` symbols even on platforms where

153+

// `long double` is not IEEE binary128. See

154+

// <https://github.com/llvm/llvm-project/issues/44744>.

155+

//

156+

// This rules out anything that doesn't have `long double` = `binary128`; <= 32 bits

157+

// (ld is `f64`), anything other than Linux (Windows and MacOS use `f64`), and `x86`

158+

// (ld is 80-bit extended precision).

159+

("x86_64", _) => false,

160+

(_, "linux") if target_pointer_width == 64 => true,

161+

_ => false,

162+

};

163+133164

if has_reliable_f16 {

134165

println!("cargo:rustc-cfg=reliable_f16");

135166

}

136167

if has_reliable_f128 {

137168

println!("cargo:rustc-cfg=reliable_f128");

138169

}

170+

if has_reliable_f16_math {

171+

println!("cargo:rustc-cfg=reliable_f16_math");

172+

}

173+

if has_reliable_f128_math {

174+

println!("cargo:rustc-cfg=reliable_f128_math");

175+

}

139176

}