Fix vectorcall
This commit is contained in:
parent
c9b31839b6
commit
722d67d5e7
8 changed files with 145 additions and 31 deletions
|
@ -669,8 +669,10 @@ impl<'a, Ty> FnAbi<'a, Ty> {
|
|||
|
||||
match &cx.target_spec().arch[..] {
|
||||
"x86" => {
|
||||
let flavor = if let spec::abi::Abi::Fastcall { .. } = abi {
|
||||
x86::Flavor::Fastcall
|
||||
let flavor = if let spec::abi::Abi::Fastcall { .. }
|
||||
| spec::abi::Abi::Vectorcall { .. } = abi
|
||||
{
|
||||
x86::Flavor::FastcallOrVectorcall
|
||||
} else {
|
||||
x86::Flavor::General
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@ use crate::spec::HasTargetSpec;
|
|||
#[derive(PartialEq)]
|
||||
pub enum Flavor {
|
||||
General,
|
||||
Fastcall,
|
||||
FastcallOrVectorcall,
|
||||
}
|
||||
|
||||
pub fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'a, Ty>, flavor: Flavor)
|
||||
|
@ -60,9 +60,9 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
if flavor == Flavor::Fastcall {
|
||||
if flavor == Flavor::FastcallOrVectorcall {
|
||||
// Mark arguments as InReg like clang does it,
|
||||
// so our fastcall is compatible with C/C++ fastcall.
|
||||
// so our fastcall/vectorcall is compatible with C/C++ fastcall/vectorcall.
|
||||
|
||||
// Clang reference: lib/CodeGen/TargetInfo.cpp
|
||||
// See X86_32ABIInfo::shouldPrimitiveUseInReg(), X86_32ABIInfo::updateFreeRegs()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue