263 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+fullfp16 %s -o - | FileCheck %s --check-prefixes CHECK,CHECK-THUMB3; RUN: llc -mtriple=armv8.2a-arm-none-eabi -mattr=+fullfp16 %s -o - | FileCheck %s --check-prefixes CHECK,CHECK-ARM4 5define i32 @test_ne(i32 %x, i32 %y, i32 %a, i32 %b) {6; CHECK-LABEL: test_ne:7; CHECK: @ %bb.0: @ %entry8; CHECK-NEXT: vmov s0, r09; CHECK-NEXT: cmp r2, r310; CHECK-NEXT: vmov s2, r111; CHECK-NEXT: vcvt.f16.u32 s0, s012; CHECK-NEXT: vcvt.f16.u32 s2, s213; CHECK-NEXT: vseleq.f16 s0, s2, s014; CHECK-NEXT: vmov.f16 r0, s015; CHECK-NEXT: bx lr16entry:17 %x.half = uitofp i32 %x to half18 %y.half = uitofp i32 %y to half19 %cmp = icmp ne i32 %a, %b20 %cond = select i1 %cmp, half %x.half, half %y.half21 %0 = bitcast half %cond to i1622 %1 = zext i16 %0 to i3223 ret i32 %124}25 26define i32 @test_eq(i32 %x, i32 %y, i32 %a, i32 %b) {27; CHECK-LABEL: test_eq:28; CHECK: @ %bb.0: @ %entry29; CHECK-NEXT: vmov s0, r130; CHECK-NEXT: cmp r2, r331; CHECK-NEXT: vmov s2, r032; CHECK-NEXT: vcvt.f16.u32 s0, s033; CHECK-NEXT: vcvt.f16.u32 s2, s234; CHECK-NEXT: vseleq.f16 s0, s2, s035; CHECK-NEXT: vmov.f16 r0, s036; CHECK-NEXT: bx lr37entry:38 %x.half = uitofp i32 %x to half39 %y.half = uitofp i32 %y to half40 %cmp = icmp eq i32 %a, %b41 %cond = select i1 %cmp, half %x.half, half %y.half42 %0 = bitcast half %cond to i1643 %1 = zext i16 %0 to i3244 ret i32 %145}46 47define i32 @test_gt(i32 %x, i32 %y, i32 %a, i32 %b) {48; CHECK-LABEL: test_gt:49; CHECK: @ %bb.0: @ %entry50; CHECK-NEXT: vmov s0, r151; CHECK-NEXT: cmp r2, r352; CHECK-NEXT: vmov s2, r053; CHECK-NEXT: vcvt.f16.u32 s0, s054; CHECK-NEXT: vcvt.f16.u32 s2, s255; CHECK-NEXT: vselgt.f16 s0, s2, s056; CHECK-NEXT: vmov.f16 r0, s057; CHECK-NEXT: bx lr58entry:59 %x.half = uitofp i32 %x to half60 %y.half = uitofp i32 %y to half61 %cmp = icmp sgt i32 %a, %b62 %cond = select i1 %cmp, half %x.half, half %y.half63 %0 = bitcast half %cond to i1664 %1 = zext i16 %0 to i3265 ret i32 %166}67 68define i32 @test_ge(i32 %x, i32 %y, i32 %a, i32 %b) {69; CHECK-LABEL: test_ge:70; CHECK: @ %bb.0: @ %entry71; CHECK-NEXT: vmov s0, r172; CHECK-NEXT: cmp r2, r373; CHECK-NEXT: vmov s2, r074; CHECK-NEXT: vcvt.f16.u32 s0, s075; CHECK-NEXT: vcvt.f16.u32 s2, s276; CHECK-NEXT: vselge.f16 s0, s2, s077; CHECK-NEXT: vmov.f16 r0, s078; CHECK-NEXT: bx lr79entry:80 %x.half = uitofp i32 %x to half81 %y.half = uitofp i32 %y to half82 %cmp = icmp sge i32 %a, %b83 %cond = select i1 %cmp, half %x.half, half %y.half84 %0 = bitcast half %cond to i1685 %1 = zext i16 %0 to i3286 ret i32 %187}88 89define i32 @test_lt(i32 %x, i32 %y, i32 %a, i32 %b) {90; CHECK-LABEL: test_lt:91; CHECK: @ %bb.0: @ %entry92; CHECK-NEXT: vmov s0, r093; CHECK-NEXT: cmp r2, r394; CHECK-NEXT: vmov s2, r195; CHECK-NEXT: vcvt.f16.u32 s0, s096; CHECK-NEXT: vcvt.f16.u32 s2, s297; CHECK-NEXT: vselge.f16 s0, s2, s098; CHECK-NEXT: vmov.f16 r0, s099; CHECK-NEXT: bx lr100entry:101 %x.half = uitofp i32 %x to half102 %y.half = uitofp i32 %y to half103 %cmp = icmp slt i32 %a, %b104 %cond = select i1 %cmp, half %x.half, half %y.half105 %0 = bitcast half %cond to i16106 %1 = zext i16 %0 to i32107 ret i32 %1108}109 110define i32 @test_le(i32 %x, i32 %y, i32 %a, i32 %b) {111; CHECK-LABEL: test_le:112; CHECK: @ %bb.0: @ %entry113; CHECK-NEXT: vmov s0, r0114; CHECK-NEXT: cmp r2, r3115; CHECK-NEXT: vmov s2, r1116; CHECK-NEXT: vcvt.f16.u32 s0, s0117; CHECK-NEXT: vcvt.f16.u32 s2, s2118; CHECK-NEXT: vselgt.f16 s0, s2, s0119; CHECK-NEXT: vmov.f16 r0, s0120; CHECK-NEXT: bx lr121entry:122 %x.half = uitofp i32 %x to half123 %y.half = uitofp i32 %y to half124 %cmp = icmp sle i32 %a, %b125 %cond = select i1 %cmp, half %x.half, half %y.half126 %0 = bitcast half %cond to i16127 %1 = zext i16 %0 to i32128 ret i32 %1129}130 131define i32 @test_hi(i32 %x, i32 %y, i32 %a, i32 %b) {132; CHECK-THUMB-LABEL: test_hi:133; CHECK-THUMB: @ %bb.0: @ %entry134; CHECK-THUMB-NEXT: vmov s2, r1135; CHECK-THUMB-NEXT: cmp r2, r3136; CHECK-THUMB-NEXT: vmov s0, r0137; CHECK-THUMB-NEXT: vcvt.f16.u32 s2, s2138; CHECK-THUMB-NEXT: vcvt.f16.u32 s0, s0139; CHECK-THUMB-NEXT: it hi140; CHECK-THUMB-NEXT: vmovhi.f32 s2, s0141; CHECK-THUMB-NEXT: vmov.f16 r0, s2142; CHECK-THUMB-NEXT: bx lr143;144; CHECK-ARM-LABEL: test_hi:145; CHECK-ARM: @ %bb.0: @ %entry146; CHECK-ARM-NEXT: vmov s0, r0147; CHECK-ARM-NEXT: cmp r2, r3148; CHECK-ARM-NEXT: vmov s2, r1149; CHECK-ARM-NEXT: vcvt.f16.u32 s0, s0150; CHECK-ARM-NEXT: vcvt.f16.u32 s2, s2151; CHECK-ARM-NEXT: vmovhi.f32 s2, s0152; CHECK-ARM-NEXT: vmov.f16 r0, s2153; CHECK-ARM-NEXT: bx lr154entry:155 %x.half = uitofp i32 %x to half156 %y.half = uitofp i32 %y to half157 %cmp = icmp ugt i32 %a, %b158 %cond = select i1 %cmp, half %x.half, half %y.half159 %0 = bitcast half %cond to i16160 %1 = zext i16 %0 to i32161 ret i32 %1162}163 164define i32 @test_hs(i32 %x, i32 %y, i32 %a, i32 %b) {165; CHECK-THUMB-LABEL: test_hs:166; CHECK-THUMB: @ %bb.0: @ %entry167; CHECK-THUMB-NEXT: vmov s2, r1168; CHECK-THUMB-NEXT: cmp r2, r3169; CHECK-THUMB-NEXT: vmov s0, r0170; CHECK-THUMB-NEXT: vcvt.f16.u32 s2, s2171; CHECK-THUMB-NEXT: vcvt.f16.u32 s0, s0172; CHECK-THUMB-NEXT: it hs173; CHECK-THUMB-NEXT: vmovhs.f32 s2, s0174; CHECK-THUMB-NEXT: vmov.f16 r0, s2175; CHECK-THUMB-NEXT: bx lr176;177; CHECK-ARM-LABEL: test_hs:178; CHECK-ARM: @ %bb.0: @ %entry179; CHECK-ARM-NEXT: vmov s0, r0180; CHECK-ARM-NEXT: cmp r2, r3181; CHECK-ARM-NEXT: vmov s2, r1182; CHECK-ARM-NEXT: vcvt.f16.u32 s0, s0183; CHECK-ARM-NEXT: vcvt.f16.u32 s2, s2184; CHECK-ARM-NEXT: vmovhs.f32 s2, s0185; CHECK-ARM-NEXT: vmov.f16 r0, s2186; CHECK-ARM-NEXT: bx lr187entry:188 %x.half = uitofp i32 %x to half189 %y.half = uitofp i32 %y to half190 %cmp = icmp uge i32 %a, %b191 %cond = select i1 %cmp, half %x.half, half %y.half192 %0 = bitcast half %cond to i16193 %1 = zext i16 %0 to i32194 ret i32 %1195}196 197define i32 @test_lo(i32 %x, i32 %y, i32 %a, i32 %b) {198; CHECK-THUMB-LABEL: test_lo:199; CHECK-THUMB: @ %bb.0: @ %entry200; CHECK-THUMB-NEXT: vmov s2, r1201; CHECK-THUMB-NEXT: cmp r2, r3202; CHECK-THUMB-NEXT: vmov s0, r0203; CHECK-THUMB-NEXT: vcvt.f16.u32 s2, s2204; CHECK-THUMB-NEXT: vcvt.f16.u32 s0, s0205; CHECK-THUMB-NEXT: it lo206; CHECK-THUMB-NEXT: vmovlo.f32 s2, s0207; CHECK-THUMB-NEXT: vmov.f16 r0, s2208; CHECK-THUMB-NEXT: bx lr209;210; CHECK-ARM-LABEL: test_lo:211; CHECK-ARM: @ %bb.0: @ %entry212; CHECK-ARM-NEXT: vmov s0, r0213; CHECK-ARM-NEXT: cmp r2, r3214; CHECK-ARM-NEXT: vmov s2, r1215; CHECK-ARM-NEXT: vcvt.f16.u32 s0, s0216; CHECK-ARM-NEXT: vcvt.f16.u32 s2, s2217; CHECK-ARM-NEXT: vmovlo.f32 s2, s0218; CHECK-ARM-NEXT: vmov.f16 r0, s2219; CHECK-ARM-NEXT: bx lr220entry:221 %x.half = uitofp i32 %x to half222 %y.half = uitofp i32 %y to half223 %cmp = icmp ult i32 %a, %b224 %cond = select i1 %cmp, half %x.half, half %y.half225 %0 = bitcast half %cond to i16226 %1 = zext i16 %0 to i32227 ret i32 %1228}229 230define i32 @test_ls(i32 %x, i32 %y, i32 %a, i32 %b) {231; CHECK-THUMB-LABEL: test_ls:232; CHECK-THUMB: @ %bb.0: @ %entry233; CHECK-THUMB-NEXT: vmov s2, r1234; CHECK-THUMB-NEXT: cmp r2, r3235; CHECK-THUMB-NEXT: vmov s0, r0236; CHECK-THUMB-NEXT: vcvt.f16.u32 s2, s2237; CHECK-THUMB-NEXT: vcvt.f16.u32 s0, s0238; CHECK-THUMB-NEXT: it ls239; CHECK-THUMB-NEXT: vmovls.f32 s2, s0240; CHECK-THUMB-NEXT: vmov.f16 r0, s2241; CHECK-THUMB-NEXT: bx lr242;243; CHECK-ARM-LABEL: test_ls:244; CHECK-ARM: @ %bb.0: @ %entry245; CHECK-ARM-NEXT: vmov s0, r0246; CHECK-ARM-NEXT: cmp r2, r3247; CHECK-ARM-NEXT: vmov s2, r1248; CHECK-ARM-NEXT: vcvt.f16.u32 s0, s0249; CHECK-ARM-NEXT: vcvt.f16.u32 s2, s2250; CHECK-ARM-NEXT: vmovls.f32 s2, s0251; CHECK-ARM-NEXT: vmov.f16 r0, s2252; CHECK-ARM-NEXT: bx lr253entry:254 %x.half = uitofp i32 %x to half255 %y.half = uitofp i32 %y to half256 %cmp = icmp ule i32 %a, %b257 %cond = select i1 %cmp, half %x.half, half %y.half258 %0 = bitcast half %cond to i16259 %1 = zext i16 %0 to i32260 ret i32 %1261}262 263