1 ; RUN: llc -march=mips < %s | FileCheck --check-prefixes=ALL,O32 %s 2 ; RUN: llc -march=mipsel < %s | FileCheck --check-prefixes=ALL,O32 %s 3 ; RUN: llc -march=mips < %s | FileCheck --check-prefixes=ALL,O32-INV %s 4 ; RUN: llc -march=mipsel < %s | FileCheck --check-prefixes=ALL,O32-INV %s 5 6 ; RUN-TODO: llc -march=mips64 -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s 7 ; RUN-TODO: llc -march=mips64el -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s 8 ; RUN-TODO: llc -march=mips64 -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32-INV %s 9 ; RUN-TODO: llc -march=mips64el -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32-INV %s 10 11 ; RUN: llc -march=mips64 -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s 12 ; RUN: llc -march=mips64el -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s 13 ; RUN: llc -march=mips64 -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32-INV %s 14 ; RUN: llc -march=mips64el -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32-INV %s 15 16 ; RUN: llc -march=mips64 -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s 17 ; RUN: llc -march=mips64el -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s 18 ; RUN: llc -march=mips64 -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64-INV %s 19 ; RUN: llc -march=mips64el -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64-INV %s 20 21 ; Test the callee-saved registers are callee-saved as specified by section 22 ; 2 of the MIPSpro N32 Handbook and section 3 of the SYSV ABI spec. 23 24 define void @gpr_clobber() nounwind { 25 entry: 26 ; Clobbering the stack pointer is a bad idea so we'll skip that one 27 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}"() 28 ret void 29 } 30 31 ; ALL-LABEL: gpr_clobber: 32 ; O32: addiu $sp, $sp, -40 33 ; O32-INV-NOT: sw $0, 34 ; O32-INV-NOT: sw $1, 35 ; O32-INV-NOT: sw $2, 36 ; O32-INV-NOT: sw $3, 37 ; O32-INV-NOT: sw $4, 38 ; O32-INV-NOT: sw $5, 39 ; O32-INV-NOT: sw $6, 40 ; O32-INV-NOT: sw $7, 41 ; O32-INV-NOT: sw $8, 42 ; O32-INV-NOT: sw $9, 43 ; O32-INV-NOT: sw $10, 44 ; O32-INV-NOT: sw $11, 45 ; O32-INV-NOT: sw $12, 46 ; O32-INV-NOT: sw $13, 47 ; O32-INV-NOT: sw $14, 48 ; O32-INV-NOT: sw $15, 49 ; O32-DAG: sw [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 50 ; O32-DAG: sw [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 51 ; O32-DAG: sw [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 52 ; O32-DAG: sw [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 53 ; O32-DAG: sw [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 54 ; O32-DAG: sw [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 55 ; O32-DAG: sw [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 56 ; O32-DAG: sw [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 57 ; O32-INV-NOT: sw $24, 58 ; O32-INV-NOT: sw $25, 59 ; O32-INV-NOT: sw $26, 60 ; O32-INV-NOT: sw $27, 61 ; O32-INV-NOT: sw $28, 62 ; O32-INV-NOT: sw $29, 63 ; O32-DAG: sw [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 64 ; O32-DAG: sw [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 65 ; O32-DAG: lw [[G16]], [[OFF16]]($sp) 66 ; O32-DAG: lw [[G17]], [[OFF17]]($sp) 67 ; O32-DAG: lw [[G18]], [[OFF18]]($sp) 68 ; O32-DAG: lw [[G19]], [[OFF19]]($sp) 69 ; O32-DAG: lw [[G20]], [[OFF20]]($sp) 70 ; O32-DAG: lw [[G21]], [[OFF21]]($sp) 71 ; O32-DAG: lw [[G22]], [[OFF22]]($sp) 72 ; O32-DAG: lw [[G23]], [[OFF23]]($sp) 73 ; O32-DAG: lw [[G30]], [[OFF30]]($sp) 74 ; O32-DAG: lw [[G31]], [[OFF31]]($sp) 75 ; O32: addiu $sp, $sp, 40 76 77 ; N32: addiu $sp, $sp, -96 78 ; N32-INV-NOT: sd $0, 79 ; N32-INV-NOT: sd $1, 80 ; N32-INV-NOT: sd $2, 81 ; N32-INV-NOT: sd $3, 82 ; N32-INV-NOT: sd $4, 83 ; N32-INV-NOT: sd $5, 84 ; N32-INV-NOT: sd $6, 85 ; N32-INV-NOT: sd $7, 86 ; N32-INV-NOT: sd $8, 87 ; N32-INV-NOT: sd $9, 88 ; N32-INV-NOT: sd $10, 89 ; N32-INV-NOT: sd $11, 90 ; N32-INV-NOT: sd $12, 91 ; N32-INV-NOT: sd $13, 92 ; N32-INV-NOT: sd $14, 93 ; N32-INV-NOT: sd $15, 94 ; N32-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 95 ; N32-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 96 ; N32-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 97 ; N32-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 98 ; N32-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 99 ; N32-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 100 ; N32-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 101 ; N32-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 102 ; N32-INV-NOT: sd $24, 103 ; N32-INV-NOT: sd $25, 104 ; N32-INV-NOT: sd $26, 105 ; N32-INV-NOT: sd $27, 106 ; N32-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) 107 ; N32-INV-NOT: sd $29, 108 ; N32-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 109 ; N32-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 110 ; N32-DAG: ld [[G16]], [[OFF16]]($sp) 111 ; N32-DAG: ld [[G17]], [[OFF17]]($sp) 112 ; N32-DAG: ld [[G18]], [[OFF18]]($sp) 113 ; N32-DAG: ld [[G19]], [[OFF19]]($sp) 114 ; N32-DAG: ld [[G20]], [[OFF20]]($sp) 115 ; N32-DAG: ld [[G21]], [[OFF21]]($sp) 116 ; N32-DAG: ld [[G22]], [[OFF22]]($sp) 117 ; N32-DAG: ld [[G23]], [[OFF23]]($sp) 118 ; N32-DAG: ld [[G28]], [[OFF28]]($sp) 119 ; N32-DAG: ld [[G30]], [[OFF30]]($sp) 120 ; N32-DAG: ld [[G31]], [[OFF31]]($sp) 121 ; N32: addiu $sp, $sp, 96 122 123 ; N64: daddiu $sp, $sp, -96 124 ; N64-INV-NOT: sd $0, 125 ; N64-INV-NOT: sd $1, 126 ; N64-INV-NOT: sd $2, 127 ; N64-INV-NOT: sd $3, 128 ; N64-INV-NOT: sd $4, 129 ; N64-INV-NOT: sd $5, 130 ; N64-INV-NOT: sd $6, 131 ; N64-INV-NOT: sd $7, 132 ; N64-INV-NOT: sd $8, 133 ; N64-INV-NOT: sd $9, 134 ; N64-INV-NOT: sd $10, 135 ; N64-INV-NOT: sd $11, 136 ; N64-INV-NOT: sd $12, 137 ; N64-INV-NOT: sd $13, 138 ; N64-INV-NOT: sd $14, 139 ; N64-INV-NOT: sd $15, 140 ; N64-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 141 ; N64-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 142 ; N64-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 143 ; N64-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 144 ; N64-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 145 ; N64-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 146 ; N64-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 147 ; N64-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 148 ; N64-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 149 ; N64-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 150 ; N64-INV-NOT: sd $24, 151 ; N64-INV-NOT: sd $25, 152 ; N64-INV-NOT: sd $26, 153 ; N64-INV-NOT: sd $27, 154 ; N64-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) 155 ; N64-INV-NOT: sd $29, 156 ; N64-DAG: ld [[G16]], [[OFF16]]($sp) 157 ; N64-DAG: ld [[G17]], [[OFF17]]($sp) 158 ; N64-DAG: ld [[G18]], [[OFF18]]($sp) 159 ; N64-DAG: ld [[G19]], [[OFF19]]($sp) 160 ; N64-DAG: ld [[G20]], [[OFF20]]($sp) 161 ; N64-DAG: ld [[G21]], [[OFF21]]($sp) 162 ; N64-DAG: ld [[G22]], [[OFF22]]($sp) 163 ; N64-DAG: ld [[G23]], [[OFF23]]($sp) 164 ; N64-DAG: ld [[G28]], [[OFF28]]($sp) 165 ; N64-DAG: ld [[G30]], [[OFF30]]($sp) 166 ; N64-DAG: ld [[G31]], [[OFF31]]($sp) 167 ; N64: daddiu $sp, $sp, 96 168