1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+zfbfmin -verify-machineinstrs \ 3; RUN: -target-abi ilp32f < %s | FileCheck -check-prefix=RV32IZFBFMIN %s 4; RUN: llc -mtriple=riscv64 -mattr=+zfbfmin -verify-machineinstrs \ 5; RUN: -target-abi lp64f < %s | FileCheck -check-prefix=RV64IZFBFMIN %s 6 7declare void @abort() 8declare void @exit(i32) 9declare bfloat @dummy(bfloat) 10 11define void @br_fcmp_false(bfloat %a, bfloat %b) nounwind { 12; RV32IZFBFMIN-LABEL: br_fcmp_false: 13; RV32IZFBFMIN: # %bb.0: 14; RV32IZFBFMIN-NEXT: li a0, 1 15; RV32IZFBFMIN-NEXT: bnez a0, .LBB0_2 16; RV32IZFBFMIN-NEXT: # %bb.1: # %if.then 17; RV32IZFBFMIN-NEXT: ret 18; RV32IZFBFMIN-NEXT: .LBB0_2: # %if.else 19; RV32IZFBFMIN-NEXT: addi sp, sp, -16 20; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21; RV32IZFBFMIN-NEXT: call abort 22; 23; RV64IZFBFMIN-LABEL: br_fcmp_false: 24; RV64IZFBFMIN: # %bb.0: 25; RV64IZFBFMIN-NEXT: li a0, 1 26; RV64IZFBFMIN-NEXT: bnez a0, .LBB0_2 27; RV64IZFBFMIN-NEXT: # %bb.1: # %if.then 28; RV64IZFBFMIN-NEXT: ret 29; RV64IZFBFMIN-NEXT: .LBB0_2: # %if.else 30; RV64IZFBFMIN-NEXT: addi sp, sp, -16 31; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 32; RV64IZFBFMIN-NEXT: call abort 33 %1 = fcmp false bfloat %a, %b 34 br i1 %1, label %if.then, label %if.else 35if.then: 36 ret void 37if.else: 38 tail call void @abort() 39 unreachable 40} 41 42define void @br_fcmp_oeq(bfloat %a, bfloat %b) nounwind { 43; RV32IZFBFMIN-LABEL: br_fcmp_oeq: 44; RV32IZFBFMIN: # %bb.0: 45; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 46; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 47; RV32IZFBFMIN-NEXT: feq.s a0, fa4, fa5 48; RV32IZFBFMIN-NEXT: bnez a0, .LBB1_2 49; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 50; RV32IZFBFMIN-NEXT: ret 51; RV32IZFBFMIN-NEXT: .LBB1_2: # %if.then 52; RV32IZFBFMIN-NEXT: addi sp, sp, -16 53; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 54; RV32IZFBFMIN-NEXT: call abort 55; 56; RV64IZFBFMIN-LABEL: br_fcmp_oeq: 57; RV64IZFBFMIN: # %bb.0: 58; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 59; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 60; RV64IZFBFMIN-NEXT: feq.s a0, fa4, fa5 61; RV64IZFBFMIN-NEXT: bnez a0, .LBB1_2 62; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 63; RV64IZFBFMIN-NEXT: ret 64; RV64IZFBFMIN-NEXT: .LBB1_2: # %if.then 65; RV64IZFBFMIN-NEXT: addi sp, sp, -16 66; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 67; RV64IZFBFMIN-NEXT: call abort 68 %1 = fcmp oeq bfloat %a, %b 69 br i1 %1, label %if.then, label %if.else 70if.else: 71 ret void 72if.then: 73 tail call void @abort() 74 unreachable 75} 76 77define void @br_fcmp_oeq_alt(bfloat %a, bfloat %b) nounwind { 78; RV32IZFBFMIN-LABEL: br_fcmp_oeq_alt: 79; RV32IZFBFMIN: # %bb.0: 80; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 81; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 82; RV32IZFBFMIN-NEXT: feq.s a0, fa4, fa5 83; RV32IZFBFMIN-NEXT: bnez a0, .LBB2_2 84; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 85; RV32IZFBFMIN-NEXT: ret 86; RV32IZFBFMIN-NEXT: .LBB2_2: # %if.then 87; RV32IZFBFMIN-NEXT: addi sp, sp, -16 88; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 89; RV32IZFBFMIN-NEXT: call abort 90; 91; RV64IZFBFMIN-LABEL: br_fcmp_oeq_alt: 92; RV64IZFBFMIN: # %bb.0: 93; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 94; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 95; RV64IZFBFMIN-NEXT: feq.s a0, fa4, fa5 96; RV64IZFBFMIN-NEXT: bnez a0, .LBB2_2 97; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 98; RV64IZFBFMIN-NEXT: ret 99; RV64IZFBFMIN-NEXT: .LBB2_2: # %if.then 100; RV64IZFBFMIN-NEXT: addi sp, sp, -16 101; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 102; RV64IZFBFMIN-NEXT: call abort 103 %1 = fcmp oeq bfloat %a, %b 104 br i1 %1, label %if.then, label %if.else 105if.then: 106 tail call void @abort() 107 unreachable 108if.else: 109 ret void 110} 111 112define void @br_fcmp_ogt(bfloat %a, bfloat %b) nounwind { 113; RV32IZFBFMIN-LABEL: br_fcmp_ogt: 114; RV32IZFBFMIN: # %bb.0: 115; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 116; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 117; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 118; RV32IZFBFMIN-NEXT: bnez a0, .LBB3_2 119; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 120; RV32IZFBFMIN-NEXT: ret 121; RV32IZFBFMIN-NEXT: .LBB3_2: # %if.then 122; RV32IZFBFMIN-NEXT: addi sp, sp, -16 123; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 124; RV32IZFBFMIN-NEXT: call abort 125; 126; RV64IZFBFMIN-LABEL: br_fcmp_ogt: 127; RV64IZFBFMIN: # %bb.0: 128; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 129; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 130; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 131; RV64IZFBFMIN-NEXT: bnez a0, .LBB3_2 132; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 133; RV64IZFBFMIN-NEXT: ret 134; RV64IZFBFMIN-NEXT: .LBB3_2: # %if.then 135; RV64IZFBFMIN-NEXT: addi sp, sp, -16 136; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 137; RV64IZFBFMIN-NEXT: call abort 138 %1 = fcmp ogt bfloat %a, %b 139 br i1 %1, label %if.then, label %if.else 140if.else: 141 ret void 142if.then: 143 tail call void @abort() 144 unreachable 145} 146 147define void @br_fcmp_oge(bfloat %a, bfloat %b) nounwind { 148; RV32IZFBFMIN-LABEL: br_fcmp_oge: 149; RV32IZFBFMIN: # %bb.0: 150; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 151; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 152; RV32IZFBFMIN-NEXT: fle.s a0, fa4, fa5 153; RV32IZFBFMIN-NEXT: bnez a0, .LBB4_2 154; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 155; RV32IZFBFMIN-NEXT: ret 156; RV32IZFBFMIN-NEXT: .LBB4_2: # %if.then 157; RV32IZFBFMIN-NEXT: addi sp, sp, -16 158; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 159; RV32IZFBFMIN-NEXT: call abort 160; 161; RV64IZFBFMIN-LABEL: br_fcmp_oge: 162; RV64IZFBFMIN: # %bb.0: 163; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 164; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 165; RV64IZFBFMIN-NEXT: fle.s a0, fa4, fa5 166; RV64IZFBFMIN-NEXT: bnez a0, .LBB4_2 167; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 168; RV64IZFBFMIN-NEXT: ret 169; RV64IZFBFMIN-NEXT: .LBB4_2: # %if.then 170; RV64IZFBFMIN-NEXT: addi sp, sp, -16 171; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 172; RV64IZFBFMIN-NEXT: call abort 173 %1 = fcmp oge bfloat %a, %b 174 br i1 %1, label %if.then, label %if.else 175if.else: 176 ret void 177if.then: 178 tail call void @abort() 179 unreachable 180} 181 182define void @br_fcmp_olt(bfloat %a, bfloat %b) nounwind { 183; RV32IZFBFMIN-LABEL: br_fcmp_olt: 184; RV32IZFBFMIN: # %bb.0: 185; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 186; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 187; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 188; RV32IZFBFMIN-NEXT: bnez a0, .LBB5_2 189; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 190; RV32IZFBFMIN-NEXT: ret 191; RV32IZFBFMIN-NEXT: .LBB5_2: # %if.then 192; RV32IZFBFMIN-NEXT: addi sp, sp, -16 193; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 194; RV32IZFBFMIN-NEXT: call abort 195; 196; RV64IZFBFMIN-LABEL: br_fcmp_olt: 197; RV64IZFBFMIN: # %bb.0: 198; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 199; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 200; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 201; RV64IZFBFMIN-NEXT: bnez a0, .LBB5_2 202; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 203; RV64IZFBFMIN-NEXT: ret 204; RV64IZFBFMIN-NEXT: .LBB5_2: # %if.then 205; RV64IZFBFMIN-NEXT: addi sp, sp, -16 206; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 207; RV64IZFBFMIN-NEXT: call abort 208 %1 = fcmp olt bfloat %a, %b 209 br i1 %1, label %if.then, label %if.else 210if.else: 211 ret void 212if.then: 213 tail call void @abort() 214 unreachable 215} 216 217define void @br_fcmp_ole(bfloat %a, bfloat %b) nounwind { 218; RV32IZFBFMIN-LABEL: br_fcmp_ole: 219; RV32IZFBFMIN: # %bb.0: 220; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 221; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 222; RV32IZFBFMIN-NEXT: fle.s a0, fa4, fa5 223; RV32IZFBFMIN-NEXT: bnez a0, .LBB6_2 224; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 225; RV32IZFBFMIN-NEXT: ret 226; RV32IZFBFMIN-NEXT: .LBB6_2: # %if.then 227; RV32IZFBFMIN-NEXT: addi sp, sp, -16 228; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 229; RV32IZFBFMIN-NEXT: call abort 230; 231; RV64IZFBFMIN-LABEL: br_fcmp_ole: 232; RV64IZFBFMIN: # %bb.0: 233; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 234; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 235; RV64IZFBFMIN-NEXT: fle.s a0, fa4, fa5 236; RV64IZFBFMIN-NEXT: bnez a0, .LBB6_2 237; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 238; RV64IZFBFMIN-NEXT: ret 239; RV64IZFBFMIN-NEXT: .LBB6_2: # %if.then 240; RV64IZFBFMIN-NEXT: addi sp, sp, -16 241; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 242; RV64IZFBFMIN-NEXT: call abort 243 %1 = fcmp ole bfloat %a, %b 244 br i1 %1, label %if.then, label %if.else 245if.else: 246 ret void 247if.then: 248 tail call void @abort() 249 unreachable 250} 251 252define void @br_fcmp_one(bfloat %a, bfloat %b) nounwind { 253; RV32IZFBFMIN-LABEL: br_fcmp_one: 254; RV32IZFBFMIN: # %bb.0: 255; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 256; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 257; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 258; RV32IZFBFMIN-NEXT: flt.s a1, fa5, fa4 259; RV32IZFBFMIN-NEXT: or a0, a1, a0 260; RV32IZFBFMIN-NEXT: bnez a0, .LBB7_2 261; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 262; RV32IZFBFMIN-NEXT: ret 263; RV32IZFBFMIN-NEXT: .LBB7_2: # %if.then 264; RV32IZFBFMIN-NEXT: addi sp, sp, -16 265; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 266; RV32IZFBFMIN-NEXT: call abort 267; 268; RV64IZFBFMIN-LABEL: br_fcmp_one: 269; RV64IZFBFMIN: # %bb.0: 270; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 271; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 272; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 273; RV64IZFBFMIN-NEXT: flt.s a1, fa5, fa4 274; RV64IZFBFMIN-NEXT: or a0, a1, a0 275; RV64IZFBFMIN-NEXT: bnez a0, .LBB7_2 276; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 277; RV64IZFBFMIN-NEXT: ret 278; RV64IZFBFMIN-NEXT: .LBB7_2: # %if.then 279; RV64IZFBFMIN-NEXT: addi sp, sp, -16 280; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 281; RV64IZFBFMIN-NEXT: call abort 282 %1 = fcmp one bfloat %a, %b 283 br i1 %1, label %if.then, label %if.else 284if.else: 285 ret void 286if.then: 287 tail call void @abort() 288 unreachable 289} 290 291define void @br_fcmp_ord(bfloat %a, bfloat %b) nounwind { 292; RV32IZFBFMIN-LABEL: br_fcmp_ord: 293; RV32IZFBFMIN: # %bb.0: 294; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 295; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 296; RV32IZFBFMIN-NEXT: feq.s a0, fa5, fa5 297; RV32IZFBFMIN-NEXT: feq.s a1, fa4, fa4 298; RV32IZFBFMIN-NEXT: and a0, a1, a0 299; RV32IZFBFMIN-NEXT: bnez a0, .LBB8_2 300; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 301; RV32IZFBFMIN-NEXT: ret 302; RV32IZFBFMIN-NEXT: .LBB8_2: # %if.then 303; RV32IZFBFMIN-NEXT: addi sp, sp, -16 304; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 305; RV32IZFBFMIN-NEXT: call abort 306; 307; RV64IZFBFMIN-LABEL: br_fcmp_ord: 308; RV64IZFBFMIN: # %bb.0: 309; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 310; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 311; RV64IZFBFMIN-NEXT: feq.s a0, fa5, fa5 312; RV64IZFBFMIN-NEXT: feq.s a1, fa4, fa4 313; RV64IZFBFMIN-NEXT: and a0, a1, a0 314; RV64IZFBFMIN-NEXT: bnez a0, .LBB8_2 315; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 316; RV64IZFBFMIN-NEXT: ret 317; RV64IZFBFMIN-NEXT: .LBB8_2: # %if.then 318; RV64IZFBFMIN-NEXT: addi sp, sp, -16 319; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 320; RV64IZFBFMIN-NEXT: call abort 321 %1 = fcmp ord bfloat %a, %b 322 br i1 %1, label %if.then, label %if.else 323if.else: 324 ret void 325if.then: 326 tail call void @abort() 327 unreachable 328} 329 330define void @br_fcmp_ueq(bfloat %a, bfloat %b) nounwind { 331; RV32IZFBFMIN-LABEL: br_fcmp_ueq: 332; RV32IZFBFMIN: # %bb.0: 333; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 334; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 335; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 336; RV32IZFBFMIN-NEXT: flt.s a1, fa5, fa4 337; RV32IZFBFMIN-NEXT: or a0, a1, a0 338; RV32IZFBFMIN-NEXT: beqz a0, .LBB9_2 339; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 340; RV32IZFBFMIN-NEXT: ret 341; RV32IZFBFMIN-NEXT: .LBB9_2: # %if.then 342; RV32IZFBFMIN-NEXT: addi sp, sp, -16 343; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 344; RV32IZFBFMIN-NEXT: call abort 345; 346; RV64IZFBFMIN-LABEL: br_fcmp_ueq: 347; RV64IZFBFMIN: # %bb.0: 348; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 349; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 350; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 351; RV64IZFBFMIN-NEXT: flt.s a1, fa5, fa4 352; RV64IZFBFMIN-NEXT: or a0, a1, a0 353; RV64IZFBFMIN-NEXT: beqz a0, .LBB9_2 354; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 355; RV64IZFBFMIN-NEXT: ret 356; RV64IZFBFMIN-NEXT: .LBB9_2: # %if.then 357; RV64IZFBFMIN-NEXT: addi sp, sp, -16 358; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 359; RV64IZFBFMIN-NEXT: call abort 360 %1 = fcmp ueq bfloat %a, %b 361 br i1 %1, label %if.then, label %if.else 362if.else: 363 ret void 364if.then: 365 tail call void @abort() 366 unreachable 367} 368 369define void @br_fcmp_ugt(bfloat %a, bfloat %b) nounwind { 370; RV32IZFBFMIN-LABEL: br_fcmp_ugt: 371; RV32IZFBFMIN: # %bb.0: 372; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 373; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 374; RV32IZFBFMIN-NEXT: fle.s a0, fa4, fa5 375; RV32IZFBFMIN-NEXT: beqz a0, .LBB10_2 376; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 377; RV32IZFBFMIN-NEXT: ret 378; RV32IZFBFMIN-NEXT: .LBB10_2: # %if.then 379; RV32IZFBFMIN-NEXT: addi sp, sp, -16 380; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 381; RV32IZFBFMIN-NEXT: call abort 382; 383; RV64IZFBFMIN-LABEL: br_fcmp_ugt: 384; RV64IZFBFMIN: # %bb.0: 385; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 386; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 387; RV64IZFBFMIN-NEXT: fle.s a0, fa4, fa5 388; RV64IZFBFMIN-NEXT: beqz a0, .LBB10_2 389; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 390; RV64IZFBFMIN-NEXT: ret 391; RV64IZFBFMIN-NEXT: .LBB10_2: # %if.then 392; RV64IZFBFMIN-NEXT: addi sp, sp, -16 393; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 394; RV64IZFBFMIN-NEXT: call abort 395 %1 = fcmp ugt bfloat %a, %b 396 br i1 %1, label %if.then, label %if.else 397if.else: 398 ret void 399if.then: 400 tail call void @abort() 401 unreachable 402} 403 404define void @br_fcmp_uge(bfloat %a, bfloat %b) nounwind { 405; RV32IZFBFMIN-LABEL: br_fcmp_uge: 406; RV32IZFBFMIN: # %bb.0: 407; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 408; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 409; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 410; RV32IZFBFMIN-NEXT: beqz a0, .LBB11_2 411; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 412; RV32IZFBFMIN-NEXT: ret 413; RV32IZFBFMIN-NEXT: .LBB11_2: # %if.then 414; RV32IZFBFMIN-NEXT: addi sp, sp, -16 415; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 416; RV32IZFBFMIN-NEXT: call abort 417; 418; RV64IZFBFMIN-LABEL: br_fcmp_uge: 419; RV64IZFBFMIN: # %bb.0: 420; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 421; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 422; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 423; RV64IZFBFMIN-NEXT: beqz a0, .LBB11_2 424; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 425; RV64IZFBFMIN-NEXT: ret 426; RV64IZFBFMIN-NEXT: .LBB11_2: # %if.then 427; RV64IZFBFMIN-NEXT: addi sp, sp, -16 428; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 429; RV64IZFBFMIN-NEXT: call abort 430 %1 = fcmp uge bfloat %a, %b 431 br i1 %1, label %if.then, label %if.else 432if.else: 433 ret void 434if.then: 435 tail call void @abort() 436 unreachable 437} 438 439define void @br_fcmp_ult(bfloat %a, bfloat %b) nounwind { 440; RV32IZFBFMIN-LABEL: br_fcmp_ult: 441; RV32IZFBFMIN: # %bb.0: 442; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 443; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 444; RV32IZFBFMIN-NEXT: fle.s a0, fa4, fa5 445; RV32IZFBFMIN-NEXT: beqz a0, .LBB12_2 446; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 447; RV32IZFBFMIN-NEXT: ret 448; RV32IZFBFMIN-NEXT: .LBB12_2: # %if.then 449; RV32IZFBFMIN-NEXT: addi sp, sp, -16 450; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 451; RV32IZFBFMIN-NEXT: call abort 452; 453; RV64IZFBFMIN-LABEL: br_fcmp_ult: 454; RV64IZFBFMIN: # %bb.0: 455; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 456; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 457; RV64IZFBFMIN-NEXT: fle.s a0, fa4, fa5 458; RV64IZFBFMIN-NEXT: beqz a0, .LBB12_2 459; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 460; RV64IZFBFMIN-NEXT: ret 461; RV64IZFBFMIN-NEXT: .LBB12_2: # %if.then 462; RV64IZFBFMIN-NEXT: addi sp, sp, -16 463; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 464; RV64IZFBFMIN-NEXT: call abort 465 %1 = fcmp ult bfloat %a, %b 466 br i1 %1, label %if.then, label %if.else 467if.else: 468 ret void 469if.then: 470 tail call void @abort() 471 unreachable 472} 473 474define void @br_fcmp_ule(bfloat %a, bfloat %b) nounwind { 475; RV32IZFBFMIN-LABEL: br_fcmp_ule: 476; RV32IZFBFMIN: # %bb.0: 477; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 478; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 479; RV32IZFBFMIN-NEXT: flt.s a0, fa4, fa5 480; RV32IZFBFMIN-NEXT: beqz a0, .LBB13_2 481; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 482; RV32IZFBFMIN-NEXT: ret 483; RV32IZFBFMIN-NEXT: .LBB13_2: # %if.then 484; RV32IZFBFMIN-NEXT: addi sp, sp, -16 485; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 486; RV32IZFBFMIN-NEXT: call abort 487; 488; RV64IZFBFMIN-LABEL: br_fcmp_ule: 489; RV64IZFBFMIN: # %bb.0: 490; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0 491; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa1 492; RV64IZFBFMIN-NEXT: flt.s a0, fa4, fa5 493; RV64IZFBFMIN-NEXT: beqz a0, .LBB13_2 494; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 495; RV64IZFBFMIN-NEXT: ret 496; RV64IZFBFMIN-NEXT: .LBB13_2: # %if.then 497; RV64IZFBFMIN-NEXT: addi sp, sp, -16 498; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 499; RV64IZFBFMIN-NEXT: call abort 500 %1 = fcmp ule bfloat %a, %b 501 br i1 %1, label %if.then, label %if.else 502if.else: 503 ret void 504if.then: 505 tail call void @abort() 506 unreachable 507} 508 509define void @br_fcmp_une(bfloat %a, bfloat %b) nounwind { 510; RV32IZFBFMIN-LABEL: br_fcmp_une: 511; RV32IZFBFMIN: # %bb.0: 512; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 513; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 514; RV32IZFBFMIN-NEXT: feq.s a0, fa4, fa5 515; RV32IZFBFMIN-NEXT: beqz a0, .LBB14_2 516; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 517; RV32IZFBFMIN-NEXT: ret 518; RV32IZFBFMIN-NEXT: .LBB14_2: # %if.then 519; RV32IZFBFMIN-NEXT: addi sp, sp, -16 520; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 521; RV32IZFBFMIN-NEXT: call abort 522; 523; RV64IZFBFMIN-LABEL: br_fcmp_une: 524; RV64IZFBFMIN: # %bb.0: 525; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 526; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 527; RV64IZFBFMIN-NEXT: feq.s a0, fa4, fa5 528; RV64IZFBFMIN-NEXT: beqz a0, .LBB14_2 529; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 530; RV64IZFBFMIN-NEXT: ret 531; RV64IZFBFMIN-NEXT: .LBB14_2: # %if.then 532; RV64IZFBFMIN-NEXT: addi sp, sp, -16 533; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 534; RV64IZFBFMIN-NEXT: call abort 535 %1 = fcmp une bfloat %a, %b 536 br i1 %1, label %if.then, label %if.else 537if.else: 538 ret void 539if.then: 540 tail call void @abort() 541 unreachable 542} 543 544define void @br_fcmp_uno(bfloat %a, bfloat %b) nounwind { 545; RV32IZFBFMIN-LABEL: br_fcmp_uno: 546; RV32IZFBFMIN: # %bb.0: 547; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 548; RV32IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 549; RV32IZFBFMIN-NEXT: feq.s a0, fa5, fa5 550; RV32IZFBFMIN-NEXT: feq.s a1, fa4, fa4 551; RV32IZFBFMIN-NEXT: and a0, a1, a0 552; RV32IZFBFMIN-NEXT: beqz a0, .LBB15_2 553; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 554; RV32IZFBFMIN-NEXT: ret 555; RV32IZFBFMIN-NEXT: .LBB15_2: # %if.then 556; RV32IZFBFMIN-NEXT: addi sp, sp, -16 557; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 558; RV32IZFBFMIN-NEXT: call abort 559; 560; RV64IZFBFMIN-LABEL: br_fcmp_uno: 561; RV64IZFBFMIN: # %bb.0: 562; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa1 563; RV64IZFBFMIN-NEXT: fcvt.s.bf16 fa4, fa0 564; RV64IZFBFMIN-NEXT: feq.s a0, fa5, fa5 565; RV64IZFBFMIN-NEXT: feq.s a1, fa4, fa4 566; RV64IZFBFMIN-NEXT: and a0, a1, a0 567; RV64IZFBFMIN-NEXT: beqz a0, .LBB15_2 568; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 569; RV64IZFBFMIN-NEXT: ret 570; RV64IZFBFMIN-NEXT: .LBB15_2: # %if.then 571; RV64IZFBFMIN-NEXT: addi sp, sp, -16 572; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 573; RV64IZFBFMIN-NEXT: call abort 574 %1 = fcmp uno bfloat %a, %b 575 br i1 %1, label %if.then, label %if.else 576if.else: 577 ret void 578if.then: 579 tail call void @abort() 580 unreachable 581} 582 583define void @br_fcmp_true(bfloat %a, bfloat %b) nounwind { 584; RV32IZFBFMIN-LABEL: br_fcmp_true: 585; RV32IZFBFMIN: # %bb.0: 586; RV32IZFBFMIN-NEXT: li a0, 1 587; RV32IZFBFMIN-NEXT: bnez a0, .LBB16_2 588; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else 589; RV32IZFBFMIN-NEXT: ret 590; RV32IZFBFMIN-NEXT: .LBB16_2: # %if.then 591; RV32IZFBFMIN-NEXT: addi sp, sp, -16 592; RV32IZFBFMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 593; RV32IZFBFMIN-NEXT: call abort 594; 595; RV64IZFBFMIN-LABEL: br_fcmp_true: 596; RV64IZFBFMIN: # %bb.0: 597; RV64IZFBFMIN-NEXT: li a0, 1 598; RV64IZFBFMIN-NEXT: bnez a0, .LBB16_2 599; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else 600; RV64IZFBFMIN-NEXT: ret 601; RV64IZFBFMIN-NEXT: .LBB16_2: # %if.then 602; RV64IZFBFMIN-NEXT: addi sp, sp, -16 603; RV64IZFBFMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 604; RV64IZFBFMIN-NEXT: call abort 605 %1 = fcmp true bfloat %a, %b 606 br i1 %1, label %if.then, label %if.else 607if.else: 608 ret void 609if.then: 610 tail call void @abort() 611 unreachable 612} 613