diff options
Diffstat (limited to 'test/CodeGen/Mips/cconv/callee-saved.ll')
-rw-r--r-- | test/CodeGen/Mips/cconv/callee-saved.ll | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/test/CodeGen/Mips/cconv/callee-saved.ll b/test/CodeGen/Mips/cconv/callee-saved.ll new file mode 100644 index 0000000..293e99f --- /dev/null +++ b/test/CodeGen/Mips/cconv/callee-saved.ll @@ -0,0 +1,167 @@ +; RUN: llc -march=mips < %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +; RUN: llc -march=mipsel < %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +; RUN: llc -march=mips < %s | FileCheck --check-prefix=ALL --check-prefix=O32-INV %s +; RUN: llc -march=mipsel < %s | FileCheck --check-prefix=ALL --check-prefix=O32-INV %s + +; RUN-TODO: llc -march=mips64 -mattr=-n64,+o32 < %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +; RUN-TODO: llc -march=mips64el -mattr=-n64,+o32 < %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +; RUN-TODO: llc -march=mips64 -mattr=-n64,+o32 < %s | FileCheck --check-prefix=ALL --check-prefix=O32-INV %s +; RUN-TODO: llc -march=mips64el -mattr=-n64,+o32 < %s | FileCheck --check-prefix=ALL --check-prefix=O32-INV %s + +; RUN: llc -march=mips64 -mattr=-n64,+n32 < %s | FileCheck --check-prefix=ALL --check-prefix=N32 %s +; RUN: llc -march=mips64el -mattr=-n64,+n32 < %s | FileCheck --check-prefix=ALL --check-prefix=N32 %s +; RUN: llc -march=mips64 -mattr=-n64,+n32 < %s | FileCheck --check-prefix=ALL --check-prefix=N32-INV %s +; RUN: llc -march=mips64el -mattr=-n64,+n32 < %s | FileCheck --check-prefix=ALL --check-prefix=N32-INV %s + +; RUN: llc -march=mips64 -mattr=-n64,+n64 < %s | FileCheck --check-prefix=ALL --check-prefix=N64 %s +; RUN: llc -march=mips64el -mattr=-n64,+n64 < %s | FileCheck --check-prefix=ALL --check-prefix=N64 %s +; RUN: llc -march=mips64 -mattr=-n64,+n64 < %s | FileCheck --check-prefix=ALL --check-prefix=N64-INV %s +; RUN: llc -march=mips64el -mattr=-n64,+n64 < %s | FileCheck --check-prefix=ALL --check-prefix=N64-INV %s + +; Test the the callee-saved registers are callee-saved as specified by section +; 2 of the MIPSpro N32 Handbook and section 3 of the SYSV ABI spec. + +define void @gpr_clobber() nounwind { +entry: + ; Clobbering the stack pointer is a bad idea so we'll skip that one + call void asm "# Clobber", "~{$0},~{$1},~{$2},~{$3},~{$4},~{$5},~{$6},~{$7},~{$8},~{$9},~{$10},~{$11},~{$12},~{$13},~{$14},~{$15},~{$16},~{$17},~{$18},~{$19},~{$20},~{$21},~{$22},~{$23},~{$24},~{$25},~{$26},~{$27},~{$28},~{$30},~{$31}"() + ret void +} + +; ALL-LABEL: gpr_clobber: +; O32: addiu $sp, $sp, -40 +; O32-INV-NOT: sw $0, +; O32-INV-NOT: sw $1, +; O32-INV-NOT: sw $2, +; O32-INV-NOT: sw $3, +; O32-INV-NOT: sw $4, +; O32-INV-NOT: sw $5, +; O32-INV-NOT: sw $6, +; O32-INV-NOT: sw $7, +; O32-INV-NOT: sw $8, +; O32-INV-NOT: sw $9, +; O32-INV-NOT: sw $10, +; O32-INV-NOT: sw $11, +; O32-INV-NOT: sw $12, +; O32-INV-NOT: sw $13, +; O32-INV-NOT: sw $14, +; O32-INV-NOT: sw $15, +; O32-DAG: sw [[G16:\$16]], [[OFF16:[0-9]+]]($sp) +; O32-DAG: sw [[G17:\$17]], [[OFF17:[0-9]+]]($sp) +; O32-DAG: sw [[G18:\$18]], [[OFF18:[0-9]+]]($sp) +; O32-DAG: sw [[G19:\$19]], [[OFF19:[0-9]+]]($sp) +; O32-DAG: sw [[G20:\$20]], [[OFF20:[0-9]+]]($sp) +; O32-DAG: sw [[G21:\$21]], [[OFF21:[0-9]+]]($sp) +; O32-DAG: sw [[G22:\$22]], [[OFF22:[0-9]+]]($sp) +; O32-DAG: sw [[G23:\$23]], [[OFF23:[0-9]+]]($sp) +; O32-INV-NOT: sw $24, +; O32-INV-NOT: sw $25, +; O32-INV-NOT: sw $26, +; O32-INV-NOT: sw $27, +; O32-INV-NOT: sw $28, +; O32-INV-NOT: sw $29, +; O32-DAG: sw [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) +; O32-DAG: sw [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) +; O32-DAG: lw [[G16]], [[OFF16]]($sp) +; O32-DAG: lw [[G17]], [[OFF17]]($sp) +; O32-DAG: lw [[G18]], [[OFF18]]($sp) +; O32-DAG: lw [[G19]], [[OFF19]]($sp) +; O32-DAG: lw [[G20]], [[OFF20]]($sp) +; O32-DAG: lw [[G21]], [[OFF21]]($sp) +; O32-DAG: lw [[G22]], [[OFF22]]($sp) +; O32-DAG: lw [[G23]], [[OFF23]]($sp) +; O32-DAG: lw [[G30]], [[OFF30]]($sp) +; O32-DAG: lw [[G31]], [[OFF31]]($sp) +; O32: addiu $sp, $sp, 40 + +; N32: addiu $sp, $sp, -96 +; N32-INV-NOT: sd $0, +; N32-INV-NOT: sd $1, +; N32-INV-NOT: sd $2, +; N32-INV-NOT: sd $3, +; N32-INV-NOT: sd $4, +; N32-INV-NOT: sd $5, +; N32-INV-NOT: sd $6, +; N32-INV-NOT: sd $7, +; N32-INV-NOT: sd $8, +; N32-INV-NOT: sd $9, +; N32-INV-NOT: sd $10, +; N32-INV-NOT: sd $11, +; N32-INV-NOT: sd $12, +; N32-INV-NOT: sd $13, +; N32-INV-NOT: sd $14, +; N32-INV-NOT: sd $15, +; N32-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) +; N32-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) +; N32-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) +; N32-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) +; N32-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) +; N32-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) +; N32-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) +; N32-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) +; N32-INV-NOT: sd $24, +; N32-INV-NOT: sd $25, +; N32-INV-NOT: sd $26, +; N32-INV-NOT: sd $27, +; N32-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) +; N32-INV-NOT: sd $29, +; N32-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) +; N32-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) +; N32-DAG: ld [[G16]], [[OFF16]]($sp) +; N32-DAG: ld [[G17]], [[OFF17]]($sp) +; N32-DAG: ld [[G18]], [[OFF18]]($sp) +; N32-DAG: ld [[G19]], [[OFF19]]($sp) +; N32-DAG: ld [[G20]], [[OFF20]]($sp) +; N32-DAG: ld [[G21]], [[OFF21]]($sp) +; N32-DAG: ld [[G22]], [[OFF22]]($sp) +; N32-DAG: ld [[G23]], [[OFF23]]($sp) +; N32-DAG: ld [[G28]], [[OFF28]]($sp) +; N32-DAG: ld [[G30]], [[OFF30]]($sp) +; N32-DAG: ld [[G31]], [[OFF31]]($sp) +; N32: addiu $sp, $sp, 96 + +; N64: daddiu $sp, $sp, -96 +; N64-INV-NOT: sd $0, +; N64-INV-NOT: sd $1, +; N64-INV-NOT: sd $2, +; N64-INV-NOT: sd $3, +; N64-INV-NOT: sd $4, +; N64-INV-NOT: sd $5, +; N64-INV-NOT: sd $6, +; N64-INV-NOT: sd $7, +; N64-INV-NOT: sd $8, +; N64-INV-NOT: sd $9, +; N64-INV-NOT: sd $10, +; N64-INV-NOT: sd $11, +; N64-INV-NOT: sd $12, +; N64-INV-NOT: sd $13, +; N64-INV-NOT: sd $14, +; N64-INV-NOT: sd $15, +; N64-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) +; N64-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) +; N64-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) +; N64-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) +; N64-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) +; N64-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) +; N64-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) +; N64-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) +; N64-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) +; N64-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) +; N64-INV-NOT: sd $24, +; N64-INV-NOT: sd $25, +; N64-INV-NOT: sd $26, +; N64-INV-NOT: sd $27, +; N64-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) +; N64-INV-NOT: sd $29, +; N64-DAG: ld [[G16]], [[OFF16]]($sp) +; N64-DAG: ld [[G17]], [[OFF17]]($sp) +; N64-DAG: ld [[G18]], [[OFF18]]($sp) +; N64-DAG: ld [[G19]], [[OFF19]]($sp) +; N64-DAG: ld [[G20]], [[OFF20]]($sp) +; N64-DAG: ld [[G21]], [[OFF21]]($sp) +; N64-DAG: ld [[G22]], [[OFF22]]($sp) +; N64-DAG: ld [[G23]], [[OFF23]]($sp) +; N64-DAG: ld [[G28]], [[OFF28]]($sp) +; N64-DAG: ld [[G30]], [[OFF30]]($sp) +; N64-DAG: ld [[G31]], [[OFF31]]($sp) +; N64: daddiu $sp, $sp, 96 |