56 lines · plain
1; RUN: llc < %s -mtriple=x86_64-linux-unknown -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-642; RUN: llc < %s -mtriple=i386-linux-unknown -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-323; RUN: llc < %s -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-324 5; Test that a large stack offset uses a single add/sub instruction to6; adjust the stack pointer.7 8define void @foo() nounwind {9; CHECK-64-LABEL: foo:10; CHECK-64: movabsq $50000000{{..}}, %rax11; CHECK-64-NEXT: subq %rax, %rsp12; CHECK-64-NOT: subq $2147483647, %rsp13; CHECK-64: movabsq $50000000{{..}}, [[RAX:%r..]]14; CHECK-64-NEXT: addq [[RAX]], %rsp15;16; CHECK-32-LABEL: foo:17; CHECK-32: ud218; CHECK-32-NOT: subl $2147483647, %esp19; CHECK-32: ud220 %1 = alloca [5000000000 x i8], align 1621 call void @bar(ptr %1)22 ret void23}24 25; Verify that we do not clobber the return value.26 27define i32 @foo2() nounwind {28; CHECK-64-LABEL: foo2:29; CHECK-64: movl $10, %eax30; CHECK-64-NOT: movabsq ${{.*}}, %rax31;32; CHECK-32-LABEL: foo2:33; CHECK-32: movl $10, %eax34; CHECK-32-NOT: movl ${{.*}}, %eax35 %1 = alloca [5000000000 x i8], align 1636 call void @bar(ptr %1)37 ret i32 1038}39 40; Verify that we do not clobber EAX when using inreg attribute41 42define i32 @foo3(i32 inreg %x) nounwind {43; CHECK-64-LABEL: foo3:44; CHECK-64: movabsq $50000000{{..}}, %rax45; CHECK-64-NEXT: subq %rax, %rsp46;47; CHECK-32-LABEL: foo3:48; CHECK-32: ud249; CHECK-32-NOT: movl ${{.*}}, %eax50 %1 = alloca [5000000000 x i8], align 1651 call void @bar(ptr %1)52 ret i32 %x53}54 55declare void @bar(ptr)56