398 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple aarch64-unknown-linux-gnu -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5; SABA from ADD(ABS(SUB NSW))6 7define <4 x i32> @saba_abs_4s(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 {8; CHECK-SD-LABEL: saba_abs_4s:9; CHECK-SD: // %bb.0:10; CHECK-SD-NEXT: saba v0.4s, v1.4s, v2.4s11; CHECK-SD-NEXT: ret12;13; CHECK-GI-LABEL: saba_abs_4s:14; CHECK-GI: // %bb.0:15; CHECK-GI-NEXT: movi v3.2d, #000000000000000016; CHECK-GI-NEXT: sub v1.4s, v1.4s, v2.4s17; CHECK-GI-NEXT: saba v0.4s, v1.4s, v3.4s18; CHECK-GI-NEXT: ret19 %sub = sub nsw <4 x i32> %b, %c20 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)21 %add = add <4 x i32> %a, %abs22 ret <4 x i32> %add23}24 25define <2 x i32> @saba_abs_2s(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {26; CHECK-SD-LABEL: saba_abs_2s:27; CHECK-SD: // %bb.0:28; CHECK-SD-NEXT: saba v0.2s, v1.2s, v2.2s29; CHECK-SD-NEXT: ret30;31; CHECK-GI-LABEL: saba_abs_2s:32; CHECK-GI: // %bb.0:33; CHECK-GI-NEXT: movi v3.2d, #000000000000000034; CHECK-GI-NEXT: sub v1.2s, v1.2s, v2.2s35; CHECK-GI-NEXT: saba v0.2s, v1.2s, v3.2s36; CHECK-GI-NEXT: ret37 %sub = sub nsw <2 x i32> %b, %c38 %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %sub, i1 true)39 %add = add <2 x i32> %a, %abs40 ret <2 x i32> %add41}42 43define <8 x i16> @saba_abs_8h(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 {44; CHECK-SD-LABEL: saba_abs_8h:45; CHECK-SD: // %bb.0:46; CHECK-SD-NEXT: saba v0.8h, v1.8h, v2.8h47; CHECK-SD-NEXT: ret48;49; CHECK-GI-LABEL: saba_abs_8h:50; CHECK-GI: // %bb.0:51; CHECK-GI-NEXT: movi v3.2d, #000000000000000052; CHECK-GI-NEXT: sub v1.8h, v1.8h, v2.8h53; CHECK-GI-NEXT: saba v0.8h, v1.8h, v3.8h54; CHECK-GI-NEXT: ret55 %sub = sub nsw <8 x i16> %b, %c56 %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %sub, i1 true)57 %add = add <8 x i16> %a, %abs58 ret <8 x i16> %add59}60 61define <4 x i16> @saba_abs_4h(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {62; CHECK-SD-LABEL: saba_abs_4h:63; CHECK-SD: // %bb.0:64; CHECK-SD-NEXT: saba v0.4h, v1.4h, v2.4h65; CHECK-SD-NEXT: ret66;67; CHECK-GI-LABEL: saba_abs_4h:68; CHECK-GI: // %bb.0:69; CHECK-GI-NEXT: movi v3.2d, #000000000000000070; CHECK-GI-NEXT: sub v1.4h, v1.4h, v2.4h71; CHECK-GI-NEXT: saba v0.4h, v1.4h, v3.4h72; CHECK-GI-NEXT: ret73 %sub = sub nsw <4 x i16> %b, %c74 %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %sub, i1 true)75 %add = add <4 x i16> %a, %abs76 ret <4 x i16> %add77}78 79define <16 x i8> @saba_abs_16b(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 {80; CHECK-SD-LABEL: saba_abs_16b:81; CHECK-SD: // %bb.0:82; CHECK-SD-NEXT: saba v0.16b, v1.16b, v2.16b83; CHECK-SD-NEXT: ret84;85; CHECK-GI-LABEL: saba_abs_16b:86; CHECK-GI: // %bb.0:87; CHECK-GI-NEXT: movi v3.2d, #000000000000000088; CHECK-GI-NEXT: sub v1.16b, v1.16b, v2.16b89; CHECK-GI-NEXT: saba v0.16b, v1.16b, v3.16b90; CHECK-GI-NEXT: ret91 %sub = sub nsw <16 x i8> %b, %c92 %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %sub, i1 true)93 %add = add <16 x i8> %a, %abs94 ret <16 x i8> %add95}96 97define <8 x i8> @saba_abs_8b(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {98; CHECK-SD-LABEL: saba_abs_8b:99; CHECK-SD: // %bb.0:100; CHECK-SD-NEXT: saba v0.8b, v1.8b, v2.8b101; CHECK-SD-NEXT: ret102;103; CHECK-GI-LABEL: saba_abs_8b:104; CHECK-GI: // %bb.0:105; CHECK-GI-NEXT: movi v3.2d, #0000000000000000106; CHECK-GI-NEXT: sub v1.8b, v1.8b, v2.8b107; CHECK-GI-NEXT: saba v0.8b, v1.8b, v3.8b108; CHECK-GI-NEXT: ret109 %sub = sub nsw <8 x i8> %b, %c110 %abs = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %sub, i1 true)111 %add = add <8 x i8> %a, %abs112 ret <8 x i8> %add113}114 115; SABA from ADD(SABD)116 117define <4 x i32> @saba_sabd_4s(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 {118; CHECK-LABEL: saba_sabd_4s:119; CHECK: // %bb.0:120; CHECK-NEXT: saba v0.4s, v1.4s, v2.4s121; CHECK-NEXT: ret122 %sabd = call <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32> %b, <4 x i32> %c)123 %add = add <4 x i32> %sabd, %a124 ret <4 x i32> %add125}126 127define <2 x i32> @saba_sabd_2s(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {128; CHECK-LABEL: saba_sabd_2s:129; CHECK: // %bb.0:130; CHECK-NEXT: saba v0.2s, v1.2s, v2.2s131; CHECK-NEXT: ret132 %sabd = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %b, <2 x i32> %c)133 %add = add <2 x i32> %sabd, %a134 ret <2 x i32> %add135}136 137define <8 x i16> @saba_sabd_8h(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 {138; CHECK-LABEL: saba_sabd_8h:139; CHECK: // %bb.0:140; CHECK-NEXT: saba v0.8h, v1.8h, v2.8h141; CHECK-NEXT: ret142 %sabd = call <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16> %b, <8 x i16> %c)143 %add = add <8 x i16> %sabd, %a144 ret <8 x i16> %add145}146 147define <4 x i16> @saba_sabd_4h(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {148; CHECK-LABEL: saba_sabd_4h:149; CHECK: // %bb.0:150; CHECK-NEXT: saba v0.4h, v1.4h, v2.4h151; CHECK-NEXT: ret152 %sabd = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %b, <4 x i16> %c)153 %add = add <4 x i16> %sabd, %a154 ret <4 x i16> %add155}156 157define <16 x i8> @saba_sabd_16b(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 {158; CHECK-LABEL: saba_sabd_16b:159; CHECK: // %bb.0:160; CHECK-NEXT: saba v0.16b, v1.16b, v2.16b161; CHECK-NEXT: ret162 %sabd = call <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8> %b, <16 x i8> %c)163 %add = add <16 x i8> %sabd, %a164 ret <16 x i8> %add165}166 167define <8 x i8> @saba_sabd_8b(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {168; CHECK-LABEL: saba_sabd_8b:169; CHECK: // %bb.0:170; CHECK-NEXT: saba v0.8b, v1.8b, v2.8b171; CHECK-NEXT: ret172 %sabd = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> %c)173 %add = add <8 x i8> %sabd, %a174 ret <8 x i8> %add175}176 177; SABA from ADD(SABD(X, ZEROS))178 179define <4 x i32> @saba_sabd_zeros_4s(<4 x i32> %a, <4 x i32> %b) #0 {180; CHECK-LABEL: saba_sabd_zeros_4s:181; CHECK: // %bb.0:182; CHECK-NEXT: movi v2.2d, #0000000000000000183; CHECK-NEXT: saba v0.4s, v1.4s, v2.4s184; CHECK-NEXT: ret185 %sabd = call <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32> %b, <4 x i32> zeroinitializer)186 %add = add <4 x i32> %sabd, %a187 ret <4 x i32> %add188}189 190define <2 x i32> @saba_sabd_zeros_2s(<2 x i32> %a, <2 x i32> %b) #0 {191; CHECK-LABEL: saba_sabd_zeros_2s:192; CHECK: // %bb.0:193; CHECK-NEXT: movi v2.2d, #0000000000000000194; CHECK-NEXT: saba v0.2s, v1.2s, v2.2s195; CHECK-NEXT: ret196 %sabd = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %b, <2 x i32> zeroinitializer)197 %add = add <2 x i32> %sabd, %a198 ret <2 x i32> %add199}200 201define <8 x i16> @saba_sabd_zeros_8h(<8 x i16> %a, <8 x i16> %b) #0 {202; CHECK-LABEL: saba_sabd_zeros_8h:203; CHECK: // %bb.0:204; CHECK-NEXT: movi v2.2d, #0000000000000000205; CHECK-NEXT: saba v0.8h, v1.8h, v2.8h206; CHECK-NEXT: ret207 %sabd = call <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16> %b, <8 x i16> zeroinitializer)208 %add = add <8 x i16> %sabd, %a209 ret <8 x i16> %add210}211 212define <4 x i16> @saba_sabd_zeros_4h(<4 x i16> %a, <4 x i16> %b) #0 {213; CHECK-LABEL: saba_sabd_zeros_4h:214; CHECK: // %bb.0:215; CHECK-NEXT: movi v2.2d, #0000000000000000216; CHECK-NEXT: saba v0.4h, v1.4h, v2.4h217; CHECK-NEXT: ret218 %sabd = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %b, <4 x i16> zeroinitializer)219 %add = add <4 x i16> %sabd, %a220 ret <4 x i16> %add221}222 223define <16 x i8> @saba_sabd_zeros_16b(<16 x i8> %a, <16 x i8> %b) #0 {224; CHECK-LABEL: saba_sabd_zeros_16b:225; CHECK: // %bb.0:226; CHECK-NEXT: movi v2.2d, #0000000000000000227; CHECK-NEXT: saba v0.16b, v1.16b, v2.16b228; CHECK-NEXT: ret229 %sabd = call <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8> %b, <16 x i8> zeroinitializer)230 %add = add <16 x i8> %sabd, %a231 ret <16 x i8> %add232}233 234define <8 x i8> @saba_sabd_zeros_8b(<8 x i8> %a, <8 x i8> %b) #0 {235; CHECK-LABEL: saba_sabd_zeros_8b:236; CHECK: // %bb.0:237; CHECK-NEXT: movi v2.2d, #0000000000000000238; CHECK-NEXT: saba v0.8b, v1.8b, v2.8b239; CHECK-NEXT: ret240 %sabd = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> zeroinitializer)241 %add = add <8 x i8> %sabd, %a242 ret <8 x i8> %add243}244 245define <4 x i32> @saba_abs_zeros_4s(<4 x i32> %a, <4 x i32> %b) #0 {246; CHECK-LABEL: saba_abs_zeros_4s:247; CHECK: // %bb.0:248; CHECK-NEXT: movi v2.2d, #0000000000000000249; CHECK-NEXT: saba v0.4s, v1.4s, v2.4s250; CHECK-NEXT: ret251 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %b, i1 true)252 %add = add <4 x i32> %a, %abs253 ret <4 x i32> %add254}255 256define <2 x i32> @saba_abs_zeros_2s(<2 x i32> %a, <2 x i32> %b) #0 {257; CHECK-LABEL: saba_abs_zeros_2s:258; CHECK: // %bb.0:259; CHECK-NEXT: movi v2.2d, #0000000000000000260; CHECK-NEXT: saba v0.2s, v1.2s, v2.2s261; CHECK-NEXT: ret262 %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %b, i1 true)263 %add = add <2 x i32> %a, %abs264 ret <2 x i32> %add265}266 267define <8 x i16> @saba_abs_zeros_8h(<8 x i16> %a, <8 x i16> %b) #0 {268; CHECK-LABEL: saba_abs_zeros_8h:269; CHECK: // %bb.0:270; CHECK-NEXT: movi v2.2d, #0000000000000000271; CHECK-NEXT: saba v0.8h, v1.8h, v2.8h272; CHECK-NEXT: ret273 %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %b, i1 true)274 %add = add <8 x i16> %a, %abs275 ret <8 x i16> %add276}277 278define <4 x i16> @saba_abs_zeros_4h(<4 x i16> %a, <4 x i16> %b) #0 {279; CHECK-LABEL: saba_abs_zeros_4h:280; CHECK: // %bb.0:281; CHECK-NEXT: movi v2.2d, #0000000000000000282; CHECK-NEXT: saba v0.4h, v1.4h, v2.4h283; CHECK-NEXT: ret284 %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %b, i1 true)285 %add = add <4 x i16> %a, %abs286 ret <4 x i16> %add287}288 289define <16 x i8> @saba_abs_zeros_16b(<16 x i8> %a, <16 x i8> %b) #0 {290; CHECK-LABEL: saba_abs_zeros_16b:291; CHECK: // %bb.0:292; CHECK-NEXT: movi v2.2d, #0000000000000000293; CHECK-NEXT: saba v0.16b, v1.16b, v2.16b294; CHECK-NEXT: ret295 %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %b, i1 true)296 %add = add <16 x i8> %a, %abs297 ret <16 x i8> %add298}299 300define <8 x i8> @saba_abs_zeros_8b(<8 x i8> %a, <8 x i8> %b) #0 {301; CHECK-LABEL: saba_abs_zeros_8b:302; CHECK: // %bb.0:303; CHECK-NEXT: movi v2.2d, #0000000000000000304; CHECK-NEXT: saba v0.8b, v1.8b, v2.8b305; CHECK-NEXT: ret306 %abs = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %b, i1 true)307 %add = add <8 x i8> %a, %abs308 ret <8 x i8> %add309}310 311; SABAL from ADD(ZEXT(SABD(X, ZEROS)))312 313define <2 x i64> @sabal_sabd_zeros_2s(<2 x i64> %a, <2 x i32> %b) #0 {314; CHECK-LABEL: sabal_sabd_zeros_2s:315; CHECK: // %bb.0:316; CHECK-NEXT: movi v2.2d, #0000000000000000317; CHECK-NEXT: sabal v0.2d, v1.2s, v2.2s318; CHECK-NEXT: ret319 %sabd = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> %b, <2 x i32> zeroinitializer)320 %sabd.zext = zext <2 x i32> %sabd to <2 x i64>321 %add = add <2 x i64> %sabd.zext, %a322 ret <2 x i64> %add323}324 325define <4 x i32> @sabal_sabd_zeros_4h(<4 x i32> %a, <4 x i16> %b) #0 {326; CHECK-LABEL: sabal_sabd_zeros_4h:327; CHECK: // %bb.0:328; CHECK-NEXT: movi v2.2d, #0000000000000000329; CHECK-NEXT: sabal v0.4s, v1.4h, v2.4h330; CHECK-NEXT: ret331 %sabd = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> %b, <4 x i16> zeroinitializer)332 %sabd.zext = zext <4 x i16> %sabd to <4 x i32>333 %add = add <4 x i32> %sabd.zext, %a334 ret <4 x i32> %add335}336 337define <8 x i16> @sabal_sabd_zeros_8b(<8 x i16> %a, <8 x i8> %b) #0 {338; CHECK-LABEL: sabal_sabd_zeros_8b:339; CHECK: // %bb.0:340; CHECK-NEXT: movi v2.2d, #0000000000000000341; CHECK-NEXT: sabal v0.8h, v1.8b, v2.8b342; CHECK-NEXT: ret343 %sabd = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> zeroinitializer)344 %sabd.zext = zext <8 x i8> %sabd to <8 x i16>345 %add = add <8 x i16> %sabd.zext, %a346 ret <8 x i16> %add347}348 349define <2 x i64> @sabal_abs_zeros_2s(<2 x i64> %a, <2 x i32> %b) #0 {350; CHECK-LABEL: sabal_abs_zeros_2s:351; CHECK: // %bb.0:352; CHECK-NEXT: movi v2.2d, #0000000000000000353; CHECK-NEXT: sabal v0.2d, v1.2s, v2.2s354; CHECK-NEXT: ret355 %abs = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %b, i1 true)356 %abs.zext = zext <2 x i32> %abs to <2 x i64>357 %add = add <2 x i64> %a, %abs.zext358 ret <2 x i64> %add359}360 361define <4 x i32> @sabal_abs_zeros_4h(<4 x i32> %a, <4 x i16> %b) #0 {362; CHECK-LABEL: sabal_abs_zeros_4h:363; CHECK: // %bb.0:364; CHECK-NEXT: movi v2.2d, #0000000000000000365; CHECK-NEXT: sabal v0.4s, v1.4h, v2.4h366; CHECK-NEXT: ret367 %abs = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %b, i1 true)368 %abs.zext = zext <4 x i16> %abs to <4 x i32>369 %add = add <4 x i32> %a, %abs.zext370 ret <4 x i32> %add371}372 373define <8 x i16> @sabal_abs_zeros_8b(<8 x i16> %a, <8 x i8> %b) #0 {374; CHECK-LABEL: sabal_abs_zeros_8b:375; CHECK: // %bb.0:376; CHECK-NEXT: movi v2.2d, #0000000000000000377; CHECK-NEXT: sabal v0.8h, v1.8b, v2.8b378; CHECK-NEXT: ret379 %abs = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %b, i1 true)380 %abs.zext = zext <8 x i8> %abs to <8 x i16>381 %add = add <8 x i16> %a, %abs.zext382 ret <8 x i16> %add383}384 385declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)386declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)387declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)388declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1)389declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)390declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1)391 392declare <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32>, <4 x i32>)393declare <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32>, <2 x i32>)394declare <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16>, <8 x i16>)395declare <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16>, <4 x i16>)396declare <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8>, <16 x i8>)397declare <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8>, <8 x i8>)398