; CHECK-PWR8: blr
}
+; To verify vabsdu* exploitation for ucmp + sub + select sequence
+
+define <4 x i32> @absd_int32_ugt(<4 x i32>, <4 x i32>) {
+ %3 = icmp ugt <4 x i32> %0, %1
+ %4 = sub <4 x i32> %0, %1
+ %5 = sub <4 x i32> %1, %0
+ %6 = select <4 x i1> %3, <4 x i32> %4, <4 x i32> %5
+ ret <4 x i32> %6
+; CHECK-LABEL: absd_int32_ugt
+; CHECK: vcmpgtuw
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int32_ugt
+; CHECK-PWR8: vcmpgtuw
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <4 x i32> @absd_int32_uge(<4 x i32>, <4 x i32>) {
+ %3 = icmp uge <4 x i32> %0, %1
+ %4 = sub <4 x i32> %0, %1
+ %5 = sub <4 x i32> %1, %0
+ %6 = select <4 x i1> %3, <4 x i32> %4, <4 x i32> %5
+ ret <4 x i32> %6
+; CHECK-LABEL: absd_int32_uge
+; CHECK: vcmpgtuw
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int32_uge
+; CHECK-PWR8: vcmpgtuw
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <4 x i32> @absd_int32_ult(<4 x i32>, <4 x i32>) {
+ %3 = icmp ult <4 x i32> %0, %1
+ %4 = sub <4 x i32> %0, %1
+ %5 = sub <4 x i32> %1, %0
+ %6 = select <4 x i1> %3, <4 x i32> %5, <4 x i32> %4
+ ret <4 x i32> %6
+; CHECK-LABEL: absd_int32_ult
+; CHECK: vcmpgtuw
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int32_ult
+; CHECK-PWR8: vcmpgtuw
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <4 x i32> @absd_int32_ule(<4 x i32>, <4 x i32>) {
+ %3 = icmp ule <4 x i32> %0, %1
+ %4 = sub <4 x i32> %0, %1
+ %5 = sub <4 x i32> %1, %0
+ %6 = select <4 x i1> %3, <4 x i32> %5, <4 x i32> %4
+ ret <4 x i32> %6
+; CHECK-LABEL: absd_int32_ule
+; CHECK: vcmpgtuw
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int32_ule
+; CHECK-PWR8: vcmpgtuw
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <8 x i16> @absd_int16_ugt(<8 x i16>, <8 x i16>) {
+ %3 = icmp ugt <8 x i16> %0, %1
+ %4 = sub <8 x i16> %0, %1
+ %5 = sub <8 x i16> %1, %0
+ %6 = select <8 x i1> %3, <8 x i16> %4, <8 x i16> %5
+ ret <8 x i16> %6
+; CHECK-LABEL: absd_int16_ugt
+; CHECK: vcmpgtuh
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int16_ugt
+; CHECK-PWR8: vcmpgtuh
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <8 x i16> @absd_int16_uge(<8 x i16>, <8 x i16>) {
+ %3 = icmp uge <8 x i16> %0, %1
+ %4 = sub <8 x i16> %0, %1
+ %5 = sub <8 x i16> %1, %0
+ %6 = select <8 x i1> %3, <8 x i16> %4, <8 x i16> %5
+ ret <8 x i16> %6
+; CHECK-LABEL: absd_int16_uge
+; CHECK: vcmpgtuh
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int16_uge
+; CHECK-PWR8: vcmpgtuh
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <8 x i16> @absd_int16_ult(<8 x i16>, <8 x i16>) {
+ %3 = icmp ult <8 x i16> %0, %1
+ %4 = sub <8 x i16> %0, %1
+ %5 = sub <8 x i16> %1, %0
+ %6 = select <8 x i1> %3, <8 x i16> %5, <8 x i16> %4
+ ret <8 x i16> %6
+; CHECK-LABEL: absd_int16_ult
+; CHECK: vcmpgtuh
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int16_ult
+; CHECK-PWR8: vcmpgtuh
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <8 x i16> @absd_int16_ule(<8 x i16>, <8 x i16>) {
+ %3 = icmp ule <8 x i16> %0, %1
+ %4 = sub <8 x i16> %0, %1
+ %5 = sub <8 x i16> %1, %0
+ %6 = select <8 x i1> %3, <8 x i16> %5, <8 x i16> %4
+ ret <8 x i16> %6
+; CHECK-LABEL: absd_int16_ule
+; CHECK: vcmpgtuh
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int16_ule
+; CHECK-PWR8: vcmpgtuh
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <16 x i8> @absd_int8_ugt(<16 x i8>, <16 x i8>) {
+ %3 = icmp ugt <16 x i8> %0, %1
+ %4 = sub <16 x i8> %0, %1
+ %5 = sub <16 x i8> %1, %0
+ %6 = select <16 x i1> %3, <16 x i8> %4, <16 x i8> %5
+ ret <16 x i8> %6
+; CHECK-LABEL: absd_int8_ugt
+; CHECK: vcmpgtub
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int8_ugt
+; CHECK-PWR8: vcmpgtub
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <16 x i8> @absd_int8_uge(<16 x i8>, <16 x i8>) {
+ %3 = icmp uge <16 x i8> %0, %1
+ %4 = sub <16 x i8> %0, %1
+ %5 = sub <16 x i8> %1, %0
+ %6 = select <16 x i1> %3, <16 x i8> %4, <16 x i8> %5
+ ret <16 x i8> %6
+; CHECK-LABEL: absd_int8_uge
+; CHECK: vcmpgtub
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int8_uge
+; CHECK-PWR8: vcmpgtub
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <16 x i8> @absd_int8_ult(<16 x i8>, <16 x i8>) {
+ %3 = icmp ult <16 x i8> %0, %1
+ %4 = sub <16 x i8> %0, %1
+ %5 = sub <16 x i8> %1, %0
+ %6 = select <16 x i1> %3, <16 x i8> %5, <16 x i8> %4
+ ret <16 x i8> %6
+; CHECK-LABEL: absd_int8_ult
+; CHECK: vcmpgtub
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int8_ult
+; CHECK-PWR8: vcmpgtub
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
+define <16 x i8> @absd_int8_ule(<16 x i8>, <16 x i8>) {
+ %3 = icmp ule <16 x i8> %0, %1
+ %4 = sub <16 x i8> %0, %1
+ %5 = sub <16 x i8> %1, %0
+ %6 = select <16 x i1> %3, <16 x i8> %5, <16 x i8> %4
+ ret <16 x i8> %6
+; CHECK-LABEL: absd_int8_ule
+; CHECK: vcmpgtub
+; CHECK: xxsel
+; CHECK: blr
+; CHECK-PWR8-LABEL: absd_int8_ule
+; CHECK-PWR8: vcmpgtub
+; CHECK-PWR8: xxsel
+; CHECK-PWR8: blr
+}
+
declare <4 x i32> @llvm.ppc.altivec.vmaxsw(<4 x i32>, <4 x i32>)
declare <8 x i16> @llvm.ppc.altivec.vmaxsh(<8 x i16>, <8 x i16>)