| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s |
| ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s |
| ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE |
| |
| target triple = "aarch64-unknown-linux-gnu" |
| |
| define void @uabd_v16i8_v16i16(ptr %a, ptr %b) { |
| ; CHECK-LABEL: uabd_v16i8_v16i16: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: ptrue p0.b, vl16 |
| ; CHECK-NEXT: ldr q0, [x0] |
| ; CHECK-NEXT: ldr q1, [x1] |
| ; CHECK-NEXT: uabd z0.b, p0/m, z0.b, z1.b |
| ; CHECK-NEXT: str q0, [x0] |
| ; CHECK-NEXT: ret |
| ; |
| ; NONEON-NOSVE-LABEL: uabd_v16i8_v16i16: |
| ; NONEON-NOSVE: // %bb.0: |
| ; NONEON-NOSVE-NEXT: ldr q0, [x1] |
| ; NONEON-NOSVE-NEXT: ldr q1, [x0] |
| ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! |
| ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #47] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #46] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #45] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #44] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #43] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #42] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #41] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #40] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #39] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #38] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #37] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #36] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #35] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #34] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrb w9, [sp] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #33] |
| ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, hi |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #32] |
| ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] |
| ; NONEON-NOSVE-NEXT: str q0, [x0] |
| ; NONEON-NOSVE-NEXT: add sp, sp, #48 |
| ; NONEON-NOSVE-NEXT: ret |
| %a.ld = load <16 x i8>, ptr %a |
| %b.ld = load <16 x i8>, ptr %b |
| %a.sext = zext <16 x i8> %a.ld to <16 x i16> |
| %b.sext = zext <16 x i8> %b.ld to <16 x i16> |
| %sub = sub <16 x i16> %a.sext, %b.sext |
| %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true) |
| %trunc = trunc <16 x i16> %abs to <16 x i8> |
| store <16 x i8> %trunc, ptr %a |
| ret void |
| } |
| |
| define void @sabd_v16i8_v16i16(ptr %a, ptr %b) { |
| ; CHECK-LABEL: sabd_v16i8_v16i16: |
| ; CHECK: // %bb.0: |
| ; CHECK-NEXT: ptrue p0.b, vl16 |
| ; CHECK-NEXT: ldr q0, [x0] |
| ; CHECK-NEXT: ldr q1, [x1] |
| ; CHECK-NEXT: sabd z0.b, p0/m, z0.b, z1.b |
| ; CHECK-NEXT: str q0, [x0] |
| ; CHECK-NEXT: ret |
| ; |
| ; NONEON-NOSVE-LABEL: sabd_v16i8_v16i16: |
| ; NONEON-NOSVE: // %bb.0: |
| ; NONEON-NOSVE-NEXT: ldr q0, [x1] |
| ; NONEON-NOSVE-NEXT: ldr q1, [x0] |
| ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! |
| ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #47] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #46] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #45] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #44] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #43] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #42] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #41] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #7] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #40] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #6] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #39] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #5] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #38] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #37] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #3] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #36] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #2] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #35] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #1] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #34] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: ldrsb w9, [sp] |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #33] |
| ; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] |
| ; NONEON-NOSVE-NEXT: subs w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: csetm w9, gt |
| ; NONEON-NOSVE-NEXT: eor w8, w8, w9 |
| ; NONEON-NOSVE-NEXT: sub w8, w9, w8 |
| ; NONEON-NOSVE-NEXT: strb w8, [sp, #32] |
| ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] |
| ; NONEON-NOSVE-NEXT: str q0, [x0] |
| ; NONEON-NOSVE-NEXT: add sp, sp, #48 |
| ; NONEON-NOSVE-NEXT: ret |
| %a.ld = load <16 x i8>, ptr %a |
| %b.ld = load <16 x i8>, ptr %b |
| %a.sext = sext <16 x i8> %a.ld to <16 x i16> |
| %b.sext = sext <16 x i8> %b.ld to <16 x i16> |
| %sub = sub <16 x i16> %a.sext, %b.sext |
| %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true) |
| %trunc = trunc <16 x i16> %abs to <16 x i8> |
| store <16 x i8> %trunc, ptr %a |
| ret void |
| } |