1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=ve | FileCheck %s 3 4;;; Check stack frame allocation especially about the new SP calculation 5;;; using multiple sizes as a test of emitSPAdjustment(). 6 7; Function Attrs: norecurse nounwind readnone 8define signext i32 @test_frame0(i32 signext %0) { 9; CHECK-LABEL: test_frame0: 10; CHECK: # %bb.0: 11; CHECK-NEXT: adds.w.sx %s0, 3, %s0 12; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 13; CHECK-NEXT: b.l.t (, %s10) 14 %2 = add nsw i32 %0, 3 15 ret i32 %2 16} 17 18; Function Attrs: nounwind 19define ptr @test_frame8(ptr %0) { 20; CHECK-LABEL: test_frame8: 21; CHECK: # %bb.0: 22; CHECK-NEXT: adds.l %s11, -16, %s11 23; CHECK-NEXT: brge.l.t %s11, %s8, .LBB1_2 24; CHECK-NEXT: # %bb.1: 25; CHECK-NEXT: ld %s61, 24(, %s14) 26; CHECK-NEXT: or %s62, 0, %s0 27; CHECK-NEXT: lea %s63, 315 28; CHECK-NEXT: shm.l %s63, (%s61) 29; CHECK-NEXT: shm.l %s8, 8(%s61) 30; CHECK-NEXT: shm.l %s11, 16(%s61) 31; CHECK-NEXT: monc 32; CHECK-NEXT: or %s0, 0, %s62 33; CHECK-NEXT: .LBB1_2: 34; CHECK-NEXT: ld1b.zx %s1, (, %s0) 35; CHECK-NEXT: lea %s0, 8(, %s11) 36; CHECK-NEXT: st1b %s1, 8(, %s11) 37; CHECK-NEXT: adds.l %s11, 16, %s11 38; CHECK-NEXT: b.l.t (, %s10) 39 %2 = alloca [8 x i8], align 1 40 %3 = load i8, ptr %0, align 1 41 store i8 %3, ptr %2, align 1 42 ret ptr %2 43} 44 45; Function Attrs: nounwind 46define ptr @test_frame16(ptr %0) { 47; CHECK-LABEL: test_frame16: 48; CHECK: # %bb.0: 49; CHECK-NEXT: adds.l %s11, -16, %s11 50; CHECK-NEXT: brge.l.t %s11, %s8, .LBB2_2 51; CHECK-NEXT: # %bb.1: 52; CHECK-NEXT: ld %s61, 24(, %s14) 53; CHECK-NEXT: or %s62, 0, %s0 54; CHECK-NEXT: lea %s63, 315 55; CHECK-NEXT: shm.l %s63, (%s61) 56; CHECK-NEXT: shm.l %s8, 8(%s61) 57; CHECK-NEXT: shm.l %s11, 16(%s61) 58; CHECK-NEXT: monc 59; CHECK-NEXT: or %s0, 0, %s62 60; CHECK-NEXT: .LBB2_2: 61; CHECK-NEXT: ld1b.zx %s1, (, %s0) 62; CHECK-NEXT: lea %s0, (, %s11) 63; CHECK-NEXT: st1b %s1, (, %s11) 64; CHECK-NEXT: adds.l %s11, 16, %s11 65; CHECK-NEXT: b.l.t (, %s10) 66 %2 = alloca [16 x i8], align 1 67 %3 = load i8, ptr %0, align 1 68 store i8 %3, ptr %2, align 1 69 ret ptr %2 70} 71 72; Function Attrs: nounwind 73define ptr @test_frame32(ptr %0) { 74; CHECK-LABEL: test_frame32: 75; CHECK: # %bb.0: 76; CHECK-NEXT: adds.l %s11, -32, %s11 77; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2 78; CHECK-NEXT: # %bb.1: 79; CHECK-NEXT: ld %s61, 24(, %s14) 80; CHECK-NEXT: or %s62, 0, %s0 81; CHECK-NEXT: lea %s63, 315 82; CHECK-NEXT: shm.l %s63, (%s61) 83; CHECK-NEXT: shm.l %s8, 8(%s61) 84; CHECK-NEXT: shm.l %s11, 16(%s61) 85; CHECK-NEXT: monc 86; CHECK-NEXT: or %s0, 0, %s62 87; CHECK-NEXT: .LBB3_2: 88; CHECK-NEXT: ld1b.zx %s1, (, %s0) 89; CHECK-NEXT: lea %s0, (, %s11) 90; CHECK-NEXT: st1b %s1, (, %s11) 91; CHECK-NEXT: adds.l %s11, 32, %s11 92; CHECK-NEXT: b.l.t (, %s10) 93 %2 = alloca [32 x i8], align 1 94 %3 = load i8, ptr %0, align 1 95 store i8 %3, ptr %2, align 1 96 ret ptr %2 97} 98 99; Function Attrs: nounwind 100define ptr @test_frame64(ptr %0) { 101; CHECK-LABEL: test_frame64: 102; CHECK: # %bb.0: 103; CHECK-NEXT: adds.l %s11, -64, %s11 104; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2 105; CHECK-NEXT: # %bb.1: 106; CHECK-NEXT: ld %s61, 24(, %s14) 107; CHECK-NEXT: or %s62, 0, %s0 108; CHECK-NEXT: lea %s63, 315 109; CHECK-NEXT: shm.l %s63, (%s61) 110; CHECK-NEXT: shm.l %s8, 8(%s61) 111; CHECK-NEXT: shm.l %s11, 16(%s61) 112; CHECK-NEXT: monc 113; CHECK-NEXT: or %s0, 0, %s62 114; CHECK-NEXT: .LBB4_2: 115; CHECK-NEXT: ld1b.zx %s1, (, %s0) 116; CHECK-NEXT: lea %s0, (, %s11) 117; CHECK-NEXT: st1b %s1, (, %s11) 118; CHECK-NEXT: lea %s11, 64(, %s11) 119; CHECK-NEXT: b.l.t (, %s10) 120 %2 = alloca [64 x i8], align 1 121 %3 = load i8, ptr %0, align 1 122 store i8 %3, ptr %2, align 1 123 ret ptr %2 124} 125 126; Function Attrs: nounwind 127define ptr @test_frame128(ptr %0) { 128; CHECK-LABEL: test_frame128: 129; CHECK: # %bb.0: 130; CHECK-NEXT: lea %s11, -128(, %s11) 131; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2 132; CHECK-NEXT: # %bb.1: 133; CHECK-NEXT: ld %s61, 24(, %s14) 134; CHECK-NEXT: or %s62, 0, %s0 135; CHECK-NEXT: lea %s63, 315 136; CHECK-NEXT: shm.l %s63, (%s61) 137; CHECK-NEXT: shm.l %s8, 8(%s61) 138; CHECK-NEXT: shm.l %s11, 16(%s61) 139; CHECK-NEXT: monc 140; CHECK-NEXT: or %s0, 0, %s62 141; CHECK-NEXT: .LBB5_2: 142; CHECK-NEXT: ld1b.zx %s1, (, %s0) 143; CHECK-NEXT: lea %s0, (, %s11) 144; CHECK-NEXT: st1b %s1, (, %s11) 145; CHECK-NEXT: lea %s11, 128(, %s11) 146; CHECK-NEXT: b.l.t (, %s10) 147 %2 = alloca [128 x i8], align 1 148 %3 = load i8, ptr %0, align 1 149 store i8 %3, ptr %2, align 1 150 ret ptr %2 151} 152 153; Function Attrs: nounwind 154define ptr @test_frame65536(ptr %0) { 155; CHECK-LABEL: test_frame65536: 156; CHECK: # %bb.0: 157; CHECK-NEXT: lea %s11, -65536(, %s11) 158; CHECK-NEXT: brge.l.t %s11, %s8, .LBB6_2 159; CHECK-NEXT: # %bb.1: 160; CHECK-NEXT: ld %s61, 24(, %s14) 161; CHECK-NEXT: or %s62, 0, %s0 162; CHECK-NEXT: lea %s63, 315 163; CHECK-NEXT: shm.l %s63, (%s61) 164; CHECK-NEXT: shm.l %s8, 8(%s61) 165; CHECK-NEXT: shm.l %s11, 16(%s61) 166; CHECK-NEXT: monc 167; CHECK-NEXT: or %s0, 0, %s62 168; CHECK-NEXT: .LBB6_2: 169; CHECK-NEXT: ld1b.zx %s1, (, %s0) 170; CHECK-NEXT: lea %s0, (, %s11) 171; CHECK-NEXT: st1b %s1, (, %s11) 172; CHECK-NEXT: lea %s11, 65536(, %s11) 173; CHECK-NEXT: b.l.t (, %s10) 174 %2 = alloca [65536 x i8], align 1 175 %3 = load i8, ptr %0, align 1 176 store i8 %3, ptr %2, align 1 177 ret ptr %2 178} 179 180; Function Attrs: nounwind 181define ptr @test_frame4294967296(ptr %0) { 182; CHECK-LABEL: test_frame4294967296: 183; CHECK: # %bb.0: 184; CHECK-NEXT: lea %s13, 0 185; CHECK-NEXT: and %s13, %s13, (32)0 186; CHECK-NEXT: lea.sl %s11, -1(%s13, %s11) 187; CHECK-NEXT: brge.l.t %s11, %s8, .LBB7_2 188; CHECK-NEXT: # %bb.1: 189; CHECK-NEXT: ld %s61, 24(, %s14) 190; CHECK-NEXT: or %s62, 0, %s0 191; CHECK-NEXT: lea %s63, 315 192; CHECK-NEXT: shm.l %s63, (%s61) 193; CHECK-NEXT: shm.l %s8, 8(%s61) 194; CHECK-NEXT: shm.l %s11, 16(%s61) 195; CHECK-NEXT: monc 196; CHECK-NEXT: or %s0, 0, %s62 197; CHECK-NEXT: .LBB7_2: 198; CHECK-NEXT: ld1b.zx %s1, (, %s0) 199; CHECK-NEXT: lea %s0, (, %s11) 200; CHECK-NEXT: st1b %s1, (, %s11) 201; CHECK-NEXT: lea %s13, 0 202; CHECK-NEXT: and %s13, %s13, (32)0 203; CHECK-NEXT: lea.sl %s11, 1(%s13, %s11) 204; CHECK-NEXT: b.l.t (, %s10) 205 %2 = alloca [4294967296 x i8], align 1 206 %3 = load i8, ptr %0, align 1 207 store i8 %3, ptr %2, align 1 208 ret ptr %2 209} 210