1b794dc23SDominik Steenken; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2*922992a2SJay Foad; Test vector add reduction intrinsic 3b794dc23SDominik Steenken; 4b794dc23SDominik Steenken; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z16 | FileCheck %s 5b794dc23SDominik Steenken 6b794dc23SDominik Steenken; 1 vector length 7b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %a) 8b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %a) 9b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %a) 10b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %a) 11b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v1i128(<1 x i128> %a) 12b794dc23SDominik Steenken; 2 vector lengths 13b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %a) 14b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %a) 15b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a) 16b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %a) 17b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v2i128(<2 x i128> %a) 18b794dc23SDominik Steenken; ; TODO 19b794dc23SDominik Steenken; ; 4 vector lengths 20b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %a) 21b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %a) 22b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %a) 23b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %a) 24b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v4i128(<4 x i128> %a) 25b794dc23SDominik Steenken; ; Subvector lengths 26b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a) 27b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %a) 28b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a) 29b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v1i64(<1 x i64> %a) 30b794dc23SDominik Steenken 31b794dc23SDominik Steenkendefine i8 @f1_1(<16 x i8> %a) { 32b794dc23SDominik Steenken; CHECK-LABEL: f1_1: 33b794dc23SDominik Steenken; CHECK: # %bb.0: 34b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v0, 0 35b794dc23SDominik Steenken; CHECK-NEXT: vsumb %v1, %v24, %v0 36b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v1, %v0 37b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 38b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 39b794dc23SDominik Steenken; CHECK-NEXT: br %r14 40b794dc23SDominik Steenken %redadd = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %a) 41b794dc23SDominik Steenken ret i8 %redadd 42b794dc23SDominik Steenken} 43b794dc23SDominik Steenken 44b794dc23SDominik Steenkendefine i16 @f1_2(<8 x i16> %a) { 45b794dc23SDominik Steenken; CHECK-LABEL: f1_2: 46b794dc23SDominik Steenken; CHECK: # %bb.0: 47b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v0, 0 48b794dc23SDominik Steenken; CHECK-NEXT: vsumh %v1, %v24, %v0 49b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v1, %v0 50b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 51b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 52b794dc23SDominik Steenken; CHECK-NEXT: br %r14 53b794dc23SDominik Steenken %redadd = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %a) 54b794dc23SDominik Steenken ret i16 %redadd 55b794dc23SDominik Steenken} 56b794dc23SDominik Steenken 57b794dc23SDominik Steenkendefine i32 @f1_3(<4 x i32> %a) { 58b794dc23SDominik Steenken; CHECK-LABEL: f1_3: 59b794dc23SDominik Steenken; CHECK: # %bb.0: 60b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v0, 0 61b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v24, %v0 62b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 63b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 64b794dc23SDominik Steenken; CHECK-NEXT: br %r14 65b794dc23SDominik Steenken 66b794dc23SDominik Steenken %redadd = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %a) 67b794dc23SDominik Steenken ret i32 %redadd 68b794dc23SDominik Steenken} 69b794dc23SDominik Steenken 70b794dc23SDominik Steenkendefine i64 @f1_4(<2 x i64> %a) { 71b794dc23SDominik Steenken; CHECK-LABEL: f1_4: 72b794dc23SDominik Steenken; CHECK: # %bb.0: 73b794dc23SDominik Steenken; CHECK-NEXT: vrepg %v0, %v24, 1 74b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v24, %v0 75b794dc23SDominik Steenken; CHECK-NEXT: vlgvg %r2, %v0, 0 76b794dc23SDominik Steenken; CHECK-NEXT: br %r14 77b794dc23SDominik Steenken 78b794dc23SDominik Steenken %redadd = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %a) 79b794dc23SDominik Steenken ret i64 %redadd 80b794dc23SDominik Steenken} 81b794dc23SDominik Steenken 82b794dc23SDominik Steenkendefine i128 @f1_5(<1 x i128> %a) { 83b794dc23SDominik Steenken; CHECK-LABEL: f1_5: 84b794dc23SDominik Steenken; CHECK: # %bb.0: 85b794dc23SDominik Steenken; CHECK-NEXT: vst %v24, 0(%r2), 3 86b794dc23SDominik Steenken; CHECK-NEXT: br %r14 87b794dc23SDominik Steenken %redadd = call i128 @llvm.vector.reduce.add.v1i128(<1 x i128> %a) 88b794dc23SDominik Steenken ret i128 %redadd 89b794dc23SDominik Steenken} 90b794dc23SDominik Steenken 91b794dc23SDominik Steenkendefine i8 @f2_1(<32 x i8> %a) { 92b794dc23SDominik Steenken; CHECK-LABEL: f2_1: 93b794dc23SDominik Steenken; CHECK: # %bb.0: 94b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v24, %v26 95b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 96b794dc23SDominik Steenken; CHECK-NEXT: vsumb %v0, %v0, %v1 97b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 98b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 99b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 100b794dc23SDominik Steenken; CHECK-NEXT: br %r14 101b794dc23SDominik Steenken %redadd = call i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %a) 102b794dc23SDominik Steenken ret i8 %redadd 103b794dc23SDominik Steenken} 104b794dc23SDominik Steenken 105b794dc23SDominik Steenkendefine i16 @f2_2(<16 x i16> %a) { 106b794dc23SDominik Steenken; CHECK-LABEL: f2_2: 107b794dc23SDominik Steenken; CHECK: # %bb.0: 108b794dc23SDominik Steenken; CHECK-NEXT: vah %v0, %v24, %v26 109b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 110b794dc23SDominik Steenken; CHECK-NEXT: vsumh %v0, %v0, %v1 111b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 112b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 113b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 114b794dc23SDominik Steenken; CHECK-NEXT: br %r14 115b794dc23SDominik Steenken %redadd = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %a) 116b794dc23SDominik Steenken ret i16 %redadd 117b794dc23SDominik Steenken} 118b794dc23SDominik Steenken 119b794dc23SDominik Steenkendefine i32 @f2_3(<8 x i32> %a) { 120b794dc23SDominik Steenken; CHECK-LABEL: f2_3: 121b794dc23SDominik Steenken; CHECK: # %bb.0: 122b794dc23SDominik Steenken; CHECK-NEXT: vaf %v0, %v24, %v26 123b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 124b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 125b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 126b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 127b794dc23SDominik Steenken; CHECK-NEXT: br %r14 128b794dc23SDominik Steenken 129b794dc23SDominik Steenken %redadd = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a) 130b794dc23SDominik Steenken ret i32 %redadd 131b794dc23SDominik Steenken} 132b794dc23SDominik Steenken 133b794dc23SDominik Steenkendefine i64 @f2_4(<4 x i64> %a) { 134b794dc23SDominik Steenken; CHECK-LABEL: f2_4: 135b794dc23SDominik Steenken; CHECK: # %bb.0: 136b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v24, %v26 137b794dc23SDominik Steenken; CHECK-NEXT: vrepg %v1, %v0, 1 138b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v0, %v1 139b794dc23SDominik Steenken; CHECK-NEXT: vlgvg %r2, %v0, 0 140b794dc23SDominik Steenken; CHECK-NEXT: br %r14 141b794dc23SDominik Steenken 142b794dc23SDominik Steenken %redadd = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %a) 143b794dc23SDominik Steenken ret i64 %redadd 144b794dc23SDominik Steenken} 145b794dc23SDominik Steenken 146b794dc23SDominik Steenkendefine i128 @f2_5(<2 x i128> %a) { 147b794dc23SDominik Steenken; CHECK-LABEL: f2_5: 148b794dc23SDominik Steenken; CHECK: # %bb.0: 149b794dc23SDominik Steenken; CHECK-NEXT: vl %v0, 16(%r3), 3 150b794dc23SDominik Steenken; CHECK-NEXT: vl %v1, 0(%r3), 3 151b794dc23SDominik Steenken; CHECK-NEXT: vaq %v0, %v1, %v0 152b794dc23SDominik Steenken; CHECK-NEXT: vst %v0, 0(%r2), 3 153b794dc23SDominik Steenken; CHECK-NEXT: br %r14 154b794dc23SDominik Steenken %redadd = call i128 @llvm.vector.reduce.add.v2i128(<2 x i128> %a) 155b794dc23SDominik Steenken ret i128 %redadd 156b794dc23SDominik Steenken} 157b794dc23SDominik Steenken 158b794dc23SDominik Steenkendefine i8 @f3_1(<64 x i8> %a) { 159b794dc23SDominik Steenken; CHECK-LABEL: f3_1: 160b794dc23SDominik Steenken; CHECK: # %bb.0: 161b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v26, %v30 162b794dc23SDominik Steenken; CHECK-NEXT: vab %v1, %v24, %v28 163b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v1, %v0 164b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 165b794dc23SDominik Steenken; CHECK-NEXT: vsumb %v0, %v0, %v1 166b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 167b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 168b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 169b794dc23SDominik Steenken; CHECK-NEXT: br %r14 170b794dc23SDominik Steenken %redadd = call i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %a) 171b794dc23SDominik Steenken ret i8 %redadd 172b794dc23SDominik Steenken} 173b794dc23SDominik Steenken 174b794dc23SDominik Steenkendefine i16 @f3_2(<32 x i16> %a) { 175b794dc23SDominik Steenken; CHECK-LABEL: f3_2: 176b794dc23SDominik Steenken; CHECK: # %bb.0: 177b794dc23SDominik Steenken; CHECK-NEXT: vah %v0, %v26, %v30 178b794dc23SDominik Steenken; CHECK-NEXT: vah %v1, %v24, %v28 179b794dc23SDominik Steenken; CHECK-NEXT: vah %v0, %v1, %v0 180b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 181b794dc23SDominik Steenken; CHECK-NEXT: vsumh %v0, %v0, %v1 182b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 183b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 184b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 185b794dc23SDominik Steenken; CHECK-NEXT: br %r14 186b794dc23SDominik Steenken %redadd = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %a) 187b794dc23SDominik Steenken ret i16 %redadd 188b794dc23SDominik Steenken} 189b794dc23SDominik Steenken 190b794dc23SDominik Steenkendefine i32 @f3_3(<16 x i32> %a) { 191b794dc23SDominik Steenken; CHECK-LABEL: f3_3: 192b794dc23SDominik Steenken; CHECK: # %bb.0: 193b794dc23SDominik Steenken; CHECK-NEXT: vaf %v0, %v26, %v30 194b794dc23SDominik Steenken; CHECK-NEXT: vaf %v1, %v24, %v28 195b794dc23SDominik Steenken; CHECK-NEXT: vaf %v0, %v1, %v0 196b794dc23SDominik Steenken; CHECK-NEXT: vgbm %v1, 0 197b794dc23SDominik Steenken; CHECK-NEXT: vsumqf %v0, %v0, %v1 198b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 3 199b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 200b794dc23SDominik Steenken; CHECK-NEXT: br %r14 201b794dc23SDominik Steenken 202b794dc23SDominik Steenken %redadd = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %a) 203b794dc23SDominik Steenken ret i32 %redadd 204b794dc23SDominik Steenken} 205b794dc23SDominik Steenken 206b794dc23SDominik Steenkendefine i64 @f3_4(<8 x i64> %a) { 207b794dc23SDominik Steenken; CHECK-LABEL: f3_4: 208b794dc23SDominik Steenken; CHECK: # %bb.0: 209b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v26, %v30 210b794dc23SDominik Steenken; CHECK-NEXT: vag %v1, %v24, %v28 211b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v1, %v0 212b794dc23SDominik Steenken; CHECK-NEXT: vrepg %v1, %v0, 1 213b794dc23SDominik Steenken; CHECK-NEXT: vag %v0, %v0, %v1 214b794dc23SDominik Steenken; CHECK-NEXT: vlgvg %r2, %v0, 0 215b794dc23SDominik Steenken; CHECK-NEXT: br %r14 216b794dc23SDominik Steenken 217b794dc23SDominik Steenken %redadd = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %a) 218b794dc23SDominik Steenken ret i64 %redadd 219b794dc23SDominik Steenken} 220b794dc23SDominik Steenken 221b794dc23SDominik Steenkendefine i128 @f3_5(<4 x i128> %a) { 222b794dc23SDominik Steenken; CHECK-LABEL: f3_5: 223b794dc23SDominik Steenken; CHECK: # %bb.0: 224b794dc23SDominik Steenken; CHECK-NEXT: vl %v0, 32(%r3), 3 225b794dc23SDominik Steenken; CHECK-NEXT: vl %v1, 0(%r3), 3 226b794dc23SDominik Steenken; CHECK-NEXT: vl %v2, 48(%r3), 3 227b794dc23SDominik Steenken; CHECK-NEXT: vl %v3, 16(%r3), 3 228b794dc23SDominik Steenken; CHECK-NEXT: vaq %v2, %v3, %v2 229b794dc23SDominik Steenken; CHECK-NEXT: vaq %v0, %v1, %v0 230b794dc23SDominik Steenken; CHECK-NEXT: vaq %v0, %v0, %v2 231b794dc23SDominik Steenken; CHECK-NEXT: vst %v0, 0(%r2), 3 232b794dc23SDominik Steenken; CHECK-NEXT: br %r14 233b794dc23SDominik Steenken %redadd = call i128 @llvm.vector.reduce.add.v4i128(<4 x i128> %a) 234b794dc23SDominik Steenken ret i128 %redadd 235b794dc23SDominik Steenken} 236b794dc23SDominik Steenken 237b794dc23SDominik Steenken 238b794dc23SDominik Steenkendefine i8 @f4_1(<8 x i8> %a) { 239b794dc23SDominik Steenken; CHECK-LABEL: f4_1: 240b794dc23SDominik Steenken; CHECK: # %bb.0: 241b794dc23SDominik Steenken; CHECK-NEXT: vpkg %v0, %v24, %v24 242b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v24, %v0 243b794dc23SDominik Steenken; CHECK-NEXT: vpkf %v1, %v0, %v0 244b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v0, %v1 245b794dc23SDominik Steenken; CHECK-NEXT: vrepb %v1, %v0, 1 246b794dc23SDominik Steenken; CHECK-NEXT: vab %v0, %v0, %v1 247b794dc23SDominik Steenken; CHECK-NEXT: vlgvb %r2, %v0, 0 248b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 249b794dc23SDominik Steenken; CHECK-NEXT: br %r14 250b794dc23SDominik Steenken %redadd = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a) 251b794dc23SDominik Steenken ret i8 %redadd 252b794dc23SDominik Steenken} 253b794dc23SDominik Steenken 254b794dc23SDominik Steenkendefine i16 @f4_2(<4 x i16> %a) { 255b794dc23SDominik Steenken; CHECK-LABEL: f4_2: 256b794dc23SDominik Steenken; CHECK: # %bb.0: 257b794dc23SDominik Steenken; CHECK-NEXT: vpkg %v0, %v24, %v24 258b794dc23SDominik Steenken; CHECK-NEXT: vah %v0, %v24, %v0 259b794dc23SDominik Steenken; CHECK-NEXT: vreph %v1, %v0, 1 260b794dc23SDominik Steenken; CHECK-NEXT: vah %v0, %v0, %v1 261b794dc23SDominik Steenken; CHECK-NEXT: vlgvh %r2, %v0, 0 262b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 263b794dc23SDominik Steenken; CHECK-NEXT: br %r14 264b794dc23SDominik Steenken %redadd = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %a) 265b794dc23SDominik Steenken ret i16 %redadd 266b794dc23SDominik Steenken} 267b794dc23SDominik Steenken 268b794dc23SDominik Steenkendefine i32 @f4_3(<2 x i32> %a) { 269b794dc23SDominik Steenken; CHECK-LABEL: f4_3: 270b794dc23SDominik Steenken; CHECK: # %bb.0: 271b794dc23SDominik Steenken; CHECK-NEXT: vrepf %v0, %v24, 1 272b794dc23SDominik Steenken; CHECK-NEXT: vaf %v0, %v24, %v0 273b794dc23SDominik Steenken; CHECK-NEXT: vlgvf %r2, %v0, 0 274b794dc23SDominik Steenken; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d 275b794dc23SDominik Steenken; CHECK-NEXT: br %r14 276b794dc23SDominik Steenken 277b794dc23SDominik Steenken %redadd = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a) 278b794dc23SDominik Steenken ret i32 %redadd 279b794dc23SDominik Steenken} 280b794dc23SDominik Steenken 281b794dc23SDominik Steenkendefine i64 @f4_4(<1 x i64> %a) { 282b794dc23SDominik Steenken; CHECK-LABEL: f4_4: 283b794dc23SDominik Steenken; CHECK: # %bb.0: 284b794dc23SDominik Steenken; CHECK-NEXT: vlgvg %r2, %v24, 0 285b794dc23SDominik Steenken; CHECK-NEXT: br %r14 286b794dc23SDominik Steenken 287b794dc23SDominik Steenken %redadd = call i64 @llvm.vector.reduce.add.v1i64(<1 x i64> %a) 288b794dc23SDominik Steenken ret i64 %redadd 289b794dc23SDominik Steenken} 290