1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[AIX] Enable frame pointer for AIX and add related test suite

This patch:
   - enable frame pointer for AIX;
   - update some of red zone comments;
   - add/update testcases;

Differential Revision: https://reviews.llvm.org/D72454
This commit is contained in:
Xiangling Liao 2020-02-10 13:52:08 -05:00
parent 5c3b968dd2
commit 73bd7a141e
8 changed files with 549 additions and 101 deletions

View File

@ -60,7 +60,7 @@ static unsigned computeTOCSaveOffset(const PPCSubtarget &STI) {
}
static unsigned computeFramePointerSaveOffset(const PPCSubtarget &STI) {
// SVR4 ABI: First slot in the general register save area.
// First slot in the general register save area.
return STI.isPPC64() ? -8U : -4U;
}
@ -2436,8 +2436,6 @@ unsigned PPCFrameLowering::getTOCSaveOffset() const {
}
unsigned PPCFrameLowering::getFramePointerSaveOffset() const {
if (Subtarget.isAIXABI())
report_fatal_error("FramePointer is not implemented on AIX yet.");
return FramePointerSaveOffset;
}

View File

@ -292,8 +292,15 @@ public:
return Align(16);
}
// PPC32 SVR4ABI has no red zone and PPC64 SVR4ABI has a 288-byte red zone.
unsigned getRedZoneSize() const { return isPPC64() ? 288 : 0; }
unsigned getRedZoneSize() const {
if (isPPC64())
// 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved)
return 288;
// AIX PPC32: 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
// PPC32 SVR4ABI has no redzone.
return isAIXABI() ? 220 : 0;
}
bool hasHTM() const { return HasHTM; }
bool hasFloat128() const { return HasFloat128; }

View File

@ -1,26 +0,0 @@
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC32
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC64
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=CHECK-PPC32-NOFP
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=CHECK-PPC64-NOFP
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK-PPC32
; CHECK-PPC32: stwu 1, -32(1)
; CHECK-PPC32: stw 31, 28(1)
; CHECK-PPC32: lwz 31, 0(1)
; CHECK-PPC32-NOFP: stwu 1, -32(1)
; CHECK-PPC32-NOFP: stw 31, 28(1)
; CHECK-PPC32-NOFP: lwz 31, 0(1)
; CHECK-PPC64: std 31, -8(1)
; CHECK-PPC64: stdu 1, -64(1)
; CHECK-PPC64: ld 1, 0(1)
; CHECK-PPC64: ld 31, -8(1)
; CHECK-PPC64-NOFP: std 31, -8(1)
; CHECK-PPC64-NOFP: stdu 1, -64(1)
; CHECK-PPC64-NOFP: ld 1, 0(1)
; CHECK-PPC64-NOFP: ld 31, -8(1)
define i32* @f1(i32 %n) nounwind {
%tmp = alloca i32, i32 %n ; <i32*> [#uses=1]
ret i32* %tmp
}

View File

@ -0,0 +1,156 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefixes=PPC64,PPC64-LINUX
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefixes=PPC64,PPC64-LINUX
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefixes=PPC64,PPC64-AIX
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefixes=PPC64,PPC64-AIX
define dso_local signext i32 @foo(i32 %n) {
entry:
%ptr0 = alloca i32*
%0 = alloca i32, i32 %n
store i32* %0, i32** %ptr0
%1 = alloca i32, i32 %n
%2 = alloca i32, i32 %n
%3 = alloca i32, i32 %n
%4 = alloca i32, i32 %n
%5 = alloca i32, i32 %n
%6 = alloca i32, i32 %n
%7 = alloca i32, i32 %n
%8 = alloca i32, i32 %n
%9 = load i32*, i32** %ptr0
%call = call i32 @bar(i32* %1, i32* %2, i32* %3, i32* %4, i32* %5, i32* %6, i32* %7, i32* %8, i32* %9)
ret i32 %call
}
declare i32 @bar(i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*, i32*)
; PPC32-LINUX-LABEL: foo
; PPC32-LINUX: mflr 0
; PPC32-LINUX: stw 0, 4(1)
; PPC32-LINUX: stwu 1, -32(1)
; PPC32-LINUX: stw 31, 28(1)
; PPC32-LINUX: mr 31, 1
; PPC32-LINUX: addi 3, 31, 32
; PPC32-LINUX: stwux 3, 1, 10
; Allocated area is referred by stack pointer.
; PPC32-LINUX: addi 11, 1, 16
; Local variable area is referred by frame pointer.
; PPC32-LINUX: stw 11, 24(31)
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX: stwux
; PPC32-LINUX-NOT: stuwux
; Parameter save area is referred by stack pointer.
; PPC32-LINUX: stw 11, 8(1)
; PPC32-LINUX: bl bar
; PPC32-LINUX: lwz 31, 0(1)
; PPC32-LINUX: lwz 0, -4(31)
; PPC32-LINUX: mr 1, 31
; PPC32-LINUX: mr 31, 0
; PPC32-LINUX: lwz 0, 4(1)
; PPC32-LINUX: mtlr 0
; PPC32-LINUX: blr
; PPC64-LABEL: foo
; PPC64: mflr 0
; PPC64: std 31, -8(1)
; PPC64: std 0, 16(1)
; PPC64: stdu 1, -160(1)
; PPC64: mr 31, 1
; PPC64: addi 3, 31, 160
; PPC64: stdux 3, 1, 10
; Allocated area is referred by stack pointer.
; PPC64: addi 11, 1, 128
; Local variable area is referred by frame pointer.
; PPC64: std 11, 144(31)
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64: stdux
; PPC64-NOT: stdux
; Parameter save area is referred by stack pointer.
; PPC64: std 11, 112(1)
; PPC64-LINUX: bl bar
; PPC64-AIX: bl .bar
; PPC64: ld 1, 0(1)
; PPC64: ld 0, 16(1)
; PPC64-DAG: ld 31, -8(1)
; PPC64-DAG: mtlr 0
; PPC64: blr
; PPC32-AIX: mflr 0
; PPC32-AIX: stw 31, -4(1)
; PPC32-AIX: stw 0, 8(1)
; PPC32-AIX: stwu 1, -80(1)
; PPC32-AIX: mr 31, 1
; PPC32-AIX: addi 3, 31, 80
; PPC32-AIX: stwux 3, 1, 10
; Allocated area is referred by stack pointer.
; PPC32-AIX: addi 11, 1, 64
; Local variable area is referred by frame pointer.
; PPC32-AIX: stw 11, 72(31)
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX: stwux
; PPC32-AIX-NOT: stwux
; Parameter save area is referred by stack pointer.
; PPC32-AIX: stw 11, 56(1)
; PPC32-AIX: bl .bar
; PPC32-AIX: nop
; PPC32-AIX: lwz 1, 0(1)
; PPC32-AIX: lwz 0, 8(1)
; PPC32-AIX-DAG: mtlr 0
; PPC32-AIX-DAG: lwz 31, -4(1)
; PPC32-AIX: blr

View File

@ -0,0 +1,101 @@
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=PPC64-LINUX
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC64-LINUX
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-LINUX
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC32-AIX
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC64-AIX
; RUN: llc < %s -mcpu=pwr4 -mattr=-altivec -verify-machineinstrs \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX
define i32* @f1(i32 %n) nounwind {
%tmp = alloca i32, i32 %n ; <i32*> [#uses=1]
ret i32* %tmp
}
; PPC32-LINUX-LABEL: f1
; PPC32-LINUX: stwu 1, -32(1)
; PPC32-LINUX-NEXT: slwi 3, 3, 2
; PPC32-LINUX-NEXT: addi 3, 3, 15
; PPC32-LINUX-NEXT: stw 31, 28(1)
; PPC32-LINUX-NEXT: mr 31, 1
; PPC32-LINUX-NEXT: rlwinm 3, 3, 0, 0, 27
; PPC32-LINUX-NEXT: neg 3, 3
; PPC32-LINUX-NEXT: addi 4, 31, 32
; PPC32-LINUX-NEXT: stwux 4, 1, 3
; PPC32-LINUX-NEXT: lwz 31, 0(1)
; PPC32-LINUX-NEXT: addi 3, 1, 16
; PPC32-LINUX-NEXT: lwz 0, -4(31)
; PPC32-LINUX-NEXT: mr 1, 31
; PPC32-LINUX-NEXT: mr 31, 0
; PPC32-LINUX-NEXT: blr
; PPC64-LINUX-LABEL: f1
; PPC64-LINUX: std 31, -8(1)
; PPC64-LINUX-NEXT: stdu 1, -64(1)
; PPC64-LINUX-NEXT: lis 4, 32767
; PPC64-LINUX-NEXT: rldic 3, 3, 2, 30
; PPC64-LINUX-NEXT: ori 4, 4, 65535
; PPC64-LINUX-NEXT: addi 3, 3, 15
; PPC64-LINUX-NEXT: sldi 4, 4, 4
; PPC64-LINUX-NEXT: mr 31, 1
; PPC64-LINUX-NEXT: and 3, 3, 4
; PPC64-LINUX-NEXT: neg 3, 3
; PPC64-LINUX-NEXT: addi 4, 31, 64
; PPC64-LINUX-NEXT: stdux 4, 1, 3
; The linkage area is always put on the top of the stack.
; PPC64-LINUX-NEXT: addi 3, 1, 48
; PPC64-LINUX-NEXT: ld 1, 0(1)
; PPC64-LINUX-NEXT: ld 31, -8(1)
; PPC64-LINUX-NEXT: blr
; PPC32-AIX-LABEL: f1
; PPC32-AIX: stw 31, -4(1)
; PPC32-AIX-NEXT: stwu 1, -48(1)
; PPC32-AIX-NEXT: slwi 3, 3, 2
; PPC32-AIX-NEXT: mr 31, 1
; PPC32-AIX-NEXT: addi 3, 3, 15
; PPC32-AIX-NEXT: addi 4, 31, 48
; PPC32-AIX-NEXT: rlwinm 3, 3, 0, 0, 27
; PPC32-AIX-NEXT: neg 3, 3
; PPC32-AIX-NEXT: stwux 4, 1, 3
; The linkage area is always put on the top of the stack.
; PPC32-AIX-NEXT: addi 3, 1, 32
; PPC32-AIX-NEXT: lwz 1, 0(1)
; PPC32-AIX-NEXT: lwz 31, -4(1)
; PPC32-AIX-NEXT: blr
; PPC64-AIX-LABEL: f1
; PPC64-AIX: std 31, -8(1)
; PPC64-AIX-NEXT: stdu 1, -64(1)
; PPC64-AIX-NEXT: lis 4, 32767
; PPC64-AIX-NEXT: rldic 3, 3, 2, 30
; PPC64-AIX-NEXT: ori 4, 4, 65535
; PPC64-AIX-NEXT: addi 3, 3, 15
; PPC64-AIX-NEXT: sldi 4, 4, 4
; PPC64-AIX-NEXT: mr 31, 1
; PPC64-AIX-NEXT: and 3, 3, 4
; PPC64-AIX-NEXT: addi 4, 31, 64
; PPC64-AIX-NEXT: neg 3, 3
; PPC64-AIX-NEXT: stdux 4, 1, 3
; The linkage area is always put on the top of the stack.
; PPC64-AIX-NEXT: addi 3, 1, 48
; PPC64-AIX-NEXT: ld 1, 0(1)
; PPC64-AIX-NEXT: ld 31, -8(1)
; PPC64-AIX-NEXT: blr

View File

@ -1,53 +1,119 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC32-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC32-LINUX-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=PPC64-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC64-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC64-LINUX-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC64-LINUX-FP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX-FP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX-FP
define i32* @f1() nounwind {
%tmp = alloca i32, i32 8191 ; <i32*> [#uses=1]
ret i32* %tmp
}
; PPC32-NOFP: f1:
; PPC32-NOFP: lis 0, -1
; PPC32-NOFP: ori 0, 0, 32752
; PPC32-NOFP: stwux 1, 1, 0
; PPC32-NOFP-DAG: addi 3, 1, 20
; PPC32-NOFP-DAG: lwz 31, 0(1)
; PPC32-NOFP: mr 1, 31
; PPC32-NOFP: mr 31, 0
; PPC32-NOFP: blr
; - The stdux is used to update the back-chain link when allocated frame is large
; that we can not address it by a 16-bit signed integer;
; - The linkage area, if there is one, is still on the top of the stack after
; `alloca` space.
; PPC32-FP: lis 0, -1
; PPC32-FP: ori 0, 0, 32752
; PPC32-FP: stwux 1, 1, 0
; PPC32-FP: subf 0, 0, 1
; PPC32-FP: addic 0, 0, -4
; PPC32-FP: stwx 31, 0, 0
; PPC32-FP: mr 31, 1
; PPC32-FP: addi 3, 31, 16
; PPC32-FP: lwz 31, 0(1)
; PPC32-FP: lwz 0, -4(31)
; PPC32-FP: mr 1, 31
; PPC32-FP: mr 31, 0
; PPC32-FP: blr
; PPC32-LINUX-NOFP-LABEL: f1
; PPC32-LINUX-NOFP: lis 0, -1
; PPC32-LINUX-NOFP-NEXT: ori 0, 0, 32752
; PPC32-LINUX-NOFP-NEXT: stwux 1, 1, 0
; PPC32-LINUX-NOFP-NOT: stwux
; PPC32-LINUX-NOFP: mr 0, 31
; PPC32-LINUX-NOFP-DAG: addi 3, 1, 20
; PPC32-LINUX-NOFP-DAG: lwz 31, 0(1)
; PPC32-LINUX-NOFP-NEXT: mr 1, 31
; PPC32-LINUX-NOFP-NEXT: mr 31, 0
; PPC32-LINUX-NOFP-NEXT: blr
; PPC64-NOFP: f1:
; PPC64-NOFP: lis 0, -1
; PPC64-NOFP: ori 0, 0, 32720
; PPC64-NOFP: stdux 1, 1, 0
; PPC64-NOFP: addi 3, 1, 52
; PPC64-NOFP: ld 1, 0(1)
; PPC64-NOFP: blr
; PPC32-LINUX-FP-LABEL: f1
; PPC32-LINUX-FP: lis 0, -1
; PPC32-LINUX-FP-NEXT: ori 0, 0, 32752
; PPC32-LINUX-FP-NEXT: stwux 1, 1, 0
; PPC32-LINUX-FP-NOT: stwux
; PPC32-LINUX-FP: mr 31, 1
; PPC32-LINUX-FP-NEXT: addi 3, 31, 16
; PPC32-LINUX-FP-NEXT: lwz 31, 0(1)
; PPC32-LINUX-FP-NEXT: lwz 0, -4(31)
; PPC32-LINUX-FP-NEXT: mr 1, 31
; PPC32-LINUX-FP-NEXT: mr 31, 0
; PPC32-LINUX-FP-NEXT: blr
; PPC64-FP: f1:
; PPC64-FP: lis 0, -1
; PPC64-FP: ori 0, 0, 32704
; PPC64-FP: std 31, -8(1)
; PPC64-FP: stdux 1, 1, 0
; PPC64-FP: mr 31, 1
; PPC64-FP: addi 3, 31, 60
; PPC64-FP: ld 1, 0(1)
; PPC64-FP: ld 31, -8(1)
; PPC64-FP: blr
; PPC64-LINUX-NOFP-LABEL: f1:
; PPC64-LINUX-NOFP: lis 0, -1
; PPC64-LINUX-NOFP-NEXT: ori 0, 0, 32720
; PPC64-LINUX-NOFP-NEXT: stdux 1, 1, 0
; PPC64-LINUX-NOFP-NEXT: addi 3, 1, 52
; PPC64-LINUX-NOFP-NEXT: ld 1, 0(1)
; PPC64-LINUX-NOFP-NEXT: blr
; PPC64-LINUX-FP-LABEL: f1:
; PPC64-LINUX-FP: lis 0, -1
; PPC64-LINUX-FP-NEXT: ori 0, 0, 32704
; PPC64-LINUX-FP-NEXT: std 31, -8(1)
; PPC64-LINUX-FP-NEXT: stdux 1, 1, 0
; PPC64-LINUX-FP-NEXT: mr 31, 1
; PPC64-LINUX-FP-NEXT: addi 3, 31, 60
; PPC64-LINUX-FP-NEXT: ld 1, 0(1)
; PPC64-LINUX-FP-NEXT: ld 31, -8(1)
; PPC64-LINUX-FP-NEXT: blr
; PPC32-AIX-NOFP-LABEL: f1
; PPC32-AIX-NOFP: lis 0, -1
; PPC32-AIX-NOFP-NEXT: ori 0, 0, 32736
; PPC32-AIX-NOFP-NEXT: stwux 1, 1, 0
; PPC32-AIX-NOFP-NEXT: addi 3, 1, 36
; PPC32-AIX-NOFP-NEXT: lwz 1, 0(1)
; PPC32-AIX-NOFP-NEXT: blr
; PPC32-AIX-FP-LABEL: f1
; PPC32-AIX-FP: lis 0, -1
; PPC32-AIX-FP-NEXT: stw 31, -4(1)
; PPC32-AIX-FP-NEXT: ori 0, 0, 32736
; PPC32-AIX-FP-NEXT: stwux 1, 1, 0
; PPC32-AIX-FP-NEXT: mr 31, 1
; PPC32-AIX-FP-NEXT: addi 3, 31, 32
; PPC32-AIX-FP-NEXT: lwz 1, 0(1)
; PPC32-AIX-FP-NEXT: lwz 31, -4(1)
; PPC32-AIX-FP-NEXT: blr
; PPC64-AIX-NOFP-LABEL: f1
; PPC64-AIX-NOFP: lis 0, -1
; PPC64-AIX-NOFP-NEXT: ori 0, 0, 32720
; PPC64-AIX-NOFP-NEXT: stdux 1, 1, 0
; PPC64-AIX-NOFP-NEXT: addi 3, 1, 52
; PPC64-AIX-NOFP-NEXT: ld 1, 0(1)
; PPC64-AIX-NOFP-NEXT: blr
; PPC64-AIX-FP-LABEL: f1
; PPC64-AIX-FP: lis 0, -1
; PPC64-AIX-FP-NEXT: std 31, -8(1)
; PPC64-AIX-FP-NEXT: ori 0, 0, 32704
; PPC64-AIX-FP-NEXT: stdux 1, 1, 0
; PPC64-AIX-FP-NEXT: mr 31, 1
; PPC64-AIX-FP-NEXT: addi 3, 31, 60
; PPC64-AIX-FP-NEXT: ld 1, 0(1)
; PPC64-AIX-FP-NEXT: ld 31, -8(1)
; PPC64-AIX-FP-NEXT: blr

View File

@ -1,36 +1,95 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | FileCheck %s -check-prefix=PPC32-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC32-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s -check-prefix=PPC64-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -frame-pointer=all | FileCheck %s -check-prefix=PPC64-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC32-LINUX-NOFP
;PPC32-FP: f1:
;PPC32-FP: stwu 1, -16400(1)
;PPC32-FP: addi 3, 1, 20
;PPC32-FP: addi 1, 1, 16400
;PPC32-FP: blr
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX-FP
;PPC32-NOFP: f1:
;PPC32-NOFP: stwu 1, -16400(1)
;PPC32-NOFP: stw 31, 16396(1)
;PPC32-NOFP: lwz 31, 16396(1)
;PPC32-NOFP: addi 1, 1, 16400
;PPC32-NOFP: blr
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC64-LINUX-NOFP
;PPC64-FP: f1:
;PPC64-FP: stdu 1, -16432(1)
;PPC64-FP: addi 1, 1, 16432
;PPC64-FP: blr
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC64-LINUX-FP
;PPC64-NOFP: f1:
;PPC64-NOFP: std 31, -8(1)
;PPC64-NOFP: stdu 1, -16448(1)
;PPC64-NOFP: addi 1, 1, 16448
;PPC64-NOFP: ld 31, -8(1)
;PPC64-NOFP: blr
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX-FP
define i32* @f1() {
%tmp = alloca i32, i32 4095 ; <i32*> [#uses=1]
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC64-AIX-FP
define i32* @frame_small() {
%tmp = alloca i32, i32 95
ret i32* %tmp
}
; The linkage area, if there is one, is still on the top of the stack after
; `alloca` space.
; PPC32-LINUX-NOFP-LABEL: frame_small
; PPC32-LINUX-NOFP: stwu 1, -400(1)
; PPC32-LINUX-NOFP: addi 3, 1, 20
; PPC32-LINUX-NOFP: addi 1, 1, 400
; PPC32-LINUX-NOFP: blr
; PPC32-LINUX-FP-LABEL: frame_small
; PPC32-LINUX-FP: stwu 1, -400(1)
; PPC32-LINUX-FP: stw 31, 396(1)
; PPC32-LINUX-FP: mr 31, 1
; PPC32-LINUX-FP: addi 3, 31, 16
; PPC32-LINUX-FP: lwz 31, 396(1)
; PPC32-LINUX-FP: addi 1, 1, 400
; PPC32-LINUX-FP: blr
; PPC64-LINUX-NOFP-LABEL: frame_small
; PPC64-LINUX-NOFP: stdu 1, -432(1)
; PPC64-LINUX-NOFP: addi 3, 1, 52
; PPC64-LINUX-NOFP: addi 1, 1, 432
; PPC64-LINUX-NOFP: blr
; PPC64-LINUX-FP-LABEL: frame_small
; PPC64-LINUX-FP: std 31, -8(1)
; PPC64-LINUX-FP: stdu 1, -448(1)
; PPC64-LINUX-FP: mr 31, 1
; PPC64-LINUX-FP: addi 3, 31, 60
; PPC64-LINUX-FP: addi 1, 1, 448
; PPC64-LINUX-FP: ld 31, -8(1)
; PPC64-LINUX-FP: blr
; PPC32-AIX-NOFP-LABEL: frame_small
; PPC32-AIX-NOFP: stwu 1, -416(1)
; PPC32-AIX-NOFP-NEXT: addi 3, 1, 36
; PPC32-AIX-NOFP-NEXT: addi 1, 1, 416
; PPC32-AIX-NOFP-NEXT: blr
; PPC32-AIX-FP-LABEL: frame_small
; PPC32-AIX-FP: stw 31, -4(1)
; PPC32-AIX-FP-NEXT: stwu 1, -416(1)
; PPC32-AIX-FP-NEXT: mr 31, 1
; PPC32-AIX-FP-NEXT: addi 3, 31, 32
; PPC32-AIX-FP-NEXT: addi 1, 1, 416
; PPC32-AIX-FP-NEXT: lwz 31, -4(1)
; PPC32-AIX-FP-NEXT: blr
; PPC64-AIX-NOFP-LABEL: frame_small
; PPC64-AIX-NOFP: stdu 1, -432(1)
; PPC64-AIX-NOFP-NEXT: addi 3, 1, 52
; PPC64-AIX-NOFP-NEXT: addi 1, 1, 432
; PPC64-AIX-NOFP-NEXT: blr
; PPC64-AIX-FP-LABEL: frame_small
; PPC64-AIX-FP: std 31, -8(1)
; PPC64-AIX-FP-NEXT: stdu 1, -448(1)
; PPC64-AIX-FP-NEXT: mr 31, 1
; PPC64-AIX-FP-NEXT: addi 3, 31, 60
; PPC64-AIX-FP-NEXT: addi 1, 1, 448
; PPC64-AIX-FP-NEXT: ld 31, -8(1)
; PPC64-AIX-FP-NEXT: blr

View File

@ -0,0 +1,87 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC32-LINUX-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC32-LINUX-FP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | \
; RUN: FileCheck %s -check-prefix=PPC64-NOFP
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -frame-pointer=all | FileCheck %s -check-prefix=PPC64-FP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC32-AIX-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC32-AIX-FP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff | FileCheck %s -check-prefix=PPC64-NOFP
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 -mattr=-altivec \
; RUN: -mtriple=powerpc64-ibm-aix-xcoff -frame-pointer=all | FileCheck %s \
; RUN: -check-prefix=PPC64-FP
; - PPC64 SVR4ABI and AIX ABI:
; 288 bytes = 18*8 (FPRs) + 18*8 (GPRs, GPR13 reserved);
; - PPC32 SVR4ABI has no red zone;
; - PPC32 AIX ABI:
; 220 bytes = 18*8 (FPRs) + 19*4 (GPRs);
define i32* @in_stack_floor_32() {
%tmp = alloca i32, i32 55
ret i32* %tmp
}
define i32* @out_stack_floor_32() {
%tmp = alloca i32, i32 56
ret i32* %tmp
}
define i32* @in_stack_floor_64() {
%tmp = alloca i32, i32 72
ret i32* %tmp
}
define i32* @out_stack_floor_64() {
%tmp = alloca i32, i32 73
ret i32* %tmp
}
; PPC32-LINUX-NOFP-LABEL: in_stack_floor_32
; PPC32-LINUX-NOFP: stwu
; PPC32-LINUX-NOFP-LABEL: out_stack_floor_32
; PPC32-LINUX-NOFP: stwu
; PPC32-LINUX-FP-LABEL: in_stack_floor_32
; PPC32-LINUX-FP: stwu
; PPC32-LINUX-FP-LABEL: out_stack_floor_32
; PPC32-LINUX-FP: stwu
; PPC32-AIX-NOFP-LABEL: in_stack_floor_32
; PPC32-AIX-NOFP-NOT: stwu
; PPC32-AIX-NOFP-LABEL: out_stack_floor_32
; PPC32-AIX-NOFP: stwu 1, -256(1)
; PPC32-AIX-FP-LABEL: in_stack_floor_32
; PPC32-AIX-FP: stwu 1, -256(1)
; PPC32-AIX-FP-LABEL: out_stack_floor_32
; PPC32-AIX-FP: stwu 1, -256(1)
; PPC64-NOFP-LABEL: in_stack_floor_64
; PPC64-NOFP: addi 3, 1, -288
; PPC64-NOFP-LABEL: out_stack_floor_64
; PPC64-NOFP: stdu 1, -352(1)
; PPC64-FP-LABEL: in_stack_floor_64
; PPC64-FP: stdu 1, -352(1)
; PPC64-FP-LABEL: out_stack_floor_64
; PPC64-FP: stdu 1, -352(1)