1; Test spilling of vector registers. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4 5; We need to allocate a 16-byte spill slot and save the 8 call-saved FPRs. 6; The frame size should be exactly 160 + 16 + 8 * 8 = 240. 7define void @f1(ptr %ptr) { 8; CHECK-LABEL: f1: 9; CHECK: aghi %r15, -240 10; CHECK-DAG: std %f8, 11; CHECK-DAG: std %f9, 12; CHECK-DAG: std %f10, 13; CHECK-DAG: std %f11, 14; CHECK-DAG: std %f12, 15; CHECK-DAG: std %f13, 16; CHECK-DAG: std %f14, 17; CHECK-DAG: std %f15, 18; CHECK: vst {{%v[0-9]+}}, 160(%r15), 3 19; CHECK: vl {{%v[0-9]+}}, 160(%r15), 3 20; CHECK-DAG: ld %f8, 21; CHECK-DAG: ld %f9, 22; CHECK-DAG: ld %f10, 23; CHECK-DAG: ld %f11, 24; CHECK-DAG: ld %f12, 25; CHECK-DAG: ld %f13, 26; CHECK-DAG: ld %f14, 27; CHECK-DAG: ld %f15, 28; CHECK: aghi %r15, 240 29; CHECK: br %r14 30 %v0 = load volatile <16 x i8>, ptr %ptr 31 %v1 = load volatile <16 x i8>, ptr %ptr 32 %v2 = load volatile <16 x i8>, ptr %ptr 33 %v3 = load volatile <16 x i8>, ptr %ptr 34 %v4 = load volatile <16 x i8>, ptr %ptr 35 %v5 = load volatile <16 x i8>, ptr %ptr 36 %v6 = load volatile <16 x i8>, ptr %ptr 37 %v7 = load volatile <16 x i8>, ptr %ptr 38 %v8 = load volatile <16 x i8>, ptr %ptr 39 %v9 = load volatile <16 x i8>, ptr %ptr 40 %v10 = load volatile <16 x i8>, ptr %ptr 41 %v11 = load volatile <16 x i8>, ptr %ptr 42 %v12 = load volatile <16 x i8>, ptr %ptr 43 %v13 = load volatile <16 x i8>, ptr %ptr 44 %v14 = load volatile <16 x i8>, ptr %ptr 45 %v15 = load volatile <16 x i8>, ptr %ptr 46 %v16 = load volatile <16 x i8>, ptr %ptr 47 %v17 = load volatile <16 x i8>, ptr %ptr 48 %v18 = load volatile <16 x i8>, ptr %ptr 49 %v19 = load volatile <16 x i8>, ptr %ptr 50 %v20 = load volatile <16 x i8>, ptr %ptr 51 %v21 = load volatile <16 x i8>, ptr %ptr 52 %v22 = load volatile <16 x i8>, ptr %ptr 53 %v23 = load volatile <16 x i8>, ptr %ptr 54 %v24 = load volatile <16 x i8>, ptr %ptr 55 %v25 = load volatile <16 x i8>, ptr %ptr 56 %v26 = load volatile <16 x i8>, ptr %ptr 57 %v27 = load volatile <16 x i8>, ptr %ptr 58 %v28 = load volatile <16 x i8>, ptr %ptr 59 %v29 = load volatile <16 x i8>, ptr %ptr 60 %v30 = load volatile <16 x i8>, ptr %ptr 61 %v31 = load volatile <16 x i8>, ptr %ptr 62 %vx = load volatile <16 x i8>, ptr %ptr 63 store volatile <16 x i8> %vx, ptr %ptr 64 store volatile <16 x i8> %v31, ptr %ptr 65 store volatile <16 x i8> %v30, ptr %ptr 66 store volatile <16 x i8> %v29, ptr %ptr 67 store volatile <16 x i8> %v28, ptr %ptr 68 store volatile <16 x i8> %v27, ptr %ptr 69 store volatile <16 x i8> %v26, ptr %ptr 70 store volatile <16 x i8> %v25, ptr %ptr 71 store volatile <16 x i8> %v24, ptr %ptr 72 store volatile <16 x i8> %v23, ptr %ptr 73 store volatile <16 x i8> %v22, ptr %ptr 74 store volatile <16 x i8> %v21, ptr %ptr 75 store volatile <16 x i8> %v20, ptr %ptr 76 store volatile <16 x i8> %v19, ptr %ptr 77 store volatile <16 x i8> %v18, ptr %ptr 78 store volatile <16 x i8> %v17, ptr %ptr 79 store volatile <16 x i8> %v16, ptr %ptr 80 store volatile <16 x i8> %v15, ptr %ptr 81 store volatile <16 x i8> %v14, ptr %ptr 82 store volatile <16 x i8> %v13, ptr %ptr 83 store volatile <16 x i8> %v12, ptr %ptr 84 store volatile <16 x i8> %v11, ptr %ptr 85 store volatile <16 x i8> %v10, ptr %ptr 86 store volatile <16 x i8> %v9, ptr %ptr 87 store volatile <16 x i8> %v8, ptr %ptr 88 store volatile <16 x i8> %v7, ptr %ptr 89 store volatile <16 x i8> %v6, ptr %ptr 90 store volatile <16 x i8> %v5, ptr %ptr 91 store volatile <16 x i8> %v4, ptr %ptr 92 store volatile <16 x i8> %v3, ptr %ptr 93 store volatile <16 x i8> %v2, ptr %ptr 94 store volatile <16 x i8> %v1, ptr %ptr 95 store volatile <16 x i8> %v0, ptr %ptr 96 ret void 97} 98 99; Like f1, but no 16-byte slot should be needed, and no outgoing reg save 100; area of 160 bytes. 101define void @f2(ptr %ptr) { 102; CHECK-LABEL: f2: 103; CHECK: aghi %r15, -64 104; CHECK-DAG: std %f8, 105; CHECK-DAG: std %f9, 106; CHECK-DAG: std %f10, 107; CHECK-DAG: std %f11, 108; CHECK-DAG: std %f12, 109; CHECK-DAG: std %f13, 110; CHECK-DAG: std %f14, 111; CHECK-DAG: std %f15, 112; CHECK-NOT: vst {{.*}}(%r15) 113; CHECK-NOT: vl {{.*}}(%r15) 114; CHECK-DAG: ld %f8, 115; CHECK-DAG: ld %f9, 116; CHECK-DAG: ld %f10, 117; CHECK-DAG: ld %f11, 118; CHECK-DAG: ld %f12, 119; CHECK-DAG: ld %f13, 120; CHECK-DAG: ld %f14, 121; CHECK-DAG: ld %f15, 122; CHECK: aghi %r15, 64 123; CHECK: br %r14 124 %v0 = load volatile <16 x i8>, ptr %ptr 125 %v1 = load volatile <16 x i8>, ptr %ptr 126 %v2 = load volatile <16 x i8>, ptr %ptr 127 %v3 = load volatile <16 x i8>, ptr %ptr 128 %v4 = load volatile <16 x i8>, ptr %ptr 129 %v5 = load volatile <16 x i8>, ptr %ptr 130 %v6 = load volatile <16 x i8>, ptr %ptr 131 %v7 = load volatile <16 x i8>, ptr %ptr 132 %v8 = load volatile <16 x i8>, ptr %ptr 133 %v9 = load volatile <16 x i8>, ptr %ptr 134 %v10 = load volatile <16 x i8>, ptr %ptr 135 %v11 = load volatile <16 x i8>, ptr %ptr 136 %v12 = load volatile <16 x i8>, ptr %ptr 137 %v13 = load volatile <16 x i8>, ptr %ptr 138 %v14 = load volatile <16 x i8>, ptr %ptr 139 %v15 = load volatile <16 x i8>, ptr %ptr 140 %v16 = load volatile <16 x i8>, ptr %ptr 141 %v17 = load volatile <16 x i8>, ptr %ptr 142 %v18 = load volatile <16 x i8>, ptr %ptr 143 %v19 = load volatile <16 x i8>, ptr %ptr 144 %v20 = load volatile <16 x i8>, ptr %ptr 145 %v21 = load volatile <16 x i8>, ptr %ptr 146 %v22 = load volatile <16 x i8>, ptr %ptr 147 %v23 = load volatile <16 x i8>, ptr %ptr 148 %v24 = load volatile <16 x i8>, ptr %ptr 149 %v25 = load volatile <16 x i8>, ptr %ptr 150 %v26 = load volatile <16 x i8>, ptr %ptr 151 %v27 = load volatile <16 x i8>, ptr %ptr 152 %v28 = load volatile <16 x i8>, ptr %ptr 153 %v29 = load volatile <16 x i8>, ptr %ptr 154 %v30 = load volatile <16 x i8>, ptr %ptr 155 %v31 = load volatile <16 x i8>, ptr %ptr 156 store volatile <16 x i8> %v31, ptr %ptr 157 store volatile <16 x i8> %v30, ptr %ptr 158 store volatile <16 x i8> %v29, ptr %ptr 159 store volatile <16 x i8> %v28, ptr %ptr 160 store volatile <16 x i8> %v27, ptr %ptr 161 store volatile <16 x i8> %v26, ptr %ptr 162 store volatile <16 x i8> %v25, ptr %ptr 163 store volatile <16 x i8> %v24, ptr %ptr 164 store volatile <16 x i8> %v23, ptr %ptr 165 store volatile <16 x i8> %v22, ptr %ptr 166 store volatile <16 x i8> %v21, ptr %ptr 167 store volatile <16 x i8> %v20, ptr %ptr 168 store volatile <16 x i8> %v19, ptr %ptr 169 store volatile <16 x i8> %v18, ptr %ptr 170 store volatile <16 x i8> %v17, ptr %ptr 171 store volatile <16 x i8> %v16, ptr %ptr 172 store volatile <16 x i8> %v15, ptr %ptr 173 store volatile <16 x i8> %v14, ptr %ptr 174 store volatile <16 x i8> %v13, ptr %ptr 175 store volatile <16 x i8> %v12, ptr %ptr 176 store volatile <16 x i8> %v11, ptr %ptr 177 store volatile <16 x i8> %v10, ptr %ptr 178 store volatile <16 x i8> %v9, ptr %ptr 179 store volatile <16 x i8> %v8, ptr %ptr 180 store volatile <16 x i8> %v7, ptr %ptr 181 store volatile <16 x i8> %v6, ptr %ptr 182 store volatile <16 x i8> %v5, ptr %ptr 183 store volatile <16 x i8> %v4, ptr %ptr 184 store volatile <16 x i8> %v3, ptr %ptr 185 store volatile <16 x i8> %v2, ptr %ptr 186 store volatile <16 x i8> %v1, ptr %ptr 187 store volatile <16 x i8> %v0, ptr %ptr 188 ret void 189} 190 191; Like f2, but only %f8 should be saved. 192define void @f3(ptr %ptr) { 193; CHECK-LABEL: f3: 194; CHECK: aghi %r15, -8 195; CHECK-DAG: std %f8, 196; CHECK-NOT: vst {{.*}}(%r15) 197; CHECK-NOT: vl {{.*}}(%r15) 198; CHECK-NOT: %v9 199; CHECK-NOT: %v10 200; CHECK-NOT: %v11 201; CHECK-NOT: %v12 202; CHECK-NOT: %v13 203; CHECK-NOT: %v14 204; CHECK-NOT: %v15 205; CHECK-DAG: ld %f8, 206; CHECK: aghi %r15, 8 207; CHECK: br %r14 208 %v0 = load volatile <16 x i8>, ptr %ptr 209 %v1 = load volatile <16 x i8>, ptr %ptr 210 %v2 = load volatile <16 x i8>, ptr %ptr 211 %v3 = load volatile <16 x i8>, ptr %ptr 212 %v4 = load volatile <16 x i8>, ptr %ptr 213 %v5 = load volatile <16 x i8>, ptr %ptr 214 %v6 = load volatile <16 x i8>, ptr %ptr 215 %v7 = load volatile <16 x i8>, ptr %ptr 216 %v8 = load volatile <16 x i8>, ptr %ptr 217 %v16 = load volatile <16 x i8>, ptr %ptr 218 %v17 = load volatile <16 x i8>, ptr %ptr 219 %v18 = load volatile <16 x i8>, ptr %ptr 220 %v19 = load volatile <16 x i8>, ptr %ptr 221 %v20 = load volatile <16 x i8>, ptr %ptr 222 %v21 = load volatile <16 x i8>, ptr %ptr 223 %v22 = load volatile <16 x i8>, ptr %ptr 224 %v23 = load volatile <16 x i8>, ptr %ptr 225 %v24 = load volatile <16 x i8>, ptr %ptr 226 %v25 = load volatile <16 x i8>, ptr %ptr 227 %v26 = load volatile <16 x i8>, ptr %ptr 228 %v27 = load volatile <16 x i8>, ptr %ptr 229 %v28 = load volatile <16 x i8>, ptr %ptr 230 %v29 = load volatile <16 x i8>, ptr %ptr 231 %v30 = load volatile <16 x i8>, ptr %ptr 232 %v31 = load volatile <16 x i8>, ptr %ptr 233 store volatile <16 x i8> %v31, ptr %ptr 234 store volatile <16 x i8> %v30, ptr %ptr 235 store volatile <16 x i8> %v29, ptr %ptr 236 store volatile <16 x i8> %v28, ptr %ptr 237 store volatile <16 x i8> %v27, ptr %ptr 238 store volatile <16 x i8> %v26, ptr %ptr 239 store volatile <16 x i8> %v25, ptr %ptr 240 store volatile <16 x i8> %v24, ptr %ptr 241 store volatile <16 x i8> %v23, ptr %ptr 242 store volatile <16 x i8> %v22, ptr %ptr 243 store volatile <16 x i8> %v21, ptr %ptr 244 store volatile <16 x i8> %v20, ptr %ptr 245 store volatile <16 x i8> %v19, ptr %ptr 246 store volatile <16 x i8> %v18, ptr %ptr 247 store volatile <16 x i8> %v17, ptr %ptr 248 store volatile <16 x i8> %v16, ptr %ptr 249 store volatile <16 x i8> %v8, ptr %ptr 250 store volatile <16 x i8> %v7, ptr %ptr 251 store volatile <16 x i8> %v6, ptr %ptr 252 store volatile <16 x i8> %v5, ptr %ptr 253 store volatile <16 x i8> %v4, ptr %ptr 254 store volatile <16 x i8> %v3, ptr %ptr 255 store volatile <16 x i8> %v2, ptr %ptr 256 store volatile <16 x i8> %v1, ptr %ptr 257 store volatile <16 x i8> %v0, ptr %ptr 258 ret void 259} 260 261; Like f2, but no registers should be saved. 262define void @f4(ptr %ptr) { 263; CHECK-LABEL: f4: 264; CHECK-NOT: %r15 265; CHECK: br %r14 266 %v0 = load volatile <16 x i8>, ptr %ptr 267 %v1 = load volatile <16 x i8>, ptr %ptr 268 %v2 = load volatile <16 x i8>, ptr %ptr 269 %v3 = load volatile <16 x i8>, ptr %ptr 270 %v4 = load volatile <16 x i8>, ptr %ptr 271 %v5 = load volatile <16 x i8>, ptr %ptr 272 %v6 = load volatile <16 x i8>, ptr %ptr 273 %v7 = load volatile <16 x i8>, ptr %ptr 274 %v16 = load volatile <16 x i8>, ptr %ptr 275 %v17 = load volatile <16 x i8>, ptr %ptr 276 %v18 = load volatile <16 x i8>, ptr %ptr 277 %v19 = load volatile <16 x i8>, ptr %ptr 278 %v20 = load volatile <16 x i8>, ptr %ptr 279 %v21 = load volatile <16 x i8>, ptr %ptr 280 %v22 = load volatile <16 x i8>, ptr %ptr 281 %v23 = load volatile <16 x i8>, ptr %ptr 282 %v24 = load volatile <16 x i8>, ptr %ptr 283 %v25 = load volatile <16 x i8>, ptr %ptr 284 %v26 = load volatile <16 x i8>, ptr %ptr 285 %v27 = load volatile <16 x i8>, ptr %ptr 286 %v28 = load volatile <16 x i8>, ptr %ptr 287 %v29 = load volatile <16 x i8>, ptr %ptr 288 %v30 = load volatile <16 x i8>, ptr %ptr 289 %v31 = load volatile <16 x i8>, ptr %ptr 290 store volatile <16 x i8> %v31, ptr %ptr 291 store volatile <16 x i8> %v30, ptr %ptr 292 store volatile <16 x i8> %v29, ptr %ptr 293 store volatile <16 x i8> %v28, ptr %ptr 294 store volatile <16 x i8> %v27, ptr %ptr 295 store volatile <16 x i8> %v26, ptr %ptr 296 store volatile <16 x i8> %v25, ptr %ptr 297 store volatile <16 x i8> %v24, ptr %ptr 298 store volatile <16 x i8> %v23, ptr %ptr 299 store volatile <16 x i8> %v22, ptr %ptr 300 store volatile <16 x i8> %v21, ptr %ptr 301 store volatile <16 x i8> %v20, ptr %ptr 302 store volatile <16 x i8> %v19, ptr %ptr 303 store volatile <16 x i8> %v18, ptr %ptr 304 store volatile <16 x i8> %v17, ptr %ptr 305 store volatile <16 x i8> %v16, ptr %ptr 306 store volatile <16 x i8> %v7, ptr %ptr 307 store volatile <16 x i8> %v6, ptr %ptr 308 store volatile <16 x i8> %v5, ptr %ptr 309 store volatile <16 x i8> %v4, ptr %ptr 310 store volatile <16 x i8> %v3, ptr %ptr 311 store volatile <16 x i8> %v2, ptr %ptr 312 store volatile <16 x i8> %v1, ptr %ptr 313 store volatile <16 x i8> %v0, ptr %ptr 314 ret void 315} 316