4501 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5; CHECK-GI: warning: Instruction selection used fallback path for sqshl1d6; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshl1d_constant7; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshl_scalar8; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshl_scalar_constant9; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshl1d10; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshl1d_constant11; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshl_scalar12; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshl_scalar_constant13; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshl1d14; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshl1d_constant15; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshl_scalar16; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshl_scalar_constant17; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshl1d18; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshl1d_constant19; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshl_scalar20; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshl_scalar_constant21; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshl1d22; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshl1d_constant23; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshl_scalar24; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshl_scalar_constant25; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshl1d26; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshl1d_constant27; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshl_scalar28; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshl_scalar_constant29; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshr1d30; CHECK-GI-NEXT: warning: Instruction selection used fallback path for urshr_scalar31; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshr1d32; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srshr_scalar33; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu8b34; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu4h35; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu2s36; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu16b37; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu8h38; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu4s39; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu2d40; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu1d_constant41; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu_i64_constant42; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu_i32_constant43; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn1s44; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn8b45; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn4h46; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn2s47; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn16b48; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn8h49; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrn4s50; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun1s51; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun8b52; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun4h53; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun2s54; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun16b55; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun8h56; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshrun4s57; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn1s58; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn8b59; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn4h60; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn2s61; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn16b62; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn8h63; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrn4s64; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun1s65; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun8b66; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun4h67; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun2s68; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun16b69; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun8h70; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrshrun4s71; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn1s72; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn8b73; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn4h74; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn2s75; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn16b76; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn8h77; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqrshrn4s78; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn1s79; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn8b80; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn4h81; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn2s82; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn16b83; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn8h84; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uqshrn4s85; CHECK-GI-NEXT: warning: Instruction selection used fallback path for neon_ushl_vscalar_constant_shift86; CHECK-GI-NEXT: warning: Instruction selection used fallback path for neon_ushl_scalar_constant_shift87; CHECK-GI-NEXT: warning: Instruction selection used fallback path for neon_sshll_vscalar_constant_shift88; CHECK-GI-NEXT: warning: Instruction selection used fallback path for neon_sshll_scalar_constant_shift89; CHECK-GI-NEXT: warning: Instruction selection used fallback path for neon_sshll_scalar_constant_shift_m190; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ursra1d91; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ursra_scalar92; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srsra1d93; CHECK-GI-NEXT: warning: Instruction selection used fallback path for srsra_scalar94; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli8b95; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli4h96; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli2s97; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli1d98; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli1d_imm099; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli16b100; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli8h101; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli4s102; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli2d103; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu_zero_shift_amount104 105define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {106; CHECK-LABEL: sqshl8b:107; CHECK: // %bb.0:108; CHECK-NEXT: ldr d0, [x0]109; CHECK-NEXT: ldr d1, [x1]110; CHECK-NEXT: sqshl v0.8b, v0.8b, v1.8b111; CHECK-NEXT: ret112 %tmp1 = load <8 x i8>, ptr %A113 %tmp2 = load <8 x i8>, ptr %B114 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)115 ret <8 x i8> %tmp3116}117 118define <4 x i16> @sqshl4h(ptr %A, ptr %B) nounwind {119; CHECK-LABEL: sqshl4h:120; CHECK: // %bb.0:121; CHECK-NEXT: ldr d0, [x0]122; CHECK-NEXT: ldr d1, [x1]123; CHECK-NEXT: sqshl v0.4h, v0.4h, v1.4h124; CHECK-NEXT: ret125 %tmp1 = load <4 x i16>, ptr %A126 %tmp2 = load <4 x i16>, ptr %B127 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)128 ret <4 x i16> %tmp3129}130 131define <2 x i32> @sqshl2s(ptr %A, ptr %B) nounwind {132; CHECK-LABEL: sqshl2s:133; CHECK: // %bb.0:134; CHECK-NEXT: ldr d0, [x0]135; CHECK-NEXT: ldr d1, [x1]136; CHECK-NEXT: sqshl v0.2s, v0.2s, v1.2s137; CHECK-NEXT: ret138 %tmp1 = load <2 x i32>, ptr %A139 %tmp2 = load <2 x i32>, ptr %B140 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)141 ret <2 x i32> %tmp3142}143 144define <1 x i64> @sqshl1d(ptr %A, ptr %B) nounwind {145; CHECK-LABEL: sqshl1d:146; CHECK: // %bb.0:147; CHECK-NEXT: ldr d0, [x0]148; CHECK-NEXT: ldr d1, [x1]149; CHECK-NEXT: sqshl d0, d0, d1150; CHECK-NEXT: ret151 %tmp1 = load <1 x i64>, ptr %A152 %tmp2 = load <1 x i64>, ptr %B153 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sqshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)154 ret <1 x i64> %tmp3155}156 157define <1 x i64> @sqshl1d_constant(ptr %A) nounwind {158; CHECK-LABEL: sqshl1d_constant:159; CHECK: // %bb.0:160; CHECK-NEXT: ldr d0, [x0]161; CHECK-NEXT: sqshl d0, d0, #1162; CHECK-NEXT: ret163 %tmp1 = load <1 x i64>, ptr %A164 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sqshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)165 ret <1 x i64> %tmp3166}167 168define i64 @sqshl_scalar(ptr %A, ptr %B) nounwind {169; CHECK-LABEL: sqshl_scalar:170; CHECK: // %bb.0:171; CHECK-NEXT: ldr x8, [x0]172; CHECK-NEXT: ldr x9, [x1]173; CHECK-NEXT: fmov d0, x8174; CHECK-NEXT: fmov d1, x9175; CHECK-NEXT: sqshl d0, d0, d1176; CHECK-NEXT: fmov x0, d0177; CHECK-NEXT: ret178 %tmp1 = load i64, ptr %A179 %tmp2 = load i64, ptr %B180 %tmp3 = call i64 @llvm.aarch64.neon.sqshl.i64(i64 %tmp1, i64 %tmp2)181 ret i64 %tmp3182}183 184define i64 @sqshl_scalar_constant(ptr %A) nounwind {185; CHECK-LABEL: sqshl_scalar_constant:186; CHECK: // %bb.0:187; CHECK-NEXT: ldr d0, [x0]188; CHECK-NEXT: sqshl d0, d0, #1189; CHECK-NEXT: fmov x0, d0190; CHECK-NEXT: ret191 %tmp1 = load i64, ptr %A192 %tmp3 = call i64 @llvm.aarch64.neon.sqshl.i64(i64 %tmp1, i64 1)193 ret i64 %tmp3194}195 196define <8 x i8> @uqshl8b(ptr %A, ptr %B) nounwind {197; CHECK-LABEL: uqshl8b:198; CHECK: // %bb.0:199; CHECK-NEXT: ldr d0, [x0]200; CHECK-NEXT: ldr d1, [x1]201; CHECK-NEXT: uqshl v0.8b, v0.8b, v1.8b202; CHECK-NEXT: ret203 %tmp1 = load <8 x i8>, ptr %A204 %tmp2 = load <8 x i8>, ptr %B205 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)206 ret <8 x i8> %tmp3207}208 209define <4 x i16> @uqshl4h(ptr %A, ptr %B) nounwind {210; CHECK-LABEL: uqshl4h:211; CHECK: // %bb.0:212; CHECK-NEXT: ldr d0, [x0]213; CHECK-NEXT: ldr d1, [x1]214; CHECK-NEXT: uqshl v0.4h, v0.4h, v1.4h215; CHECK-NEXT: ret216 %tmp1 = load <4 x i16>, ptr %A217 %tmp2 = load <4 x i16>, ptr %B218 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)219 ret <4 x i16> %tmp3220}221 222define <2 x i32> @uqshl2s(ptr %A, ptr %B) nounwind {223; CHECK-LABEL: uqshl2s:224; CHECK: // %bb.0:225; CHECK-NEXT: ldr d0, [x0]226; CHECK-NEXT: ldr d1, [x1]227; CHECK-NEXT: uqshl v0.2s, v0.2s, v1.2s228; CHECK-NEXT: ret229 %tmp1 = load <2 x i32>, ptr %A230 %tmp2 = load <2 x i32>, ptr %B231 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)232 ret <2 x i32> %tmp3233}234 235define <16 x i8> @sqshl16b(ptr %A, ptr %B) nounwind {236; CHECK-LABEL: sqshl16b:237; CHECK: // %bb.0:238; CHECK-NEXT: ldr q0, [x0]239; CHECK-NEXT: ldr q1, [x1]240; CHECK-NEXT: sqshl v0.16b, v0.16b, v1.16b241; CHECK-NEXT: ret242 %tmp1 = load <16 x i8>, ptr %A243 %tmp2 = load <16 x i8>, ptr %B244 %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)245 ret <16 x i8> %tmp3246}247 248define <8 x i16> @sqshl8h(ptr %A, ptr %B) nounwind {249; CHECK-LABEL: sqshl8h:250; CHECK: // %bb.0:251; CHECK-NEXT: ldr q0, [x0]252; CHECK-NEXT: ldr q1, [x1]253; CHECK-NEXT: sqshl v0.8h, v0.8h, v1.8h254; CHECK-NEXT: ret255 %tmp1 = load <8 x i16>, ptr %A256 %tmp2 = load <8 x i16>, ptr %B257 %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)258 ret <8 x i16> %tmp3259}260 261define <4 x i32> @sqshl4s(ptr %A, ptr %B) nounwind {262; CHECK-LABEL: sqshl4s:263; CHECK: // %bb.0:264; CHECK-NEXT: ldr q0, [x0]265; CHECK-NEXT: ldr q1, [x1]266; CHECK-NEXT: sqshl v0.4s, v0.4s, v1.4s267; CHECK-NEXT: ret268 %tmp1 = load <4 x i32>, ptr %A269 %tmp2 = load <4 x i32>, ptr %B270 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)271 ret <4 x i32> %tmp3272}273 274define <2 x i64> @sqshl2d(ptr %A, ptr %B) nounwind {275; CHECK-LABEL: sqshl2d:276; CHECK: // %bb.0:277; CHECK-NEXT: ldr q0, [x0]278; CHECK-NEXT: ldr q1, [x1]279; CHECK-NEXT: sqshl v0.2d, v0.2d, v1.2d280; CHECK-NEXT: ret281 %tmp1 = load <2 x i64>, ptr %A282 %tmp2 = load <2 x i64>, ptr %B283 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)284 ret <2 x i64> %tmp3285}286 287define <16 x i8> @uqshl16b(ptr %A, ptr %B) nounwind {288; CHECK-LABEL: uqshl16b:289; CHECK: // %bb.0:290; CHECK-NEXT: ldr q0, [x0]291; CHECK-NEXT: ldr q1, [x1]292; CHECK-NEXT: uqshl v0.16b, v0.16b, v1.16b293; CHECK-NEXT: ret294 %tmp1 = load <16 x i8>, ptr %A295 %tmp2 = load <16 x i8>, ptr %B296 %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)297 ret <16 x i8> %tmp3298}299 300define <8 x i16> @uqshl8h(ptr %A, ptr %B) nounwind {301; CHECK-LABEL: uqshl8h:302; CHECK: // %bb.0:303; CHECK-NEXT: ldr q0, [x0]304; CHECK-NEXT: ldr q1, [x1]305; CHECK-NEXT: uqshl v0.8h, v0.8h, v1.8h306; CHECK-NEXT: ret307 %tmp1 = load <8 x i16>, ptr %A308 %tmp2 = load <8 x i16>, ptr %B309 %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)310 ret <8 x i16> %tmp3311}312 313define <4 x i32> @uqshl4s(ptr %A, ptr %B) nounwind {314; CHECK-LABEL: uqshl4s:315; CHECK: // %bb.0:316; CHECK-NEXT: ldr q0, [x0]317; CHECK-NEXT: ldr q1, [x1]318; CHECK-NEXT: uqshl v0.4s, v0.4s, v1.4s319; CHECK-NEXT: ret320 %tmp1 = load <4 x i32>, ptr %A321 %tmp2 = load <4 x i32>, ptr %B322 %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)323 ret <4 x i32> %tmp3324}325 326define <2 x i64> @uqshl2d(ptr %A, ptr %B) nounwind {327; CHECK-LABEL: uqshl2d:328; CHECK: // %bb.0:329; CHECK-NEXT: ldr q0, [x0]330; CHECK-NEXT: ldr q1, [x1]331; CHECK-NEXT: uqshl v0.2d, v0.2d, v1.2d332; CHECK-NEXT: ret333 %tmp1 = load <2 x i64>, ptr %A334 %tmp2 = load <2 x i64>, ptr %B335 %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)336 ret <2 x i64> %tmp3337}338 339define <1 x i64> @uqshl1d(ptr %A, ptr %B) nounwind {340; CHECK-LABEL: uqshl1d:341; CHECK: // %bb.0:342; CHECK-NEXT: ldr d0, [x0]343; CHECK-NEXT: ldr d1, [x1]344; CHECK-NEXT: uqshl d0, d0, d1345; CHECK-NEXT: ret346 %tmp1 = load <1 x i64>, ptr %A347 %tmp2 = load <1 x i64>, ptr %B348 %tmp3 = call <1 x i64> @llvm.aarch64.neon.uqshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)349 ret <1 x i64> %tmp3350}351 352define <1 x i64> @uqshl1d_constant(ptr %A) nounwind {353; CHECK-LABEL: uqshl1d_constant:354; CHECK: // %bb.0:355; CHECK-NEXT: ldr d0, [x0]356; CHECK-NEXT: uqshl d0, d0, #1357; CHECK-NEXT: ret358 %tmp1 = load <1 x i64>, ptr %A359 %tmp3 = call <1 x i64> @llvm.aarch64.neon.uqshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)360 ret <1 x i64> %tmp3361}362 363define i64 @uqshl_scalar(ptr %A, ptr %B) nounwind {364; CHECK-LABEL: uqshl_scalar:365; CHECK: // %bb.0:366; CHECK-NEXT: ldr x8, [x0]367; CHECK-NEXT: ldr x9, [x1]368; CHECK-NEXT: fmov d0, x8369; CHECK-NEXT: fmov d1, x9370; CHECK-NEXT: uqshl d0, d0, d1371; CHECK-NEXT: fmov x0, d0372; CHECK-NEXT: ret373 %tmp1 = load i64, ptr %A374 %tmp2 = load i64, ptr %B375 %tmp3 = call i64 @llvm.aarch64.neon.uqshl.i64(i64 %tmp1, i64 %tmp2)376 ret i64 %tmp3377}378 379define i64 @uqshl_scalar_constant(ptr %A) nounwind {380; CHECK-LABEL: uqshl_scalar_constant:381; CHECK: // %bb.0:382; CHECK-NEXT: ldr d0, [x0]383; CHECK-NEXT: uqshl d0, d0, #1384; CHECK-NEXT: fmov x0, d0385; CHECK-NEXT: ret386 %tmp1 = load i64, ptr %A387 %tmp3 = call i64 @llvm.aarch64.neon.uqshl.i64(i64 %tmp1, i64 1)388 ret i64 %tmp3389}390 391declare <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone392declare <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone393declare <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone394declare <1 x i64> @llvm.aarch64.neon.sqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone395declare i64 @llvm.aarch64.neon.sqshl.i64(i64, i64) nounwind readnone396 397 398declare <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone399declare <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone400declare <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone401declare <1 x i64> @llvm.aarch64.neon.uqshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone402declare i64 @llvm.aarch64.neon.uqshl.i64(i64, i64) nounwind readnone403 404declare <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone405declare <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone406declare <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone407declare <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone408 409declare <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone410declare <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone411declare <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone412declare <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone413 414define <8 x i8> @srshl8b(ptr %A, ptr %B) nounwind {415; CHECK-LABEL: srshl8b:416; CHECK: // %bb.0:417; CHECK-NEXT: ldr d0, [x0]418; CHECK-NEXT: ldr d1, [x1]419; CHECK-NEXT: srshl v0.8b, v0.8b, v1.8b420; CHECK-NEXT: ret421 %tmp1 = load <8 x i8>, ptr %A422 %tmp2 = load <8 x i8>, ptr %B423 %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)424 ret <8 x i8> %tmp3425}426 427define <4 x i16> @srshl4h(ptr %A, ptr %B) nounwind {428; CHECK-LABEL: srshl4h:429; CHECK: // %bb.0:430; CHECK-NEXT: ldr d0, [x0]431; CHECK-NEXT: ldr d1, [x1]432; CHECK-NEXT: srshl v0.4h, v0.4h, v1.4h433; CHECK-NEXT: ret434 %tmp1 = load <4 x i16>, ptr %A435 %tmp2 = load <4 x i16>, ptr %B436 %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)437 ret <4 x i16> %tmp3438}439 440define <2 x i32> @srshl2s(ptr %A, ptr %B) nounwind {441; CHECK-LABEL: srshl2s:442; CHECK: // %bb.0:443; CHECK-NEXT: ldr d0, [x0]444; CHECK-NEXT: ldr d1, [x1]445; CHECK-NEXT: srshl v0.2s, v0.2s, v1.2s446; CHECK-NEXT: ret447 %tmp1 = load <2 x i32>, ptr %A448 %tmp2 = load <2 x i32>, ptr %B449 %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)450 ret <2 x i32> %tmp3451}452 453define <1 x i64> @srshl1d(ptr %A, ptr %B) nounwind {454; CHECK-LABEL: srshl1d:455; CHECK: // %bb.0:456; CHECK-NEXT: ldr d0, [x0]457; CHECK-NEXT: ldr d1, [x1]458; CHECK-NEXT: srshl d0, d0, d1459; CHECK-NEXT: ret460 %tmp1 = load <1 x i64>, ptr %A461 %tmp2 = load <1 x i64>, ptr %B462 %tmp3 = call <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)463 ret <1 x i64> %tmp3464}465 466define <1 x i64> @srshl1d_constant(ptr %A) nounwind {467; CHECK-LABEL: srshl1d_constant:468; CHECK: // %bb.0:469; CHECK-NEXT: mov w8, #1 // =0x1470; CHECK-NEXT: ldr d0, [x0]471; CHECK-NEXT: fmov d1, x8472; CHECK-NEXT: srshl d0, d0, d1473; CHECK-NEXT: ret474 %tmp1 = load <1 x i64>, ptr %A475 %tmp3 = call <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)476 ret <1 x i64> %tmp3477}478 479define i64 @srshl_scalar(ptr %A, ptr %B) nounwind {480; CHECK-LABEL: srshl_scalar:481; CHECK: // %bb.0:482; CHECK-NEXT: ldr x8, [x0]483; CHECK-NEXT: ldr x9, [x1]484; CHECK-NEXT: fmov d0, x8485; CHECK-NEXT: fmov d1, x9486; CHECK-NEXT: srshl d0, d0, d1487; CHECK-NEXT: fmov x0, d0488; CHECK-NEXT: ret489 %tmp1 = load i64, ptr %A490 %tmp2 = load i64, ptr %B491 %tmp3 = call i64 @llvm.aarch64.neon.srshl.i64(i64 %tmp1, i64 %tmp2)492 ret i64 %tmp3493}494 495define i64 @srshl_scalar_constant(ptr %A) nounwind {496; CHECK-LABEL: srshl_scalar_constant:497; CHECK: // %bb.0:498; CHECK-NEXT: ldr x9, [x0]499; CHECK-NEXT: mov w8, #1 // =0x1500; CHECK-NEXT: fmov d1, x8501; CHECK-NEXT: fmov d0, x9502; CHECK-NEXT: srshl d0, d0, d1503; CHECK-NEXT: fmov x0, d0504; CHECK-NEXT: ret505 %tmp1 = load i64, ptr %A506 %tmp3 = call i64 @llvm.aarch64.neon.srshl.i64(i64 %tmp1, i64 1)507 ret i64 %tmp3508}509 510define <8 x i8> @urshl8b(ptr %A, ptr %B) nounwind {511; CHECK-LABEL: urshl8b:512; CHECK: // %bb.0:513; CHECK-NEXT: ldr d0, [x0]514; CHECK-NEXT: ldr d1, [x1]515; CHECK-NEXT: urshl v0.8b, v0.8b, v1.8b516; CHECK-NEXT: ret517 %tmp1 = load <8 x i8>, ptr %A518 %tmp2 = load <8 x i8>, ptr %B519 %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)520 ret <8 x i8> %tmp3521}522 523define <4 x i16> @urshl4h(ptr %A, ptr %B) nounwind {524; CHECK-LABEL: urshl4h:525; CHECK: // %bb.0:526; CHECK-NEXT: ldr d0, [x0]527; CHECK-NEXT: ldr d1, [x1]528; CHECK-NEXT: urshl v0.4h, v0.4h, v1.4h529; CHECK-NEXT: ret530 %tmp1 = load <4 x i16>, ptr %A531 %tmp2 = load <4 x i16>, ptr %B532 %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)533 ret <4 x i16> %tmp3534}535 536define <2 x i32> @urshl2s(ptr %A, ptr %B) nounwind {537; CHECK-LABEL: urshl2s:538; CHECK: // %bb.0:539; CHECK-NEXT: ldr d0, [x0]540; CHECK-NEXT: ldr d1, [x1]541; CHECK-NEXT: urshl v0.2s, v0.2s, v1.2s542; CHECK-NEXT: ret543 %tmp1 = load <2 x i32>, ptr %A544 %tmp2 = load <2 x i32>, ptr %B545 %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)546 ret <2 x i32> %tmp3547}548 549define <1 x i64> @urshl1d(ptr %A, ptr %B) nounwind {550; CHECK-LABEL: urshl1d:551; CHECK: // %bb.0:552; CHECK-NEXT: ldr d0, [x0]553; CHECK-NEXT: ldr d1, [x1]554; CHECK-NEXT: urshl d0, d0, d1555; CHECK-NEXT: ret556 %tmp1 = load <1 x i64>, ptr %A557 %tmp2 = load <1 x i64>, ptr %B558 %tmp3 = call <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)559 ret <1 x i64> %tmp3560}561 562define <1 x i64> @urshl1d_constant(ptr %A) nounwind {563; CHECK-LABEL: urshl1d_constant:564; CHECK: // %bb.0:565; CHECK-NEXT: mov w8, #1 // =0x1566; CHECK-NEXT: ldr d0, [x0]567; CHECK-NEXT: fmov d1, x8568; CHECK-NEXT: urshl d0, d0, d1569; CHECK-NEXT: ret570 %tmp1 = load <1 x i64>, ptr %A571 %tmp3 = call <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)572 ret <1 x i64> %tmp3573}574 575define i64 @urshl_scalar(ptr %A, ptr %B) nounwind {576; CHECK-LABEL: urshl_scalar:577; CHECK: // %bb.0:578; CHECK-NEXT: ldr x8, [x0]579; CHECK-NEXT: ldr x9, [x1]580; CHECK-NEXT: fmov d0, x8581; CHECK-NEXT: fmov d1, x9582; CHECK-NEXT: urshl d0, d0, d1583; CHECK-NEXT: fmov x0, d0584; CHECK-NEXT: ret585 %tmp1 = load i64, ptr %A586 %tmp2 = load i64, ptr %B587 %tmp3 = call i64 @llvm.aarch64.neon.urshl.i64(i64 %tmp1, i64 %tmp2)588 ret i64 %tmp3589}590 591define i64 @urshl_scalar_constant(ptr %A) nounwind {592; CHECK-LABEL: urshl_scalar_constant:593; CHECK: // %bb.0:594; CHECK-NEXT: ldr x9, [x0]595; CHECK-NEXT: mov w8, #1 // =0x1596; CHECK-NEXT: fmov d1, x8597; CHECK-NEXT: fmov d0, x9598; CHECK-NEXT: urshl d0, d0, d1599; CHECK-NEXT: fmov x0, d0600; CHECK-NEXT: ret601 %tmp1 = load i64, ptr %A602 %tmp3 = call i64 @llvm.aarch64.neon.urshl.i64(i64 %tmp1, i64 1)603 ret i64 %tmp3604}605 606define <16 x i8> @srshl16b(ptr %A, ptr %B) nounwind {607; CHECK-LABEL: srshl16b:608; CHECK: // %bb.0:609; CHECK-NEXT: ldr q0, [x0]610; CHECK-NEXT: ldr q1, [x1]611; CHECK-NEXT: srshl v0.16b, v0.16b, v1.16b612; CHECK-NEXT: ret613 %tmp1 = load <16 x i8>, ptr %A614 %tmp2 = load <16 x i8>, ptr %B615 %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)616 ret <16 x i8> %tmp3617}618 619define <8 x i16> @srshl8h(ptr %A, ptr %B) nounwind {620; CHECK-LABEL: srshl8h:621; CHECK: // %bb.0:622; CHECK-NEXT: ldr q0, [x0]623; CHECK-NEXT: ldr q1, [x1]624; CHECK-NEXT: srshl v0.8h, v0.8h, v1.8h625; CHECK-NEXT: ret626 %tmp1 = load <8 x i16>, ptr %A627 %tmp2 = load <8 x i16>, ptr %B628 %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)629 ret <8 x i16> %tmp3630}631 632define <4 x i32> @srshl4s(ptr %A, ptr %B) nounwind {633; CHECK-LABEL: srshl4s:634; CHECK: // %bb.0:635; CHECK-NEXT: ldr q0, [x0]636; CHECK-NEXT: ldr q1, [x1]637; CHECK-NEXT: srshl v0.4s, v0.4s, v1.4s638; CHECK-NEXT: ret639 %tmp1 = load <4 x i32>, ptr %A640 %tmp2 = load <4 x i32>, ptr %B641 %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)642 ret <4 x i32> %tmp3643}644 645define <2 x i64> @srshl2d(ptr %A, ptr %B) nounwind {646; CHECK-LABEL: srshl2d:647; CHECK: // %bb.0:648; CHECK-NEXT: ldr q0, [x0]649; CHECK-NEXT: ldr q1, [x1]650; CHECK-NEXT: srshl v0.2d, v0.2d, v1.2d651; CHECK-NEXT: ret652 %tmp1 = load <2 x i64>, ptr %A653 %tmp2 = load <2 x i64>, ptr %B654 %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)655 ret <2 x i64> %tmp3656}657 658define <16 x i8> @urshl16b(ptr %A, ptr %B) nounwind {659; CHECK-LABEL: urshl16b:660; CHECK: // %bb.0:661; CHECK-NEXT: ldr q0, [x0]662; CHECK-NEXT: ldr q1, [x1]663; CHECK-NEXT: urshl v0.16b, v0.16b, v1.16b664; CHECK-NEXT: ret665 %tmp1 = load <16 x i8>, ptr %A666 %tmp2 = load <16 x i8>, ptr %B667 %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)668 ret <16 x i8> %tmp3669}670 671define <8 x i16> @urshl8h(ptr %A, ptr %B) nounwind {672; CHECK-LABEL: urshl8h:673; CHECK: // %bb.0:674; CHECK-NEXT: ldr q0, [x0]675; CHECK-NEXT: ldr q1, [x1]676; CHECK-NEXT: urshl v0.8h, v0.8h, v1.8h677; CHECK-NEXT: ret678 %tmp1 = load <8 x i16>, ptr %A679 %tmp2 = load <8 x i16>, ptr %B680 %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)681 ret <8 x i16> %tmp3682}683 684define <4 x i32> @urshl4s(ptr %A, ptr %B) nounwind {685; CHECK-LABEL: urshl4s:686; CHECK: // %bb.0:687; CHECK-NEXT: ldr q0, [x0]688; CHECK-NEXT: ldr q1, [x1]689; CHECK-NEXT: urshl v0.4s, v0.4s, v1.4s690; CHECK-NEXT: ret691 %tmp1 = load <4 x i32>, ptr %A692 %tmp2 = load <4 x i32>, ptr %B693 %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)694 ret <4 x i32> %tmp3695}696 697define <2 x i64> @urshl2d(ptr %A, ptr %B) nounwind {698; CHECK-LABEL: urshl2d:699; CHECK: // %bb.0:700; CHECK-NEXT: ldr q0, [x0]701; CHECK-NEXT: ldr q1, [x1]702; CHECK-NEXT: urshl v0.2d, v0.2d, v1.2d703; CHECK-NEXT: ret704 %tmp1 = load <2 x i64>, ptr %A705 %tmp2 = load <2 x i64>, ptr %B706 %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)707 ret <2 x i64> %tmp3708}709 710declare <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone711declare <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone712declare <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone713declare <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone714declare i64 @llvm.aarch64.neon.srshl.i64(i64, i64) nounwind readnone715 716declare <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone717declare <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone718declare <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone719declare <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone720declare i64 @llvm.aarch64.neon.urshl.i64(i64, i64) nounwind readnone721 722declare <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone723declare <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone724declare <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone725declare <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone726 727declare <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone728declare <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone729declare <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone730declare <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone731 732define <8 x i8> @sqrshl8b(ptr %A, ptr %B) nounwind {733; CHECK-LABEL: sqrshl8b:734; CHECK: // %bb.0:735; CHECK-NEXT: ldr d0, [x0]736; CHECK-NEXT: ldr d1, [x1]737; CHECK-NEXT: sqrshl v0.8b, v0.8b, v1.8b738; CHECK-NEXT: ret739 %tmp1 = load <8 x i8>, ptr %A740 %tmp2 = load <8 x i8>, ptr %B741 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)742 ret <8 x i8> %tmp3743}744 745define <4 x i16> @sqrshl4h(ptr %A, ptr %B) nounwind {746; CHECK-LABEL: sqrshl4h:747; CHECK: // %bb.0:748; CHECK-NEXT: ldr d0, [x0]749; CHECK-NEXT: ldr d1, [x1]750; CHECK-NEXT: sqrshl v0.4h, v0.4h, v1.4h751; CHECK-NEXT: ret752 %tmp1 = load <4 x i16>, ptr %A753 %tmp2 = load <4 x i16>, ptr %B754 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)755 ret <4 x i16> %tmp3756}757 758define <2 x i32> @sqrshl2s(ptr %A, ptr %B) nounwind {759; CHECK-LABEL: sqrshl2s:760; CHECK: // %bb.0:761; CHECK-NEXT: ldr d0, [x0]762; CHECK-NEXT: ldr d1, [x1]763; CHECK-NEXT: sqrshl v0.2s, v0.2s, v1.2s764; CHECK-NEXT: ret765 %tmp1 = load <2 x i32>, ptr %A766 %tmp2 = load <2 x i32>, ptr %B767 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)768 ret <2 x i32> %tmp3769}770 771define <8 x i8> @uqrshl8b(ptr %A, ptr %B) nounwind {772; CHECK-LABEL: uqrshl8b:773; CHECK: // %bb.0:774; CHECK-NEXT: ldr d0, [x0]775; CHECK-NEXT: ldr d1, [x1]776; CHECK-NEXT: uqrshl v0.8b, v0.8b, v1.8b777; CHECK-NEXT: ret778 %tmp1 = load <8 x i8>, ptr %A779 %tmp2 = load <8 x i8>, ptr %B780 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)781 ret <8 x i8> %tmp3782}783 784define <4 x i16> @uqrshl4h(ptr %A, ptr %B) nounwind {785; CHECK-LABEL: uqrshl4h:786; CHECK: // %bb.0:787; CHECK-NEXT: ldr d0, [x0]788; CHECK-NEXT: ldr d1, [x1]789; CHECK-NEXT: uqrshl v0.4h, v0.4h, v1.4h790; CHECK-NEXT: ret791 %tmp1 = load <4 x i16>, ptr %A792 %tmp2 = load <4 x i16>, ptr %B793 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)794 ret <4 x i16> %tmp3795}796 797define <2 x i32> @uqrshl2s(ptr %A, ptr %B) nounwind {798; CHECK-LABEL: uqrshl2s:799; CHECK: // %bb.0:800; CHECK-NEXT: ldr d0, [x0]801; CHECK-NEXT: ldr d1, [x1]802; CHECK-NEXT: uqrshl v0.2s, v0.2s, v1.2s803; CHECK-NEXT: ret804 %tmp1 = load <2 x i32>, ptr %A805 %tmp2 = load <2 x i32>, ptr %B806 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)807 ret <2 x i32> %tmp3808}809 810define <16 x i8> @sqrshl16b(ptr %A, ptr %B) nounwind {811; CHECK-LABEL: sqrshl16b:812; CHECK: // %bb.0:813; CHECK-NEXT: ldr q0, [x0]814; CHECK-NEXT: ldr q1, [x1]815; CHECK-NEXT: sqrshl v0.16b, v0.16b, v1.16b816; CHECK-NEXT: ret817 %tmp1 = load <16 x i8>, ptr %A818 %tmp2 = load <16 x i8>, ptr %B819 %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)820 ret <16 x i8> %tmp3821}822 823define <8 x i16> @sqrshl8h(ptr %A, ptr %B) nounwind {824; CHECK-LABEL: sqrshl8h:825; CHECK: // %bb.0:826; CHECK-NEXT: ldr q0, [x0]827; CHECK-NEXT: ldr q1, [x1]828; CHECK-NEXT: sqrshl v0.8h, v0.8h, v1.8h829; CHECK-NEXT: ret830 %tmp1 = load <8 x i16>, ptr %A831 %tmp2 = load <8 x i16>, ptr %B832 %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)833 ret <8 x i16> %tmp3834}835 836define <4 x i32> @sqrshl4s(ptr %A, ptr %B) nounwind {837; CHECK-LABEL: sqrshl4s:838; CHECK: // %bb.0:839; CHECK-NEXT: ldr q0, [x0]840; CHECK-NEXT: ldr q1, [x1]841; CHECK-NEXT: sqrshl v0.4s, v0.4s, v1.4s842; CHECK-NEXT: ret843 %tmp1 = load <4 x i32>, ptr %A844 %tmp2 = load <4 x i32>, ptr %B845 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)846 ret <4 x i32> %tmp3847}848 849define <2 x i64> @sqrshl2d(ptr %A, ptr %B) nounwind {850; CHECK-LABEL: sqrshl2d:851; CHECK: // %bb.0:852; CHECK-NEXT: ldr q0, [x0]853; CHECK-NEXT: ldr q1, [x1]854; CHECK-NEXT: sqrshl v0.2d, v0.2d, v1.2d855; CHECK-NEXT: ret856 %tmp1 = load <2 x i64>, ptr %A857 %tmp2 = load <2 x i64>, ptr %B858 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)859 ret <2 x i64> %tmp3860}861 862define <1 x i64> @sqrshl1d(ptr %A, ptr %B) nounwind {863; CHECK-LABEL: sqrshl1d:864; CHECK: // %bb.0:865; CHECK-NEXT: ldr d0, [x0]866; CHECK-NEXT: ldr d1, [x1]867; CHECK-NEXT: sqrshl d0, d0, d1868; CHECK-NEXT: ret869 %tmp1 = load <1 x i64>, ptr %A870 %tmp2 = load <1 x i64>, ptr %B871 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sqrshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)872 ret <1 x i64> %tmp3873}874 875define <1 x i64> @sqrshl1d_constant(ptr %A) nounwind {876; CHECK-LABEL: sqrshl1d_constant:877; CHECK: // %bb.0:878; CHECK-NEXT: mov w8, #1 // =0x1879; CHECK-NEXT: ldr d0, [x0]880; CHECK-NEXT: fmov d1, x8881; CHECK-NEXT: sqrshl d0, d0, d1882; CHECK-NEXT: ret883 %tmp1 = load <1 x i64>, ptr %A884 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sqrshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)885 ret <1 x i64> %tmp3886}887 888define i64 @sqrshl_scalar(ptr %A, ptr %B) nounwind {889; CHECK-LABEL: sqrshl_scalar:890; CHECK: // %bb.0:891; CHECK-NEXT: ldr x8, [x0]892; CHECK-NEXT: ldr x9, [x1]893; CHECK-NEXT: fmov d0, x8894; CHECK-NEXT: fmov d1, x9895; CHECK-NEXT: sqrshl d0, d0, d1896; CHECK-NEXT: fmov x0, d0897; CHECK-NEXT: ret898 %tmp1 = load i64, ptr %A899 %tmp2 = load i64, ptr %B900 %tmp3 = call i64 @llvm.aarch64.neon.sqrshl.i64(i64 %tmp1, i64 %tmp2)901 ret i64 %tmp3902}903 904define i64 @sqrshl_scalar_constant(ptr %A) nounwind {905; CHECK-LABEL: sqrshl_scalar_constant:906; CHECK: // %bb.0:907; CHECK-NEXT: ldr x9, [x0]908; CHECK-NEXT: mov w8, #1 // =0x1909; CHECK-NEXT: fmov d1, x8910; CHECK-NEXT: fmov d0, x9911; CHECK-NEXT: sqrshl d0, d0, d1912; CHECK-NEXT: fmov x0, d0913; CHECK-NEXT: ret914 %tmp1 = load i64, ptr %A915 %tmp3 = call i64 @llvm.aarch64.neon.sqrshl.i64(i64 %tmp1, i64 1)916 ret i64 %tmp3917}918 919define <16 x i8> @uqrshl16b(ptr %A, ptr %B) nounwind {920; CHECK-LABEL: uqrshl16b:921; CHECK: // %bb.0:922; CHECK-NEXT: ldr q0, [x0]923; CHECK-NEXT: ldr q1, [x1]924; CHECK-NEXT: uqrshl v0.16b, v0.16b, v1.16b925; CHECK-NEXT: ret926 %tmp1 = load <16 x i8>, ptr %A927 %tmp2 = load <16 x i8>, ptr %B928 %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)929 ret <16 x i8> %tmp3930}931 932define <8 x i16> @uqrshl8h(ptr %A, ptr %B) nounwind {933; CHECK-LABEL: uqrshl8h:934; CHECK: // %bb.0:935; CHECK-NEXT: ldr q0, [x0]936; CHECK-NEXT: ldr q1, [x1]937; CHECK-NEXT: uqrshl v0.8h, v0.8h, v1.8h938; CHECK-NEXT: ret939 %tmp1 = load <8 x i16>, ptr %A940 %tmp2 = load <8 x i16>, ptr %B941 %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)942 ret <8 x i16> %tmp3943}944 945define <4 x i32> @uqrshl4s(ptr %A, ptr %B) nounwind {946; CHECK-LABEL: uqrshl4s:947; CHECK: // %bb.0:948; CHECK-NEXT: ldr q0, [x0]949; CHECK-NEXT: ldr q1, [x1]950; CHECK-NEXT: uqrshl v0.4s, v0.4s, v1.4s951; CHECK-NEXT: ret952 %tmp1 = load <4 x i32>, ptr %A953 %tmp2 = load <4 x i32>, ptr %B954 %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)955 ret <4 x i32> %tmp3956}957 958define <2 x i64> @uqrshl2d(ptr %A, ptr %B) nounwind {959; CHECK-LABEL: uqrshl2d:960; CHECK: // %bb.0:961; CHECK-NEXT: ldr q0, [x0]962; CHECK-NEXT: ldr q1, [x1]963; CHECK-NEXT: uqrshl v0.2d, v0.2d, v1.2d964; CHECK-NEXT: ret965 %tmp1 = load <2 x i64>, ptr %A966 %tmp2 = load <2 x i64>, ptr %B967 %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)968 ret <2 x i64> %tmp3969}970 971define <1 x i64> @uqrshl1d(ptr %A, ptr %B) nounwind {972; CHECK-LABEL: uqrshl1d:973; CHECK: // %bb.0:974; CHECK-NEXT: ldr d0, [x0]975; CHECK-NEXT: ldr d1, [x1]976; CHECK-NEXT: uqrshl d0, d0, d1977; CHECK-NEXT: ret978 %tmp1 = load <1 x i64>, ptr %A979 %tmp2 = load <1 x i64>, ptr %B980 %tmp3 = call <1 x i64> @llvm.aarch64.neon.uqrshl.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)981 ret <1 x i64> %tmp3982}983 984define <1 x i64> @uqrshl1d_constant(ptr %A) nounwind {985; CHECK-LABEL: uqrshl1d_constant:986; CHECK: // %bb.0:987; CHECK-NEXT: mov w8, #1 // =0x1988; CHECK-NEXT: ldr d0, [x0]989; CHECK-NEXT: fmov d1, x8990; CHECK-NEXT: uqrshl d0, d0, d1991; CHECK-NEXT: ret992 %tmp1 = load <1 x i64>, ptr %A993 %tmp3 = call <1 x i64> @llvm.aarch64.neon.uqrshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)994 ret <1 x i64> %tmp3995}996 997define i64 @uqrshl_scalar(ptr %A, ptr %B) nounwind {998; CHECK-LABEL: uqrshl_scalar:999; CHECK: // %bb.0:1000; CHECK-NEXT: ldr x8, [x0]1001; CHECK-NEXT: ldr x9, [x1]1002; CHECK-NEXT: fmov d0, x81003; CHECK-NEXT: fmov d1, x91004; CHECK-NEXT: uqrshl d0, d0, d11005; CHECK-NEXT: fmov x0, d01006; CHECK-NEXT: ret1007 %tmp1 = load i64, ptr %A1008 %tmp2 = load i64, ptr %B1009 %tmp3 = call i64 @llvm.aarch64.neon.uqrshl.i64(i64 %tmp1, i64 %tmp2)1010 ret i64 %tmp31011}1012 1013define i64 @uqrshl_scalar_constant(ptr %A) nounwind {1014; CHECK-LABEL: uqrshl_scalar_constant:1015; CHECK: // %bb.0:1016; CHECK-NEXT: ldr x9, [x0]1017; CHECK-NEXT: mov w8, #1 // =0x11018; CHECK-NEXT: fmov d1, x81019; CHECK-NEXT: fmov d0, x91020; CHECK-NEXT: uqrshl d0, d0, d11021; CHECK-NEXT: fmov x0, d01022; CHECK-NEXT: ret1023 %tmp1 = load i64, ptr %A1024 %tmp3 = call i64 @llvm.aarch64.neon.uqrshl.i64(i64 %tmp1, i64 1)1025 ret i64 %tmp31026}1027 1028declare <8 x i8> @llvm.aarch64.neon.sqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone1029declare <4 x i16> @llvm.aarch64.neon.sqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone1030declare <2 x i32> @llvm.aarch64.neon.sqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone1031declare <1 x i64> @llvm.aarch64.neon.sqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone1032declare i64 @llvm.aarch64.neon.sqrshl.i64(i64, i64) nounwind readnone1033 1034declare <8 x i8> @llvm.aarch64.neon.uqrshl.v8i8(<8 x i8>, <8 x i8>) nounwind readnone1035declare <4 x i16> @llvm.aarch64.neon.uqrshl.v4i16(<4 x i16>, <4 x i16>) nounwind readnone1036declare <2 x i32> @llvm.aarch64.neon.uqrshl.v2i32(<2 x i32>, <2 x i32>) nounwind readnone1037declare <1 x i64> @llvm.aarch64.neon.uqrshl.v1i64(<1 x i64>, <1 x i64>) nounwind readnone1038declare i64 @llvm.aarch64.neon.uqrshl.i64(i64, i64) nounwind readnone1039 1040declare <16 x i8> @llvm.aarch64.neon.sqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone1041declare <8 x i16> @llvm.aarch64.neon.sqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone1042declare <4 x i32> @llvm.aarch64.neon.sqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone1043declare <2 x i64> @llvm.aarch64.neon.sqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone1044 1045declare <16 x i8> @llvm.aarch64.neon.uqrshl.v16i8(<16 x i8>, <16 x i8>) nounwind readnone1046declare <8 x i16> @llvm.aarch64.neon.uqrshl.v8i16(<8 x i16>, <8 x i16>) nounwind readnone1047declare <4 x i32> @llvm.aarch64.neon.uqrshl.v4i32(<4 x i32>, <4 x i32>) nounwind readnone1048declare <2 x i64> @llvm.aarch64.neon.uqrshl.v2i64(<2 x i64>, <2 x i64>) nounwind readnone1049 1050define <8 x i8> @urshr8b(ptr %A) nounwind {1051; CHECK-SD-LABEL: urshr8b:1052; CHECK-SD: // %bb.0:1053; CHECK-SD-NEXT: ldr d0, [x0]1054; CHECK-SD-NEXT: urshr v0.8b, v0.8b, #11055; CHECK-SD-NEXT: ret1056;1057; CHECK-GI-LABEL: urshr8b:1058; CHECK-GI: // %bb.0:1059; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1060; CHECK-GI-NEXT: ldr d1, [x0]1061; CHECK-GI-NEXT: urshl v0.8b, v1.8b, v0.8b1062; CHECK-GI-NEXT: ret1063 %tmp1 = load <8 x i8>, ptr %A1064 %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)1065 ret <8 x i8> %tmp31066}1067 1068define <4 x i16> @urshr4h(ptr %A) nounwind {1069; CHECK-SD-LABEL: urshr4h:1070; CHECK-SD: // %bb.0:1071; CHECK-SD-NEXT: ldr d0, [x0]1072; CHECK-SD-NEXT: urshr v0.4h, v0.4h, #11073; CHECK-SD-NEXT: ret1074;1075; CHECK-GI-LABEL: urshr4h:1076; CHECK-GI: // %bb.0:1077; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1078; CHECK-GI-NEXT: ldr d1, [x0]1079; CHECK-GI-NEXT: urshl v0.4h, v1.4h, v0.4h1080; CHECK-GI-NEXT: ret1081 %tmp1 = load <4 x i16>, ptr %A1082 %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)1083 ret <4 x i16> %tmp31084}1085 1086define <2 x i32> @urshr2s(ptr %A) nounwind {1087; CHECK-SD-LABEL: urshr2s:1088; CHECK-SD: // %bb.0:1089; CHECK-SD-NEXT: ldr d0, [x0]1090; CHECK-SD-NEXT: urshr v0.2s, v0.2s, #11091; CHECK-SD-NEXT: ret1092;1093; CHECK-GI-LABEL: urshr2s:1094; CHECK-GI: // %bb.0:1095; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1096; CHECK-GI-NEXT: ldr d1, [x0]1097; CHECK-GI-NEXT: urshl v0.2s, v1.2s, v0.2s1098; CHECK-GI-NEXT: ret1099 %tmp1 = load <2 x i32>, ptr %A1100 %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)1101 ret <2 x i32> %tmp31102}1103 1104define <16 x i8> @urshr16b(ptr %A) nounwind {1105; CHECK-SD-LABEL: urshr16b:1106; CHECK-SD: // %bb.0:1107; CHECK-SD-NEXT: ldr q0, [x0]1108; CHECK-SD-NEXT: urshr v0.16b, v0.16b, #11109; CHECK-SD-NEXT: ret1110;1111; CHECK-GI-LABEL: urshr16b:1112; CHECK-GI: // %bb.0:1113; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1114; CHECK-GI-NEXT: ldr q1, [x0]1115; CHECK-GI-NEXT: urshl v0.16b, v1.16b, v0.16b1116; CHECK-GI-NEXT: ret1117 %tmp1 = load <16 x i8>, ptr %A1118 %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)1119 ret <16 x i8> %tmp31120}1121 1122define <8 x i16> @urshr8h(ptr %A) nounwind {1123; CHECK-SD-LABEL: urshr8h:1124; CHECK-SD: // %bb.0:1125; CHECK-SD-NEXT: ldr q0, [x0]1126; CHECK-SD-NEXT: urshr v0.8h, v0.8h, #11127; CHECK-SD-NEXT: ret1128;1129; CHECK-GI-LABEL: urshr8h:1130; CHECK-GI: // %bb.0:1131; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1132; CHECK-GI-NEXT: ldr q1, [x0]1133; CHECK-GI-NEXT: urshl v0.8h, v1.8h, v0.8h1134; CHECK-GI-NEXT: ret1135 %tmp1 = load <8 x i16>, ptr %A1136 %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)1137 ret <8 x i16> %tmp31138}1139 1140define <4 x i32> @urshr4s(ptr %A) nounwind {1141; CHECK-SD-LABEL: urshr4s:1142; CHECK-SD: // %bb.0:1143; CHECK-SD-NEXT: ldr q0, [x0]1144; CHECK-SD-NEXT: urshr v0.4s, v0.4s, #11145; CHECK-SD-NEXT: ret1146;1147; CHECK-GI-LABEL: urshr4s:1148; CHECK-GI: // %bb.0:1149; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1150; CHECK-GI-NEXT: ldr q1, [x0]1151; CHECK-GI-NEXT: urshl v0.4s, v1.4s, v0.4s1152; CHECK-GI-NEXT: ret1153 %tmp1 = load <4 x i32>, ptr %A1154 %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)1155 ret <4 x i32> %tmp31156}1157 1158define <2 x i64> @urshr2d(ptr %A) nounwind {1159; CHECK-SD-LABEL: urshr2d:1160; CHECK-SD: // %bb.0:1161; CHECK-SD-NEXT: ldr q0, [x0]1162; CHECK-SD-NEXT: urshr v0.2d, v0.2d, #11163; CHECK-SD-NEXT: ret1164;1165; CHECK-GI-LABEL: urshr2d:1166; CHECK-GI: // %bb.0:1167; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1168; CHECK-GI-NEXT: ldr q1, [x0]1169; CHECK-GI-NEXT: urshl v0.2d, v1.2d, v0.2d1170; CHECK-GI-NEXT: ret1171 %tmp1 = load <2 x i64>, ptr %A1172 %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)1173 ret <2 x i64> %tmp31174}1175 1176define <1 x i64> @urshr1d(ptr %A) nounwind {1177; CHECK-LABEL: urshr1d:1178; CHECK: // %bb.0:1179; CHECK-NEXT: ldr d0, [x0]1180; CHECK-NEXT: urshr d0, d0, #11181; CHECK-NEXT: ret1182 %tmp1 = load <1 x i64>, ptr %A1183 %tmp3 = call <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 -1>)1184 ret <1 x i64> %tmp31185}1186 1187define i64 @urshr_scalar(ptr %A) nounwind {1188; CHECK-LABEL: urshr_scalar:1189; CHECK: // %bb.0:1190; CHECK-NEXT: ldr d0, [x0]1191; CHECK-NEXT: urshr d0, d0, #11192; CHECK-NEXT: fmov x0, d01193; CHECK-NEXT: ret1194 %tmp1 = load i64, ptr %A1195 %tmp3 = call i64 @llvm.aarch64.neon.urshl.i64(i64 %tmp1, i64 -1)1196 ret i64 %tmp31197}1198 1199define <8 x i8> @srshr8b(ptr %A) nounwind {1200; CHECK-SD-LABEL: srshr8b:1201; CHECK-SD: // %bb.0:1202; CHECK-SD-NEXT: ldr d0, [x0]1203; CHECK-SD-NEXT: srshr v0.8b, v0.8b, #11204; CHECK-SD-NEXT: ret1205;1206; CHECK-GI-LABEL: srshr8b:1207; CHECK-GI: // %bb.0:1208; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1209; CHECK-GI-NEXT: ldr d1, [x0]1210; CHECK-GI-NEXT: srshl v0.8b, v1.8b, v0.8b1211; CHECK-GI-NEXT: ret1212 %tmp1 = load <8 x i8>, ptr %A1213 %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)1214 ret <8 x i8> %tmp31215}1216 1217define <4 x i16> @srshr4h(ptr %A) nounwind {1218; CHECK-SD-LABEL: srshr4h:1219; CHECK-SD: // %bb.0:1220; CHECK-SD-NEXT: ldr d0, [x0]1221; CHECK-SD-NEXT: srshr v0.4h, v0.4h, #11222; CHECK-SD-NEXT: ret1223;1224; CHECK-GI-LABEL: srshr4h:1225; CHECK-GI: // %bb.0:1226; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1227; CHECK-GI-NEXT: ldr d1, [x0]1228; CHECK-GI-NEXT: srshl v0.4h, v1.4h, v0.4h1229; CHECK-GI-NEXT: ret1230 %tmp1 = load <4 x i16>, ptr %A1231 %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)1232 ret <4 x i16> %tmp31233}1234 1235define <2 x i32> @srshr2s(ptr %A) nounwind {1236; CHECK-SD-LABEL: srshr2s:1237; CHECK-SD: // %bb.0:1238; CHECK-SD-NEXT: ldr d0, [x0]1239; CHECK-SD-NEXT: srshr v0.2s, v0.2s, #11240; CHECK-SD-NEXT: ret1241;1242; CHECK-GI-LABEL: srshr2s:1243; CHECK-GI: // %bb.0:1244; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff1245; CHECK-GI-NEXT: ldr d1, [x0]1246; CHECK-GI-NEXT: srshl v0.2s, v1.2s, v0.2s1247; CHECK-GI-NEXT: ret1248 %tmp1 = load <2 x i32>, ptr %A1249 %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)1250 ret <2 x i32> %tmp31251}1252 1253define <16 x i8> @srshr16b(ptr %A) nounwind {1254; CHECK-SD-LABEL: srshr16b:1255; CHECK-SD: // %bb.0:1256; CHECK-SD-NEXT: ldr q0, [x0]1257; CHECK-SD-NEXT: srshr v0.16b, v0.16b, #11258; CHECK-SD-NEXT: ret1259;1260; CHECK-GI-LABEL: srshr16b:1261; CHECK-GI: // %bb.0:1262; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1263; CHECK-GI-NEXT: ldr q1, [x0]1264; CHECK-GI-NEXT: srshl v0.16b, v1.16b, v0.16b1265; CHECK-GI-NEXT: ret1266 %tmp1 = load <16 x i8>, ptr %A1267 %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)1268 ret <16 x i8> %tmp31269}1270 1271define <8 x i16> @srshr8h(ptr %A) nounwind {1272; CHECK-SD-LABEL: srshr8h:1273; CHECK-SD: // %bb.0:1274; CHECK-SD-NEXT: ldr q0, [x0]1275; CHECK-SD-NEXT: srshr v0.8h, v0.8h, #11276; CHECK-SD-NEXT: ret1277;1278; CHECK-GI-LABEL: srshr8h:1279; CHECK-GI: // %bb.0:1280; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1281; CHECK-GI-NEXT: ldr q1, [x0]1282; CHECK-GI-NEXT: srshl v0.8h, v1.8h, v0.8h1283; CHECK-GI-NEXT: ret1284 %tmp1 = load <8 x i16>, ptr %A1285 %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)1286 ret <8 x i16> %tmp31287}1288 1289define <4 x i32> @srshr4s(ptr %A) nounwind {1290; CHECK-SD-LABEL: srshr4s:1291; CHECK-SD: // %bb.0:1292; CHECK-SD-NEXT: ldr q0, [x0]1293; CHECK-SD-NEXT: srshr v0.4s, v0.4s, #11294; CHECK-SD-NEXT: ret1295;1296; CHECK-GI-LABEL: srshr4s:1297; CHECK-GI: // %bb.0:1298; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1299; CHECK-GI-NEXT: ldr q1, [x0]1300; CHECK-GI-NEXT: srshl v0.4s, v1.4s, v0.4s1301; CHECK-GI-NEXT: ret1302 %tmp1 = load <4 x i32>, ptr %A1303 %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)1304 ret <4 x i32> %tmp31305}1306 1307define <2 x i64> @srshr2d(ptr %A) nounwind {1308; CHECK-SD-LABEL: srshr2d:1309; CHECK-SD: // %bb.0:1310; CHECK-SD-NEXT: ldr q0, [x0]1311; CHECK-SD-NEXT: srshr v0.2d, v0.2d, #11312; CHECK-SD-NEXT: ret1313;1314; CHECK-GI-LABEL: srshr2d:1315; CHECK-GI: // %bb.0:1316; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff1317; CHECK-GI-NEXT: ldr q1, [x0]1318; CHECK-GI-NEXT: srshl v0.2d, v1.2d, v0.2d1319; CHECK-GI-NEXT: ret1320 %tmp1 = load <2 x i64>, ptr %A1321 %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)1322 ret <2 x i64> %tmp31323}1324 1325define <1 x i64> @srshr1d(ptr %A) nounwind {1326; CHECK-LABEL: srshr1d:1327; CHECK: // %bb.0:1328; CHECK-NEXT: ldr d0, [x0]1329; CHECK-NEXT: srshr d0, d0, #11330; CHECK-NEXT: ret1331 %tmp1 = load <1 x i64>, ptr %A1332 %tmp3 = call <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 -1>)1333 ret <1 x i64> %tmp31334}1335 1336define i64 @srshr_scalar(ptr %A) nounwind {1337; CHECK-LABEL: srshr_scalar:1338; CHECK: // %bb.0:1339; CHECK-NEXT: ldr d0, [x0]1340; CHECK-NEXT: srshr d0, d0, #11341; CHECK-NEXT: fmov x0, d01342; CHECK-NEXT: ret1343 %tmp1 = load i64, ptr %A1344 %tmp3 = call i64 @llvm.aarch64.neon.srshl.i64(i64 %tmp1, i64 -1)1345 ret i64 %tmp31346}1347 1348define <8 x i8> @sqshlu8b(ptr %A) nounwind {1349; CHECK-LABEL: sqshlu8b:1350; CHECK: // %bb.0:1351; CHECK-NEXT: ldr d0, [x0]1352; CHECK-NEXT: sqshlu v0.8b, v0.8b, #11353; CHECK-NEXT: ret1354 %tmp1 = load <8 x i8>, ptr %A1355 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshlu.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)1356 ret <8 x i8> %tmp31357}1358 1359define <4 x i16> @sqshlu4h(ptr %A) nounwind {1360; CHECK-LABEL: sqshlu4h:1361; CHECK: // %bb.0:1362; CHECK-NEXT: ldr d0, [x0]1363; CHECK-NEXT: sqshlu v0.4h, v0.4h, #11364; CHECK-NEXT: ret1365 %tmp1 = load <4 x i16>, ptr %A1366 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshlu.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)1367 ret <4 x i16> %tmp31368}1369 1370define <2 x i32> @sqshlu2s(ptr %A) nounwind {1371; CHECK-LABEL: sqshlu2s:1372; CHECK: // %bb.0:1373; CHECK-NEXT: ldr d0, [x0]1374; CHECK-NEXT: sqshlu v0.2s, v0.2s, #11375; CHECK-NEXT: ret1376 %tmp1 = load <2 x i32>, ptr %A1377 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshlu.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)1378 ret <2 x i32> %tmp31379}1380 1381define <16 x i8> @sqshlu16b(ptr %A) nounwind {1382; CHECK-LABEL: sqshlu16b:1383; CHECK: // %bb.0:1384; CHECK-NEXT: ldr q0, [x0]1385; CHECK-NEXT: sqshlu v0.16b, v0.16b, #11386; CHECK-NEXT: ret1387 %tmp1 = load <16 x i8>, ptr %A1388 %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshlu.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)1389 ret <16 x i8> %tmp31390}1391 1392define <8 x i16> @sqshlu8h(ptr %A) nounwind {1393; CHECK-LABEL: sqshlu8h:1394; CHECK: // %bb.0:1395; CHECK-NEXT: ldr q0, [x0]1396; CHECK-NEXT: sqshlu v0.8h, v0.8h, #11397; CHECK-NEXT: ret1398 %tmp1 = load <8 x i16>, ptr %A1399 %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshlu.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)1400 ret <8 x i16> %tmp31401}1402 1403define <4 x i32> @sqshlu4s(ptr %A) nounwind {1404; CHECK-LABEL: sqshlu4s:1405; CHECK: // %bb.0:1406; CHECK-NEXT: ldr q0, [x0]1407; CHECK-NEXT: sqshlu v0.4s, v0.4s, #11408; CHECK-NEXT: ret1409 %tmp1 = load <4 x i32>, ptr %A1410 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshlu.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)1411 ret <4 x i32> %tmp31412}1413 1414define <2 x i64> @sqshlu2d(ptr %A) nounwind {1415; CHECK-LABEL: sqshlu2d:1416; CHECK: // %bb.0:1417; CHECK-NEXT: ldr q0, [x0]1418; CHECK-NEXT: sqshlu v0.2d, v0.2d, #11419; CHECK-NEXT: ret1420 %tmp1 = load <2 x i64>, ptr %A1421 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)1422 ret <2 x i64> %tmp31423}1424 1425define <1 x i64> @sqshlu1d_constant(ptr %A) nounwind {1426; CHECK-LABEL: sqshlu1d_constant:1427; CHECK: // %bb.0:1428; CHECK-NEXT: ldr d0, [x0]1429; CHECK-NEXT: sqshlu d0, d0, #11430; CHECK-NEXT: ret1431 %tmp1 = load <1 x i64>, ptr %A1432 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sqshlu.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 1>)1433 ret <1 x i64> %tmp31434}1435 1436define i64 @sqshlu_i64_constant(ptr %A) nounwind {1437; CHECK-LABEL: sqshlu_i64_constant:1438; CHECK: // %bb.0:1439; CHECK-NEXT: ldr d0, [x0]1440; CHECK-NEXT: sqshlu d0, d0, #11441; CHECK-NEXT: fmov x0, d01442; CHECK-NEXT: ret1443 %tmp1 = load i64, ptr %A1444 %tmp3 = call i64 @llvm.aarch64.neon.sqshlu.i64(i64 %tmp1, i64 1)1445 ret i64 %tmp31446}1447 1448define i32 @sqshlu_i32_constant(ptr %A) nounwind {1449; CHECK-LABEL: sqshlu_i32_constant:1450; CHECK: // %bb.0:1451; CHECK-NEXT: ldr w8, [x0]1452; CHECK-NEXT: fmov s0, w81453; CHECK-NEXT: sqshlu s0, s0, #11454; CHECK-NEXT: fmov w0, s01455; CHECK-NEXT: ret1456 %tmp1 = load i32, ptr %A1457 %tmp3 = call i32 @llvm.aarch64.neon.sqshlu.i32(i32 %tmp1, i32 1)1458 ret i32 %tmp31459}1460 1461declare <8 x i8> @llvm.aarch64.neon.sqshlu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone1462declare <4 x i16> @llvm.aarch64.neon.sqshlu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone1463declare <2 x i32> @llvm.aarch64.neon.sqshlu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone1464declare <1 x i64> @llvm.aarch64.neon.sqshlu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone1465declare i64 @llvm.aarch64.neon.sqshlu.i64(i64, i64) nounwind readnone1466declare i32 @llvm.aarch64.neon.sqshlu.i32(i32, i32) nounwind readnone1467 1468declare <16 x i8> @llvm.aarch64.neon.sqshlu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone1469declare <8 x i16> @llvm.aarch64.neon.sqshlu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone1470declare <4 x i32> @llvm.aarch64.neon.sqshlu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone1471declare <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone1472 1473define <8 x i8> @rshrn8b(ptr %A) nounwind {1474; CHECK-LABEL: rshrn8b:1475; CHECK: // %bb.0:1476; CHECK-NEXT: ldr q0, [x0]1477; CHECK-NEXT: rshrn v0.8b, v0.8h, #11478; CHECK-NEXT: ret1479 %tmp1 = load <8 x i16>, ptr %A1480 %tmp3 = call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)1481 ret <8 x i8> %tmp31482}1483 1484define <4 x i16> @rshrn4h(ptr %A) nounwind {1485; CHECK-LABEL: rshrn4h:1486; CHECK: // %bb.0:1487; CHECK-NEXT: ldr q0, [x0]1488; CHECK-NEXT: rshrn v0.4h, v0.4s, #11489; CHECK-NEXT: ret1490 %tmp1 = load <4 x i32>, ptr %A1491 %tmp3 = call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)1492 ret <4 x i16> %tmp31493}1494 1495define <2 x i32> @rshrn2s(ptr %A) nounwind {1496; CHECK-LABEL: rshrn2s:1497; CHECK: // %bb.0:1498; CHECK-NEXT: ldr q0, [x0]1499; CHECK-NEXT: rshrn v0.2s, v0.2d, #11500; CHECK-NEXT: ret1501 %tmp1 = load <2 x i64>, ptr %A1502 %tmp3 = call <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)1503 ret <2 x i32> %tmp31504}1505 1506define <16 x i8> @rshrn16b(ptr %ret, ptr %A) nounwind {1507; CHECK-LABEL: rshrn16b:1508; CHECK: // %bb.0:1509; CHECK-NEXT: ldr d0, [x0]1510; CHECK-NEXT: ldr q1, [x1]1511; CHECK-NEXT: rshrn2 v0.16b, v1.8h, #11512; CHECK-NEXT: ret1513 %out = load <8 x i8>, ptr %ret1514 %tmp1 = load <8 x i16>, ptr %A1515 %tmp3 = call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %tmp1, i32 1)1516 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1517 ret <16 x i8> %tmp41518}1519 1520define <8 x i16> @rshrn8h(ptr %ret, ptr %A) nounwind {1521; CHECK-LABEL: rshrn8h:1522; CHECK: // %bb.0:1523; CHECK-NEXT: ldr d0, [x0]1524; CHECK-NEXT: ldr q1, [x1]1525; CHECK-NEXT: rshrn2 v0.8h, v1.4s, #11526; CHECK-NEXT: ret1527 %out = load <4 x i16>, ptr %ret1528 %tmp1 = load <4 x i32>, ptr %A1529 %tmp3 = call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %tmp1, i32 1)1530 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1531 ret <8 x i16> %tmp41532}1533 1534define <4 x i32> @rshrn4s(ptr %ret, ptr %A) nounwind {1535; CHECK-LABEL: rshrn4s:1536; CHECK: // %bb.0:1537; CHECK-NEXT: ldr d0, [x0]1538; CHECK-NEXT: ldr q1, [x1]1539; CHECK-NEXT: rshrn2 v0.4s, v1.2d, #11540; CHECK-NEXT: ret1541 %out = load <2 x i32>, ptr %ret1542 %tmp1 = load <2 x i64>, ptr %A1543 %tmp3 = call <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64> %tmp1, i32 1)1544 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1545 ret <4 x i32> %tmp41546}1547 1548declare <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16>, i32) nounwind readnone1549declare <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32>, i32) nounwind readnone1550declare <2 x i32> @llvm.aarch64.neon.rshrn.v2i32(<2 x i64>, i32) nounwind readnone1551 1552define <8 x i8> @shrn8b(ptr %A) nounwind {1553; CHECK-LABEL: shrn8b:1554; CHECK: // %bb.0:1555; CHECK-NEXT: ldr q0, [x0]1556; CHECK-NEXT: shrn v0.8b, v0.8h, #11557; CHECK-NEXT: ret1558 %tmp1 = load <8 x i16>, ptr %A1559 %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1560 %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>1561 ret <8 x i8> %tmp31562}1563 1564define <4 x i16> @shrn4h(ptr %A) nounwind {1565; CHECK-LABEL: shrn4h:1566; CHECK: // %bb.0:1567; CHECK-NEXT: ldr q0, [x0]1568; CHECK-NEXT: shrn v0.4h, v0.4s, #11569; CHECK-NEXT: ret1570 %tmp1 = load <4 x i32>, ptr %A1571 %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>1572 %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>1573 ret <4 x i16> %tmp31574}1575 1576define <2 x i32> @shrn2s(ptr %A) nounwind {1577; CHECK-LABEL: shrn2s:1578; CHECK: // %bb.0:1579; CHECK-NEXT: ldr q0, [x0]1580; CHECK-NEXT: shrn v0.2s, v0.2d, #11581; CHECK-NEXT: ret1582 %tmp1 = load <2 x i64>, ptr %A1583 %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>1584 %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>1585 ret <2 x i32> %tmp31586}1587 1588define <16 x i8> @shrn16b(ptr %ret, ptr %A) nounwind {1589; CHECK-LABEL: shrn16b:1590; CHECK: // %bb.0:1591; CHECK-NEXT: ldr d0, [x0]1592; CHECK-NEXT: ldr q1, [x1]1593; CHECK-NEXT: shrn2 v0.16b, v1.8h, #11594; CHECK-NEXT: ret1595 %out = load <8 x i8>, ptr %ret1596 %tmp1 = load <8 x i16>, ptr %A1597 %tmp2 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1598 %tmp3 = trunc <8 x i16> %tmp2 to <8 x i8>1599 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1600 ret <16 x i8> %tmp41601}1602 1603define <8 x i16> @shrn8h(ptr %ret, ptr %A) nounwind {1604; CHECK-LABEL: shrn8h:1605; CHECK: // %bb.0:1606; CHECK-NEXT: ldr d0, [x0]1607; CHECK-NEXT: ldr q1, [x1]1608; CHECK-NEXT: shrn2 v0.8h, v1.4s, #11609; CHECK-NEXT: ret1610 %out = load <4 x i16>, ptr %ret1611 %tmp1 = load <4 x i32>, ptr %A1612 %tmp2 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>1613 %tmp3 = trunc <4 x i32> %tmp2 to <4 x i16>1614 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1615 ret <8 x i16> %tmp41616}1617 1618define <4 x i32> @shrn4s(ptr %ret, ptr %A) nounwind {1619; CHECK-LABEL: shrn4s:1620; CHECK: // %bb.0:1621; CHECK-NEXT: ldr d0, [x0]1622; CHECK-NEXT: ldr q1, [x1]1623; CHECK-NEXT: shrn2 v0.4s, v1.2d, #11624; CHECK-NEXT: ret1625 %out = load <2 x i32>, ptr %ret1626 %tmp1 = load <2 x i64>, ptr %A1627 %tmp2 = lshr <2 x i64> %tmp1, <i64 1, i64 1>1628 %tmp3 = trunc <2 x i64> %tmp2 to <2 x i32>1629 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1630 ret <4 x i32> %tmp41631}1632 1633declare <8 x i8> @llvm.aarch64.neon.shrn.v8i8(<8 x i16>, i32) nounwind readnone1634declare <4 x i16> @llvm.aarch64.neon.shrn.v4i16(<4 x i32>, i32) nounwind readnone1635declare <2 x i32> @llvm.aarch64.neon.shrn.v2i32(<2 x i64>, i32) nounwind readnone1636 1637define i32 @sqshrn1s(i64 %A) nounwind {1638; CHECK-LABEL: sqshrn1s:1639; CHECK: // %bb.0:1640; CHECK-NEXT: fmov d0, x01641; CHECK-NEXT: sqshrn s0, d0, #11642; CHECK-NEXT: fmov w0, s01643; CHECK-NEXT: ret1644 %tmp = call i32 @llvm.aarch64.neon.sqshrn.i32(i64 %A, i32 1)1645 ret i32 %tmp1646}1647 1648define <8 x i8> @sqshrn8b(ptr %A) nounwind {1649; CHECK-LABEL: sqshrn8b:1650; CHECK: // %bb.0:1651; CHECK-NEXT: ldr q0, [x0]1652; CHECK-NEXT: sqshrn v0.8b, v0.8h, #11653; CHECK-NEXT: ret1654 %tmp1 = load <8 x i16>, ptr %A1655 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)1656 ret <8 x i8> %tmp31657}1658 1659define <4 x i16> @sqshrn4h(ptr %A) nounwind {1660; CHECK-LABEL: sqshrn4h:1661; CHECK: // %bb.0:1662; CHECK-NEXT: ldr q0, [x0]1663; CHECK-NEXT: sqshrn v0.4h, v0.4s, #11664; CHECK-NEXT: ret1665 %tmp1 = load <4 x i32>, ptr %A1666 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)1667 ret <4 x i16> %tmp31668}1669 1670define <2 x i32> @sqshrn2s(ptr %A) nounwind {1671; CHECK-LABEL: sqshrn2s:1672; CHECK: // %bb.0:1673; CHECK-NEXT: ldr q0, [x0]1674; CHECK-NEXT: sqshrn v0.2s, v0.2d, #11675; CHECK-NEXT: ret1676 %tmp1 = load <2 x i64>, ptr %A1677 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)1678 ret <2 x i32> %tmp31679}1680 1681 1682define <16 x i8> @sqshrn16b(ptr %ret, ptr %A) nounwind {1683; CHECK-LABEL: sqshrn16b:1684; CHECK: // %bb.0:1685; CHECK-NEXT: ldr d0, [x0]1686; CHECK-NEXT: ldr q1, [x1]1687; CHECK-NEXT: sqshrn2 v0.16b, v1.8h, #11688; CHECK-NEXT: ret1689 %out = load <8 x i8>, ptr %ret1690 %tmp1 = load <8 x i16>, ptr %A1691 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16> %tmp1, i32 1)1692 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1693 ret <16 x i8> %tmp41694}1695 1696define <8 x i16> @sqshrn8h(ptr %ret, ptr %A) nounwind {1697; CHECK-LABEL: sqshrn8h:1698; CHECK: // %bb.0:1699; CHECK-NEXT: ldr d0, [x0]1700; CHECK-NEXT: ldr q1, [x1]1701; CHECK-NEXT: sqshrn2 v0.8h, v1.4s, #11702; CHECK-NEXT: ret1703 %out = load <4 x i16>, ptr %ret1704 %tmp1 = load <4 x i32>, ptr %A1705 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32> %tmp1, i32 1)1706 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1707 ret <8 x i16> %tmp41708}1709 1710define <4 x i32> @sqshrn4s(ptr %ret, ptr %A) nounwind {1711; CHECK-LABEL: sqshrn4s:1712; CHECK: // %bb.0:1713; CHECK-NEXT: ldr d0, [x0]1714; CHECK-NEXT: ldr q1, [x1]1715; CHECK-NEXT: sqshrn2 v0.4s, v1.2d, #11716; CHECK-NEXT: ret1717 %out = load <2 x i32>, ptr %ret1718 %tmp1 = load <2 x i64>, ptr %A1719 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64> %tmp1, i32 1)1720 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1721 ret <4 x i32> %tmp41722}1723 1724declare i32 @llvm.aarch64.neon.sqshrn.i32(i64, i32) nounwind readnone1725declare <8 x i8> @llvm.aarch64.neon.sqshrn.v8i8(<8 x i16>, i32) nounwind readnone1726declare <4 x i16> @llvm.aarch64.neon.sqshrn.v4i16(<4 x i32>, i32) nounwind readnone1727declare <2 x i32> @llvm.aarch64.neon.sqshrn.v2i32(<2 x i64>, i32) nounwind readnone1728 1729define i32 @sqshrun1s(i64 %A) nounwind {1730; CHECK-LABEL: sqshrun1s:1731; CHECK: // %bb.0:1732; CHECK-NEXT: fmov d0, x01733; CHECK-NEXT: sqshrun s0, d0, #11734; CHECK-NEXT: fmov w0, s01735; CHECK-NEXT: ret1736 %tmp = call i32 @llvm.aarch64.neon.sqshrun.i32(i64 %A, i32 1)1737 ret i32 %tmp1738}1739 1740define <8 x i8> @sqshrun8b(ptr %A) nounwind {1741; CHECK-LABEL: sqshrun8b:1742; CHECK: // %bb.0:1743; CHECK-NEXT: ldr q0, [x0]1744; CHECK-NEXT: sqshrun v0.8b, v0.8h, #11745; CHECK-NEXT: ret1746 %tmp1 = load <8 x i16>, ptr %A1747 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)1748 ret <8 x i8> %tmp31749}1750 1751define <4 x i16> @sqshrun4h(ptr %A) nounwind {1752; CHECK-LABEL: sqshrun4h:1753; CHECK: // %bb.0:1754; CHECK-NEXT: ldr q0, [x0]1755; CHECK-NEXT: sqshrun v0.4h, v0.4s, #11756; CHECK-NEXT: ret1757 %tmp1 = load <4 x i32>, ptr %A1758 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)1759 ret <4 x i16> %tmp31760}1761 1762define <2 x i32> @sqshrun2s(ptr %A) nounwind {1763; CHECK-LABEL: sqshrun2s:1764; CHECK: // %bb.0:1765; CHECK-NEXT: ldr q0, [x0]1766; CHECK-NEXT: sqshrun v0.2s, v0.2d, #11767; CHECK-NEXT: ret1768 %tmp1 = load <2 x i64>, ptr %A1769 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)1770 ret <2 x i32> %tmp31771}1772 1773define <16 x i8> @sqshrun16b(ptr %ret, ptr %A) nounwind {1774; CHECK-LABEL: sqshrun16b:1775; CHECK: // %bb.0:1776; CHECK-NEXT: ldr d0, [x0]1777; CHECK-NEXT: ldr q1, [x1]1778; CHECK-NEXT: sqshrun2 v0.16b, v1.8h, #11779; CHECK-NEXT: ret1780 %out = load <8 x i8>, ptr %ret1781 %tmp1 = load <8 x i16>, ptr %A1782 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16> %tmp1, i32 1)1783 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1784 ret <16 x i8> %tmp41785}1786 1787define <8 x i16> @sqshrun8h(ptr %ret, ptr %A) nounwind {1788; CHECK-LABEL: sqshrun8h:1789; CHECK: // %bb.0:1790; CHECK-NEXT: ldr d0, [x0]1791; CHECK-NEXT: ldr q1, [x1]1792; CHECK-NEXT: sqshrun2 v0.8h, v1.4s, #11793; CHECK-NEXT: ret1794 %out = load <4 x i16>, ptr %ret1795 %tmp1 = load <4 x i32>, ptr %A1796 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32> %tmp1, i32 1)1797 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1798 ret <8 x i16> %tmp41799}1800 1801define <4 x i32> @sqshrun4s(ptr %ret, ptr %A) nounwind {1802; CHECK-LABEL: sqshrun4s:1803; CHECK: // %bb.0:1804; CHECK-NEXT: ldr d0, [x0]1805; CHECK-NEXT: ldr q1, [x1]1806; CHECK-NEXT: sqshrun2 v0.4s, v1.2d, #11807; CHECK-NEXT: ret1808 %out = load <2 x i32>, ptr %ret1809 %tmp1 = load <2 x i64>, ptr %A1810 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64> %tmp1, i32 1)1811 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1812 ret <4 x i32> %tmp41813}1814 1815declare i32 @llvm.aarch64.neon.sqshrun.i32(i64, i32) nounwind readnone1816declare <8 x i8> @llvm.aarch64.neon.sqshrun.v8i8(<8 x i16>, i32) nounwind readnone1817declare <4 x i16> @llvm.aarch64.neon.sqshrun.v4i16(<4 x i32>, i32) nounwind readnone1818declare <2 x i32> @llvm.aarch64.neon.sqshrun.v2i32(<2 x i64>, i32) nounwind readnone1819 1820define i32 @sqrshrn1s(i64 %A) nounwind {1821; CHECK-LABEL: sqrshrn1s:1822; CHECK: // %bb.0:1823; CHECK-NEXT: fmov d0, x01824; CHECK-NEXT: sqrshrn s0, d0, #11825; CHECK-NEXT: fmov w0, s01826; CHECK-NEXT: ret1827 %tmp = call i32 @llvm.aarch64.neon.sqrshrn.i32(i64 %A, i32 1)1828 ret i32 %tmp1829}1830 1831define <8 x i8> @sqrshrn8b(ptr %A) nounwind {1832; CHECK-LABEL: sqrshrn8b:1833; CHECK: // %bb.0:1834; CHECK-NEXT: ldr q0, [x0]1835; CHECK-NEXT: sqrshrn v0.8b, v0.8h, #11836; CHECK-NEXT: ret1837 %tmp1 = load <8 x i16>, ptr %A1838 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)1839 ret <8 x i8> %tmp31840}1841 1842define <4 x i16> @sqrshrn4h(ptr %A) nounwind {1843; CHECK-LABEL: sqrshrn4h:1844; CHECK: // %bb.0:1845; CHECK-NEXT: ldr q0, [x0]1846; CHECK-NEXT: sqrshrn v0.4h, v0.4s, #11847; CHECK-NEXT: ret1848 %tmp1 = load <4 x i32>, ptr %A1849 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)1850 ret <4 x i16> %tmp31851}1852 1853define <2 x i32> @sqrshrn2s(ptr %A) nounwind {1854; CHECK-LABEL: sqrshrn2s:1855; CHECK: // %bb.0:1856; CHECK-NEXT: ldr q0, [x0]1857; CHECK-NEXT: sqrshrn v0.2s, v0.2d, #11858; CHECK-NEXT: ret1859 %tmp1 = load <2 x i64>, ptr %A1860 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)1861 ret <2 x i32> %tmp31862}1863 1864define <16 x i8> @sqrshrn16b(ptr %ret, ptr %A) nounwind {1865; CHECK-LABEL: sqrshrn16b:1866; CHECK: // %bb.0:1867; CHECK-NEXT: ldr d0, [x0]1868; CHECK-NEXT: ldr q1, [x1]1869; CHECK-NEXT: sqrshrn2 v0.16b, v1.8h, #11870; CHECK-NEXT: ret1871 %out = load <8 x i8>, ptr %ret1872 %tmp1 = load <8 x i16>, ptr %A1873 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16> %tmp1, i32 1)1874 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1875 ret <16 x i8> %tmp41876}1877 1878define <8 x i16> @sqrshrn8h(ptr %ret, ptr %A) nounwind {1879; CHECK-LABEL: sqrshrn8h:1880; CHECK: // %bb.0:1881; CHECK-NEXT: ldr d0, [x0]1882; CHECK-NEXT: ldr q1, [x1]1883; CHECK-NEXT: sqrshrn2 v0.8h, v1.4s, #11884; CHECK-NEXT: ret1885 %out = load <4 x i16>, ptr %ret1886 %tmp1 = load <4 x i32>, ptr %A1887 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32> %tmp1, i32 1)1888 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1889 ret <8 x i16> %tmp41890}1891 1892define <4 x i32> @sqrshrn4s(ptr %ret, ptr %A) nounwind {1893; CHECK-LABEL: sqrshrn4s:1894; CHECK: // %bb.0:1895; CHECK-NEXT: ldr d0, [x0]1896; CHECK-NEXT: ldr q1, [x1]1897; CHECK-NEXT: sqrshrn2 v0.4s, v1.2d, #11898; CHECK-NEXT: ret1899 %out = load <2 x i32>, ptr %ret1900 %tmp1 = load <2 x i64>, ptr %A1901 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64> %tmp1, i32 1)1902 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1903 ret <4 x i32> %tmp41904}1905 1906declare i32 @llvm.aarch64.neon.sqrshrn.i32(i64, i32) nounwind readnone1907declare <8 x i8> @llvm.aarch64.neon.sqrshrn.v8i8(<8 x i16>, i32) nounwind readnone1908declare <4 x i16> @llvm.aarch64.neon.sqrshrn.v4i16(<4 x i32>, i32) nounwind readnone1909declare <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64>, i32) nounwind readnone1910 1911define i32 @sqrshrun1s(i64 %A) nounwind {1912; CHECK-LABEL: sqrshrun1s:1913; CHECK: // %bb.0:1914; CHECK-NEXT: fmov d0, x01915; CHECK-NEXT: sqrshrun s0, d0, #11916; CHECK-NEXT: fmov w0, s01917; CHECK-NEXT: ret1918 %tmp = call i32 @llvm.aarch64.neon.sqrshrun.i32(i64 %A, i32 1)1919 ret i32 %tmp1920}1921 1922define <8 x i8> @sqrshrun8b(ptr %A) nounwind {1923; CHECK-LABEL: sqrshrun8b:1924; CHECK: // %bb.0:1925; CHECK-NEXT: ldr q0, [x0]1926; CHECK-NEXT: sqrshrun v0.8b, v0.8h, #11927; CHECK-NEXT: ret1928 %tmp1 = load <8 x i16>, ptr %A1929 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)1930 ret <8 x i8> %tmp31931}1932 1933define <4 x i16> @sqrshrun4h(ptr %A) nounwind {1934; CHECK-LABEL: sqrshrun4h:1935; CHECK: // %bb.0:1936; CHECK-NEXT: ldr q0, [x0]1937; CHECK-NEXT: sqrshrun v0.4h, v0.4s, #11938; CHECK-NEXT: ret1939 %tmp1 = load <4 x i32>, ptr %A1940 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)1941 ret <4 x i16> %tmp31942}1943 1944define <2 x i32> @sqrshrun2s(ptr %A) nounwind {1945; CHECK-LABEL: sqrshrun2s:1946; CHECK: // %bb.0:1947; CHECK-NEXT: ldr q0, [x0]1948; CHECK-NEXT: sqrshrun v0.2s, v0.2d, #11949; CHECK-NEXT: ret1950 %tmp1 = load <2 x i64>, ptr %A1951 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)1952 ret <2 x i32> %tmp31953}1954 1955define <16 x i8> @sqrshrun16b(ptr %ret, ptr %A) nounwind {1956; CHECK-LABEL: sqrshrun16b:1957; CHECK: // %bb.0:1958; CHECK-NEXT: ldr d0, [x0]1959; CHECK-NEXT: ldr q1, [x1]1960; CHECK-NEXT: sqrshrun2 v0.16b, v1.8h, #11961; CHECK-NEXT: ret1962 %out = load <8 x i8>, ptr %ret1963 %tmp1 = load <8 x i16>, ptr %A1964 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16> %tmp1, i32 1)1965 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1966 ret <16 x i8> %tmp41967}1968 1969define <8 x i16> @sqrshrun8h(ptr %ret, ptr %A) nounwind {1970; CHECK-LABEL: sqrshrun8h:1971; CHECK: // %bb.0:1972; CHECK-NEXT: ldr d0, [x0]1973; CHECK-NEXT: ldr q1, [x1]1974; CHECK-NEXT: sqrshrun2 v0.8h, v1.4s, #11975; CHECK-NEXT: ret1976 %out = load <4 x i16>, ptr %ret1977 %tmp1 = load <4 x i32>, ptr %A1978 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32> %tmp1, i32 1)1979 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1980 ret <8 x i16> %tmp41981}1982 1983define <4 x i32> @sqrshrun4s(ptr %ret, ptr %A) nounwind {1984; CHECK-LABEL: sqrshrun4s:1985; CHECK: // %bb.0:1986; CHECK-NEXT: ldr d0, [x0]1987; CHECK-NEXT: ldr q1, [x1]1988; CHECK-NEXT: sqrshrun2 v0.4s, v1.2d, #11989; CHECK-NEXT: ret1990 %out = load <2 x i32>, ptr %ret1991 %tmp1 = load <2 x i64>, ptr %A1992 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64> %tmp1, i32 1)1993 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1994 ret <4 x i32> %tmp41995}1996 1997declare i32 @llvm.aarch64.neon.sqrshrun.i32(i64, i32) nounwind readnone1998declare <8 x i8> @llvm.aarch64.neon.sqrshrun.v8i8(<8 x i16>, i32) nounwind readnone1999declare <4 x i16> @llvm.aarch64.neon.sqrshrun.v4i16(<4 x i32>, i32) nounwind readnone2000declare <2 x i32> @llvm.aarch64.neon.sqrshrun.v2i32(<2 x i64>, i32) nounwind readnone2001 2002define i32 @uqrshrn1s(i64 %A) nounwind {2003; CHECK-LABEL: uqrshrn1s:2004; CHECK: // %bb.0:2005; CHECK-NEXT: fmov d0, x02006; CHECK-NEXT: uqrshrn s0, d0, #12007; CHECK-NEXT: fmov w0, s02008; CHECK-NEXT: ret2009 %tmp = call i32 @llvm.aarch64.neon.uqrshrn.i32(i64 %A, i32 1)2010 ret i32 %tmp2011}2012 2013define <8 x i8> @uqrshrn8b(ptr %A) nounwind {2014; CHECK-LABEL: uqrshrn8b:2015; CHECK: // %bb.0:2016; CHECK-NEXT: ldr q0, [x0]2017; CHECK-NEXT: uqrshrn v0.8b, v0.8h, #12018; CHECK-NEXT: ret2019 %tmp1 = load <8 x i16>, ptr %A2020 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)2021 ret <8 x i8> %tmp32022}2023 2024define <4 x i16> @uqrshrn4h(ptr %A) nounwind {2025; CHECK-LABEL: uqrshrn4h:2026; CHECK: // %bb.0:2027; CHECK-NEXT: ldr q0, [x0]2028; CHECK-NEXT: uqrshrn v0.4h, v0.4s, #12029; CHECK-NEXT: ret2030 %tmp1 = load <4 x i32>, ptr %A2031 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)2032 ret <4 x i16> %tmp32033}2034 2035define <2 x i32> @uqrshrn2s(ptr %A) nounwind {2036; CHECK-LABEL: uqrshrn2s:2037; CHECK: // %bb.0:2038; CHECK-NEXT: ldr q0, [x0]2039; CHECK-NEXT: uqrshrn v0.2s, v0.2d, #12040; CHECK-NEXT: ret2041 %tmp1 = load <2 x i64>, ptr %A2042 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)2043 ret <2 x i32> %tmp32044}2045 2046define <16 x i8> @uqrshrn16b(ptr %ret, ptr %A) nounwind {2047; CHECK-LABEL: uqrshrn16b:2048; CHECK: // %bb.0:2049; CHECK-NEXT: ldr d0, [x0]2050; CHECK-NEXT: ldr q1, [x1]2051; CHECK-NEXT: uqrshrn2 v0.16b, v1.8h, #12052; CHECK-NEXT: ret2053 %out = load <8 x i8>, ptr %ret2054 %tmp1 = load <8 x i16>, ptr %A2055 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16> %tmp1, i32 1)2056 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>2057 ret <16 x i8> %tmp42058}2059 2060define <8 x i16> @uqrshrn8h(ptr %ret, ptr %A) nounwind {2061; CHECK-LABEL: uqrshrn8h:2062; CHECK: // %bb.0:2063; CHECK-NEXT: ldr d0, [x0]2064; CHECK-NEXT: ldr q1, [x1]2065; CHECK-NEXT: uqrshrn2 v0.8h, v1.4s, #12066; CHECK-NEXT: ret2067 %out = load <4 x i16>, ptr %ret2068 %tmp1 = load <4 x i32>, ptr %A2069 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32> %tmp1, i32 1)2070 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2071 ret <8 x i16> %tmp42072}2073 2074define <4 x i32> @uqrshrn4s(ptr %ret, ptr %A) nounwind {2075; CHECK-LABEL: uqrshrn4s:2076; CHECK: // %bb.0:2077; CHECK-NEXT: ldr d0, [x0]2078; CHECK-NEXT: ldr q1, [x1]2079; CHECK-NEXT: uqrshrn2 v0.4s, v1.2d, #12080; CHECK-NEXT: ret2081 %out = load <2 x i32>, ptr %ret2082 %tmp1 = load <2 x i64>, ptr %A2083 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64> %tmp1, i32 1)2084 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2085 ret <4 x i32> %tmp42086}2087 2088declare i32 @llvm.aarch64.neon.uqrshrn.i32(i64, i32) nounwind readnone2089declare <8 x i8> @llvm.aarch64.neon.uqrshrn.v8i8(<8 x i16>, i32) nounwind readnone2090declare <4 x i16> @llvm.aarch64.neon.uqrshrn.v4i16(<4 x i32>, i32) nounwind readnone2091declare <2 x i32> @llvm.aarch64.neon.uqrshrn.v2i32(<2 x i64>, i32) nounwind readnone2092 2093define i32 @uqshrn1s(i64 %A) nounwind {2094; CHECK-LABEL: uqshrn1s:2095; CHECK: // %bb.0:2096; CHECK-NEXT: fmov d0, x02097; CHECK-NEXT: uqshrn s0, d0, #12098; CHECK-NEXT: fmov w0, s02099; CHECK-NEXT: ret2100 %tmp = call i32 @llvm.aarch64.neon.uqshrn.i32(i64 %A, i32 1)2101 ret i32 %tmp2102}2103 2104define <8 x i8> @uqshrn8b(ptr %A) nounwind {2105; CHECK-LABEL: uqshrn8b:2106; CHECK: // %bb.0:2107; CHECK-NEXT: ldr q0, [x0]2108; CHECK-NEXT: uqshrn v0.8b, v0.8h, #12109; CHECK-NEXT: ret2110 %tmp1 = load <8 x i16>, ptr %A2111 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)2112 ret <8 x i8> %tmp32113}2114 2115define <4 x i16> @uqshrn4h(ptr %A) nounwind {2116; CHECK-LABEL: uqshrn4h:2117; CHECK: // %bb.0:2118; CHECK-NEXT: ldr q0, [x0]2119; CHECK-NEXT: uqshrn v0.4h, v0.4s, #12120; CHECK-NEXT: ret2121 %tmp1 = load <4 x i32>, ptr %A2122 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)2123 ret <4 x i16> %tmp32124}2125 2126define <2 x i32> @uqshrn2s(ptr %A) nounwind {2127; CHECK-LABEL: uqshrn2s:2128; CHECK: // %bb.0:2129; CHECK-NEXT: ldr q0, [x0]2130; CHECK-NEXT: uqshrn v0.2s, v0.2d, #12131; CHECK-NEXT: ret2132 %tmp1 = load <2 x i64>, ptr %A2133 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)2134 ret <2 x i32> %tmp32135}2136 2137define <16 x i8> @uqshrn16b(ptr %ret, ptr %A) nounwind {2138; CHECK-LABEL: uqshrn16b:2139; CHECK: // %bb.0:2140; CHECK-NEXT: ldr d0, [x0]2141; CHECK-NEXT: ldr q1, [x1]2142; CHECK-NEXT: uqshrn2 v0.16b, v1.8h, #12143; CHECK-NEXT: ret2144 %out = load <8 x i8>, ptr %ret2145 %tmp1 = load <8 x i16>, ptr %A2146 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16> %tmp1, i32 1)2147 %tmp4 = shufflevector <8 x i8> %out, <8 x i8> %tmp3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>2148 ret <16 x i8> %tmp42149}2150 2151define <8 x i16> @uqshrn8h(ptr %ret, ptr %A) nounwind {2152; CHECK-LABEL: uqshrn8h:2153; CHECK: // %bb.0:2154; CHECK-NEXT: ldr d0, [x0]2155; CHECK-NEXT: ldr q1, [x1]2156; CHECK-NEXT: uqshrn2 v0.8h, v1.4s, #12157; CHECK-NEXT: ret2158 %out = load <4 x i16>, ptr %ret2159 %tmp1 = load <4 x i32>, ptr %A2160 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32> %tmp1, i32 1)2161 %tmp4 = shufflevector <4 x i16> %out, <4 x i16> %tmp3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2162 ret <8 x i16> %tmp42163}2164 2165define <4 x i32> @uqshrn4s(ptr %ret, ptr %A) nounwind {2166; CHECK-LABEL: uqshrn4s:2167; CHECK: // %bb.0:2168; CHECK-NEXT: ldr d0, [x0]2169; CHECK-NEXT: ldr q1, [x1]2170; CHECK-NEXT: uqshrn2 v0.4s, v1.2d, #12171; CHECK-NEXT: ret2172 %out = load <2 x i32>, ptr %ret2173 %tmp1 = load <2 x i64>, ptr %A2174 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64> %tmp1, i32 1)2175 %tmp4 = shufflevector <2 x i32> %out, <2 x i32> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2176 ret <4 x i32> %tmp42177}2178 2179declare i32 @llvm.aarch64.neon.uqshrn.i32(i64, i32) nounwind readnone2180declare <8 x i8> @llvm.aarch64.neon.uqshrn.v8i8(<8 x i16>, i32) nounwind readnone2181declare <4 x i16> @llvm.aarch64.neon.uqshrn.v4i16(<4 x i32>, i32) nounwind readnone2182declare <2 x i32> @llvm.aarch64.neon.uqshrn.v2i32(<2 x i64>, i32) nounwind readnone2183 2184define <8 x i16> @ushll8h(ptr %A) nounwind {2185; CHECK-LABEL: ushll8h:2186; CHECK: // %bb.0:2187; CHECK-NEXT: ldr d0, [x0]2188; CHECK-NEXT: ushll v0.8h, v0.8b, #12189; CHECK-NEXT: ret2190 %tmp1 = load <8 x i8>, ptr %A2191 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>2192 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>2193 ret <8 x i16> %tmp32194}2195 2196define <4 x i32> @ushll4s(ptr %A) nounwind {2197; CHECK-LABEL: ushll4s:2198; CHECK: // %bb.0:2199; CHECK-NEXT: ldr d0, [x0]2200; CHECK-NEXT: ushll v0.4s, v0.4h, #12201; CHECK-NEXT: ret2202 %tmp1 = load <4 x i16>, ptr %A2203 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>2204 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>2205 ret <4 x i32> %tmp32206}2207 2208define <2 x i64> @ushll2d(ptr %A) nounwind {2209; CHECK-LABEL: ushll2d:2210; CHECK: // %bb.0:2211; CHECK-NEXT: ldr d0, [x0]2212; CHECK-NEXT: ushll v0.2d, v0.2s, #12213; CHECK-NEXT: ret2214 %tmp1 = load <2 x i32>, ptr %A2215 %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>2216 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>2217 ret <2 x i64> %tmp32218}2219 2220define <8 x i16> @ushll2_8h(ptr %A) nounwind {2221; CHECK-SD-LABEL: ushll2_8h:2222; CHECK-SD: // %bb.0:2223; CHECK-SD-NEXT: ldr d0, [x0, #8]2224; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #12225; CHECK-SD-NEXT: ret2226;2227; CHECK-GI-LABEL: ushll2_8h:2228; CHECK-GI: // %bb.0:2229; CHECK-GI-NEXT: ldr q0, [x0]2230; CHECK-GI-NEXT: mov d0, v0.d[1]2231; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #12232; CHECK-GI-NEXT: ret2233 %load1 = load <16 x i8>, ptr %A2234 %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>2235 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>2236 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>2237 ret <8 x i16> %tmp32238}2239 2240define <4 x i32> @ushll2_4s(ptr %A) nounwind {2241; CHECK-SD-LABEL: ushll2_4s:2242; CHECK-SD: // %bb.0:2243; CHECK-SD-NEXT: ldr d0, [x0, #8]2244; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #12245; CHECK-SD-NEXT: ret2246;2247; CHECK-GI-LABEL: ushll2_4s:2248; CHECK-GI: // %bb.0:2249; CHECK-GI-NEXT: ldr q0, [x0]2250; CHECK-GI-NEXT: mov d0, v0.d[1]2251; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #12252; CHECK-GI-NEXT: ret2253 %load1 = load <8 x i16>, ptr %A2254 %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>2255 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>2256 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>2257 ret <4 x i32> %tmp32258}2259 2260define <2 x i64> @ushll2_2d(ptr %A) nounwind {2261; CHECK-SD-LABEL: ushll2_2d:2262; CHECK-SD: // %bb.0:2263; CHECK-SD-NEXT: ldr d0, [x0, #8]2264; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #12265; CHECK-SD-NEXT: ret2266;2267; CHECK-GI-LABEL: ushll2_2d:2268; CHECK-GI: // %bb.0:2269; CHECK-GI-NEXT: ldr q0, [x0]2270; CHECK-GI-NEXT: mov d0, v0.d[1]2271; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #12272; CHECK-GI-NEXT: ret2273 %load1 = load <4 x i32>, ptr %A2274 %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>2275 %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>2276 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>2277 ret <2 x i64> %tmp32278}2279 2280declare <16 x i8> @llvm.aarch64.neon.ushl.v16i8(<16 x i8>, <16 x i8>)2281declare <8 x i16> @llvm.aarch64.neon.ushl.v8i16(<8 x i16>, <8 x i16>)2282declare <4 x i32> @llvm.aarch64.neon.ushl.v4i32(<4 x i32>, <4 x i32>)2283declare <2 x i64> @llvm.aarch64.neon.ushl.v2i64(<2 x i64>, <2 x i64>)2284declare <1 x i64> @llvm.aarch64.neon.ushl.v1i64(<1 x i64>, <1 x i64>)2285declare i64 @llvm.aarch64.neon.ushl.i64(i64, i64)2286 2287define <8 x i16> @neon_ushll8h_constant_shift(ptr %A) nounwind {2288; CHECK-SD-LABEL: neon_ushll8h_constant_shift:2289; CHECK-SD: // %bb.0:2290; CHECK-SD-NEXT: ldr d0, [x0]2291; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #12292; CHECK-SD-NEXT: ret2293;2294; CHECK-GI-LABEL: neon_ushll8h_constant_shift:2295; CHECK-GI: // %bb.0:2296; CHECK-GI-NEXT: ldr d0, [x0]2297; CHECK-GI-NEXT: movi v1.8h, #12298; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #02299; CHECK-GI-NEXT: ushl v0.8h, v0.8h, v1.8h2300; CHECK-GI-NEXT: ret2301 %tmp1 = load <8 x i8>, ptr %A2302 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>2303 %tmp3 = call <8 x i16> @llvm.aarch64.neon.ushl.v8i16(<8 x i16> %tmp2, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)2304 ret <8 x i16> %tmp32305}2306 2307define <8 x i16> @neon_ushl8h_no_constant_shift(ptr %A) nounwind {2308; CHECK-LABEL: neon_ushl8h_no_constant_shift:2309; CHECK: // %bb.0:2310; CHECK-NEXT: ldr d0, [x0]2311; CHECK-NEXT: ushll v0.8h, v0.8b, #02312; CHECK-NEXT: ushl v0.8h, v0.8h, v0.8h2313; CHECK-NEXT: ret2314 %tmp1 = load <8 x i8>, ptr %A2315 %tmp2 = zext <8 x i8> %tmp1 to <8 x i16>2316 %tmp3 = call <8 x i16> @llvm.aarch64.neon.ushl.v8i16(<8 x i16> %tmp2, <8 x i16> %tmp2)2317 ret <8 x i16> %tmp32318}2319 2320define <4 x i32> @neon_ushl8h_constant_shift_extend_not_2x(ptr %A) nounwind {2321; CHECK-SD-LABEL: neon_ushl8h_constant_shift_extend_not_2x:2322; CHECK-SD: // %bb.0:2323; CHECK-SD-NEXT: ldr s0, [x0]2324; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #02325; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #12326; CHECK-SD-NEXT: ret2327;2328; CHECK-GI-LABEL: neon_ushl8h_constant_shift_extend_not_2x:2329; CHECK-GI: // %bb.0:2330; CHECK-GI-NEXT: ldr w8, [x0]2331; CHECK-GI-NEXT: movi v0.4s, #12332; CHECK-GI-NEXT: fmov s1, w82333; CHECK-GI-NEXT: uxtb w8, w82334; CHECK-GI-NEXT: mov b2, v1.b[2]2335; CHECK-GI-NEXT: mov b3, v1.b[1]2336; CHECK-GI-NEXT: mov b4, v1.b[3]2337; CHECK-GI-NEXT: fmov s1, w82338; CHECK-GI-NEXT: fmov w9, s22339; CHECK-GI-NEXT: fmov w10, s32340; CHECK-GI-NEXT: fmov w11, s42341; CHECK-GI-NEXT: uxtb w9, w92342; CHECK-GI-NEXT: uxtb w10, w102343; CHECK-GI-NEXT: uxtb w11, w112344; CHECK-GI-NEXT: fmov s2, w92345; CHECK-GI-NEXT: mov v1.h[1], w102346; CHECK-GI-NEXT: mov v2.h[1], w112347; CHECK-GI-NEXT: ushll v1.4s, v1.4h, #02348; CHECK-GI-NEXT: ushll v2.4s, v2.4h, #02349; CHECK-GI-NEXT: mov v1.d[1], v2.d[0]2350; CHECK-GI-NEXT: ushl v0.4s, v1.4s, v0.4s2351; CHECK-GI-NEXT: ret2352 %tmp1 = load <4 x i8>, ptr %A2353 %tmp2 = zext <4 x i8> %tmp1 to <4 x i32>2354 %tmp3 = call <4 x i32> @llvm.aarch64.neon.ushl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2355 ret <4 x i32> %tmp32356}2357 2358define <8 x i16> @neon_ushl8_noext_constant_shift(ptr %A) nounwind {2359; CHECK-SD-LABEL: neon_ushl8_noext_constant_shift:2360; CHECK-SD: // %bb.0:2361; CHECK-SD-NEXT: ldr q0, [x0]2362; CHECK-SD-NEXT: add v0.8h, v0.8h, v0.8h2363; CHECK-SD-NEXT: ret2364;2365; CHECK-GI-LABEL: neon_ushl8_noext_constant_shift:2366; CHECK-GI: // %bb.0:2367; CHECK-GI-NEXT: movi v0.8h, #12368; CHECK-GI-NEXT: ldr q1, [x0]2369; CHECK-GI-NEXT: ushl v0.8h, v1.8h, v0.8h2370; CHECK-GI-NEXT: ret2371 %tmp1 = load <8 x i16>, ptr %A2372 %tmp3 = call <8 x i16> @llvm.aarch64.neon.ushl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)2373 ret <8 x i16> %tmp32374}2375 2376define <4 x i32> @neon_ushll4s_constant_shift(ptr %A) nounwind {2377; CHECK-SD-LABEL: neon_ushll4s_constant_shift:2378; CHECK-SD: // %bb.0:2379; CHECK-SD-NEXT: ldr d0, [x0]2380; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #12381; CHECK-SD-NEXT: ret2382;2383; CHECK-GI-LABEL: neon_ushll4s_constant_shift:2384; CHECK-GI: // %bb.0:2385; CHECK-GI-NEXT: ldr d0, [x0]2386; CHECK-GI-NEXT: movi v1.4s, #12387; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #02388; CHECK-GI-NEXT: ushl v0.4s, v0.4s, v1.4s2389; CHECK-GI-NEXT: ret2390 %tmp1 = load <4 x i16>, ptr %A2391 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>2392 %tmp3 = call <4 x i32> @llvm.aarch64.neon.ushl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2393 ret <4 x i32> %tmp32394}2395 2396; FIXME: unnecessary ushll.4s v0, v0, #0?2397define <4 x i32> @neon_ushll4s_neg_constant_shift(ptr %A) nounwind {2398; CHECK-SD-LABEL: neon_ushll4s_neg_constant_shift:2399; CHECK-SD: // %bb.0:2400; CHECK-SD-NEXT: ldr d0, [x0]2401; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #02402; CHECK-SD-NEXT: ushr v0.4s, v0.4s, #12403; CHECK-SD-NEXT: ret2404;2405; CHECK-GI-LABEL: neon_ushll4s_neg_constant_shift:2406; CHECK-GI: // %bb.0:2407; CHECK-GI-NEXT: ldr d0, [x0]2408; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff2409; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #02410; CHECK-GI-NEXT: ushl v0.4s, v0.4s, v1.4s2411; CHECK-GI-NEXT: ret2412 %tmp1 = load <4 x i16>, ptr %A2413 %tmp2 = zext <4 x i16> %tmp1 to <4 x i32>2414 %tmp3 = call <4 x i32> @llvm.aarch64.neon.ushl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)2415 ret <4 x i32> %tmp32416}2417 2418; FIXME: should be constant folded.2419define <4 x i32> @neon_ushll4s_constant_fold() nounwind {2420; CHECK-SD-LABEL: neon_ushll4s_constant_fold:2421; CHECK-SD: // %bb.0:2422; CHECK-SD-NEXT: adrp x8, .LCPI160_02423; CHECK-SD-NEXT: ldr q0, [x8, :lo12:.LCPI160_0]2424; CHECK-SD-NEXT: add v0.4s, v0.4s, v0.4s2425; CHECK-SD-NEXT: ret2426;2427; CHECK-GI-LABEL: neon_ushll4s_constant_fold:2428; CHECK-GI: // %bb.0:2429; CHECK-GI-NEXT: movi v0.4s, #12430; CHECK-GI-NEXT: adrp x8, .LCPI160_02431; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI160_0]2432; CHECK-GI-NEXT: ushl v0.4s, v1.4s, v0.4s2433; CHECK-GI-NEXT: ret2434 %tmp3 = call <4 x i32> @llvm.aarch64.neon.ushl.v4i32(<4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2435 ret <4 x i32> %tmp32436}2437 2438define <2 x i64> @neon_ushll2d_constant_shift(ptr %A) nounwind {2439; CHECK-SD-LABEL: neon_ushll2d_constant_shift:2440; CHECK-SD: // %bb.0:2441; CHECK-SD-NEXT: ldr d0, [x0]2442; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #12443; CHECK-SD-NEXT: ret2444;2445; CHECK-GI-LABEL: neon_ushll2d_constant_shift:2446; CHECK-GI: // %bb.0:2447; CHECK-GI-NEXT: ldr d0, [x0]2448; CHECK-GI-NEXT: adrp x8, .LCPI161_02449; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI161_0]2450; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #02451; CHECK-GI-NEXT: ushl v0.2d, v0.2d, v1.2d2452; CHECK-GI-NEXT: ret2453 %tmp1 = load <2 x i32>, ptr %A2454 %tmp2 = zext <2 x i32> %tmp1 to <2 x i64>2455 %tmp3 = call <2 x i64> @llvm.aarch64.neon.ushl.v2i64(<2 x i64> %tmp2, <2 x i64> <i64 1, i64 1>)2456 ret <2 x i64> %tmp32457}2458 2459define <1 x i64> @neon_ushl_vscalar_constant_shift(ptr %A) nounwind {2460; CHECK-LABEL: neon_ushl_vscalar_constant_shift:2461; CHECK: // %bb.0:2462; CHECK-NEXT: movi v0.2d, #00000000000000002463; CHECK-NEXT: ldr s1, [x0]2464; CHECK-NEXT: zip1 v0.2s, v1.2s, v0.2s2465; CHECK-NEXT: shl d0, d0, #12466; CHECK-NEXT: ret2467 %tmp1 = load <1 x i32>, ptr %A2468 %tmp2 = zext <1 x i32> %tmp1 to <1 x i64>2469 %tmp3 = call <1 x i64> @llvm.aarch64.neon.ushl.v1i64(<1 x i64> %tmp2, <1 x i64> <i64 1>)2470 ret <1 x i64> %tmp32471}2472 2473define i64 @neon_ushl_scalar_constant_shift(ptr %A) nounwind {2474; CHECK-LABEL: neon_ushl_scalar_constant_shift:2475; CHECK: // %bb.0:2476; CHECK-NEXT: ldr w8, [x0]2477; CHECK-NEXT: fmov d0, x82478; CHECK-NEXT: shl d0, d0, #12479; CHECK-NEXT: fmov x0, d02480; CHECK-NEXT: ret2481 %tmp1 = load i32, ptr %A2482 %tmp2 = zext i32 %tmp1 to i642483 %tmp3 = call i64 @llvm.aarch64.neon.ushl.i64(i64 %tmp2, i64 1)2484 ret i64 %tmp32485}2486 2487define <8 x i16> @sshll8h(ptr %A) nounwind {2488; CHECK-LABEL: sshll8h:2489; CHECK: // %bb.0:2490; CHECK-NEXT: ldr d0, [x0]2491; CHECK-NEXT: sshll v0.8h, v0.8b, #12492; CHECK-NEXT: ret2493 %tmp1 = load <8 x i8>, ptr %A2494 %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>2495 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>2496 ret <8 x i16> %tmp32497}2498 2499define <2 x i64> @sshll2d(ptr %A) nounwind {2500; CHECK-LABEL: sshll2d:2501; CHECK: // %bb.0:2502; CHECK-NEXT: ldr d0, [x0]2503; CHECK-NEXT: sshll v0.2d, v0.2s, #12504; CHECK-NEXT: ret2505 %tmp1 = load <2 x i32>, ptr %A2506 %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>2507 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>2508 ret <2 x i64> %tmp32509}2510 2511declare <16 x i8> @llvm.aarch64.neon.sshl.v16i8(<16 x i8>, <16 x i8>)2512declare <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16>, <8 x i16>)2513declare <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32>, <4 x i32>)2514declare <2 x i64> @llvm.aarch64.neon.sshl.v2i64(<2 x i64>, <2 x i64>)2515declare <1 x i64> @llvm.aarch64.neon.sshl.v1i64(<1 x i64>, <1 x i64>)2516declare i64 @llvm.aarch64.neon.sshl.i64(i64, i64)2517 2518define <16 x i8> @neon_sshl16b_constant_shift(ptr %A) nounwind {2519; CHECK-SD-LABEL: neon_sshl16b_constant_shift:2520; CHECK-SD: // %bb.0:2521; CHECK-SD-NEXT: ldr q0, [x0]2522; CHECK-SD-NEXT: add v0.16b, v0.16b, v0.16b2523; CHECK-SD-NEXT: ret2524;2525; CHECK-GI-LABEL: neon_sshl16b_constant_shift:2526; CHECK-GI: // %bb.0:2527; CHECK-GI-NEXT: movi v0.16b, #12528; CHECK-GI-NEXT: ldr q1, [x0]2529; CHECK-GI-NEXT: sshl v0.16b, v1.16b, v0.16b2530; CHECK-GI-NEXT: ret2531 %tmp1 = load <16 x i8>, ptr %A2532 %tmp2 = call <16 x i8> @llvm.aarch64.neon.sshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)2533 ret <16 x i8> %tmp22534}2535 2536define <16 x i8> @neon_sshl16b_non_splat_constant_shift(ptr %A) nounwind {2537; CHECK-SD-LABEL: neon_sshl16b_non_splat_constant_shift:2538; CHECK-SD: // %bb.0:2539; CHECK-SD-NEXT: adrp x8, .LCPI167_02540; CHECK-SD-NEXT: ldr q0, [x0]2541; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI167_0]2542; CHECK-SD-NEXT: sshl v0.16b, v0.16b, v1.16b2543; CHECK-SD-NEXT: ret2544;2545; CHECK-GI-LABEL: neon_sshl16b_non_splat_constant_shift:2546; CHECK-GI: // %bb.0:2547; CHECK-GI-NEXT: adrp x8, .LCPI167_02548; CHECK-GI-NEXT: ldr q1, [x0]2549; CHECK-GI-NEXT: ldr q0, [x8, :lo12:.LCPI167_0]2550; CHECK-GI-NEXT: sshl v0.16b, v1.16b, v0.16b2551; CHECK-GI-NEXT: ret2552 %tmp1 = load <16 x i8>, ptr %A2553 %tmp2 = call <16 x i8> @llvm.aarch64.neon.sshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 6, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)2554 ret <16 x i8> %tmp22555}2556 2557define <16 x i8> @neon_sshl16b_neg_constant_shift(ptr %A) nounwind {2558; CHECK-SD-LABEL: neon_sshl16b_neg_constant_shift:2559; CHECK-SD: // %bb.0:2560; CHECK-SD-NEXT: ldr q0, [x0]2561; CHECK-SD-NEXT: sshr v0.16b, v0.16b, #22562; CHECK-SD-NEXT: ret2563;2564; CHECK-GI-LABEL: neon_sshl16b_neg_constant_shift:2565; CHECK-GI: // %bb.0:2566; CHECK-GI-NEXT: movi v0.16b, #2542567; CHECK-GI-NEXT: ldr q1, [x0]2568; CHECK-GI-NEXT: sshl v0.16b, v1.16b, v0.16b2569; CHECK-GI-NEXT: ret2570 %tmp1 = load <16 x i8>, ptr %A2571 %tmp2 = call <16 x i8> @llvm.aarch64.neon.sshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2>)2572 ret <16 x i8> %tmp22573}2574 2575define <8 x i16> @neon_sshll8h_constant_shift(ptr %A) nounwind {2576; CHECK-SD-LABEL: neon_sshll8h_constant_shift:2577; CHECK-SD: // %bb.0:2578; CHECK-SD-NEXT: ldr d0, [x0]2579; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #12580; CHECK-SD-NEXT: ret2581;2582; CHECK-GI-LABEL: neon_sshll8h_constant_shift:2583; CHECK-GI: // %bb.0:2584; CHECK-GI-NEXT: ldr d0, [x0]2585; CHECK-GI-NEXT: movi v1.8h, #12586; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #02587; CHECK-GI-NEXT: sshl v0.8h, v0.8h, v1.8h2588; CHECK-GI-NEXT: ret2589 %tmp1 = load <8 x i8>, ptr %A2590 %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>2591 %tmp3 = call <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16> %tmp2, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)2592 ret <8 x i16> %tmp32593}2594 2595define <4 x i32> @neon_sshl4s_wrong_ext_constant_shift(ptr %A) nounwind {2596; CHECK-SD-LABEL: neon_sshl4s_wrong_ext_constant_shift:2597; CHECK-SD: // %bb.0:2598; CHECK-SD-NEXT: ldr s0, [x0]2599; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #02600; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #12601; CHECK-SD-NEXT: ret2602;2603; CHECK-GI-LABEL: neon_sshl4s_wrong_ext_constant_shift:2604; CHECK-GI: // %bb.0:2605; CHECK-GI-NEXT: ldr w8, [x0]2606; CHECK-GI-NEXT: movi v0.4s, #12607; CHECK-GI-NEXT: fmov s1, w82608; CHECK-GI-NEXT: sxtb w8, w82609; CHECK-GI-NEXT: mov b2, v1.b[2]2610; CHECK-GI-NEXT: mov b3, v1.b[1]2611; CHECK-GI-NEXT: mov b4, v1.b[3]2612; CHECK-GI-NEXT: fmov s1, w82613; CHECK-GI-NEXT: fmov w9, s22614; CHECK-GI-NEXT: fmov w10, s32615; CHECK-GI-NEXT: fmov w11, s42616; CHECK-GI-NEXT: sxtb w9, w92617; CHECK-GI-NEXT: sxtb w10, w102618; CHECK-GI-NEXT: sxtb w11, w112619; CHECK-GI-NEXT: fmov s2, w92620; CHECK-GI-NEXT: mov v1.h[1], w102621; CHECK-GI-NEXT: mov v2.h[1], w112622; CHECK-GI-NEXT: sshll v1.4s, v1.4h, #02623; CHECK-GI-NEXT: sshll v2.4s, v2.4h, #02624; CHECK-GI-NEXT: mov v1.d[1], v2.d[0]2625; CHECK-GI-NEXT: sshl v0.4s, v1.4s, v0.4s2626; CHECK-GI-NEXT: ret2627 %tmp1 = load <4 x i8>, ptr %A2628 %tmp2 = sext <4 x i8> %tmp1 to <4 x i32>2629 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2630 ret <4 x i32> %tmp32631}2632 2633define <4 x i32> @neon_sshll4s_constant_shift(ptr %A) nounwind {2634; CHECK-SD-LABEL: neon_sshll4s_constant_shift:2635; CHECK-SD: // %bb.0:2636; CHECK-SD-NEXT: ldr d0, [x0]2637; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #12638; CHECK-SD-NEXT: ret2639;2640; CHECK-GI-LABEL: neon_sshll4s_constant_shift:2641; CHECK-GI: // %bb.0:2642; CHECK-GI-NEXT: ldr d0, [x0]2643; CHECK-GI-NEXT: movi v1.4s, #12644; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #02645; CHECK-GI-NEXT: sshl v0.4s, v0.4s, v1.4s2646; CHECK-GI-NEXT: ret2647 %tmp1 = load <4 x i16>, ptr %A2648 %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>2649 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2650 ret <4 x i32> %tmp32651}2652 2653define <4 x i32> @neon_sshll4s_neg_constant_shift(ptr %A) nounwind {2654; CHECK-SD-LABEL: neon_sshll4s_neg_constant_shift:2655; CHECK-SD: // %bb.0:2656; CHECK-SD-NEXT: ldr d0, [x0]2657; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #02658; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #12659; CHECK-SD-NEXT: ret2660;2661; CHECK-GI-LABEL: neon_sshll4s_neg_constant_shift:2662; CHECK-GI: // %bb.0:2663; CHECK-GI-NEXT: ldr d0, [x0]2664; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff2665; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #02666; CHECK-GI-NEXT: sshl v0.4s, v0.4s, v1.4s2667; CHECK-GI-NEXT: ret2668 %tmp1 = load <4 x i16>, ptr %A2669 %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>2670 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32> %tmp2, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)2671 ret <4 x i32> %tmp32672}2673 2674; FIXME: should be constant folded.2675define <4 x i32> @neon_sshl4s_constant_fold() nounwind {2676; CHECK-SD-LABEL: neon_sshl4s_constant_fold:2677; CHECK-SD: // %bb.0:2678; CHECK-SD-NEXT: adrp x8, .LCPI173_02679; CHECK-SD-NEXT: ldr q0, [x8, :lo12:.LCPI173_0]2680; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22681; CHECK-SD-NEXT: ret2682;2683; CHECK-GI-LABEL: neon_sshl4s_constant_fold:2684; CHECK-GI: // %bb.0:2685; CHECK-GI-NEXT: movi v0.4s, #22686; CHECK-GI-NEXT: adrp x8, .LCPI173_02687; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI173_0]2688; CHECK-GI-NEXT: sshl v0.4s, v1.4s, v0.4s2689; CHECK-GI-NEXT: ret2690 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> <i32 2, i32 2, i32 2, i32 2>)2691 ret <4 x i32> %tmp32692}2693 2694define <4 x i32> @neon_sshl4s_no_fold(ptr %A) nounwind {2695; CHECK-SD-LABEL: neon_sshl4s_no_fold:2696; CHECK-SD: // %bb.0:2697; CHECK-SD-NEXT: ldr q0, [x0]2698; CHECK-SD-NEXT: add v0.4s, v0.4s, v0.4s2699; CHECK-SD-NEXT: ret2700;2701; CHECK-GI-LABEL: neon_sshl4s_no_fold:2702; CHECK-GI: // %bb.0:2703; CHECK-GI-NEXT: movi v0.4s, #12704; CHECK-GI-NEXT: ldr q1, [x0]2705; CHECK-GI-NEXT: sshl v0.4s, v1.4s, v0.4s2706; CHECK-GI-NEXT: ret2707 %tmp1 = load <4 x i32>, ptr %A2708 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2709 ret <4 x i32> %tmp32710}2711 2712define <2 x i64> @neon_sshll2d_constant_shift(ptr %A) nounwind {2713; CHECK-SD-LABEL: neon_sshll2d_constant_shift:2714; CHECK-SD: // %bb.0:2715; CHECK-SD-NEXT: ldr d0, [x0]2716; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #12717; CHECK-SD-NEXT: ret2718;2719; CHECK-GI-LABEL: neon_sshll2d_constant_shift:2720; CHECK-GI: // %bb.0:2721; CHECK-GI-NEXT: ldr d0, [x0]2722; CHECK-GI-NEXT: adrp x8, .LCPI175_02723; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI175_0]2724; CHECK-GI-NEXT: sshll v0.2d, v0.2s, #02725; CHECK-GI-NEXT: sshl v0.2d, v0.2d, v1.2d2726; CHECK-GI-NEXT: ret2727 %tmp1 = load <2 x i32>, ptr %A2728 %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>2729 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sshl.v2i64(<2 x i64> %tmp2, <2 x i64> <i64 1, i64 1>)2730 ret <2 x i64> %tmp32731}2732 2733define <1 x i64> @neon_sshll_vscalar_constant_shift(ptr %A) nounwind {2734; CHECK-LABEL: neon_sshll_vscalar_constant_shift:2735; CHECK: // %bb.0:2736; CHECK-NEXT: movi v0.2d, #00000000000000002737; CHECK-NEXT: ldr s1, [x0]2738; CHECK-NEXT: zip1 v0.2s, v1.2s, v0.2s2739; CHECK-NEXT: shl d0, d0, #12740; CHECK-NEXT: ret2741 %tmp1 = load <1 x i32>, ptr %A2742 %tmp2 = zext <1 x i32> %tmp1 to <1 x i64>2743 %tmp3 = call <1 x i64> @llvm.aarch64.neon.sshl.v1i64(<1 x i64> %tmp2, <1 x i64> <i64 1>)2744 ret <1 x i64> %tmp32745}2746 2747define i64 @neon_sshll_scalar_constant_shift(ptr %A) nounwind {2748; CHECK-LABEL: neon_sshll_scalar_constant_shift:2749; CHECK: // %bb.0:2750; CHECK-NEXT: ldr w8, [x0]2751; CHECK-NEXT: fmov d0, x82752; CHECK-NEXT: shl d0, d0, #12753; CHECK-NEXT: fmov x0, d02754; CHECK-NEXT: ret2755 %tmp1 = load i32, ptr %A2756 %tmp2 = zext i32 %tmp1 to i642757 %tmp3 = call i64 @llvm.aarch64.neon.sshl.i64(i64 %tmp2, i64 1)2758 ret i64 %tmp32759}2760 2761define i64 @neon_sshll_scalar_constant_shift_m1(ptr %A) nounwind {2762; CHECK-LABEL: neon_sshll_scalar_constant_shift_m1:2763; CHECK: // %bb.0:2764; CHECK-NEXT: ldr w8, [x0]2765; CHECK-NEXT: fmov d0, x82766; CHECK-NEXT: sshr d0, d0, #12767; CHECK-NEXT: fmov x0, d02768; CHECK-NEXT: ret2769 %tmp1 = load i32, ptr %A2770 %tmp2 = zext i32 %tmp1 to i642771 %tmp3 = call i64 @llvm.aarch64.neon.sshl.i64(i64 %tmp2, i64 -1)2772 ret i64 %tmp32773}2774 2775; FIXME: should be constant folded.2776define <2 x i64> @neon_sshl2d_constant_fold() nounwind {2777; CHECK-SD-LABEL: neon_sshl2d_constant_fold:2778; CHECK-SD: // %bb.0:2779; CHECK-SD-NEXT: adrp x8, .LCPI179_02780; CHECK-SD-NEXT: ldr q0, [x8, :lo12:.LCPI179_0]2781; CHECK-SD-NEXT: add v0.2d, v0.2d, v0.2d2782; CHECK-SD-NEXT: ret2783;2784; CHECK-GI-LABEL: neon_sshl2d_constant_fold:2785; CHECK-GI: // %bb.0:2786; CHECK-GI-NEXT: adrp x8, .LCPI179_12787; CHECK-GI-NEXT: adrp x9, .LCPI179_02788; CHECK-GI-NEXT: ldr q0, [x8, :lo12:.LCPI179_1]2789; CHECK-GI-NEXT: ldr q1, [x9, :lo12:.LCPI179_0]2790; CHECK-GI-NEXT: sshl v0.2d, v0.2d, v1.2d2791; CHECK-GI-NEXT: ret2792 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sshl.v2i64(<2 x i64> <i64 99, i64 1000>, <2 x i64> <i64 1, i64 1>)2793 ret <2 x i64> %tmp32794}2795 2796define <2 x i64> @neon_sshl2d_no_fold(ptr %A) nounwind {2797; CHECK-SD-LABEL: neon_sshl2d_no_fold:2798; CHECK-SD: // %bb.0:2799; CHECK-SD-NEXT: ldr q0, [x0]2800; CHECK-SD-NEXT: shl v0.2d, v0.2d, #22801; CHECK-SD-NEXT: ret2802;2803; CHECK-GI-LABEL: neon_sshl2d_no_fold:2804; CHECK-GI: // %bb.0:2805; CHECK-GI-NEXT: adrp x8, .LCPI180_02806; CHECK-GI-NEXT: ldr q1, [x0]2807; CHECK-GI-NEXT: ldr q0, [x8, :lo12:.LCPI180_0]2808; CHECK-GI-NEXT: sshl v0.2d, v1.2d, v0.2d2809; CHECK-GI-NEXT: ret2810 %tmp2 = load <2 x i64>, ptr %A2811 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sshl.v2i64(<2 x i64> %tmp2, <2 x i64> <i64 2, i64 2>)2812 ret <2 x i64> %tmp32813}2814 2815define <8 x i16> @sshll2_8h(ptr %A) nounwind {2816; CHECK-SD-LABEL: sshll2_8h:2817; CHECK-SD: // %bb.0:2818; CHECK-SD-NEXT: ldr d0, [x0, #8]2819; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #12820; CHECK-SD-NEXT: ret2821;2822; CHECK-GI-LABEL: sshll2_8h:2823; CHECK-GI: // %bb.0:2824; CHECK-GI-NEXT: ldr q0, [x0]2825; CHECK-GI-NEXT: mov d0, v0.d[1]2826; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #12827; CHECK-GI-NEXT: ret2828 %load1 = load <16 x i8>, ptr %A2829 %tmp1 = shufflevector <16 x i8> %load1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>2830 %tmp2 = sext <8 x i8> %tmp1 to <8 x i16>2831 %tmp3 = shl <8 x i16> %tmp2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>2832 ret <8 x i16> %tmp32833}2834 2835define <4 x i32> @sshll2_4s(ptr %A) nounwind {2836; CHECK-SD-LABEL: sshll2_4s:2837; CHECK-SD: // %bb.0:2838; CHECK-SD-NEXT: ldr d0, [x0, #8]2839; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #12840; CHECK-SD-NEXT: ret2841;2842; CHECK-GI-LABEL: sshll2_4s:2843; CHECK-GI: // %bb.0:2844; CHECK-GI-NEXT: ldr q0, [x0]2845; CHECK-GI-NEXT: mov d0, v0.d[1]2846; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #12847; CHECK-GI-NEXT: ret2848 %load1 = load <8 x i16>, ptr %A2849 %tmp1 = shufflevector <8 x i16> %load1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>2850 %tmp2 = sext <4 x i16> %tmp1 to <4 x i32>2851 %tmp3 = shl <4 x i32> %tmp2, <i32 1, i32 1, i32 1, i32 1>2852 ret <4 x i32> %tmp32853}2854 2855define <2 x i64> @sshll2_2d(ptr %A) nounwind {2856; CHECK-SD-LABEL: sshll2_2d:2857; CHECK-SD: // %bb.0:2858; CHECK-SD-NEXT: ldr d0, [x0, #8]2859; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #12860; CHECK-SD-NEXT: ret2861;2862; CHECK-GI-LABEL: sshll2_2d:2863; CHECK-GI: // %bb.0:2864; CHECK-GI-NEXT: ldr q0, [x0]2865; CHECK-GI-NEXT: mov d0, v0.d[1]2866; CHECK-GI-NEXT: sshll v0.2d, v0.2s, #12867; CHECK-GI-NEXT: ret2868 %load1 = load <4 x i32>, ptr %A2869 %tmp1 = shufflevector <4 x i32> %load1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>2870 %tmp2 = sext <2 x i32> %tmp1 to <2 x i64>2871 %tmp3 = shl <2 x i64> %tmp2, <i64 1, i64 1>2872 ret <2 x i64> %tmp32873}2874 2875define <8 x i8> @sqshli8b(ptr %A) nounwind {2876; CHECK-SD-LABEL: sqshli8b:2877; CHECK-SD: // %bb.0:2878; CHECK-SD-NEXT: ldr d0, [x0]2879; CHECK-SD-NEXT: sqshl v0.8b, v0.8b, #12880; CHECK-SD-NEXT: ret2881;2882; CHECK-GI-LABEL: sqshli8b:2883; CHECK-GI: // %bb.0:2884; CHECK-GI-NEXT: movi v0.8b, #12885; CHECK-GI-NEXT: ldr d1, [x0]2886; CHECK-GI-NEXT: sqshl v0.8b, v1.8b, v0.8b2887; CHECK-GI-NEXT: ret2888 %tmp1 = load <8 x i8>, ptr %A2889 %tmp3 = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)2890 ret <8 x i8> %tmp32891}2892 2893define <4 x i16> @sqshli4h(ptr %A) nounwind {2894; CHECK-SD-LABEL: sqshli4h:2895; CHECK-SD: // %bb.0:2896; CHECK-SD-NEXT: ldr d0, [x0]2897; CHECK-SD-NEXT: sqshl v0.4h, v0.4h, #12898; CHECK-SD-NEXT: ret2899;2900; CHECK-GI-LABEL: sqshli4h:2901; CHECK-GI: // %bb.0:2902; CHECK-GI-NEXT: movi v0.4h, #12903; CHECK-GI-NEXT: ldr d1, [x0]2904; CHECK-GI-NEXT: sqshl v0.4h, v1.4h, v0.4h2905; CHECK-GI-NEXT: ret2906 %tmp1 = load <4 x i16>, ptr %A2907 %tmp3 = call <4 x i16> @llvm.aarch64.neon.sqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)2908 ret <4 x i16> %tmp32909}2910 2911define <2 x i32> @sqshli2s(ptr %A) nounwind {2912; CHECK-SD-LABEL: sqshli2s:2913; CHECK-SD: // %bb.0:2914; CHECK-SD-NEXT: ldr d0, [x0]2915; CHECK-SD-NEXT: sqshl v0.2s, v0.2s, #12916; CHECK-SD-NEXT: ret2917;2918; CHECK-GI-LABEL: sqshli2s:2919; CHECK-GI: // %bb.0:2920; CHECK-GI-NEXT: movi v0.2s, #12921; CHECK-GI-NEXT: ldr d1, [x0]2922; CHECK-GI-NEXT: sqshl v0.2s, v1.2s, v0.2s2923; CHECK-GI-NEXT: ret2924 %tmp1 = load <2 x i32>, ptr %A2925 %tmp3 = call <2 x i32> @llvm.aarch64.neon.sqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)2926 ret <2 x i32> %tmp32927}2928 2929define <16 x i8> @sqshli16b(ptr %A) nounwind {2930; CHECK-SD-LABEL: sqshli16b:2931; CHECK-SD: // %bb.0:2932; CHECK-SD-NEXT: ldr q0, [x0]2933; CHECK-SD-NEXT: sqshl v0.16b, v0.16b, #12934; CHECK-SD-NEXT: ret2935;2936; CHECK-GI-LABEL: sqshli16b:2937; CHECK-GI: // %bb.0:2938; CHECK-GI-NEXT: movi v0.16b, #12939; CHECK-GI-NEXT: ldr q1, [x0]2940; CHECK-GI-NEXT: sqshl v0.16b, v1.16b, v0.16b2941; CHECK-GI-NEXT: ret2942 %tmp1 = load <16 x i8>, ptr %A2943 %tmp3 = call <16 x i8> @llvm.aarch64.neon.sqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)2944 ret <16 x i8> %tmp32945}2946 2947define <8 x i16> @sqshli8h(ptr %A) nounwind {2948; CHECK-SD-LABEL: sqshli8h:2949; CHECK-SD: // %bb.0:2950; CHECK-SD-NEXT: ldr q0, [x0]2951; CHECK-SD-NEXT: sqshl v0.8h, v0.8h, #12952; CHECK-SD-NEXT: ret2953;2954; CHECK-GI-LABEL: sqshli8h:2955; CHECK-GI: // %bb.0:2956; CHECK-GI-NEXT: movi v0.8h, #12957; CHECK-GI-NEXT: ldr q1, [x0]2958; CHECK-GI-NEXT: sqshl v0.8h, v1.8h, v0.8h2959; CHECK-GI-NEXT: ret2960 %tmp1 = load <8 x i16>, ptr %A2961 %tmp3 = call <8 x i16> @llvm.aarch64.neon.sqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)2962 ret <8 x i16> %tmp32963}2964 2965define <4 x i32> @sqshli4s(ptr %A) nounwind {2966; CHECK-SD-LABEL: sqshli4s:2967; CHECK-SD: // %bb.0:2968; CHECK-SD-NEXT: ldr q0, [x0]2969; CHECK-SD-NEXT: sqshl v0.4s, v0.4s, #12970; CHECK-SD-NEXT: ret2971;2972; CHECK-GI-LABEL: sqshli4s:2973; CHECK-GI: // %bb.0:2974; CHECK-GI-NEXT: movi v0.4s, #12975; CHECK-GI-NEXT: ldr q1, [x0]2976; CHECK-GI-NEXT: sqshl v0.4s, v1.4s, v0.4s2977; CHECK-GI-NEXT: ret2978 %tmp1 = load <4 x i32>, ptr %A2979 %tmp3 = call <4 x i32> @llvm.aarch64.neon.sqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)2980 ret <4 x i32> %tmp32981}2982 2983define <2 x i64> @sqshli2d(ptr %A) nounwind {2984; CHECK-SD-LABEL: sqshli2d:2985; CHECK-SD: // %bb.0:2986; CHECK-SD-NEXT: ldr q0, [x0]2987; CHECK-SD-NEXT: sqshl v0.2d, v0.2d, #12988; CHECK-SD-NEXT: ret2989;2990; CHECK-GI-LABEL: sqshli2d:2991; CHECK-GI: // %bb.0:2992; CHECK-GI-NEXT: adrp x8, .LCPI190_02993; CHECK-GI-NEXT: ldr q1, [x0]2994; CHECK-GI-NEXT: ldr q0, [x8, :lo12:.LCPI190_0]2995; CHECK-GI-NEXT: sqshl v0.2d, v1.2d, v0.2d2996; CHECK-GI-NEXT: ret2997 %tmp1 = load <2 x i64>, ptr %A2998 %tmp3 = call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)2999 ret <2 x i64> %tmp33000}3001 3002define <8 x i8> @uqshli8b(ptr %A) nounwind {3003; CHECK-SD-LABEL: uqshli8b:3004; CHECK-SD: // %bb.0:3005; CHECK-SD-NEXT: ldr d0, [x0]3006; CHECK-SD-NEXT: uqshl v0.8b, v0.8b, #13007; CHECK-SD-NEXT: ret3008;3009; CHECK-GI-LABEL: uqshli8b:3010; CHECK-GI: // %bb.0:3011; CHECK-GI-NEXT: movi v0.8b, #13012; CHECK-GI-NEXT: ldr d1, [x0]3013; CHECK-GI-NEXT: uqshl v0.8b, v1.8b, v0.8b3014; CHECK-GI-NEXT: ret3015 %tmp1 = load <8 x i8>, ptr %A3016 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)3017 ret <8 x i8> %tmp33018}3019 3020define <8 x i8> @uqshli8b_1(ptr %A) nounwind {3021; CHECK-LABEL: uqshli8b_1:3022; CHECK: // %bb.0:3023; CHECK-NEXT: movi v0.8b, #83024; CHECK-NEXT: ldr d1, [x0]3025; CHECK-NEXT: uqshl v0.8b, v1.8b, v0.8b3026; CHECK-NEXT: ret3027 %tmp1 = load <8 x i8>, ptr %A3028 %tmp3 = call <8 x i8> @llvm.aarch64.neon.uqshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>)3029 ret <8 x i8> %tmp33030}3031 3032define <4 x i16> @uqshli4h(ptr %A) nounwind {3033; CHECK-SD-LABEL: uqshli4h:3034; CHECK-SD: // %bb.0:3035; CHECK-SD-NEXT: ldr d0, [x0]3036; CHECK-SD-NEXT: uqshl v0.4h, v0.4h, #13037; CHECK-SD-NEXT: ret3038;3039; CHECK-GI-LABEL: uqshli4h:3040; CHECK-GI: // %bb.0:3041; CHECK-GI-NEXT: movi v0.4h, #13042; CHECK-GI-NEXT: ldr d1, [x0]3043; CHECK-GI-NEXT: uqshl v0.4h, v1.4h, v0.4h3044; CHECK-GI-NEXT: ret3045 %tmp1 = load <4 x i16>, ptr %A3046 %tmp3 = call <4 x i16> @llvm.aarch64.neon.uqshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 1, i16 1, i16 1, i16 1>)3047 ret <4 x i16> %tmp33048}3049 3050define <2 x i32> @uqshli2s(ptr %A) nounwind {3051; CHECK-SD-LABEL: uqshli2s:3052; CHECK-SD: // %bb.0:3053; CHECK-SD-NEXT: ldr d0, [x0]3054; CHECK-SD-NEXT: uqshl v0.2s, v0.2s, #13055; CHECK-SD-NEXT: ret3056;3057; CHECK-GI-LABEL: uqshli2s:3058; CHECK-GI: // %bb.0:3059; CHECK-GI-NEXT: movi v0.2s, #13060; CHECK-GI-NEXT: ldr d1, [x0]3061; CHECK-GI-NEXT: uqshl v0.2s, v1.2s, v0.2s3062; CHECK-GI-NEXT: ret3063 %tmp1 = load <2 x i32>, ptr %A3064 %tmp3 = call <2 x i32> @llvm.aarch64.neon.uqshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 1, i32 1>)3065 ret <2 x i32> %tmp33066}3067 3068define <16 x i8> @uqshli16b(ptr %A) nounwind {3069; CHECK-SD-LABEL: uqshli16b:3070; CHECK-SD: // %bb.0:3071; CHECK-SD-NEXT: ldr q0, [x0]3072; CHECK-SD-NEXT: uqshl v0.16b, v0.16b, #13073; CHECK-SD-NEXT: ret3074;3075; CHECK-GI-LABEL: uqshli16b:3076; CHECK-GI: // %bb.0:3077; CHECK-GI-NEXT: movi v0.16b, #13078; CHECK-GI-NEXT: ldr q1, [x0]3079; CHECK-GI-NEXT: uqshl v0.16b, v1.16b, v0.16b3080; CHECK-GI-NEXT: ret3081 %tmp1 = load <16 x i8>, ptr %A3082 %tmp3 = call <16 x i8> @llvm.aarch64.neon.uqshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)3083 ret <16 x i8> %tmp33084}3085 3086define <8 x i16> @uqshli8h(ptr %A) nounwind {3087; CHECK-SD-LABEL: uqshli8h:3088; CHECK-SD: // %bb.0:3089; CHECK-SD-NEXT: ldr q0, [x0]3090; CHECK-SD-NEXT: uqshl v0.8h, v0.8h, #13091; CHECK-SD-NEXT: ret3092;3093; CHECK-GI-LABEL: uqshli8h:3094; CHECK-GI: // %bb.0:3095; CHECK-GI-NEXT: movi v0.8h, #13096; CHECK-GI-NEXT: ldr q1, [x0]3097; CHECK-GI-NEXT: uqshl v0.8h, v1.8h, v0.8h3098; CHECK-GI-NEXT: ret3099 %tmp1 = load <8 x i16>, ptr %A3100 %tmp3 = call <8 x i16> @llvm.aarch64.neon.uqshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)3101 ret <8 x i16> %tmp33102}3103 3104define <4 x i32> @uqshli4s(ptr %A) nounwind {3105; CHECK-SD-LABEL: uqshli4s:3106; CHECK-SD: // %bb.0:3107; CHECK-SD-NEXT: ldr q0, [x0]3108; CHECK-SD-NEXT: uqshl v0.4s, v0.4s, #13109; CHECK-SD-NEXT: ret3110;3111; CHECK-GI-LABEL: uqshli4s:3112; CHECK-GI: // %bb.0:3113; CHECK-GI-NEXT: movi v0.4s, #13114; CHECK-GI-NEXT: ldr q1, [x0]3115; CHECK-GI-NEXT: uqshl v0.4s, v1.4s, v0.4s3116; CHECK-GI-NEXT: ret3117 %tmp1 = load <4 x i32>, ptr %A3118 %tmp3 = call <4 x i32> @llvm.aarch64.neon.uqshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)3119 ret <4 x i32> %tmp33120}3121 3122define <2 x i64> @uqshli2d(ptr %A) nounwind {3123; CHECK-SD-LABEL: uqshli2d:3124; CHECK-SD: // %bb.0:3125; CHECK-SD-NEXT: ldr q0, [x0]3126; CHECK-SD-NEXT: uqshl v0.2d, v0.2d, #13127; CHECK-SD-NEXT: ret3128;3129; CHECK-GI-LABEL: uqshli2d:3130; CHECK-GI: // %bb.0:3131; CHECK-GI-NEXT: adrp x8, .LCPI198_03132; CHECK-GI-NEXT: ldr q1, [x0]3133; CHECK-GI-NEXT: ldr q0, [x8, :lo12:.LCPI198_0]3134; CHECK-GI-NEXT: uqshl v0.2d, v1.2d, v0.2d3135; CHECK-GI-NEXT: ret3136 %tmp1 = load <2 x i64>, ptr %A3137 %tmp3 = call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 1, i64 1>)3138 ret <2 x i64> %tmp33139}3140 3141define <8 x i8> @ursra8b(ptr %A, ptr %B) nounwind {3142; CHECK-SD-LABEL: ursra8b:3143; CHECK-SD: // %bb.0:3144; CHECK-SD-NEXT: ldr d1, [x0]3145; CHECK-SD-NEXT: ldr d0, [x1]3146; CHECK-SD-NEXT: ursra v0.8b, v1.8b, #13147; CHECK-SD-NEXT: ret3148;3149; CHECK-GI-LABEL: ursra8b:3150; CHECK-GI: // %bb.0:3151; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3152; CHECK-GI-NEXT: ldr d1, [x0]3153; CHECK-GI-NEXT: urshl v0.8b, v1.8b, v0.8b3154; CHECK-GI-NEXT: ldr d1, [x1]3155; CHECK-GI-NEXT: add v0.8b, v0.8b, v1.8b3156; CHECK-GI-NEXT: ret3157 %tmp1 = load <8 x i8>, ptr %A3158 %tmp3 = call <8 x i8> @llvm.aarch64.neon.urshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)3159 %tmp4 = load <8 x i8>, ptr %B3160 %tmp5 = add <8 x i8> %tmp3, %tmp43161 ret <8 x i8> %tmp53162}3163 3164define <4 x i16> @ursra4h(ptr %A, ptr %B) nounwind {3165; CHECK-SD-LABEL: ursra4h:3166; CHECK-SD: // %bb.0:3167; CHECK-SD-NEXT: ldr d1, [x0]3168; CHECK-SD-NEXT: ldr d0, [x1]3169; CHECK-SD-NEXT: ursra v0.4h, v1.4h, #13170; CHECK-SD-NEXT: ret3171;3172; CHECK-GI-LABEL: ursra4h:3173; CHECK-GI: // %bb.0:3174; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3175; CHECK-GI-NEXT: ldr d1, [x0]3176; CHECK-GI-NEXT: urshl v0.4h, v1.4h, v0.4h3177; CHECK-GI-NEXT: ldr d1, [x1]3178; CHECK-GI-NEXT: add v0.4h, v0.4h, v1.4h3179; CHECK-GI-NEXT: ret3180 %tmp1 = load <4 x i16>, ptr %A3181 %tmp3 = call <4 x i16> @llvm.aarch64.neon.urshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)3182 %tmp4 = load <4 x i16>, ptr %B3183 %tmp5 = add <4 x i16> %tmp3, %tmp43184 ret <4 x i16> %tmp53185}3186 3187define <2 x i32> @ursra2s(ptr %A, ptr %B) nounwind {3188; CHECK-SD-LABEL: ursra2s:3189; CHECK-SD: // %bb.0:3190; CHECK-SD-NEXT: ldr d1, [x0]3191; CHECK-SD-NEXT: ldr d0, [x1]3192; CHECK-SD-NEXT: ursra v0.2s, v1.2s, #13193; CHECK-SD-NEXT: ret3194;3195; CHECK-GI-LABEL: ursra2s:3196; CHECK-GI: // %bb.0:3197; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3198; CHECK-GI-NEXT: ldr d1, [x0]3199; CHECK-GI-NEXT: urshl v0.2s, v1.2s, v0.2s3200; CHECK-GI-NEXT: ldr d1, [x1]3201; CHECK-GI-NEXT: add v0.2s, v0.2s, v1.2s3202; CHECK-GI-NEXT: ret3203 %tmp1 = load <2 x i32>, ptr %A3204 %tmp3 = call <2 x i32> @llvm.aarch64.neon.urshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)3205 %tmp4 = load <2 x i32>, ptr %B3206 %tmp5 = add <2 x i32> %tmp3, %tmp43207 ret <2 x i32> %tmp53208}3209 3210define <16 x i8> @ursra16b(ptr %A, ptr %B) nounwind {3211; CHECK-SD-LABEL: ursra16b:3212; CHECK-SD: // %bb.0:3213; CHECK-SD-NEXT: ldr q1, [x0]3214; CHECK-SD-NEXT: ldr q0, [x1]3215; CHECK-SD-NEXT: ursra v0.16b, v1.16b, #13216; CHECK-SD-NEXT: ret3217;3218; CHECK-GI-LABEL: ursra16b:3219; CHECK-GI: // %bb.0:3220; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3221; CHECK-GI-NEXT: ldr q1, [x0]3222; CHECK-GI-NEXT: urshl v0.16b, v1.16b, v0.16b3223; CHECK-GI-NEXT: ldr q1, [x1]3224; CHECK-GI-NEXT: add v0.16b, v0.16b, v1.16b3225; CHECK-GI-NEXT: ret3226 %tmp1 = load <16 x i8>, ptr %A3227 %tmp3 = call <16 x i8> @llvm.aarch64.neon.urshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)3228 %tmp4 = load <16 x i8>, ptr %B3229 %tmp5 = add <16 x i8> %tmp3, %tmp43230 ret <16 x i8> %tmp53231}3232 3233define <8 x i16> @ursra8h(ptr %A, ptr %B) nounwind {3234; CHECK-SD-LABEL: ursra8h:3235; CHECK-SD: // %bb.0:3236; CHECK-SD-NEXT: ldr q1, [x0]3237; CHECK-SD-NEXT: ldr q0, [x1]3238; CHECK-SD-NEXT: ursra v0.8h, v1.8h, #13239; CHECK-SD-NEXT: ret3240;3241; CHECK-GI-LABEL: ursra8h:3242; CHECK-GI: // %bb.0:3243; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3244; CHECK-GI-NEXT: ldr q1, [x0]3245; CHECK-GI-NEXT: urshl v0.8h, v1.8h, v0.8h3246; CHECK-GI-NEXT: ldr q1, [x1]3247; CHECK-GI-NEXT: add v0.8h, v0.8h, v1.8h3248; CHECK-GI-NEXT: ret3249 %tmp1 = load <8 x i16>, ptr %A3250 %tmp3 = call <8 x i16> @llvm.aarch64.neon.urshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)3251 %tmp4 = load <8 x i16>, ptr %B3252 %tmp5 = add <8 x i16> %tmp3, %tmp43253 ret <8 x i16> %tmp53254}3255 3256define <4 x i32> @ursra4s(ptr %A, ptr %B) nounwind {3257; CHECK-SD-LABEL: ursra4s:3258; CHECK-SD: // %bb.0:3259; CHECK-SD-NEXT: ldr q1, [x0]3260; CHECK-SD-NEXT: ldr q0, [x1]3261; CHECK-SD-NEXT: ursra v0.4s, v1.4s, #13262; CHECK-SD-NEXT: ret3263;3264; CHECK-GI-LABEL: ursra4s:3265; CHECK-GI: // %bb.0:3266; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3267; CHECK-GI-NEXT: ldr q1, [x0]3268; CHECK-GI-NEXT: urshl v0.4s, v1.4s, v0.4s3269; CHECK-GI-NEXT: ldr q1, [x1]3270; CHECK-GI-NEXT: add v0.4s, v0.4s, v1.4s3271; CHECK-GI-NEXT: ret3272 %tmp1 = load <4 x i32>, ptr %A3273 %tmp3 = call <4 x i32> @llvm.aarch64.neon.urshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)3274 %tmp4 = load <4 x i32>, ptr %B3275 %tmp5 = add <4 x i32> %tmp3, %tmp43276 ret <4 x i32> %tmp53277}3278 3279define <2 x i64> @ursra2d(ptr %A, ptr %B) nounwind {3280; CHECK-SD-LABEL: ursra2d:3281; CHECK-SD: // %bb.0:3282; CHECK-SD-NEXT: ldr q1, [x0]3283; CHECK-SD-NEXT: ldr q0, [x1]3284; CHECK-SD-NEXT: ursra v0.2d, v1.2d, #13285; CHECK-SD-NEXT: ret3286;3287; CHECK-GI-LABEL: ursra2d:3288; CHECK-GI: // %bb.0:3289; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3290; CHECK-GI-NEXT: ldr q1, [x0]3291; CHECK-GI-NEXT: urshl v0.2d, v1.2d, v0.2d3292; CHECK-GI-NEXT: ldr q1, [x1]3293; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d3294; CHECK-GI-NEXT: ret3295 %tmp1 = load <2 x i64>, ptr %A3296 %tmp3 = call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)3297 %tmp4 = load <2 x i64>, ptr %B3298 %tmp5 = add <2 x i64> %tmp3, %tmp43299 ret <2 x i64> %tmp53300}3301 3302define <1 x i64> @ursra1d(ptr %A, ptr %B) nounwind {3303; CHECK-LABEL: ursra1d:3304; CHECK: // %bb.0:3305; CHECK-NEXT: ldr d1, [x0]3306; CHECK-NEXT: ldr d0, [x1]3307; CHECK-NEXT: ursra d0, d1, #13308; CHECK-NEXT: ret3309 %tmp1 = load <1 x i64>, ptr %A3310 %tmp3 = call <1 x i64> @llvm.aarch64.neon.urshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 -1>)3311 %tmp4 = load <1 x i64>, ptr %B3312 %tmp5 = add <1 x i64> %tmp3, %tmp43313 ret <1 x i64> %tmp53314}3315 3316define i64 @ursra_scalar(ptr %A, ptr %B) nounwind {3317; CHECK-LABEL: ursra_scalar:3318; CHECK: // %bb.0:3319; CHECK-NEXT: ldr d0, [x0]3320; CHECK-NEXT: ldr d1, [x1]3321; CHECK-NEXT: ursra d1, d0, #13322; CHECK-NEXT: fmov x0, d13323; CHECK-NEXT: ret3324 %tmp1 = load i64, ptr %A3325 %tmp3 = call i64 @llvm.aarch64.neon.urshl.i64(i64 %tmp1, i64 -1)3326 %tmp4 = load i64, ptr %B3327 %tmp5 = add i64 %tmp3, %tmp43328 ret i64 %tmp53329}3330 3331define <8 x i8> @srsra8b(ptr %A, ptr %B) nounwind {3332; CHECK-SD-LABEL: srsra8b:3333; CHECK-SD: // %bb.0:3334; CHECK-SD-NEXT: ldr d1, [x0]3335; CHECK-SD-NEXT: ldr d0, [x1]3336; CHECK-SD-NEXT: srsra v0.8b, v1.8b, #13337; CHECK-SD-NEXT: ret3338;3339; CHECK-GI-LABEL: srsra8b:3340; CHECK-GI: // %bb.0:3341; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3342; CHECK-GI-NEXT: ldr d1, [x0]3343; CHECK-GI-NEXT: srshl v0.8b, v1.8b, v0.8b3344; CHECK-GI-NEXT: ldr d1, [x1]3345; CHECK-GI-NEXT: add v0.8b, v0.8b, v1.8b3346; CHECK-GI-NEXT: ret3347 %tmp1 = load <8 x i8>, ptr %A3348 %tmp3 = call <8 x i8> @llvm.aarch64.neon.srshl.v8i8(<8 x i8> %tmp1, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)3349 %tmp4 = load <8 x i8>, ptr %B3350 %tmp5 = add <8 x i8> %tmp3, %tmp43351 ret <8 x i8> %tmp53352}3353 3354define <4 x i16> @srsra4h(ptr %A, ptr %B) nounwind {3355; CHECK-SD-LABEL: srsra4h:3356; CHECK-SD: // %bb.0:3357; CHECK-SD-NEXT: ldr d1, [x0]3358; CHECK-SD-NEXT: ldr d0, [x1]3359; CHECK-SD-NEXT: srsra v0.4h, v1.4h, #13360; CHECK-SD-NEXT: ret3361;3362; CHECK-GI-LABEL: srsra4h:3363; CHECK-GI: // %bb.0:3364; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3365; CHECK-GI-NEXT: ldr d1, [x0]3366; CHECK-GI-NEXT: srshl v0.4h, v1.4h, v0.4h3367; CHECK-GI-NEXT: ldr d1, [x1]3368; CHECK-GI-NEXT: add v0.4h, v0.4h, v1.4h3369; CHECK-GI-NEXT: ret3370 %tmp1 = load <4 x i16>, ptr %A3371 %tmp3 = call <4 x i16> @llvm.aarch64.neon.srshl.v4i16(<4 x i16> %tmp1, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>)3372 %tmp4 = load <4 x i16>, ptr %B3373 %tmp5 = add <4 x i16> %tmp3, %tmp43374 ret <4 x i16> %tmp53375}3376 3377define <2 x i32> @srsra2s(ptr %A, ptr %B) nounwind {3378; CHECK-SD-LABEL: srsra2s:3379; CHECK-SD: // %bb.0:3380; CHECK-SD-NEXT: ldr d1, [x0]3381; CHECK-SD-NEXT: ldr d0, [x1]3382; CHECK-SD-NEXT: srsra v0.2s, v1.2s, #13383; CHECK-SD-NEXT: ret3384;3385; CHECK-GI-LABEL: srsra2s:3386; CHECK-GI: // %bb.0:3387; CHECK-GI-NEXT: movi d0, #0xffffffffffffffff3388; CHECK-GI-NEXT: ldr d1, [x0]3389; CHECK-GI-NEXT: srshl v0.2s, v1.2s, v0.2s3390; CHECK-GI-NEXT: ldr d1, [x1]3391; CHECK-GI-NEXT: add v0.2s, v0.2s, v1.2s3392; CHECK-GI-NEXT: ret3393 %tmp1 = load <2 x i32>, ptr %A3394 %tmp3 = call <2 x i32> @llvm.aarch64.neon.srshl.v2i32(<2 x i32> %tmp1, <2 x i32> <i32 -1, i32 -1>)3395 %tmp4 = load <2 x i32>, ptr %B3396 %tmp5 = add <2 x i32> %tmp3, %tmp43397 ret <2 x i32> %tmp53398}3399 3400define <16 x i8> @srsra16b(ptr %A, ptr %B) nounwind {3401; CHECK-SD-LABEL: srsra16b:3402; CHECK-SD: // %bb.0:3403; CHECK-SD-NEXT: ldr q1, [x0]3404; CHECK-SD-NEXT: ldr q0, [x1]3405; CHECK-SD-NEXT: srsra v0.16b, v1.16b, #13406; CHECK-SD-NEXT: ret3407;3408; CHECK-GI-LABEL: srsra16b:3409; CHECK-GI: // %bb.0:3410; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3411; CHECK-GI-NEXT: ldr q1, [x0]3412; CHECK-GI-NEXT: srshl v0.16b, v1.16b, v0.16b3413; CHECK-GI-NEXT: ldr q1, [x1]3414; CHECK-GI-NEXT: add v0.16b, v0.16b, v1.16b3415; CHECK-GI-NEXT: ret3416 %tmp1 = load <16 x i8>, ptr %A3417 %tmp3 = call <16 x i8> @llvm.aarch64.neon.srshl.v16i8(<16 x i8> %tmp1, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)3418 %tmp4 = load <16 x i8>, ptr %B3419 %tmp5 = add <16 x i8> %tmp3, %tmp43420 ret <16 x i8> %tmp53421}3422 3423define <8 x i16> @srsra8h(ptr %A, ptr %B) nounwind {3424; CHECK-SD-LABEL: srsra8h:3425; CHECK-SD: // %bb.0:3426; CHECK-SD-NEXT: ldr q1, [x0]3427; CHECK-SD-NEXT: ldr q0, [x1]3428; CHECK-SD-NEXT: srsra v0.8h, v1.8h, #13429; CHECK-SD-NEXT: ret3430;3431; CHECK-GI-LABEL: srsra8h:3432; CHECK-GI: // %bb.0:3433; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3434; CHECK-GI-NEXT: ldr q1, [x0]3435; CHECK-GI-NEXT: srshl v0.8h, v1.8h, v0.8h3436; CHECK-GI-NEXT: ldr q1, [x1]3437; CHECK-GI-NEXT: add v0.8h, v0.8h, v1.8h3438; CHECK-GI-NEXT: ret3439 %tmp1 = load <8 x i16>, ptr %A3440 %tmp3 = call <8 x i16> @llvm.aarch64.neon.srshl.v8i16(<8 x i16> %tmp1, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)3441 %tmp4 = load <8 x i16>, ptr %B3442 %tmp5 = add <8 x i16> %tmp3, %tmp43443 ret <8 x i16> %tmp53444}3445 3446define <4 x i32> @srsra4s(ptr %A, ptr %B) nounwind {3447; CHECK-SD-LABEL: srsra4s:3448; CHECK-SD: // %bb.0:3449; CHECK-SD-NEXT: ldr q1, [x0]3450; CHECK-SD-NEXT: ldr q0, [x1]3451; CHECK-SD-NEXT: srsra v0.4s, v1.4s, #13452; CHECK-SD-NEXT: ret3453;3454; CHECK-GI-LABEL: srsra4s:3455; CHECK-GI: // %bb.0:3456; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3457; CHECK-GI-NEXT: ldr q1, [x0]3458; CHECK-GI-NEXT: srshl v0.4s, v1.4s, v0.4s3459; CHECK-GI-NEXT: ldr q1, [x1]3460; CHECK-GI-NEXT: add v0.4s, v0.4s, v1.4s3461; CHECK-GI-NEXT: ret3462 %tmp1 = load <4 x i32>, ptr %A3463 %tmp3 = call <4 x i32> @llvm.aarch64.neon.srshl.v4i32(<4 x i32> %tmp1, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)3464 %tmp4 = load <4 x i32>, ptr %B3465 %tmp5 = add <4 x i32> %tmp3, %tmp43466 ret <4 x i32> %tmp53467}3468 3469define <2 x i64> @srsra2d(ptr %A, ptr %B) nounwind {3470; CHECK-SD-LABEL: srsra2d:3471; CHECK-SD: // %bb.0:3472; CHECK-SD-NEXT: ldr q1, [x0]3473; CHECK-SD-NEXT: ldr q0, [x1]3474; CHECK-SD-NEXT: srsra v0.2d, v1.2d, #13475; CHECK-SD-NEXT: ret3476;3477; CHECK-GI-LABEL: srsra2d:3478; CHECK-GI: // %bb.0:3479; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff3480; CHECK-GI-NEXT: ldr q1, [x0]3481; CHECK-GI-NEXT: srshl v0.2d, v1.2d, v0.2d3482; CHECK-GI-NEXT: ldr q1, [x1]3483; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d3484; CHECK-GI-NEXT: ret3485 %tmp1 = load <2 x i64>, ptr %A3486 %tmp3 = call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %tmp1, <2 x i64> <i64 -1, i64 -1>)3487 %tmp4 = load <2 x i64>, ptr %B3488 %tmp5 = add <2 x i64> %tmp3, %tmp43489 ret <2 x i64> %tmp53490}3491 3492define <1 x i64> @srsra1d(ptr %A, ptr %B) nounwind {3493; CHECK-LABEL: srsra1d:3494; CHECK: // %bb.0:3495; CHECK-NEXT: ldr d1, [x0]3496; CHECK-NEXT: ldr d0, [x1]3497; CHECK-NEXT: srsra d0, d1, #13498; CHECK-NEXT: ret3499 %tmp1 = load <1 x i64>, ptr %A3500 %tmp3 = call <1 x i64> @llvm.aarch64.neon.srshl.v1i64(<1 x i64> %tmp1, <1 x i64> <i64 -1>)3501 %tmp4 = load <1 x i64>, ptr %B3502 %tmp5 = add <1 x i64> %tmp3, %tmp43503 ret <1 x i64> %tmp53504}3505 3506define i64 @srsra_scalar(ptr %A, ptr %B) nounwind {3507; CHECK-LABEL: srsra_scalar:3508; CHECK: // %bb.0:3509; CHECK-NEXT: ldr d0, [x0]3510; CHECK-NEXT: ldr d1, [x1]3511; CHECK-NEXT: srsra d1, d0, #13512; CHECK-NEXT: fmov x0, d13513; CHECK-NEXT: ret3514 %tmp1 = load i64, ptr %A3515 %tmp3 = call i64 @llvm.aarch64.neon.srshl.i64(i64 %tmp1, i64 -1)3516 %tmp4 = load i64, ptr %B3517 %tmp5 = add i64 %tmp3, %tmp43518 ret i64 %tmp53519}3520 3521define <8 x i8> @usra8b(ptr %A, ptr %B) nounwind {3522; CHECK-LABEL: usra8b:3523; CHECK: // %bb.0:3524; CHECK-NEXT: ldr d1, [x0]3525; CHECK-NEXT: ldr d0, [x1]3526; CHECK-NEXT: usra v0.8b, v1.8b, #13527; CHECK-NEXT: ret3528 %tmp1 = load <8 x i8>, ptr %A3529 %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3530 %tmp4 = load <8 x i8>, ptr %B3531 %tmp5 = add <8 x i8> %tmp3, %tmp43532 ret <8 x i8> %tmp53533}3534 3535define <4 x i16> @usra4h(ptr %A, ptr %B) nounwind {3536; CHECK-LABEL: usra4h:3537; CHECK: // %bb.0:3538; CHECK-NEXT: ldr d1, [x0]3539; CHECK-NEXT: ldr d0, [x1]3540; CHECK-NEXT: usra v0.4h, v1.4h, #13541; CHECK-NEXT: ret3542 %tmp1 = load <4 x i16>, ptr %A3543 %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>3544 %tmp4 = load <4 x i16>, ptr %B3545 %tmp5 = add <4 x i16> %tmp3, %tmp43546 ret <4 x i16> %tmp53547}3548 3549define <2 x i32> @usra2s(ptr %A, ptr %B) nounwind {3550; CHECK-LABEL: usra2s:3551; CHECK: // %bb.0:3552; CHECK-NEXT: ldr d1, [x0]3553; CHECK-NEXT: ldr d0, [x1]3554; CHECK-NEXT: usra v0.2s, v1.2s, #13555; CHECK-NEXT: ret3556 %tmp1 = load <2 x i32>, ptr %A3557 %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>3558 %tmp4 = load <2 x i32>, ptr %B3559 %tmp5 = add <2 x i32> %tmp3, %tmp43560 ret <2 x i32> %tmp53561}3562 3563define <16 x i8> @usra16b(ptr %A, ptr %B) nounwind {3564; CHECK-LABEL: usra16b:3565; CHECK: // %bb.0:3566; CHECK-NEXT: ldr q1, [x0]3567; CHECK-NEXT: ldr q0, [x1]3568; CHECK-NEXT: usra v0.16b, v1.16b, #13569; CHECK-NEXT: ret3570 %tmp1 = load <16 x i8>, ptr %A3571 %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3572 %tmp4 = load <16 x i8>, ptr %B3573 %tmp5 = add <16 x i8> %tmp3, %tmp43574 ret <16 x i8> %tmp53575}3576 3577define <8 x i16> @usra8h(ptr %A, ptr %B) nounwind {3578; CHECK-LABEL: usra8h:3579; CHECK: // %bb.0:3580; CHECK-NEXT: ldr q1, [x0]3581; CHECK-NEXT: ldr q0, [x1]3582; CHECK-NEXT: usra v0.8h, v1.8h, #13583; CHECK-NEXT: ret3584 %tmp1 = load <8 x i16>, ptr %A3585 %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>3586 %tmp4 = load <8 x i16>, ptr %B3587 %tmp5 = add <8 x i16> %tmp3, %tmp43588 ret <8 x i16> %tmp53589}3590 3591define <4 x i32> @usra4s(ptr %A, ptr %B) nounwind {3592; CHECK-LABEL: usra4s:3593; CHECK: // %bb.0:3594; CHECK-NEXT: ldr q1, [x0]3595; CHECK-NEXT: ldr q0, [x1]3596; CHECK-NEXT: usra v0.4s, v1.4s, #13597; CHECK-NEXT: ret3598 %tmp1 = load <4 x i32>, ptr %A3599 %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>3600 %tmp4 = load <4 x i32>, ptr %B3601 %tmp5 = add <4 x i32> %tmp3, %tmp43602 ret <4 x i32> %tmp53603}3604 3605define <2 x i64> @usra2d(ptr %A, ptr %B) nounwind {3606; CHECK-LABEL: usra2d:3607; CHECK: // %bb.0:3608; CHECK-NEXT: ldr q1, [x0]3609; CHECK-NEXT: ldr q0, [x1]3610; CHECK-NEXT: usra v0.2d, v1.2d, #13611; CHECK-NEXT: ret3612 %tmp1 = load <2 x i64>, ptr %A3613 %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>3614 %tmp4 = load <2 x i64>, ptr %B3615 %tmp5 = add <2 x i64> %tmp3, %tmp43616 ret <2 x i64> %tmp53617}3618 3619define <1 x i64> @usra1d(ptr %A, ptr %B) nounwind {3620; CHECK-SD-LABEL: usra1d:3621; CHECK-SD: // %bb.0:3622; CHECK-SD-NEXT: ldr d1, [x0]3623; CHECK-SD-NEXT: ldr d0, [x1]3624; CHECK-SD-NEXT: usra d0, d1, #13625; CHECK-SD-NEXT: ret3626;3627; CHECK-GI-LABEL: usra1d:3628; CHECK-GI: // %bb.0:3629; CHECK-GI-NEXT: ldr x8, [x0]3630; CHECK-GI-NEXT: ldr x9, [x1]3631; CHECK-GI-NEXT: add x8, x9, x8, lsr #13632; CHECK-GI-NEXT: fmov d0, x83633; CHECK-GI-NEXT: ret3634 %tmp1 = load <1 x i64>, ptr %A3635 %tmp3 = lshr <1 x i64> %tmp1, <i64 1>3636 %tmp4 = load <1 x i64>, ptr %B3637 %tmp5 = add <1 x i64> %tmp3, %tmp43638 ret <1 x i64> %tmp53639}3640 3641define <8 x i8> @ssra8b(ptr %A, ptr %B) nounwind {3642; CHECK-LABEL: ssra8b:3643; CHECK: // %bb.0:3644; CHECK-NEXT: ldr d1, [x0]3645; CHECK-NEXT: ldr d0, [x1]3646; CHECK-NEXT: ssra v0.8b, v1.8b, #13647; CHECK-NEXT: ret3648 %tmp1 = load <8 x i8>, ptr %A3649 %tmp3 = ashr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3650 %tmp4 = load <8 x i8>, ptr %B3651 %tmp5 = add <8 x i8> %tmp3, %tmp43652 ret <8 x i8> %tmp53653}3654 3655define <4 x i16> @ssra4h(ptr %A, ptr %B) nounwind {3656; CHECK-LABEL: ssra4h:3657; CHECK: // %bb.0:3658; CHECK-NEXT: ldr d1, [x0]3659; CHECK-NEXT: ldr d0, [x1]3660; CHECK-NEXT: ssra v0.4h, v1.4h, #13661; CHECK-NEXT: ret3662 %tmp1 = load <4 x i16>, ptr %A3663 %tmp3 = ashr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>3664 %tmp4 = load <4 x i16>, ptr %B3665 %tmp5 = add <4 x i16> %tmp3, %tmp43666 ret <4 x i16> %tmp53667}3668 3669define <2 x i32> @ssra2s(ptr %A, ptr %B) nounwind {3670; CHECK-LABEL: ssra2s:3671; CHECK: // %bb.0:3672; CHECK-NEXT: ldr d1, [x0]3673; CHECK-NEXT: ldr d0, [x1]3674; CHECK-NEXT: ssra v0.2s, v1.2s, #13675; CHECK-NEXT: ret3676 %tmp1 = load <2 x i32>, ptr %A3677 %tmp3 = ashr <2 x i32> %tmp1, <i32 1, i32 1>3678 %tmp4 = load <2 x i32>, ptr %B3679 %tmp5 = add <2 x i32> %tmp3, %tmp43680 ret <2 x i32> %tmp53681}3682 3683define <16 x i8> @ssra16b(ptr %A, ptr %B) nounwind {3684; CHECK-LABEL: ssra16b:3685; CHECK: // %bb.0:3686; CHECK-NEXT: ldr q1, [x0]3687; CHECK-NEXT: ldr q0, [x1]3688; CHECK-NEXT: ssra v0.16b, v1.16b, #13689; CHECK-NEXT: ret3690 %tmp1 = load <16 x i8>, ptr %A3691 %tmp3 = ashr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3692 %tmp4 = load <16 x i8>, ptr %B3693 %tmp5 = add <16 x i8> %tmp3, %tmp43694 ret <16 x i8> %tmp53695}3696 3697define <8 x i16> @ssra8h(ptr %A, ptr %B) nounwind {3698; CHECK-LABEL: ssra8h:3699; CHECK: // %bb.0:3700; CHECK-NEXT: ldr q1, [x0]3701; CHECK-NEXT: ldr q0, [x1]3702; CHECK-NEXT: ssra v0.8h, v1.8h, #13703; CHECK-NEXT: ret3704 %tmp1 = load <8 x i16>, ptr %A3705 %tmp3 = ashr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>3706 %tmp4 = load <8 x i16>, ptr %B3707 %tmp5 = add <8 x i16> %tmp3, %tmp43708 ret <8 x i16> %tmp53709}3710 3711define <4 x i32> @ssra4s(ptr %A, ptr %B) nounwind {3712; CHECK-LABEL: ssra4s:3713; CHECK: // %bb.0:3714; CHECK-NEXT: ldr q1, [x0]3715; CHECK-NEXT: ldr q0, [x1]3716; CHECK-NEXT: ssra v0.4s, v1.4s, #13717; CHECK-NEXT: ret3718 %tmp1 = load <4 x i32>, ptr %A3719 %tmp3 = ashr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>3720 %tmp4 = load <4 x i32>, ptr %B3721 %tmp5 = add <4 x i32> %tmp3, %tmp43722 ret <4 x i32> %tmp53723}3724 3725define <2 x i64> @ssra2d(ptr %A, ptr %B) nounwind {3726; CHECK-LABEL: ssra2d:3727; CHECK: // %bb.0:3728; CHECK-NEXT: ldr q1, [x0]3729; CHECK-NEXT: ldr q0, [x1]3730; CHECK-NEXT: ssra v0.2d, v1.2d, #13731; CHECK-NEXT: ret3732 %tmp1 = load <2 x i64>, ptr %A3733 %tmp3 = ashr <2 x i64> %tmp1, <i64 1, i64 1>3734 %tmp4 = load <2 x i64>, ptr %B3735 %tmp5 = add <2 x i64> %tmp3, %tmp43736 ret <2 x i64> %tmp53737}3738 3739define <8 x i8> @shr_orr8b(ptr %A, ptr %B) nounwind {3740; CHECK-LABEL: shr_orr8b:3741; CHECK: // %bb.0:3742; CHECK-NEXT: ldr d0, [x0]3743; CHECK-NEXT: ldr d1, [x1]3744; CHECK-NEXT: ushr v0.8b, v0.8b, #13745; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b3746; CHECK-NEXT: ret3747 %tmp1 = load <8 x i8>, ptr %A3748 %tmp4 = load <8 x i8>, ptr %B3749 %tmp3 = lshr <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3750 %tmp5 = or <8 x i8> %tmp3, %tmp43751 ret <8 x i8> %tmp53752}3753 3754define <4 x i16> @shr_orr4h(ptr %A, ptr %B) nounwind {3755; CHECK-LABEL: shr_orr4h:3756; CHECK: // %bb.0:3757; CHECK-NEXT: ldr d0, [x0]3758; CHECK-NEXT: ldr d1, [x1]3759; CHECK-NEXT: ushr v0.4h, v0.4h, #13760; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b3761; CHECK-NEXT: ret3762 %tmp1 = load <4 x i16>, ptr %A3763 %tmp4 = load <4 x i16>, ptr %B3764 %tmp3 = lshr <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>3765 %tmp5 = or <4 x i16> %tmp3, %tmp43766 ret <4 x i16> %tmp53767}3768 3769define <2 x i32> @shr_orr2s(ptr %A, ptr %B) nounwind {3770; CHECK-LABEL: shr_orr2s:3771; CHECK: // %bb.0:3772; CHECK-NEXT: ldr d0, [x0]3773; CHECK-NEXT: ldr d1, [x1]3774; CHECK-NEXT: ushr v0.2s, v0.2s, #13775; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b3776; CHECK-NEXT: ret3777 %tmp1 = load <2 x i32>, ptr %A3778 %tmp4 = load <2 x i32>, ptr %B3779 %tmp3 = lshr <2 x i32> %tmp1, <i32 1, i32 1>3780 %tmp5 = or <2 x i32> %tmp3, %tmp43781 ret <2 x i32> %tmp53782}3783 3784define <16 x i8> @shr_orr16b(ptr %A, ptr %B) nounwind {3785; CHECK-LABEL: shr_orr16b:3786; CHECK: // %bb.0:3787; CHECK-NEXT: ldr q0, [x0]3788; CHECK-NEXT: ldr q1, [x1]3789; CHECK-NEXT: ushr v0.16b, v0.16b, #13790; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b3791; CHECK-NEXT: ret3792 %tmp1 = load <16 x i8>, ptr %A3793 %tmp4 = load <16 x i8>, ptr %B3794 %tmp3 = lshr <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3795 %tmp5 = or <16 x i8> %tmp3, %tmp43796 ret <16 x i8> %tmp53797}3798 3799define <8 x i16> @shr_orr8h(ptr %A, ptr %B) nounwind {3800; CHECK-LABEL: shr_orr8h:3801; CHECK: // %bb.0:3802; CHECK-NEXT: ldr q0, [x0]3803; CHECK-NEXT: ldr q1, [x1]3804; CHECK-NEXT: ushr v0.8h, v0.8h, #13805; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b3806; CHECK-NEXT: ret3807 %tmp1 = load <8 x i16>, ptr %A3808 %tmp4 = load <8 x i16>, ptr %B3809 %tmp3 = lshr <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>3810 %tmp5 = or <8 x i16> %tmp3, %tmp43811 ret <8 x i16> %tmp53812}3813 3814define <4 x i32> @shr_orr4s(ptr %A, ptr %B) nounwind {3815; CHECK-LABEL: shr_orr4s:3816; CHECK: // %bb.0:3817; CHECK-NEXT: ldr q0, [x0]3818; CHECK-NEXT: ldr q1, [x1]3819; CHECK-NEXT: ushr v0.4s, v0.4s, #13820; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b3821; CHECK-NEXT: ret3822 %tmp1 = load <4 x i32>, ptr %A3823 %tmp4 = load <4 x i32>, ptr %B3824 %tmp3 = lshr <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>3825 %tmp5 = or <4 x i32> %tmp3, %tmp43826 ret <4 x i32> %tmp53827}3828 3829define <2 x i64> @shr_orr2d(ptr %A, ptr %B) nounwind {3830; CHECK-LABEL: shr_orr2d:3831; CHECK: // %bb.0:3832; CHECK-NEXT: ldr q0, [x0]3833; CHECK-NEXT: ldr q1, [x1]3834; CHECK-NEXT: ushr v0.2d, v0.2d, #13835; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b3836; CHECK-NEXT: ret3837 %tmp1 = load <2 x i64>, ptr %A3838 %tmp4 = load <2 x i64>, ptr %B3839 %tmp3 = lshr <2 x i64> %tmp1, <i64 1, i64 1>3840 %tmp5 = or <2 x i64> %tmp3, %tmp43841 ret <2 x i64> %tmp53842}3843 3844define <8 x i8> @shl_orr8b(ptr %A, ptr %B) nounwind {3845; CHECK-SD-LABEL: shl_orr8b:3846; CHECK-SD: // %bb.0:3847; CHECK-SD-NEXT: ldr d0, [x0]3848; CHECK-SD-NEXT: ldr d1, [x1]3849; CHECK-SD-NEXT: add v0.8b, v0.8b, v0.8b3850; CHECK-SD-NEXT: orr v0.8b, v0.8b, v1.8b3851; CHECK-SD-NEXT: ret3852;3853; CHECK-GI-LABEL: shl_orr8b:3854; CHECK-GI: // %bb.0:3855; CHECK-GI-NEXT: ldr d0, [x0]3856; CHECK-GI-NEXT: ldr d1, [x1]3857; CHECK-GI-NEXT: shl v0.8b, v0.8b, #13858; CHECK-GI-NEXT: orr v0.8b, v0.8b, v1.8b3859; CHECK-GI-NEXT: ret3860 %tmp1 = load <8 x i8>, ptr %A3861 %tmp4 = load <8 x i8>, ptr %B3862 %tmp3 = shl <8 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3863 %tmp5 = or <8 x i8> %tmp3, %tmp43864 ret <8 x i8> %tmp53865}3866 3867define <4 x i16> @shl_orr4h(ptr %A, ptr %B) nounwind {3868; CHECK-SD-LABEL: shl_orr4h:3869; CHECK-SD: // %bb.0:3870; CHECK-SD-NEXT: ldr d0, [x0]3871; CHECK-SD-NEXT: ldr d1, [x1]3872; CHECK-SD-NEXT: add v0.4h, v0.4h, v0.4h3873; CHECK-SD-NEXT: orr v0.8b, v0.8b, v1.8b3874; CHECK-SD-NEXT: ret3875;3876; CHECK-GI-LABEL: shl_orr4h:3877; CHECK-GI: // %bb.0:3878; CHECK-GI-NEXT: ldr d0, [x0]3879; CHECK-GI-NEXT: ldr d1, [x1]3880; CHECK-GI-NEXT: shl v0.4h, v0.4h, #13881; CHECK-GI-NEXT: orr v0.8b, v0.8b, v1.8b3882; CHECK-GI-NEXT: ret3883 %tmp1 = load <4 x i16>, ptr %A3884 %tmp4 = load <4 x i16>, ptr %B3885 %tmp3 = shl <4 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1>3886 %tmp5 = or <4 x i16> %tmp3, %tmp43887 ret <4 x i16> %tmp53888}3889 3890define <2 x i32> @shl_orr2s(ptr %A, ptr %B) nounwind {3891; CHECK-SD-LABEL: shl_orr2s:3892; CHECK-SD: // %bb.0:3893; CHECK-SD-NEXT: ldr d0, [x0]3894; CHECK-SD-NEXT: ldr d1, [x1]3895; CHECK-SD-NEXT: add v0.2s, v0.2s, v0.2s3896; CHECK-SD-NEXT: orr v0.8b, v0.8b, v1.8b3897; CHECK-SD-NEXT: ret3898;3899; CHECK-GI-LABEL: shl_orr2s:3900; CHECK-GI: // %bb.0:3901; CHECK-GI-NEXT: ldr d0, [x0]3902; CHECK-GI-NEXT: ldr d1, [x1]3903; CHECK-GI-NEXT: shl v0.2s, v0.2s, #13904; CHECK-GI-NEXT: orr v0.8b, v0.8b, v1.8b3905; CHECK-GI-NEXT: ret3906 %tmp1 = load <2 x i32>, ptr %A3907 %tmp4 = load <2 x i32>, ptr %B3908 %tmp3 = shl <2 x i32> %tmp1, <i32 1, i32 1>3909 %tmp5 = or <2 x i32> %tmp3, %tmp43910 ret <2 x i32> %tmp53911}3912 3913define <16 x i8> @shl_orr16b(ptr %A, ptr %B) nounwind {3914; CHECK-SD-LABEL: shl_orr16b:3915; CHECK-SD: // %bb.0:3916; CHECK-SD-NEXT: ldr q0, [x0]3917; CHECK-SD-NEXT: ldr q1, [x1]3918; CHECK-SD-NEXT: add v0.16b, v0.16b, v0.16b3919; CHECK-SD-NEXT: orr v0.16b, v0.16b, v1.16b3920; CHECK-SD-NEXT: ret3921;3922; CHECK-GI-LABEL: shl_orr16b:3923; CHECK-GI: // %bb.0:3924; CHECK-GI-NEXT: ldr q0, [x0]3925; CHECK-GI-NEXT: ldr q1, [x1]3926; CHECK-GI-NEXT: shl v0.16b, v0.16b, #13927; CHECK-GI-NEXT: orr v0.16b, v0.16b, v1.16b3928; CHECK-GI-NEXT: ret3929 %tmp1 = load <16 x i8>, ptr %A3930 %tmp4 = load <16 x i8>, ptr %B3931 %tmp3 = shl <16 x i8> %tmp1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>3932 %tmp5 = or <16 x i8> %tmp3, %tmp43933 ret <16 x i8> %tmp53934}3935 3936define <8 x i16> @shl_orr8h(ptr %A, ptr %B) nounwind {3937; CHECK-SD-LABEL: shl_orr8h:3938; CHECK-SD: // %bb.0:3939; CHECK-SD-NEXT: ldr q0, [x0]3940; CHECK-SD-NEXT: ldr q1, [x1]3941; CHECK-SD-NEXT: add v0.8h, v0.8h, v0.8h3942; CHECK-SD-NEXT: orr v0.16b, v0.16b, v1.16b3943; CHECK-SD-NEXT: ret3944;3945; CHECK-GI-LABEL: shl_orr8h:3946; CHECK-GI: // %bb.0:3947; CHECK-GI-NEXT: ldr q0, [x0]3948; CHECK-GI-NEXT: ldr q1, [x1]3949; CHECK-GI-NEXT: shl v0.8h, v0.8h, #13950; CHECK-GI-NEXT: orr v0.16b, v0.16b, v1.16b3951; CHECK-GI-NEXT: ret3952 %tmp1 = load <8 x i16>, ptr %A3953 %tmp4 = load <8 x i16>, ptr %B3954 %tmp3 = shl <8 x i16> %tmp1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>3955 %tmp5 = or <8 x i16> %tmp3, %tmp43956 ret <8 x i16> %tmp53957}3958 3959define <4 x i32> @shl_orr4s(ptr %A, ptr %B) nounwind {3960; CHECK-SD-LABEL: shl_orr4s:3961; CHECK-SD: // %bb.0:3962; CHECK-SD-NEXT: ldr q0, [x0]3963; CHECK-SD-NEXT: ldr q1, [x1]3964; CHECK-SD-NEXT: add v0.4s, v0.4s, v0.4s3965; CHECK-SD-NEXT: orr v0.16b, v0.16b, v1.16b3966; CHECK-SD-NEXT: ret3967;3968; CHECK-GI-LABEL: shl_orr4s:3969; CHECK-GI: // %bb.0:3970; CHECK-GI-NEXT: ldr q0, [x0]3971; CHECK-GI-NEXT: ldr q1, [x1]3972; CHECK-GI-NEXT: shl v0.4s, v0.4s, #13973; CHECK-GI-NEXT: orr v0.16b, v0.16b, v1.16b3974; CHECK-GI-NEXT: ret3975 %tmp1 = load <4 x i32>, ptr %A3976 %tmp4 = load <4 x i32>, ptr %B3977 %tmp3 = shl <4 x i32> %tmp1, <i32 1, i32 1, i32 1, i32 1>3978 %tmp5 = or <4 x i32> %tmp3, %tmp43979 ret <4 x i32> %tmp53980}3981 3982define <2 x i64> @shl_orr2d(ptr %A, ptr %B) nounwind {3983; CHECK-SD-LABEL: shl_orr2d:3984; CHECK-SD: // %bb.0:3985; CHECK-SD-NEXT: ldr q0, [x0]3986; CHECK-SD-NEXT: ldr q1, [x1]3987; CHECK-SD-NEXT: add v0.2d, v0.2d, v0.2d3988; CHECK-SD-NEXT: orr v0.16b, v0.16b, v1.16b3989; CHECK-SD-NEXT: ret3990;3991; CHECK-GI-LABEL: shl_orr2d:3992; CHECK-GI: // %bb.0:3993; CHECK-GI-NEXT: ldr q0, [x0]3994; CHECK-GI-NEXT: ldr q1, [x1]3995; CHECK-GI-NEXT: shl v0.2d, v0.2d, #13996; CHECK-GI-NEXT: orr v0.16b, v0.16b, v1.16b3997; CHECK-GI-NEXT: ret3998 %tmp1 = load <2 x i64>, ptr %A3999 %tmp4 = load <2 x i64>, ptr %B4000 %tmp3 = shl <2 x i64> %tmp1, <i64 1, i64 1>4001 %tmp5 = or <2 x i64> %tmp3, %tmp44002 ret <2 x i64> %tmp54003}4004 4005define <8 x i16> @shll(<8 x i8> %in) {4006; CHECK-SD-LABEL: shll:4007; CHECK-SD: // %bb.0:4008; CHECK-SD-NEXT: shll v0.8h, v0.8b, #84009; CHECK-SD-NEXT: ret4010;4011; CHECK-GI-LABEL: shll:4012; CHECK-GI: // %bb.0:4013; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #04014; CHECK-GI-NEXT: shl v0.8h, v0.8h, #84015; CHECK-GI-NEXT: ret4016 %ext = zext <8 x i8> %in to <8 x i16>4017 %res = shl <8 x i16> %ext, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>4018 ret <8 x i16> %res4019}4020 4021define <4 x i32> @shll_high(<8 x i16> %in) {4022; CHECK-SD-LABEL: shll_high:4023; CHECK-SD: // %bb.0:4024; CHECK-SD-NEXT: shll2 v0.4s, v0.8h, #164025; CHECK-SD-NEXT: ret4026;4027; CHECK-GI-LABEL: shll_high:4028; CHECK-GI: // %bb.0:4029; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #04030; CHECK-GI-NEXT: shl v0.4s, v0.4s, #164031; CHECK-GI-NEXT: ret4032 %extract = shufflevector <8 x i16> %in, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>4033 %ext = zext <4 x i16> %extract to <4 x i32>4034 %res = shl <4 x i32> %ext, <i32 16, i32 16, i32 16, i32 16>4035 ret <4 x i32> %res4036}4037 4038define <8 x i8> @sli8b(ptr %A, ptr %B) nounwind {4039; CHECK-LABEL: sli8b:4040; CHECK: // %bb.0:4041; CHECK-NEXT: ldr d0, [x0]4042; CHECK-NEXT: ldr d1, [x1]4043; CHECK-NEXT: sli v0.8b, v1.8b, #14044; CHECK-NEXT: ret4045 %tmp1 = load <8 x i8>, ptr %A4046 %tmp2 = load <8 x i8>, ptr %B4047 %tmp3 = call <8 x i8> @llvm.aarch64.neon.vsli.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2, i32 1)4048 ret <8 x i8> %tmp34049}4050 4051define <4 x i16> @sli4h(ptr %A, ptr %B) nounwind {4052; CHECK-LABEL: sli4h:4053; CHECK: // %bb.0:4054; CHECK-NEXT: ldr d0, [x0]4055; CHECK-NEXT: ldr d1, [x1]4056; CHECK-NEXT: sli v0.4h, v1.4h, #14057; CHECK-NEXT: ret4058 %tmp1 = load <4 x i16>, ptr %A4059 %tmp2 = load <4 x i16>, ptr %B4060 %tmp3 = call <4 x i16> @llvm.aarch64.neon.vsli.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2, i32 1)4061 ret <4 x i16> %tmp34062}4063 4064define <2 x i32> @sli2s(ptr %A, ptr %B) nounwind {4065; CHECK-LABEL: sli2s:4066; CHECK: // %bb.0:4067; CHECK-NEXT: ldr d0, [x0]4068; CHECK-NEXT: ldr d1, [x1]4069; CHECK-NEXT: sli v0.2s, v1.2s, #14070; CHECK-NEXT: ret4071 %tmp1 = load <2 x i32>, ptr %A4072 %tmp2 = load <2 x i32>, ptr %B4073 %tmp3 = call <2 x i32> @llvm.aarch64.neon.vsli.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2, i32 1)4074 ret <2 x i32> %tmp34075}4076 4077define <1 x i64> @sli1d(ptr %A, ptr %B) nounwind {4078; CHECK-LABEL: sli1d:4079; CHECK: // %bb.0:4080; CHECK-NEXT: ldr d0, [x0]4081; CHECK-NEXT: ldr d1, [x1]4082; CHECK-NEXT: sli d0, d1, #14083; CHECK-NEXT: ret4084 %tmp1 = load <1 x i64>, ptr %A4085 %tmp2 = load <1 x i64>, ptr %B4086 %tmp3 = call <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2, i32 1)4087 ret <1 x i64> %tmp34088}4089 4090; Ensure we can select scalar SLI with a zero shift (see issue #139879).4091define <1 x i64> @sli1d_imm0(<1 x i64> %a, <1 x i64> %b) {4092; CHECK-LABEL: sli1d_imm0:4093; CHECK: // %bb.0:4094; CHECK-NEXT: sli d0, d1, #04095; CHECK-NEXT: ret4096 %r = call <1 x i64> @llvm.aarch64.neon.vsli(<1 x i64> %a, <1 x i64> %b, i32 0)4097 ret <1 x i64> %r4098}4099 4100define <16 x i8> @sli16b(ptr %A, ptr %B) nounwind {4101; CHECK-LABEL: sli16b:4102; CHECK: // %bb.0:4103; CHECK-NEXT: ldr q0, [x0]4104; CHECK-NEXT: ldr q1, [x1]4105; CHECK-NEXT: sli v0.16b, v1.16b, #14106; CHECK-NEXT: ret4107 %tmp1 = load <16 x i8>, ptr %A4108 %tmp2 = load <16 x i8>, ptr %B4109 %tmp3 = call <16 x i8> @llvm.aarch64.neon.vsli.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2, i32 1)4110 ret <16 x i8> %tmp34111}4112 4113define <8 x i16> @sli8h(ptr %A, ptr %B) nounwind {4114; CHECK-LABEL: sli8h:4115; CHECK: // %bb.0:4116; CHECK-NEXT: ldr q0, [x0]4117; CHECK-NEXT: ldr q1, [x1]4118; CHECK-NEXT: sli v0.8h, v1.8h, #14119; CHECK-NEXT: ret4120 %tmp1 = load <8 x i16>, ptr %A4121 %tmp2 = load <8 x i16>, ptr %B4122 %tmp3 = call <8 x i16> @llvm.aarch64.neon.vsli.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2, i32 1)4123 ret <8 x i16> %tmp34124}4125 4126define <4 x i32> @sli4s(ptr %A, ptr %B) nounwind {4127; CHECK-LABEL: sli4s:4128; CHECK: // %bb.0:4129; CHECK-NEXT: ldr q0, [x0]4130; CHECK-NEXT: ldr q1, [x1]4131; CHECK-NEXT: sli v0.4s, v1.4s, #14132; CHECK-NEXT: ret4133 %tmp1 = load <4 x i32>, ptr %A4134 %tmp2 = load <4 x i32>, ptr %B4135 %tmp3 = call <4 x i32> @llvm.aarch64.neon.vsli.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2, i32 1)4136 ret <4 x i32> %tmp34137}4138 4139define <2 x i64> @sli2d(ptr %A, ptr %B) nounwind {4140; CHECK-LABEL: sli2d:4141; CHECK: // %bb.0:4142; CHECK-NEXT: ldr q0, [x0]4143; CHECK-NEXT: ldr q1, [x1]4144; CHECK-NEXT: sli v0.2d, v1.2d, #14145; CHECK-NEXT: ret4146 %tmp1 = load <2 x i64>, ptr %A4147 %tmp2 = load <2 x i64>, ptr %B4148 %tmp3 = call <2 x i64> @llvm.aarch64.neon.vsli.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2, i32 1)4149 ret <2 x i64> %tmp34150}4151 4152declare <8 x i8> @llvm.aarch64.neon.vsli.v8i8(<8 x i8>, <8 x i8>, i32) nounwind readnone4153declare <4 x i16> @llvm.aarch64.neon.vsli.v4i16(<4 x i16>, <4 x i16>, i32) nounwind readnone4154declare <2 x i32> @llvm.aarch64.neon.vsli.v2i32(<2 x i32>, <2 x i32>, i32) nounwind readnone4155declare <1 x i64> @llvm.aarch64.neon.vsli.v1i64(<1 x i64>, <1 x i64>, i32) nounwind readnone4156 4157declare <16 x i8> @llvm.aarch64.neon.vsli.v16i8(<16 x i8>, <16 x i8>, i32) nounwind readnone4158declare <8 x i16> @llvm.aarch64.neon.vsli.v8i16(<8 x i16>, <8 x i16>, i32) nounwind readnone4159declare <4 x i32> @llvm.aarch64.neon.vsli.v4i32(<4 x i32>, <4 x i32>, i32) nounwind readnone4160declare <2 x i64> @llvm.aarch64.neon.vsli.v2i64(<2 x i64>, <2 x i64>, i32) nounwind readnone4161 4162define <1 x i64> @ashr_v1i64(<1 x i64> %a, <1 x i64> %b) {4163; CHECK-SD-LABEL: ashr_v1i64:4164; CHECK-SD: // %bb.0:4165; CHECK-SD-NEXT: neg d1, d14166; CHECK-SD-NEXT: sshl d0, d0, d14167; CHECK-SD-NEXT: ret4168;4169; CHECK-GI-LABEL: ashr_v1i64:4170; CHECK-GI: // %bb.0:4171; CHECK-GI-NEXT: fmov x8, d04172; CHECK-GI-NEXT: fmov x9, d14173; CHECK-GI-NEXT: asr x8, x8, x94174; CHECK-GI-NEXT: fmov d0, x84175; CHECK-GI-NEXT: ret4176 %c = ashr <1 x i64> %a, %b4177 ret <1 x i64> %c4178}4179 4180define void @sqshl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4181; CHECK-SD-LABEL: sqshl_zero_shift_amount:4182; CHECK-SD: // %bb.0: // %entry4183; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4184; CHECK-SD-NEXT: str q0, [x0]4185; CHECK-SD-NEXT: ret4186;4187; CHECK-GI-LABEL: sqshl_zero_shift_amount:4188; CHECK-GI: // %bb.0: // %entry4189; CHECK-GI-NEXT: movi v2.2d, #00000000000000004190; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4191; CHECK-GI-NEXT: sqshl v0.2d, v0.2d, v2.2d4192; CHECK-GI-NEXT: str q0, [x0]4193; CHECK-GI-NEXT: ret4194entry:4195 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4196 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqshl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4197 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84198 ret void4199}4200 4201define void @uqshl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4202; CHECK-SD-LABEL: uqshl_zero_shift_amount:4203; CHECK-SD: // %bb.0: // %entry4204; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4205; CHECK-SD-NEXT: str q0, [x0]4206; CHECK-SD-NEXT: ret4207;4208; CHECK-GI-LABEL: uqshl_zero_shift_amount:4209; CHECK-GI: // %bb.0: // %entry4210; CHECK-GI-NEXT: movi v2.2d, #00000000000000004211; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4212; CHECK-GI-NEXT: uqshl v0.2d, v0.2d, v2.2d4213; CHECK-GI-NEXT: str q0, [x0]4214; CHECK-GI-NEXT: ret4215entry:4216 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4217 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.uqshl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4218 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84219 ret void4220}4221 4222define void @srshl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4223; CHECK-SD-LABEL: srshl_zero_shift_amount:4224; CHECK-SD: // %bb.0: // %entry4225; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4226; CHECK-SD-NEXT: str q0, [x0]4227; CHECK-SD-NEXT: ret4228;4229; CHECK-GI-LABEL: srshl_zero_shift_amount:4230; CHECK-GI: // %bb.0: // %entry4231; CHECK-GI-NEXT: movi v2.2d, #00000000000000004232; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4233; CHECK-GI-NEXT: srshl v0.2d, v0.2d, v2.2d4234; CHECK-GI-NEXT: str q0, [x0]4235; CHECK-GI-NEXT: ret4236entry:4237 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4238 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.srshl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4239 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84240 ret void4241}4242 4243define void @urshl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4244; CHECK-SD-LABEL: urshl_zero_shift_amount:4245; CHECK-SD: // %bb.0: // %entry4246; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4247; CHECK-SD-NEXT: str q0, [x0]4248; CHECK-SD-NEXT: ret4249;4250; CHECK-GI-LABEL: urshl_zero_shift_amount:4251; CHECK-GI: // %bb.0: // %entry4252; CHECK-GI-NEXT: movi v2.2d, #00000000000000004253; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4254; CHECK-GI-NEXT: urshl v0.2d, v0.2d, v2.2d4255; CHECK-GI-NEXT: str q0, [x0]4256; CHECK-GI-NEXT: ret4257entry:4258 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4259 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.urshl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4260 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84261 ret void4262}4263 4264define void @sqshlu_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4265; CHECK-LABEL: sqshlu_zero_shift_amount:4266; CHECK: // %bb.0: // %entry4267; CHECK-NEXT: addp v0.2d, v0.2d, v1.2d4268; CHECK-NEXT: sqshlu v0.2d, v0.2d, #04269; CHECK-NEXT: str q0, [x0]4270; CHECK-NEXT: ret4271entry:4272 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4273 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sqshlu.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4274 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84275 ret void4276}4277 4278define void @sshl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4279; CHECK-SD-LABEL: sshl_zero_shift_amount:4280; CHECK-SD: // %bb.0: // %entry4281; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4282; CHECK-SD-NEXT: str q0, [x0]4283; CHECK-SD-NEXT: ret4284;4285; CHECK-GI-LABEL: sshl_zero_shift_amount:4286; CHECK-GI: // %bb.0: // %entry4287; CHECK-GI-NEXT: movi v2.2d, #00000000000000004288; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4289; CHECK-GI-NEXT: sshl v0.2d, v0.2d, v2.2d4290; CHECK-GI-NEXT: str q0, [x0]4291; CHECK-GI-NEXT: ret4292entry:4293 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4294 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.sshl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4295 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84296 ret void4297}4298 4299define void @ushl_zero_shift_amount(<2 x i64> %a, <2 x i64> %b, ptr %dst) {4300; CHECK-SD-LABEL: ushl_zero_shift_amount:4301; CHECK-SD: // %bb.0: // %entry4302; CHECK-SD-NEXT: addp v0.2d, v0.2d, v1.2d4303; CHECK-SD-NEXT: str q0, [x0]4304; CHECK-SD-NEXT: ret4305;4306; CHECK-GI-LABEL: ushl_zero_shift_amount:4307; CHECK-GI: // %bb.0: // %entry4308; CHECK-GI-NEXT: movi v2.2d, #00000000000000004309; CHECK-GI-NEXT: addp v0.2d, v0.2d, v1.2d4310; CHECK-GI-NEXT: ushl v0.2d, v0.2d, v2.2d4311; CHECK-GI-NEXT: str q0, [x0]4312; CHECK-GI-NEXT: ret4313entry:4314 %vpaddq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64> %a, <2 x i64> %b)4315 %vshlq_v2.i.i = tail call <2 x i64> @llvm.aarch64.neon.ushl.v2i64(<2 x i64> %vpaddq_v2.i.i, <2 x i64> zeroinitializer)4316 store <2 x i64> %vshlq_v2.i.i, ptr %dst, align 84317 ret void4318}4319 4320define <4 x i32> @sext_rshrn(<4 x i32> noundef %a) {4321; CHECK-LABEL: sext_rshrn:4322; CHECK: // %bb.0: // %entry4323; CHECK-NEXT: rshrn v0.4h, v0.4s, #134324; CHECK-NEXT: sshll v0.4s, v0.4h, #04325; CHECK-NEXT: ret4326entry:4327 %vrshrn_n1 = tail call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %a, i32 13)4328 %vmovl.i = sext <4 x i16> %vrshrn_n1 to <4 x i32>4329 ret <4 x i32> %vmovl.i4330}4331 4332define <4 x i32> @zext_rshrn(<4 x i32> noundef %a) {4333; CHECK-LABEL: zext_rshrn:4334; CHECK: // %bb.0: // %entry4335; CHECK-NEXT: rshrn v0.4h, v0.4s, #134336; CHECK-NEXT: ushll v0.4s, v0.4h, #04337; CHECK-NEXT: ret4338entry:4339 %vrshrn_n1 = tail call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %a, i32 13)4340 %vmovl.i = zext <4 x i16> %vrshrn_n1 to <4 x i32>4341 ret <4 x i32> %vmovl.i4342}4343 4344define <4 x i16> @mul_rshrn(<4 x i32> noundef %a) {4345; CHECK-LABEL: mul_rshrn:4346; CHECK: // %bb.0: // %entry4347; CHECK-NEXT: movi v1.4s, #34348; CHECK-NEXT: add v0.4s, v0.4s, v1.4s4349; CHECK-NEXT: rshrn v0.4h, v0.4s, #134350; CHECK-NEXT: ret4351entry:4352 %b = add <4 x i32> %a, <i32 3, i32 3, i32 3, i32 3>4353 %vrshrn_n1 = tail call <4 x i16> @llvm.aarch64.neon.rshrn.v4i16(<4 x i32> %b, i32 13)4354 ret <4 x i16> %vrshrn_n14355}4356 4357define <8 x i16> @signbits_vashr(<8 x i16> %a) {4358; CHECK-SD-LABEL: signbits_vashr:4359; CHECK-SD: // %bb.0:4360; CHECK-SD-NEXT: sshr v0.8h, v0.8h, #84361; CHECK-SD-NEXT: sshr v0.8h, v0.8h, #94362; CHECK-SD-NEXT: ret4363;4364; CHECK-GI-LABEL: signbits_vashr:4365; CHECK-GI: // %bb.0:4366; CHECK-GI-NEXT: mvni v1.8h, #74367; CHECK-GI-NEXT: mvni v2.8h, #84368; CHECK-GI-NEXT: sshl v0.8h, v0.8h, v1.8h4369; CHECK-GI-NEXT: sshl v0.8h, v0.8h, v2.8h4370; CHECK-GI-NEXT: sshr v0.8h, v0.8h, #74371; CHECK-GI-NEXT: ret4372 %b = call <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16> %a, <8 x i16> <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>)4373 %c = call <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16> %b, <8 x i16> <i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9>)4374 %d = ashr <8 x i16> %c, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>4375 ret <8 x i16> %d4376}4377 4378define <2 x i8> @lshr_trunc_v2i64_v2i8(<2 x i64> %a) {4379; CHECK-SD-LABEL: lshr_trunc_v2i64_v2i8:4380; CHECK-SD: // %bb.0:4381; CHECK-SD-NEXT: shrn v0.2s, v0.2d, #164382; CHECK-SD-NEXT: ret4383;4384; CHECK-GI-LABEL: lshr_trunc_v2i64_v2i8:4385; CHECK-GI: // %bb.0:4386; CHECK-GI-NEXT: xtn v0.2s, v0.2d4387; CHECK-GI-NEXT: ushr v0.2s, v0.2s, #164388; CHECK-GI-NEXT: ret4389 %b = lshr <2 x i64> %a, <i64 16, i64 16>4390 %c = trunc <2 x i64> %b to <2 x i8>4391 ret <2 x i8> %c4392}4393 4394define <4 x i16> @lshr_trunc_v4i64_v4i16(<4 x i64> %a) {4395; CHECK-SD-LABEL: lshr_trunc_v4i64_v4i16:4396; CHECK-SD: // %bb.0:4397; CHECK-SD-NEXT: xtn v1.2s, v1.2d4398; CHECK-SD-NEXT: xtn v0.2s, v0.2d4399; CHECK-SD-NEXT: ushr v1.2s, v1.2s, #84400; CHECK-SD-NEXT: ushr v0.2s, v0.2s, #84401; CHECK-SD-NEXT: uzp1 v0.4h, v0.4h, v1.4h4402; CHECK-SD-NEXT: ret4403;4404; CHECK-GI-LABEL: lshr_trunc_v4i64_v4i16:4405; CHECK-GI: // %bb.0:4406; CHECK-GI-NEXT: adrp x8, .LCPI270_04407; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4408; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI270_0]4409; CHECK-GI-NEXT: uzp1 v2.4s, v2.4s, v2.4s4410; CHECK-GI-NEXT: neg v1.4s, v2.4s4411; CHECK-GI-NEXT: ushl v0.4s, v0.4s, v1.4s4412; CHECK-GI-NEXT: xtn v0.4h, v0.4s4413; CHECK-GI-NEXT: ret4414 %b = lshr <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>4415 %c = trunc <4 x i64> %b to <4 x i16>4416 ret <4 x i16> %c4417}4418 4419define <2 x i8> @ashr_trunc_v2i64_v2i8(<2 x i64> %a) {4420; CHECK-SD-LABEL: ashr_trunc_v2i64_v2i8:4421; CHECK-SD: // %bb.0:4422; CHECK-SD-NEXT: shrn v0.2s, v0.2d, #164423; CHECK-SD-NEXT: ret4424;4425; CHECK-GI-LABEL: ashr_trunc_v2i64_v2i8:4426; CHECK-GI: // %bb.0:4427; CHECK-GI-NEXT: xtn v0.2s, v0.2d4428; CHECK-GI-NEXT: sshr v0.2s, v0.2s, #164429; CHECK-GI-NEXT: ret4430 %b = ashr <2 x i64> %a, <i64 16, i64 16>4431 %c = trunc <2 x i64> %b to <2 x i8>4432 ret <2 x i8> %c4433}4434 4435define <4 x i16> @ashr_trunc_v4i64_v4i16(<4 x i64> %a) {4436; CHECK-SD-LABEL: ashr_trunc_v4i64_v4i16:4437; CHECK-SD: // %bb.0:4438; CHECK-SD-NEXT: xtn v1.2s, v1.2d4439; CHECK-SD-NEXT: xtn v0.2s, v0.2d4440; CHECK-SD-NEXT: ushr v1.2s, v1.2s, #84441; CHECK-SD-NEXT: ushr v0.2s, v0.2s, #84442; CHECK-SD-NEXT: uzp1 v0.4h, v0.4h, v1.4h4443; CHECK-SD-NEXT: ret4444;4445; CHECK-GI-LABEL: ashr_trunc_v4i64_v4i16:4446; CHECK-GI: // %bb.0:4447; CHECK-GI-NEXT: adrp x8, .LCPI272_04448; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4449; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI272_0]4450; CHECK-GI-NEXT: uzp1 v2.4s, v2.4s, v2.4s4451; CHECK-GI-NEXT: neg v1.4s, v2.4s4452; CHECK-GI-NEXT: sshl v0.4s, v0.4s, v1.4s4453; CHECK-GI-NEXT: xtn v0.4h, v0.4s4454; CHECK-GI-NEXT: ret4455 %b = ashr <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>4456 %c = trunc <4 x i64> %b to <4 x i16>4457 ret <4 x i16> %c4458}4459 4460define <2 x i8> @shl_trunc_v2i64_v2i8(<2 x i64> %a) {4461; CHECK-SD-LABEL: shl_trunc_v2i64_v2i8:4462; CHECK-SD: // %bb.0:4463; CHECK-SD-NEXT: xtn v0.2s, v0.2d4464; CHECK-SD-NEXT: shl v0.2s, v0.2s, #164465; CHECK-SD-NEXT: ret4466;4467; CHECK-GI-LABEL: shl_trunc_v2i64_v2i8:4468; CHECK-GI: // %bb.0:4469; CHECK-GI-NEXT: shl v0.2d, v0.2d, #164470; CHECK-GI-NEXT: xtn v0.2s, v0.2d4471; CHECK-GI-NEXT: ret4472 %b = shl <2 x i64> %a, <i64 16, i64 16>4473 %c = trunc <2 x i64> %b to <2 x i8>4474 ret <2 x i8> %c4475}4476 4477define <4 x i16> @shl_trunc_v4i64_v4i16(<4 x i64> %a) {4478; CHECK-SD-LABEL: shl_trunc_v4i64_v4i16:4479; CHECK-SD: // %bb.0:4480; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s4481; CHECK-SD-NEXT: xtn v0.4h, v0.4s4482; CHECK-SD-NEXT: shl v0.4h, v0.4h, #84483; CHECK-SD-NEXT: ret4484;4485; CHECK-GI-LABEL: shl_trunc_v4i64_v4i16:4486; CHECK-GI: // %bb.0:4487; CHECK-GI-NEXT: adrp x8, .LCPI274_04488; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s4489; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI274_0]4490; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v2.4s4491; CHECK-GI-NEXT: xtn v0.4h, v0.4s4492; CHECK-GI-NEXT: xtn v1.4h, v1.4s4493; CHECK-GI-NEXT: ushl v0.4h, v0.4h, v1.4h4494; CHECK-GI-NEXT: ret4495 %b = shl <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>4496 %c = trunc <4 x i64> %b to <4 x i16>4497 ret <4 x i16> %c4498}4499 4500declare <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64>, <2 x i64>)4501