1 ; Test some of the calling convention lowering done by the MBlaze backend. 2 ; We test that integer values are passed in the correct registers and 3 ; returned in the correct registers. Additionally, we test that the stack 4 ; is used as appropriate for passing arguments that cannot be placed into 5 ; registers. 6 ; 7 ; RUN: llc < %s -march=mblaze | FileCheck %s 8 9 declare i32 @printf(i8*, ...) 10 @MSG = internal constant [13 x i8] c"Message: %d\0A\00" 11 12 define void @params0_noret() { 13 ; CHECK: params0_noret: 14 ret void 15 ; CHECK-NOT: {{.* r3, .*, .*}} 16 ; CHECK-NOT: {{.* r4, .*, .*}} 17 ; CHECK: rtsd 18 } 19 20 define i8 @params0_8bitret() { 21 ; CHECK: params0_8bitret: 22 ret i8 1 23 ; CHECK-NOT: {{.* r3, .*, .*}} 24 ; CHECK-NOT: {{.* r4, .*, .*}} 25 ; CHECK: rtsd 26 ; CHECK: {{.* r3, r0, 1}} 27 } 28 29 define i16 @params0_16bitret() { 30 ; CHECK: params0_16bitret: 31 ret i16 1 32 ; CHECK: rtsd 33 ; CHECK: {{.* r3, r0, 1}} 34 ; CHECK-NOT: {{.* r4, .*, .*}} 35 } 36 37 define i32 @params0_32bitret() { 38 ; CHECK: params0_32bitret: 39 ret i32 1 40 ; CHECK-NOT: {{.* r4, .*, .*}} 41 ; CHECK: rtsd 42 ; CHECK: {{.* r3, r0, 1}} 43 } 44 45 define i64 @params0_64bitret() { 46 ; CHECK: params0_64bitret: 47 ret i64 1 48 ; CHECK: {{.* r3, r0, .*}} 49 ; CHECK: rtsd 50 ; CHECK: {{.* r4, r0, 1}} 51 } 52 53 define i32 @params1_32bitret(i32 %a) { 54 ; CHECK: params1_32bitret: 55 ret i32 %a 56 ; CHECK-NOT: {{.* r3, .*, .*}} 57 ; CHECK-NOT: {{.* r4, .*, .*}} 58 ; CHECK: rtsd 59 ; CHECK: {{.* r3, r5, r0}} 60 } 61 62 define i32 @params2_32bitret(i32 %a, i32 %b) { 63 ; CHECK: params2_32bitret: 64 ret i32 %b 65 ; CHECK-NOT: {{.* r3, .*, .*}} 66 ; CHECK-NOT: {{.* r4, .*, .*}} 67 ; CHECK: rtsd 68 ; CHECK: {{.* r3, r6, r0}} 69 } 70 71 define i32 @params3_32bitret(i32 %a, i32 %b, i32 %c) { 72 ; CHECK: params3_32bitret: 73 ret i32 %c 74 ; CHECK-NOT: {{.* r3, .*, .*}} 75 ; CHECK-NOT: {{.* r4, .*, .*}} 76 ; CHECK: rtsd 77 ; CHECK: {{.* r3, r7, r0}} 78 } 79 80 define i32 @params4_32bitret(i32 %a, i32 %b, i32 %c, i32 %d) { 81 ; CHECK: params4_32bitret: 82 ret i32 %d 83 ; CHECK-NOT: {{.* r3, .*, .*}} 84 ; CHECK-NOT: {{.* r4, .*, .*}} 85 ; CHECK: rtsd 86 ; CHECK: {{.* r3, r8, r0}} 87 } 88 89 define i32 @params5_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 90 ; CHECK: params5_32bitret: 91 ret i32 %e 92 ; CHECK-NOT: {{.* r3, .*, .*}} 93 ; CHECK-NOT: {{.* r4, .*, .*}} 94 ; CHECK: rtsd 95 ; CHECK: {{.* r3, r9, r0}} 96 } 97 98 define i32 @params6_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f) { 99 ; CHECK: params6_32bitret: 100 ret i32 %f 101 ; CHECK-NOT: {{.* r3, .*, .*}} 102 ; CHECK-NOT: {{.* r4, .*, .*}} 103 ; CHECK: rtsd 104 ; CHECK: {{.* r3, r10, r0}} 105 } 106 107 define i32 @params7_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, 108 i32 %g) { 109 ; CHECK: params7_32bitret: 110 ret i32 %g 111 ; CHECK: {{lwi? r3, r1, 32}} 112 ; CHECK-NOT: {{.* r4, .*, .*}} 113 ; CHECK: rtsd 114 } 115 116 define i32 @params8_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, 117 i32 %g, i32 %h) { 118 ; CHECK: params8_32bitret: 119 ret i32 %h 120 ; CHECK: {{lwi? r3, r1, 36}} 121 ; CHECK-NOT: {{.* r4, .*, .*}} 122 ; CHECK: rtsd 123 } 124 125 define i32 @params9_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, 126 i32 %g, i32 %h, i32 %i) { 127 ; CHECK: params9_32bitret: 128 ret i32 %i 129 ; CHECK: {{lwi? r3, r1, 40}} 130 ; CHECK-NOT: {{.* r4, .*, .*}} 131 ; CHECK: rtsd 132 } 133 134 define i32 @params10_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, 135 i32 %g, i32 %h, i32 %i, i32 %j) { 136 ; CHECK: params10_32bitret: 137 ret i32 %j 138 ; CHECK: {{lwi? r3, r1, 44}} 139 ; CHECK-NOT: {{.* r4, .*, .*}} 140 ; CHECK: rtsd 141 } 142 143 define void @testing() { 144 %MSG.1 = getelementptr [13 x i8]* @MSG, i32 0, i32 0 145 146 call void @params0_noret() 147 ; CHECK: brlid 148 149 %tmp.1 = call i8 @params0_8bitret() 150 ; CHECK: brlid 151 call i32 (i8*,...)* @printf(i8* %MSG.1, i8 %tmp.1) 152 153 %tmp.2 = call i16 @params0_16bitret() 154 ; CHECK: brlid 155 call i32 (i8*,...)* @printf(i8* %MSG.1, i16 %tmp.2) 156 157 %tmp.3 = call i32 @params0_32bitret() 158 ; CHECK: brlid 159 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.3) 160 161 %tmp.4 = call i64 @params0_64bitret() 162 ; CHECK: brlid 163 call i32 (i8*,...)* @printf(i8* %MSG.1, i64 %tmp.4) 164 165 %tmp.5 = call i32 @params1_32bitret(i32 1) 166 ; CHECK: {{.* r5, .*, .*}} 167 ; CHECK: brlid 168 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.5) 169 170 %tmp.6 = call i32 @params2_32bitret(i32 1, i32 2) 171 ; CHECK: {{.* r5, .*, .*}} 172 ; CHECK: {{.* r6, .*, .*}} 173 ; CHECK: brlid 174 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.6) 175 176 %tmp.7 = call i32 @params3_32bitret(i32 1, i32 2, i32 3) 177 ; CHECK: {{.* r5, .*, .*}} 178 ; CHECK: {{.* r6, .*, .*}} 179 ; CHECK: {{.* r7, .*, .*}} 180 ; CHECK: brlid 181 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.7) 182 183 %tmp.8 = call i32 @params4_32bitret(i32 1, i32 2, i32 3, i32 4) 184 ; CHECK: {{.* r5, .*, .*}} 185 ; CHECK: {{.* r6, .*, .*}} 186 ; CHECK: {{.* r7, .*, .*}} 187 ; CHECK: {{.* r8, .*, .*}} 188 ; CHECK: brlid 189 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.8) 190 191 %tmp.9 = call i32 @params5_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5) 192 ; CHECK: {{.* r5, .*, .*}} 193 ; CHECK: {{.* r6, .*, .*}} 194 ; CHECK: {{.* r7, .*, .*}} 195 ; CHECK: {{.* r8, .*, .*}} 196 ; CHECK: {{.* r9, .*, .*}} 197 ; CHECK: brlid 198 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.9) 199 200 %tmp.10 = call i32 @params6_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5, 201 i32 6) 202 ; CHECK: {{.* r5, .*, .*}} 203 ; CHECK: {{.* r6, .*, .*}} 204 ; CHECK: {{.* r7, .*, .*}} 205 ; CHECK: {{.* r8, .*, .*}} 206 ; CHECK: {{.* r9, .*, .*}} 207 ; CHECK: {{.* r10, .*, .*}} 208 ; CHECK: brlid 209 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.10) 210 211 %tmp.11 = call i32 @params7_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5, 212 i32 6, i32 7) 213 ; CHECK: {{swi? .*, r1, 28}} 214 ; CHECK: {{.* r5, .*, .*}} 215 ; CHECK: {{.* r6, .*, .*}} 216 ; CHECK: {{.* r7, .*, .*}} 217 ; CHECK: {{.* r8, .*, .*}} 218 ; CHECK: {{.* r9, .*, .*}} 219 ; CHECK: {{.* r10, .*, .*}} 220 ; CHECK: brlid 221 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.11) 222 223 %tmp.12 = call i32 @params8_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5, 224 i32 6, i32 7, i32 8) 225 ; CHECK: {{swi? .*, r1, 28}} 226 ; CHECK: {{swi? .*, r1, 32}} 227 ; CHECK: {{.* r5, .*, .*}} 228 ; CHECK: {{.* r6, .*, .*}} 229 ; CHECK: {{.* r7, .*, .*}} 230 ; CHECK: {{.* r8, .*, .*}} 231 ; CHECK: {{.* r9, .*, .*}} 232 ; CHECK: {{.* r10, .*, .*}} 233 ; CHECK: brlid 234 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.12) 235 236 %tmp.13 = call i32 @params9_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5, 237 i32 6, i32 7, i32 8, i32 9) 238 ; CHECK: {{swi? .*, r1, 28}} 239 ; CHECK: {{swi? .*, r1, 32}} 240 ; CHECK: {{swi? .*, r1, 36}} 241 ; CHECK: {{.* r5, .*, .*}} 242 ; CHECK: {{.* r6, .*, .*}} 243 ; CHECK: {{.* r7, .*, .*}} 244 ; CHECK: {{.* r8, .*, .*}} 245 ; CHECK: {{.* r9, .*, .*}} 246 ; CHECK: {{.* r10, .*, .*}} 247 ; CHECK: brlid 248 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.13) 249 250 %tmp.14 = call i32 @params10_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5, 251 i32 6, i32 7, i32 8, i32 9, i32 10) 252 ; CHECK: {{swi? .*, r1, 28}} 253 ; CHECK: {{swi? .*, r1, 32}} 254 ; CHECK: {{swi? .*, r1, 36}} 255 ; CHECK: {{swi? .*, r1, 40}} 256 ; CHECK: {{.* r5, .*, .*}} 257 ; CHECK: {{.* r6, .*, .*}} 258 ; CHECK: {{.* r7, .*, .*}} 259 ; CHECK: {{.* r8, .*, .*}} 260 ; CHECK: {{.* r9, .*, .*}} 261 ; CHECK: {{.* r10, .*, .*}} 262 ; CHECK: brlid 263 call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.14) 264 265 ret void 266 } 267