mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
Fix small-integer VAARG on SVR4 ABI PPC64.
The PPC64 SVR4 ABI requires integer stack arguments, and thus the var. args., that are smaller than 64 bits be zero extended to 64 bits. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153373 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5194d6dd95
commit
179a4ddd1f
@ -226,11 +226,23 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
// VASTART needs to be custom lowered to use the VarArgsFrameIndex
|
||||
setOperationAction(ISD::VASTART , MVT::Other, Custom);
|
||||
|
||||
// VAARG is custom lowered with the 32-bit SVR4 ABI.
|
||||
if (TM.getSubtarget<PPCSubtarget>().isSVR4ABI()
|
||||
&& !TM.getSubtarget<PPCSubtarget>().isPPC64()) {
|
||||
setOperationAction(ISD::VAARG, MVT::Other, Custom);
|
||||
setOperationAction(ISD::VAARG, MVT::i64, Custom);
|
||||
if (TM.getSubtarget<PPCSubtarget>().isSVR4ABI()) {
|
||||
if (TM.getSubtarget<PPCSubtarget>().isPPC64()) {
|
||||
// VAARG always uses double-word chunks, so promote anything smaller.
|
||||
setOperationAction(ISD::VAARG, MVT::i1, Promote);
|
||||
AddPromotedToType (ISD::VAARG, MVT::i1, MVT::i64);
|
||||
setOperationAction(ISD::VAARG, MVT::i8, Promote);
|
||||
AddPromotedToType (ISD::VAARG, MVT::i8, MVT::i64);
|
||||
setOperationAction(ISD::VAARG, MVT::i16, Promote);
|
||||
AddPromotedToType (ISD::VAARG, MVT::i16, MVT::i64);
|
||||
setOperationAction(ISD::VAARG, MVT::i32, Promote);
|
||||
AddPromotedToType (ISD::VAARG, MVT::i32, MVT::i64);
|
||||
setOperationAction(ISD::VAARG, MVT::Other, Expand);
|
||||
} else {
|
||||
// VAARG is custom lowered with the 32-bit SVR4 ABI.
|
||||
setOperationAction(ISD::VAARG, MVT::Other, Custom);
|
||||
setOperationAction(ISD::VAARG, MVT::i64, Custom);
|
||||
}
|
||||
} else
|
||||
setOperationAction(ISD::VAARG, MVT::Other, Expand);
|
||||
|
||||
|
20
test/CodeGen/PowerPC/ppc64-vaarg-int.ll
Normal file
20
test/CodeGen/PowerPC/ppc64-vaarg-int.ll
Normal file
@ -0,0 +1,20 @@
|
||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
|
||||
target triple = "powerpc64-unknown-linux-gnu"
|
||||
; RUN: llc < %s | FileCheck %s
|
||||
|
||||
define i32 @intvaarg(i32 %a, ...) nounwind {
|
||||
entry:
|
||||
%va = alloca i8*, align 8
|
||||
%va1 = bitcast i8** %va to i8*
|
||||
call void @llvm.va_start(i8* %va1)
|
||||
%0 = va_arg i8** %va, i32
|
||||
%sub = sub nsw i32 %a, %0
|
||||
ret i32 %sub
|
||||
}
|
||||
|
||||
declare void @llvm.va_start(i8*) nounwind
|
||||
|
||||
; CHECK: @intvaarg
|
||||
; Make sure that the va pointer is incremented by 8 (not 4).
|
||||
; CHECK: addi{{.*}}, 8
|
||||
|
Loading…
x
Reference in New Issue
Block a user