1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc < %s -mtriple=armv8-linux-gnueabi -verify-machineinstrs \ 3; RUN: -asm-verbose=false | FileCheck %s 4 5%struct.uint16x4x2_t = type { <4 x i16>, <4 x i16> } 6%struct.uint16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> } 7%struct.uint16x4x4_t = type { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } 8 9%struct.uint32x2x2_t = type { <2 x i32>, <2 x i32> } 10%struct.uint32x2x3_t = type { <2 x i32>, <2 x i32>, <2 x i32> } 11%struct.uint32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } 12 13%struct.uint64x1x2_t = type { <1 x i64>, <1 x i64> } 14%struct.uint64x1x3_t = type { <1 x i64>, <1 x i64>, <1 x i64> } 15%struct.uint64x1x4_t = type { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } 16 17%struct.uint8x8x2_t = type { <8 x i8>, <8 x i8> } 18%struct.uint8x8x3_t = type { <8 x i8>, <8 x i8>, <8 x i8> } 19%struct.uint8x8x4_t = type { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } 20 21%struct.uint16x8x2_t = type { <8 x i16>, <8 x i16> } 22%struct.uint16x8x3_t = type { <8 x i16>, <8 x i16>, <8 x i16> } 23%struct.uint16x8x4_t = type { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } 24 25%struct.uint32x4x2_t = type { <4 x i32>, <4 x i32> } 26%struct.uint32x4x3_t = type { <4 x i32>, <4 x i32>, <4 x i32> } 27%struct.uint32x4x4_t = type { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } 28 29%struct.uint64x2x2_t = type { <2 x i64>, <2 x i64> } 30%struct.uint64x2x3_t = type { <2 x i64>, <2 x i64>, <2 x i64> } 31%struct.uint64x2x4_t = type { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } 32 33%struct.uint8x16x2_t = type { <16 x i8>, <16 x i8> } 34%struct.uint8x16x3_t = type { <16 x i8>, <16 x i8>, <16 x i8> } 35%struct.uint8x16x4_t = type { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } 36 37declare %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr) nounwind readonly 38declare %struct.uint16x4x3_t @llvm.arm.neon.vld1x3.v4i16.p0(ptr) nounwind readonly 39declare %struct.uint16x4x4_t @llvm.arm.neon.vld1x4.v4i16.p0(ptr) nounwind readonly 40 41declare %struct.uint32x2x2_t @llvm.arm.neon.vld1x2.v2i32.p0(ptr) nounwind readonly 42declare %struct.uint32x2x3_t @llvm.arm.neon.vld1x3.v2i32.p0(ptr) nounwind readonly 43declare %struct.uint32x2x4_t @llvm.arm.neon.vld1x4.v2i32.p0(ptr) nounwind readonly 44 45declare %struct.uint64x1x2_t @llvm.arm.neon.vld1x2.v1i64.p0(ptr) nounwind readonly 46declare %struct.uint64x1x3_t @llvm.arm.neon.vld1x3.v1i64.p0(ptr) nounwind readonly 47declare %struct.uint64x1x4_t @llvm.arm.neon.vld1x4.v1i64.p0(ptr) nounwind readonly 48 49declare %struct.uint8x8x2_t @llvm.arm.neon.vld1x2.v8i8.p0(ptr) nounwind readonly 50declare %struct.uint8x8x3_t @llvm.arm.neon.vld1x3.v8i8.p0(ptr) nounwind readonly 51declare %struct.uint8x8x4_t @llvm.arm.neon.vld1x4.v8i8.p0(ptr) nounwind readonly 52 53declare %struct.uint16x8x2_t @llvm.arm.neon.vld1x2.v8i16.p0(ptr) nounwind readonly 54declare %struct.uint16x8x3_t @llvm.arm.neon.vld1x3.v8i16.p0(ptr) nounwind readonly 55declare %struct.uint16x8x4_t @llvm.arm.neon.vld1x4.v8i16.p0(ptr) nounwind readonly 56 57declare %struct.uint32x4x2_t @llvm.arm.neon.vld1x2.v4i32.p0(ptr) nounwind readonly 58declare %struct.uint32x4x3_t @llvm.arm.neon.vld1x3.v4i32.p0(ptr) nounwind readonly 59declare %struct.uint32x4x4_t @llvm.arm.neon.vld1x4.v4i32.p0(ptr) nounwind readonly 60 61declare %struct.uint64x2x2_t @llvm.arm.neon.vld1x2.v2i64.p0(ptr) nounwind readonly 62declare %struct.uint64x2x3_t @llvm.arm.neon.vld1x3.v2i64.p0(ptr) nounwind readonly 63declare %struct.uint64x2x4_t @llvm.arm.neon.vld1x4.v2i64.p0(ptr) nounwind readonly 64 65declare %struct.uint8x16x2_t @llvm.arm.neon.vld1x2.v16i8.p0(ptr) nounwind readonly 66declare %struct.uint8x16x3_t @llvm.arm.neon.vld1x3.v16i8.p0(ptr) nounwind readonly 67declare %struct.uint8x16x4_t @llvm.arm.neon.vld1x4.v16i8.p0(ptr) nounwind readonly 68 69define %struct.uint16x4x2_t @test_vld1_u16_x2(ptr %a) nounwind { 70; CHECK-LABEL: test_vld1_u16_x2: 71; CHECK: vld1.16 {d16, d17}, [r0] 72; CHECK-NEXT: vmov r0, r1, d16 73; CHECK-NEXT: vmov r2, r3, d17 74; CHECK-NEXT: bx lr 75 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr %a) 76 ret %struct.uint16x4x2_t %tmp 77} 78 79define %struct.uint16x4x2_t @test_vld1_u16_x2_align8(ptr %a) nounwind { 80; CHECK-LABEL: test_vld1_u16_x2_align8: 81; CHECK: vld1.16 {d16, d17}, [r0:64] 82; CHECK-NEXT: vmov r0, r1, d16 83; CHECK-NEXT: vmov r2, r3, d17 84; CHECK-NEXT: bx lr 85 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr align 8 %a) 86 ret %struct.uint16x4x2_t %tmp 87} 88 89define %struct.uint16x4x2_t @test_vld1_u16_x2_align16(ptr %a) nounwind { 90; CHECK-LABEL: test_vld1_u16_x2_align16: 91; CHECK: vld1.16 {d16, d17}, [r0:128] 92; CHECK-NEXT: vmov r0, r1, d16 93; CHECK-NEXT: vmov r2, r3, d17 94; CHECK-NEXT: bx lr 95 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr align 16 %a) 96 ret %struct.uint16x4x2_t %tmp 97} 98 99define %struct.uint16x4x2_t @test_vld1_u16_x2_align32(ptr %a) nounwind { 100; CHECK-LABEL: test_vld1_u16_x2_align32: 101; CHECK: vld1.16 {d16, d17}, [r0:128] 102; CHECK-NEXT: vmov r0, r1, d16 103; CHECK-NEXT: vmov r2, r3, d17 104; CHECK-NEXT: bx lr 105 %tmp = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr align 32 %a) 106 ret %struct.uint16x4x2_t %tmp 107} 108 109define %struct.uint16x4x3_t @test_vld1_u16_x3(ptr %a) nounwind { 110; CHECK-LABEL: test_vld1_u16_x3: 111; CHECK: vld1.16 {d16, d17, d18}, [r1] 112; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 113; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 114; CHECK-NEXT: vstr d18, [r0] 115; CHECK-NEXT: bx lr 116 %tmp = tail call %struct.uint16x4x3_t @llvm.arm.neon.vld1x3.v4i16.p0(ptr %a) 117 ret %struct.uint16x4x3_t %tmp 118} 119 120define %struct.uint16x4x4_t @test_vld1_u16_x4(ptr %a) nounwind { 121; CHECK-LABEL: test_vld1_u16_x4: 122; CHECK: vld1.16 {d16, d17, d18, d19}, [r1] 123; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 124; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 125; CHECK-NEXT: vst1.16 {d18}, [r0:64]! 126; CHECK-NEXT: vstr d19, [r0] 127; CHECK-NEXT: bx lr 128 %tmp = tail call %struct.uint16x4x4_t @llvm.arm.neon.vld1x4.v4i16.p0(ptr %a) 129 ret %struct.uint16x4x4_t %tmp 130} 131 132define %struct.uint32x2x2_t @test_vld1_u32_x2(ptr %a) nounwind { 133; CHECK-LABEL: test_vld1_u32_x2: 134; CHECK: vld1.32 {d16, d17}, [r0] 135; CHECK-NEXT: vmov r0, r1, d16 136; CHECK-NEXT: vmov r2, r3, d17 137; CHECK-NEXT: bx lr 138 %tmp = tail call %struct.uint32x2x2_t @llvm.arm.neon.vld1x2.v2i32.p0(ptr %a) 139 ret %struct.uint32x2x2_t %tmp 140} 141 142define %struct.uint32x2x3_t @test_vld1_u32_x3(ptr %a) nounwind { 143; CHECK-LABEL: test_vld1_u32_x3: 144; CHECK: vld1.32 {d16, d17, d18}, [r1] 145; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 146; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 147; CHECK-NEXT: vstr d18, [r0] 148; CHECK-NEXT: bx lr 149 %tmp = tail call %struct.uint32x2x3_t @llvm.arm.neon.vld1x3.v2i32.p0(ptr %a) 150 ret %struct.uint32x2x3_t %tmp 151} 152 153define %struct.uint32x2x4_t @test_vld1_u32_x4(ptr %a) nounwind { 154; CHECK-LABEL: test_vld1_u32_x4: 155; CHECK: vld1.32 {d16, d17, d18, d19}, [r1] 156; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 157; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 158; CHECK-NEXT: vst1.32 {d18}, [r0:64]! 159; CHECK-NEXT: vstr d19, [r0] 160; CHECK-NEXT: bx lr 161 %tmp = tail call %struct.uint32x2x4_t @llvm.arm.neon.vld1x4.v2i32.p0(ptr %a) 162 ret %struct.uint32x2x4_t %tmp 163} 164 165define %struct.uint64x1x2_t @test_vld1_u64_x2(ptr %a) nounwind { 166; CHECK-LABEL: test_vld1_u64_x2: 167; CHECK: vld1.64 {d16, d17}, [r0] 168; CHECK-NEXT: vmov r0, r1, d16 169; CHECK-NEXT: vmov r2, r3, d17 170; CHECK-NEXT: bx lr 171 %tmp = tail call %struct.uint64x1x2_t @llvm.arm.neon.vld1x2.v1i64.p0(ptr %a) 172 ret %struct.uint64x1x2_t %tmp 173} 174 175define %struct.uint64x1x3_t @test_vld1_u64_x3(ptr %a) nounwind { 176; CHECK-LABEL: test_vld1_u64_x3: 177; CHECK: vld1.64 {d16, d17, d18}, [r1] 178; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 179; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 180; CHECK-NEXT: vstr d18, [r0] 181; CHECK-NEXT: bx lr 182 %tmp = tail call %struct.uint64x1x3_t @llvm.arm.neon.vld1x3.v1i64.p0(ptr %a) 183 ret %struct.uint64x1x3_t %tmp 184} 185 186define %struct.uint64x1x4_t @test_vld1_u64_x4(ptr %a) nounwind { 187; CHECK-LABEL: test_vld1_u64_x4: 188; CHECK: vld1.64 {d16, d17, d18, d19}, [r1] 189; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 190; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 191; CHECK-NEXT: vst1.64 {d18}, [r0:64]! 192; CHECK-NEXT: vstr d19, [r0] 193; CHECK-NEXT: bx lr 194 %tmp = tail call %struct.uint64x1x4_t @llvm.arm.neon.vld1x4.v1i64.p0(ptr %a) 195 ret %struct.uint64x1x4_t %tmp 196} 197 198define %struct.uint8x8x2_t @test_vld1_u8_x2(ptr %a) nounwind { 199; CHECK-LABEL: test_vld1_u8_x2: 200; CHECK: vld1.8 {d16, d17}, [r0] 201; CHECK-NEXT: vmov r0, r1, d16 202; CHECK-NEXT: vmov r2, r3, d17 203; CHECK-NEXT: bx lr 204 %tmp = tail call %struct.uint8x8x2_t @llvm.arm.neon.vld1x2.v8i8.p0(ptr %a) 205 ret %struct.uint8x8x2_t %tmp 206} 207 208define %struct.uint8x8x3_t @test_vld1_u8_x3(ptr %a) nounwind { 209; CHECK-LABEL: test_vld1_u8_x3: 210; CHECK: vld1.8 {d16, d17, d18}, [r1] 211; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 212; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 213; CHECK-NEXT: vstr d18, [r0] 214; CHECK-NEXT: bx lr 215 %tmp = tail call %struct.uint8x8x3_t @llvm.arm.neon.vld1x3.v8i8.p0(ptr %a) 216 ret %struct.uint8x8x3_t %tmp 217} 218 219define %struct.uint8x8x4_t @test_vld1_u8_x4(ptr %a) nounwind { 220; CHECK-LABEL: test_vld1_u8_x4: 221; CHECK: vld1.8 {d16, d17, d18, d19}, [r1] 222; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 223; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 224; CHECK-NEXT: vst1.8 {d18}, [r0:64]! 225; CHECK-NEXT: vstr d19, [r0] 226; CHECK-NEXT: bx lr 227 %tmp = tail call %struct.uint8x8x4_t @llvm.arm.neon.vld1x4.v8i8.p0(ptr %a) 228 ret %struct.uint8x8x4_t %tmp 229} 230 231define %struct.uint16x8x2_t @test_vld1q_u16_x2(ptr %a) nounwind { 232; CHECK-LABEL: test_vld1q_u16_x2: 233; CHECK: vld1.16 {d16, d17, d18, d19}, [r1] 234; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 235; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 236; CHECK-NEXT: bx lr 237 %tmp = tail call %struct.uint16x8x2_t @llvm.arm.neon.vld1x2.v8i16.p0(ptr %a) 238 ret %struct.uint16x8x2_t %tmp 239} 240 241define %struct.uint16x8x3_t @test_vld1q_u16_x3(ptr %a) nounwind { 242; CHECK-LABEL: test_vld1q_u16_x3: 243; CHECK: vld1.16 {d16, d17, d18}, [r1]! 244; CHECK-NEXT: vld1.16 {d19, d20, d21}, [r1] 245; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 246; CHECK-NEXT: vst1.16 {d18, d19}, [r0]! 247; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 248; CHECK-NEXT: bx lr 249 %tmp = tail call %struct.uint16x8x3_t @llvm.arm.neon.vld1x3.v8i16.p0(ptr %a) 250 ret %struct.uint16x8x3_t %tmp 251} 252 253define %struct.uint16x8x4_t @test_vld1q_u16_x4(ptr %a) nounwind { 254; CHECK-LABEL: test_vld1q_u16_x4: 255; CHECK: vld1.16 {d16, d17, d18, d19}, [r1]! 256; CHECK-NEXT: vld1.16 {d20, d21, d22, d23}, [r1] 257; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 258; CHECK-NEXT: vst1.16 {d18, d19}, [r0]! 259; CHECK-NEXT: vst1.16 {d20, d21}, [r0]! 260; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 261; CHECK-NEXT: bx lr 262 %tmp = tail call %struct.uint16x8x4_t @llvm.arm.neon.vld1x4.v8i16.p0(ptr %a) 263 ret %struct.uint16x8x4_t %tmp 264} 265 266define %struct.uint32x4x2_t @test_vld1q_u32_x2(ptr %a) nounwind { 267; CHECK-LABEL: test_vld1q_u32_x2: 268; CHECK: vld1.32 {d16, d17, d18, d19}, [r1] 269; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 270; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 271; CHECK-NEXT: bx lr 272 %tmp = tail call %struct.uint32x4x2_t @llvm.arm.neon.vld1x2.v4i32.p0(ptr %a) 273 ret %struct.uint32x4x2_t %tmp 274} 275 276define %struct.uint32x4x3_t @test_vld1q_u32_x3(ptr %a) nounwind { 277; CHECK-LABEL: test_vld1q_u32_x3: 278; CHECK: vld1.32 {d16, d17, d18}, [r1]! 279; CHECK-NEXT: vld1.32 {d19, d20, d21}, [r1] 280; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 281; CHECK-NEXT: vst1.32 {d18, d19}, [r0]! 282; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 283; CHECK-NEXT: bx lr 284 %tmp = tail call %struct.uint32x4x3_t @llvm.arm.neon.vld1x3.v4i32.p0(ptr %a) 285 ret %struct.uint32x4x3_t %tmp 286} 287 288define %struct.uint32x4x4_t @test_vld1q_u32_x4(ptr %a) nounwind { 289; CHECK-LABEL: test_vld1q_u32_x4: 290; CHECK: vld1.32 {d16, d17, d18, d19}, [r1]! 291; CHECK-NEXT: vld1.32 {d20, d21, d22, d23}, [r1] 292; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 293; CHECK-NEXT: vst1.32 {d18, d19}, [r0]! 294; CHECK-NEXT: vst1.32 {d20, d21}, [r0]! 295; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 296; CHECK-NEXT: bx lr 297 %tmp = tail call %struct.uint32x4x4_t @llvm.arm.neon.vld1x4.v4i32.p0(ptr %a) 298 ret %struct.uint32x4x4_t %tmp 299} 300 301define %struct.uint64x2x2_t @test_vld1q_u64_x2(ptr %a) nounwind { 302; CHECK-LABEL: test_vld1q_u64_x2: 303; CHECK: vld1.64 {d16, d17, d18, d19}, [r1] 304; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 305; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 306; CHECK-NEXT: bx lr 307 %tmp = tail call %struct.uint64x2x2_t @llvm.arm.neon.vld1x2.v2i64.p0(ptr %a) 308 ret %struct.uint64x2x2_t %tmp 309} 310 311define %struct.uint64x2x3_t @test_vld1q_u64_x3(ptr %a) nounwind { 312; CHECK-LABEL: test_vld1q_u64_x3: 313; CHECK: vld1.64 {d16, d17, d18}, [r1]! 314; CHECK-NEXT: vld1.64 {d19, d20, d21}, [r1] 315; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 316; CHECK-NEXT: vst1.64 {d18, d19}, [r0]! 317; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 318; CHECK-NEXT: bx lr 319 %tmp = tail call %struct.uint64x2x3_t @llvm.arm.neon.vld1x3.v2i64.p0(ptr %a) 320 ret %struct.uint64x2x3_t %tmp 321} 322 323define %struct.uint64x2x4_t @test_vld1q_u64_x4(ptr %a) nounwind { 324; CHECK-LABEL: test_vld1q_u64_x4: 325; CHECK: vld1.64 {d16, d17, d18, d19}, [r1]! 326; CHECK-NEXT: vld1.64 {d20, d21, d22, d23}, [r1] 327; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 328; CHECK-NEXT: vst1.64 {d18, d19}, [r0]! 329; CHECK-NEXT: vst1.64 {d20, d21}, [r0]! 330; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 331; CHECK-NEXT: bx lr 332 %tmp = tail call %struct.uint64x2x4_t @llvm.arm.neon.vld1x4.v2i64.p0(ptr %a) 333 ret %struct.uint64x2x4_t %tmp 334} 335 336define %struct.uint8x16x2_t @test_vld1q_u8_x2(ptr %a) nounwind { 337; CHECK-LABEL: test_vld1q_u8_x2: 338; CHECK: vld1.8 {d16, d17, d18, d19}, [r1] 339; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 340; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 341; CHECK-NEXT: bx lr 342 %tmp = tail call %struct.uint8x16x2_t @llvm.arm.neon.vld1x2.v16i8.p0(ptr %a) 343 ret %struct.uint8x16x2_t %tmp 344} 345 346define %struct.uint8x16x3_t @test_vld1q_u8_x3(ptr %a) nounwind { 347; CHECK-LABEL: test_vld1q_u8_x3: 348; CHECK: vld1.8 {d16, d17, d18}, [r1]! 349; CHECK-NEXT: vld1.8 {d19, d20, d21}, [r1] 350; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 351; CHECK-NEXT: vst1.8 {d18, d19}, [r0]! 352; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 353; CHECK-NEXT: bx lr 354 %tmp = tail call %struct.uint8x16x3_t @llvm.arm.neon.vld1x3.v16i8.p0(ptr %a) 355 ret %struct.uint8x16x3_t %tmp 356} 357 358define %struct.uint8x16x4_t @test_vld1q_u8_x4(ptr %a) nounwind { 359; CHECK-LABEL: test_vld1q_u8_x4: 360; CHECK: vld1.8 {d16, d17, d18, d19}, [r1]! 361; CHECK-NEXT: vld1.8 {d20, d21, d22, d23}, [r1] 362; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 363; CHECK-NEXT: vst1.8 {d18, d19}, [r0]! 364; CHECK-NEXT: vst1.8 {d20, d21}, [r0]! 365; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 366; CHECK-NEXT: bx lr 367 %tmp = tail call %struct.uint8x16x4_t @llvm.arm.neon.vld1x4.v16i8.p0(ptr %a) 368 ret %struct.uint8x16x4_t %tmp 369} 370 371; Post-increment. 372 373define %struct.uint16x4x2_t @test_vld1_u16_x2_post_imm(ptr %a, ptr %ptr) nounwind { 374; CHECK-LABEL: test_vld1_u16_x2_post_imm: 375; CHECK: .save {r11, lr} 376; CHECK-NEXT: push {r11, lr} 377; CHECK-NEXT: vld1.16 {d16, d17}, [r0]! 378; CHECK-NEXT: vmov lr, r12, d16 379; CHECK-NEXT: str r0, [r1] 380; CHECK-NEXT: vmov r2, r3, d17 381; CHECK-NEXT: mov r0, lr 382; CHECK-NEXT: mov r1, r12 383; CHECK-NEXT: pop {r11, pc} 384 %ld = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr %a) 385 %tmp = getelementptr i16, ptr %a, i32 8 386 store ptr %tmp, ptr %ptr 387 ret %struct.uint16x4x2_t %ld 388} 389 390define %struct.uint16x4x2_t @test_vld1_u16_x2_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 391; CHECK-LABEL: test_vld1_u16_x2_post_reg: 392; CHECK: .save {r11, lr} 393; CHECK-NEXT: push {r11, lr} 394; CHECK-NEXT: lsl r2, r2, #1 395; CHECK-NEXT: vld1.16 {d16, d17}, [r0], r2 396; CHECK-NEXT: vmov lr, r12, d16 397; CHECK-NEXT: str r0, [r1] 398; CHECK-NEXT: vmov r2, r3, d17 399; CHECK-NEXT: mov r0, lr 400; CHECK-NEXT: mov r1, r12 401; CHECK-NEXT: pop {r11, pc} 402 %ld = tail call %struct.uint16x4x2_t @llvm.arm.neon.vld1x2.v4i16.p0(ptr %a) 403 %tmp = getelementptr i16, ptr %a, i32 %inc 404 store ptr %tmp, ptr %ptr 405 ret %struct.uint16x4x2_t %ld 406} 407 408define %struct.uint16x4x3_t @test_vld1_u16_x3_post_imm(ptr %a, ptr %ptr) nounwind { 409; CHECK-LABEL: test_vld1_u16_x3_post_imm: 410; CHECK: vld1.16 {d16, d17, d18}, [r1]! 411; CHECK-NEXT: str r1, [r2] 412; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 413; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 414; CHECK-NEXT: vstr d18, [r0] 415; CHECK-NEXT: bx lr 416 %ld = tail call %struct.uint16x4x3_t @llvm.arm.neon.vld1x3.v4i16.p0(ptr %a) 417 %tmp = getelementptr i16, ptr %a, i32 12 418 store ptr %tmp, ptr %ptr 419 ret %struct.uint16x4x3_t %ld 420} 421 422define %struct.uint16x4x3_t @test_vld1_u16_x3_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 423; CHECK-LABEL: test_vld1_u16_x3_post_reg: 424; CHECK: lsl r3, r3, #1 425; CHECK-NEXT: vld1.16 {d16, d17, d18}, [r1], r3 426; CHECK-NEXT: str r1, [r2] 427; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 428; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 429; CHECK-NEXT: vstr d18, [r0] 430; CHECK-NEXT: bx lr 431 %ld = tail call %struct.uint16x4x3_t @llvm.arm.neon.vld1x3.v4i16.p0(ptr %a) 432 %tmp = getelementptr i16, ptr %a, i32 %inc 433 store ptr %tmp, ptr %ptr 434 ret %struct.uint16x4x3_t %ld 435} 436 437define %struct.uint16x4x4_t @test_vld1_u16_x4_post_imm(ptr %a, ptr %ptr) nounwind { 438; CHECK-LABEL: test_vld1_u16_x4_post_imm: 439; CHECK: vld1.16 {d16, d17, d18, d19}, [r1]! 440; CHECK-NEXT: str r1, [r2] 441; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 442; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 443; CHECK-NEXT: vst1.16 {d18}, [r0:64]! 444; CHECK-NEXT: vstr d19, [r0] 445; CHECK-NEXT: bx lr 446 %ld = tail call %struct.uint16x4x4_t @llvm.arm.neon.vld1x4.v4i16.p0(ptr %a) 447 %tmp = getelementptr i16, ptr %a, i32 16 448 store ptr %tmp, ptr %ptr 449 ret %struct.uint16x4x4_t %ld 450} 451 452define %struct.uint16x4x4_t @test_vld1_u16_x4_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 453; CHECK-LABEL: test_vld1_u16_x4_post_reg: 454; CHECK: lsl r3, r3, #1 455; CHECK-NEXT: vld1.16 {d16, d17, d18, d19}, [r1], r3 456; CHECK-NEXT: str r1, [r2] 457; CHECK-NEXT: vst1.16 {d16}, [r0:64]! 458; CHECK-NEXT: vst1.16 {d17}, [r0:64]! 459; CHECK-NEXT: vst1.16 {d18}, [r0:64]! 460; CHECK-NEXT: vstr d19, [r0] 461; CHECK-NEXT: bx lr 462 %ld = tail call %struct.uint16x4x4_t @llvm.arm.neon.vld1x4.v4i16.p0(ptr %a) 463 %tmp = getelementptr i16, ptr %a, i32 %inc 464 store ptr %tmp, ptr %ptr 465 ret %struct.uint16x4x4_t %ld 466} 467 468define %struct.uint32x2x2_t @test_vld1_u32_x2_post_imm(ptr %a, ptr %ptr) nounwind { 469; CHECK-LABEL: test_vld1_u32_x2_post_imm: 470; CHECK: .save {r11, lr} 471; CHECK-NEXT: push {r11, lr} 472; CHECK-NEXT: vld1.32 {d16, d17}, [r0]! 473; CHECK-NEXT: vmov lr, r12, d16 474; CHECK-NEXT: str r0, [r1] 475; CHECK-NEXT: vmov r2, r3, d17 476; CHECK-NEXT: mov r0, lr 477; CHECK-NEXT: mov r1, r12 478; CHECK-NEXT: pop {r11, pc} 479 %ld = tail call %struct.uint32x2x2_t @llvm.arm.neon.vld1x2.v2i32.p0(ptr %a) 480 %tmp = getelementptr i32, ptr %a, i32 4 481 store ptr %tmp, ptr %ptr 482 ret %struct.uint32x2x2_t %ld 483} 484 485define %struct.uint32x2x2_t @test_vld1_u32_x2_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 486; CHECK-LABEL: test_vld1_u32_x2_post_reg: 487; CHECK: .save {r11, lr} 488; CHECK-NEXT: push {r11, lr} 489; CHECK-NEXT: lsl r2, r2, #2 490; CHECK-NEXT: vld1.32 {d16, d17}, [r0], r2 491; CHECK-NEXT: vmov lr, r12, d16 492; CHECK-NEXT: str r0, [r1] 493; CHECK-NEXT: vmov r2, r3, d17 494; CHECK-NEXT: mov r0, lr 495; CHECK-NEXT: mov r1, r12 496; CHECK-NEXT: pop {r11, pc} 497 %ld = tail call %struct.uint32x2x2_t @llvm.arm.neon.vld1x2.v2i32.p0(ptr %a) 498 %tmp = getelementptr i32, ptr %a, i32 %inc 499 store ptr %tmp, ptr %ptr 500 ret %struct.uint32x2x2_t %ld 501} 502 503define %struct.uint32x2x3_t @test_vld1_u32_x3_post_imm(ptr %a, ptr %ptr) nounwind { 504; CHECK-LABEL: test_vld1_u32_x3_post_imm: 505; CHECK: vld1.32 {d16, d17, d18}, [r1]! 506; CHECK-NEXT: str r1, [r2] 507; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 508; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 509; CHECK-NEXT: vstr d18, [r0] 510; CHECK-NEXT: bx lr 511 %ld = tail call %struct.uint32x2x3_t @llvm.arm.neon.vld1x3.v2i32.p0(ptr %a) 512 %tmp = getelementptr i32, ptr %a, i32 6 513 store ptr %tmp, ptr %ptr 514 ret %struct.uint32x2x3_t %ld 515} 516 517define %struct.uint32x2x3_t @test_vld1_u32_x3_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 518; CHECK-LABEL: test_vld1_u32_x3_post_reg: 519; CHECK: lsl r3, r3, #2 520; CHECK-NEXT: vld1.32 {d16, d17, d18}, [r1], r3 521; CHECK-NEXT: str r1, [r2] 522; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 523; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 524; CHECK-NEXT: vstr d18, [r0] 525; CHECK-NEXT: bx lr 526 %ld = tail call %struct.uint32x2x3_t @llvm.arm.neon.vld1x3.v2i32.p0(ptr %a) 527 %tmp = getelementptr i32, ptr %a, i32 %inc 528 store ptr %tmp, ptr %ptr 529 ret %struct.uint32x2x3_t %ld 530} 531 532define %struct.uint32x2x4_t @test_vld1_u32_x4_post_imm(ptr %a, ptr %ptr) nounwind { 533; CHECK-LABEL: test_vld1_u32_x4_post_imm: 534; CHECK: vld1.32 {d16, d17, d18, d19}, [r1]! 535; CHECK-NEXT: str r1, [r2] 536; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 537; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 538; CHECK-NEXT: vst1.32 {d18}, [r0:64]! 539; CHECK-NEXT: vstr d19, [r0] 540; CHECK-NEXT: bx lr 541 %ld = tail call %struct.uint32x2x4_t @llvm.arm.neon.vld1x4.v2i32.p0(ptr %a) 542 %tmp = getelementptr i32, ptr %a, i32 8 543 store ptr %tmp, ptr %ptr 544 ret %struct.uint32x2x4_t %ld 545} 546 547define %struct.uint32x2x4_t @test_vld1_u32_x4_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 548; CHECK-LABEL: test_vld1_u32_x4_post_reg: 549; CHECK: lsl r3, r3, #2 550; CHECK-NEXT: vld1.32 {d16, d17, d18, d19}, [r1], r3 551; CHECK-NEXT: str r1, [r2] 552; CHECK-NEXT: vst1.32 {d16}, [r0:64]! 553; CHECK-NEXT: vst1.32 {d17}, [r0:64]! 554; CHECK-NEXT: vst1.32 {d18}, [r0:64]! 555; CHECK-NEXT: vstr d19, [r0] 556; CHECK-NEXT: bx lr 557 %ld = tail call %struct.uint32x2x4_t @llvm.arm.neon.vld1x4.v2i32.p0(ptr %a) 558 %tmp = getelementptr i32, ptr %a, i32 %inc 559 store ptr %tmp, ptr %ptr 560 ret %struct.uint32x2x4_t %ld 561} 562 563define %struct.uint64x1x2_t @test_vld1_u64_x2_post_imm(ptr %a, ptr %ptr) nounwind { 564; CHECK-LABEL: test_vld1_u64_x2_post_imm: 565; CHECK: .save {r11, lr} 566; CHECK-NEXT: push {r11, lr} 567; CHECK-NEXT: vld1.64 {d16, d17}, [r0]! 568; CHECK-NEXT: vmov lr, r12, d16 569; CHECK-NEXT: str r0, [r1] 570; CHECK-NEXT: vmov r2, r3, d17 571; CHECK-NEXT: mov r0, lr 572; CHECK-NEXT: mov r1, r12 573; CHECK-NEXT: pop {r11, pc} 574 %ld = tail call %struct.uint64x1x2_t @llvm.arm.neon.vld1x2.v1i64.p0(ptr %a) 575 %tmp = getelementptr i64, ptr %a, i32 2 576 store ptr %tmp, ptr %ptr 577 ret %struct.uint64x1x2_t %ld 578} 579 580define %struct.uint64x1x2_t @test_vld1_u64_x2_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 581; CHECK-LABEL: test_vld1_u64_x2_post_reg: 582; CHECK: .save {r11, lr} 583; CHECK-NEXT: push {r11, lr} 584; CHECK-NEXT: lsl r2, r2, #3 585; CHECK-NEXT: vld1.64 {d16, d17}, [r0], r2 586; CHECK-NEXT: vmov lr, r12, d16 587; CHECK-NEXT: str r0, [r1] 588; CHECK-NEXT: vmov r2, r3, d17 589; CHECK-NEXT: mov r0, lr 590; CHECK-NEXT: mov r1, r12 591; CHECK-NEXT: pop {r11, pc} 592 %ld = tail call %struct.uint64x1x2_t @llvm.arm.neon.vld1x2.v1i64.p0(ptr %a) 593 %tmp = getelementptr i64, ptr %a, i32 %inc 594 store ptr %tmp, ptr %ptr 595 ret %struct.uint64x1x2_t %ld 596} 597 598define %struct.uint64x1x3_t @test_vld1_u64_x3_post_imm(ptr %a, ptr %ptr) nounwind { 599; CHECK-LABEL: test_vld1_u64_x3_post_imm: 600; CHECK: vld1.64 {d16, d17, d18}, [r1]! 601; CHECK-NEXT: str r1, [r2] 602; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 603; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 604; CHECK-NEXT: vstr d18, [r0] 605; CHECK-NEXT: bx lr 606 %ld = tail call %struct.uint64x1x3_t @llvm.arm.neon.vld1x3.v1i64.p0(ptr %a) 607 %tmp = getelementptr i64, ptr %a, i32 3 608 store ptr %tmp, ptr %ptr 609 ret %struct.uint64x1x3_t %ld 610} 611 612define %struct.uint64x1x3_t @test_vld1_u64_x3_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 613; CHECK-LABEL: test_vld1_u64_x3_post_reg: 614; CHECK: lsl r3, r3, #3 615; CHECK-NEXT: vld1.64 {d16, d17, d18}, [r1], r3 616; CHECK-NEXT: str r1, [r2] 617; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 618; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 619; CHECK-NEXT: vstr d18, [r0] 620; CHECK-NEXT: bx lr 621 %ld = tail call %struct.uint64x1x3_t @llvm.arm.neon.vld1x3.v1i64.p0(ptr %a) 622 %tmp = getelementptr i64, ptr %a, i32 %inc 623 store ptr %tmp, ptr %ptr 624 ret %struct.uint64x1x3_t %ld 625} 626 627define %struct.uint64x1x4_t @test_vld1_u64_x4_post_imm(ptr %a, ptr %ptr) nounwind { 628; CHECK-LABEL: test_vld1_u64_x4_post_imm: 629; CHECK: vld1.64 {d16, d17, d18, d19}, [r1]! 630; CHECK-NEXT: str r1, [r2] 631; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 632; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 633; CHECK-NEXT: vst1.64 {d18}, [r0:64]! 634; CHECK-NEXT: vstr d19, [r0] 635; CHECK-NEXT: bx lr 636 %ld = tail call %struct.uint64x1x4_t @llvm.arm.neon.vld1x4.v1i64.p0(ptr %a) 637 %tmp = getelementptr i64, ptr %a, i32 4 638 store ptr %tmp, ptr %ptr 639 ret %struct.uint64x1x4_t %ld 640} 641 642define %struct.uint64x1x4_t @test_vld1_u64_x4_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 643; CHECK-LABEL: test_vld1_u64_x4_post_reg: 644; CHECK: lsl r3, r3, #3 645; CHECK-NEXT: vld1.64 {d16, d17, d18, d19}, [r1], r3 646; CHECK-NEXT: str r1, [r2] 647; CHECK-NEXT: vst1.64 {d16}, [r0:64]! 648; CHECK-NEXT: vst1.64 {d17}, [r0:64]! 649; CHECK-NEXT: vst1.64 {d18}, [r0:64]! 650; CHECK-NEXT: vstr d19, [r0] 651; CHECK-NEXT: bx lr 652 %ld = tail call %struct.uint64x1x4_t @llvm.arm.neon.vld1x4.v1i64.p0(ptr %a) 653 %tmp = getelementptr i64, ptr %a, i32 %inc 654 store ptr %tmp, ptr %ptr 655 ret %struct.uint64x1x4_t %ld 656} 657 658define %struct.uint8x8x2_t @test_vld1_u8_x2_post_imm(ptr %a, ptr %ptr) nounwind { 659; CHECK-LABEL: test_vld1_u8_x2_post_imm: 660; CHECK: .save {r11, lr} 661; CHECK-NEXT: push {r11, lr} 662; CHECK-NEXT: vld1.8 {d16, d17}, [r0]! 663; CHECK-NEXT: vmov lr, r12, d16 664; CHECK-NEXT: str r0, [r1] 665; CHECK-NEXT: vmov r2, r3, d17 666; CHECK-NEXT: mov r0, lr 667; CHECK-NEXT: mov r1, r12 668; CHECK-NEXT: pop {r11, pc} 669 %ld = tail call %struct.uint8x8x2_t @llvm.arm.neon.vld1x2.v8i8.p0(ptr %a) 670 %tmp = getelementptr i8, ptr %a, i32 16 671 store ptr %tmp, ptr %ptr 672 ret %struct.uint8x8x2_t %ld 673} 674 675define %struct.uint8x8x2_t @test_vld1_u8_x2_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 676; CHECK-LABEL: test_vld1_u8_x2_post_reg: 677; CHECK: .save {r11, lr} 678; CHECK-NEXT: push {r11, lr} 679; CHECK-NEXT: vld1.8 {d16, d17}, [r0], r2 680; CHECK-NEXT: vmov lr, r12, d16 681; CHECK-NEXT: str r0, [r1] 682; CHECK-NEXT: vmov r2, r3, d17 683; CHECK-NEXT: mov r0, lr 684; CHECK-NEXT: mov r1, r12 685; CHECK-NEXT: pop {r11, pc} 686 %ld = tail call %struct.uint8x8x2_t @llvm.arm.neon.vld1x2.v8i8.p0(ptr %a) 687 %tmp = getelementptr i8, ptr %a, i32 %inc 688 store ptr %tmp, ptr %ptr 689 ret %struct.uint8x8x2_t %ld 690} 691 692define %struct.uint8x8x3_t @test_vld1_u8_x3_post_imm(ptr %a, ptr %ptr) nounwind { 693; CHECK-LABEL: test_vld1_u8_x3_post_imm: 694; CHECK: vld1.8 {d16, d17, d18}, [r1]! 695; CHECK-NEXT: str r1, [r2] 696; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 697; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 698; CHECK-NEXT: vstr d18, [r0] 699; CHECK-NEXT: bx lr 700 %ld = tail call %struct.uint8x8x3_t @llvm.arm.neon.vld1x3.v8i8.p0(ptr %a) 701 %tmp = getelementptr i8, ptr %a, i32 24 702 store ptr %tmp, ptr %ptr 703 ret %struct.uint8x8x3_t %ld 704} 705 706define %struct.uint8x8x3_t @test_vld1_u8_x3_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 707; CHECK-LABEL: test_vld1_u8_x3_post_reg: 708; CHECK: vld1.8 {d16, d17, d18}, [r1], r3 709; CHECK-NEXT: str r1, [r2] 710; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 711; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 712; CHECK-NEXT: vstr d18, [r0] 713; CHECK-NEXT: bx lr 714 %ld = tail call %struct.uint8x8x3_t @llvm.arm.neon.vld1x3.v8i8.p0(ptr %a) 715 %tmp = getelementptr i8, ptr %a, i32 %inc 716 store ptr %tmp, ptr %ptr 717 ret %struct.uint8x8x3_t %ld 718} 719 720define %struct.uint8x8x4_t @test_vld1_u8_x4_post_imm(ptr %a, ptr %ptr) nounwind { 721; CHECK-LABEL: test_vld1_u8_x4_post_imm: 722; CHECK: vld1.8 {d16, d17, d18, d19}, [r1]! 723; CHECK-NEXT: str r1, [r2] 724; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 725; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 726; CHECK-NEXT: vst1.8 {d18}, [r0:64]! 727; CHECK-NEXT: vstr d19, [r0] 728; CHECK-NEXT: bx lr 729 %ld = tail call %struct.uint8x8x4_t @llvm.arm.neon.vld1x4.v8i8.p0(ptr %a) 730 %tmp = getelementptr i8, ptr %a, i32 32 731 store ptr %tmp, ptr %ptr 732 ret %struct.uint8x8x4_t %ld 733} 734 735define %struct.uint8x8x4_t @test_vld1_u8_x4_post_reg(ptr %a, ptr %ptr, i32 %inc) nounwind { 736; CHECK-LABEL: test_vld1_u8_x4_post_reg: 737; CHECK: vld1.8 {d16, d17, d18, d19}, [r1], r3 738; CHECK-NEXT: str r1, [r2] 739; CHECK-NEXT: vst1.8 {d16}, [r0:64]! 740; CHECK-NEXT: vst1.8 {d17}, [r0:64]! 741; CHECK-NEXT: vst1.8 {d18}, [r0:64]! 742; CHECK-NEXT: vstr d19, [r0] 743; CHECK-NEXT: bx lr 744 %ld = tail call %struct.uint8x8x4_t @llvm.arm.neon.vld1x4.v8i8.p0(ptr %a) 745 %tmp = getelementptr i8, ptr %a, i32 %inc 746 store ptr %tmp, ptr %ptr 747 ret %struct.uint8x8x4_t %ld 748} 749 750define %struct.uint16x8x2_t @test_vld1q_u16_x2_post_imm(ptr %a, ptr %ptr) nounwind { 751; CHECK-LABEL: test_vld1q_u16_x2_post_imm: 752; CHECK: vld1.16 {d16, d17, d18, d19}, [r1]! 753; CHECK-NEXT: str r1, [r2] 754; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 755; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 756; CHECK-NEXT: bx lr 757 %ld = tail call %struct.uint16x8x2_t @llvm.arm.neon.vld1x2.v8i16.p0(ptr %a) 758 %tmp = getelementptr i16, ptr %a, i32 16 759 store ptr %tmp, ptr %ptr 760 ret %struct.uint16x8x2_t %ld 761} 762 763define %struct.uint16x8x3_t @test_vld1q_u16_x3_post_imm(ptr %a, ptr %ptr) nounwind { 764; CHECK-LABEL: test_vld1q_u16_x3_post_imm: 765; CHECK: vld1.16 {d16, d17, d18}, [r1]! 766; CHECK-NEXT: vld1.16 {d19, d20, d21}, [r1]! 767; CHECK-NEXT: str r1, [r2] 768; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 769; CHECK-NEXT: vst1.16 {d18, d19}, [r0]! 770; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 771; CHECK-NEXT: bx lr 772 %ld = tail call %struct.uint16x8x3_t @llvm.arm.neon.vld1x3.v8i16.p0(ptr %a) 773 %tmp = getelementptr i16, ptr %a, i32 24 774 store ptr %tmp, ptr %ptr 775 ret %struct.uint16x8x3_t %ld 776} 777 778define %struct.uint16x8x4_t @test_vld1q_u16_x4_post_imm(ptr %a, ptr %ptr) nounwind { 779; CHECK-LABEL: test_vld1q_u16_x4_post_imm: 780; CHECK: vld1.16 {d16, d17, d18, d19}, [r1]! 781; CHECK-NEXT: vld1.16 {d20, d21, d22, d23}, [r1]! 782; CHECK-NEXT: str r1, [r2] 783; CHECK-NEXT: vst1.16 {d16, d17}, [r0]! 784; CHECK-NEXT: vst1.16 {d18, d19}, [r0]! 785; CHECK-NEXT: vst1.16 {d20, d21}, [r0]! 786; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 787; CHECK-NEXT: bx lr 788 %ld = tail call %struct.uint16x8x4_t @llvm.arm.neon.vld1x4.v8i16.p0(ptr %a) 789 %tmp = getelementptr i16, ptr %a, i32 32 790 store ptr %tmp, ptr %ptr 791 ret %struct.uint16x8x4_t %ld 792} 793 794define %struct.uint32x4x2_t @test_vld1q_u32_x2_post_imm(ptr %a, ptr %ptr) nounwind { 795; CHECK-LABEL: test_vld1q_u32_x2_post_imm: 796; CHECK: vld1.32 {d16, d17, d18, d19}, [r1]! 797; CHECK-NEXT: str r1, [r2] 798; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 799; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 800; CHECK-NEXT: bx lr 801 %ld = tail call %struct.uint32x4x2_t @llvm.arm.neon.vld1x2.v4i32.p0(ptr %a) 802 %tmp = getelementptr i32, ptr %a, i32 8 803 store ptr %tmp, ptr %ptr 804 ret %struct.uint32x4x2_t %ld 805} 806 807define %struct.uint32x4x3_t @test_vld1q_u32_x3_post_imm(ptr %a, ptr %ptr) nounwind { 808; CHECK-LABEL: test_vld1q_u32_x3_post_imm: 809; CHECK: vld1.32 {d16, d17, d18}, [r1]! 810; CHECK-NEXT: vld1.32 {d19, d20, d21}, [r1]! 811; CHECK-NEXT: str r1, [r2] 812; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 813; CHECK-NEXT: vst1.32 {d18, d19}, [r0]! 814; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 815; CHECK-NEXT: bx lr 816 %ld = tail call %struct.uint32x4x3_t @llvm.arm.neon.vld1x3.v4i32.p0(ptr %a) 817 %tmp = getelementptr i32, ptr %a, i32 12 818 store ptr %tmp, ptr %ptr 819 ret %struct.uint32x4x3_t %ld 820} 821 822define %struct.uint32x4x4_t @test_vld1q_u32_x4_post_imm(ptr %a, ptr %ptr) nounwind { 823; CHECK-LABEL: test_vld1q_u32_x4_post_imm: 824; CHECK: vld1.32 {d16, d17, d18, d19}, [r1]! 825; CHECK-NEXT: vld1.32 {d20, d21, d22, d23}, [r1]! 826; CHECK-NEXT: str r1, [r2] 827; CHECK-NEXT: vst1.32 {d16, d17}, [r0]! 828; CHECK-NEXT: vst1.32 {d18, d19}, [r0]! 829; CHECK-NEXT: vst1.32 {d20, d21}, [r0]! 830; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 831; CHECK-NEXT: bx lr 832 %ld = tail call %struct.uint32x4x4_t @llvm.arm.neon.vld1x4.v4i32.p0(ptr %a) 833 %tmp = getelementptr i32, ptr %a, i32 16 834 store ptr %tmp, ptr %ptr 835 ret %struct.uint32x4x4_t %ld 836} 837 838define %struct.uint64x2x2_t @test_vld1q_u64_x2_post_imm(ptr %a, ptr %ptr) nounwind { 839; CHECK-LABEL: test_vld1q_u64_x2_post_imm: 840; CHECK: vld1.64 {d16, d17, d18, d19}, [r1]! 841; CHECK-NEXT: str r1, [r2] 842; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 843; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 844; CHECK-NEXT: bx lr 845 %ld = tail call %struct.uint64x2x2_t @llvm.arm.neon.vld1x2.v2i64.p0(ptr %a) 846 %tmp = getelementptr i64, ptr %a, i32 4 847 store ptr %tmp, ptr %ptr 848 ret %struct.uint64x2x2_t %ld 849} 850 851define %struct.uint64x2x3_t @test_vld1q_u64_x3_post_imm(ptr %a, ptr %ptr) nounwind { 852; CHECK-LABEL: test_vld1q_u64_x3_post_imm: 853; CHECK: vld1.64 {d16, d17, d18}, [r1]! 854; CHECK-NEXT: vld1.64 {d19, d20, d21}, [r1]! 855; CHECK-NEXT: str r1, [r2] 856; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 857; CHECK-NEXT: vst1.64 {d18, d19}, [r0]! 858; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 859; CHECK-NEXT: bx lr 860 %ld = tail call %struct.uint64x2x3_t @llvm.arm.neon.vld1x3.v2i64.p0(ptr %a) 861 %tmp = getelementptr i64, ptr %a, i32 6 862 store ptr %tmp, ptr %ptr 863 ret %struct.uint64x2x3_t %ld 864} 865 866define %struct.uint64x2x4_t @test_vld1q_u64_x4_post_imm(ptr %a, ptr %ptr) nounwind { 867; CHECK-LABEL: test_vld1q_u64_x4_post_imm: 868; CHECK: vld1.64 {d16, d17, d18, d19}, [r1]! 869; CHECK-NEXT: vld1.64 {d20, d21, d22, d23}, [r1]! 870; CHECK-NEXT: str r1, [r2] 871; CHECK-NEXT: vst1.64 {d16, d17}, [r0]! 872; CHECK-NEXT: vst1.64 {d18, d19}, [r0]! 873; CHECK-NEXT: vst1.64 {d20, d21}, [r0]! 874; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 875; CHECK-NEXT: bx lr 876 %ld = tail call %struct.uint64x2x4_t @llvm.arm.neon.vld1x4.v2i64.p0(ptr %a) 877 %tmp = getelementptr i64, ptr %a, i32 8 878 store ptr %tmp, ptr %ptr 879 ret %struct.uint64x2x4_t %ld 880} 881 882define %struct.uint8x16x2_t @test_vld1q_u8_x2_post_imm(ptr %a, ptr %ptr) nounwind { 883; CHECK-LABEL: test_vld1q_u8_x2_post_imm: 884; CHECK: vld1.8 {d16, d17, d18, d19}, [r1]! 885; CHECK-NEXT: str r1, [r2] 886; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 887; CHECK-NEXT: vst1.64 {d18, d19}, [r0] 888; CHECK-NEXT: bx lr 889 %ld = tail call %struct.uint8x16x2_t @llvm.arm.neon.vld1x2.v16i8.p0(ptr %a) 890 %tmp = getelementptr i8, ptr %a, i32 32 891 store ptr %tmp, ptr %ptr 892 ret %struct.uint8x16x2_t %ld 893} 894 895define %struct.uint8x16x3_t @test_vld1q_u8_x3_post_imm(ptr %a, ptr %ptr) nounwind { 896; CHECK-LABEL: test_vld1q_u8_x3_post_imm: 897; CHECK: vld1.8 {d16, d17, d18}, [r1]! 898; CHECK-NEXT: vld1.8 {d19, d20, d21}, [r1]! 899; CHECK-NEXT: str r1, [r2] 900; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 901; CHECK-NEXT: vst1.8 {d18, d19}, [r0]! 902; CHECK-NEXT: vst1.64 {d20, d21}, [r0] 903; CHECK-NEXT: bx lr 904 %ld = tail call %struct.uint8x16x3_t @llvm.arm.neon.vld1x3.v16i8.p0(ptr %a) 905 %tmp = getelementptr i8, ptr %a, i32 48 906 store ptr %tmp, ptr %ptr 907 ret %struct.uint8x16x3_t %ld 908} 909 910define %struct.uint8x16x4_t @test_vld1q_u8_x4_post_imm(ptr %a, ptr %ptr) nounwind { 911; CHECK-LABEL: test_vld1q_u8_x4_post_imm: 912; CHECK: vld1.8 {d16, d17, d18, d19}, [r1]! 913; CHECK-NEXT: vld1.8 {d20, d21, d22, d23}, [r1]! 914; CHECK-NEXT: str r1, [r2] 915; CHECK-NEXT: vst1.8 {d16, d17}, [r0]! 916; CHECK-NEXT: vst1.8 {d18, d19}, [r0]! 917; CHECK-NEXT: vst1.8 {d20, d21}, [r0]! 918; CHECK-NEXT: vst1.64 {d22, d23}, [r0] 919; CHECK-NEXT: bx lr 920 %ld = tail call %struct.uint8x16x4_t @llvm.arm.neon.vld1x4.v16i8.p0(ptr %a) 921 %tmp = getelementptr i8, ptr %a, i32 64 922 store ptr %tmp, ptr %ptr 923 ret %struct.uint8x16x4_t %ld 924} 925