1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s 3 4define arm_aapcs_vfpcc void @vstrw32() { 5; CHECK-LABEL: vstrw32: 6; CHECK: @ %bb.0: @ %entry 7; CHECK-NEXT: .save {r7, lr} 8; CHECK-NEXT: push {r7, lr} 9; CHECK-NEXT: .pad #16 10; CHECK-NEXT: sub sp, #16 11; CHECK-NEXT: vmov.i32 q0, #0x0 12; CHECK-NEXT: mov r0, sp 13; CHECK-NEXT: vstrw.32 q0, [sp, #8] 14; CHECK-NEXT: bl func 15; CHECK-NEXT: add sp, #16 16; CHECK-NEXT: pop {r7, pc} 17entry: 18 %d = alloca [4 x i32], align 2 19 %g = getelementptr inbounds [4 x i32], [4 x i32]* %d, i32 0, i32 2 20 %b = bitcast i32* %g to <4 x i32>* 21 store <4 x i32> zeroinitializer, <4 x i32>* %b, align 2 22 %arraydecay = getelementptr inbounds [4 x i32], [4 x i32]* %d, i32 0, i32 0 23 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i32*)*)(i32* %arraydecay) 24 ret void 25} 26 27define arm_aapcs_vfpcc void @vstrh16() { 28; CHECK-LABEL: vstrh16: 29; CHECK: @ %bb.0: @ %entry 30; CHECK-NEXT: .save {r7, lr} 31; CHECK-NEXT: push {r7, lr} 32; CHECK-NEXT: .pad #16 33; CHECK-NEXT: sub sp, #16 34; CHECK-NEXT: vmov.i32 q0, #0x0 35; CHECK-NEXT: mov r0, sp 36; CHECK-NEXT: vstrh.16 q0, [sp, #4] 37; CHECK-NEXT: bl func 38; CHECK-NEXT: add sp, #16 39; CHECK-NEXT: pop {r7, pc} 40entry: 41 %d = alloca [8 x i16], align 2 42 %g = getelementptr inbounds [8 x i16], [8 x i16]* %d, i32 0, i32 2 43 %b = bitcast i16* %g to <8 x i16>* 44 store <8 x i16> zeroinitializer, <8 x i16>* %b, align 2 45 %arraydecay = getelementptr inbounds [8 x i16], [8 x i16]* %d, i32 0, i32 0 46 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i16*)*)(i16* %arraydecay) 47 ret void 48} 49 50define arm_aapcs_vfpcc void @vstrb8() { 51; CHECK-LABEL: vstrb8: 52; CHECK: @ %bb.0: @ %entry 53; CHECK-NEXT: .save {r7, lr} 54; CHECK-NEXT: push {r7, lr} 55; CHECK-NEXT: .pad #16 56; CHECK-NEXT: sub sp, #16 57; CHECK-NEXT: vmov.i32 q0, #0x0 58; CHECK-NEXT: mov r0, sp 59; CHECK-NEXT: vstrh.16 q0, [sp, #2] 60; CHECK-NEXT: bl func 61; CHECK-NEXT: add sp, #16 62; CHECK-NEXT: pop {r7, pc} 63entry: 64 %d = alloca [16 x i8], align 2 65 %g = getelementptr inbounds [16 x i8], [16 x i8]* %d, i32 0, i32 2 66 %b = bitcast i8* %g to <16 x i8>* 67 store <16 x i8> zeroinitializer, <16 x i8>* %b, align 2 68 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %d, i32 0, i32 0 69 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 70 ret void 71} 72 73define arm_aapcs_vfpcc void @vstrh32() { 74; CHECK-LABEL: vstrh32: 75; CHECK: @ %bb.0: @ %entry 76; CHECK-NEXT: .save {r7, lr} 77; CHECK-NEXT: push {r7, lr} 78; CHECK-NEXT: .pad #8 79; CHECK-NEXT: sub sp, #8 80; CHECK-NEXT: mov r0, sp 81; CHECK-NEXT: vmov.i32 q0, #0x6 82; CHECK-NEXT: vstrh.32 q0, [r0, #4] 83; CHECK-NEXT: bl func 84; CHECK-NEXT: add sp, #8 85; CHECK-NEXT: pop {r7, pc} 86entry: 87 %d = alloca [4 x i16], align 2 88 %g = getelementptr inbounds [4 x i16], [4 x i16]* %d, i32 0, i32 2 89 %b = bitcast i16* %g to <4 x i16>* 90 store <4 x i16> <i16 6, i16 6, i16 6, i16 6>, <4 x i16>* %b, align 2 91 %arraydecay = getelementptr inbounds [4 x i16], [4 x i16]* %d, i32 0, i32 0 92 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i16*)*)(i16* %arraydecay) 93 ret void 94} 95 96define arm_aapcs_vfpcc void @vstrb32() { 97; CHECK-LABEL: vstrb32: 98; CHECK: @ %bb.0: @ %entry 99; CHECK-NEXT: .save {r7, lr} 100; CHECK-NEXT: push {r7, lr} 101; CHECK-NEXT: .pad #8 102; CHECK-NEXT: sub sp, #8 103; CHECK-NEXT: add r0, sp, #4 104; CHECK-NEXT: vmov.i32 q0, #0x6 105; CHECK-NEXT: vstrb.32 q0, [r0, #2] 106; CHECK-NEXT: bl func 107; CHECK-NEXT: add sp, #8 108; CHECK-NEXT: pop {r7, pc} 109entry: 110 %d = alloca [4 x i8], align 2 111 %g = getelementptr inbounds [4 x i8], [4 x i8]* %d, i32 0, i32 2 112 %b = bitcast i8* %g to <4 x i8>* 113 store <4 x i8> <i8 6, i8 6, i8 6, i8 6>, <4 x i8>* %b, align 2 114 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %d, i32 0, i32 0 115 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 116 ret void 117} 118 119define arm_aapcs_vfpcc void @vstrb16() { 120; CHECK-LABEL: vstrb16: 121; CHECK: @ %bb.0: @ %entry 122; CHECK-NEXT: .save {r7, lr} 123; CHECK-NEXT: push {r7, lr} 124; CHECK-NEXT: .pad #8 125; CHECK-NEXT: sub sp, #8 126; CHECK-NEXT: mov r0, sp 127; CHECK-NEXT: vmov.i32 q0, #0x0 128; CHECK-NEXT: vstrb.16 q0, [r0, #2] 129; CHECK-NEXT: bl func 130; CHECK-NEXT: add sp, #8 131; CHECK-NEXT: pop {r7, pc} 132entry: 133 %d = alloca [8 x i8], align 2 134 %g = getelementptr inbounds [8 x i8], [8 x i8]* %d, i32 0, i32 2 135 %b = bitcast i8* %g to <8 x i8>* 136 store <8 x i8> zeroinitializer, <8 x i8>* %b, align 2 137 %arraydecay = getelementptr inbounds [8 x i8], [8 x i8]* %d, i32 0, i32 0 138 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 139 ret void 140} 141 142 143define arm_aapcs_vfpcc <4 x i32> @vldrw32() { 144; CHECK-LABEL: vldrw32: 145; CHECK: @ %bb.0: @ %entry 146; CHECK-NEXT: .save {r7, lr} 147; CHECK-NEXT: push {r7, lr} 148; CHECK-NEXT: .pad #16 149; CHECK-NEXT: sub sp, #16 150; CHECK-NEXT: mov r0, sp 151; CHECK-NEXT: bl func 152; CHECK-NEXT: vldrw.u32 q0, [sp, #8] 153; CHECK-NEXT: add sp, #16 154; CHECK-NEXT: pop {r7, pc} 155entry: 156 %d = alloca [4 x i32], align 2 157 %arraydecay = getelementptr inbounds [4 x i32], [4 x i32]* %d, i32 0, i32 0 158 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i32*)*)(i32* %arraydecay) 159 %g = getelementptr inbounds [4 x i32], [4 x i32]* %d, i32 0, i32 2 160 %b = bitcast i32* %g to <4 x i32>* 161 %l = load <4 x i32>, <4 x i32>* %b, align 2 162 ret <4 x i32> %l 163} 164 165define arm_aapcs_vfpcc <8 x i16> @vldrh16() { 166; CHECK-LABEL: vldrh16: 167; CHECK: @ %bb.0: @ %entry 168; CHECK-NEXT: .save {r7, lr} 169; CHECK-NEXT: push {r7, lr} 170; CHECK-NEXT: .pad #16 171; CHECK-NEXT: sub sp, #16 172; CHECK-NEXT: mov r0, sp 173; CHECK-NEXT: bl func 174; CHECK-NEXT: vldrh.u16 q0, [sp, #4] 175; CHECK-NEXT: add sp, #16 176; CHECK-NEXT: pop {r7, pc} 177entry: 178 %d = alloca [8 x i16], align 2 179 %arraydecay = getelementptr inbounds [8 x i16], [8 x i16]* %d, i32 0, i32 0 180 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i16*)*)(i16* %arraydecay) 181 %g = getelementptr inbounds [8 x i16], [8 x i16]* %d, i32 0, i32 2 182 %b = bitcast i16* %g to <8 x i16>* 183 %l = load <8 x i16>, <8 x i16>* %b, align 2 184 ret <8 x i16> %l 185} 186 187define arm_aapcs_vfpcc <16 x i8> @vldrb8() { 188; CHECK-LABEL: vldrb8: 189; CHECK: @ %bb.0: @ %entry 190; CHECK-NEXT: .save {r7, lr} 191; CHECK-NEXT: push {r7, lr} 192; CHECK-NEXT: .pad #16 193; CHECK-NEXT: sub sp, #16 194; CHECK-NEXT: mov r0, sp 195; CHECK-NEXT: bl func 196; CHECK-NEXT: vldrh.u16 q0, [sp, #2] 197; CHECK-NEXT: add sp, #16 198; CHECK-NEXT: pop {r7, pc} 199entry: 200 %d = alloca [16 x i8], align 2 201 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %d, i32 0, i32 0 202 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 203 %g = getelementptr inbounds [16 x i8], [16 x i8]* %d, i32 0, i32 2 204 %b = bitcast i8* %g to <16 x i8>* 205 %l = load <16 x i8>, <16 x i8>* %b, align 2 206 ret <16 x i8> %l 207} 208 209define arm_aapcs_vfpcc <4 x i16> @vldrh32() { 210; CHECK-LABEL: vldrh32: 211; CHECK: @ %bb.0: @ %entry 212; CHECK-NEXT: .save {r4, lr} 213; CHECK-NEXT: push {r4, lr} 214; CHECK-NEXT: .pad #8 215; CHECK-NEXT: sub sp, #8 216; CHECK-NEXT: mov r4, sp 217; CHECK-NEXT: mov r0, r4 218; CHECK-NEXT: bl func 219; CHECK-NEXT: vldrh.u32 q0, [r4, #4] 220; CHECK-NEXT: add sp, #8 221; CHECK-NEXT: pop {r4, pc} 222entry: 223 %d = alloca [4 x i16], align 2 224 %arraydecay = getelementptr inbounds [4 x i16], [4 x i16]* %d, i32 0, i32 0 225 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i16*)*)(i16* %arraydecay) 226 %g = getelementptr inbounds [4 x i16], [4 x i16]* %d, i32 0, i32 2 227 %b = bitcast i16* %g to <4 x i16>* 228 %l = load <4 x i16>, <4 x i16>* %b, align 2 229 ret <4 x i16> %l 230} 231 232define arm_aapcs_vfpcc <4 x i8> @vldrb32() { 233; CHECK-LABEL: vldrb32: 234; CHECK: @ %bb.0: @ %entry 235; CHECK-NEXT: .save {r4, lr} 236; CHECK-NEXT: push {r4, lr} 237; CHECK-NEXT: .pad #8 238; CHECK-NEXT: sub sp, #8 239; CHECK-NEXT: add r4, sp, #4 240; CHECK-NEXT: mov r0, r4 241; CHECK-NEXT: bl func 242; CHECK-NEXT: vldrb.u32 q0, [r4, #2] 243; CHECK-NEXT: add sp, #8 244; CHECK-NEXT: pop {r4, pc} 245entry: 246 %d = alloca [4 x i8], align 2 247 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %d, i32 0, i32 0 248 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 249 %g = getelementptr inbounds [4 x i8], [4 x i8]* %d, i32 0, i32 2 250 %b = bitcast i8* %g to <4 x i8>* 251 %l = load <4 x i8>, <4 x i8>* %b, align 2 252 ret <4 x i8> %l 253} 254 255define arm_aapcs_vfpcc <8 x i8> @vldrb16() { 256; CHECK-LABEL: vldrb16: 257; CHECK: @ %bb.0: @ %entry 258; CHECK-NEXT: .save {r4, lr} 259; CHECK-NEXT: push {r4, lr} 260; CHECK-NEXT: .pad #8 261; CHECK-NEXT: sub sp, #8 262; CHECK-NEXT: mov r4, sp 263; CHECK-NEXT: mov r0, r4 264; CHECK-NEXT: bl func 265; CHECK-NEXT: vldrb.u16 q0, [r4, #2] 266; CHECK-NEXT: add sp, #8 267; CHECK-NEXT: pop {r4, pc} 268entry: 269 %d = alloca [8 x i8], align 2 270 %arraydecay = getelementptr inbounds [8 x i8], [8 x i8]* %d, i32 0, i32 0 271 call arm_aapcs_vfpcc void bitcast (void (...)* @func to void (i8*)*)(i8* %arraydecay) 272 %g = getelementptr inbounds [8 x i8], [8 x i8]* %d, i32 0, i32 2 273 %b = bitcast i8* %g to <8 x i8>* 274 %l = load <8 x i8>, <8 x i8>* %b, align 2 275 ret <8 x i8> %l 276} 277 278declare dso_local arm_aapcs_vfpcc void @func(...) 279