| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; Test usage of VACC/VSCBI. |
| ; |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s |
| |
| define <16 x i8> @v16i8_subc_1(<16 x i8> %a, <16 x i8> %b) unnamed_addr { |
| ; CHECK-LABEL: v16i8_subc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbib %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp uge <16 x i8> %a, %b |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <16 x i8> @v16i8_subc_2(<16 x i8> %a, <16 x i8> %b) unnamed_addr { |
| ; CHECK-LABEL: v16i8_subc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbib %v24, %v26, %v24 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp ule <16 x i8> %a, %b |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <16 x i8> @v16i8_addc_1(<16 x i8> %a, <16 x i8> %b) { |
| ; CHECK-LABEL: v16i8_addc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccb %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <16 x i8> %a, %b |
| %cmp = icmp ult <16 x i8> %sum, %a |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <16 x i8> @v16i8_addc_2(<16 x i8> %a, <16 x i8> %b) { |
| ; CHECK-LABEL: v16i8_addc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccb %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <16 x i8> %a, %b |
| %cmp = icmp ult <16 x i8> %sum, %b |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <16 x i8> @v16i8_addc_3(<16 x i8> %a, <16 x i8> %b) { |
| ; CHECK-LABEL: v16i8_addc_3: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccb %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <16 x i8> %a, %b |
| %cmp = icmp ugt <16 x i8> %a, %sum |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <16 x i8> @v16i8_addc_4(<16 x i8> %a, <16 x i8> %b) { |
| ; CHECK-LABEL: v16i8_addc_4: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccb %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <16 x i8> %a, %b |
| %cmp = icmp ugt <16 x i8> %b, %sum |
| %ext = zext <16 x i1> %cmp to <16 x i8> |
| ret <16 x i8> %ext |
| } |
| |
| define <8 x i16> @v8i16_subc_1(<8 x i16> %a, <8 x i16> %b) unnamed_addr { |
| ; CHECK-LABEL: v8i16_subc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbih %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp uge <8 x i16> %a, %b |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <8 x i16> @v8i16_subc_2(<8 x i16> %a, <8 x i16> %b) unnamed_addr { |
| ; CHECK-LABEL: v8i16_subc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbih %v24, %v26, %v24 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp ule <8 x i16> %a, %b |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <8 x i16> @v8i16_addc_1(<8 x i16> %a, <8 x i16> %b) { |
| ; CHECK-LABEL: v8i16_addc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vacch %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <8 x i16> %a, %b |
| %cmp = icmp ult <8 x i16> %sum, %a |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <8 x i16> @v8i16_addc_2(<8 x i16> %a, <8 x i16> %b) { |
| ; CHECK-LABEL: v8i16_addc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vacch %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <8 x i16> %a, %b |
| %cmp = icmp ult <8 x i16> %sum, %b |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <8 x i16> @v8i16_addc_3(<8 x i16> %a, <8 x i16> %b) { |
| ; CHECK-LABEL: v8i16_addc_3: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vacch %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <8 x i16> %a, %b |
| %cmp = icmp ugt <8 x i16> %a, %sum |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <8 x i16> @v8i16_addc_4(<8 x i16> %a, <8 x i16> %b) { |
| ; CHECK-LABEL: v8i16_addc_4: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vacch %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <8 x i16> %a, %b |
| %cmp = icmp ugt <8 x i16> %b, %sum |
| %ext = zext <8 x i1> %cmp to <8 x i16> |
| ret <8 x i16> %ext |
| } |
| |
| define <4 x i32> @v4i32_subc_1(<4 x i32> %a, <4 x i32> %b) unnamed_addr { |
| ; CHECK-LABEL: v4i32_subc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbif %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp uge <4 x i32> %a, %b |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <4 x i32> @v4i32_subc_2(<4 x i32> %a, <4 x i32> %b) unnamed_addr { |
| ; CHECK-LABEL: v4i32_subc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbif %v24, %v26, %v24 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp ule <4 x i32> %a, %b |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <4 x i32> @v4i32_addc_1(<4 x i32> %a, <4 x i32> %b) { |
| ; CHECK-LABEL: v4i32_addc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccf %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <4 x i32> %a, %b |
| %cmp = icmp ult <4 x i32> %sum, %a |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <4 x i32> @v4i32_addc_2(<4 x i32> %a, <4 x i32> %b) { |
| ; CHECK-LABEL: v4i32_addc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccf %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <4 x i32> %a, %b |
| %cmp = icmp ult <4 x i32> %sum, %b |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <4 x i32> @v4i32_addc_3(<4 x i32> %a, <4 x i32> %b) { |
| ; CHECK-LABEL: v4i32_addc_3: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccf %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <4 x i32> %a, %b |
| %cmp = icmp ugt <4 x i32> %a, %sum |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <4 x i32> @v4i32_addc_4(<4 x i32> %a, <4 x i32> %b) { |
| ; CHECK-LABEL: v4i32_addc_4: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccf %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <4 x i32> %a, %b |
| %cmp = icmp ugt <4 x i32> %b, %sum |
| %ext = zext <4 x i1> %cmp to <4 x i32> |
| ret <4 x i32> %ext |
| } |
| |
| define <2 x i64> @v2i64_subc_1(<2 x i64> %a, <2 x i64> %b) unnamed_addr { |
| ; CHECK-LABEL: v2i64_subc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbig %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp uge <2 x i64> %a, %b |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |
| |
| define <2 x i64> @v2i64_subc_2(<2 x i64> %a, <2 x i64> %b) unnamed_addr { |
| ; CHECK-LABEL: v2i64_subc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vscbig %v24, %v26, %v24 |
| ; CHECK-NEXT: br %r14 |
| %cmp = icmp ule <2 x i64> %a, %b |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |
| |
| define <2 x i64> @v2i64_addc_1(<2 x i64> %a, <2 x i64> %b) { |
| ; CHECK-LABEL: v2i64_addc_1: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccg %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <2 x i64> %a, %b |
| %cmp = icmp ult <2 x i64> %sum, %a |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |
| |
| define <2 x i64> @v2i64_addc_2(<2 x i64> %a, <2 x i64> %b) { |
| ; CHECK-LABEL: v2i64_addc_2: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccg %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <2 x i64> %a, %b |
| %cmp = icmp ult <2 x i64> %sum, %b |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |
| |
| define <2 x i64> @v2i64_addc_3(<2 x i64> %a, <2 x i64> %b) { |
| ; CHECK-LABEL: v2i64_addc_3: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccg %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <2 x i64> %a, %b |
| %cmp = icmp ugt <2 x i64> %a, %sum |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |
| |
| define <2 x i64> @v2i64_addc_4(<2 x i64> %a, <2 x i64> %b) { |
| ; CHECK-LABEL: v2i64_addc_4: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: vaccg %v24, %v24, %v26 |
| ; CHECK-NEXT: br %r14 |
| %sum = add <2 x i64> %a, %b |
| %cmp = icmp ugt <2 x i64> %b, %sum |
| %ext = zext <2 x i1> %cmp to <2 x i64> |
| ret <2 x i64> %ext |
| } |