Match LLVM ABI in extern "C"
functions for f128
on Windows
This commit is contained in:
parent
e69c19ea0b
commit
fe6478cc53
@ -1,5 +1,5 @@
|
|||||||
use crate::abi::call::{ArgAbi, FnAbi, Reg};
|
use crate::abi::call::{ArgAbi, FnAbi, Reg};
|
||||||
use crate::abi::Abi;
|
use crate::abi::{Abi, Float, Primitive};
|
||||||
|
|
||||||
// Win64 ABI: https://docs.microsoft.com/en-us/cpp/build/parameter-passing
|
// Win64 ABI: https://docs.microsoft.com/en-us/cpp/build/parameter-passing
|
||||||
|
|
||||||
@ -18,8 +18,12 @@ pub fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
|
|||||||
// FIXME(eddyb) there should be a size cap here
|
// FIXME(eddyb) there should be a size cap here
|
||||||
// (probably what clang calls "illegal vectors").
|
// (probably what clang calls "illegal vectors").
|
||||||
}
|
}
|
||||||
Abi::Scalar(_) => {
|
Abi::Scalar(scalar) => {
|
||||||
if a.layout.size.bytes() > 8 {
|
// Match what LLVM does for `f128` so that `compiler-builtins` builtins match up
|
||||||
|
// with what LLVM expects.
|
||||||
|
if a.layout.size.bytes() > 8
|
||||||
|
&& !matches!(scalar.primitive(), Primitive::Float(Float::F128))
|
||||||
|
{
|
||||||
a.make_indirect();
|
a.make_indirect();
|
||||||
} else {
|
} else {
|
||||||
a.extend_integer_width_to(32);
|
a.extend_integer_width_to(32);
|
||||||
|
@ -94,7 +94,7 @@ fn main() {
|
|||||||
// Unsupported <https://github.com/llvm/llvm-project/issues/94434>
|
// Unsupported <https://github.com/llvm/llvm-project/issues/94434>
|
||||||
("arm64ec", _) => false,
|
("arm64ec", _) => false,
|
||||||
// MinGW ABI bugs <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115054>
|
// MinGW ABI bugs <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115054>
|
||||||
("x86", "windows") => false,
|
("x86_64", "windows") => false,
|
||||||
// x86 has ABI bugs that show up with optimizations. This should be partially fixed with
|
// x86 has ABI bugs that show up with optimizations. This should be partially fixed with
|
||||||
// the compiler-builtins update. <https://github.com/rust-lang/rust/issues/123885>
|
// the compiler-builtins update. <https://github.com/rust-lang/rust/issues/123885>
|
||||||
("x86" | "x86_64", _) => false,
|
("x86" | "x86_64", _) => false,
|
||||||
@ -122,6 +122,8 @@ fn main() {
|
|||||||
("nvptx64", _) => false,
|
("nvptx64", _) => false,
|
||||||
// ABI unsupported <https://github.com/llvm/llvm-project/issues/41838>
|
// ABI unsupported <https://github.com/llvm/llvm-project/issues/41838>
|
||||||
("sparc", _) => false,
|
("sparc", _) => false,
|
||||||
|
// MinGW ABI bugs <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115054>
|
||||||
|
("x86_64", "windows") => false,
|
||||||
// 64-bit Linux is about the only platform to have f128 symbols by default
|
// 64-bit Linux is about the only platform to have f128 symbols by default
|
||||||
(_, "linux") if target_pointer_width == 64 => true,
|
(_, "linux") if target_pointer_width == 64 => true,
|
||||||
// Same as for f16, except MacOS is also missing f128 symbols.
|
// Same as for f16, except MacOS is also missing f128 symbols.
|
||||||
|
39
tests/assembly/x86_64-windows-float-abi.rs
Normal file
39
tests/assembly/x86_64-windows-float-abi.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
//@ assembly-output: emit-asm
|
||||||
|
//@ compile-flags: -O
|
||||||
|
//@ only-windows
|
||||||
|
//@ only-x86_64
|
||||||
|
|
||||||
|
#![feature(f16, f128)]
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
// CHECK-LABEL: second_f16
|
||||||
|
// CHECK: movaps %xmm1, %xmm0
|
||||||
|
// CHECK-NEXT: retq
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn second_f16(_: f16, x: f16) -> f16 {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: second_f32
|
||||||
|
// CHECK: movaps %xmm1, %xmm0
|
||||||
|
// CHECK-NEXT: retq
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn second_f32(_: f32, x: f32) -> f32 {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: second_f64
|
||||||
|
// CHECK: movaps %xmm1, %xmm0
|
||||||
|
// CHECK-NEXT: retq
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn second_f64(_: f64, x: f64) -> f64 {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: second_f128
|
||||||
|
// CHECK: movaps %xmm1, %xmm0
|
||||||
|
// CHECK-NEXT: retq
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn second_f128(_: f128, x: f128) -> f128 {
|
||||||
|
x
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user