diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-01-11 18:41:19 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-01-11 18:41:19 +0000 |
commit | 4eecacb9c8ea1ed2eaa7e60e975f394c5a969feb (patch) | |
tree | 61832c6e8108f5b2fb49a595a33ef5fa9494841f | |
parent | 3212a342692b23c666f529715ca8daa2b731644b (diff) | |
download | bcm5719-llvm-4eecacb9c8ea1ed2eaa7e60e975f394c5a969feb.tar.gz bcm5719-llvm-4eecacb9c8ea1ed2eaa7e60e975f394c5a969feb.zip |
Generate the segmented stack prologue for fastcc too.
Patch by Brian Anderson.
llvm-svn: 147958
-rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 3 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/segmented-stacks.ll | 55 |
2 files changed, 57 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index fba4788d6a5..4386762c853 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -1306,7 +1306,8 @@ GetScratchRegister(bool Is64Bit, const MachineFunction &MF) { CallingConv::ID CallingConvention = MF.getFunction()->getCallingConv(); bool IsNested = HasNestArgument(&MF); - if (CallingConvention == CallingConv::X86_FastCall) { + if (CallingConvention == CallingConv::X86_FastCall || + CallingConvention == CallingConv::Fast) { if (IsNested) { report_fatal_error("Segmented stacks does not support fastcall with " "nested function."); diff --git a/llvm/test/CodeGen/X86/segmented-stacks.ll b/llvm/test/CodeGen/X86/segmented-stacks.ll index 27537c085c8..0e125d36a76 100644 --- a/llvm/test/CodeGen/X86/segmented-stacks.ll +++ b/llvm/test/CodeGen/X86/segmented-stacks.ll @@ -114,3 +114,58 @@ define void @test_large() { ; X64-NEXT: ret } + +define fastcc void @test_fastcc() { + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + ret void + +; X32: test_fastcc: + +; X32: cmpl %gs:48, %esp +; X32-NEXT: ja .LBB3_2 + +; X32: pushl $0 +; X32-NEXT: pushl $60 +; X32-NEXT: calll __morestack +; X32-NEXT: ret + +; X64: test_fastcc: + +; X64: cmpq %fs:112, %rsp +; X64-NEXT: ja .LBB3_2 + +; X64: movabsq $40, %r10 +; X64-NEXT: movabsq $0, %r11 +; X64-NEXT: callq __morestack +; X64-NEXT: ret + +} + +define fastcc void @test_fastcc_large() { + %mem = alloca i32, i32 10000 + call void @dummy_use (i32* %mem, i32 0) + ret void + +; X32: test_fastcc_large: + +; X32: leal -40012(%esp), %eax +; X32-NEXT: cmpl %gs:48, %eax +; X32-NEXT: ja .LBB4_2 + +; X32: pushl $0 +; X32-NEXT: pushl $40012 +; X32-NEXT: calll __morestack +; X32-NEXT: ret + +; X64: test_fastcc_large: + +; X64: leaq -40008(%rsp), %r11 +; X64-NEXT: cmpq %fs:112, %r11 +; X64-NEXT: ja .LBB4_2 + +; X64: movabsq $40008, %r10 +; X64-NEXT: movabsq $0, %r11 +; X64-NEXT: callq __morestack +; X64-NEXT: ret +} |