From 32893f05023880a92132df22fff315abeb241638 Mon Sep 17 00:00:00 2001 From: David Green Date: Mon, 21 Oct 2019 09:53:38 +0000 Subject: [ARM] Lower sadd_sat to qadd8 and qadd16 Lower the target independent signed saturating intrinsics to qadd8 and qadd16. This custom lowers them from a sadd_sat, catching the node early before it is promoted. It also adds a QADD8b and QADD16b node to mean the bottom "lane" of a qadd8/qadd16, so that we can call demand bits on it to show that it does not use the upper bits. Also handles QSUB8 and QSUB16. Differential Revision: https://reviews.llvm.org/D68974 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375402 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/ARM/sadd_sat.ll | 141 +++++++++++++++++++++++++------------- test/CodeGen/ARM/sadd_sat_plus.ll | 38 +++------- test/CodeGen/ARM/ssub_sat.ll | 141 +++++++++++++++++++++++++------------- test/CodeGen/ARM/ssub_sat_plus.ll | 87 +++++++++++------------ 4 files changed, 243 insertions(+), 164 deletions(-) (limited to 'test') diff --git a/test/CodeGen/ARM/sadd_sat.ll b/test/CodeGen/ARM/sadd_sat.ll index 539f3af76d1..1fcc460670e 100644 --- a/test/CodeGen/ARM/sadd_sat.ll +++ b/test/CodeGen/ARM/sadd_sat.ll @@ -233,35 +233,63 @@ define signext i16 @func16(i16 signext %x, i16 signext %y) nounwind { ; CHECK-T1-NEXT: .LCPI2_1: ; CHECK-T1-NEXT: .long 4294934528 @ 0xffff8000 ; -; CHECK-T2-LABEL: func16: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: add r0, r1 -; CHECK-T2-NEXT: movw r1, #32767 -; CHECK-T2-NEXT: cmp r0, r1 -; CHECK-T2-NEXT: it lt -; CHECK-T2-NEXT: movlt r1, r0 -; CHECK-T2-NEXT: movw r0, #32768 -; CHECK-T2-NEXT: cmn.w r1, #32768 -; CHECK-T2-NEXT: movt r0, #65535 -; CHECK-T2-NEXT: it gt -; CHECK-T2-NEXT: movgt r0, r1 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func16: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: add r0, r1 +; CHECK-T2NODSP-NEXT: movw r1, #32767 +; CHECK-T2NODSP-NEXT: cmp r0, r1 +; CHECK-T2NODSP-NEXT: it lt +; CHECK-T2NODSP-NEXT: movlt r1, r0 +; CHECK-T2NODSP-NEXT: movw r0, #32768 +; CHECK-T2NODSP-NEXT: cmn.w r1, #32768 +; CHECK-T2NODSP-NEXT: movt r0, #65535 +; CHECK-T2NODSP-NEXT: it gt +; CHECK-T2NODSP-NEXT: movgt r0, r1 +; CHECK-T2NODSP-NEXT: bx lr ; -; CHECK-ARM-LABEL: func16: -; CHECK-ARM: @ %bb.0: -; CHECK-ARM-NEXT: add r0, r0, r1 -; CHECK-ARM-NEXT: mov r1, #255 -; CHECK-ARM-NEXT: orr r1, r1, #32512 -; CHECK-ARM-NEXT: cmp r0, r1 -; CHECK-ARM-NEXT: movlt r1, r0 -; CHECK-ARM-NEXT: ldr r0, .LCPI2_0 -; CHECK-ARM-NEXT: cmn r1, #32768 -; CHECK-ARM-NEXT: movgt r0, r1 -; CHECK-ARM-NEXT: bx lr -; CHECK-ARM-NEXT: .p2align 2 -; CHECK-ARM-NEXT: @ %bb.1: -; CHECK-ARM-NEXT: .LCPI2_0: -; CHECK-ARM-NEXT: .long 4294934528 @ 0xffff8000 +; CHECK-T2DSP-LABEL: func16: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: qadd16 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxth r0, r0 +; CHECK-T2DSP-NEXT: bx lr +; +; CHECK-ARMNODPS-LABEL: func16: +; CHECK-ARMNODPS: @ %bb.0: +; CHECK-ARMNODPS-NEXT: add r0, r0, r1 +; CHECK-ARMNODPS-NEXT: mov r1, #255 +; CHECK-ARMNODPS-NEXT: orr r1, r1, #32512 +; CHECK-ARMNODPS-NEXT: cmp r0, r1 +; CHECK-ARMNODPS-NEXT: movlt r1, r0 +; CHECK-ARMNODPS-NEXT: ldr r0, .LCPI2_0 +; CHECK-ARMNODPS-NEXT: cmn r1, #32768 +; CHECK-ARMNODPS-NEXT: movgt r0, r1 +; CHECK-ARMNODPS-NEXT: bx lr +; CHECK-ARMNODPS-NEXT: .p2align 2 +; CHECK-ARMNODPS-NEXT: @ %bb.1: +; CHECK-ARMNODPS-NEXT: .LCPI2_0: +; CHECK-ARMNODPS-NEXT: .long 4294934528 @ 0xffff8000 +; +; CHECK-ARMBASEDSP-LABEL: func16: +; CHECK-ARMBASEDSP: @ %bb.0: +; CHECK-ARMBASEDSP-NEXT: add r0, r0, r1 +; CHECK-ARMBASEDSP-NEXT: mov r1, #255 +; CHECK-ARMBASEDSP-NEXT: orr r1, r1, #32512 +; CHECK-ARMBASEDSP-NEXT: cmp r0, r1 +; CHECK-ARMBASEDSP-NEXT: movlt r1, r0 +; CHECK-ARMBASEDSP-NEXT: ldr r0, .LCPI2_0 +; CHECK-ARMBASEDSP-NEXT: cmn r1, #32768 +; CHECK-ARMBASEDSP-NEXT: movgt r0, r1 +; CHECK-ARMBASEDSP-NEXT: bx lr +; CHECK-ARMBASEDSP-NEXT: .p2align 2 +; CHECK-ARMBASEDSP-NEXT: @ %bb.1: +; CHECK-ARMBASEDSP-NEXT: .LCPI2_0: +; CHECK-ARMBASEDSP-NEXT: .long 4294934528 @ 0xffff8000 +; +; CHECK-ARMDSP-LABEL: func16: +; CHECK-ARMDSP: @ %bb.0: +; CHECK-ARMDSP-NEXT: qadd16 r0, r0, r1 +; CHECK-ARMDSP-NEXT: sxth r0, r0 +; CHECK-ARMDSP-NEXT: bx lr %tmp = call i16 @llvm.sadd.sat.i16(i16 %x, i16 %y) ret i16 %tmp } @@ -284,25 +312,46 @@ define signext i8 @func8(i8 signext %x, i8 signext %y) nounwind { ; CHECK-T1-NEXT: .LBB3_4: ; CHECK-T1-NEXT: bx lr ; -; CHECK-T2-LABEL: func8: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: add r0, r1 -; CHECK-T2-NEXT: cmp r0, #127 -; CHECK-T2-NEXT: it ge -; CHECK-T2-NEXT: movge r0, #127 -; CHECK-T2-NEXT: cmn.w r0, #128 -; CHECK-T2-NEXT: it le -; CHECK-T2-NEXT: mvnle r0, #127 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func8: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: add r0, r1 +; CHECK-T2NODSP-NEXT: cmp r0, #127 +; CHECK-T2NODSP-NEXT: it ge +; CHECK-T2NODSP-NEXT: movge r0, #127 +; CHECK-T2NODSP-NEXT: cmn.w r0, #128 +; CHECK-T2NODSP-NEXT: it le +; CHECK-T2NODSP-NEXT: mvnle r0, #127 +; CHECK-T2NODSP-NEXT: bx lr ; -; CHECK-ARM-LABEL: func8: -; CHECK-ARM: @ %bb.0: -; CHECK-ARM-NEXT: add r0, r0, r1 -; CHECK-ARM-NEXT: cmp r0, #127 -; CHECK-ARM-NEXT: movge r0, #127 -; CHECK-ARM-NEXT: cmn r0, #128 -; CHECK-ARM-NEXT: mvnle r0, #127 -; CHECK-ARM-NEXT: bx lr +; CHECK-T2DSP-LABEL: func8: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: qadd8 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxtb r0, r0 +; CHECK-T2DSP-NEXT: bx lr +; +; CHECK-ARMNODPS-LABEL: func8: +; CHECK-ARMNODPS: @ %bb.0: +; CHECK-ARMNODPS-NEXT: add r0, r0, r1 +; CHECK-ARMNODPS-NEXT: cmp r0, #127 +; CHECK-ARMNODPS-NEXT: movge r0, #127 +; CHECK-ARMNODPS-NEXT: cmn r0, #128 +; CHECK-ARMNODPS-NEXT: mvnle r0, #127 +; CHECK-ARMNODPS-NEXT: bx lr +; +; CHECK-ARMBASEDSP-LABEL: func8: +; CHECK-ARMBASEDSP: @ %bb.0: +; CHECK-ARMBASEDSP-NEXT: add r0, r0, r1 +; CHECK-ARMBASEDSP-NEXT: cmp r0, #127 +; CHECK-ARMBASEDSP-NEXT: movge r0, #127 +; CHECK-ARMBASEDSP-NEXT: cmn r0, #128 +; CHECK-ARMBASEDSP-NEXT: mvnle r0, #127 +; CHECK-ARMBASEDSP-NEXT: bx lr +; +; CHECK-ARMDSP-LABEL: func8: +; CHECK-ARMDSP: @ %bb.0: +; CHECK-ARMDSP-NEXT: qadd8 r0, r0, r1 +; CHECK-ARMDSP-NEXT: sxtb r0, r0 +; CHECK-ARMDSP-NEXT: bx lr %tmp = call i8 @llvm.sadd.sat.i8(i8 %x, i8 %y) ret i8 %tmp } diff --git a/test/CodeGen/ARM/sadd_sat_plus.ll b/test/CodeGen/ARM/sadd_sat_plus.ll index 94aca12a78b..370d5d989a8 100644 --- a/test/CodeGen/ARM/sadd_sat_plus.ll +++ b/test/CodeGen/ARM/sadd_sat_plus.ll @@ -258,29 +258,15 @@ define signext i16 @func16(i16 signext %x, i16 signext %y, i16 signext %z) nounw ; CHECK-T2DSP-LABEL: func16: ; CHECK-T2DSP: @ %bb.0: ; CHECK-T2DSP-NEXT: muls r1, r2, r1 -; CHECK-T2DSP-NEXT: sxtah r0, r0, r1 -; CHECK-T2DSP-NEXT: movw r1, #32767 -; CHECK-T2DSP-NEXT: cmp r0, r1 -; CHECK-T2DSP-NEXT: it lt -; CHECK-T2DSP-NEXT: movlt r1, r0 -; CHECK-T2DSP-NEXT: movw r0, #32768 -; CHECK-T2DSP-NEXT: cmn.w r1, #32768 -; CHECK-T2DSP-NEXT: movt r0, #65535 -; CHECK-T2DSP-NEXT: it gt -; CHECK-T2DSP-NEXT: movgt r0, r1 +; CHECK-T2DSP-NEXT: qadd16 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxth r0, r0 ; CHECK-T2DSP-NEXT: bx lr ; ; CHECK-ARM-LABEL: func16: ; CHECK-ARM: @ %bb.0: ; CHECK-ARM-NEXT: smulbb r1, r1, r2 -; CHECK-ARM-NEXT: sxtah r0, r0, r1 -; CHECK-ARM-NEXT: movw r1, #32767 -; CHECK-ARM-NEXT: cmp r0, r1 -; CHECK-ARM-NEXT: movlt r1, r0 -; CHECK-ARM-NEXT: movw r0, #32768 -; CHECK-ARM-NEXT: movt r0, #65535 -; CHECK-ARM-NEXT: cmn r1, #32768 -; CHECK-ARM-NEXT: movgt r0, r1 +; CHECK-ARM-NEXT: qadd16 r0, r0, r1 +; CHECK-ARM-NEXT: sxth r0, r0 ; CHECK-ARM-NEXT: bx lr %a = mul i16 %y, %z %tmp = call i16 @llvm.sadd.sat.i16(i16 %x, i16 %a) @@ -323,23 +309,15 @@ define signext i8 @func8(i8 signext %x, i8 signext %y, i8 signext %z) nounwind { ; CHECK-T2DSP-LABEL: func8: ; CHECK-T2DSP: @ %bb.0: ; CHECK-T2DSP-NEXT: muls r1, r2, r1 -; CHECK-T2DSP-NEXT: sxtab r0, r0, r1 -; CHECK-T2DSP-NEXT: cmp r0, #127 -; CHECK-T2DSP-NEXT: it ge -; CHECK-T2DSP-NEXT: movge r0, #127 -; CHECK-T2DSP-NEXT: cmn.w r0, #128 -; CHECK-T2DSP-NEXT: it le -; CHECK-T2DSP-NEXT: mvnle r0, #127 +; CHECK-T2DSP-NEXT: qadd8 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxtb r0, r0 ; CHECK-T2DSP-NEXT: bx lr ; ; CHECK-ARM-LABEL: func8: ; CHECK-ARM: @ %bb.0: ; CHECK-ARM-NEXT: smulbb r1, r1, r2 -; CHECK-ARM-NEXT: sxtab r0, r0, r1 -; CHECK-ARM-NEXT: cmp r0, #127 -; CHECK-ARM-NEXT: movge r0, #127 -; CHECK-ARM-NEXT: cmn r0, #128 -; CHECK-ARM-NEXT: mvnle r0, #127 +; CHECK-ARM-NEXT: qadd8 r0, r0, r1 +; CHECK-ARM-NEXT: sxtb r0, r0 ; CHECK-ARM-NEXT: bx lr %a = mul i8 %y, %z %tmp = call i8 @llvm.sadd.sat.i8(i8 %x, i8 %a) diff --git a/test/CodeGen/ARM/ssub_sat.ll b/test/CodeGen/ARM/ssub_sat.ll index 6efb34df7b0..0c9e125316c 100644 --- a/test/CodeGen/ARM/ssub_sat.ll +++ b/test/CodeGen/ARM/ssub_sat.ll @@ -235,35 +235,63 @@ define signext i16 @func16(i16 signext %x, i16 signext %y) nounwind { ; CHECK-T1-NEXT: .LCPI2_1: ; CHECK-T1-NEXT: .long 4294934528 @ 0xffff8000 ; -; CHECK-T2-LABEL: func16: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: subs r0, r0, r1 -; CHECK-T2-NEXT: movw r1, #32767 -; CHECK-T2-NEXT: cmp r0, r1 -; CHECK-T2-NEXT: it lt -; CHECK-T2-NEXT: movlt r1, r0 -; CHECK-T2-NEXT: movw r0, #32768 -; CHECK-T2-NEXT: cmn.w r1, #32768 -; CHECK-T2-NEXT: movt r0, #65535 -; CHECK-T2-NEXT: it gt -; CHECK-T2-NEXT: movgt r0, r1 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func16: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: subs r0, r0, r1 +; CHECK-T2NODSP-NEXT: movw r1, #32767 +; CHECK-T2NODSP-NEXT: cmp r0, r1 +; CHECK-T2NODSP-NEXT: it lt +; CHECK-T2NODSP-NEXT: movlt r1, r0 +; CHECK-T2NODSP-NEXT: movw r0, #32768 +; CHECK-T2NODSP-NEXT: cmn.w r1, #32768 +; CHECK-T2NODSP-NEXT: movt r0, #65535 +; CHECK-T2NODSP-NEXT: it gt +; CHECK-T2NODSP-NEXT: movgt r0, r1 +; CHECK-T2NODSP-NEXT: bx lr ; -; CHECK-ARM-LABEL: func16: -; CHECK-ARM: @ %bb.0: -; CHECK-ARM-NEXT: sub r0, r0, r1 -; CHECK-ARM-NEXT: mov r1, #255 -; CHECK-ARM-NEXT: orr r1, r1, #32512 -; CHECK-ARM-NEXT: cmp r0, r1 -; CHECK-ARM-NEXT: movlt r1, r0 -; CHECK-ARM-NEXT: ldr r0, .LCPI2_0 -; CHECK-ARM-NEXT: cmn r1, #32768 -; CHECK-ARM-NEXT: movgt r0, r1 -; CHECK-ARM-NEXT: bx lr -; CHECK-ARM-NEXT: .p2align 2 -; CHECK-ARM-NEXT: @ %bb.1: -; CHECK-ARM-NEXT: .LCPI2_0: -; CHECK-ARM-NEXT: .long 4294934528 @ 0xffff8000 +; CHECK-T2DSP-LABEL: func16: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: qsub16 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxth r0, r0 +; CHECK-T2DSP-NEXT: bx lr +; +; CHECK-ARMNODPS-LABEL: func16: +; CHECK-ARMNODPS: @ %bb.0: +; CHECK-ARMNODPS-NEXT: sub r0, r0, r1 +; CHECK-ARMNODPS-NEXT: mov r1, #255 +; CHECK-ARMNODPS-NEXT: orr r1, r1, #32512 +; CHECK-ARMNODPS-NEXT: cmp r0, r1 +; CHECK-ARMNODPS-NEXT: movlt r1, r0 +; CHECK-ARMNODPS-NEXT: ldr r0, .LCPI2_0 +; CHECK-ARMNODPS-NEXT: cmn r1, #32768 +; CHECK-ARMNODPS-NEXT: movgt r0, r1 +; CHECK-ARMNODPS-NEXT: bx lr +; CHECK-ARMNODPS-NEXT: .p2align 2 +; CHECK-ARMNODPS-NEXT: @ %bb.1: +; CHECK-ARMNODPS-NEXT: .LCPI2_0: +; CHECK-ARMNODPS-NEXT: .long 4294934528 @ 0xffff8000 +; +; CHECK-ARMBASEDSP-LABEL: func16: +; CHECK-ARMBASEDSP: @ %bb.0: +; CHECK-ARMBASEDSP-NEXT: sub r0, r0, r1 +; CHECK-ARMBASEDSP-NEXT: mov r1, #255 +; CHECK-ARMBASEDSP-NEXT: orr r1, r1, #32512 +; CHECK-ARMBASEDSP-NEXT: cmp r0, r1 +; CHECK-ARMBASEDSP-NEXT: movlt r1, r0 +; CHECK-ARMBASEDSP-NEXT: ldr r0, .LCPI2_0 +; CHECK-ARMBASEDSP-NEXT: cmn r1, #32768 +; CHECK-ARMBASEDSP-NEXT: movgt r0, r1 +; CHECK-ARMBASEDSP-NEXT: bx lr +; CHECK-ARMBASEDSP-NEXT: .p2align 2 +; CHECK-ARMBASEDSP-NEXT: @ %bb.1: +; CHECK-ARMBASEDSP-NEXT: .LCPI2_0: +; CHECK-ARMBASEDSP-NEXT: .long 4294934528 @ 0xffff8000 +; +; CHECK-ARMDSP-LABEL: func16: +; CHECK-ARMDSP: @ %bb.0: +; CHECK-ARMDSP-NEXT: qsub16 r0, r0, r1 +; CHECK-ARMDSP-NEXT: sxth r0, r0 +; CHECK-ARMDSP-NEXT: bx lr %tmp = call i16 @llvm.ssub.sat.i16(i16 %x, i16 %y) ret i16 %tmp } @@ -286,25 +314,46 @@ define signext i8 @func8(i8 signext %x, i8 signext %y) nounwind { ; CHECK-T1-NEXT: .LBB3_4: ; CHECK-T1-NEXT: bx lr ; -; CHECK-T2-LABEL: func8: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: subs r0, r0, r1 -; CHECK-T2-NEXT: cmp r0, #127 -; CHECK-T2-NEXT: it ge -; CHECK-T2-NEXT: movge r0, #127 -; CHECK-T2-NEXT: cmn.w r0, #128 -; CHECK-T2-NEXT: it le -; CHECK-T2-NEXT: mvnle r0, #127 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func8: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: subs r0, r0, r1 +; CHECK-T2NODSP-NEXT: cmp r0, #127 +; CHECK-T2NODSP-NEXT: it ge +; CHECK-T2NODSP-NEXT: movge r0, #127 +; CHECK-T2NODSP-NEXT: cmn.w r0, #128 +; CHECK-T2NODSP-NEXT: it le +; CHECK-T2NODSP-NEXT: mvnle r0, #127 +; CHECK-T2NODSP-NEXT: bx lr ; -; CHECK-ARM-LABEL: func8: -; CHECK-ARM: @ %bb.0: -; CHECK-ARM-NEXT: sub r0, r0, r1 -; CHECK-ARM-NEXT: cmp r0, #127 -; CHECK-ARM-NEXT: movge r0, #127 -; CHECK-ARM-NEXT: cmn r0, #128 -; CHECK-ARM-NEXT: mvnle r0, #127 -; CHECK-ARM-NEXT: bx lr +; CHECK-T2DSP-LABEL: func8: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: qsub8 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxtb r0, r0 +; CHECK-T2DSP-NEXT: bx lr +; +; CHECK-ARMNODPS-LABEL: func8: +; CHECK-ARMNODPS: @ %bb.0: +; CHECK-ARMNODPS-NEXT: sub r0, r0, r1 +; CHECK-ARMNODPS-NEXT: cmp r0, #127 +; CHECK-ARMNODPS-NEXT: movge r0, #127 +; CHECK-ARMNODPS-NEXT: cmn r0, #128 +; CHECK-ARMNODPS-NEXT: mvnle r0, #127 +; CHECK-ARMNODPS-NEXT: bx lr +; +; CHECK-ARMBASEDSP-LABEL: func8: +; CHECK-ARMBASEDSP: @ %bb.0: +; CHECK-ARMBASEDSP-NEXT: sub r0, r0, r1 +; CHECK-ARMBASEDSP-NEXT: cmp r0, #127 +; CHECK-ARMBASEDSP-NEXT: movge r0, #127 +; CHECK-ARMBASEDSP-NEXT: cmn r0, #128 +; CHECK-ARMBASEDSP-NEXT: mvnle r0, #127 +; CHECK-ARMBASEDSP-NEXT: bx lr +; +; CHECK-ARMDSP-LABEL: func8: +; CHECK-ARMDSP: @ %bb.0: +; CHECK-ARMDSP-NEXT: qsub8 r0, r0, r1 +; CHECK-ARMDSP-NEXT: sxtb r0, r0 +; CHECK-ARMDSP-NEXT: bx lr %tmp = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) ret i8 %tmp } diff --git a/test/CodeGen/ARM/ssub_sat_plus.ll b/test/CodeGen/ARM/ssub_sat_plus.ll index 9a598408d9e..02a0de24f1e 100644 --- a/test/CodeGen/ARM/ssub_sat_plus.ll +++ b/test/CodeGen/ARM/ssub_sat_plus.ll @@ -245,34 +245,34 @@ define signext i16 @func16(i16 signext %x, i16 signext %y, i16 signext %z) nounw ; CHECK-T1-NEXT: .LCPI2_1: ; CHECK-T1-NEXT: .long 4294934528 @ 0xffff8000 ; -; CHECK-T2-LABEL: func16: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: muls r1, r2, r1 -; CHECK-T2-NEXT: sxth r1, r1 -; CHECK-T2-NEXT: subs r0, r0, r1 -; CHECK-T2-NEXT: movw r1, #32767 -; CHECK-T2-NEXT: cmp r0, r1 -; CHECK-T2-NEXT: it lt -; CHECK-T2-NEXT: movlt r1, r0 -; CHECK-T2-NEXT: movw r0, #32768 -; CHECK-T2-NEXT: movt r0, #65535 -; CHECK-T2-NEXT: cmn.w r1, #32768 -; CHECK-T2-NEXT: it gt -; CHECK-T2-NEXT: movgt r0, r1 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func16: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: muls r1, r2, r1 +; CHECK-T2NODSP-NEXT: sxth r1, r1 +; CHECK-T2NODSP-NEXT: subs r0, r0, r1 +; CHECK-T2NODSP-NEXT: movw r1, #32767 +; CHECK-T2NODSP-NEXT: cmp r0, r1 +; CHECK-T2NODSP-NEXT: it lt +; CHECK-T2NODSP-NEXT: movlt r1, r0 +; CHECK-T2NODSP-NEXT: movw r0, #32768 +; CHECK-T2NODSP-NEXT: movt r0, #65535 +; CHECK-T2NODSP-NEXT: cmn.w r1, #32768 +; CHECK-T2NODSP-NEXT: it gt +; CHECK-T2NODSP-NEXT: movgt r0, r1 +; CHECK-T2NODSP-NEXT: bx lr +; +; CHECK-T2DSP-LABEL: func16: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: muls r1, r2, r1 +; CHECK-T2DSP-NEXT: qsub16 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxth r0, r0 +; CHECK-T2DSP-NEXT: bx lr ; ; CHECK-ARM-LABEL: func16: ; CHECK-ARM: @ %bb.0: ; CHECK-ARM-NEXT: smulbb r1, r1, r2 -; CHECK-ARM-NEXT: sxth r1, r1 -; CHECK-ARM-NEXT: sub r0, r0, r1 -; CHECK-ARM-NEXT: movw r1, #32767 -; CHECK-ARM-NEXT: cmp r0, r1 -; CHECK-ARM-NEXT: movlt r1, r0 -; CHECK-ARM-NEXT: movw r0, #32768 -; CHECK-ARM-NEXT: movt r0, #65535 -; CHECK-ARM-NEXT: cmn r1, #32768 -; CHECK-ARM-NEXT: movgt r0, r1 +; CHECK-ARM-NEXT: qsub16 r0, r0, r1 +; CHECK-ARM-NEXT: sxth r0, r0 ; CHECK-ARM-NEXT: bx lr %a = mul i16 %y, %z %tmp = call i16 @llvm.ssub.sat.i16(i16 %x, i16 %a) @@ -299,28 +299,31 @@ define signext i8 @func8(i8 signext %x, i8 signext %y, i8 signext %z) nounwind { ; CHECK-T1-NEXT: .LBB3_4: ; CHECK-T1-NEXT: bx lr ; -; CHECK-T2-LABEL: func8: -; CHECK-T2: @ %bb.0: -; CHECK-T2-NEXT: muls r1, r2, r1 -; CHECK-T2-NEXT: sxtb r1, r1 -; CHECK-T2-NEXT: subs r0, r0, r1 -; CHECK-T2-NEXT: cmp r0, #127 -; CHECK-T2-NEXT: it ge -; CHECK-T2-NEXT: movge r0, #127 -; CHECK-T2-NEXT: cmn.w r0, #128 -; CHECK-T2-NEXT: it le -; CHECK-T2-NEXT: mvnle r0, #127 -; CHECK-T2-NEXT: bx lr +; CHECK-T2NODSP-LABEL: func8: +; CHECK-T2NODSP: @ %bb.0: +; CHECK-T2NODSP-NEXT: muls r1, r2, r1 +; CHECK-T2NODSP-NEXT: sxtb r1, r1 +; CHECK-T2NODSP-NEXT: subs r0, r0, r1 +; CHECK-T2NODSP-NEXT: cmp r0, #127 +; CHECK-T2NODSP-NEXT: it ge +; CHECK-T2NODSP-NEXT: movge r0, #127 +; CHECK-T2NODSP-NEXT: cmn.w r0, #128 +; CHECK-T2NODSP-NEXT: it le +; CHECK-T2NODSP-NEXT: mvnle r0, #127 +; CHECK-T2NODSP-NEXT: bx lr +; +; CHECK-T2DSP-LABEL: func8: +; CHECK-T2DSP: @ %bb.0: +; CHECK-T2DSP-NEXT: muls r1, r2, r1 +; CHECK-T2DSP-NEXT: qsub8 r0, r0, r1 +; CHECK-T2DSP-NEXT: sxtb r0, r0 +; CHECK-T2DSP-NEXT: bx lr ; ; CHECK-ARM-LABEL: func8: ; CHECK-ARM: @ %bb.0: ; CHECK-ARM-NEXT: smulbb r1, r1, r2 -; CHECK-ARM-NEXT: sxtb r1, r1 -; CHECK-ARM-NEXT: sub r0, r0, r1 -; CHECK-ARM-NEXT: cmp r0, #127 -; CHECK-ARM-NEXT: movge r0, #127 -; CHECK-ARM-NEXT: cmn r0, #128 -; CHECK-ARM-NEXT: mvnle r0, #127 +; CHECK-ARM-NEXT: qsub8 r0, r0, r1 +; CHECK-ARM-NEXT: sxtb r0, r0 ; CHECK-ARM-NEXT: bx lr %a = mul i8 %y, %z %tmp = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %a) -- cgit v1.2.3