Set signext
or zeroext
for integer arguments on LoongArch64
This commit is contained in:
parent
6b65524620
commit
57bffe1d59
6 changed files with 77 additions and 18 deletions
|
@ -1,6 +1,7 @@
|
|||
use crate::abi::call::{ArgAbi, ArgExtension, CastTarget, FnAbi, PassMode, Reg, RegKind, Uniform};
|
||||
use crate::abi::{self, Abi, FieldsShape, HasDataLayout, Size, TyAbiInterface, TyAndLayout};
|
||||
use crate::spec::HasTargetSpec;
|
||||
use crate::spec::abi::Abi as SpecAbi;
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
enum RegPassKind {
|
||||
|
@ -359,3 +360,30 @@ where
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn compute_rust_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'a, Ty>, abi: SpecAbi)
|
||||
where
|
||||
Ty: TyAbiInterface<'a, C> + Copy,
|
||||
C: HasDataLayout + HasTargetSpec,
|
||||
{
|
||||
if abi == SpecAbi::RustIntrinsic {
|
||||
return;
|
||||
}
|
||||
|
||||
let grlen = cx.data_layout().pointer_size.bits();
|
||||
|
||||
for arg in fn_abi.args.iter_mut() {
|
||||
if arg.is_ignore() {
|
||||
continue;
|
||||
}
|
||||
|
||||
// LLVM integers types do not differentiate between signed or unsigned integers.
|
||||
// Some LoongArch instructions do not have a `.w` suffix version, they use all the
|
||||
// GRLEN bits. By explicitly setting the `signext` or `zeroext` attribute
|
||||
// according to signedness to avoid unnecessary integer extending instructions.
|
||||
//
|
||||
// This is similar to the RISC-V case, see
|
||||
// https://github.com/rust-lang/rust/issues/114508 for details.
|
||||
extend_integer_width(arg, grlen);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -733,6 +733,7 @@ impl<'a, Ty> FnAbi<'a, Ty> {
|
|||
match &spec.arch[..] {
|
||||
"x86" => x86::compute_rust_abi_info(cx, self, abi),
|
||||
"riscv32" | "riscv64" => riscv::compute_rust_abi_info(cx, self, abi),
|
||||
"loongarch64" => loongarch::compute_rust_abi_info(cx, self, abi),
|
||||
_ => {}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue