Add math functions for f16 and f128 · patricklam/verify-rust-std@c6407b0 (original) (raw)

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

`

85

85

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

`

86

86

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

`

87

87

``

``

88

`+

// 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

+

88

93

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

`

89

94

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

`

90

95

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

`

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

`

130

135

` _ => false,

`

131

136

`};

`

132

137

``

``

138

`+

// 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

+

133

164

`if has_reliable_f16 {

`

134

165

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

`

135

166

`}

`

136

167

`if has_reliable_f128 {

`

137

168

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

`

138

169

`}

`

``

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

`+

}

`

139

176

`}

`