brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.4 KiB · ddb85d6 Raw
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