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:
parent
5c3b968dd2
commit
73bd7a141e
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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; }
|
||||
|
@ -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
|
||||
}
|
156
test/CodeGen/PowerPC/Frames-dyn-alloca-with-func-call.ll
Normal file
156
test/CodeGen/PowerPC/Frames-dyn-alloca-with-func-call.ll
Normal 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
|
101
test/CodeGen/PowerPC/Frames-dyn-alloca.ll
Normal file
101
test/CodeGen/PowerPC/Frames-dyn-alloca.ll
Normal 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
|
@ -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
|
||||
|
@ -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
|
||||
|
87
test/CodeGen/PowerPC/Frames-stack-floor.ll
Normal file
87
test/CodeGen/PowerPC/Frames-stack-floor.ll
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user