1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64 4 5;; Test single-precision floating-point values selection after integers comparison 6 7define float @select_eq(i32 signext %a, i32 signext %b, float %x, float %y) { 8; LA32-LABEL: select_eq: 9; LA32: # %bb.0: 10; LA32-NEXT: xor $a0, $a0, $a1 11; LA32-NEXT: sltui $a0, $a0, 1 12; LA32-NEXT: movgr2cf $fcc0, $a0 13; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 14; LA32-NEXT: ret 15; 16; LA64-LABEL: select_eq: 17; LA64: # %bb.0: 18; LA64-NEXT: xor $a0, $a0, $a1 19; LA64-NEXT: sltui $a0, $a0, 1 20; LA64-NEXT: movgr2cf $fcc0, $a0 21; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 22; LA64-NEXT: ret 23 %cond = icmp eq i32 %a, %b 24 %res = select i1 %cond, float %x, float %y 25 ret float %res 26} 27 28define float @select_ne(i32 signext %a, i32 signext %b, float %x, float %y) { 29; LA32-LABEL: select_ne: 30; LA32: # %bb.0: 31; LA32-NEXT: xor $a0, $a0, $a1 32; LA32-NEXT: sltu $a0, $zero, $a0 33; LA32-NEXT: movgr2cf $fcc0, $a0 34; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 35; LA32-NEXT: ret 36; 37; LA64-LABEL: select_ne: 38; LA64: # %bb.0: 39; LA64-NEXT: xor $a0, $a0, $a1 40; LA64-NEXT: sltu $a0, $zero, $a0 41; LA64-NEXT: movgr2cf $fcc0, $a0 42; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 43; LA64-NEXT: ret 44 %cond = icmp ne i32 %a, %b 45 %res = select i1 %cond, float %x, float %y 46 ret float %res 47} 48 49define float @select_ugt(i32 signext %a, i32 signext %b, float %x, float %y) { 50; LA32-LABEL: select_ugt: 51; LA32: # %bb.0: 52; LA32-NEXT: sltu $a0, $a1, $a0 53; LA32-NEXT: movgr2cf $fcc0, $a0 54; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 55; LA32-NEXT: ret 56; 57; LA64-LABEL: select_ugt: 58; LA64: # %bb.0: 59; LA64-NEXT: sltu $a0, $a1, $a0 60; LA64-NEXT: movgr2cf $fcc0, $a0 61; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 62; LA64-NEXT: ret 63 %cond = icmp ugt i32 %a, %b 64 %res = select i1 %cond, float %x, float %y 65 ret float %res 66} 67 68define float @select_uge(i32 signext %a, i32 signext %b, float %x, float %y) { 69; LA32-LABEL: select_uge: 70; LA32: # %bb.0: 71; LA32-NEXT: sltu $a0, $a0, $a1 72; LA32-NEXT: xori $a0, $a0, 1 73; LA32-NEXT: movgr2cf $fcc0, $a0 74; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 75; LA32-NEXT: ret 76; 77; LA64-LABEL: select_uge: 78; LA64: # %bb.0: 79; LA64-NEXT: sltu $a0, $a0, $a1 80; LA64-NEXT: xori $a0, $a0, 1 81; LA64-NEXT: movgr2cf $fcc0, $a0 82; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 83; LA64-NEXT: ret 84 %cond = icmp uge i32 %a, %b 85 %res = select i1 %cond, float %x, float %y 86 ret float %res 87} 88 89define float @select_ult(i32 signext %a, i32 signext %b, float %x, float %y) { 90; LA32-LABEL: select_ult: 91; LA32: # %bb.0: 92; LA32-NEXT: sltu $a0, $a0, $a1 93; LA32-NEXT: movgr2cf $fcc0, $a0 94; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 95; LA32-NEXT: ret 96; 97; LA64-LABEL: select_ult: 98; LA64: # %bb.0: 99; LA64-NEXT: sltu $a0, $a0, $a1 100; LA64-NEXT: movgr2cf $fcc0, $a0 101; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 102; LA64-NEXT: ret 103 %cond = icmp ult i32 %a, %b 104 %res = select i1 %cond, float %x, float %y 105 ret float %res 106} 107 108define float @select_ule(i32 signext %a, i32 signext %b, float %x, float %y) { 109; LA32-LABEL: select_ule: 110; LA32: # %bb.0: 111; LA32-NEXT: sltu $a0, $a1, $a0 112; LA32-NEXT: xori $a0, $a0, 1 113; LA32-NEXT: movgr2cf $fcc0, $a0 114; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 115; LA32-NEXT: ret 116; 117; LA64-LABEL: select_ule: 118; LA64: # %bb.0: 119; LA64-NEXT: sltu $a0, $a1, $a0 120; LA64-NEXT: xori $a0, $a0, 1 121; LA64-NEXT: movgr2cf $fcc0, $a0 122; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 123; LA64-NEXT: ret 124 %cond = icmp ule i32 %a, %b 125 %res = select i1 %cond, float %x, float %y 126 ret float %res 127} 128 129define float @select_sgt(i32 signext %a, i32 signext %b, float %x, float %y) { 130; LA32-LABEL: select_sgt: 131; LA32: # %bb.0: 132; LA32-NEXT: slt $a0, $a1, $a0 133; LA32-NEXT: movgr2cf $fcc0, $a0 134; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 135; LA32-NEXT: ret 136; 137; LA64-LABEL: select_sgt: 138; LA64: # %bb.0: 139; LA64-NEXT: slt $a0, $a1, $a0 140; LA64-NEXT: movgr2cf $fcc0, $a0 141; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 142; LA64-NEXT: ret 143 %cond = icmp sgt i32 %a, %b 144 %res = select i1 %cond, float %x, float %y 145 ret float %res 146} 147 148define float @select_sge(i32 signext %a, i32 signext %b, float %x, float %y) { 149; LA32-LABEL: select_sge: 150; LA32: # %bb.0: 151; LA32-NEXT: slt $a0, $a0, $a1 152; LA32-NEXT: xori $a0, $a0, 1 153; LA32-NEXT: movgr2cf $fcc0, $a0 154; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 155; LA32-NEXT: ret 156; 157; LA64-LABEL: select_sge: 158; LA64: # %bb.0: 159; LA64-NEXT: slt $a0, $a0, $a1 160; LA64-NEXT: xori $a0, $a0, 1 161; LA64-NEXT: movgr2cf $fcc0, $a0 162; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 163; LA64-NEXT: ret 164 %cond = icmp sge i32 %a, %b 165 %res = select i1 %cond, float %x, float %y 166 ret float %res 167} 168 169define float @select_slt(i32 signext %a, i32 signext %b, float %x, float %y) { 170; LA32-LABEL: select_slt: 171; LA32: # %bb.0: 172; LA32-NEXT: slt $a0, $a0, $a1 173; LA32-NEXT: movgr2cf $fcc0, $a0 174; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 175; LA32-NEXT: ret 176; 177; LA64-LABEL: select_slt: 178; LA64: # %bb.0: 179; LA64-NEXT: slt $a0, $a0, $a1 180; LA64-NEXT: movgr2cf $fcc0, $a0 181; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 182; LA64-NEXT: ret 183 %cond = icmp slt i32 %a, %b 184 %res = select i1 %cond, float %x, float %y 185 ret float %res 186} 187 188define float @select_sle(i32 signext %a, i32 signext %b, float %x, float %y) { 189; LA32-LABEL: select_sle: 190; LA32: # %bb.0: 191; LA32-NEXT: slt $a0, $a1, $a0 192; LA32-NEXT: xori $a0, $a0, 1 193; LA32-NEXT: movgr2cf $fcc0, $a0 194; LA32-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 195; LA32-NEXT: ret 196; 197; LA64-LABEL: select_sle: 198; LA64: # %bb.0: 199; LA64-NEXT: slt $a0, $a1, $a0 200; LA64-NEXT: xori $a0, $a0, 1 201; LA64-NEXT: movgr2cf $fcc0, $a0 202; LA64-NEXT: fsel $fa0, $fa1, $fa0, $fcc0 203; LA64-NEXT: ret 204 %cond = icmp sle i32 %a, %b 205 %res = select i1 %cond, float %x, float %y 206 ret float %res 207} 208