A 'CMOV 1, 0, CC, %cpsr, Cmp' is the same as a 'CSINC 0, 0, CC, Cmp', and can be treated the same in IsCMPZCSINC added in D114013. This allows us to remove the unnecessary CMOV in the same way that we could remove a CSINC. Differential Revision: https://reviews.llvm.org/D115188
590 lines
18 KiB
LLVM
590 lines
18 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s
|
|
|
|
define arm_aapcs_vfpcc <4 x i32> @sext_v4i1_v4i32(<4 x i32> %src) {
|
|
; CHECK-LABEL: sext_v4i1_v4i32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.i8 q2, #0xff
|
|
; CHECK-NEXT: vcmp.s32 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <4 x i32> %src, zeroinitializer
|
|
%0 = sext <4 x i1> %c to <4 x i32>
|
|
ret <4 x i32> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <4 x i32> @sext_v4i1_v4f32(<4 x float> %src1, <4 x float> %src2) {
|
|
; CHECK-LABEL: sext_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q2, #0x0
|
|
; CHECK-NEXT: vmov.i8 q3, #0xff
|
|
; CHECK-NEXT: vcmp.f32 ne, q0, q1
|
|
; CHECK-NEXT: vpsel q0, q3, q2
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = fcmp une <4 x float> %src1, %src2
|
|
%0 = sext <4 x i1> %c to <4 x i32>
|
|
ret <4 x i32> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x i16> @sext_v8i1_v8i16(<8 x i16> %src) {
|
|
; CHECK-LABEL: sext_v8i1_v8i16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q1, #0x0
|
|
; CHECK-NEXT: vmov.i8 q2, #0xff
|
|
; CHECK-NEXT: vcmp.s16 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <8 x i16> %src, zeroinitializer
|
|
%0 = sext <8 x i1> %c to <8 x i16>
|
|
ret <8 x i16> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x i16> @sext_v8i1_v8f32(<8 x half> %src1, <8 x half> %src2) {
|
|
; CHECK-LABEL: sext_v8i1_v8f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q2, #0x0
|
|
; CHECK-NEXT: vmov.i8 q3, #0xff
|
|
; CHECK-NEXT: vcmp.f16 ne, q0, q1
|
|
; CHECK-NEXT: vpsel q0, q3, q2
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = fcmp une <8 x half> %src1, %src2
|
|
%0 = sext <8 x i1> %c to <8 x i16>
|
|
ret <8 x i16> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <16 x i8> @sext_v16i1_v16i8(<16 x i8> %src) {
|
|
; CHECK-LABEL: sext_v16i1_v16i8:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i8 q1, #0x0
|
|
; CHECK-NEXT: vmov.i8 q2, #0xff
|
|
; CHECK-NEXT: vcmp.s8 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <16 x i8> %src, zeroinitializer
|
|
%0 = sext <16 x i1> %c to <16 x i8>
|
|
ret <16 x i8> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x i64> @sext_v2i1_v2i64(<2 x i64> %src) {
|
|
; CHECK-LABEL: sext_v2i1_v2i64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov r0, r1, d1
|
|
; CHECK-NEXT: mov.w r12, #0
|
|
; CHECK-NEXT: vmov r2, r3, d0
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: sbcs.w r0, r12, r1
|
|
; CHECK-NEXT: csetm r0, lt
|
|
; CHECK-NEXT: rsbs r1, r2, #0
|
|
; CHECK-NEXT: sbcs.w r1, r12, r3
|
|
; CHECK-NEXT: csetm r1, lt
|
|
; CHECK-NEXT: vmov q0[2], q0[0], r1, r0
|
|
; CHECK-NEXT: vmov q0[3], q0[1], r1, r0
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <2 x i64> %src, zeroinitializer
|
|
%0 = sext <2 x i1> %c to <2 x i64>
|
|
ret <2 x i64> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x i64> @sext_v2i1_v2f64(<2 x double> %src) {
|
|
; CHECK-LABEL: sext_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, r5, r6, lr}
|
|
; CHECK-NEXT: push {r4, r5, r6, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9}
|
|
; CHECK-NEXT: vpush {d8, d9}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: vldr d0, .LCPI6_0
|
|
; CHECK-NEXT: vmov r0, r1, d9
|
|
; CHECK-NEXT: vmov r4, r5, d0
|
|
; CHECK-NEXT: mov r2, r4
|
|
; CHECK-NEXT: mov r3, r5
|
|
; CHECK-NEXT: bl __aeabi_dcmpeq
|
|
; CHECK-NEXT: mov r6, r0
|
|
; CHECK-NEXT: vmov r0, r1, d8
|
|
; CHECK-NEXT: mov r2, r4
|
|
; CHECK-NEXT: mov r3, r5
|
|
; CHECK-NEXT: bl __aeabi_dcmpeq
|
|
; CHECK-NEXT: cmp r6, #0
|
|
; CHECK-NEXT: csetm r1, eq
|
|
; CHECK-NEXT: cmp r0, #0
|
|
; CHECK-NEXT: csetm r0, eq
|
|
; CHECK-NEXT: vmov q0[2], q0[0], r0, r1
|
|
; CHECK-NEXT: vmov q0[3], q0[1], r0, r1
|
|
; CHECK-NEXT: vpop {d8, d9}
|
|
; CHECK-NEXT: pop {r4, r5, r6, pc}
|
|
; CHECK-NEXT: .p2align 3
|
|
; CHECK-NEXT: @ %bb.1:
|
|
; CHECK-NEXT: .LCPI6_0:
|
|
; CHECK-NEXT: .long 0 @ double 0
|
|
; CHECK-NEXT: .long 0
|
|
entry:
|
|
%c = fcmp une <2 x double> %src, zeroinitializer
|
|
%0 = sext <2 x i1> %c to <2 x i64>
|
|
ret <2 x i64> %0
|
|
}
|
|
|
|
|
|
define arm_aapcs_vfpcc <4 x i32> @zext_v4i1_v4i32(<4 x i32> %src) {
|
|
; CHECK-LABEL: zext_v4i1_v4i32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.i32 q2, #0x1
|
|
; CHECK-NEXT: vcmp.s32 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <4 x i32> %src, zeroinitializer
|
|
%0 = zext <4 x i1> %c to <4 x i32>
|
|
ret <4 x i32> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <4 x i32> @zext_v4i1_v4f32(<4 x float> %src1, <4 x float> %src2) {
|
|
; CHECK-LABEL: zext_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q2, #0x0
|
|
; CHECK-NEXT: vmov.i32 q3, #0x1
|
|
; CHECK-NEXT: vcmp.f32 ne, q0, q1
|
|
; CHECK-NEXT: vpsel q0, q3, q2
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = fcmp une <4 x float> %src1, %src2
|
|
%0 = zext <4 x i1> %c to <4 x i32>
|
|
ret <4 x i32> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x i16> @zext_v8i1_v8i16(<8 x i16> %src) {
|
|
; CHECK-LABEL: zext_v8i1_v8i16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q1, #0x0
|
|
; CHECK-NEXT: vmov.i16 q2, #0x1
|
|
; CHECK-NEXT: vcmp.s16 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <8 x i16> %src, zeroinitializer
|
|
%0 = zext <8 x i1> %c to <8 x i16>
|
|
ret <8 x i16> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x i16> @zext_v8i1_v8f32(<8 x half> %src1, <8 x half> %src2) {
|
|
; CHECK-LABEL: zext_v8i1_v8f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q2, #0x0
|
|
; CHECK-NEXT: vmov.i16 q3, #0x1
|
|
; CHECK-NEXT: vcmp.f16 ne, q0, q1
|
|
; CHECK-NEXT: vpsel q0, q3, q2
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = fcmp une <8 x half> %src1, %src2
|
|
%0 = zext <8 x i1> %c to <8 x i16>
|
|
ret <8 x i16> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <16 x i8> @zext_v16i1_v16i8(<16 x i8> %src) {
|
|
; CHECK-LABEL: zext_v16i1_v16i8:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i8 q1, #0x0
|
|
; CHECK-NEXT: vmov.i8 q2, #0x1
|
|
; CHECK-NEXT: vcmp.s8 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <16 x i8> %src, zeroinitializer
|
|
%0 = zext <16 x i1> %c to <16 x i8>
|
|
ret <16 x i8> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x i64> @zext_v2i1_v2i64(<2 x i64> %src) {
|
|
; CHECK-LABEL: zext_v2i1_v2i64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov r0, r1, d1
|
|
; CHECK-NEXT: mov.w r12, #0
|
|
; CHECK-NEXT: vmov r2, r3, d0
|
|
; CHECK-NEXT: vldr s1, .LCPI12_0
|
|
; CHECK-NEXT: vmov.f32 s3, s1
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: sbcs.w r0, r12, r1
|
|
; CHECK-NEXT: cset r0, lt
|
|
; CHECK-NEXT: rsbs r1, r2, #0
|
|
; CHECK-NEXT: sbcs.w r1, r12, r3
|
|
; CHECK-NEXT: vmov s2, r0
|
|
; CHECK-NEXT: cset r0, lt
|
|
; CHECK-NEXT: vmov s0, r0
|
|
; CHECK-NEXT: bx lr
|
|
; CHECK-NEXT: .p2align 2
|
|
; CHECK-NEXT: @ %bb.1:
|
|
; CHECK-NEXT: .LCPI12_0:
|
|
; CHECK-NEXT: .long 0x00000000 @ float 0
|
|
entry:
|
|
%c = icmp sgt <2 x i64> %src, zeroinitializer
|
|
%0 = zext <2 x i1> %c to <2 x i64>
|
|
ret <2 x i64> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x i64> @zext_v2i1_v2f64(<2 x double> %src) {
|
|
; CHECK-LABEL: zext_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, r5, r6, lr}
|
|
; CHECK-NEXT: push {r4, r5, r6, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9}
|
|
; CHECK-NEXT: vpush {d8, d9}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: vldr d0, .LCPI13_0
|
|
; CHECK-NEXT: vmov r0, r1, d8
|
|
; CHECK-NEXT: vmov r4, r5, d0
|
|
; CHECK-NEXT: mov r2, r4
|
|
; CHECK-NEXT: mov r3, r5
|
|
; CHECK-NEXT: bl __aeabi_dcmpeq
|
|
; CHECK-NEXT: mov r6, r0
|
|
; CHECK-NEXT: vmov r0, r1, d9
|
|
; CHECK-NEXT: mov r2, r4
|
|
; CHECK-NEXT: mov r3, r5
|
|
; CHECK-NEXT: bl __aeabi_dcmpeq
|
|
; CHECK-NEXT: cmp r0, #0
|
|
; CHECK-NEXT: vldr s1, .LCPI13_1
|
|
; CHECK-NEXT: cset r0, eq
|
|
; CHECK-NEXT: cmp r6, #0
|
|
; CHECK-NEXT: vmov s2, r0
|
|
; CHECK-NEXT: cset r0, eq
|
|
; CHECK-NEXT: vmov s0, r0
|
|
; CHECK-NEXT: vmov.f32 s3, s1
|
|
; CHECK-NEXT: vpop {d8, d9}
|
|
; CHECK-NEXT: pop {r4, r5, r6, pc}
|
|
; CHECK-NEXT: .p2align 3
|
|
; CHECK-NEXT: @ %bb.1:
|
|
; CHECK-NEXT: .LCPI13_0:
|
|
; CHECK-NEXT: .long 0 @ double 0
|
|
; CHECK-NEXT: .long 0
|
|
; CHECK-NEXT: .LCPI13_1:
|
|
; CHECK-NEXT: .long 0x00000000 @ float 0
|
|
entry:
|
|
%c = fcmp une <2 x double> %src, zeroinitializer
|
|
%0 = zext <2 x i1> %c to <2 x i64>
|
|
ret <2 x i64> %0
|
|
}
|
|
|
|
|
|
define arm_aapcs_vfpcc <4 x i32> @trunc_v4i1_v4i32(<4 x i32> %src) {
|
|
; CHECK-LABEL: trunc_v4i1_v4i32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q2, #0x1
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vand q2, q0, q2
|
|
; CHECK-NEXT: vcmp.i32 ne, q2, zr
|
|
; CHECK-NEXT: vpsel q0, q0, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = trunc <4 x i32> %src to <4 x i1>
|
|
%1 = select <4 x i1> %0, <4 x i32> %src, <4 x i32> zeroinitializer
|
|
ret <4 x i32> %1
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x i16> @trunc_v8i1_v8i16(<8 x i16> %src) {
|
|
; CHECK-LABEL: trunc_v8i1_v8i16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q2, #0x1
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vand q2, q0, q2
|
|
; CHECK-NEXT: vcmp.i16 ne, q2, zr
|
|
; CHECK-NEXT: vpsel q0, q0, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = trunc <8 x i16> %src to <8 x i1>
|
|
%1 = select <8 x i1> %0, <8 x i16> %src, <8 x i16> zeroinitializer
|
|
ret <8 x i16> %1
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <16 x i8> @trunc_v16i1_v16i8(<16 x i8> %src) {
|
|
; CHECK-LABEL: trunc_v16i1_v16i8:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i8 q2, #0x1
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vand q2, q0, q2
|
|
; CHECK-NEXT: vcmp.i8 ne, q2, zr
|
|
; CHECK-NEXT: vpsel q0, q0, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = trunc <16 x i8> %src to <16 x i1>
|
|
%1 = select <16 x i1> %0, <16 x i8> %src, <16 x i8> zeroinitializer
|
|
ret <16 x i8> %1
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x i64> @trunc_v2i1_v2i64(<2 x i64> %src) {
|
|
; CHECK-LABEL: trunc_v2i1_v2i64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov r1, s0
|
|
; CHECK-NEXT: movs r0, #0
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: and r1, r1, #1
|
|
; CHECK-NEXT: rsbs r1, r1, #0
|
|
; CHECK-NEXT: bfi r0, r1, #0, #8
|
|
; CHECK-NEXT: vmov r1, s2
|
|
; CHECK-NEXT: and r1, r1, #1
|
|
; CHECK-NEXT: rsbs r1, r1, #0
|
|
; CHECK-NEXT: bfi r0, r1, #8, #8
|
|
; CHECK-NEXT: vmsr p0, r0
|
|
; CHECK-NEXT: vpsel q0, q0, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = trunc <2 x i64> %src to <2 x i1>
|
|
%1 = select <2 x i1> %0, <2 x i64> %src, <2 x i64> zeroinitializer
|
|
ret <2 x i64> %1
|
|
}
|
|
|
|
|
|
define arm_aapcs_vfpcc <4 x float> @uitofp_v4i1_v4f32(<4 x i32> %src) {
|
|
; CHECK-LABEL: uitofp_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.f32 q2, #1.000000e+00
|
|
; CHECK-NEXT: vcmp.s32 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <4 x i32> %src, zeroinitializer
|
|
%0 = uitofp <4 x i1> %c to <4 x float>
|
|
ret <4 x float> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <4 x float> @sitofp_v4i1_v4f32(<4 x i32> %src) {
|
|
; CHECK-LABEL: sitofp_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.f32 q2, #-1.000000e+00
|
|
; CHECK-NEXT: vcmp.s32 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <4 x i32> %src, zeroinitializer
|
|
%0 = sitofp <4 x i1> %c to <4 x float>
|
|
ret <4 x float> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <4 x float> @fptoui_v4i1_v4f32(<4 x float> %src) {
|
|
; CHECK-LABEL: fptoui_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.f32 q2, #1.000000e+00
|
|
; CHECK-NEXT: vcmp.f32 ne, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = fptoui <4 x float> %src to <4 x i1>
|
|
%s = select <4 x i1> %0, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, <4 x float> zeroinitializer
|
|
ret <4 x float> %s
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <4 x float> @fptosi_v4i1_v4f32(<4 x float> %src) {
|
|
; CHECK-LABEL: fptosi_v4i1_v4f32:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.f32 q2, #1.000000e+00
|
|
; CHECK-NEXT: vcmp.f32 ne, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = fptosi <4 x float> %src to <4 x i1>
|
|
%s = select <4 x i1> %0, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, <4 x float> zeroinitializer
|
|
ret <4 x float> %s
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x half> @uitofp_v8i1_v8f16(<8 x i16> %src) {
|
|
; CHECK-LABEL: uitofp_v8i1_v8f16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q1, #0x0
|
|
; CHECK-NEXT: vmov.i16 q2, #0x3c00
|
|
; CHECK-NEXT: vcmp.s16 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <8 x i16> %src, zeroinitializer
|
|
%0 = uitofp <8 x i1> %c to <8 x half>
|
|
ret <8 x half> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x half> @sitofp_v8i1_v8f16(<8 x i16> %src) {
|
|
; CHECK-LABEL: sitofp_v8i1_v8f16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i16 q1, #0x0
|
|
; CHECK-NEXT: vmov.i16 q2, #0xbc00
|
|
; CHECK-NEXT: vcmp.s16 gt, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%c = icmp sgt <8 x i16> %src, zeroinitializer
|
|
%0 = sitofp <8 x i1> %c to <8 x half>
|
|
ret <8 x half> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x half> @fptoui_v8i1_v8f16(<8 x half> %src) {
|
|
; CHECK-LABEL: fptoui_v8i1_v8f16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.i16 q2, #0x3c00
|
|
; CHECK-NEXT: vcmp.f16 ne, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = fptoui <8 x half> %src to <8 x i1>
|
|
%s = select <8 x i1> %0, <8 x half> <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>, <8 x half> zeroinitializer
|
|
ret <8 x half> %s
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <8 x half> @fptosi_v8i1_v8f16(<8 x half> %src) {
|
|
; CHECK-LABEL: fptosi_v8i1_v8f16:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: vmov.i32 q1, #0x0
|
|
; CHECK-NEXT: vmov.i16 q2, #0x3c00
|
|
; CHECK-NEXT: vcmp.f16 ne, q0, zr
|
|
; CHECK-NEXT: vpsel q0, q2, q1
|
|
; CHECK-NEXT: bx lr
|
|
entry:
|
|
%0 = fptosi <8 x half> %src to <8 x i1>
|
|
%s = select <8 x i1> %0, <8 x half> <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>, <8 x half> zeroinitializer
|
|
ret <8 x half> %s
|
|
}
|
|
|
|
|
|
define arm_aapcs_vfpcc <2 x double> @uitofp_v2i1_v2f64(<2 x i64> %src) {
|
|
; CHECK-LABEL: uitofp_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, lr}
|
|
; CHECK-NEXT: push {r4, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9}
|
|
; CHECK-NEXT: vpush {d8, d9}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: movs r4, #0
|
|
; CHECK-NEXT: vmov r0, r1, d9
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: sbcs.w r0, r4, r1
|
|
; CHECK-NEXT: cset r0, lt
|
|
; CHECK-NEXT: bl __aeabi_ui2d
|
|
; CHECK-NEXT: vmov r2, r3, d8
|
|
; CHECK-NEXT: vmov d9, r0, r1
|
|
; CHECK-NEXT: rsbs r2, r2, #0
|
|
; CHECK-NEXT: sbcs.w r2, r4, r3
|
|
; CHECK-NEXT: cset r2, lt
|
|
; CHECK-NEXT: mov r0, r2
|
|
; CHECK-NEXT: bl __aeabi_ui2d
|
|
; CHECK-NEXT: vmov d8, r0, r1
|
|
; CHECK-NEXT: vmov q0, q4
|
|
; CHECK-NEXT: vpop {d8, d9}
|
|
; CHECK-NEXT: pop {r4, pc}
|
|
entry:
|
|
%c = icmp sgt <2 x i64> %src, zeroinitializer
|
|
%0 = uitofp <2 x i1> %c to <2 x double>
|
|
ret <2 x double> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x double> @sitofp_v2i1_v2f64(<2 x i64> %src) {
|
|
; CHECK-LABEL: sitofp_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, lr}
|
|
; CHECK-NEXT: push {r4, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9}
|
|
; CHECK-NEXT: vpush {d8, d9}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: movs r4, #0
|
|
; CHECK-NEXT: vmov r0, r1, d9
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: sbcs.w r0, r4, r1
|
|
; CHECK-NEXT: csetm r0, lt
|
|
; CHECK-NEXT: bl __aeabi_i2d
|
|
; CHECK-NEXT: vmov r2, r3, d8
|
|
; CHECK-NEXT: vmov d9, r0, r1
|
|
; CHECK-NEXT: rsbs r2, r2, #0
|
|
; CHECK-NEXT: sbcs.w r2, r4, r3
|
|
; CHECK-NEXT: csetm r2, lt
|
|
; CHECK-NEXT: mov r0, r2
|
|
; CHECK-NEXT: bl __aeabi_i2d
|
|
; CHECK-NEXT: vmov d8, r0, r1
|
|
; CHECK-NEXT: vmov q0, q4
|
|
; CHECK-NEXT: vpop {d8, d9}
|
|
; CHECK-NEXT: pop {r4, pc}
|
|
entry:
|
|
%c = icmp sgt <2 x i64> %src, zeroinitializer
|
|
%0 = sitofp <2 x i1> %c to <2 x double>
|
|
ret <2 x double> %0
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x double> @fptoui_v2i1_v2f64(<2 x double> %src) {
|
|
; CHECK-LABEL: fptoui_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, lr}
|
|
; CHECK-NEXT: push {r4, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9, d10, d11}
|
|
; CHECK-NEXT: vpush {d8, d9, d10, d11}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: vmov r0, r1, d8
|
|
; CHECK-NEXT: bl __aeabi_d2iz
|
|
; CHECK-NEXT: vmov r2, r1, d9
|
|
; CHECK-NEXT: movs r4, #0
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: adr r3, .LCPI28_0
|
|
; CHECK-NEXT: bfi r4, r0, #0, #8
|
|
; CHECK-NEXT: vmov.i32 q4, #0x0
|
|
; CHECK-NEXT: vldrw.u32 q5, [r3]
|
|
; CHECK-NEXT: mov r0, r2
|
|
; CHECK-NEXT: bl __aeabi_d2iz
|
|
; CHECK-NEXT: rsbs r0, r0, #0
|
|
; CHECK-NEXT: bfi r4, r0, #8, #8
|
|
; CHECK-NEXT: vmsr p0, r4
|
|
; CHECK-NEXT: vpsel q0, q5, q4
|
|
; CHECK-NEXT: vpop {d8, d9, d10, d11}
|
|
; CHECK-NEXT: pop {r4, pc}
|
|
; CHECK-NEXT: .p2align 4
|
|
; CHECK-NEXT: @ %bb.1:
|
|
; CHECK-NEXT: .LCPI28_0:
|
|
; CHECK-NEXT: .long 0 @ double 1
|
|
; CHECK-NEXT: .long 1072693248
|
|
; CHECK-NEXT: .long 0 @ double 1
|
|
; CHECK-NEXT: .long 1072693248
|
|
entry:
|
|
%0 = fptoui <2 x double> %src to <2 x i1>
|
|
%s = select <2 x i1> %0, <2 x double> <double 1.0, double 1.0>, <2 x double> zeroinitializer
|
|
ret <2 x double> %s
|
|
}
|
|
|
|
define arm_aapcs_vfpcc <2 x double> @fptosi_v2i1_v2f64(<2 x double> %src) {
|
|
; CHECK-LABEL: fptosi_v2i1_v2f64:
|
|
; CHECK: @ %bb.0: @ %entry
|
|
; CHECK-NEXT: .save {r4, lr}
|
|
; CHECK-NEXT: push {r4, lr}
|
|
; CHECK-NEXT: .vsave {d8, d9, d10, d11}
|
|
; CHECK-NEXT: vpush {d8, d9, d10, d11}
|
|
; CHECK-NEXT: vmov q4, q0
|
|
; CHECK-NEXT: vmov r0, r1, d8
|
|
; CHECK-NEXT: bl __aeabi_d2iz
|
|
; CHECK-NEXT: vmov r2, r1, d9
|
|
; CHECK-NEXT: movs r4, #0
|
|
; CHECK-NEXT: adr r3, .LCPI29_0
|
|
; CHECK-NEXT: bfi r4, r0, #0, #8
|
|
; CHECK-NEXT: vmov.i32 q4, #0x0
|
|
; CHECK-NEXT: vldrw.u32 q5, [r3]
|
|
; CHECK-NEXT: mov r0, r2
|
|
; CHECK-NEXT: bl __aeabi_d2iz
|
|
; CHECK-NEXT: bfi r4, r0, #8, #8
|
|
; CHECK-NEXT: vmsr p0, r4
|
|
; CHECK-NEXT: vpsel q0, q5, q4
|
|
; CHECK-NEXT: vpop {d8, d9, d10, d11}
|
|
; CHECK-NEXT: pop {r4, pc}
|
|
; CHECK-NEXT: .p2align 4
|
|
; CHECK-NEXT: @ %bb.1:
|
|
; CHECK-NEXT: .LCPI29_0:
|
|
; CHECK-NEXT: .long 0 @ double 1
|
|
; CHECK-NEXT: .long 1072693248
|
|
; CHECK-NEXT: .long 0 @ double 1
|
|
; CHECK-NEXT: .long 1072693248
|
|
entry:
|
|
%0 = fptosi <2 x double> %src to <2 x i1>
|
|
%s = select <2 x i1> %0, <2 x double> <double 1.0, double 1.0>, <2 x double> zeroinitializer
|
|
ret <2 x double> %s
|
|
}
|