1672 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc < %s -global-isel=1 -global-isel-abort=1 -mtriple=arm64-eabi -aarch64-neon-syntax=apple -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5%struct.__neon_int8x8x2_t = type { <8 x i8>, <8 x i8> }6%struct.__neon_int8x8x3_t = type { <8 x i8>, <8 x i8>, <8 x i8> }7%struct.__neon_int8x8x4_t = type { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> }8 9define %struct.__neon_int8x8x2_t @ld2_8b(ptr %A) nounwind {10; CHECK-LABEL: ld2_8b:11; CHECK: // %bb.0:12; CHECK-NEXT: ld2.8b { v0, v1 }, [x0]13; CHECK-NEXT: ret14; Make sure we are loading into the results defined by the ABI (i.e., v0, v1)15; and from the argument of the function also defined by ABI (i.e., x0)16 %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)17 ret %struct.__neon_int8x8x2_t %tmp218}19 20define %struct.__neon_int8x8x3_t @ld3_8b(ptr %A) nounwind {21; CHECK-LABEL: ld3_8b:22; CHECK: // %bb.0:23; CHECK-NEXT: ld3.8b { v0, v1, v2 }, [x0]24; CHECK-NEXT: ret25; Make sure we are using the operands defined by the ABI26 %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)27 ret %struct.__neon_int8x8x3_t %tmp228}29 30define %struct.__neon_int8x8x4_t @ld4_8b(ptr %A) nounwind {31; CHECK-LABEL: ld4_8b:32; CHECK: // %bb.0:33; CHECK-NEXT: ld4.8b { v0, v1, v2, v3 }, [x0]34; CHECK-NEXT: ret35; Make sure we are using the operands defined by the ABI36 %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)37 ret %struct.__neon_int8x8x4_t %tmp238}39 40declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0(ptr) nounwind readonly41declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0(ptr) nounwind readonly42declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0(ptr) nounwind readonly43 44%struct.__neon_int8x16x2_t = type { <16 x i8>, <16 x i8> }45%struct.__neon_int8x16x3_t = type { <16 x i8>, <16 x i8>, <16 x i8> }46%struct.__neon_int8x16x4_t = type { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> }47 48define %struct.__neon_int8x16x2_t @ld2_16b(ptr %A) nounwind {49; CHECK-LABEL: ld2_16b:50; CHECK: // %bb.0:51; CHECK-NEXT: ld2.16b { v0, v1 }, [x0]52; CHECK-NEXT: ret53; Make sure we are using the operands defined by the ABI54 %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)55 ret %struct.__neon_int8x16x2_t %tmp256}57 58define %struct.__neon_int8x16x3_t @ld3_16b(ptr %A) nounwind {59; CHECK-LABEL: ld3_16b:60; CHECK: // %bb.0:61; CHECK-NEXT: ld3.16b { v0, v1, v2 }, [x0]62; CHECK-NEXT: ret63; Make sure we are using the operands defined by the ABI64 %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)65 ret %struct.__neon_int8x16x3_t %tmp266}67 68define %struct.__neon_int8x16x4_t @ld4_16b(ptr %A) nounwind {69; CHECK-LABEL: ld4_16b:70; CHECK: // %bb.0:71; CHECK-NEXT: ld4.16b { v0, v1, v2, v3 }, [x0]72; CHECK-NEXT: ret73; Make sure we are using the operands defined by the ABI74 %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)75 ret %struct.__neon_int8x16x4_t %tmp276}77 78declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0(ptr) nounwind readonly79declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0(ptr) nounwind readonly80declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0(ptr) nounwind readonly81 82%struct.__neon_int16x4x2_t = type { <4 x i16>, <4 x i16> }83%struct.__neon_int16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> }84%struct.__neon_int16x4x4_t = type { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }85 86define %struct.__neon_int16x4x2_t @ld2_4h(ptr %A) nounwind {87; CHECK-LABEL: ld2_4h:88; CHECK: // %bb.0:89; CHECK-NEXT: ld2.4h { v0, v1 }, [x0]90; CHECK-NEXT: ret91; Make sure we are using the operands defined by the ABI92 %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)93 ret %struct.__neon_int16x4x2_t %tmp294}95 96define %struct.__neon_int16x4x3_t @ld3_4h(ptr %A) nounwind {97; CHECK-LABEL: ld3_4h:98; CHECK: // %bb.0:99; CHECK-NEXT: ld3.4h { v0, v1, v2 }, [x0]100; CHECK-NEXT: ret101; Make sure we are using the operands defined by the ABI102 %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)103 ret %struct.__neon_int16x4x3_t %tmp2104}105 106define %struct.__neon_int16x4x4_t @ld4_4h(ptr %A) nounwind {107; CHECK-LABEL: ld4_4h:108; CHECK: // %bb.0:109; CHECK-NEXT: ld4.4h { v0, v1, v2, v3 }, [x0]110; CHECK-NEXT: ret111; Make sure we are using the operands defined by the ABI112 %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)113 ret %struct.__neon_int16x4x4_t %tmp2114}115 116declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0(ptr) nounwind readonly117declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0(ptr) nounwind readonly118declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0(ptr) nounwind readonly119 120%struct.__neon_int16x8x2_t = type { <8 x i16>, <8 x i16> }121%struct.__neon_int16x8x3_t = type { <8 x i16>, <8 x i16>, <8 x i16> }122%struct.__neon_int16x8x4_t = type { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }123 124define %struct.__neon_int16x8x2_t @ld2_8h(ptr %A) nounwind {125; CHECK-LABEL: ld2_8h:126; CHECK: // %bb.0:127; CHECK-NEXT: ld2.8h { v0, v1 }, [x0]128; CHECK-NEXT: ret129; Make sure we are using the operands defined by the ABI130 %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)131 ret %struct.__neon_int16x8x2_t %tmp2132}133 134define %struct.__neon_int16x8x3_t @ld3_8h(ptr %A) nounwind {135; CHECK-LABEL: ld3_8h:136; CHECK: // %bb.0:137; CHECK-NEXT: ld3.8h { v0, v1, v2 }, [x0]138; CHECK-NEXT: ret139; Make sure we are using the operands defined by the ABI140 %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)141 ret %struct.__neon_int16x8x3_t %tmp2142}143 144define %struct.__neon_int16x8x4_t @ld4_8h(ptr %A) nounwind {145; CHECK-LABEL: ld4_8h:146; CHECK: // %bb.0:147; CHECK-NEXT: ld4.8h { v0, v1, v2, v3 }, [x0]148; CHECK-NEXT: ret149; Make sure we are using the operands defined by the ABI150 %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)151 ret %struct.__neon_int16x8x4_t %tmp2152}153 154declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0(ptr) nounwind readonly155declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0(ptr) nounwind readonly156declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0(ptr) nounwind readonly157 158%struct.__neon_int32x2x2_t = type { <2 x i32>, <2 x i32> }159%struct.__neon_int32x2x3_t = type { <2 x i32>, <2 x i32>, <2 x i32> }160%struct.__neon_int32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> }161 162define %struct.__neon_int32x2x2_t @ld2_2s(ptr %A) nounwind {163; CHECK-LABEL: ld2_2s:164; CHECK: // %bb.0:165; CHECK-NEXT: ld2.2s { v0, v1 }, [x0]166; CHECK-NEXT: ret167; Make sure we are using the operands defined by the ABI168 %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)169 ret %struct.__neon_int32x2x2_t %tmp2170}171 172define %struct.__neon_int32x2x3_t @ld3_2s(ptr %A) nounwind {173; CHECK-LABEL: ld3_2s:174; CHECK: // %bb.0:175; CHECK-NEXT: ld3.2s { v0, v1, v2 }, [x0]176; CHECK-NEXT: ret177; Make sure we are using the operands defined by the ABI178 %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)179 ret %struct.__neon_int32x2x3_t %tmp2180}181 182define %struct.__neon_int32x2x4_t @ld4_2s(ptr %A) nounwind {183; CHECK-LABEL: ld4_2s:184; CHECK: // %bb.0:185; CHECK-NEXT: ld4.2s { v0, v1, v2, v3 }, [x0]186; CHECK-NEXT: ret187; Make sure we are using the operands defined by the ABI188 %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)189 ret %struct.__neon_int32x2x4_t %tmp2190}191 192declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0(ptr) nounwind readonly193declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0(ptr) nounwind readonly194declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0(ptr) nounwind readonly195 196%struct.__neon_int32x4x2_t = type { <4 x i32>, <4 x i32> }197%struct.__neon_int32x4x3_t = type { <4 x i32>, <4 x i32>, <4 x i32> }198%struct.__neon_int32x4x4_t = type { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> }199 200define %struct.__neon_int32x4x2_t @ld2_4s(ptr %A) nounwind {201; CHECK-LABEL: ld2_4s:202; CHECK: // %bb.0:203; CHECK-NEXT: ld2.4s { v0, v1 }, [x0]204; CHECK-NEXT: ret205; Make sure we are using the operands defined by the ABI206 %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)207 ret %struct.__neon_int32x4x2_t %tmp2208}209 210define %struct.__neon_int32x4x3_t @ld3_4s(ptr %A) nounwind {211; CHECK-LABEL: ld3_4s:212; CHECK: // %bb.0:213; CHECK-NEXT: ld3.4s { v0, v1, v2 }, [x0]214; CHECK-NEXT: ret215; Make sure we are using the operands defined by the ABI216 %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)217 ret %struct.__neon_int32x4x3_t %tmp2218}219 220define %struct.__neon_int32x4x4_t @ld4_4s(ptr %A) nounwind {221; CHECK-LABEL: ld4_4s:222; CHECK: // %bb.0:223; CHECK-NEXT: ld4.4s { v0, v1, v2, v3 }, [x0]224; CHECK-NEXT: ret225; Make sure we are using the operands defined by the ABI226 %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)227 ret %struct.__neon_int32x4x4_t %tmp2228}229 230declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0(ptr) nounwind readonly231declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0(ptr) nounwind readonly232declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0(ptr) nounwind readonly233 234%struct.__neon_int64x2x2_t = type { <2 x i64>, <2 x i64> }235%struct.__neon_int64x2x3_t = type { <2 x i64>, <2 x i64>, <2 x i64> }236%struct.__neon_int64x2x4_t = type { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> }237 238define %struct.__neon_int64x2x2_t @ld2_2d(ptr %A) nounwind {239; CHECK-LABEL: ld2_2d:240; CHECK: // %bb.0:241; CHECK-NEXT: ld2.2d { v0, v1 }, [x0]242; CHECK-NEXT: ret243; Make sure we are using the operands defined by the ABI244 %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)245 ret %struct.__neon_int64x2x2_t %tmp2246}247 248define %struct.__neon_int64x2x3_t @ld3_2d(ptr %A) nounwind {249; CHECK-LABEL: ld3_2d:250; CHECK: // %bb.0:251; CHECK-NEXT: ld3.2d { v0, v1, v2 }, [x0]252; CHECK-NEXT: ret253; Make sure we are using the operands defined by the ABI254 %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)255 ret %struct.__neon_int64x2x3_t %tmp2256}257 258define %struct.__neon_int64x2x4_t @ld4_2d(ptr %A) nounwind {259; CHECK-LABEL: ld4_2d:260; CHECK: // %bb.0:261; CHECK-NEXT: ld4.2d { v0, v1, v2, v3 }, [x0]262; CHECK-NEXT: ret263; Make sure we are using the operands defined by the ABI264 %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)265 ret %struct.__neon_int64x2x4_t %tmp2266}267 268declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0(ptr) nounwind readonly269declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0(ptr) nounwind readonly270declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0(ptr) nounwind readonly271 272%struct.__neon_int64x1x2_t = type { <1 x i64>, <1 x i64> }273%struct.__neon_int64x1x3_t = type { <1 x i64>, <1 x i64>, <1 x i64> }274%struct.__neon_int64x1x4_t = type { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> }275 276 277define %struct.__neon_int64x1x2_t @ld2_1di64(ptr %A) nounwind {278; CHECK-LABEL: ld2_1di64:279; CHECK: // %bb.0:280; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]281; CHECK-NEXT: ret282; Make sure we are using the operands defined by the ABI283 %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)284 ret %struct.__neon_int64x1x2_t %tmp2285}286 287define %struct.__neon_int64x1x3_t @ld3_1di64(ptr %A) nounwind {288; CHECK-LABEL: ld3_1di64:289; CHECK: // %bb.0:290; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]291; CHECK-NEXT: ret292; Make sure we are using the operands defined by the ABI293 %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)294 ret %struct.__neon_int64x1x3_t %tmp2295}296 297define %struct.__neon_int64x1x4_t @ld4_1di64(ptr %A) nounwind {298; CHECK-LABEL: ld4_1di64:299; CHECK: // %bb.0:300; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]301; CHECK-NEXT: ret302; Make sure we are using the operands defined by the ABI303 %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)304 ret %struct.__neon_int64x1x4_t %tmp2305}306 307 308declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0(ptr) nounwind readonly309declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0(ptr) nounwind readonly310declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0(ptr) nounwind readonly311 312%struct.__neon_float64x1x2_t = type { <1 x double>, <1 x double> }313%struct.__neon_float64x1x3_t = type { <1 x double>, <1 x double>, <1 x double> }314%struct.__neon_float64x1x4_t = type { <1 x double>, <1 x double>, <1 x double>, <1 x double> }315 316 317define %struct.__neon_float64x1x2_t @ld2_1df64(ptr %A) nounwind {318; CHECK-LABEL: ld2_1df64:319; CHECK: // %bb.0:320; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]321; CHECK-NEXT: ret322; Make sure we are using the operands defined by the ABI323 %tmp2 = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)324 ret %struct.__neon_float64x1x2_t %tmp2325}326 327define %struct.__neon_float64x1x3_t @ld3_1df64(ptr %A) nounwind {328; CHECK-LABEL: ld3_1df64:329; CHECK: // %bb.0:330; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]331; CHECK-NEXT: ret332; Make sure we are using the operands defined by the ABI333 %tmp2 = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)334 ret %struct.__neon_float64x1x3_t %tmp2335}336 337define %struct.__neon_float64x1x4_t @ld4_1df64(ptr %A) nounwind {338; CHECK-LABEL: ld4_1df64:339; CHECK: // %bb.0:340; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]341; CHECK-NEXT: ret342; Make sure we are using the operands defined by the ABI343 %tmp2 = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)344 ret %struct.__neon_float64x1x4_t %tmp2345}346 347declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0(ptr) nounwind readonly348declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0(ptr) nounwind readonly349declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0(ptr) nounwind readonly350 351 352define %struct.__neon_int8x16x2_t @ld2lane_16b(<16 x i8> %L1, <16 x i8> %L2, ptr %A) nounwind {353; Make sure we are using the operands defined by the ABI354; CHECK-SD-LABEL: ld2lane_16b:355; CHECK-SD: // %bb.0:356; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1357; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1358; CHECK-SD-NEXT: ld2.b { v0, v1 }[1], [x0]359; CHECK-SD-NEXT: ret360;361; CHECK-GI-LABEL: ld2lane_16b:362; CHECK-GI: // %bb.0:363; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1364; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1365; CHECK-GI-NEXT: ld2.b { v0, v1 }[1], [x0]366; CHECK-GI-NEXT: ret367 %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, i64 1, ptr %A)368 ret %struct.__neon_int8x16x2_t %tmp2369}370 371define %struct.__neon_int8x16x3_t @ld3lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, ptr %A) nounwind {372; Make sure we are using the operands defined by the ABI373; CHECK-SD-LABEL: ld3lane_16b:374; CHECK-SD: // %bb.0:375; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2376; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2377; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2378; CHECK-SD-NEXT: ld3.b { v0, v1, v2 }[1], [x0]379; CHECK-SD-NEXT: ret380;381; CHECK-GI-LABEL: ld3lane_16b:382; CHECK-GI: // %bb.0:383; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2384; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2385; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2386; CHECK-GI-NEXT: ld3.b { v0, v1, v2 }[1], [x0]387; CHECK-GI-NEXT: ret388 %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, i64 1, ptr %A)389 ret %struct.__neon_int8x16x3_t %tmp2390}391 392define %struct.__neon_int8x16x4_t @ld4lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, ptr %A) nounwind {393; Make sure we are using the operands defined by the ABI394; CHECK-SD-LABEL: ld4lane_16b:395; CHECK-SD: // %bb.0:396; CHECK-SD-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3397; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3398; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3399; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3400; CHECK-SD-NEXT: ld4.b { v0, v1, v2, v3 }[1], [x0]401; CHECK-SD-NEXT: ret402;403; CHECK-GI-LABEL: ld4lane_16b:404; CHECK-GI: // %bb.0:405; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3406; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3407; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3408; CHECK-GI-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3409; CHECK-GI-NEXT: ld4.b { v0, v1, v2, v3 }[1], [x0]410; CHECK-GI-NEXT: ret411 %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, i64 1, ptr %A)412 ret %struct.__neon_int8x16x4_t %tmp2413}414 415declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readonly416declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly417declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly418 419define %struct.__neon_int16x8x2_t @ld2lane_8h(<8 x i16> %L1, <8 x i16> %L2, ptr %A) nounwind {420; Make sure we are using the operands defined by the ABI421; CHECK-SD-LABEL: ld2lane_8h:422; CHECK-SD: // %bb.0:423; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1424; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1425; CHECK-SD-NEXT: ld2.h { v0, v1 }[1], [x0]426; CHECK-SD-NEXT: ret427;428; CHECK-GI-LABEL: ld2lane_8h:429; CHECK-GI: // %bb.0:430; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1431; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1432; CHECK-GI-NEXT: ld2.h { v0, v1 }[1], [x0]433; CHECK-GI-NEXT: ret434 %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, i64 1, ptr %A)435 ret %struct.__neon_int16x8x2_t %tmp2436}437 438define %struct.__neon_int16x8x3_t @ld3lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, ptr %A) nounwind {439; Make sure we are using the operands defined by the ABI440; CHECK-SD-LABEL: ld3lane_8h:441; CHECK-SD: // %bb.0:442; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2443; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2444; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2445; CHECK-SD-NEXT: ld3.h { v0, v1, v2 }[1], [x0]446; CHECK-SD-NEXT: ret447;448; CHECK-GI-LABEL: ld3lane_8h:449; CHECK-GI: // %bb.0:450; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2451; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2452; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2453; CHECK-GI-NEXT: ld3.h { v0, v1, v2 }[1], [x0]454; CHECK-GI-NEXT: ret455 %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, i64 1, ptr %A)456 ret %struct.__neon_int16x8x3_t %tmp2457}458 459define %struct.__neon_int16x8x4_t @ld4lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, ptr %A) nounwind {460; Make sure we are using the operands defined by the ABI461; CHECK-SD-LABEL: ld4lane_8h:462; CHECK-SD: // %bb.0:463; CHECK-SD-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3464; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3465; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3466; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3467; CHECK-SD-NEXT: ld4.h { v0, v1, v2, v3 }[1], [x0]468; CHECK-SD-NEXT: ret469;470; CHECK-GI-LABEL: ld4lane_8h:471; CHECK-GI: // %bb.0:472; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3473; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3474; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3475; CHECK-GI-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3476; CHECK-GI-NEXT: ld4.h { v0, v1, v2, v3 }[1], [x0]477; CHECK-GI-NEXT: ret478 %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, i64 1, ptr %A)479 ret %struct.__neon_int16x8x4_t %tmp2480}481 482declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readonly483declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly484declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly485 486define %struct.__neon_int32x4x2_t @ld2lane_4s(<4 x i32> %L1, <4 x i32> %L2, ptr %A) nounwind {487; Make sure we are using the operands defined by the ABI488; CHECK-SD-LABEL: ld2lane_4s:489; CHECK-SD: // %bb.0:490; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1491; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1492; CHECK-SD-NEXT: ld2.s { v0, v1 }[1], [x0]493; CHECK-SD-NEXT: ret494;495; CHECK-GI-LABEL: ld2lane_4s:496; CHECK-GI: // %bb.0:497; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1498; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1499; CHECK-GI-NEXT: ld2.s { v0, v1 }[1], [x0]500; CHECK-GI-NEXT: ret501 %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, i64 1, ptr %A)502 ret %struct.__neon_int32x4x2_t %tmp2503}504 505define %struct.__neon_int32x4x3_t @ld3lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, ptr %A) nounwind {506; Make sure we are using the operands defined by the ABI507; CHECK-SD-LABEL: ld3lane_4s:508; CHECK-SD: // %bb.0:509; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2510; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2511; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2512; CHECK-SD-NEXT: ld3.s { v0, v1, v2 }[1], [x0]513; CHECK-SD-NEXT: ret514;515; CHECK-GI-LABEL: ld3lane_4s:516; CHECK-GI: // %bb.0:517; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2518; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2519; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2520; CHECK-GI-NEXT: ld3.s { v0, v1, v2 }[1], [x0]521; CHECK-GI-NEXT: ret522 %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, i64 1, ptr %A)523 ret %struct.__neon_int32x4x3_t %tmp2524}525 526define %struct.__neon_int32x4x4_t @ld4lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, ptr %A) nounwind {527; Make sure we are using the operands defined by the ABI528; CHECK-SD-LABEL: ld4lane_4s:529; CHECK-SD: // %bb.0:530; CHECK-SD-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3531; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3532; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3533; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3534; CHECK-SD-NEXT: ld4.s { v0, v1, v2, v3 }[1], [x0]535; CHECK-SD-NEXT: ret536;537; CHECK-GI-LABEL: ld4lane_4s:538; CHECK-GI: // %bb.0:539; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3540; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3541; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3542; CHECK-GI-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3543; CHECK-GI-NEXT: ld4.s { v0, v1, v2, v3 }[1], [x0]544; CHECK-GI-NEXT: ret545 %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, i64 1, ptr %A)546 ret %struct.__neon_int32x4x4_t %tmp2547}548 549declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readonly550declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly551declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly552 553define %struct.__neon_int64x2x2_t @ld2lane_2d(<2 x i64> %L1, <2 x i64> %L2, ptr %A) nounwind {554; Make sure we are using the operands defined by the ABI555; CHECK-SD-LABEL: ld2lane_2d:556; CHECK-SD: // %bb.0:557; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1558; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1559; CHECK-SD-NEXT: ld2.d { v0, v1 }[1], [x0]560; CHECK-SD-NEXT: ret561;562; CHECK-GI-LABEL: ld2lane_2d:563; CHECK-GI: // %bb.0:564; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1565; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1566; CHECK-GI-NEXT: ld2.d { v0, v1 }[1], [x0]567; CHECK-GI-NEXT: ret568 %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, i64 1, ptr %A)569 ret %struct.__neon_int64x2x2_t %tmp2570}571 572define %struct.__neon_int64x2x3_t @ld3lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, ptr %A) nounwind {573; Make sure we are using the operands defined by the ABI574; CHECK-SD-LABEL: ld3lane_2d:575; CHECK-SD: // %bb.0:576; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2577; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2578; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2579; CHECK-SD-NEXT: ld3.d { v0, v1, v2 }[1], [x0]580; CHECK-SD-NEXT: ret581;582; CHECK-GI-LABEL: ld3lane_2d:583; CHECK-GI: // %bb.0:584; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2585; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2586; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2587; CHECK-GI-NEXT: ld3.d { v0, v1, v2 }[1], [x0]588; CHECK-GI-NEXT: ret589 %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, i64 1, ptr %A)590 ret %struct.__neon_int64x2x3_t %tmp2591}592 593define %struct.__neon_int64x2x4_t @ld4lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, ptr %A) nounwind {594; Make sure we are using the operands defined by the ABI595; CHECK-SD-LABEL: ld4lane_2d:596; CHECK-SD: // %bb.0:597; CHECK-SD-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3598; CHECK-SD-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3599; CHECK-SD-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3600; CHECK-SD-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3601; CHECK-SD-NEXT: ld4.d { v0, v1, v2, v3 }[1], [x0]602; CHECK-SD-NEXT: ret603;604; CHECK-GI-LABEL: ld4lane_2d:605; CHECK-GI: // %bb.0:606; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3607; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3608; CHECK-GI-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3609; CHECK-GI-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3610; CHECK-GI-NEXT: ld4.d { v0, v1, v2, v3 }[1], [x0]611; CHECK-GI-NEXT: ret612 %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, i64 1, ptr %A)613 ret %struct.__neon_int64x2x4_t %tmp2614}615 616declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readonly617declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly618declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly619 620define <8 x i8> @ld1r_8b(ptr %bar) {621; CHECK-LABEL: ld1r_8b:622; CHECK: // %bb.0:623; CHECK-NEXT: ld1r.8b { v0 }, [x0]624; CHECK-NEXT: ret625; Make sure we are using the operands defined by the ABI626 %tmp1 = load i8, ptr %bar627 %tmp2 = insertelement <8 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0628 %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1629 %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2630 %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3631 %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4632 %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5633 %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6634 %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7635 ret <8 x i8> %tmp9636}637 638define <16 x i8> @ld1r_16b(ptr %bar) {639; CHECK-LABEL: ld1r_16b:640; CHECK: // %bb.0:641; CHECK-NEXT: ld1r.16b { v0 }, [x0]642; CHECK-NEXT: ret643; Make sure we are using the operands defined by the ABI644 %tmp1 = load i8, ptr %bar645 %tmp2 = insertelement <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0646 %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1647 %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2648 %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3649 %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4650 %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5651 %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6652 %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7653 %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8654 %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9655 %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10656 %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11657 %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12658 %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13659 %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14660 %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15661 ret <16 x i8> %tmp17662}663 664define <4 x i16> @ld1r_4h(ptr %bar) {665; CHECK-LABEL: ld1r_4h:666; CHECK: // %bb.0:667; CHECK-NEXT: ld1r.4h { v0 }, [x0]668; CHECK-NEXT: ret669; Make sure we are using the operands defined by the ABI670 %tmp1 = load i16, ptr %bar671 %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0672 %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1673 %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2674 %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3675 ret <4 x i16> %tmp5676}677 678define <8 x i16> @ld1r_8h(ptr %bar) {679; CHECK-LABEL: ld1r_8h:680; CHECK: // %bb.0:681; CHECK-NEXT: ld1r.8h { v0 }, [x0]682; CHECK-NEXT: ret683; Make sure we are using the operands defined by the ABI684 %tmp1 = load i16, ptr %bar685 %tmp2 = insertelement <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0686 %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1687 %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2688 %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3689 %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4690 %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5691 %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6692 %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7693 ret <8 x i16> %tmp9694}695 696define <2 x i32> @ld1r_2s(ptr %bar) {697; CHECK-LABEL: ld1r_2s:698; CHECK: // %bb.0:699; CHECK-NEXT: ld1r.2s { v0 }, [x0]700; CHECK-NEXT: ret701; Make sure we are using the operands defined by the ABI702 %tmp1 = load i32, ptr %bar703 %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0704 %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1705 ret <2 x i32> %tmp3706}707 708define <4 x i32> @ld1r_4s(ptr %bar) {709; CHECK-LABEL: ld1r_4s:710; CHECK: // %bb.0:711; CHECK-NEXT: ld1r.4s { v0 }, [x0]712; CHECK-NEXT: ret713; Make sure we are using the operands defined by the ABI714 %tmp1 = load i32, ptr %bar715 %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0716 %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1717 %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2718 %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3719 ret <4 x i32> %tmp5720}721 722define <2 x i64> @ld1r_2d(ptr %bar) {723; CHECK-LABEL: ld1r_2d:724; CHECK: // %bb.0:725; CHECK-NEXT: ld1r.2d { v0 }, [x0]726; CHECK-NEXT: ret727; Make sure we are using the operands defined by the ABI728 %tmp1 = load i64, ptr %bar729 %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0730 %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1731 ret <2 x i64> %tmp3732}733 734define %struct.__neon_int8x8x2_t @ld2r_8b(ptr %A) nounwind {735; CHECK-LABEL: ld2r_8b:736; CHECK: // %bb.0:737; CHECK-NEXT: ld2r.8b { v0, v1 }, [x0]738; CHECK-NEXT: ret739; Make sure we are using the operands defined by the ABI740 %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)741 ret %struct.__neon_int8x8x2_t %tmp2742}743 744define %struct.__neon_int8x8x3_t @ld3r_8b(ptr %A) nounwind {745; CHECK-LABEL: ld3r_8b:746; CHECK: // %bb.0:747; CHECK-NEXT: ld3r.8b { v0, v1, v2 }, [x0]748; CHECK-NEXT: ret749; Make sure we are using the operands defined by the ABI750 %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)751 ret %struct.__neon_int8x8x3_t %tmp2752}753 754define %struct.__neon_int8x8x4_t @ld4r_8b(ptr %A) nounwind {755; CHECK-LABEL: ld4r_8b:756; CHECK: // %bb.0:757; CHECK-NEXT: ld4r.8b { v0, v1, v2, v3 }, [x0]758; CHECK-NEXT: ret759; Make sure we are using the operands defined by the ABI760 %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)761 ret %struct.__neon_int8x8x4_t %tmp2762}763 764declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0(ptr) nounwind readonly765declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0(ptr) nounwind readonly766declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0(ptr) nounwind readonly767 768define %struct.__neon_int8x16x2_t @ld2r_16b(ptr %A) nounwind {769; CHECK-LABEL: ld2r_16b:770; CHECK: // %bb.0:771; CHECK-NEXT: ld2r.16b { v0, v1 }, [x0]772; CHECK-NEXT: ret773; Make sure we are using the operands defined by the ABI774 %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)775 ret %struct.__neon_int8x16x2_t %tmp2776}777 778define %struct.__neon_int8x16x3_t @ld3r_16b(ptr %A) nounwind {779; CHECK-LABEL: ld3r_16b:780; CHECK: // %bb.0:781; CHECK-NEXT: ld3r.16b { v0, v1, v2 }, [x0]782; CHECK-NEXT: ret783; Make sure we are using the operands defined by the ABI784 %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)785 ret %struct.__neon_int8x16x3_t %tmp2786}787 788define %struct.__neon_int8x16x4_t @ld4r_16b(ptr %A) nounwind {789; CHECK-LABEL: ld4r_16b:790; CHECK: // %bb.0:791; CHECK-NEXT: ld4r.16b { v0, v1, v2, v3 }, [x0]792; CHECK-NEXT: ret793; Make sure we are using the operands defined by the ABI794 %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)795 ret %struct.__neon_int8x16x4_t %tmp2796}797 798declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0(ptr) nounwind readonly799declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0(ptr) nounwind readonly800declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0(ptr) nounwind readonly801 802define %struct.__neon_int16x4x2_t @ld2r_4h(ptr %A) nounwind {803; CHECK-LABEL: ld2r_4h:804; CHECK: // %bb.0:805; CHECK-NEXT: ld2r.4h { v0, v1 }, [x0]806; CHECK-NEXT: ret807; Make sure we are using the operands defined by the ABI808 %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)809 ret %struct.__neon_int16x4x2_t %tmp2810}811 812define %struct.__neon_int16x4x3_t @ld3r_4h(ptr %A) nounwind {813; CHECK-LABEL: ld3r_4h:814; CHECK: // %bb.0:815; CHECK-NEXT: ld3r.4h { v0, v1, v2 }, [x0]816; CHECK-NEXT: ret817; Make sure we are using the operands defined by the ABI818 %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)819 ret %struct.__neon_int16x4x3_t %tmp2820}821 822define %struct.__neon_int16x4x4_t @ld4r_4h(ptr %A) nounwind {823; CHECK-LABEL: ld4r_4h:824; CHECK: // %bb.0:825; CHECK-NEXT: ld4r.4h { v0, v1, v2, v3 }, [x0]826; CHECK-NEXT: ret827; Make sure we are using the operands defined by the ABI828 %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)829 ret %struct.__neon_int16x4x4_t %tmp2830}831 832declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0(ptr) nounwind readonly833declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0(ptr) nounwind readonly834declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0(ptr) nounwind readonly835 836define %struct.__neon_int16x8x2_t @ld2r_8h(ptr %A) nounwind {837; CHECK-LABEL: ld2r_8h:838; CHECK: // %bb.0:839; CHECK-NEXT: ld2r.8h { v0, v1 }, [x0]840; CHECK-NEXT: ret841; Make sure we are using the operands defined by the ABI842 %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)843 ret %struct.__neon_int16x8x2_t %tmp2844}845 846define %struct.__neon_int16x8x3_t @ld3r_8h(ptr %A) nounwind {847; CHECK-LABEL: ld3r_8h:848; CHECK: // %bb.0:849; CHECK-NEXT: ld3r.8h { v0, v1, v2 }, [x0]850; CHECK-NEXT: ret851; Make sure we are using the operands defined by the ABI852 %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)853 ret %struct.__neon_int16x8x3_t %tmp2854}855 856define %struct.__neon_int16x8x4_t @ld4r_8h(ptr %A) nounwind {857; CHECK-LABEL: ld4r_8h:858; CHECK: // %bb.0:859; CHECK-NEXT: ld4r.8h { v0, v1, v2, v3 }, [x0]860; CHECK-NEXT: ret861; Make sure we are using the operands defined by the ABI862 %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)863 ret %struct.__neon_int16x8x4_t %tmp2864}865 866declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0(ptr) nounwind readonly867declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0(ptr) nounwind readonly868declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0(ptr) nounwind readonly869 870define %struct.__neon_int32x2x2_t @ld2r_2s(ptr %A) nounwind {871; CHECK-LABEL: ld2r_2s:872; CHECK: // %bb.0:873; CHECK-NEXT: ld2r.2s { v0, v1 }, [x0]874; CHECK-NEXT: ret875; Make sure we are using the operands defined by the ABI876 %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)877 ret %struct.__neon_int32x2x2_t %tmp2878}879 880define %struct.__neon_int32x2x3_t @ld3r_2s(ptr %A) nounwind {881; CHECK-LABEL: ld3r_2s:882; CHECK: // %bb.0:883; CHECK-NEXT: ld3r.2s { v0, v1, v2 }, [x0]884; CHECK-NEXT: ret885; Make sure we are using the operands defined by the ABI886 %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)887 ret %struct.__neon_int32x2x3_t %tmp2888}889 890define %struct.__neon_int32x2x4_t @ld4r_2s(ptr %A) nounwind {891; CHECK-LABEL: ld4r_2s:892; CHECK: // %bb.0:893; CHECK-NEXT: ld4r.2s { v0, v1, v2, v3 }, [x0]894; CHECK-NEXT: ret895; Make sure we are using the operands defined by the ABI896 %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)897 ret %struct.__neon_int32x2x4_t %tmp2898}899 900declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0(ptr) nounwind readonly901declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0(ptr) nounwind readonly902declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0(ptr) nounwind readonly903 904define %struct.__neon_int32x4x2_t @ld2r_4s(ptr %A) nounwind {905; CHECK-LABEL: ld2r_4s:906; CHECK: // %bb.0:907; CHECK-NEXT: ld2r.4s { v0, v1 }, [x0]908; CHECK-NEXT: ret909; Make sure we are using the operands defined by the ABI910 %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)911 ret %struct.__neon_int32x4x2_t %tmp2912}913 914define %struct.__neon_int32x4x3_t @ld3r_4s(ptr %A) nounwind {915; CHECK-LABEL: ld3r_4s:916; CHECK: // %bb.0:917; CHECK-NEXT: ld3r.4s { v0, v1, v2 }, [x0]918; CHECK-NEXT: ret919; Make sure we are using the operands defined by the ABI920 %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)921 ret %struct.__neon_int32x4x3_t %tmp2922}923 924define %struct.__neon_int32x4x4_t @ld4r_4s(ptr %A) nounwind {925; CHECK-LABEL: ld4r_4s:926; CHECK: // %bb.0:927; CHECK-NEXT: ld4r.4s { v0, v1, v2, v3 }, [x0]928; CHECK-NEXT: ret929; Make sure we are using the operands defined by the ABI930 %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)931 ret %struct.__neon_int32x4x4_t %tmp2932}933 934declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0(ptr) nounwind readonly935declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0(ptr) nounwind readonly936declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0(ptr) nounwind readonly937 938define %struct.__neon_int64x1x2_t @ld2r_1d(ptr %A) nounwind {939; CHECK-LABEL: ld2r_1d:940; CHECK: // %bb.0:941; CHECK-NEXT: ld2r.1d { v0, v1 }, [x0]942; CHECK-NEXT: ret943; Make sure we are using the operands defined by the ABI944 %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)945 ret %struct.__neon_int64x1x2_t %tmp2946}947 948define %struct.__neon_int64x1x3_t @ld3r_1d(ptr %A) nounwind {949; CHECK-LABEL: ld3r_1d:950; CHECK: // %bb.0:951; CHECK-NEXT: ld3r.1d { v0, v1, v2 }, [x0]952; CHECK-NEXT: ret953; Make sure we are using the operands defined by the ABI954 %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)955 ret %struct.__neon_int64x1x3_t %tmp2956}957 958define %struct.__neon_int64x1x4_t @ld4r_1d(ptr %A) nounwind {959; CHECK-LABEL: ld4r_1d:960; CHECK: // %bb.0:961; CHECK-NEXT: ld4r.1d { v0, v1, v2, v3 }, [x0]962; CHECK-NEXT: ret963; Make sure we are using the operands defined by the ABI964 %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)965 ret %struct.__neon_int64x1x4_t %tmp2966}967 968declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0(ptr) nounwind readonly969declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0(ptr) nounwind readonly970declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0(ptr) nounwind readonly971 972define %struct.__neon_int64x2x2_t @ld2r_2d(ptr %A) nounwind {973; CHECK-LABEL: ld2r_2d:974; CHECK: // %bb.0:975; CHECK-NEXT: ld2r.2d { v0, v1 }, [x0]976; CHECK-NEXT: ret977; Make sure we are using the operands defined by the ABI978 %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)979 ret %struct.__neon_int64x2x2_t %tmp2980}981 982define %struct.__neon_int64x2x3_t @ld3r_2d(ptr %A) nounwind {983; CHECK-LABEL: ld3r_2d:984; CHECK: // %bb.0:985; CHECK-NEXT: ld3r.2d { v0, v1, v2 }, [x0]986; CHECK-NEXT: ret987; Make sure we are using the operands defined by the ABI988 %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)989 ret %struct.__neon_int64x2x3_t %tmp2990}991 992define %struct.__neon_int64x2x4_t @ld4r_2d(ptr %A) nounwind {993; CHECK-LABEL: ld4r_2d:994; CHECK: // %bb.0:995; CHECK-NEXT: ld4r.2d { v0, v1, v2, v3 }, [x0]996; CHECK-NEXT: ret997; Make sure we are using the operands defined by the ABI998 %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)999 ret %struct.__neon_int64x2x4_t %tmp21000}1001 1002declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0(ptr) nounwind readonly1003declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0(ptr) nounwind readonly1004declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0(ptr) nounwind readonly1005 1006define <16 x i8> @ld1_16b(<16 x i8> %V, ptr %bar) {1007; CHECK-LABEL: ld1_16b:1008; CHECK: // %bb.0:1009; CHECK-NEXT: ld1.b { v0 }[0], [x0]1010; CHECK-NEXT: ret1011; Make sure we are using the operands defined by the ABI1012 %tmp1 = load i8, ptr %bar1013 %tmp2 = insertelement <16 x i8> %V, i8 %tmp1, i32 01014 ret <16 x i8> %tmp21015}1016 1017define <8 x i16> @ld1_8h(<8 x i16> %V, ptr %bar) {1018; CHECK-LABEL: ld1_8h:1019; CHECK: // %bb.0:1020; CHECK-NEXT: ld1.h { v0 }[0], [x0]1021; CHECK-NEXT: ret1022; Make sure we are using the operands defined by the ABI1023 %tmp1 = load i16, ptr %bar1024 %tmp2 = insertelement <8 x i16> %V, i16 %tmp1, i32 01025 ret <8 x i16> %tmp21026}1027 1028define <4 x i32> @ld1_4s(<4 x i32> %V, ptr %bar) {1029; CHECK-LABEL: ld1_4s:1030; CHECK: // %bb.0:1031; CHECK-NEXT: ld1.s { v0 }[0], [x0]1032; CHECK-NEXT: ret1033; Make sure we are using the operands defined by the ABI1034 %tmp1 = load i32, ptr %bar1035 %tmp2 = insertelement <4 x i32> %V, i32 %tmp1, i32 01036 ret <4 x i32> %tmp21037}1038 1039define <4 x float> @ld1_4s_float(<4 x float> %V, ptr %bar) {1040; CHECK-LABEL: ld1_4s_float:1041; CHECK: // %bb.0:1042; CHECK-NEXT: ld1.s { v0 }[0], [x0]1043; CHECK-NEXT: ret1044; Make sure we are using the operands defined by the ABI1045 %tmp1 = load float, ptr %bar1046 %tmp2 = insertelement <4 x float> %V, float %tmp1, i32 01047 ret <4 x float> %tmp21048}1049 1050define <2 x i64> @ld1_2d(<2 x i64> %V, ptr %bar) {1051; CHECK-LABEL: ld1_2d:1052; CHECK: // %bb.0:1053; CHECK-NEXT: ld1.d { v0 }[0], [x0]1054; CHECK-NEXT: ret1055; Make sure we are using the operands defined by the ABI1056 %tmp1 = load i64, ptr %bar1057 %tmp2 = insertelement <2 x i64> %V, i64 %tmp1, i32 01058 ret <2 x i64> %tmp21059}1060 1061define <2 x double> @ld1_2d_double(<2 x double> %V, ptr %bar) {1062; CHECK-LABEL: ld1_2d_double:1063; CHECK: // %bb.0:1064; CHECK-NEXT: ld1.d { v0 }[0], [x0]1065; CHECK-NEXT: ret1066; Make sure we are using the operands defined by the ABI1067 %tmp1 = load double, ptr %bar1068 %tmp2 = insertelement <2 x double> %V, double %tmp1, i32 01069 ret <2 x double> %tmp21070}1071 1072define <1 x i64> @ld1_1d(ptr %p) {1073; CHECK-LABEL: ld1_1d:1074; CHECK: // %bb.0:1075; CHECK-NEXT: ldr d0, [x0]1076; CHECK-NEXT: ret1077; Make sure we are using the operands defined by the ABI1078 %tmp = load <1 x i64>, ptr %p, align 81079 ret <1 x i64> %tmp1080}1081 1082define <8 x i8> @ld1_8b(<8 x i8> %V, ptr %bar) {1083; CHECK-LABEL: ld1_8b:1084; CHECK: // %bb.0:1085; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01086; CHECK-NEXT: ld1.b { v0 }[0], [x0]1087; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01088; CHECK-NEXT: ret1089; Make sure we are using the operands defined by the ABI1090 %tmp1 = load i8, ptr %bar1091 %tmp2 = insertelement <8 x i8> %V, i8 %tmp1, i32 01092 ret <8 x i8> %tmp21093}1094 1095define <4 x i16> @ld1_4h(<4 x i16> %V, ptr %bar) {1096; CHECK-LABEL: ld1_4h:1097; CHECK: // %bb.0:1098; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01099; CHECK-NEXT: ld1.h { v0 }[0], [x0]1100; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01101; CHECK-NEXT: ret1102; Make sure we are using the operands defined by the ABI1103 %tmp1 = load i16, ptr %bar1104 %tmp2 = insertelement <4 x i16> %V, i16 %tmp1, i32 01105 ret <4 x i16> %tmp21106}1107 1108define <2 x i32> @ld1_2s(<2 x i32> %V, ptr %bar) {1109; CHECK-LABEL: ld1_2s:1110; CHECK: // %bb.0:1111; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01112; CHECK-NEXT: ld1.s { v0 }[0], [x0]1113; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01114; CHECK-NEXT: ret1115; Make sure we are using the operands defined by the ABI1116 %tmp1 = load i32, ptr %bar1117 %tmp2 = insertelement <2 x i32> %V, i32 %tmp1, i32 01118 ret <2 x i32> %tmp21119}1120 1121define <2 x float> @ld1_2s_float(<2 x float> %V, ptr %bar) {1122; CHECK-LABEL: ld1_2s_float:1123; CHECK: // %bb.0:1124; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01125; CHECK-NEXT: ld1.s { v0 }[0], [x0]1126; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01127; CHECK-NEXT: ret1128; Make sure we are using the operands defined by the ABI1129 %tmp1 = load float, ptr %bar1130 %tmp2 = insertelement <2 x float> %V, float %tmp1, i32 01131 ret <2 x float> %tmp21132}1133 1134 1135; Add rdar://13098923 test case: vld1_dup_u32 doesn't generate ld1r.2s1136define void @ld1r_2s_from_dup(ptr nocapture %a, ptr nocapture %b, ptr nocapture %diff) nounwind ssp {1137; CHECK-SD-LABEL: ld1r_2s_from_dup:1138; CHECK-SD: // %bb.0: // %entry1139; CHECK-SD-NEXT: ldr s0, [x0]1140; CHECK-SD-NEXT: ldr s1, [x1]1141; CHECK-SD-NEXT: usubl.8h v0, v0, v11142; CHECK-SD-NEXT: str d0, [x2]1143; CHECK-SD-NEXT: ret1144;1145; CHECK-GI-LABEL: ld1r_2s_from_dup:1146; CHECK-GI: // %bb.0: // %entry1147; CHECK-GI-NEXT: ld1r.2s { v0 }, [x0]1148; CHECK-GI-NEXT: ld1r.2s { v1 }, [x1]1149; CHECK-GI-NEXT: usubl.8h v0, v0, v11150; CHECK-GI-NEXT: str d0, [x2]1151; CHECK-GI-NEXT: ret1152entry:1153 %tmp1 = load i32, ptr %a, align 41154 %tmp2 = insertelement <2 x i32> undef, i32 %tmp1, i32 01155 %lane = shufflevector <2 x i32> %tmp2, <2 x i32> undef, <2 x i32> zeroinitializer1156 %tmp3 = bitcast <2 x i32> %lane to <8 x i8>1157 %tmp5 = load i32, ptr %b, align 41158 %tmp6 = insertelement <2 x i32> undef, i32 %tmp5, i32 01159 %lane1 = shufflevector <2 x i32> %tmp6, <2 x i32> undef, <2 x i32> zeroinitializer1160 %tmp7 = bitcast <2 x i32> %lane1 to <8 x i8>1161 %vmovl.i.i = zext <8 x i8> %tmp3 to <8 x i16>1162 %vmovl.i4.i = zext <8 x i8> %tmp7 to <8 x i16>1163 %sub.i = sub <8 x i16> %vmovl.i.i, %vmovl.i4.i1164 %tmp8 = bitcast <8 x i16> %sub.i to <2 x i64>1165 %shuffle.i = shufflevector <2 x i64> %tmp8, <2 x i64> undef, <1 x i32> zeroinitializer1166 %tmp9 = bitcast <1 x i64> %shuffle.i to <4 x i16>1167 store <4 x i16> %tmp9, ptr %diff, align 81168 ret void1169}1170 1171; Tests for rdar://11947069: vld1_dup_* and vld1q_dup_* code gen is suboptimal1172define <4 x float> @ld1r_4s_float(ptr nocapture %x) {1173; CHECK-LABEL: ld1r_4s_float:1174; CHECK: // %bb.0: // %entry1175; CHECK-NEXT: ld1r.4s { v0 }, [x0]1176; CHECK-NEXT: ret1177entry:1178; Make sure we are using the operands defined by the ABI1179 %tmp = load float, ptr %x, align 41180 %tmp1 = insertelement <4 x float> undef, float %tmp, i32 01181 %tmp2 = insertelement <4 x float> %tmp1, float %tmp, i32 11182 %tmp3 = insertelement <4 x float> %tmp2, float %tmp, i32 21183 %tmp4 = insertelement <4 x float> %tmp3, float %tmp, i32 31184 ret <4 x float> %tmp41185}1186 1187define <2 x float> @ld1r_2s_float(ptr nocapture %x) {1188; CHECK-LABEL: ld1r_2s_float:1189; CHECK: // %bb.0: // %entry1190; CHECK-NEXT: ld1r.2s { v0 }, [x0]1191; CHECK-NEXT: ret1192entry:1193; Make sure we are using the operands defined by the ABI1194 %tmp = load float, ptr %x, align 41195 %tmp1 = insertelement <2 x float> undef, float %tmp, i32 01196 %tmp2 = insertelement <2 x float> %tmp1, float %tmp, i32 11197 ret <2 x float> %tmp21198}1199 1200define <2 x double> @ld1r_2d_double(ptr nocapture %x) {1201; CHECK-LABEL: ld1r_2d_double:1202; CHECK: // %bb.0: // %entry1203; CHECK-NEXT: ld1r.2d { v0 }, [x0]1204; CHECK-NEXT: ret1205entry:1206; Make sure we are using the operands defined by the ABI1207 %tmp = load double, ptr %x, align 41208 %tmp1 = insertelement <2 x double> undef, double %tmp, i32 01209 %tmp2 = insertelement <2 x double> %tmp1, double %tmp, i32 11210 ret <2 x double> %tmp21211}1212 1213define <1 x double> @ld1r_1d_double(ptr nocapture %x) {1214; CHECK-LABEL: ld1r_1d_double:1215; CHECK: // %bb.0: // %entry1216; CHECK-NEXT: ldr d0, [x0]1217; CHECK-NEXT: ret1218entry:1219; Make sure we are using the operands defined by the ABI1220 %tmp = load double, ptr %x, align 41221 %tmp1 = insertelement <1 x double> undef, double %tmp, i32 01222 ret <1 x double> %tmp11223}1224 1225define <4 x float> @ld1r_4s_float_shuff(ptr nocapture %x) {1226; CHECK-LABEL: ld1r_4s_float_shuff:1227; CHECK: // %bb.0: // %entry1228; CHECK-NEXT: ld1r.4s { v0 }, [x0]1229; CHECK-NEXT: ret1230entry:1231; Make sure we are using the operands defined by the ABI1232 %tmp = load float, ptr %x, align 41233 %tmp1 = insertelement <4 x float> undef, float %tmp, i32 01234 %lane = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer1235 ret <4 x float> %lane1236}1237 1238define <2 x float> @ld1r_2s_float_shuff(ptr nocapture %x) {1239; CHECK-LABEL: ld1r_2s_float_shuff:1240; CHECK: // %bb.0: // %entry1241; CHECK-NEXT: ld1r.2s { v0 }, [x0]1242; CHECK-NEXT: ret1243entry:1244; Make sure we are using the operands defined by the ABI1245 %tmp = load float, ptr %x, align 41246 %tmp1 = insertelement <2 x float> undef, float %tmp, i32 01247 %lane = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer1248 ret <2 x float> %lane1249}1250 1251define <2 x double> @ld1r_2d_double_shuff(ptr nocapture %x) {1252; CHECK-LABEL: ld1r_2d_double_shuff:1253; CHECK: // %bb.0: // %entry1254; CHECK-NEXT: ld1r.2d { v0 }, [x0]1255; CHECK-NEXT: ret1256entry:1257; Make sure we are using the operands defined by the ABI1258 %tmp = load double, ptr %x, align 41259 %tmp1 = insertelement <2 x double> undef, double %tmp, i32 01260 %lane = shufflevector <2 x double> %tmp1, <2 x double> undef, <2 x i32> zeroinitializer1261 ret <2 x double> %lane1262}1263 1264define <1 x double> @ld1r_1d_double_shuff(ptr nocapture %x) {1265; CHECK-LABEL: ld1r_1d_double_shuff:1266; CHECK: // %bb.0: // %entry1267; CHECK-NEXT: ldr d0, [x0]1268; CHECK-NEXT: ret1269entry:1270; Make sure we are using the operands defined by the ABI1271 %tmp = load double, ptr %x, align 41272 %tmp1 = insertelement <1 x double> undef, double %tmp, i32 01273 %lane = shufflevector <1 x double> %tmp1, <1 x double> undef, <1 x i32> zeroinitializer1274 ret <1 x double> %lane1275}1276 1277%struct.__neon_float32x2x2_t = type { <2 x float>, <2 x float> }1278%struct.__neon_float32x2x3_t = type { <2 x float>, <2 x float>, <2 x float> }1279%struct.__neon_float32x2x4_t = type { <2 x float>, <2 x float>, <2 x float>, <2 x float> }1280 1281declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr) nounwind readonly1282declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr) nounwind readonly1283declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr) nounwind readonly1284declare %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr) nounwind readonly1285declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr) nounwind readonly1286declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr) nounwind readonly1287 1288define %struct.__neon_int8x8x2_t @ld1_x2_v8i8(ptr %addr) {1289; CHECK-LABEL: ld1_x2_v8i8:1290; CHECK: // %bb.0:1291; CHECK-NEXT: ld1.8b { v0, v1 }, [x0]1292; CHECK-NEXT: ret1293 %val = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %addr)1294 ret %struct.__neon_int8x8x2_t %val1295}1296 1297define %struct.__neon_int16x4x2_t @ld1_x2_v4i16(ptr %addr) {1298; CHECK-LABEL: ld1_x2_v4i16:1299; CHECK: // %bb.0:1300; CHECK-NEXT: ld1.4h { v0, v1 }, [x0]1301; CHECK-NEXT: ret1302 %val = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %addr)1303 ret %struct.__neon_int16x4x2_t %val1304}1305 1306define %struct.__neon_int32x2x2_t @ld1_x2_v2i32(ptr %addr) {1307; CHECK-LABEL: ld1_x2_v2i32:1308; CHECK: // %bb.0:1309; CHECK-NEXT: ld1.2s { v0, v1 }, [x0]1310; CHECK-NEXT: ret1311 %val = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %addr)1312 ret %struct.__neon_int32x2x2_t %val1313}1314 1315define %struct.__neon_float32x2x2_t @ld1_x2_v2f32(ptr %addr) {1316; CHECK-LABEL: ld1_x2_v2f32:1317; CHECK: // %bb.0:1318; CHECK-NEXT: ld1.2s { v0, v1 }, [x0]1319; CHECK-NEXT: ret1320 %val = call %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %addr)1321 ret %struct.__neon_float32x2x2_t %val1322}1323 1324define %struct.__neon_int64x1x2_t @ld1_x2_v1i64(ptr %addr) {1325; CHECK-LABEL: ld1_x2_v1i64:1326; CHECK: // %bb.0:1327; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]1328; CHECK-NEXT: ret1329 %val = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %addr)1330 ret %struct.__neon_int64x1x2_t %val1331}1332 1333define %struct.__neon_float64x1x2_t @ld1_x2_v1f64(ptr %addr) {1334; CHECK-LABEL: ld1_x2_v1f64:1335; CHECK: // %bb.0:1336; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]1337; CHECK-NEXT: ret1338 %val = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %addr)1339 ret %struct.__neon_float64x1x2_t %val1340}1341 1342 1343%struct.__neon_float32x4x2_t = type { <4 x float>, <4 x float> }1344%struct.__neon_float32x4x3_t = type { <4 x float>, <4 x float>, <4 x float> }1345%struct.__neon_float32x4x4_t = type { <4 x float>, <4 x float>, <4 x float>, <4 x float> }1346 1347%struct.__neon_float64x2x2_t = type { <2 x double>, <2 x double> }1348%struct.__neon_float64x2x3_t = type { <2 x double>, <2 x double>, <2 x double> }1349%struct.__neon_float64x2x4_t = type { <2 x double>, <2 x double>, <2 x double>, <2 x double> }1350 1351declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr) nounwind readonly1352declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr) nounwind readonly1353declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr) nounwind readonly1354declare %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr) nounwind readonly1355declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr) nounwind readonly1356declare %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr) nounwind readonly1357 1358define %struct.__neon_int8x16x2_t @ld1_x2_v16i8(ptr %addr) {1359; CHECK-LABEL: ld1_x2_v16i8:1360; CHECK: // %bb.0:1361; CHECK-NEXT: ld1.16b { v0, v1 }, [x0]1362; CHECK-NEXT: ret1363 %val = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %addr)1364 ret %struct.__neon_int8x16x2_t %val1365}1366 1367define %struct.__neon_int16x8x2_t @ld1_x2_v8i16(ptr %addr) {1368; CHECK-LABEL: ld1_x2_v8i16:1369; CHECK: // %bb.0:1370; CHECK-NEXT: ld1.8h { v0, v1 }, [x0]1371; CHECK-NEXT: ret1372 %val = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %addr)1373 ret %struct.__neon_int16x8x2_t %val1374}1375 1376define %struct.__neon_int32x4x2_t @ld1_x2_v4i32(ptr %addr) {1377; CHECK-LABEL: ld1_x2_v4i32:1378; CHECK: // %bb.0:1379; CHECK-NEXT: ld1.4s { v0, v1 }, [x0]1380; CHECK-NEXT: ret1381 %val = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %addr)1382 ret %struct.__neon_int32x4x2_t %val1383}1384 1385define %struct.__neon_float32x4x2_t @ld1_x2_v4f32(ptr %addr) {1386; CHECK-LABEL: ld1_x2_v4f32:1387; CHECK: // %bb.0:1388; CHECK-NEXT: ld1.4s { v0, v1 }, [x0]1389; CHECK-NEXT: ret1390 %val = call %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %addr)1391 ret %struct.__neon_float32x4x2_t %val1392}1393 1394define %struct.__neon_int64x2x2_t @ld1_x2_v2i64(ptr %addr) {1395; CHECK-LABEL: ld1_x2_v2i64:1396; CHECK: // %bb.0:1397; CHECK-NEXT: ld1.2d { v0, v1 }, [x0]1398; CHECK-NEXT: ret1399 %val = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %addr)1400 ret %struct.__neon_int64x2x2_t %val1401}1402 1403define %struct.__neon_float64x2x2_t @ld1_x2_v2f64(ptr %addr) {1404; CHECK-LABEL: ld1_x2_v2f64:1405; CHECK: // %bb.0:1406; CHECK-NEXT: ld1.2d { v0, v1 }, [x0]1407; CHECK-NEXT: ret1408 %val = call %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %addr)1409 ret %struct.__neon_float64x2x2_t %val1410}1411 1412declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr) nounwind readonly1413declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr) nounwind readonly1414declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr) nounwind readonly1415declare %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr) nounwind readonly1416declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr) nounwind readonly1417declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr) nounwind readonly1418 1419define %struct.__neon_int8x8x3_t @ld1_x3_v8i8(ptr %addr) {1420; CHECK-LABEL: ld1_x3_v8i8:1421; CHECK: // %bb.0:1422; CHECK-NEXT: ld1.8b { v0, v1, v2 }, [x0]1423; CHECK-NEXT: ret1424 %val = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %addr)1425 ret %struct.__neon_int8x8x3_t %val1426}1427 1428define %struct.__neon_int16x4x3_t @ld1_x3_v4i16(ptr %addr) {1429; CHECK-LABEL: ld1_x3_v4i16:1430; CHECK: // %bb.0:1431; CHECK-NEXT: ld1.4h { v0, v1, v2 }, [x0]1432; CHECK-NEXT: ret1433 %val = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %addr)1434 ret %struct.__neon_int16x4x3_t %val1435}1436 1437define %struct.__neon_int32x2x3_t @ld1_x3_v2i32(ptr %addr) {1438; CHECK-LABEL: ld1_x3_v2i32:1439; CHECK: // %bb.0:1440; CHECK-NEXT: ld1.2s { v0, v1, v2 }, [x0]1441; CHECK-NEXT: ret1442 %val = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %addr)1443 ret %struct.__neon_int32x2x3_t %val1444}1445 1446define %struct.__neon_float32x2x3_t @ld1_x3_v2f32(ptr %addr) {1447; CHECK-LABEL: ld1_x3_v2f32:1448; CHECK: // %bb.0:1449; CHECK-NEXT: ld1.2s { v0, v1, v2 }, [x0]1450; CHECK-NEXT: ret1451 %val = call %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %addr)1452 ret %struct.__neon_float32x2x3_t %val1453}1454 1455define %struct.__neon_int64x1x3_t @ld1_x3_v1i64(ptr %addr) {1456; CHECK-LABEL: ld1_x3_v1i64:1457; CHECK: // %bb.0:1458; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]1459; CHECK-NEXT: ret1460 %val = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %addr)1461 ret %struct.__neon_int64x1x3_t %val1462}1463 1464define %struct.__neon_float64x1x3_t @ld1_x3_v1f64(ptr %addr) {1465; CHECK-LABEL: ld1_x3_v1f64:1466; CHECK: // %bb.0:1467; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]1468; CHECK-NEXT: ret1469 %val = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %addr)1470 ret %struct.__neon_float64x1x3_t %val1471}1472 1473declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr) nounwind readonly1474declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr) nounwind readonly1475declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr) nounwind readonly1476declare %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr) nounwind readonly1477declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr) nounwind readonly1478declare %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr) nounwind readonly1479 1480define %struct.__neon_int8x16x3_t @ld1_x3_v16i8(ptr %addr) {1481; CHECK-LABEL: ld1_x3_v16i8:1482; CHECK: // %bb.0:1483; CHECK-NEXT: ld1.16b { v0, v1, v2 }, [x0]1484; CHECK-NEXT: ret1485 %val = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %addr)1486 ret %struct.__neon_int8x16x3_t %val1487}1488 1489define %struct.__neon_int16x8x3_t @ld1_x3_v8i16(ptr %addr) {1490; CHECK-LABEL: ld1_x3_v8i16:1491; CHECK: // %bb.0:1492; CHECK-NEXT: ld1.8h { v0, v1, v2 }, [x0]1493; CHECK-NEXT: ret1494 %val = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %addr)1495 ret %struct.__neon_int16x8x3_t %val1496}1497 1498define %struct.__neon_int32x4x3_t @ld1_x3_v4i32(ptr %addr) {1499; CHECK-LABEL: ld1_x3_v4i32:1500; CHECK: // %bb.0:1501; CHECK-NEXT: ld1.4s { v0, v1, v2 }, [x0]1502; CHECK-NEXT: ret1503 %val = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %addr)1504 ret %struct.__neon_int32x4x3_t %val1505}1506 1507define %struct.__neon_float32x4x3_t @ld1_x3_v4f32(ptr %addr) {1508; CHECK-LABEL: ld1_x3_v4f32:1509; CHECK: // %bb.0:1510; CHECK-NEXT: ld1.4s { v0, v1, v2 }, [x0]1511; CHECK-NEXT: ret1512 %val = call %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %addr)1513 ret %struct.__neon_float32x4x3_t %val1514}1515 1516define %struct.__neon_int64x2x3_t @ld1_x3_v2i64(ptr %addr) {1517; CHECK-LABEL: ld1_x3_v2i64:1518; CHECK: // %bb.0:1519; CHECK-NEXT: ld1.2d { v0, v1, v2 }, [x0]1520; CHECK-NEXT: ret1521 %val = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %addr)1522 ret %struct.__neon_int64x2x3_t %val1523}1524 1525define %struct.__neon_float64x2x3_t @ld1_x3_v2f64(ptr %addr) {1526; CHECK-LABEL: ld1_x3_v2f64:1527; CHECK: // %bb.0:1528; CHECK-NEXT: ld1.2d { v0, v1, v2 }, [x0]1529; CHECK-NEXT: ret1530 %val = call %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %addr)1531 ret %struct.__neon_float64x2x3_t %val1532}1533 1534declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr) nounwind readonly1535declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr) nounwind readonly1536declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr) nounwind readonly1537declare %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr) nounwind readonly1538declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr) nounwind readonly1539declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr) nounwind readonly1540 1541define %struct.__neon_int8x8x4_t @ld1_x4_v8i8(ptr %addr) {1542; CHECK-LABEL: ld1_x4_v8i8:1543; CHECK: // %bb.0:1544; CHECK-NEXT: ld1.8b { v0, v1, v2, v3 }, [x0]1545; CHECK-NEXT: ret1546 %val = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %addr)1547 ret %struct.__neon_int8x8x4_t %val1548}1549 1550define %struct.__neon_int16x4x4_t @ld1_x4_v4i16(ptr %addr) {1551; CHECK-LABEL: ld1_x4_v4i16:1552; CHECK: // %bb.0:1553; CHECK-NEXT: ld1.4h { v0, v1, v2, v3 }, [x0]1554; CHECK-NEXT: ret1555 %val = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %addr)1556 ret %struct.__neon_int16x4x4_t %val1557}1558 1559define %struct.__neon_int32x2x4_t @ld1_x4_v2i32(ptr %addr) {1560; CHECK-LABEL: ld1_x4_v2i32:1561; CHECK: // %bb.0:1562; CHECK-NEXT: ld1.2s { v0, v1, v2, v3 }, [x0]1563; CHECK-NEXT: ret1564 %val = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %addr)1565 ret %struct.__neon_int32x2x4_t %val1566}1567 1568define %struct.__neon_float32x2x4_t @ld1_x4_v2f32(ptr %addr) {1569; CHECK-LABEL: ld1_x4_v2f32:1570; CHECK: // %bb.0:1571; CHECK-NEXT: ld1.2s { v0, v1, v2, v3 }, [x0]1572; CHECK-NEXT: ret1573 %val = call %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %addr)1574 ret %struct.__neon_float32x2x4_t %val1575}1576 1577define %struct.__neon_int64x1x4_t @ld1_x4_v1i64(ptr %addr) {1578; CHECK-LABEL: ld1_x4_v1i64:1579; CHECK: // %bb.0:1580; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]1581; CHECK-NEXT: ret1582 %val = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %addr)1583 ret %struct.__neon_int64x1x4_t %val1584}1585 1586define %struct.__neon_float64x1x4_t @ld1_x4_v1f64(ptr %addr) {1587; CHECK-LABEL: ld1_x4_v1f64:1588; CHECK: // %bb.0:1589; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]1590; CHECK-NEXT: ret1591 %val = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %addr)1592 ret %struct.__neon_float64x1x4_t %val1593}1594 1595declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr) nounwind readonly1596declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr) nounwind readonly1597declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr) nounwind readonly1598declare %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr) nounwind readonly1599declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr) nounwind readonly1600declare %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr) nounwind readonly1601 1602define %struct.__neon_int8x16x4_t @ld1_x4_v16i8(ptr %addr) {1603; CHECK-LABEL: ld1_x4_v16i8:1604; CHECK: // %bb.0:1605; CHECK-NEXT: ld1.16b { v0, v1, v2, v3 }, [x0]1606; CHECK-NEXT: ret1607 %val = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %addr)1608 ret %struct.__neon_int8x16x4_t %val1609}1610 1611define %struct.__neon_int16x8x4_t @ld1_x4_v8i16(ptr %addr) {1612; CHECK-LABEL: ld1_x4_v8i16:1613; CHECK: // %bb.0:1614; CHECK-NEXT: ld1.8h { v0, v1, v2, v3 }, [x0]1615; CHECK-NEXT: ret1616 %val = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %addr)1617 ret %struct.__neon_int16x8x4_t %val1618}1619 1620define %struct.__neon_int32x4x4_t @ld1_x4_v4i32(ptr %addr) {1621; CHECK-LABEL: ld1_x4_v4i32:1622; CHECK: // %bb.0:1623; CHECK-NEXT: ld1.4s { v0, v1, v2, v3 }, [x0]1624; CHECK-NEXT: ret1625 %val = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %addr)1626 ret %struct.__neon_int32x4x4_t %val1627}1628 1629define %struct.__neon_float32x4x4_t @ld1_x4_v4f32(ptr %addr) {1630; CHECK-LABEL: ld1_x4_v4f32:1631; CHECK: // %bb.0:1632; CHECK-NEXT: ld1.4s { v0, v1, v2, v3 }, [x0]1633; CHECK-NEXT: ret1634 %val = call %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %addr)1635 ret %struct.__neon_float32x4x4_t %val1636}1637 1638define %struct.__neon_int64x2x4_t @ld1_x4_v2i64(ptr %addr) {1639; CHECK-LABEL: ld1_x4_v2i64:1640; CHECK: // %bb.0:1641; CHECK-NEXT: ld1.2d { v0, v1, v2, v3 }, [x0]1642; CHECK-NEXT: ret1643 %val = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %addr)1644 ret %struct.__neon_int64x2x4_t %val1645}1646 1647define %struct.__neon_float64x2x4_t @ld1_x4_v2f64(ptr %addr) {1648; CHECK-LABEL: ld1_x4_v2f64:1649; CHECK: // %bb.0:1650; CHECK-NEXT: ld1.2d { v0, v1, v2, v3 }, [x0]1651; CHECK-NEXT: ret1652 %val = call %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %addr)1653 ret %struct.__neon_float64x2x4_t %val1654}1655 1656define <8 x i8> @dup_ld1_from_stack(ptr %__ret) {1657; CHECK-LABEL: dup_ld1_from_stack:1658; CHECK: // %bb.0: // %entry1659; CHECK-NEXT: sub sp, sp, #161660; CHECK-NEXT: .cfi_def_cfa_offset 161661; CHECK-NEXT: add x8, sp, #151662; CHECK-NEXT: ld1r.8b { v0 }, [x8]1663; CHECK-NEXT: add sp, sp, #161664; CHECK-NEXT: ret1665entry:1666 %item = alloca i8, align 11667 %0 = load i8, ptr %item, align 11668 %1 = insertelement <8 x i8> poison, i8 %0, i32 01669 %lane = shufflevector <8 x i8> %1, <8 x i8> %1, <8 x i32> zeroinitializer1670 ret <8 x i8> %lane1671}1672