1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \ 3; RUN: -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECKIZFH,RV32IZFH %s 4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \ 5; RUN: -target-abi lp64f < %s | FileCheck -check-prefixes=CHECKIZFH,RV64IZFH %s 6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -verify-machineinstrs \ 7; RUN: -target-abi ilp32d < %s | FileCheck -check-prefix=RV32IDZFH %s 8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -verify-machineinstrs \ 9; RUN: -target-abi lp64d < %s | FileCheck -check-prefix=RV64IDZFH %s 10; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \ 11; RUN: -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECKIZHINX,RV32IZHINX %s 12; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \ 13; RUN: -target-abi lp64 < %s | FileCheck -check-prefixes=CHECKIZHINX,RV64IZHINX %s 14; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinx -verify-machineinstrs \ 15; RUN: -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECKIZDINXZHINX,RV32IZDINXZHINX %s 16; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinx -verify-machineinstrs \ 17; RUN: -target-abi lp64 < %s | FileCheck -check-prefixes=CHECKIZDINXZHINX,RV64IZDINXZHINX %s 18; RUN: llc -mtriple=riscv32 -verify-machineinstrs \ 19; RUN: < %s | FileCheck -check-prefix=RV32I %s 20; RUN: llc -mtriple=riscv64 -verify-machineinstrs \ 21; RUN: < %s | FileCheck -check-prefix=RV64I %s 22; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs \ 23; RUN: < %s | FileCheck %s -check-prefix=RV32ID-ILP32 24; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs \ 25; RUN: < %s | FileCheck %s -check-prefix=RV64ID-LP64 26; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32d -verify-machineinstrs \ 27; RUN: < %s | FileCheck %s -check-prefix=RV32ID 28; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64d -verify-machineinstrs \ 29; RUN: < %s | FileCheck %s -check-prefix=RV64ID 30; RUN: llc -mtriple=riscv32 -mattr=+zfhmin -verify-machineinstrs \ 31; RUN: -target-abi ilp32f < %s | FileCheck -check-prefixes=CHECK32-IZFHMIN,RV32IFZFHMIN %s 32; RUN: llc -mtriple=riscv64 -mattr=+zfhmin -verify-machineinstrs \ 33; RUN: -target-abi lp64f < %s | FileCheck -check-prefixes=CHECK64-IZFHMIN,RV64IFZFHMIN %s 34; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin -verify-machineinstrs \ 35; RUN: -target-abi ilp32d < %s | FileCheck -check-prefixes=CHECK32-IZFHMIN,RV32IDZFHMIN %s 36; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin -verify-machineinstrs \ 37; RUN: -target-abi lp64d < %s | FileCheck -check-prefixes=CHECK64-IZFHMIN,RV64IDZFHMIN %s 38; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \ 39; RUN: -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECK32-IZHINXMIN %s 40; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \ 41; RUN: -target-abi lp64 < %s | FileCheck -check-prefixes=CHECK64-IZHINXMIN %s 42; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinxmin -verify-machineinstrs \ 43; RUN: -target-abi ilp32 < %s | FileCheck -check-prefixes=CHECK32-IZDINXZHINXMIN %s 44; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinxmin -verify-machineinstrs \ 45; RUN: -target-abi lp64 < %s | FileCheck -check-prefixes=CHECK64-IZDINXZHINXMIN %s 46 47define i16 @fcvt_si_h(half %a) nounwind { 48; RV32IZFH-LABEL: fcvt_si_h: 49; RV32IZFH: # %bb.0: 50; RV32IZFH-NEXT: fcvt.w.h a0, fa0, rtz 51; RV32IZFH-NEXT: ret 52; 53; RV64IZFH-LABEL: fcvt_si_h: 54; RV64IZFH: # %bb.0: 55; RV64IZFH-NEXT: fcvt.l.h a0, fa0, rtz 56; RV64IZFH-NEXT: ret 57; 58; RV32IDZFH-LABEL: fcvt_si_h: 59; RV32IDZFH: # %bb.0: 60; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 61; RV32IDZFH-NEXT: ret 62; 63; RV64IDZFH-LABEL: fcvt_si_h: 64; RV64IDZFH: # %bb.0: 65; RV64IDZFH-NEXT: fcvt.l.h a0, fa0, rtz 66; RV64IDZFH-NEXT: ret 67; 68; RV32IZHINX-LABEL: fcvt_si_h: 69; RV32IZHINX: # %bb.0: 70; RV32IZHINX-NEXT: fcvt.w.h a0, a0, rtz 71; RV32IZHINX-NEXT: ret 72; 73; RV64IZHINX-LABEL: fcvt_si_h: 74; RV64IZHINX: # %bb.0: 75; RV64IZHINX-NEXT: fcvt.l.h a0, a0, rtz 76; RV64IZHINX-NEXT: ret 77; 78; RV32IZDINXZHINX-LABEL: fcvt_si_h: 79; RV32IZDINXZHINX: # %bb.0: 80; RV32IZDINXZHINX-NEXT: fcvt.w.h a0, a0, rtz 81; RV32IZDINXZHINX-NEXT: ret 82; 83; RV64IZDINXZHINX-LABEL: fcvt_si_h: 84; RV64IZDINXZHINX: # %bb.0: 85; RV64IZDINXZHINX-NEXT: fcvt.l.h a0, a0, rtz 86; RV64IZDINXZHINX-NEXT: ret 87; 88; RV32I-LABEL: fcvt_si_h: 89; RV32I: # %bb.0: 90; RV32I-NEXT: addi sp, sp, -16 91; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 92; RV32I-NEXT: slli a0, a0, 16 93; RV32I-NEXT: srli a0, a0, 16 94; RV32I-NEXT: call __extendhfsf2 95; RV32I-NEXT: call __fixsfsi 96; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 97; RV32I-NEXT: addi sp, sp, 16 98; RV32I-NEXT: ret 99; 100; RV64I-LABEL: fcvt_si_h: 101; RV64I: # %bb.0: 102; RV64I-NEXT: addi sp, sp, -16 103; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 104; RV64I-NEXT: slli a0, a0, 48 105; RV64I-NEXT: srli a0, a0, 48 106; RV64I-NEXT: call __extendhfsf2 107; RV64I-NEXT: call __fixsfdi 108; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 109; RV64I-NEXT: addi sp, sp, 16 110; RV64I-NEXT: ret 111; 112; RV32ID-ILP32-LABEL: fcvt_si_h: 113; RV32ID-ILP32: # %bb.0: 114; RV32ID-ILP32-NEXT: addi sp, sp, -16 115; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 116; RV32ID-ILP32-NEXT: call __extendhfsf2 117; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 118; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 119; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 120; RV32ID-ILP32-NEXT: addi sp, sp, 16 121; RV32ID-ILP32-NEXT: ret 122; 123; RV64ID-LP64-LABEL: fcvt_si_h: 124; RV64ID-LP64: # %bb.0: 125; RV64ID-LP64-NEXT: addi sp, sp, -16 126; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 127; RV64ID-LP64-NEXT: call __extendhfsf2 128; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 129; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 130; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 131; RV64ID-LP64-NEXT: addi sp, sp, 16 132; RV64ID-LP64-NEXT: ret 133; 134; RV32ID-LABEL: fcvt_si_h: 135; RV32ID: # %bb.0: 136; RV32ID-NEXT: addi sp, sp, -16 137; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 138; RV32ID-NEXT: call __extendhfsf2 139; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 140; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 141; RV32ID-NEXT: addi sp, sp, 16 142; RV32ID-NEXT: ret 143; 144; RV64ID-LABEL: fcvt_si_h: 145; RV64ID: # %bb.0: 146; RV64ID-NEXT: addi sp, sp, -16 147; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 148; RV64ID-NEXT: call __extendhfsf2 149; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 150; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 151; RV64ID-NEXT: addi sp, sp, 16 152; RV64ID-NEXT: ret 153; 154; CHECK32-IZFHMIN-LABEL: fcvt_si_h: 155; CHECK32-IZFHMIN: # %bb.0: 156; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 157; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 158; CHECK32-IZFHMIN-NEXT: ret 159; 160; CHECK64-IZFHMIN-LABEL: fcvt_si_h: 161; CHECK64-IZFHMIN: # %bb.0: 162; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 163; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 164; CHECK64-IZFHMIN-NEXT: ret 165; 166; CHECK32-IZHINXMIN-LABEL: fcvt_si_h: 167; CHECK32-IZHINXMIN: # %bb.0: 168; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 169; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 170; CHECK32-IZHINXMIN-NEXT: ret 171; 172; CHECK64-IZHINXMIN-LABEL: fcvt_si_h: 173; CHECK64-IZHINXMIN: # %bb.0: 174; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 175; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 176; CHECK64-IZHINXMIN-NEXT: ret 177; 178; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_si_h: 179; CHECK32-IZDINXZHINXMIN: # %bb.0: 180; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 181; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 182; CHECK32-IZDINXZHINXMIN-NEXT: ret 183; 184; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_si_h: 185; CHECK64-IZDINXZHINXMIN: # %bb.0: 186; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 187; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 188; CHECK64-IZDINXZHINXMIN-NEXT: ret 189 %1 = fptosi half %a to i16 190 ret i16 %1 191} 192 193define i16 @fcvt_si_h_sat(half %a) nounwind { 194; RV32IZFH-LABEL: fcvt_si_h_sat: 195; RV32IZFH: # %bb.0: # %start 196; RV32IZFH-NEXT: fcvt.s.h fa5, fa0 197; RV32IZFH-NEXT: lui a0, %hi(.LCPI1_0) 198; RV32IZFH-NEXT: feq.s a1, fa5, fa5 199; RV32IZFH-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 200; RV32IZFH-NEXT: lui a0, 815104 201; RV32IZFH-NEXT: fmv.w.x fa3, a0 202; RV32IZFH-NEXT: fmax.s fa5, fa5, fa3 203; RV32IZFH-NEXT: neg a0, a1 204; RV32IZFH-NEXT: fmin.s fa5, fa5, fa4 205; RV32IZFH-NEXT: fcvt.w.s a1, fa5, rtz 206; RV32IZFH-NEXT: and a0, a0, a1 207; RV32IZFH-NEXT: ret 208; 209; RV64IZFH-LABEL: fcvt_si_h_sat: 210; RV64IZFH: # %bb.0: # %start 211; RV64IZFH-NEXT: fcvt.s.h fa5, fa0 212; RV64IZFH-NEXT: lui a0, %hi(.LCPI1_0) 213; RV64IZFH-NEXT: feq.s a1, fa5, fa5 214; RV64IZFH-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 215; RV64IZFH-NEXT: lui a0, 815104 216; RV64IZFH-NEXT: fmv.w.x fa3, a0 217; RV64IZFH-NEXT: fmax.s fa5, fa5, fa3 218; RV64IZFH-NEXT: neg a0, a1 219; RV64IZFH-NEXT: fmin.s fa5, fa5, fa4 220; RV64IZFH-NEXT: fcvt.l.s a1, fa5, rtz 221; RV64IZFH-NEXT: and a0, a0, a1 222; RV64IZFH-NEXT: ret 223; 224; RV32IDZFH-LABEL: fcvt_si_h_sat: 225; RV32IDZFH: # %bb.0: # %start 226; RV32IDZFH-NEXT: fcvt.s.h fa5, fa0 227; RV32IDZFH-NEXT: lui a0, %hi(.LCPI1_0) 228; RV32IDZFH-NEXT: feq.s a1, fa5, fa5 229; RV32IDZFH-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 230; RV32IDZFH-NEXT: lui a0, 815104 231; RV32IDZFH-NEXT: fmv.w.x fa3, a0 232; RV32IDZFH-NEXT: fmax.s fa5, fa5, fa3 233; RV32IDZFH-NEXT: neg a0, a1 234; RV32IDZFH-NEXT: fmin.s fa5, fa5, fa4 235; RV32IDZFH-NEXT: fcvt.w.s a1, fa5, rtz 236; RV32IDZFH-NEXT: and a0, a0, a1 237; RV32IDZFH-NEXT: ret 238; 239; RV64IDZFH-LABEL: fcvt_si_h_sat: 240; RV64IDZFH: # %bb.0: # %start 241; RV64IDZFH-NEXT: fcvt.s.h fa5, fa0 242; RV64IDZFH-NEXT: lui a0, %hi(.LCPI1_0) 243; RV64IDZFH-NEXT: feq.s a1, fa5, fa5 244; RV64IDZFH-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 245; RV64IDZFH-NEXT: lui a0, 815104 246; RV64IDZFH-NEXT: fmv.w.x fa3, a0 247; RV64IDZFH-NEXT: fmax.s fa5, fa5, fa3 248; RV64IDZFH-NEXT: neg a0, a1 249; RV64IDZFH-NEXT: fmin.s fa5, fa5, fa4 250; RV64IDZFH-NEXT: fcvt.l.s a1, fa5, rtz 251; RV64IDZFH-NEXT: and a0, a0, a1 252; RV64IDZFH-NEXT: ret 253; 254; RV32IZHINX-LABEL: fcvt_si_h_sat: 255; RV32IZHINX: # %bb.0: # %start 256; RV32IZHINX-NEXT: fcvt.s.h a0, a0 257; RV32IZHINX-NEXT: lui a1, 815104 258; RV32IZHINX-NEXT: lui a2, 290816 259; RV32IZHINX-NEXT: fmax.s a1, a0, a1 260; RV32IZHINX-NEXT: feq.s a0, a0, a0 261; RV32IZHINX-NEXT: addi a2, a2, -512 262; RV32IZHINX-NEXT: neg a0, a0 263; RV32IZHINX-NEXT: fmin.s a1, a1, a2 264; RV32IZHINX-NEXT: fcvt.w.s a1, a1, rtz 265; RV32IZHINX-NEXT: and a0, a0, a1 266; RV32IZHINX-NEXT: ret 267; 268; RV64IZHINX-LABEL: fcvt_si_h_sat: 269; RV64IZHINX: # %bb.0: # %start 270; RV64IZHINX-NEXT: fcvt.s.h a0, a0 271; RV64IZHINX-NEXT: lui a1, 815104 272; RV64IZHINX-NEXT: lui a2, 290816 273; RV64IZHINX-NEXT: fmax.s a1, a0, a1 274; RV64IZHINX-NEXT: feq.s a0, a0, a0 275; RV64IZHINX-NEXT: addiw a2, a2, -512 276; RV64IZHINX-NEXT: neg a0, a0 277; RV64IZHINX-NEXT: fmin.s a1, a1, a2 278; RV64IZHINX-NEXT: fcvt.l.s a1, a1, rtz 279; RV64IZHINX-NEXT: and a0, a0, a1 280; RV64IZHINX-NEXT: ret 281; 282; RV32IZDINXZHINX-LABEL: fcvt_si_h_sat: 283; RV32IZDINXZHINX: # %bb.0: # %start 284; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 285; RV32IZDINXZHINX-NEXT: lui a1, 815104 286; RV32IZDINXZHINX-NEXT: lui a2, 290816 287; RV32IZDINXZHINX-NEXT: fmax.s a1, a0, a1 288; RV32IZDINXZHINX-NEXT: feq.s a0, a0, a0 289; RV32IZDINXZHINX-NEXT: addi a2, a2, -512 290; RV32IZDINXZHINX-NEXT: neg a0, a0 291; RV32IZDINXZHINX-NEXT: fmin.s a1, a1, a2 292; RV32IZDINXZHINX-NEXT: fcvt.w.s a1, a1, rtz 293; RV32IZDINXZHINX-NEXT: and a0, a0, a1 294; RV32IZDINXZHINX-NEXT: ret 295; 296; RV64IZDINXZHINX-LABEL: fcvt_si_h_sat: 297; RV64IZDINXZHINX: # %bb.0: # %start 298; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 299; RV64IZDINXZHINX-NEXT: lui a1, 815104 300; RV64IZDINXZHINX-NEXT: lui a2, 290816 301; RV64IZDINXZHINX-NEXT: fmax.s a1, a0, a1 302; RV64IZDINXZHINX-NEXT: feq.s a0, a0, a0 303; RV64IZDINXZHINX-NEXT: addiw a2, a2, -512 304; RV64IZDINXZHINX-NEXT: neg a0, a0 305; RV64IZDINXZHINX-NEXT: fmin.s a1, a1, a2 306; RV64IZDINXZHINX-NEXT: fcvt.l.s a1, a1, rtz 307; RV64IZDINXZHINX-NEXT: and a0, a0, a1 308; RV64IZDINXZHINX-NEXT: ret 309; 310; RV32I-LABEL: fcvt_si_h_sat: 311; RV32I: # %bb.0: # %start 312; RV32I-NEXT: addi sp, sp, -16 313; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 314; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 315; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 316; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 317; RV32I-NEXT: slli a0, a0, 16 318; RV32I-NEXT: srli a0, a0, 16 319; RV32I-NEXT: call __extendhfsf2 320; RV32I-NEXT: mv s0, a0 321; RV32I-NEXT: lui a1, 815104 322; RV32I-NEXT: call __gesf2 323; RV32I-NEXT: mv s2, a0 324; RV32I-NEXT: mv a0, s0 325; RV32I-NEXT: call __fixsfsi 326; RV32I-NEXT: mv s1, a0 327; RV32I-NEXT: bgez s2, .LBB1_2 328; RV32I-NEXT: # %bb.1: # %start 329; RV32I-NEXT: lui s1, 1048568 330; RV32I-NEXT: .LBB1_2: # %start 331; RV32I-NEXT: lui a0, 290816 332; RV32I-NEXT: addi a1, a0, -512 333; RV32I-NEXT: mv a0, s0 334; RV32I-NEXT: call __gtsf2 335; RV32I-NEXT: blez a0, .LBB1_4 336; RV32I-NEXT: # %bb.3: # %start 337; RV32I-NEXT: lui s1, 8 338; RV32I-NEXT: addi s1, s1, -1 339; RV32I-NEXT: .LBB1_4: # %start 340; RV32I-NEXT: mv a0, s0 341; RV32I-NEXT: mv a1, s0 342; RV32I-NEXT: call __unordsf2 343; RV32I-NEXT: snez a0, a0 344; RV32I-NEXT: addi a0, a0, -1 345; RV32I-NEXT: and a0, a0, s1 346; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 347; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 348; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 349; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 350; RV32I-NEXT: addi sp, sp, 16 351; RV32I-NEXT: ret 352; 353; RV64I-LABEL: fcvt_si_h_sat: 354; RV64I: # %bb.0: # %start 355; RV64I-NEXT: addi sp, sp, -32 356; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 357; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 358; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 359; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 360; RV64I-NEXT: slli a0, a0, 48 361; RV64I-NEXT: srli a0, a0, 48 362; RV64I-NEXT: call __extendhfsf2 363; RV64I-NEXT: mv s0, a0 364; RV64I-NEXT: lui a1, 815104 365; RV64I-NEXT: call __gesf2 366; RV64I-NEXT: mv s2, a0 367; RV64I-NEXT: mv a0, s0 368; RV64I-NEXT: call __fixsfdi 369; RV64I-NEXT: mv s1, a0 370; RV64I-NEXT: bgez s2, .LBB1_2 371; RV64I-NEXT: # %bb.1: # %start 372; RV64I-NEXT: lui s1, 1048568 373; RV64I-NEXT: .LBB1_2: # %start 374; RV64I-NEXT: lui a0, 290816 375; RV64I-NEXT: addiw a1, a0, -512 376; RV64I-NEXT: mv a0, s0 377; RV64I-NEXT: call __gtsf2 378; RV64I-NEXT: blez a0, .LBB1_4 379; RV64I-NEXT: # %bb.3: # %start 380; RV64I-NEXT: lui s1, 8 381; RV64I-NEXT: addiw s1, s1, -1 382; RV64I-NEXT: .LBB1_4: # %start 383; RV64I-NEXT: mv a0, s0 384; RV64I-NEXT: mv a1, s0 385; RV64I-NEXT: call __unordsf2 386; RV64I-NEXT: snez a0, a0 387; RV64I-NEXT: addi a0, a0, -1 388; RV64I-NEXT: and a0, a0, s1 389; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 390; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 391; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 392; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 393; RV64I-NEXT: addi sp, sp, 32 394; RV64I-NEXT: ret 395; 396; RV32ID-ILP32-LABEL: fcvt_si_h_sat: 397; RV32ID-ILP32: # %bb.0: # %start 398; RV32ID-ILP32-NEXT: addi sp, sp, -16 399; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 400; RV32ID-ILP32-NEXT: call __extendhfsf2 401; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 402; RV32ID-ILP32-NEXT: lui a0, %hi(.LCPI1_0) 403; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 404; RV32ID-ILP32-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 405; RV32ID-ILP32-NEXT: lui a0, 815104 406; RV32ID-ILP32-NEXT: fmv.w.x fa3, a0 407; RV32ID-ILP32-NEXT: fmax.s fa5, fa5, fa3 408; RV32ID-ILP32-NEXT: neg a0, a1 409; RV32ID-ILP32-NEXT: fmin.s fa5, fa5, fa4 410; RV32ID-ILP32-NEXT: fcvt.w.s a1, fa5, rtz 411; RV32ID-ILP32-NEXT: and a0, a0, a1 412; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 413; RV32ID-ILP32-NEXT: addi sp, sp, 16 414; RV32ID-ILP32-NEXT: ret 415; 416; RV64ID-LP64-LABEL: fcvt_si_h_sat: 417; RV64ID-LP64: # %bb.0: # %start 418; RV64ID-LP64-NEXT: addi sp, sp, -16 419; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 420; RV64ID-LP64-NEXT: call __extendhfsf2 421; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 422; RV64ID-LP64-NEXT: lui a0, %hi(.LCPI1_0) 423; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 424; RV64ID-LP64-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 425; RV64ID-LP64-NEXT: lui a0, 815104 426; RV64ID-LP64-NEXT: fmv.w.x fa3, a0 427; RV64ID-LP64-NEXT: fmax.s fa5, fa5, fa3 428; RV64ID-LP64-NEXT: neg a0, a1 429; RV64ID-LP64-NEXT: fmin.s fa5, fa5, fa4 430; RV64ID-LP64-NEXT: fcvt.l.s a1, fa5, rtz 431; RV64ID-LP64-NEXT: and a0, a0, a1 432; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 433; RV64ID-LP64-NEXT: addi sp, sp, 16 434; RV64ID-LP64-NEXT: ret 435; 436; RV32ID-LABEL: fcvt_si_h_sat: 437; RV32ID: # %bb.0: # %start 438; RV32ID-NEXT: addi sp, sp, -16 439; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 440; RV32ID-NEXT: call __extendhfsf2 441; RV32ID-NEXT: feq.s a0, fa0, fa0 442; RV32ID-NEXT: lui a1, %hi(.LCPI1_0) 443; RV32ID-NEXT: flw fa5, %lo(.LCPI1_0)(a1) 444; RV32ID-NEXT: lui a1, 815104 445; RV32ID-NEXT: fmv.w.x fa4, a1 446; RV32ID-NEXT: fmax.s fa4, fa0, fa4 447; RV32ID-NEXT: neg a0, a0 448; RV32ID-NEXT: fmin.s fa5, fa4, fa5 449; RV32ID-NEXT: fcvt.w.s a1, fa5, rtz 450; RV32ID-NEXT: and a0, a0, a1 451; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 452; RV32ID-NEXT: addi sp, sp, 16 453; RV32ID-NEXT: ret 454; 455; RV64ID-LABEL: fcvt_si_h_sat: 456; RV64ID: # %bb.0: # %start 457; RV64ID-NEXT: addi sp, sp, -16 458; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 459; RV64ID-NEXT: call __extendhfsf2 460; RV64ID-NEXT: feq.s a0, fa0, fa0 461; RV64ID-NEXT: lui a1, %hi(.LCPI1_0) 462; RV64ID-NEXT: flw fa5, %lo(.LCPI1_0)(a1) 463; RV64ID-NEXT: lui a1, 815104 464; RV64ID-NEXT: fmv.w.x fa4, a1 465; RV64ID-NEXT: fmax.s fa4, fa0, fa4 466; RV64ID-NEXT: neg a0, a0 467; RV64ID-NEXT: fmin.s fa5, fa4, fa5 468; RV64ID-NEXT: fcvt.l.s a1, fa5, rtz 469; RV64ID-NEXT: and a0, a0, a1 470; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 471; RV64ID-NEXT: addi sp, sp, 16 472; RV64ID-NEXT: ret 473; 474; CHECK32-IZFHMIN-LABEL: fcvt_si_h_sat: 475; CHECK32-IZFHMIN: # %bb.0: # %start 476; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 477; CHECK32-IZFHMIN-NEXT: lui a0, %hi(.LCPI1_0) 478; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 479; CHECK32-IZFHMIN-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 480; CHECK32-IZFHMIN-NEXT: lui a0, 815104 481; CHECK32-IZFHMIN-NEXT: fmv.w.x fa3, a0 482; CHECK32-IZFHMIN-NEXT: fmax.s fa5, fa5, fa3 483; CHECK32-IZFHMIN-NEXT: neg a0, a1 484; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 485; CHECK32-IZFHMIN-NEXT: fcvt.w.s a1, fa5, rtz 486; CHECK32-IZFHMIN-NEXT: and a0, a0, a1 487; CHECK32-IZFHMIN-NEXT: ret 488; 489; CHECK64-IZFHMIN-LABEL: fcvt_si_h_sat: 490; CHECK64-IZFHMIN: # %bb.0: # %start 491; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 492; CHECK64-IZFHMIN-NEXT: lui a0, %hi(.LCPI1_0) 493; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 494; CHECK64-IZFHMIN-NEXT: flw fa4, %lo(.LCPI1_0)(a0) 495; CHECK64-IZFHMIN-NEXT: lui a0, 815104 496; CHECK64-IZFHMIN-NEXT: fmv.w.x fa3, a0 497; CHECK64-IZFHMIN-NEXT: fmax.s fa5, fa5, fa3 498; CHECK64-IZFHMIN-NEXT: neg a0, a1 499; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 500; CHECK64-IZFHMIN-NEXT: fcvt.l.s a1, fa5, rtz 501; CHECK64-IZFHMIN-NEXT: and a0, a0, a1 502; CHECK64-IZFHMIN-NEXT: ret 503; 504; CHECK32-IZHINXMIN-LABEL: fcvt_si_h_sat: 505; CHECK32-IZHINXMIN: # %bb.0: # %start 506; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 507; CHECK32-IZHINXMIN-NEXT: lui a1, 815104 508; CHECK32-IZHINXMIN-NEXT: lui a2, 290816 509; CHECK32-IZHINXMIN-NEXT: fmax.s a1, a0, a1 510; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 511; CHECK32-IZHINXMIN-NEXT: addi a2, a2, -512 512; CHECK32-IZHINXMIN-NEXT: neg a0, a0 513; CHECK32-IZHINXMIN-NEXT: fmin.s a1, a1, a2 514; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 515; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 516; CHECK32-IZHINXMIN-NEXT: ret 517; 518; CHECK64-IZHINXMIN-LABEL: fcvt_si_h_sat: 519; CHECK64-IZHINXMIN: # %bb.0: # %start 520; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 521; CHECK64-IZHINXMIN-NEXT: lui a1, 815104 522; CHECK64-IZHINXMIN-NEXT: lui a2, 290816 523; CHECK64-IZHINXMIN-NEXT: fmax.s a1, a0, a1 524; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 525; CHECK64-IZHINXMIN-NEXT: addiw a2, a2, -512 526; CHECK64-IZHINXMIN-NEXT: neg a0, a0 527; CHECK64-IZHINXMIN-NEXT: fmin.s a1, a1, a2 528; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 529; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 530; CHECK64-IZHINXMIN-NEXT: ret 531; 532; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_si_h_sat: 533; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 534; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 535; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 815104 536; CHECK32-IZDINXZHINXMIN-NEXT: lui a2, 290816 537; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 538; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 539; CHECK32-IZDINXZHINXMIN-NEXT: addi a2, a2, -512 540; CHECK32-IZDINXZHINXMIN-NEXT: neg a0, a0 541; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 542; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 543; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 544; CHECK32-IZDINXZHINXMIN-NEXT: ret 545; 546; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_si_h_sat: 547; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 548; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 549; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 815104 550; CHECK64-IZDINXZHINXMIN-NEXT: lui a2, 290816 551; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 552; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 553; CHECK64-IZDINXZHINXMIN-NEXT: addiw a2, a2, -512 554; CHECK64-IZDINXZHINXMIN-NEXT: neg a0, a0 555; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 556; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 557; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 558; CHECK64-IZDINXZHINXMIN-NEXT: ret 559start: 560 %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a) 561 ret i16 %0 562} 563declare i16 @llvm.fptosi.sat.i16.f16(half) 564 565define i16 @fcvt_ui_h(half %a) nounwind { 566; RV32IZFH-LABEL: fcvt_ui_h: 567; RV32IZFH: # %bb.0: 568; RV32IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 569; RV32IZFH-NEXT: ret 570; 571; RV64IZFH-LABEL: fcvt_ui_h: 572; RV64IZFH: # %bb.0: 573; RV64IZFH-NEXT: fcvt.lu.h a0, fa0, rtz 574; RV64IZFH-NEXT: ret 575; 576; RV32IDZFH-LABEL: fcvt_ui_h: 577; RV32IDZFH: # %bb.0: 578; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 579; RV32IDZFH-NEXT: ret 580; 581; RV64IDZFH-LABEL: fcvt_ui_h: 582; RV64IDZFH: # %bb.0: 583; RV64IDZFH-NEXT: fcvt.lu.h a0, fa0, rtz 584; RV64IDZFH-NEXT: ret 585; 586; RV32IZHINX-LABEL: fcvt_ui_h: 587; RV32IZHINX: # %bb.0: 588; RV32IZHINX-NEXT: fcvt.wu.h a0, a0, rtz 589; RV32IZHINX-NEXT: ret 590; 591; RV64IZHINX-LABEL: fcvt_ui_h: 592; RV64IZHINX: # %bb.0: 593; RV64IZHINX-NEXT: fcvt.lu.h a0, a0, rtz 594; RV64IZHINX-NEXT: ret 595; 596; RV32IZDINXZHINX-LABEL: fcvt_ui_h: 597; RV32IZDINXZHINX: # %bb.0: 598; RV32IZDINXZHINX-NEXT: fcvt.wu.h a0, a0, rtz 599; RV32IZDINXZHINX-NEXT: ret 600; 601; RV64IZDINXZHINX-LABEL: fcvt_ui_h: 602; RV64IZDINXZHINX: # %bb.0: 603; RV64IZDINXZHINX-NEXT: fcvt.lu.h a0, a0, rtz 604; RV64IZDINXZHINX-NEXT: ret 605; 606; RV32I-LABEL: fcvt_ui_h: 607; RV32I: # %bb.0: 608; RV32I-NEXT: addi sp, sp, -16 609; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 610; RV32I-NEXT: slli a0, a0, 16 611; RV32I-NEXT: srli a0, a0, 16 612; RV32I-NEXT: call __extendhfsf2 613; RV32I-NEXT: call __fixunssfsi 614; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 615; RV32I-NEXT: addi sp, sp, 16 616; RV32I-NEXT: ret 617; 618; RV64I-LABEL: fcvt_ui_h: 619; RV64I: # %bb.0: 620; RV64I-NEXT: addi sp, sp, -16 621; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 622; RV64I-NEXT: slli a0, a0, 48 623; RV64I-NEXT: srli a0, a0, 48 624; RV64I-NEXT: call __extendhfsf2 625; RV64I-NEXT: call __fixunssfdi 626; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 627; RV64I-NEXT: addi sp, sp, 16 628; RV64I-NEXT: ret 629; 630; RV32ID-ILP32-LABEL: fcvt_ui_h: 631; RV32ID-ILP32: # %bb.0: 632; RV32ID-ILP32-NEXT: addi sp, sp, -16 633; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 634; RV32ID-ILP32-NEXT: call __extendhfsf2 635; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 636; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 637; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 638; RV32ID-ILP32-NEXT: addi sp, sp, 16 639; RV32ID-ILP32-NEXT: ret 640; 641; RV64ID-LP64-LABEL: fcvt_ui_h: 642; RV64ID-LP64: # %bb.0: 643; RV64ID-LP64-NEXT: addi sp, sp, -16 644; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 645; RV64ID-LP64-NEXT: call __extendhfsf2 646; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 647; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 648; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 649; RV64ID-LP64-NEXT: addi sp, sp, 16 650; RV64ID-LP64-NEXT: ret 651; 652; RV32ID-LABEL: fcvt_ui_h: 653; RV32ID: # %bb.0: 654; RV32ID-NEXT: addi sp, sp, -16 655; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 656; RV32ID-NEXT: call __extendhfsf2 657; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 658; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 659; RV32ID-NEXT: addi sp, sp, 16 660; RV32ID-NEXT: ret 661; 662; RV64ID-LABEL: fcvt_ui_h: 663; RV64ID: # %bb.0: 664; RV64ID-NEXT: addi sp, sp, -16 665; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 666; RV64ID-NEXT: call __extendhfsf2 667; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 668; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 669; RV64ID-NEXT: addi sp, sp, 16 670; RV64ID-NEXT: ret 671; 672; CHECK32-IZFHMIN-LABEL: fcvt_ui_h: 673; CHECK32-IZFHMIN: # %bb.0: 674; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 675; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 676; CHECK32-IZFHMIN-NEXT: ret 677; 678; CHECK64-IZFHMIN-LABEL: fcvt_ui_h: 679; CHECK64-IZFHMIN: # %bb.0: 680; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 681; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 682; CHECK64-IZFHMIN-NEXT: ret 683; 684; CHECK32-IZHINXMIN-LABEL: fcvt_ui_h: 685; CHECK32-IZHINXMIN: # %bb.0: 686; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 687; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 688; CHECK32-IZHINXMIN-NEXT: ret 689; 690; CHECK64-IZHINXMIN-LABEL: fcvt_ui_h: 691; CHECK64-IZHINXMIN: # %bb.0: 692; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 693; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 694; CHECK64-IZHINXMIN-NEXT: ret 695; 696; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_ui_h: 697; CHECK32-IZDINXZHINXMIN: # %bb.0: 698; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 699; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 700; CHECK32-IZDINXZHINXMIN-NEXT: ret 701; 702; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_ui_h: 703; CHECK64-IZDINXZHINXMIN: # %bb.0: 704; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 705; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 706; CHECK64-IZDINXZHINXMIN-NEXT: ret 707 %1 = fptoui half %a to i16 708 ret i16 %1 709} 710 711define i16 @fcvt_ui_h_sat(half %a) nounwind { 712; RV32IZFH-LABEL: fcvt_ui_h_sat: 713; RV32IZFH: # %bb.0: # %start 714; RV32IZFH-NEXT: lui a0, %hi(.LCPI3_0) 715; RV32IZFH-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 716; RV32IZFH-NEXT: fcvt.s.h fa4, fa0 717; RV32IZFH-NEXT: fmv.w.x fa3, zero 718; RV32IZFH-NEXT: fmax.s fa4, fa4, fa3 719; RV32IZFH-NEXT: fmin.s fa5, fa4, fa5 720; RV32IZFH-NEXT: fcvt.wu.s a0, fa5, rtz 721; RV32IZFH-NEXT: ret 722; 723; RV64IZFH-LABEL: fcvt_ui_h_sat: 724; RV64IZFH: # %bb.0: # %start 725; RV64IZFH-NEXT: lui a0, %hi(.LCPI3_0) 726; RV64IZFH-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 727; RV64IZFH-NEXT: fcvt.s.h fa4, fa0 728; RV64IZFH-NEXT: fmv.w.x fa3, zero 729; RV64IZFH-NEXT: fmax.s fa4, fa4, fa3 730; RV64IZFH-NEXT: fmin.s fa5, fa4, fa5 731; RV64IZFH-NEXT: fcvt.lu.s a0, fa5, rtz 732; RV64IZFH-NEXT: ret 733; 734; RV32IDZFH-LABEL: fcvt_ui_h_sat: 735; RV32IDZFH: # %bb.0: # %start 736; RV32IDZFH-NEXT: lui a0, %hi(.LCPI3_0) 737; RV32IDZFH-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 738; RV32IDZFH-NEXT: fcvt.s.h fa4, fa0 739; RV32IDZFH-NEXT: fmv.w.x fa3, zero 740; RV32IDZFH-NEXT: fmax.s fa4, fa4, fa3 741; RV32IDZFH-NEXT: fmin.s fa5, fa4, fa5 742; RV32IDZFH-NEXT: fcvt.wu.s a0, fa5, rtz 743; RV32IDZFH-NEXT: ret 744; 745; RV64IDZFH-LABEL: fcvt_ui_h_sat: 746; RV64IDZFH: # %bb.0: # %start 747; RV64IDZFH-NEXT: lui a0, %hi(.LCPI3_0) 748; RV64IDZFH-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 749; RV64IDZFH-NEXT: fcvt.s.h fa4, fa0 750; RV64IDZFH-NEXT: fmv.w.x fa3, zero 751; RV64IDZFH-NEXT: fmax.s fa4, fa4, fa3 752; RV64IDZFH-NEXT: fmin.s fa5, fa4, fa5 753; RV64IDZFH-NEXT: fcvt.lu.s a0, fa5, rtz 754; RV64IDZFH-NEXT: ret 755; 756; RV32IZHINX-LABEL: fcvt_ui_h_sat: 757; RV32IZHINX: # %bb.0: # %start 758; RV32IZHINX-NEXT: fcvt.s.h a0, a0 759; RV32IZHINX-NEXT: lui a1, 292864 760; RV32IZHINX-NEXT: fmax.s a0, a0, zero 761; RV32IZHINX-NEXT: addi a1, a1, -256 762; RV32IZHINX-NEXT: fmin.s a0, a0, a1 763; RV32IZHINX-NEXT: fcvt.wu.s a0, a0, rtz 764; RV32IZHINX-NEXT: ret 765; 766; RV64IZHINX-LABEL: fcvt_ui_h_sat: 767; RV64IZHINX: # %bb.0: # %start 768; RV64IZHINX-NEXT: fcvt.s.h a0, a0 769; RV64IZHINX-NEXT: lui a1, 292864 770; RV64IZHINX-NEXT: fmax.s a0, a0, zero 771; RV64IZHINX-NEXT: addiw a1, a1, -256 772; RV64IZHINX-NEXT: fmin.s a0, a0, a1 773; RV64IZHINX-NEXT: fcvt.lu.s a0, a0, rtz 774; RV64IZHINX-NEXT: ret 775; 776; RV32IZDINXZHINX-LABEL: fcvt_ui_h_sat: 777; RV32IZDINXZHINX: # %bb.0: # %start 778; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 779; RV32IZDINXZHINX-NEXT: lui a1, 292864 780; RV32IZDINXZHINX-NEXT: fmax.s a0, a0, zero 781; RV32IZDINXZHINX-NEXT: addi a1, a1, -256 782; RV32IZDINXZHINX-NEXT: fmin.s a0, a0, a1 783; RV32IZDINXZHINX-NEXT: fcvt.wu.s a0, a0, rtz 784; RV32IZDINXZHINX-NEXT: ret 785; 786; RV64IZDINXZHINX-LABEL: fcvt_ui_h_sat: 787; RV64IZDINXZHINX: # %bb.0: # %start 788; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 789; RV64IZDINXZHINX-NEXT: lui a1, 292864 790; RV64IZDINXZHINX-NEXT: fmax.s a0, a0, zero 791; RV64IZDINXZHINX-NEXT: addiw a1, a1, -256 792; RV64IZDINXZHINX-NEXT: fmin.s a0, a0, a1 793; RV64IZDINXZHINX-NEXT: fcvt.lu.s a0, a0, rtz 794; RV64IZDINXZHINX-NEXT: ret 795; 796; RV32I-LABEL: fcvt_ui_h_sat: 797; RV32I: # %bb.0: # %start 798; RV32I-NEXT: addi sp, sp, -32 799; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 800; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 801; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 802; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 803; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 804; RV32I-NEXT: lui s0, 16 805; RV32I-NEXT: addi s0, s0, -1 806; RV32I-NEXT: and a0, a0, s0 807; RV32I-NEXT: call __extendhfsf2 808; RV32I-NEXT: mv s3, a0 809; RV32I-NEXT: call __fixunssfsi 810; RV32I-NEXT: mv s1, a0 811; RV32I-NEXT: mv a0, s3 812; RV32I-NEXT: li a1, 0 813; RV32I-NEXT: call __gesf2 814; RV32I-NEXT: mv s2, a0 815; RV32I-NEXT: lui a0, 292864 816; RV32I-NEXT: addi a1, a0, -256 817; RV32I-NEXT: mv a0, s3 818; RV32I-NEXT: call __gtsf2 819; RV32I-NEXT: bgtz a0, .LBB3_2 820; RV32I-NEXT: # %bb.1: 821; RV32I-NEXT: slti a0, s2, 0 822; RV32I-NEXT: addi a0, a0, -1 823; RV32I-NEXT: and s0, a0, s1 824; RV32I-NEXT: .LBB3_2: # %start 825; RV32I-NEXT: mv a0, s0 826; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 827; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 828; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 829; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 830; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 831; RV32I-NEXT: addi sp, sp, 32 832; RV32I-NEXT: ret 833; 834; RV64I-LABEL: fcvt_ui_h_sat: 835; RV64I: # %bb.0: # %start 836; RV64I-NEXT: addi sp, sp, -48 837; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 838; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 839; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 840; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 841; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 842; RV64I-NEXT: lui s0, 16 843; RV64I-NEXT: addiw s0, s0, -1 844; RV64I-NEXT: and a0, a0, s0 845; RV64I-NEXT: call __extendhfsf2 846; RV64I-NEXT: mv s3, a0 847; RV64I-NEXT: call __fixunssfdi 848; RV64I-NEXT: mv s1, a0 849; RV64I-NEXT: mv a0, s3 850; RV64I-NEXT: li a1, 0 851; RV64I-NEXT: call __gesf2 852; RV64I-NEXT: mv s2, a0 853; RV64I-NEXT: lui a0, 292864 854; RV64I-NEXT: addiw a1, a0, -256 855; RV64I-NEXT: mv a0, s3 856; RV64I-NEXT: call __gtsf2 857; RV64I-NEXT: bgtz a0, .LBB3_2 858; RV64I-NEXT: # %bb.1: 859; RV64I-NEXT: slti a0, s2, 0 860; RV64I-NEXT: addi a0, a0, -1 861; RV64I-NEXT: and s0, a0, s1 862; RV64I-NEXT: .LBB3_2: # %start 863; RV64I-NEXT: mv a0, s0 864; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 865; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 866; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 867; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 868; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 869; RV64I-NEXT: addi sp, sp, 48 870; RV64I-NEXT: ret 871; 872; RV32ID-ILP32-LABEL: fcvt_ui_h_sat: 873; RV32ID-ILP32: # %bb.0: # %start 874; RV32ID-ILP32-NEXT: addi sp, sp, -16 875; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 876; RV32ID-ILP32-NEXT: call __extendhfsf2 877; RV32ID-ILP32-NEXT: lui a1, %hi(.LCPI3_0) 878; RV32ID-ILP32-NEXT: flw fa5, %lo(.LCPI3_0)(a1) 879; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 880; RV32ID-ILP32-NEXT: fmv.w.x fa3, zero 881; RV32ID-ILP32-NEXT: fmax.s fa4, fa4, fa3 882; RV32ID-ILP32-NEXT: fmin.s fa5, fa4, fa5 883; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 884; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 885; RV32ID-ILP32-NEXT: addi sp, sp, 16 886; RV32ID-ILP32-NEXT: ret 887; 888; RV64ID-LP64-LABEL: fcvt_ui_h_sat: 889; RV64ID-LP64: # %bb.0: # %start 890; RV64ID-LP64-NEXT: addi sp, sp, -16 891; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 892; RV64ID-LP64-NEXT: call __extendhfsf2 893; RV64ID-LP64-NEXT: lui a1, %hi(.LCPI3_0) 894; RV64ID-LP64-NEXT: flw fa5, %lo(.LCPI3_0)(a1) 895; RV64ID-LP64-NEXT: fmv.w.x fa4, a0 896; RV64ID-LP64-NEXT: fmv.w.x fa3, zero 897; RV64ID-LP64-NEXT: fmax.s fa4, fa4, fa3 898; RV64ID-LP64-NEXT: fmin.s fa5, fa4, fa5 899; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 900; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 901; RV64ID-LP64-NEXT: addi sp, sp, 16 902; RV64ID-LP64-NEXT: ret 903; 904; RV32ID-LABEL: fcvt_ui_h_sat: 905; RV32ID: # %bb.0: # %start 906; RV32ID-NEXT: addi sp, sp, -16 907; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 908; RV32ID-NEXT: call __extendhfsf2 909; RV32ID-NEXT: lui a0, %hi(.LCPI3_0) 910; RV32ID-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 911; RV32ID-NEXT: fmv.w.x fa4, zero 912; RV32ID-NEXT: fmax.s fa4, fa0, fa4 913; RV32ID-NEXT: fmin.s fa5, fa4, fa5 914; RV32ID-NEXT: fcvt.wu.s a0, fa5, rtz 915; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 916; RV32ID-NEXT: addi sp, sp, 16 917; RV32ID-NEXT: ret 918; 919; RV64ID-LABEL: fcvt_ui_h_sat: 920; RV64ID: # %bb.0: # %start 921; RV64ID-NEXT: addi sp, sp, -16 922; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 923; RV64ID-NEXT: call __extendhfsf2 924; RV64ID-NEXT: lui a0, %hi(.LCPI3_0) 925; RV64ID-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 926; RV64ID-NEXT: fmv.w.x fa4, zero 927; RV64ID-NEXT: fmax.s fa4, fa0, fa4 928; RV64ID-NEXT: fmin.s fa5, fa4, fa5 929; RV64ID-NEXT: fcvt.lu.s a0, fa5, rtz 930; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 931; RV64ID-NEXT: addi sp, sp, 16 932; RV64ID-NEXT: ret 933; 934; CHECK32-IZFHMIN-LABEL: fcvt_ui_h_sat: 935; CHECK32-IZFHMIN: # %bb.0: # %start 936; CHECK32-IZFHMIN-NEXT: lui a0, %hi(.LCPI3_0) 937; CHECK32-IZFHMIN-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 938; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa4, fa0 939; CHECK32-IZFHMIN-NEXT: fmv.w.x fa3, zero 940; CHECK32-IZFHMIN-NEXT: fmax.s fa4, fa4, fa3 941; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa4, fa5 942; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 943; CHECK32-IZFHMIN-NEXT: ret 944; 945; CHECK64-IZFHMIN-LABEL: fcvt_ui_h_sat: 946; CHECK64-IZFHMIN: # %bb.0: # %start 947; CHECK64-IZFHMIN-NEXT: lui a0, %hi(.LCPI3_0) 948; CHECK64-IZFHMIN-NEXT: flw fa5, %lo(.LCPI3_0)(a0) 949; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa4, fa0 950; CHECK64-IZFHMIN-NEXT: fmv.w.x fa3, zero 951; CHECK64-IZFHMIN-NEXT: fmax.s fa4, fa4, fa3 952; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa4, fa5 953; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 954; CHECK64-IZFHMIN-NEXT: ret 955; 956; CHECK32-IZHINXMIN-LABEL: fcvt_ui_h_sat: 957; CHECK32-IZHINXMIN: # %bb.0: # %start 958; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 959; CHECK32-IZHINXMIN-NEXT: lui a1, 292864 960; CHECK32-IZHINXMIN-NEXT: fmax.s a0, a0, zero 961; CHECK32-IZHINXMIN-NEXT: addi a1, a1, -256 962; CHECK32-IZHINXMIN-NEXT: fmin.s a0, a0, a1 963; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 964; CHECK32-IZHINXMIN-NEXT: ret 965; 966; CHECK64-IZHINXMIN-LABEL: fcvt_ui_h_sat: 967; CHECK64-IZHINXMIN: # %bb.0: # %start 968; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 969; CHECK64-IZHINXMIN-NEXT: lui a1, 292864 970; CHECK64-IZHINXMIN-NEXT: fmax.s a0, a0, zero 971; CHECK64-IZHINXMIN-NEXT: addiw a1, a1, -256 972; CHECK64-IZHINXMIN-NEXT: fmin.s a0, a0, a1 973; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 974; CHECK64-IZHINXMIN-NEXT: ret 975; 976; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_ui_h_sat: 977; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 978; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 979; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 292864 980; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 981; CHECK32-IZDINXZHINXMIN-NEXT: addi a1, a1, -256 982; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 983; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 984; CHECK32-IZDINXZHINXMIN-NEXT: ret 985; 986; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_ui_h_sat: 987; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 988; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 989; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 292864 990; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 991; CHECK64-IZDINXZHINXMIN-NEXT: addiw a1, a1, -256 992; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 993; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 994; CHECK64-IZDINXZHINXMIN-NEXT: ret 995start: 996 %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a) 997 ret i16 %0 998} 999declare i16 @llvm.fptoui.sat.i16.f16(half) 1000 1001define i32 @fcvt_w_h(half %a) nounwind { 1002; CHECKIZFH-LABEL: fcvt_w_h: 1003; CHECKIZFH: # %bb.0: 1004; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rtz 1005; CHECKIZFH-NEXT: ret 1006; 1007; RV32IDZFH-LABEL: fcvt_w_h: 1008; RV32IDZFH: # %bb.0: 1009; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 1010; RV32IDZFH-NEXT: ret 1011; 1012; RV64IDZFH-LABEL: fcvt_w_h: 1013; RV64IDZFH: # %bb.0: 1014; RV64IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 1015; RV64IDZFH-NEXT: ret 1016; 1017; CHECKIZHINX-LABEL: fcvt_w_h: 1018; CHECKIZHINX: # %bb.0: 1019; CHECKIZHINX-NEXT: fcvt.w.h a0, a0, rtz 1020; CHECKIZHINX-NEXT: ret 1021; 1022; CHECKIZDINXZHINX-LABEL: fcvt_w_h: 1023; CHECKIZDINXZHINX: # %bb.0: 1024; CHECKIZDINXZHINX-NEXT: fcvt.w.h a0, a0, rtz 1025; CHECKIZDINXZHINX-NEXT: ret 1026; 1027; RV32I-LABEL: fcvt_w_h: 1028; RV32I: # %bb.0: 1029; RV32I-NEXT: addi sp, sp, -16 1030; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1031; RV32I-NEXT: slli a0, a0, 16 1032; RV32I-NEXT: srli a0, a0, 16 1033; RV32I-NEXT: call __extendhfsf2 1034; RV32I-NEXT: call __fixsfsi 1035; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1036; RV32I-NEXT: addi sp, sp, 16 1037; RV32I-NEXT: ret 1038; 1039; RV64I-LABEL: fcvt_w_h: 1040; RV64I: # %bb.0: 1041; RV64I-NEXT: addi sp, sp, -16 1042; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1043; RV64I-NEXT: slli a0, a0, 48 1044; RV64I-NEXT: srli a0, a0, 48 1045; RV64I-NEXT: call __extendhfsf2 1046; RV64I-NEXT: call __fixsfdi 1047; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1048; RV64I-NEXT: addi sp, sp, 16 1049; RV64I-NEXT: ret 1050; 1051; RV32ID-ILP32-LABEL: fcvt_w_h: 1052; RV32ID-ILP32: # %bb.0: 1053; RV32ID-ILP32-NEXT: addi sp, sp, -16 1054; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1055; RV32ID-ILP32-NEXT: call __extendhfsf2 1056; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 1057; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 1058; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1059; RV32ID-ILP32-NEXT: addi sp, sp, 16 1060; RV32ID-ILP32-NEXT: ret 1061; 1062; RV64ID-LP64-LABEL: fcvt_w_h: 1063; RV64ID-LP64: # %bb.0: 1064; RV64ID-LP64-NEXT: addi sp, sp, -16 1065; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1066; RV64ID-LP64-NEXT: call __extendhfsf2 1067; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 1068; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 1069; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1070; RV64ID-LP64-NEXT: addi sp, sp, 16 1071; RV64ID-LP64-NEXT: ret 1072; 1073; RV32ID-LABEL: fcvt_w_h: 1074; RV32ID: # %bb.0: 1075; RV32ID-NEXT: addi sp, sp, -16 1076; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1077; RV32ID-NEXT: call __extendhfsf2 1078; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 1079; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1080; RV32ID-NEXT: addi sp, sp, 16 1081; RV32ID-NEXT: ret 1082; 1083; RV64ID-LABEL: fcvt_w_h: 1084; RV64ID: # %bb.0: 1085; RV64ID-NEXT: addi sp, sp, -16 1086; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1087; RV64ID-NEXT: call __extendhfsf2 1088; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 1089; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1090; RV64ID-NEXT: addi sp, sp, 16 1091; RV64ID-NEXT: ret 1092; 1093; CHECK32-IZFHMIN-LABEL: fcvt_w_h: 1094; CHECK32-IZFHMIN: # %bb.0: 1095; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1096; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 1097; CHECK32-IZFHMIN-NEXT: ret 1098; 1099; CHECK64-IZFHMIN-LABEL: fcvt_w_h: 1100; CHECK64-IZFHMIN: # %bb.0: 1101; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1102; CHECK64-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 1103; CHECK64-IZFHMIN-NEXT: ret 1104; 1105; CHECK32-IZHINXMIN-LABEL: fcvt_w_h: 1106; CHECK32-IZHINXMIN: # %bb.0: 1107; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1108; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 1109; CHECK32-IZHINXMIN-NEXT: ret 1110; 1111; CHECK64-IZHINXMIN-LABEL: fcvt_w_h: 1112; CHECK64-IZHINXMIN: # %bb.0: 1113; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1114; CHECK64-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 1115; CHECK64-IZHINXMIN-NEXT: ret 1116; 1117; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h: 1118; CHECK32-IZDINXZHINXMIN: # %bb.0: 1119; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1120; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 1121; CHECK32-IZDINXZHINXMIN-NEXT: ret 1122; 1123; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h: 1124; CHECK64-IZDINXZHINXMIN: # %bb.0: 1125; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1126; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 1127; CHECK64-IZDINXZHINXMIN-NEXT: ret 1128 %1 = fptosi half %a to i32 1129 ret i32 %1 1130} 1131 1132define i32 @fcvt_w_h_sat(half %a) nounwind { 1133; CHECKIZFH-LABEL: fcvt_w_h_sat: 1134; CHECKIZFH: # %bb.0: # %start 1135; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rtz 1136; CHECKIZFH-NEXT: feq.h a1, fa0, fa0 1137; CHECKIZFH-NEXT: seqz a1, a1 1138; CHECKIZFH-NEXT: addi a1, a1, -1 1139; CHECKIZFH-NEXT: and a0, a1, a0 1140; CHECKIZFH-NEXT: ret 1141; 1142; RV32IDZFH-LABEL: fcvt_w_h_sat: 1143; RV32IDZFH: # %bb.0: # %start 1144; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 1145; RV32IDZFH-NEXT: feq.h a1, fa0, fa0 1146; RV32IDZFH-NEXT: seqz a1, a1 1147; RV32IDZFH-NEXT: addi a1, a1, -1 1148; RV32IDZFH-NEXT: and a0, a1, a0 1149; RV32IDZFH-NEXT: ret 1150; 1151; RV64IDZFH-LABEL: fcvt_w_h_sat: 1152; RV64IDZFH: # %bb.0: # %start 1153; RV64IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 1154; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 1155; RV64IDZFH-NEXT: seqz a1, a1 1156; RV64IDZFH-NEXT: addi a1, a1, -1 1157; RV64IDZFH-NEXT: and a0, a1, a0 1158; RV64IDZFH-NEXT: ret 1159; 1160; CHECKIZHINX-LABEL: fcvt_w_h_sat: 1161; CHECKIZHINX: # %bb.0: # %start 1162; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rtz 1163; CHECKIZHINX-NEXT: feq.h a0, a0, a0 1164; CHECKIZHINX-NEXT: seqz a0, a0 1165; CHECKIZHINX-NEXT: addi a0, a0, -1 1166; CHECKIZHINX-NEXT: and a0, a0, a1 1167; CHECKIZHINX-NEXT: ret 1168; 1169; CHECKIZDINXZHINX-LABEL: fcvt_w_h_sat: 1170; CHECKIZDINXZHINX: # %bb.0: # %start 1171; CHECKIZDINXZHINX-NEXT: fcvt.w.h a1, a0, rtz 1172; CHECKIZDINXZHINX-NEXT: feq.h a0, a0, a0 1173; CHECKIZDINXZHINX-NEXT: seqz a0, a0 1174; CHECKIZDINXZHINX-NEXT: addi a0, a0, -1 1175; CHECKIZDINXZHINX-NEXT: and a0, a0, a1 1176; CHECKIZDINXZHINX-NEXT: ret 1177; 1178; RV32I-LABEL: fcvt_w_h_sat: 1179; RV32I: # %bb.0: # %start 1180; RV32I-NEXT: addi sp, sp, -32 1181; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1182; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1183; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1184; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1185; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1186; RV32I-NEXT: slli a0, a0, 16 1187; RV32I-NEXT: srli a0, a0, 16 1188; RV32I-NEXT: call __extendhfsf2 1189; RV32I-NEXT: mv s0, a0 1190; RV32I-NEXT: lui a1, 847872 1191; RV32I-NEXT: call __gesf2 1192; RV32I-NEXT: mv s2, a0 1193; RV32I-NEXT: mv a0, s0 1194; RV32I-NEXT: call __fixsfsi 1195; RV32I-NEXT: mv s1, a0 1196; RV32I-NEXT: lui s3, 524288 1197; RV32I-NEXT: bgez s2, .LBB5_2 1198; RV32I-NEXT: # %bb.1: # %start 1199; RV32I-NEXT: lui s1, 524288 1200; RV32I-NEXT: .LBB5_2: # %start 1201; RV32I-NEXT: lui a1, 323584 1202; RV32I-NEXT: addi a1, a1, -1 1203; RV32I-NEXT: mv a0, s0 1204; RV32I-NEXT: call __gtsf2 1205; RV32I-NEXT: blez a0, .LBB5_4 1206; RV32I-NEXT: # %bb.3: # %start 1207; RV32I-NEXT: addi s1, s3, -1 1208; RV32I-NEXT: .LBB5_4: # %start 1209; RV32I-NEXT: mv a0, s0 1210; RV32I-NEXT: mv a1, s0 1211; RV32I-NEXT: call __unordsf2 1212; RV32I-NEXT: snez a0, a0 1213; RV32I-NEXT: addi a0, a0, -1 1214; RV32I-NEXT: and a0, a0, s1 1215; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1216; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1217; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1218; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1219; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1220; RV32I-NEXT: addi sp, sp, 32 1221; RV32I-NEXT: ret 1222; 1223; RV64I-LABEL: fcvt_w_h_sat: 1224; RV64I: # %bb.0: # %start 1225; RV64I-NEXT: addi sp, sp, -48 1226; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1227; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1228; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1229; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1230; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 1231; RV64I-NEXT: slli a0, a0, 48 1232; RV64I-NEXT: srli a0, a0, 48 1233; RV64I-NEXT: call __extendhfsf2 1234; RV64I-NEXT: mv s0, a0 1235; RV64I-NEXT: lui a1, 847872 1236; RV64I-NEXT: call __gesf2 1237; RV64I-NEXT: mv s2, a0 1238; RV64I-NEXT: mv a0, s0 1239; RV64I-NEXT: call __fixsfdi 1240; RV64I-NEXT: mv s1, a0 1241; RV64I-NEXT: lui s3, 524288 1242; RV64I-NEXT: bgez s2, .LBB5_2 1243; RV64I-NEXT: # %bb.1: # %start 1244; RV64I-NEXT: lui s1, 524288 1245; RV64I-NEXT: .LBB5_2: # %start 1246; RV64I-NEXT: lui a1, 323584 1247; RV64I-NEXT: addiw a1, a1, -1 1248; RV64I-NEXT: mv a0, s0 1249; RV64I-NEXT: call __gtsf2 1250; RV64I-NEXT: blez a0, .LBB5_4 1251; RV64I-NEXT: # %bb.3: # %start 1252; RV64I-NEXT: addiw s1, s3, -1 1253; RV64I-NEXT: .LBB5_4: # %start 1254; RV64I-NEXT: mv a0, s0 1255; RV64I-NEXT: mv a1, s0 1256; RV64I-NEXT: call __unordsf2 1257; RV64I-NEXT: snez a0, a0 1258; RV64I-NEXT: addi a0, a0, -1 1259; RV64I-NEXT: and a0, a0, s1 1260; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1261; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1262; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1263; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1264; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1265; RV64I-NEXT: addi sp, sp, 48 1266; RV64I-NEXT: ret 1267; 1268; RV32ID-ILP32-LABEL: fcvt_w_h_sat: 1269; RV32ID-ILP32: # %bb.0: # %start 1270; RV32ID-ILP32-NEXT: addi sp, sp, -16 1271; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1272; RV32ID-ILP32-NEXT: call __extendhfsf2 1273; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 1274; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 1275; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 1276; RV32ID-ILP32-NEXT: seqz a1, a1 1277; RV32ID-ILP32-NEXT: addi a1, a1, -1 1278; RV32ID-ILP32-NEXT: and a0, a1, a0 1279; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1280; RV32ID-ILP32-NEXT: addi sp, sp, 16 1281; RV32ID-ILP32-NEXT: ret 1282; 1283; RV64ID-LP64-LABEL: fcvt_w_h_sat: 1284; RV64ID-LP64: # %bb.0: # %start 1285; RV64ID-LP64-NEXT: addi sp, sp, -16 1286; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1287; RV64ID-LP64-NEXT: call __extendhfsf2 1288; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 1289; RV64ID-LP64-NEXT: fcvt.w.s a0, fa5, rtz 1290; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 1291; RV64ID-LP64-NEXT: seqz a1, a1 1292; RV64ID-LP64-NEXT: addi a1, a1, -1 1293; RV64ID-LP64-NEXT: and a0, a1, a0 1294; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1295; RV64ID-LP64-NEXT: addi sp, sp, 16 1296; RV64ID-LP64-NEXT: ret 1297; 1298; RV32ID-LABEL: fcvt_w_h_sat: 1299; RV32ID: # %bb.0: # %start 1300; RV32ID-NEXT: addi sp, sp, -16 1301; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1302; RV32ID-NEXT: call __extendhfsf2 1303; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 1304; RV32ID-NEXT: feq.s a1, fa0, fa0 1305; RV32ID-NEXT: seqz a1, a1 1306; RV32ID-NEXT: addi a1, a1, -1 1307; RV32ID-NEXT: and a0, a1, a0 1308; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1309; RV32ID-NEXT: addi sp, sp, 16 1310; RV32ID-NEXT: ret 1311; 1312; RV64ID-LABEL: fcvt_w_h_sat: 1313; RV64ID: # %bb.0: # %start 1314; RV64ID-NEXT: addi sp, sp, -16 1315; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1316; RV64ID-NEXT: call __extendhfsf2 1317; RV64ID-NEXT: fcvt.w.s a0, fa0, rtz 1318; RV64ID-NEXT: feq.s a1, fa0, fa0 1319; RV64ID-NEXT: seqz a1, a1 1320; RV64ID-NEXT: addi a1, a1, -1 1321; RV64ID-NEXT: and a0, a1, a0 1322; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1323; RV64ID-NEXT: addi sp, sp, 16 1324; RV64ID-NEXT: ret 1325; 1326; CHECK32-IZFHMIN-LABEL: fcvt_w_h_sat: 1327; CHECK32-IZFHMIN: # %bb.0: # %start 1328; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1329; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 1330; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 1331; CHECK32-IZFHMIN-NEXT: seqz a1, a1 1332; CHECK32-IZFHMIN-NEXT: addi a1, a1, -1 1333; CHECK32-IZFHMIN-NEXT: and a0, a1, a0 1334; CHECK32-IZFHMIN-NEXT: ret 1335; 1336; CHECK64-IZFHMIN-LABEL: fcvt_w_h_sat: 1337; CHECK64-IZFHMIN: # %bb.0: # %start 1338; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1339; CHECK64-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 1340; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 1341; CHECK64-IZFHMIN-NEXT: seqz a1, a1 1342; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 1343; CHECK64-IZFHMIN-NEXT: and a0, a1, a0 1344; CHECK64-IZFHMIN-NEXT: ret 1345; 1346; CHECK32-IZHINXMIN-LABEL: fcvt_w_h_sat: 1347; CHECK32-IZHINXMIN: # %bb.0: # %start 1348; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1349; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 1350; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 1351; CHECK32-IZHINXMIN-NEXT: seqz a0, a0 1352; CHECK32-IZHINXMIN-NEXT: addi a0, a0, -1 1353; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 1354; CHECK32-IZHINXMIN-NEXT: ret 1355; 1356; CHECK64-IZHINXMIN-LABEL: fcvt_w_h_sat: 1357; CHECK64-IZHINXMIN: # %bb.0: # %start 1358; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1359; CHECK64-IZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 1360; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 1361; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 1362; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 1363; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 1364; CHECK64-IZHINXMIN-NEXT: ret 1365; 1366; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat: 1367; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 1368; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1369; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 1370; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 1371; CHECK32-IZDINXZHINXMIN-NEXT: seqz a0, a0 1372; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 1373; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 1374; CHECK32-IZDINXZHINXMIN-NEXT: ret 1375; 1376; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat: 1377; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 1378; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1379; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 1380; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 1381; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 1382; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 1383; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 1384; CHECK64-IZDINXZHINXMIN-NEXT: ret 1385start: 1386 %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a) 1387 ret i32 %0 1388} 1389declare i32 @llvm.fptosi.sat.i32.f16(half) 1390 1391define i32 @fcvt_wu_h(half %a) nounwind { 1392; CHECKIZFH-LABEL: fcvt_wu_h: 1393; CHECKIZFH: # %bb.0: 1394; CHECKIZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1395; CHECKIZFH-NEXT: ret 1396; 1397; RV32IDZFH-LABEL: fcvt_wu_h: 1398; RV32IDZFH: # %bb.0: 1399; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1400; RV32IDZFH-NEXT: ret 1401; 1402; RV64IDZFH-LABEL: fcvt_wu_h: 1403; RV64IDZFH: # %bb.0: 1404; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1405; RV64IDZFH-NEXT: ret 1406; 1407; CHECKIZHINX-LABEL: fcvt_wu_h: 1408; CHECKIZHINX: # %bb.0: 1409; CHECKIZHINX-NEXT: fcvt.wu.h a0, a0, rtz 1410; CHECKIZHINX-NEXT: ret 1411; 1412; CHECKIZDINXZHINX-LABEL: fcvt_wu_h: 1413; CHECKIZDINXZHINX: # %bb.0: 1414; CHECKIZDINXZHINX-NEXT: fcvt.wu.h a0, a0, rtz 1415; CHECKIZDINXZHINX-NEXT: ret 1416; 1417; RV32I-LABEL: fcvt_wu_h: 1418; RV32I: # %bb.0: 1419; RV32I-NEXT: addi sp, sp, -16 1420; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1421; RV32I-NEXT: slli a0, a0, 16 1422; RV32I-NEXT: srli a0, a0, 16 1423; RV32I-NEXT: call __extendhfsf2 1424; RV32I-NEXT: call __fixunssfsi 1425; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1426; RV32I-NEXT: addi sp, sp, 16 1427; RV32I-NEXT: ret 1428; 1429; RV64I-LABEL: fcvt_wu_h: 1430; RV64I: # %bb.0: 1431; RV64I-NEXT: addi sp, sp, -16 1432; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1433; RV64I-NEXT: slli a0, a0, 48 1434; RV64I-NEXT: srli a0, a0, 48 1435; RV64I-NEXT: call __extendhfsf2 1436; RV64I-NEXT: call __fixunssfdi 1437; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1438; RV64I-NEXT: addi sp, sp, 16 1439; RV64I-NEXT: ret 1440; 1441; RV32ID-ILP32-LABEL: fcvt_wu_h: 1442; RV32ID-ILP32: # %bb.0: 1443; RV32ID-ILP32-NEXT: addi sp, sp, -16 1444; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1445; RV32ID-ILP32-NEXT: call __extendhfsf2 1446; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 1447; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 1448; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1449; RV32ID-ILP32-NEXT: addi sp, sp, 16 1450; RV32ID-ILP32-NEXT: ret 1451; 1452; RV64ID-LP64-LABEL: fcvt_wu_h: 1453; RV64ID-LP64: # %bb.0: 1454; RV64ID-LP64-NEXT: addi sp, sp, -16 1455; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1456; RV64ID-LP64-NEXT: call __extendhfsf2 1457; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 1458; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 1459; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1460; RV64ID-LP64-NEXT: addi sp, sp, 16 1461; RV64ID-LP64-NEXT: ret 1462; 1463; RV32ID-LABEL: fcvt_wu_h: 1464; RV32ID: # %bb.0: 1465; RV32ID-NEXT: addi sp, sp, -16 1466; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1467; RV32ID-NEXT: call __extendhfsf2 1468; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 1469; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1470; RV32ID-NEXT: addi sp, sp, 16 1471; RV32ID-NEXT: ret 1472; 1473; RV64ID-LABEL: fcvt_wu_h: 1474; RV64ID: # %bb.0: 1475; RV64ID-NEXT: addi sp, sp, -16 1476; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1477; RV64ID-NEXT: call __extendhfsf2 1478; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 1479; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1480; RV64ID-NEXT: addi sp, sp, 16 1481; RV64ID-NEXT: ret 1482; 1483; CHECK32-IZFHMIN-LABEL: fcvt_wu_h: 1484; CHECK32-IZFHMIN: # %bb.0: 1485; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1486; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1487; CHECK32-IZFHMIN-NEXT: ret 1488; 1489; CHECK64-IZFHMIN-LABEL: fcvt_wu_h: 1490; CHECK64-IZFHMIN: # %bb.0: 1491; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1492; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1493; CHECK64-IZFHMIN-NEXT: ret 1494; 1495; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h: 1496; CHECK32-IZHINXMIN: # %bb.0: 1497; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1498; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1499; CHECK32-IZHINXMIN-NEXT: ret 1500; 1501; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h: 1502; CHECK64-IZHINXMIN: # %bb.0: 1503; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1504; CHECK64-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1505; CHECK64-IZHINXMIN-NEXT: ret 1506; 1507; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h: 1508; CHECK32-IZDINXZHINXMIN: # %bb.0: 1509; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1510; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1511; CHECK32-IZDINXZHINXMIN-NEXT: ret 1512; 1513; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h: 1514; CHECK64-IZDINXZHINXMIN: # %bb.0: 1515; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1516; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1517; CHECK64-IZDINXZHINXMIN-NEXT: ret 1518 %1 = fptoui half %a to i32 1519 ret i32 %1 1520} 1521 1522; Test where the fptoui has multiple uses, one of which causes a sext to be 1523; inserted on RV64. 1524define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind { 1525; CHECKIZFH-LABEL: fcvt_wu_h_multiple_use: 1526; CHECKIZFH: # %bb.0: 1527; CHECKIZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1528; CHECKIZFH-NEXT: seqz a1, a0 1529; CHECKIZFH-NEXT: add a0, a0, a1 1530; CHECKIZFH-NEXT: ret 1531; 1532; RV32IDZFH-LABEL: fcvt_wu_h_multiple_use: 1533; RV32IDZFH: # %bb.0: 1534; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1535; RV32IDZFH-NEXT: seqz a1, a0 1536; RV32IDZFH-NEXT: add a0, a0, a1 1537; RV32IDZFH-NEXT: ret 1538; 1539; RV64IDZFH-LABEL: fcvt_wu_h_multiple_use: 1540; RV64IDZFH: # %bb.0: 1541; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1542; RV64IDZFH-NEXT: seqz a1, a0 1543; RV64IDZFH-NEXT: add a0, a0, a1 1544; RV64IDZFH-NEXT: ret 1545; 1546; CHECKIZHINX-LABEL: fcvt_wu_h_multiple_use: 1547; CHECKIZHINX: # %bb.0: 1548; CHECKIZHINX-NEXT: fcvt.wu.h a0, a0, rtz 1549; CHECKIZHINX-NEXT: seqz a1, a0 1550; CHECKIZHINX-NEXT: add a0, a0, a1 1551; CHECKIZHINX-NEXT: ret 1552; 1553; CHECKIZDINXZHINX-LABEL: fcvt_wu_h_multiple_use: 1554; CHECKIZDINXZHINX: # %bb.0: 1555; CHECKIZDINXZHINX-NEXT: fcvt.wu.h a0, a0, rtz 1556; CHECKIZDINXZHINX-NEXT: seqz a1, a0 1557; CHECKIZDINXZHINX-NEXT: add a0, a0, a1 1558; CHECKIZDINXZHINX-NEXT: ret 1559; 1560; RV32I-LABEL: fcvt_wu_h_multiple_use: 1561; RV32I: # %bb.0: 1562; RV32I-NEXT: addi sp, sp, -16 1563; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1564; RV32I-NEXT: slli a0, a0, 16 1565; RV32I-NEXT: srli a0, a0, 16 1566; RV32I-NEXT: call __extendhfsf2 1567; RV32I-NEXT: call __fixunssfsi 1568; RV32I-NEXT: seqz a1, a0 1569; RV32I-NEXT: add a0, a0, a1 1570; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1571; RV32I-NEXT: addi sp, sp, 16 1572; RV32I-NEXT: ret 1573; 1574; RV64I-LABEL: fcvt_wu_h_multiple_use: 1575; RV64I: # %bb.0: 1576; RV64I-NEXT: addi sp, sp, -16 1577; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1578; RV64I-NEXT: slli a0, a0, 48 1579; RV64I-NEXT: srli a0, a0, 48 1580; RV64I-NEXT: call __extendhfsf2 1581; RV64I-NEXT: call __fixunssfdi 1582; RV64I-NEXT: seqz a1, a0 1583; RV64I-NEXT: add a0, a0, a1 1584; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1585; RV64I-NEXT: addi sp, sp, 16 1586; RV64I-NEXT: ret 1587; 1588; RV32ID-ILP32-LABEL: fcvt_wu_h_multiple_use: 1589; RV32ID-ILP32: # %bb.0: 1590; RV32ID-ILP32-NEXT: addi sp, sp, -16 1591; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1592; RV32ID-ILP32-NEXT: call __extendhfsf2 1593; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 1594; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 1595; RV32ID-ILP32-NEXT: seqz a1, a0 1596; RV32ID-ILP32-NEXT: add a0, a0, a1 1597; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1598; RV32ID-ILP32-NEXT: addi sp, sp, 16 1599; RV32ID-ILP32-NEXT: ret 1600; 1601; RV64ID-LP64-LABEL: fcvt_wu_h_multiple_use: 1602; RV64ID-LP64: # %bb.0: 1603; RV64ID-LP64-NEXT: addi sp, sp, -16 1604; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1605; RV64ID-LP64-NEXT: call __extendhfsf2 1606; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 1607; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 1608; RV64ID-LP64-NEXT: seqz a1, a0 1609; RV64ID-LP64-NEXT: add a0, a0, a1 1610; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1611; RV64ID-LP64-NEXT: addi sp, sp, 16 1612; RV64ID-LP64-NEXT: ret 1613; 1614; RV32ID-LABEL: fcvt_wu_h_multiple_use: 1615; RV32ID: # %bb.0: 1616; RV32ID-NEXT: addi sp, sp, -16 1617; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1618; RV32ID-NEXT: call __extendhfsf2 1619; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 1620; RV32ID-NEXT: seqz a1, a0 1621; RV32ID-NEXT: add a0, a0, a1 1622; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1623; RV32ID-NEXT: addi sp, sp, 16 1624; RV32ID-NEXT: ret 1625; 1626; RV64ID-LABEL: fcvt_wu_h_multiple_use: 1627; RV64ID: # %bb.0: 1628; RV64ID-NEXT: addi sp, sp, -16 1629; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1630; RV64ID-NEXT: call __extendhfsf2 1631; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 1632; RV64ID-NEXT: seqz a1, a0 1633; RV64ID-NEXT: add a0, a0, a1 1634; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1635; RV64ID-NEXT: addi sp, sp, 16 1636; RV64ID-NEXT: ret 1637; 1638; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_multiple_use: 1639; CHECK32-IZFHMIN: # %bb.0: 1640; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1641; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1642; CHECK32-IZFHMIN-NEXT: seqz a1, a0 1643; CHECK32-IZFHMIN-NEXT: add a0, a0, a1 1644; CHECK32-IZFHMIN-NEXT: ret 1645; 1646; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_multiple_use: 1647; CHECK64-IZFHMIN: # %bb.0: 1648; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1649; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1650; CHECK64-IZFHMIN-NEXT: seqz a1, a0 1651; CHECK64-IZFHMIN-NEXT: add a0, a0, a1 1652; CHECK64-IZFHMIN-NEXT: ret 1653; 1654; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_multiple_use: 1655; CHECK32-IZHINXMIN: # %bb.0: 1656; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1657; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1658; CHECK32-IZHINXMIN-NEXT: seqz a1, a0 1659; CHECK32-IZHINXMIN-NEXT: add a0, a0, a1 1660; CHECK32-IZHINXMIN-NEXT: ret 1661; 1662; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_multiple_use: 1663; CHECK64-IZHINXMIN: # %bb.0: 1664; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1665; CHECK64-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1666; CHECK64-IZHINXMIN-NEXT: seqz a1, a0 1667; CHECK64-IZHINXMIN-NEXT: add a0, a0, a1 1668; CHECK64-IZHINXMIN-NEXT: ret 1669; 1670; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_multiple_use: 1671; CHECK32-IZDINXZHINXMIN: # %bb.0: 1672; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1673; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1674; CHECK32-IZDINXZHINXMIN-NEXT: seqz a1, a0 1675; CHECK32-IZDINXZHINXMIN-NEXT: add a0, a0, a1 1676; CHECK32-IZDINXZHINXMIN-NEXT: ret 1677; 1678; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_multiple_use: 1679; CHECK64-IZDINXZHINXMIN: # %bb.0: 1680; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1681; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 1682; CHECK64-IZDINXZHINXMIN-NEXT: seqz a1, a0 1683; CHECK64-IZDINXZHINXMIN-NEXT: add a0, a0, a1 1684; CHECK64-IZDINXZHINXMIN-NEXT: ret 1685 %a = fptoui half %x to i32 1686 %b = icmp eq i32 %a, 0 1687 %c = select i1 %b, i32 1, i32 %a 1688 ret i32 %c 1689} 1690 1691define i32 @fcvt_wu_h_sat(half %a) nounwind { 1692; RV32IZFH-LABEL: fcvt_wu_h_sat: 1693; RV32IZFH: # %bb.0: # %start 1694; RV32IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1695; RV32IZFH-NEXT: feq.h a1, fa0, fa0 1696; RV32IZFH-NEXT: seqz a1, a1 1697; RV32IZFH-NEXT: addi a1, a1, -1 1698; RV32IZFH-NEXT: and a0, a1, a0 1699; RV32IZFH-NEXT: ret 1700; 1701; RV64IZFH-LABEL: fcvt_wu_h_sat: 1702; RV64IZFH: # %bb.0: # %start 1703; RV64IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1704; RV64IZFH-NEXT: feq.h a1, fa0, fa0 1705; RV64IZFH-NEXT: seqz a1, a1 1706; RV64IZFH-NEXT: addi a1, a1, -1 1707; RV64IZFH-NEXT: and a0, a0, a1 1708; RV64IZFH-NEXT: slli a0, a0, 32 1709; RV64IZFH-NEXT: srli a0, a0, 32 1710; RV64IZFH-NEXT: ret 1711; 1712; RV32IDZFH-LABEL: fcvt_wu_h_sat: 1713; RV32IDZFH: # %bb.0: # %start 1714; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1715; RV32IDZFH-NEXT: feq.h a1, fa0, fa0 1716; RV32IDZFH-NEXT: seqz a1, a1 1717; RV32IDZFH-NEXT: addi a1, a1, -1 1718; RV32IDZFH-NEXT: and a0, a1, a0 1719; RV32IDZFH-NEXT: ret 1720; 1721; RV64IDZFH-LABEL: fcvt_wu_h_sat: 1722; RV64IDZFH: # %bb.0: # %start 1723; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 1724; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 1725; RV64IDZFH-NEXT: seqz a1, a1 1726; RV64IDZFH-NEXT: addi a1, a1, -1 1727; RV64IDZFH-NEXT: and a0, a0, a1 1728; RV64IDZFH-NEXT: slli a0, a0, 32 1729; RV64IDZFH-NEXT: srli a0, a0, 32 1730; RV64IDZFH-NEXT: ret 1731; 1732; RV32IZHINX-LABEL: fcvt_wu_h_sat: 1733; RV32IZHINX: # %bb.0: # %start 1734; RV32IZHINX-NEXT: fcvt.wu.h a1, a0, rtz 1735; RV32IZHINX-NEXT: feq.h a0, a0, a0 1736; RV32IZHINX-NEXT: seqz a0, a0 1737; RV32IZHINX-NEXT: addi a0, a0, -1 1738; RV32IZHINX-NEXT: and a0, a0, a1 1739; RV32IZHINX-NEXT: ret 1740; 1741; RV64IZHINX-LABEL: fcvt_wu_h_sat: 1742; RV64IZHINX: # %bb.0: # %start 1743; RV64IZHINX-NEXT: fcvt.wu.h a1, a0, rtz 1744; RV64IZHINX-NEXT: feq.h a0, a0, a0 1745; RV64IZHINX-NEXT: seqz a0, a0 1746; RV64IZHINX-NEXT: addi a0, a0, -1 1747; RV64IZHINX-NEXT: and a0, a1, a0 1748; RV64IZHINX-NEXT: slli a0, a0, 32 1749; RV64IZHINX-NEXT: srli a0, a0, 32 1750; RV64IZHINX-NEXT: ret 1751; 1752; RV32IZDINXZHINX-LABEL: fcvt_wu_h_sat: 1753; RV32IZDINXZHINX: # %bb.0: # %start 1754; RV32IZDINXZHINX-NEXT: fcvt.wu.h a1, a0, rtz 1755; RV32IZDINXZHINX-NEXT: feq.h a0, a0, a0 1756; RV32IZDINXZHINX-NEXT: seqz a0, a0 1757; RV32IZDINXZHINX-NEXT: addi a0, a0, -1 1758; RV32IZDINXZHINX-NEXT: and a0, a0, a1 1759; RV32IZDINXZHINX-NEXT: ret 1760; 1761; RV64IZDINXZHINX-LABEL: fcvt_wu_h_sat: 1762; RV64IZDINXZHINX: # %bb.0: # %start 1763; RV64IZDINXZHINX-NEXT: fcvt.wu.h a1, a0, rtz 1764; RV64IZDINXZHINX-NEXT: feq.h a0, a0, a0 1765; RV64IZDINXZHINX-NEXT: seqz a0, a0 1766; RV64IZDINXZHINX-NEXT: addi a0, a0, -1 1767; RV64IZDINXZHINX-NEXT: and a0, a1, a0 1768; RV64IZDINXZHINX-NEXT: slli a0, a0, 32 1769; RV64IZDINXZHINX-NEXT: srli a0, a0, 32 1770; RV64IZDINXZHINX-NEXT: ret 1771; 1772; RV32I-LABEL: fcvt_wu_h_sat: 1773; RV32I: # %bb.0: # %start 1774; RV32I-NEXT: addi sp, sp, -16 1775; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1776; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1777; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 1778; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 1779; RV32I-NEXT: slli a0, a0, 16 1780; RV32I-NEXT: srli a0, a0, 16 1781; RV32I-NEXT: call __extendhfsf2 1782; RV32I-NEXT: mv s0, a0 1783; RV32I-NEXT: lui a1, 325632 1784; RV32I-NEXT: addi a1, a1, -1 1785; RV32I-NEXT: call __gtsf2 1786; RV32I-NEXT: sgtz a0, a0 1787; RV32I-NEXT: neg s1, a0 1788; RV32I-NEXT: mv a0, s0 1789; RV32I-NEXT: li a1, 0 1790; RV32I-NEXT: call __gesf2 1791; RV32I-NEXT: slti a0, a0, 0 1792; RV32I-NEXT: addi s2, a0, -1 1793; RV32I-NEXT: mv a0, s0 1794; RV32I-NEXT: call __fixunssfsi 1795; RV32I-NEXT: and a0, s2, a0 1796; RV32I-NEXT: or a0, s1, a0 1797; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1798; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1799; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 1800; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 1801; RV32I-NEXT: addi sp, sp, 16 1802; RV32I-NEXT: ret 1803; 1804; RV64I-LABEL: fcvt_wu_h_sat: 1805; RV64I: # %bb.0: # %start 1806; RV64I-NEXT: addi sp, sp, -32 1807; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1808; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1809; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 1810; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 1811; RV64I-NEXT: slli a0, a0, 48 1812; RV64I-NEXT: srli a0, a0, 48 1813; RV64I-NEXT: call __extendhfsf2 1814; RV64I-NEXT: mv s2, a0 1815; RV64I-NEXT: li a1, 0 1816; RV64I-NEXT: call __gesf2 1817; RV64I-NEXT: mv s0, a0 1818; RV64I-NEXT: mv a0, s2 1819; RV64I-NEXT: call __fixunssfdi 1820; RV64I-NEXT: mv s1, a0 1821; RV64I-NEXT: lui a1, 325632 1822; RV64I-NEXT: addiw a1, a1, -1 1823; RV64I-NEXT: mv a0, s2 1824; RV64I-NEXT: call __gtsf2 1825; RV64I-NEXT: blez a0, .LBB8_2 1826; RV64I-NEXT: # %bb.1: # %start 1827; RV64I-NEXT: li a0, -1 1828; RV64I-NEXT: srli a0, a0, 32 1829; RV64I-NEXT: j .LBB8_3 1830; RV64I-NEXT: .LBB8_2: 1831; RV64I-NEXT: slti a0, s0, 0 1832; RV64I-NEXT: addi a0, a0, -1 1833; RV64I-NEXT: and a0, a0, s1 1834; RV64I-NEXT: .LBB8_3: # %start 1835; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1836; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1837; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 1838; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 1839; RV64I-NEXT: addi sp, sp, 32 1840; RV64I-NEXT: ret 1841; 1842; RV32ID-ILP32-LABEL: fcvt_wu_h_sat: 1843; RV32ID-ILP32: # %bb.0: # %start 1844; RV32ID-ILP32-NEXT: addi sp, sp, -16 1845; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1846; RV32ID-ILP32-NEXT: call __extendhfsf2 1847; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 1848; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 1849; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 1850; RV32ID-ILP32-NEXT: seqz a1, a1 1851; RV32ID-ILP32-NEXT: addi a1, a1, -1 1852; RV32ID-ILP32-NEXT: and a0, a1, a0 1853; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1854; RV32ID-ILP32-NEXT: addi sp, sp, 16 1855; RV32ID-ILP32-NEXT: ret 1856; 1857; RV64ID-LP64-LABEL: fcvt_wu_h_sat: 1858; RV64ID-LP64: # %bb.0: # %start 1859; RV64ID-LP64-NEXT: addi sp, sp, -16 1860; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1861; RV64ID-LP64-NEXT: call __extendhfsf2 1862; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 1863; RV64ID-LP64-NEXT: fcvt.wu.s a0, fa5, rtz 1864; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 1865; RV64ID-LP64-NEXT: seqz a1, a1 1866; RV64ID-LP64-NEXT: addi a1, a1, -1 1867; RV64ID-LP64-NEXT: and a0, a0, a1 1868; RV64ID-LP64-NEXT: slli a0, a0, 32 1869; RV64ID-LP64-NEXT: srli a0, a0, 32 1870; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1871; RV64ID-LP64-NEXT: addi sp, sp, 16 1872; RV64ID-LP64-NEXT: ret 1873; 1874; RV32ID-LABEL: fcvt_wu_h_sat: 1875; RV32ID: # %bb.0: # %start 1876; RV32ID-NEXT: addi sp, sp, -16 1877; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1878; RV32ID-NEXT: call __extendhfsf2 1879; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 1880; RV32ID-NEXT: feq.s a1, fa0, fa0 1881; RV32ID-NEXT: seqz a1, a1 1882; RV32ID-NEXT: addi a1, a1, -1 1883; RV32ID-NEXT: and a0, a1, a0 1884; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1885; RV32ID-NEXT: addi sp, sp, 16 1886; RV32ID-NEXT: ret 1887; 1888; RV64ID-LABEL: fcvt_wu_h_sat: 1889; RV64ID: # %bb.0: # %start 1890; RV64ID-NEXT: addi sp, sp, -16 1891; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1892; RV64ID-NEXT: call __extendhfsf2 1893; RV64ID-NEXT: fcvt.wu.s a0, fa0, rtz 1894; RV64ID-NEXT: feq.s a1, fa0, fa0 1895; RV64ID-NEXT: seqz a1, a1 1896; RV64ID-NEXT: addi a1, a1, -1 1897; RV64ID-NEXT: and a0, a0, a1 1898; RV64ID-NEXT: slli a0, a0, 32 1899; RV64ID-NEXT: srli a0, a0, 32 1900; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1901; RV64ID-NEXT: addi sp, sp, 16 1902; RV64ID-NEXT: ret 1903; 1904; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_sat: 1905; CHECK32-IZFHMIN: # %bb.0: # %start 1906; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1907; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1908; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 1909; CHECK32-IZFHMIN-NEXT: seqz a1, a1 1910; CHECK32-IZFHMIN-NEXT: addi a1, a1, -1 1911; CHECK32-IZFHMIN-NEXT: and a0, a1, a0 1912; CHECK32-IZFHMIN-NEXT: ret 1913; 1914; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_sat: 1915; CHECK64-IZFHMIN: # %bb.0: # %start 1916; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 1917; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 1918; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 1919; CHECK64-IZFHMIN-NEXT: seqz a1, a1 1920; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 1921; CHECK64-IZFHMIN-NEXT: and a0, a0, a1 1922; CHECK64-IZFHMIN-NEXT: slli a0, a0, 32 1923; CHECK64-IZFHMIN-NEXT: srli a0, a0, 32 1924; CHECK64-IZFHMIN-NEXT: ret 1925; 1926; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_sat: 1927; CHECK32-IZHINXMIN: # %bb.0: # %start 1928; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1929; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 1930; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 1931; CHECK32-IZHINXMIN-NEXT: seqz a0, a0 1932; CHECK32-IZHINXMIN-NEXT: addi a0, a0, -1 1933; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 1934; CHECK32-IZHINXMIN-NEXT: ret 1935; 1936; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_sat: 1937; CHECK64-IZHINXMIN: # %bb.0: # %start 1938; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 1939; CHECK64-IZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 1940; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 1941; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 1942; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 1943; CHECK64-IZHINXMIN-NEXT: and a0, a1, a0 1944; CHECK64-IZHINXMIN-NEXT: slli a0, a0, 32 1945; CHECK64-IZHINXMIN-NEXT: srli a0, a0, 32 1946; CHECK64-IZHINXMIN-NEXT: ret 1947; 1948; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat: 1949; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 1950; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1951; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 1952; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 1953; CHECK32-IZDINXZHINXMIN-NEXT: seqz a0, a0 1954; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 1955; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 1956; CHECK32-IZDINXZHINXMIN-NEXT: ret 1957; 1958; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat: 1959; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 1960; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 1961; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 1962; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 1963; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 1964; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 1965; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a1, a0 1966; CHECK64-IZDINXZHINXMIN-NEXT: slli a0, a0, 32 1967; CHECK64-IZDINXZHINXMIN-NEXT: srli a0, a0, 32 1968; CHECK64-IZDINXZHINXMIN-NEXT: ret 1969start: 1970 %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a) 1971 ret i32 %0 1972} 1973declare i32 @llvm.fptoui.sat.i32.f16(half) 1974 1975define i64 @fcvt_l_h(half %a) nounwind { 1976; RV32IZFH-LABEL: fcvt_l_h: 1977; RV32IZFH: # %bb.0: 1978; RV32IZFH-NEXT: addi sp, sp, -16 1979; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1980; RV32IZFH-NEXT: call __fixhfdi 1981; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1982; RV32IZFH-NEXT: addi sp, sp, 16 1983; RV32IZFH-NEXT: ret 1984; 1985; RV64IZFH-LABEL: fcvt_l_h: 1986; RV64IZFH: # %bb.0: 1987; RV64IZFH-NEXT: fcvt.l.h a0, fa0, rtz 1988; RV64IZFH-NEXT: ret 1989; 1990; RV32IDZFH-LABEL: fcvt_l_h: 1991; RV32IDZFH: # %bb.0: 1992; RV32IDZFH-NEXT: addi sp, sp, -16 1993; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1994; RV32IDZFH-NEXT: call __fixhfdi 1995; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1996; RV32IDZFH-NEXT: addi sp, sp, 16 1997; RV32IDZFH-NEXT: ret 1998; 1999; RV64IDZFH-LABEL: fcvt_l_h: 2000; RV64IDZFH: # %bb.0: 2001; RV64IDZFH-NEXT: fcvt.l.h a0, fa0, rtz 2002; RV64IDZFH-NEXT: ret 2003; 2004; RV32IZHINX-LABEL: fcvt_l_h: 2005; RV32IZHINX: # %bb.0: 2006; RV32IZHINX-NEXT: addi sp, sp, -16 2007; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2008; RV32IZHINX-NEXT: call __fixhfdi 2009; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2010; RV32IZHINX-NEXT: addi sp, sp, 16 2011; RV32IZHINX-NEXT: ret 2012; 2013; RV64IZHINX-LABEL: fcvt_l_h: 2014; RV64IZHINX: # %bb.0: 2015; RV64IZHINX-NEXT: fcvt.l.h a0, a0, rtz 2016; RV64IZHINX-NEXT: ret 2017; 2018; RV32IZDINXZHINX-LABEL: fcvt_l_h: 2019; RV32IZDINXZHINX: # %bb.0: 2020; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 2021; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2022; RV32IZDINXZHINX-NEXT: call __fixhfdi 2023; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2024; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 2025; RV32IZDINXZHINX-NEXT: ret 2026; 2027; RV64IZDINXZHINX-LABEL: fcvt_l_h: 2028; RV64IZDINXZHINX: # %bb.0: 2029; RV64IZDINXZHINX-NEXT: fcvt.l.h a0, a0, rtz 2030; RV64IZDINXZHINX-NEXT: ret 2031; 2032; RV32I-LABEL: fcvt_l_h: 2033; RV32I: # %bb.0: 2034; RV32I-NEXT: addi sp, sp, -16 2035; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2036; RV32I-NEXT: call __extendhfsf2 2037; RV32I-NEXT: call __fixsfdi 2038; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2039; RV32I-NEXT: addi sp, sp, 16 2040; RV32I-NEXT: ret 2041; 2042; RV64I-LABEL: fcvt_l_h: 2043; RV64I: # %bb.0: 2044; RV64I-NEXT: addi sp, sp, -16 2045; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2046; RV64I-NEXT: slli a0, a0, 48 2047; RV64I-NEXT: srli a0, a0, 48 2048; RV64I-NEXT: call __extendhfsf2 2049; RV64I-NEXT: call __fixsfdi 2050; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2051; RV64I-NEXT: addi sp, sp, 16 2052; RV64I-NEXT: ret 2053; 2054; RV32ID-ILP32-LABEL: fcvt_l_h: 2055; RV32ID-ILP32: # %bb.0: 2056; RV32ID-ILP32-NEXT: addi sp, sp, -16 2057; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2058; RV32ID-ILP32-NEXT: call __extendhfsf2 2059; RV32ID-ILP32-NEXT: call __fixsfdi 2060; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2061; RV32ID-ILP32-NEXT: addi sp, sp, 16 2062; RV32ID-ILP32-NEXT: ret 2063; 2064; RV64ID-LP64-LABEL: fcvt_l_h: 2065; RV64ID-LP64: # %bb.0: 2066; RV64ID-LP64-NEXT: addi sp, sp, -16 2067; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2068; RV64ID-LP64-NEXT: call __extendhfsf2 2069; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 2070; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 2071; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2072; RV64ID-LP64-NEXT: addi sp, sp, 16 2073; RV64ID-LP64-NEXT: ret 2074; 2075; RV32ID-LABEL: fcvt_l_h: 2076; RV32ID: # %bb.0: 2077; RV32ID-NEXT: addi sp, sp, -16 2078; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2079; RV32ID-NEXT: call __extendhfsf2 2080; RV32ID-NEXT: call __fixsfdi 2081; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2082; RV32ID-NEXT: addi sp, sp, 16 2083; RV32ID-NEXT: ret 2084; 2085; RV64ID-LABEL: fcvt_l_h: 2086; RV64ID: # %bb.0: 2087; RV64ID-NEXT: addi sp, sp, -16 2088; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2089; RV64ID-NEXT: call __extendhfsf2 2090; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 2091; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2092; RV64ID-NEXT: addi sp, sp, 16 2093; RV64ID-NEXT: ret 2094; 2095; CHECK32-IZFHMIN-LABEL: fcvt_l_h: 2096; CHECK32-IZFHMIN: # %bb.0: 2097; CHECK32-IZFHMIN-NEXT: addi sp, sp, -16 2098; CHECK32-IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2099; CHECK32-IZFHMIN-NEXT: call __fixhfdi 2100; CHECK32-IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2101; CHECK32-IZFHMIN-NEXT: addi sp, sp, 16 2102; CHECK32-IZFHMIN-NEXT: ret 2103; 2104; CHECK64-IZFHMIN-LABEL: fcvt_l_h: 2105; CHECK64-IZFHMIN: # %bb.0: 2106; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 2107; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 2108; CHECK64-IZFHMIN-NEXT: ret 2109; 2110; CHECK32-IZHINXMIN-LABEL: fcvt_l_h: 2111; CHECK32-IZHINXMIN: # %bb.0: 2112; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 2113; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2114; CHECK32-IZHINXMIN-NEXT: call __fixhfdi 2115; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2116; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 2117; CHECK32-IZHINXMIN-NEXT: ret 2118; 2119; CHECK64-IZHINXMIN-LABEL: fcvt_l_h: 2120; CHECK64-IZHINXMIN: # %bb.0: 2121; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 2122; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 2123; CHECK64-IZHINXMIN-NEXT: ret 2124; 2125; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_l_h: 2126; CHECK32-IZDINXZHINXMIN: # %bb.0: 2127; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 2128; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2129; CHECK32-IZDINXZHINXMIN-NEXT: call __fixhfdi 2130; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2131; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 2132; CHECK32-IZDINXZHINXMIN-NEXT: ret 2133; 2134; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_l_h: 2135; CHECK64-IZDINXZHINXMIN: # %bb.0: 2136; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 2137; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 2138; CHECK64-IZDINXZHINXMIN-NEXT: ret 2139 %1 = fptosi half %a to i64 2140 ret i64 %1 2141} 2142 2143define i64 @fcvt_l_h_sat(half %a) nounwind { 2144; RV32IZFH-LABEL: fcvt_l_h_sat: 2145; RV32IZFH: # %bb.0: # %start 2146; RV32IZFH-NEXT: addi sp, sp, -16 2147; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2148; RV32IZFH-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2149; RV32IZFH-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill 2150; RV32IZFH-NEXT: fcvt.s.h fs0, fa0 2151; RV32IZFH-NEXT: lui a0, 913408 2152; RV32IZFH-NEXT: fmv.w.x fa5, a0 2153; RV32IZFH-NEXT: fle.s s0, fa5, fs0 2154; RV32IZFH-NEXT: fmv.s fa0, fs0 2155; RV32IZFH-NEXT: call __fixsfdi 2156; RV32IZFH-NEXT: lui a3, 524288 2157; RV32IZFH-NEXT: lui a2, 524288 2158; RV32IZFH-NEXT: beqz s0, .LBB10_2 2159; RV32IZFH-NEXT: # %bb.1: # %start 2160; RV32IZFH-NEXT: mv a2, a1 2161; RV32IZFH-NEXT: .LBB10_2: # %start 2162; RV32IZFH-NEXT: lui a1, %hi(.LCPI10_0) 2163; RV32IZFH-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2164; RV32IZFH-NEXT: flt.s a1, fa5, fs0 2165; RV32IZFH-NEXT: beqz a1, .LBB10_4 2166; RV32IZFH-NEXT: # %bb.3: 2167; RV32IZFH-NEXT: addi a2, a3, -1 2168; RV32IZFH-NEXT: .LBB10_4: # %start 2169; RV32IZFH-NEXT: feq.s a3, fs0, fs0 2170; RV32IZFH-NEXT: neg a4, a1 2171; RV32IZFH-NEXT: neg a1, s0 2172; RV32IZFH-NEXT: neg a3, a3 2173; RV32IZFH-NEXT: and a0, a1, a0 2174; RV32IZFH-NEXT: and a1, a3, a2 2175; RV32IZFH-NEXT: or a0, a4, a0 2176; RV32IZFH-NEXT: and a0, a3, a0 2177; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2178; RV32IZFH-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2179; RV32IZFH-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload 2180; RV32IZFH-NEXT: addi sp, sp, 16 2181; RV32IZFH-NEXT: ret 2182; 2183; RV64IZFH-LABEL: fcvt_l_h_sat: 2184; RV64IZFH: # %bb.0: # %start 2185; RV64IZFH-NEXT: fcvt.l.h a0, fa0, rtz 2186; RV64IZFH-NEXT: feq.h a1, fa0, fa0 2187; RV64IZFH-NEXT: seqz a1, a1 2188; RV64IZFH-NEXT: addi a1, a1, -1 2189; RV64IZFH-NEXT: and a0, a1, a0 2190; RV64IZFH-NEXT: ret 2191; 2192; RV32IDZFH-LABEL: fcvt_l_h_sat: 2193; RV32IDZFH: # %bb.0: # %start 2194; RV32IDZFH-NEXT: addi sp, sp, -16 2195; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2196; RV32IDZFH-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2197; RV32IDZFH-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill 2198; RV32IDZFH-NEXT: fcvt.s.h fs0, fa0 2199; RV32IDZFH-NEXT: lui a0, 913408 2200; RV32IDZFH-NEXT: fmv.w.x fa5, a0 2201; RV32IDZFH-NEXT: fle.s s0, fa5, fs0 2202; RV32IDZFH-NEXT: fmv.s fa0, fs0 2203; RV32IDZFH-NEXT: call __fixsfdi 2204; RV32IDZFH-NEXT: lui a3, 524288 2205; RV32IDZFH-NEXT: lui a2, 524288 2206; RV32IDZFH-NEXT: beqz s0, .LBB10_2 2207; RV32IDZFH-NEXT: # %bb.1: # %start 2208; RV32IDZFH-NEXT: mv a2, a1 2209; RV32IDZFH-NEXT: .LBB10_2: # %start 2210; RV32IDZFH-NEXT: lui a1, %hi(.LCPI10_0) 2211; RV32IDZFH-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2212; RV32IDZFH-NEXT: flt.s a1, fa5, fs0 2213; RV32IDZFH-NEXT: beqz a1, .LBB10_4 2214; RV32IDZFH-NEXT: # %bb.3: 2215; RV32IDZFH-NEXT: addi a2, a3, -1 2216; RV32IDZFH-NEXT: .LBB10_4: # %start 2217; RV32IDZFH-NEXT: feq.s a3, fs0, fs0 2218; RV32IDZFH-NEXT: neg a4, a1 2219; RV32IDZFH-NEXT: neg a1, s0 2220; RV32IDZFH-NEXT: neg a3, a3 2221; RV32IDZFH-NEXT: and a0, a1, a0 2222; RV32IDZFH-NEXT: and a1, a3, a2 2223; RV32IDZFH-NEXT: or a0, a4, a0 2224; RV32IDZFH-NEXT: and a0, a3, a0 2225; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2226; RV32IDZFH-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2227; RV32IDZFH-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload 2228; RV32IDZFH-NEXT: addi sp, sp, 16 2229; RV32IDZFH-NEXT: ret 2230; 2231; RV64IDZFH-LABEL: fcvt_l_h_sat: 2232; RV64IDZFH: # %bb.0: # %start 2233; RV64IDZFH-NEXT: fcvt.l.h a0, fa0, rtz 2234; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 2235; RV64IDZFH-NEXT: seqz a1, a1 2236; RV64IDZFH-NEXT: addi a1, a1, -1 2237; RV64IDZFH-NEXT: and a0, a1, a0 2238; RV64IDZFH-NEXT: ret 2239; 2240; RV32IZHINX-LABEL: fcvt_l_h_sat: 2241; RV32IZHINX: # %bb.0: # %start 2242; RV32IZHINX-NEXT: addi sp, sp, -16 2243; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2244; RV32IZHINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2245; RV32IZHINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2246; RV32IZHINX-NEXT: fcvt.s.h s0, a0 2247; RV32IZHINX-NEXT: lui a0, 913408 2248; RV32IZHINX-NEXT: fle.s s1, a0, s0 2249; RV32IZHINX-NEXT: mv a0, s0 2250; RV32IZHINX-NEXT: call __fixsfdi 2251; RV32IZHINX-NEXT: lui a3, 524288 2252; RV32IZHINX-NEXT: lui a2, 524288 2253; RV32IZHINX-NEXT: beqz s1, .LBB10_2 2254; RV32IZHINX-NEXT: # %bb.1: # %start 2255; RV32IZHINX-NEXT: mv a2, a1 2256; RV32IZHINX-NEXT: .LBB10_2: # %start 2257; RV32IZHINX-NEXT: lui a1, 389120 2258; RV32IZHINX-NEXT: addi a1, a1, -1 2259; RV32IZHINX-NEXT: flt.s a1, a1, s0 2260; RV32IZHINX-NEXT: beqz a1, .LBB10_4 2261; RV32IZHINX-NEXT: # %bb.3: 2262; RV32IZHINX-NEXT: addi a2, a3, -1 2263; RV32IZHINX-NEXT: .LBB10_4: # %start 2264; RV32IZHINX-NEXT: feq.s a3, s0, s0 2265; RV32IZHINX-NEXT: neg a4, a1 2266; RV32IZHINX-NEXT: neg a1, s1 2267; RV32IZHINX-NEXT: neg a3, a3 2268; RV32IZHINX-NEXT: and a0, a1, a0 2269; RV32IZHINX-NEXT: and a1, a3, a2 2270; RV32IZHINX-NEXT: or a0, a4, a0 2271; RV32IZHINX-NEXT: and a0, a3, a0 2272; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2273; RV32IZHINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2274; RV32IZHINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2275; RV32IZHINX-NEXT: addi sp, sp, 16 2276; RV32IZHINX-NEXT: ret 2277; 2278; RV64IZHINX-LABEL: fcvt_l_h_sat: 2279; RV64IZHINX: # %bb.0: # %start 2280; RV64IZHINX-NEXT: fcvt.l.h a1, a0, rtz 2281; RV64IZHINX-NEXT: feq.h a0, a0, a0 2282; RV64IZHINX-NEXT: seqz a0, a0 2283; RV64IZHINX-NEXT: addi a0, a0, -1 2284; RV64IZHINX-NEXT: and a0, a0, a1 2285; RV64IZHINX-NEXT: ret 2286; 2287; RV32IZDINXZHINX-LABEL: fcvt_l_h_sat: 2288; RV32IZDINXZHINX: # %bb.0: # %start 2289; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 2290; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2291; RV32IZDINXZHINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2292; RV32IZDINXZHINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2293; RV32IZDINXZHINX-NEXT: fcvt.s.h s0, a0 2294; RV32IZDINXZHINX-NEXT: lui a0, 913408 2295; RV32IZDINXZHINX-NEXT: fle.s s1, a0, s0 2296; RV32IZDINXZHINX-NEXT: mv a0, s0 2297; RV32IZDINXZHINX-NEXT: call __fixsfdi 2298; RV32IZDINXZHINX-NEXT: lui a3, 524288 2299; RV32IZDINXZHINX-NEXT: lui a2, 524288 2300; RV32IZDINXZHINX-NEXT: beqz s1, .LBB10_2 2301; RV32IZDINXZHINX-NEXT: # %bb.1: # %start 2302; RV32IZDINXZHINX-NEXT: mv a2, a1 2303; RV32IZDINXZHINX-NEXT: .LBB10_2: # %start 2304; RV32IZDINXZHINX-NEXT: lui a1, 389120 2305; RV32IZDINXZHINX-NEXT: addi a1, a1, -1 2306; RV32IZDINXZHINX-NEXT: flt.s a1, a1, s0 2307; RV32IZDINXZHINX-NEXT: beqz a1, .LBB10_4 2308; RV32IZDINXZHINX-NEXT: # %bb.3: 2309; RV32IZDINXZHINX-NEXT: addi a2, a3, -1 2310; RV32IZDINXZHINX-NEXT: .LBB10_4: # %start 2311; RV32IZDINXZHINX-NEXT: feq.s a3, s0, s0 2312; RV32IZDINXZHINX-NEXT: neg a4, a1 2313; RV32IZDINXZHINX-NEXT: neg a1, s1 2314; RV32IZDINXZHINX-NEXT: neg a3, a3 2315; RV32IZDINXZHINX-NEXT: and a0, a1, a0 2316; RV32IZDINXZHINX-NEXT: and a1, a3, a2 2317; RV32IZDINXZHINX-NEXT: or a0, a4, a0 2318; RV32IZDINXZHINX-NEXT: and a0, a3, a0 2319; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2320; RV32IZDINXZHINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2321; RV32IZDINXZHINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2322; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 2323; RV32IZDINXZHINX-NEXT: ret 2324; 2325; RV64IZDINXZHINX-LABEL: fcvt_l_h_sat: 2326; RV64IZDINXZHINX: # %bb.0: # %start 2327; RV64IZDINXZHINX-NEXT: fcvt.l.h a1, a0, rtz 2328; RV64IZDINXZHINX-NEXT: feq.h a0, a0, a0 2329; RV64IZDINXZHINX-NEXT: seqz a0, a0 2330; RV64IZDINXZHINX-NEXT: addi a0, a0, -1 2331; RV64IZDINXZHINX-NEXT: and a0, a0, a1 2332; RV64IZDINXZHINX-NEXT: ret 2333; 2334; RV32I-LABEL: fcvt_l_h_sat: 2335; RV32I: # %bb.0: # %start 2336; RV32I-NEXT: addi sp, sp, -32 2337; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2338; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2339; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2340; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2341; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 2342; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 2343; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill 2344; RV32I-NEXT: call __extendhfsf2 2345; RV32I-NEXT: mv s2, a0 2346; RV32I-NEXT: lui a1, 913408 2347; RV32I-NEXT: call __gesf2 2348; RV32I-NEXT: mv s0, a0 2349; RV32I-NEXT: mv a0, s2 2350; RV32I-NEXT: call __fixsfdi 2351; RV32I-NEXT: mv s1, a0 2352; RV32I-NEXT: mv s3, a1 2353; RV32I-NEXT: lui s5, 524288 2354; RV32I-NEXT: bgez s0, .LBB10_2 2355; RV32I-NEXT: # %bb.1: # %start 2356; RV32I-NEXT: lui s3, 524288 2357; RV32I-NEXT: .LBB10_2: # %start 2358; RV32I-NEXT: lui a1, 389120 2359; RV32I-NEXT: addi a1, a1, -1 2360; RV32I-NEXT: mv a0, s2 2361; RV32I-NEXT: call __gtsf2 2362; RV32I-NEXT: mv s4, a0 2363; RV32I-NEXT: blez a0, .LBB10_4 2364; RV32I-NEXT: # %bb.3: # %start 2365; RV32I-NEXT: addi s3, s5, -1 2366; RV32I-NEXT: .LBB10_4: # %start 2367; RV32I-NEXT: mv a0, s2 2368; RV32I-NEXT: mv a1, s2 2369; RV32I-NEXT: call __unordsf2 2370; RV32I-NEXT: snez a0, a0 2371; RV32I-NEXT: sgtz a1, s4 2372; RV32I-NEXT: slti a2, s0, 0 2373; RV32I-NEXT: addi a0, a0, -1 2374; RV32I-NEXT: neg a3, a1 2375; RV32I-NEXT: addi a2, a2, -1 2376; RV32I-NEXT: and a1, a0, s3 2377; RV32I-NEXT: and a2, a2, s1 2378; RV32I-NEXT: or a2, a3, a2 2379; RV32I-NEXT: and a0, a0, a2 2380; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2381; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2382; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2383; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2384; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 2385; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 2386; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload 2387; RV32I-NEXT: addi sp, sp, 32 2388; RV32I-NEXT: ret 2389; 2390; RV64I-LABEL: fcvt_l_h_sat: 2391; RV64I: # %bb.0: # %start 2392; RV64I-NEXT: addi sp, sp, -48 2393; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2394; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2395; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2396; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2397; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2398; RV64I-NEXT: slli a0, a0, 48 2399; RV64I-NEXT: srli a0, a0, 48 2400; RV64I-NEXT: call __extendhfsf2 2401; RV64I-NEXT: mv s0, a0 2402; RV64I-NEXT: lui a1, 913408 2403; RV64I-NEXT: call __gesf2 2404; RV64I-NEXT: mv s2, a0 2405; RV64I-NEXT: mv a0, s0 2406; RV64I-NEXT: call __fixsfdi 2407; RV64I-NEXT: mv s1, a0 2408; RV64I-NEXT: li s3, -1 2409; RV64I-NEXT: bgez s2, .LBB10_2 2410; RV64I-NEXT: # %bb.1: # %start 2411; RV64I-NEXT: slli s1, s3, 63 2412; RV64I-NEXT: .LBB10_2: # %start 2413; RV64I-NEXT: lui a1, 389120 2414; RV64I-NEXT: addiw a1, a1, -1 2415; RV64I-NEXT: mv a0, s0 2416; RV64I-NEXT: call __gtsf2 2417; RV64I-NEXT: blez a0, .LBB10_4 2418; RV64I-NEXT: # %bb.3: # %start 2419; RV64I-NEXT: srli s1, s3, 1 2420; RV64I-NEXT: .LBB10_4: # %start 2421; RV64I-NEXT: mv a0, s0 2422; RV64I-NEXT: mv a1, s0 2423; RV64I-NEXT: call __unordsf2 2424; RV64I-NEXT: snez a0, a0 2425; RV64I-NEXT: addi a0, a0, -1 2426; RV64I-NEXT: and a0, a0, s1 2427; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2428; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2429; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2430; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2431; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 2432; RV64I-NEXT: addi sp, sp, 48 2433; RV64I-NEXT: ret 2434; 2435; RV32ID-ILP32-LABEL: fcvt_l_h_sat: 2436; RV32ID-ILP32: # %bb.0: # %start 2437; RV32ID-ILP32-NEXT: addi sp, sp, -16 2438; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2439; RV32ID-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2440; RV32ID-ILP32-NEXT: call __extendhfsf2 2441; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 2442; RV32ID-ILP32-NEXT: lui a1, 913408 2443; RV32ID-ILP32-NEXT: fmv.w.x fa5, a1 2444; RV32ID-ILP32-NEXT: fsw fa4, 4(sp) # 4-byte Folded Spill 2445; RV32ID-ILP32-NEXT: fle.s s0, fa5, fa4 2446; RV32ID-ILP32-NEXT: call __fixsfdi 2447; RV32ID-ILP32-NEXT: lui a3, 524288 2448; RV32ID-ILP32-NEXT: lui a2, 524288 2449; RV32ID-ILP32-NEXT: beqz s0, .LBB10_2 2450; RV32ID-ILP32-NEXT: # %bb.1: # %start 2451; RV32ID-ILP32-NEXT: mv a2, a1 2452; RV32ID-ILP32-NEXT: .LBB10_2: # %start 2453; RV32ID-ILP32-NEXT: lui a1, %hi(.LCPI10_0) 2454; RV32ID-ILP32-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2455; RV32ID-ILP32-NEXT: flw fa4, 4(sp) # 4-byte Folded Reload 2456; RV32ID-ILP32-NEXT: flt.s a1, fa5, fa4 2457; RV32ID-ILP32-NEXT: fmv.s fa5, fa4 2458; RV32ID-ILP32-NEXT: beqz a1, .LBB10_4 2459; RV32ID-ILP32-NEXT: # %bb.3: 2460; RV32ID-ILP32-NEXT: addi a2, a3, -1 2461; RV32ID-ILP32-NEXT: .LBB10_4: # %start 2462; RV32ID-ILP32-NEXT: feq.s a3, fa5, fa5 2463; RV32ID-ILP32-NEXT: neg a4, a1 2464; RV32ID-ILP32-NEXT: neg a1, s0 2465; RV32ID-ILP32-NEXT: neg a3, a3 2466; RV32ID-ILP32-NEXT: and a0, a1, a0 2467; RV32ID-ILP32-NEXT: and a1, a3, a2 2468; RV32ID-ILP32-NEXT: or a0, a4, a0 2469; RV32ID-ILP32-NEXT: and a0, a3, a0 2470; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2471; RV32ID-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2472; RV32ID-ILP32-NEXT: addi sp, sp, 16 2473; RV32ID-ILP32-NEXT: ret 2474; 2475; RV64ID-LP64-LABEL: fcvt_l_h_sat: 2476; RV64ID-LP64: # %bb.0: # %start 2477; RV64ID-LP64-NEXT: addi sp, sp, -16 2478; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2479; RV64ID-LP64-NEXT: call __extendhfsf2 2480; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 2481; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 2482; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 2483; RV64ID-LP64-NEXT: seqz a1, a1 2484; RV64ID-LP64-NEXT: addi a1, a1, -1 2485; RV64ID-LP64-NEXT: and a0, a1, a0 2486; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2487; RV64ID-LP64-NEXT: addi sp, sp, 16 2488; RV64ID-LP64-NEXT: ret 2489; 2490; RV32ID-LABEL: fcvt_l_h_sat: 2491; RV32ID: # %bb.0: # %start 2492; RV32ID-NEXT: addi sp, sp, -16 2493; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2494; RV32ID-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2495; RV32ID-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill 2496; RV32ID-NEXT: call __extendhfsf2 2497; RV32ID-NEXT: fmv.s fs0, fa0 2498; RV32ID-NEXT: lui a0, 913408 2499; RV32ID-NEXT: fmv.w.x fa5, a0 2500; RV32ID-NEXT: fle.s s0, fa5, fa0 2501; RV32ID-NEXT: call __fixsfdi 2502; RV32ID-NEXT: lui a3, 524288 2503; RV32ID-NEXT: lui a2, 524288 2504; RV32ID-NEXT: beqz s0, .LBB10_2 2505; RV32ID-NEXT: # %bb.1: # %start 2506; RV32ID-NEXT: mv a2, a1 2507; RV32ID-NEXT: .LBB10_2: # %start 2508; RV32ID-NEXT: lui a1, %hi(.LCPI10_0) 2509; RV32ID-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2510; RV32ID-NEXT: flt.s a1, fa5, fs0 2511; RV32ID-NEXT: beqz a1, .LBB10_4 2512; RV32ID-NEXT: # %bb.3: 2513; RV32ID-NEXT: addi a2, a3, -1 2514; RV32ID-NEXT: .LBB10_4: # %start 2515; RV32ID-NEXT: feq.s a3, fs0, fs0 2516; RV32ID-NEXT: neg a4, s0 2517; RV32ID-NEXT: neg a5, a1 2518; RV32ID-NEXT: neg a3, a3 2519; RV32ID-NEXT: and a0, a4, a0 2520; RV32ID-NEXT: and a1, a3, a2 2521; RV32ID-NEXT: or a0, a5, a0 2522; RV32ID-NEXT: and a0, a3, a0 2523; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2524; RV32ID-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2525; RV32ID-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload 2526; RV32ID-NEXT: addi sp, sp, 16 2527; RV32ID-NEXT: ret 2528; 2529; RV64ID-LABEL: fcvt_l_h_sat: 2530; RV64ID: # %bb.0: # %start 2531; RV64ID-NEXT: addi sp, sp, -16 2532; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2533; RV64ID-NEXT: call __extendhfsf2 2534; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 2535; RV64ID-NEXT: feq.s a1, fa0, fa0 2536; RV64ID-NEXT: seqz a1, a1 2537; RV64ID-NEXT: addi a1, a1, -1 2538; RV64ID-NEXT: and a0, a1, a0 2539; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2540; RV64ID-NEXT: addi sp, sp, 16 2541; RV64ID-NEXT: ret 2542; 2543; RV32IFZFHMIN-LABEL: fcvt_l_h_sat: 2544; RV32IFZFHMIN: # %bb.0: # %start 2545; RV32IFZFHMIN-NEXT: addi sp, sp, -16 2546; RV32IFZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2547; RV32IFZFHMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2548; RV32IFZFHMIN-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill 2549; RV32IFZFHMIN-NEXT: fcvt.s.h fs0, fa0 2550; RV32IFZFHMIN-NEXT: lui a0, 913408 2551; RV32IFZFHMIN-NEXT: fmv.w.x fa5, a0 2552; RV32IFZFHMIN-NEXT: fle.s s0, fa5, fs0 2553; RV32IFZFHMIN-NEXT: fmv.s fa0, fs0 2554; RV32IFZFHMIN-NEXT: call __fixsfdi 2555; RV32IFZFHMIN-NEXT: lui a3, 524288 2556; RV32IFZFHMIN-NEXT: lui a2, 524288 2557; RV32IFZFHMIN-NEXT: beqz s0, .LBB10_2 2558; RV32IFZFHMIN-NEXT: # %bb.1: # %start 2559; RV32IFZFHMIN-NEXT: mv a2, a1 2560; RV32IFZFHMIN-NEXT: .LBB10_2: # %start 2561; RV32IFZFHMIN-NEXT: lui a1, %hi(.LCPI10_0) 2562; RV32IFZFHMIN-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2563; RV32IFZFHMIN-NEXT: flt.s a1, fa5, fs0 2564; RV32IFZFHMIN-NEXT: beqz a1, .LBB10_4 2565; RV32IFZFHMIN-NEXT: # %bb.3: 2566; RV32IFZFHMIN-NEXT: addi a2, a3, -1 2567; RV32IFZFHMIN-NEXT: .LBB10_4: # %start 2568; RV32IFZFHMIN-NEXT: feq.s a3, fs0, fs0 2569; RV32IFZFHMIN-NEXT: neg a4, a1 2570; RV32IFZFHMIN-NEXT: neg a1, s0 2571; RV32IFZFHMIN-NEXT: neg a3, a3 2572; RV32IFZFHMIN-NEXT: and a0, a1, a0 2573; RV32IFZFHMIN-NEXT: and a1, a3, a2 2574; RV32IFZFHMIN-NEXT: or a0, a4, a0 2575; RV32IFZFHMIN-NEXT: and a0, a3, a0 2576; RV32IFZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2577; RV32IFZFHMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2578; RV32IFZFHMIN-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload 2579; RV32IFZFHMIN-NEXT: addi sp, sp, 16 2580; RV32IFZFHMIN-NEXT: ret 2581; 2582; CHECK64-IZFHMIN-LABEL: fcvt_l_h_sat: 2583; CHECK64-IZFHMIN: # %bb.0: # %start 2584; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 2585; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 2586; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 2587; CHECK64-IZFHMIN-NEXT: seqz a1, a1 2588; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 2589; CHECK64-IZFHMIN-NEXT: and a0, a1, a0 2590; CHECK64-IZFHMIN-NEXT: ret 2591; 2592; RV32IDZFHMIN-LABEL: fcvt_l_h_sat: 2593; RV32IDZFHMIN: # %bb.0: # %start 2594; RV32IDZFHMIN-NEXT: addi sp, sp, -16 2595; RV32IDZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2596; RV32IDZFHMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2597; RV32IDZFHMIN-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill 2598; RV32IDZFHMIN-NEXT: fcvt.s.h fs0, fa0 2599; RV32IDZFHMIN-NEXT: lui a0, 913408 2600; RV32IDZFHMIN-NEXT: fmv.w.x fa5, a0 2601; RV32IDZFHMIN-NEXT: fle.s s0, fa5, fs0 2602; RV32IDZFHMIN-NEXT: fmv.s fa0, fs0 2603; RV32IDZFHMIN-NEXT: call __fixsfdi 2604; RV32IDZFHMIN-NEXT: lui a3, 524288 2605; RV32IDZFHMIN-NEXT: lui a2, 524288 2606; RV32IDZFHMIN-NEXT: beqz s0, .LBB10_2 2607; RV32IDZFHMIN-NEXT: # %bb.1: # %start 2608; RV32IDZFHMIN-NEXT: mv a2, a1 2609; RV32IDZFHMIN-NEXT: .LBB10_2: # %start 2610; RV32IDZFHMIN-NEXT: lui a1, %hi(.LCPI10_0) 2611; RV32IDZFHMIN-NEXT: flw fa5, %lo(.LCPI10_0)(a1) 2612; RV32IDZFHMIN-NEXT: flt.s a1, fa5, fs0 2613; RV32IDZFHMIN-NEXT: beqz a1, .LBB10_4 2614; RV32IDZFHMIN-NEXT: # %bb.3: 2615; RV32IDZFHMIN-NEXT: addi a2, a3, -1 2616; RV32IDZFHMIN-NEXT: .LBB10_4: # %start 2617; RV32IDZFHMIN-NEXT: feq.s a3, fs0, fs0 2618; RV32IDZFHMIN-NEXT: neg a4, a1 2619; RV32IDZFHMIN-NEXT: neg a1, s0 2620; RV32IDZFHMIN-NEXT: neg a3, a3 2621; RV32IDZFHMIN-NEXT: and a0, a1, a0 2622; RV32IDZFHMIN-NEXT: and a1, a3, a2 2623; RV32IDZFHMIN-NEXT: or a0, a4, a0 2624; RV32IDZFHMIN-NEXT: and a0, a3, a0 2625; RV32IDZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2626; RV32IDZFHMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2627; RV32IDZFHMIN-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload 2628; RV32IDZFHMIN-NEXT: addi sp, sp, 16 2629; RV32IDZFHMIN-NEXT: ret 2630; 2631; CHECK32-IZHINXMIN-LABEL: fcvt_l_h_sat: 2632; CHECK32-IZHINXMIN: # %bb.0: # %start 2633; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 2634; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2635; CHECK32-IZHINXMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2636; CHECK32-IZHINXMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2637; CHECK32-IZHINXMIN-NEXT: fcvt.s.h s0, a0 2638; CHECK32-IZHINXMIN-NEXT: lui a0, 913408 2639; CHECK32-IZHINXMIN-NEXT: fle.s s1, a0, s0 2640; CHECK32-IZHINXMIN-NEXT: mv a0, s0 2641; CHECK32-IZHINXMIN-NEXT: call __fixsfdi 2642; CHECK32-IZHINXMIN-NEXT: lui a3, 524288 2643; CHECK32-IZHINXMIN-NEXT: lui a2, 524288 2644; CHECK32-IZHINXMIN-NEXT: beqz s1, .LBB10_2 2645; CHECK32-IZHINXMIN-NEXT: # %bb.1: # %start 2646; CHECK32-IZHINXMIN-NEXT: mv a2, a1 2647; CHECK32-IZHINXMIN-NEXT: .LBB10_2: # %start 2648; CHECK32-IZHINXMIN-NEXT: lui a1, 389120 2649; CHECK32-IZHINXMIN-NEXT: addi a1, a1, -1 2650; CHECK32-IZHINXMIN-NEXT: flt.s a1, a1, s0 2651; CHECK32-IZHINXMIN-NEXT: beqz a1, .LBB10_4 2652; CHECK32-IZHINXMIN-NEXT: # %bb.3: 2653; CHECK32-IZHINXMIN-NEXT: addi a2, a3, -1 2654; CHECK32-IZHINXMIN-NEXT: .LBB10_4: # %start 2655; CHECK32-IZHINXMIN-NEXT: feq.s a3, s0, s0 2656; CHECK32-IZHINXMIN-NEXT: neg a4, a1 2657; CHECK32-IZHINXMIN-NEXT: neg a1, s1 2658; CHECK32-IZHINXMIN-NEXT: neg a3, a3 2659; CHECK32-IZHINXMIN-NEXT: and a0, a1, a0 2660; CHECK32-IZHINXMIN-NEXT: and a1, a3, a2 2661; CHECK32-IZHINXMIN-NEXT: or a0, a4, a0 2662; CHECK32-IZHINXMIN-NEXT: and a0, a3, a0 2663; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2664; CHECK32-IZHINXMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2665; CHECK32-IZHINXMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2666; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 2667; CHECK32-IZHINXMIN-NEXT: ret 2668; 2669; CHECK64-IZHINXMIN-LABEL: fcvt_l_h_sat: 2670; CHECK64-IZHINXMIN: # %bb.0: # %start 2671; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 2672; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a1, a0, rtz 2673; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 2674; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 2675; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 2676; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 2677; CHECK64-IZHINXMIN-NEXT: ret 2678; 2679; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_l_h_sat: 2680; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 2681; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 2682; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2683; CHECK32-IZDINXZHINXMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2684; CHECK32-IZDINXZHINXMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2685; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h s0, a0 2686; CHECK32-IZDINXZHINXMIN-NEXT: lui a0, 913408 2687; CHECK32-IZDINXZHINXMIN-NEXT: fle.s s1, a0, s0 2688; CHECK32-IZDINXZHINXMIN-NEXT: mv a0, s0 2689; CHECK32-IZDINXZHINXMIN-NEXT: call __fixsfdi 2690; CHECK32-IZDINXZHINXMIN-NEXT: lui a3, 524288 2691; CHECK32-IZDINXZHINXMIN-NEXT: lui a2, 524288 2692; CHECK32-IZDINXZHINXMIN-NEXT: beqz s1, .LBB10_2 2693; CHECK32-IZDINXZHINXMIN-NEXT: # %bb.1: # %start 2694; CHECK32-IZDINXZHINXMIN-NEXT: mv a2, a1 2695; CHECK32-IZDINXZHINXMIN-NEXT: .LBB10_2: # %start 2696; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 389120 2697; CHECK32-IZDINXZHINXMIN-NEXT: addi a1, a1, -1 2698; CHECK32-IZDINXZHINXMIN-NEXT: flt.s a1, a1, s0 2699; CHECK32-IZDINXZHINXMIN-NEXT: beqz a1, .LBB10_4 2700; CHECK32-IZDINXZHINXMIN-NEXT: # %bb.3: 2701; CHECK32-IZDINXZHINXMIN-NEXT: addi a2, a3, -1 2702; CHECK32-IZDINXZHINXMIN-NEXT: .LBB10_4: # %start 2703; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a3, s0, s0 2704; CHECK32-IZDINXZHINXMIN-NEXT: neg a4, a1 2705; CHECK32-IZDINXZHINXMIN-NEXT: neg a1, s1 2706; CHECK32-IZDINXZHINXMIN-NEXT: neg a3, a3 2707; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a1, a0 2708; CHECK32-IZDINXZHINXMIN-NEXT: and a1, a3, a2 2709; CHECK32-IZDINXZHINXMIN-NEXT: or a0, a4, a0 2710; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a3, a0 2711; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2712; CHECK32-IZDINXZHINXMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2713; CHECK32-IZDINXZHINXMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2714; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 2715; CHECK32-IZDINXZHINXMIN-NEXT: ret 2716; 2717; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_l_h_sat: 2718; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 2719; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 2720; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a1, a0, rtz 2721; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 2722; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 2723; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 2724; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 2725; CHECK64-IZDINXZHINXMIN-NEXT: ret 2726start: 2727 %0 = tail call i64 @llvm.fptosi.sat.i64.f16(half %a) 2728 ret i64 %0 2729} 2730declare i64 @llvm.fptosi.sat.i64.f16(half) 2731 2732define i64 @fcvt_lu_h(half %a) nounwind { 2733; RV32IZFH-LABEL: fcvt_lu_h: 2734; RV32IZFH: # %bb.0: 2735; RV32IZFH-NEXT: addi sp, sp, -16 2736; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2737; RV32IZFH-NEXT: call __fixunshfdi 2738; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2739; RV32IZFH-NEXT: addi sp, sp, 16 2740; RV32IZFH-NEXT: ret 2741; 2742; RV64IZFH-LABEL: fcvt_lu_h: 2743; RV64IZFH: # %bb.0: 2744; RV64IZFH-NEXT: fcvt.lu.h a0, fa0, rtz 2745; RV64IZFH-NEXT: ret 2746; 2747; RV32IDZFH-LABEL: fcvt_lu_h: 2748; RV32IDZFH: # %bb.0: 2749; RV32IDZFH-NEXT: addi sp, sp, -16 2750; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2751; RV32IDZFH-NEXT: call __fixunshfdi 2752; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2753; RV32IDZFH-NEXT: addi sp, sp, 16 2754; RV32IDZFH-NEXT: ret 2755; 2756; RV64IDZFH-LABEL: fcvt_lu_h: 2757; RV64IDZFH: # %bb.0: 2758; RV64IDZFH-NEXT: fcvt.lu.h a0, fa0, rtz 2759; RV64IDZFH-NEXT: ret 2760; 2761; RV32IZHINX-LABEL: fcvt_lu_h: 2762; RV32IZHINX: # %bb.0: 2763; RV32IZHINX-NEXT: addi sp, sp, -16 2764; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2765; RV32IZHINX-NEXT: call __fixunshfdi 2766; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2767; RV32IZHINX-NEXT: addi sp, sp, 16 2768; RV32IZHINX-NEXT: ret 2769; 2770; RV64IZHINX-LABEL: fcvt_lu_h: 2771; RV64IZHINX: # %bb.0: 2772; RV64IZHINX-NEXT: fcvt.lu.h a0, a0, rtz 2773; RV64IZHINX-NEXT: ret 2774; 2775; RV32IZDINXZHINX-LABEL: fcvt_lu_h: 2776; RV32IZDINXZHINX: # %bb.0: 2777; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 2778; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2779; RV32IZDINXZHINX-NEXT: call __fixunshfdi 2780; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2781; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 2782; RV32IZDINXZHINX-NEXT: ret 2783; 2784; RV64IZDINXZHINX-LABEL: fcvt_lu_h: 2785; RV64IZDINXZHINX: # %bb.0: 2786; RV64IZDINXZHINX-NEXT: fcvt.lu.h a0, a0, rtz 2787; RV64IZDINXZHINX-NEXT: ret 2788; 2789; RV32I-LABEL: fcvt_lu_h: 2790; RV32I: # %bb.0: 2791; RV32I-NEXT: addi sp, sp, -16 2792; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2793; RV32I-NEXT: call __extendhfsf2 2794; RV32I-NEXT: call __fixunssfdi 2795; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2796; RV32I-NEXT: addi sp, sp, 16 2797; RV32I-NEXT: ret 2798; 2799; RV64I-LABEL: fcvt_lu_h: 2800; RV64I: # %bb.0: 2801; RV64I-NEXT: addi sp, sp, -16 2802; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2803; RV64I-NEXT: slli a0, a0, 48 2804; RV64I-NEXT: srli a0, a0, 48 2805; RV64I-NEXT: call __extendhfsf2 2806; RV64I-NEXT: call __fixunssfdi 2807; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2808; RV64I-NEXT: addi sp, sp, 16 2809; RV64I-NEXT: ret 2810; 2811; RV32ID-ILP32-LABEL: fcvt_lu_h: 2812; RV32ID-ILP32: # %bb.0: 2813; RV32ID-ILP32-NEXT: addi sp, sp, -16 2814; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2815; RV32ID-ILP32-NEXT: call __extendhfsf2 2816; RV32ID-ILP32-NEXT: call __fixunssfdi 2817; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2818; RV32ID-ILP32-NEXT: addi sp, sp, 16 2819; RV32ID-ILP32-NEXT: ret 2820; 2821; RV64ID-LP64-LABEL: fcvt_lu_h: 2822; RV64ID-LP64: # %bb.0: 2823; RV64ID-LP64-NEXT: addi sp, sp, -16 2824; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2825; RV64ID-LP64-NEXT: call __extendhfsf2 2826; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 2827; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 2828; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2829; RV64ID-LP64-NEXT: addi sp, sp, 16 2830; RV64ID-LP64-NEXT: ret 2831; 2832; RV32ID-LABEL: fcvt_lu_h: 2833; RV32ID: # %bb.0: 2834; RV32ID-NEXT: addi sp, sp, -16 2835; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2836; RV32ID-NEXT: call __extendhfsf2 2837; RV32ID-NEXT: call __fixunssfdi 2838; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2839; RV32ID-NEXT: addi sp, sp, 16 2840; RV32ID-NEXT: ret 2841; 2842; RV64ID-LABEL: fcvt_lu_h: 2843; RV64ID: # %bb.0: 2844; RV64ID-NEXT: addi sp, sp, -16 2845; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2846; RV64ID-NEXT: call __extendhfsf2 2847; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 2848; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2849; RV64ID-NEXT: addi sp, sp, 16 2850; RV64ID-NEXT: ret 2851; 2852; CHECK32-IZFHMIN-LABEL: fcvt_lu_h: 2853; CHECK32-IZFHMIN: # %bb.0: 2854; CHECK32-IZFHMIN-NEXT: addi sp, sp, -16 2855; CHECK32-IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2856; CHECK32-IZFHMIN-NEXT: call __fixunshfdi 2857; CHECK32-IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2858; CHECK32-IZFHMIN-NEXT: addi sp, sp, 16 2859; CHECK32-IZFHMIN-NEXT: ret 2860; 2861; CHECK64-IZFHMIN-LABEL: fcvt_lu_h: 2862; CHECK64-IZFHMIN: # %bb.0: 2863; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 2864; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 2865; CHECK64-IZFHMIN-NEXT: ret 2866; 2867; CHECK32-IZHINXMIN-LABEL: fcvt_lu_h: 2868; CHECK32-IZHINXMIN: # %bb.0: 2869; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 2870; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2871; CHECK32-IZHINXMIN-NEXT: call __fixunshfdi 2872; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2873; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 2874; CHECK32-IZHINXMIN-NEXT: ret 2875; 2876; CHECK64-IZHINXMIN-LABEL: fcvt_lu_h: 2877; CHECK64-IZHINXMIN: # %bb.0: 2878; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 2879; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 2880; CHECK64-IZHINXMIN-NEXT: ret 2881; 2882; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_lu_h: 2883; CHECK32-IZDINXZHINXMIN: # %bb.0: 2884; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 2885; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2886; CHECK32-IZDINXZHINXMIN-NEXT: call __fixunshfdi 2887; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2888; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 2889; CHECK32-IZDINXZHINXMIN-NEXT: ret 2890; 2891; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_lu_h: 2892; CHECK64-IZDINXZHINXMIN: # %bb.0: 2893; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 2894; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 2895; CHECK64-IZDINXZHINXMIN-NEXT: ret 2896 %1 = fptoui half %a to i64 2897 ret i64 %1 2898} 2899 2900define i64 @fcvt_lu_h_sat(half %a) nounwind { 2901; RV32IZFH-LABEL: fcvt_lu_h_sat: 2902; RV32IZFH: # %bb.0: # %start 2903; RV32IZFH-NEXT: addi sp, sp, -16 2904; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2905; RV32IZFH-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2906; RV32IZFH-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2907; RV32IZFH-NEXT: lui a0, %hi(.LCPI12_0) 2908; RV32IZFH-NEXT: flw fa5, %lo(.LCPI12_0)(a0) 2909; RV32IZFH-NEXT: fcvt.s.h fa0, fa0 2910; RV32IZFH-NEXT: fmv.w.x fa4, zero 2911; RV32IZFH-NEXT: fle.s a0, fa4, fa0 2912; RV32IZFH-NEXT: flt.s a1, fa5, fa0 2913; RV32IZFH-NEXT: neg s0, a1 2914; RV32IZFH-NEXT: neg s1, a0 2915; RV32IZFH-NEXT: call __fixunssfdi 2916; RV32IZFH-NEXT: and a0, s1, a0 2917; RV32IZFH-NEXT: and a1, s1, a1 2918; RV32IZFH-NEXT: or a0, s0, a0 2919; RV32IZFH-NEXT: or a1, s0, a1 2920; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2921; RV32IZFH-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2922; RV32IZFH-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2923; RV32IZFH-NEXT: addi sp, sp, 16 2924; RV32IZFH-NEXT: ret 2925; 2926; RV64IZFH-LABEL: fcvt_lu_h_sat: 2927; RV64IZFH: # %bb.0: # %start 2928; RV64IZFH-NEXT: fcvt.lu.h a0, fa0, rtz 2929; RV64IZFH-NEXT: feq.h a1, fa0, fa0 2930; RV64IZFH-NEXT: seqz a1, a1 2931; RV64IZFH-NEXT: addi a1, a1, -1 2932; RV64IZFH-NEXT: and a0, a1, a0 2933; RV64IZFH-NEXT: ret 2934; 2935; RV32IDZFH-LABEL: fcvt_lu_h_sat: 2936; RV32IDZFH: # %bb.0: # %start 2937; RV32IDZFH-NEXT: addi sp, sp, -16 2938; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2939; RV32IDZFH-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2940; RV32IDZFH-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2941; RV32IDZFH-NEXT: lui a0, %hi(.LCPI12_0) 2942; RV32IDZFH-NEXT: flw fa5, %lo(.LCPI12_0)(a0) 2943; RV32IDZFH-NEXT: fcvt.s.h fa0, fa0 2944; RV32IDZFH-NEXT: fmv.w.x fa4, zero 2945; RV32IDZFH-NEXT: fle.s a0, fa4, fa0 2946; RV32IDZFH-NEXT: flt.s a1, fa5, fa0 2947; RV32IDZFH-NEXT: neg s0, a1 2948; RV32IDZFH-NEXT: neg s1, a0 2949; RV32IDZFH-NEXT: call __fixunssfdi 2950; RV32IDZFH-NEXT: and a0, s1, a0 2951; RV32IDZFH-NEXT: and a1, s1, a1 2952; RV32IDZFH-NEXT: or a0, s0, a0 2953; RV32IDZFH-NEXT: or a1, s0, a1 2954; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2955; RV32IDZFH-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2956; RV32IDZFH-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2957; RV32IDZFH-NEXT: addi sp, sp, 16 2958; RV32IDZFH-NEXT: ret 2959; 2960; RV64IDZFH-LABEL: fcvt_lu_h_sat: 2961; RV64IDZFH: # %bb.0: # %start 2962; RV64IDZFH-NEXT: fcvt.lu.h a0, fa0, rtz 2963; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 2964; RV64IDZFH-NEXT: seqz a1, a1 2965; RV64IDZFH-NEXT: addi a1, a1, -1 2966; RV64IDZFH-NEXT: and a0, a1, a0 2967; RV64IDZFH-NEXT: ret 2968; 2969; RV32IZHINX-LABEL: fcvt_lu_h_sat: 2970; RV32IZHINX: # %bb.0: # %start 2971; RV32IZHINX-NEXT: addi sp, sp, -16 2972; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2973; RV32IZHINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2974; RV32IZHINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2975; RV32IZHINX-NEXT: fcvt.s.h a0, a0 2976; RV32IZHINX-NEXT: lui a1, 391168 2977; RV32IZHINX-NEXT: addi a1, a1, -1 2978; RV32IZHINX-NEXT: fle.s a2, zero, a0 2979; RV32IZHINX-NEXT: flt.s a1, a1, a0 2980; RV32IZHINX-NEXT: neg s0, a1 2981; RV32IZHINX-NEXT: neg s1, a2 2982; RV32IZHINX-NEXT: call __fixunssfdi 2983; RV32IZHINX-NEXT: and a0, s1, a0 2984; RV32IZHINX-NEXT: and a1, s1, a1 2985; RV32IZHINX-NEXT: or a0, s0, a0 2986; RV32IZHINX-NEXT: or a1, s0, a1 2987; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2988; RV32IZHINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2989; RV32IZHINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2990; RV32IZHINX-NEXT: addi sp, sp, 16 2991; RV32IZHINX-NEXT: ret 2992; 2993; RV64IZHINX-LABEL: fcvt_lu_h_sat: 2994; RV64IZHINX: # %bb.0: # %start 2995; RV64IZHINX-NEXT: fcvt.lu.h a1, a0, rtz 2996; RV64IZHINX-NEXT: feq.h a0, a0, a0 2997; RV64IZHINX-NEXT: seqz a0, a0 2998; RV64IZHINX-NEXT: addi a0, a0, -1 2999; RV64IZHINX-NEXT: and a0, a0, a1 3000; RV64IZHINX-NEXT: ret 3001; 3002; RV32IZDINXZHINX-LABEL: fcvt_lu_h_sat: 3003; RV32IZDINXZHINX: # %bb.0: # %start 3004; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 3005; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3006; RV32IZDINXZHINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3007; RV32IZDINXZHINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3008; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 3009; RV32IZDINXZHINX-NEXT: lui a1, 391168 3010; RV32IZDINXZHINX-NEXT: addi a1, a1, -1 3011; RV32IZDINXZHINX-NEXT: fle.s a2, zero, a0 3012; RV32IZDINXZHINX-NEXT: flt.s a1, a1, a0 3013; RV32IZDINXZHINX-NEXT: neg s0, a1 3014; RV32IZDINXZHINX-NEXT: neg s1, a2 3015; RV32IZDINXZHINX-NEXT: call __fixunssfdi 3016; RV32IZDINXZHINX-NEXT: and a0, s1, a0 3017; RV32IZDINXZHINX-NEXT: and a1, s1, a1 3018; RV32IZDINXZHINX-NEXT: or a0, s0, a0 3019; RV32IZDINXZHINX-NEXT: or a1, s0, a1 3020; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3021; RV32IZDINXZHINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3022; RV32IZDINXZHINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3023; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 3024; RV32IZDINXZHINX-NEXT: ret 3025; 3026; RV64IZDINXZHINX-LABEL: fcvt_lu_h_sat: 3027; RV64IZDINXZHINX: # %bb.0: # %start 3028; RV64IZDINXZHINX-NEXT: fcvt.lu.h a1, a0, rtz 3029; RV64IZDINXZHINX-NEXT: feq.h a0, a0, a0 3030; RV64IZDINXZHINX-NEXT: seqz a0, a0 3031; RV64IZDINXZHINX-NEXT: addi a0, a0, -1 3032; RV64IZDINXZHINX-NEXT: and a0, a0, a1 3033; RV64IZDINXZHINX-NEXT: ret 3034; 3035; RV32I-LABEL: fcvt_lu_h_sat: 3036; RV32I: # %bb.0: # %start 3037; RV32I-NEXT: addi sp, sp, -16 3038; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3039; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3040; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3041; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 3042; RV32I-NEXT: call __extendhfsf2 3043; RV32I-NEXT: mv s0, a0 3044; RV32I-NEXT: lui a1, 391168 3045; RV32I-NEXT: addi a1, a1, -1 3046; RV32I-NEXT: call __gtsf2 3047; RV32I-NEXT: sgtz a0, a0 3048; RV32I-NEXT: neg s1, a0 3049; RV32I-NEXT: mv a0, s0 3050; RV32I-NEXT: li a1, 0 3051; RV32I-NEXT: call __gesf2 3052; RV32I-NEXT: slti a0, a0, 0 3053; RV32I-NEXT: addi s2, a0, -1 3054; RV32I-NEXT: mv a0, s0 3055; RV32I-NEXT: call __fixunssfdi 3056; RV32I-NEXT: and a0, s2, a0 3057; RV32I-NEXT: and a1, s2, a1 3058; RV32I-NEXT: or a0, s1, a0 3059; RV32I-NEXT: or a1, s1, a1 3060; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3061; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3062; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3063; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 3064; RV32I-NEXT: addi sp, sp, 16 3065; RV32I-NEXT: ret 3066; 3067; RV64I-LABEL: fcvt_lu_h_sat: 3068; RV64I: # %bb.0: # %start 3069; RV64I-NEXT: addi sp, sp, -32 3070; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3071; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3072; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3073; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 3074; RV64I-NEXT: slli a0, a0, 48 3075; RV64I-NEXT: srli a0, a0, 48 3076; RV64I-NEXT: call __extendhfsf2 3077; RV64I-NEXT: mv s0, a0 3078; RV64I-NEXT: lui a1, 391168 3079; RV64I-NEXT: addiw a1, a1, -1 3080; RV64I-NEXT: call __gtsf2 3081; RV64I-NEXT: sgtz a0, a0 3082; RV64I-NEXT: neg s1, a0 3083; RV64I-NEXT: mv a0, s0 3084; RV64I-NEXT: li a1, 0 3085; RV64I-NEXT: call __gesf2 3086; RV64I-NEXT: slti a0, a0, 0 3087; RV64I-NEXT: addi s2, a0, -1 3088; RV64I-NEXT: mv a0, s0 3089; RV64I-NEXT: call __fixunssfdi 3090; RV64I-NEXT: and a0, s2, a0 3091; RV64I-NEXT: or a0, s1, a0 3092; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3093; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3094; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3095; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 3096; RV64I-NEXT: addi sp, sp, 32 3097; RV64I-NEXT: ret 3098; 3099; RV32ID-ILP32-LABEL: fcvt_lu_h_sat: 3100; RV32ID-ILP32: # %bb.0: # %start 3101; RV32ID-ILP32-NEXT: addi sp, sp, -16 3102; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3103; RV32ID-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3104; RV32ID-ILP32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3105; RV32ID-ILP32-NEXT: call __extendhfsf2 3106; RV32ID-ILP32-NEXT: lui a1, %hi(.LCPI12_0) 3107; RV32ID-ILP32-NEXT: flw fa5, %lo(.LCPI12_0)(a1) 3108; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 3109; RV32ID-ILP32-NEXT: fmv.w.x fa3, zero 3110; RV32ID-ILP32-NEXT: fle.s a1, fa3, fa4 3111; RV32ID-ILP32-NEXT: flt.s a2, fa5, fa4 3112; RV32ID-ILP32-NEXT: neg s0, a2 3113; RV32ID-ILP32-NEXT: neg s1, a1 3114; RV32ID-ILP32-NEXT: call __fixunssfdi 3115; RV32ID-ILP32-NEXT: and a0, s1, a0 3116; RV32ID-ILP32-NEXT: and a1, s1, a1 3117; RV32ID-ILP32-NEXT: or a0, s0, a0 3118; RV32ID-ILP32-NEXT: or a1, s0, a1 3119; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3120; RV32ID-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3121; RV32ID-ILP32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3122; RV32ID-ILP32-NEXT: addi sp, sp, 16 3123; RV32ID-ILP32-NEXT: ret 3124; 3125; RV64ID-LP64-LABEL: fcvt_lu_h_sat: 3126; RV64ID-LP64: # %bb.0: # %start 3127; RV64ID-LP64-NEXT: addi sp, sp, -16 3128; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3129; RV64ID-LP64-NEXT: call __extendhfsf2 3130; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 3131; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 3132; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 3133; RV64ID-LP64-NEXT: seqz a1, a1 3134; RV64ID-LP64-NEXT: addi a1, a1, -1 3135; RV64ID-LP64-NEXT: and a0, a1, a0 3136; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3137; RV64ID-LP64-NEXT: addi sp, sp, 16 3138; RV64ID-LP64-NEXT: ret 3139; 3140; RV32ID-LABEL: fcvt_lu_h_sat: 3141; RV32ID: # %bb.0: # %start 3142; RV32ID-NEXT: addi sp, sp, -16 3143; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3144; RV32ID-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3145; RV32ID-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3146; RV32ID-NEXT: call __extendhfsf2 3147; RV32ID-NEXT: lui a0, %hi(.LCPI12_0) 3148; RV32ID-NEXT: flw fa5, %lo(.LCPI12_0)(a0) 3149; RV32ID-NEXT: fmv.w.x fa4, zero 3150; RV32ID-NEXT: fle.s a0, fa4, fa0 3151; RV32ID-NEXT: flt.s a1, fa5, fa0 3152; RV32ID-NEXT: neg s0, a1 3153; RV32ID-NEXT: neg s1, a0 3154; RV32ID-NEXT: call __fixunssfdi 3155; RV32ID-NEXT: and a0, s1, a0 3156; RV32ID-NEXT: and a1, s1, a1 3157; RV32ID-NEXT: or a0, s0, a0 3158; RV32ID-NEXT: or a1, s0, a1 3159; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3160; RV32ID-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3161; RV32ID-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3162; RV32ID-NEXT: addi sp, sp, 16 3163; RV32ID-NEXT: ret 3164; 3165; RV64ID-LABEL: fcvt_lu_h_sat: 3166; RV64ID: # %bb.0: # %start 3167; RV64ID-NEXT: addi sp, sp, -16 3168; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3169; RV64ID-NEXT: call __extendhfsf2 3170; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 3171; RV64ID-NEXT: feq.s a1, fa0, fa0 3172; RV64ID-NEXT: seqz a1, a1 3173; RV64ID-NEXT: addi a1, a1, -1 3174; RV64ID-NEXT: and a0, a1, a0 3175; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3176; RV64ID-NEXT: addi sp, sp, 16 3177; RV64ID-NEXT: ret 3178; 3179; CHECK32-IZFHMIN-LABEL: fcvt_lu_h_sat: 3180; CHECK32-IZFHMIN: # %bb.0: # %start 3181; CHECK32-IZFHMIN-NEXT: addi sp, sp, -16 3182; CHECK32-IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3183; CHECK32-IZFHMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3184; CHECK32-IZFHMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3185; CHECK32-IZFHMIN-NEXT: lui a0, %hi(.LCPI12_0) 3186; CHECK32-IZFHMIN-NEXT: flw fa5, %lo(.LCPI12_0)(a0) 3187; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa0, fa0 3188; CHECK32-IZFHMIN-NEXT: fmv.w.x fa4, zero 3189; CHECK32-IZFHMIN-NEXT: fle.s a0, fa4, fa0 3190; CHECK32-IZFHMIN-NEXT: flt.s a1, fa5, fa0 3191; CHECK32-IZFHMIN-NEXT: neg s0, a1 3192; CHECK32-IZFHMIN-NEXT: neg s1, a0 3193; CHECK32-IZFHMIN-NEXT: call __fixunssfdi 3194; CHECK32-IZFHMIN-NEXT: and a0, s1, a0 3195; CHECK32-IZFHMIN-NEXT: and a1, s1, a1 3196; CHECK32-IZFHMIN-NEXT: or a0, s0, a0 3197; CHECK32-IZFHMIN-NEXT: or a1, s0, a1 3198; CHECK32-IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3199; CHECK32-IZFHMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3200; CHECK32-IZFHMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3201; CHECK32-IZFHMIN-NEXT: addi sp, sp, 16 3202; CHECK32-IZFHMIN-NEXT: ret 3203; 3204; CHECK64-IZFHMIN-LABEL: fcvt_lu_h_sat: 3205; CHECK64-IZFHMIN: # %bb.0: # %start 3206; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 3207; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 3208; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 3209; CHECK64-IZFHMIN-NEXT: seqz a1, a1 3210; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 3211; CHECK64-IZFHMIN-NEXT: and a0, a1, a0 3212; CHECK64-IZFHMIN-NEXT: ret 3213; 3214; CHECK32-IZHINXMIN-LABEL: fcvt_lu_h_sat: 3215; CHECK32-IZHINXMIN: # %bb.0: # %start 3216; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 3217; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3218; CHECK32-IZHINXMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3219; CHECK32-IZHINXMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3220; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 3221; CHECK32-IZHINXMIN-NEXT: lui a1, 391168 3222; CHECK32-IZHINXMIN-NEXT: addi a1, a1, -1 3223; CHECK32-IZHINXMIN-NEXT: fle.s a2, zero, a0 3224; CHECK32-IZHINXMIN-NEXT: flt.s a1, a1, a0 3225; CHECK32-IZHINXMIN-NEXT: neg s0, a1 3226; CHECK32-IZHINXMIN-NEXT: neg s1, a2 3227; CHECK32-IZHINXMIN-NEXT: call __fixunssfdi 3228; CHECK32-IZHINXMIN-NEXT: and a0, s1, a0 3229; CHECK32-IZHINXMIN-NEXT: and a1, s1, a1 3230; CHECK32-IZHINXMIN-NEXT: or a0, s0, a0 3231; CHECK32-IZHINXMIN-NEXT: or a1, s0, a1 3232; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3233; CHECK32-IZHINXMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3234; CHECK32-IZHINXMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3235; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 3236; CHECK32-IZHINXMIN-NEXT: ret 3237; 3238; CHECK64-IZHINXMIN-LABEL: fcvt_lu_h_sat: 3239; CHECK64-IZHINXMIN: # %bb.0: # %start 3240; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 3241; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a1, a0, rtz 3242; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 3243; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 3244; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 3245; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 3246; CHECK64-IZHINXMIN-NEXT: ret 3247; 3248; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_lu_h_sat: 3249; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 3250; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 3251; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3252; CHECK32-IZDINXZHINXMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3253; CHECK32-IZDINXZHINXMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3254; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 3255; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 391168 3256; CHECK32-IZDINXZHINXMIN-NEXT: addi a1, a1, -1 3257; CHECK32-IZDINXZHINXMIN-NEXT: fle.s a2, zero, a0 3258; CHECK32-IZDINXZHINXMIN-NEXT: flt.s a1, a1, a0 3259; CHECK32-IZDINXZHINXMIN-NEXT: neg s0, a1 3260; CHECK32-IZDINXZHINXMIN-NEXT: neg s1, a2 3261; CHECK32-IZDINXZHINXMIN-NEXT: call __fixunssfdi 3262; CHECK32-IZDINXZHINXMIN-NEXT: and a0, s1, a0 3263; CHECK32-IZDINXZHINXMIN-NEXT: and a1, s1, a1 3264; CHECK32-IZDINXZHINXMIN-NEXT: or a0, s0, a0 3265; CHECK32-IZDINXZHINXMIN-NEXT: or a1, s0, a1 3266; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3267; CHECK32-IZDINXZHINXMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 3268; CHECK32-IZDINXZHINXMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 3269; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 3270; CHECK32-IZDINXZHINXMIN-NEXT: ret 3271; 3272; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_lu_h_sat: 3273; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 3274; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 3275; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a1, a0, rtz 3276; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 3277; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 3278; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 3279; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 3280; CHECK64-IZDINXZHINXMIN-NEXT: ret 3281start: 3282 %0 = tail call i64 @llvm.fptoui.sat.i64.f16(half %a) 3283 ret i64 %0 3284} 3285declare i64 @llvm.fptoui.sat.i64.f16(half) 3286 3287define half @fcvt_h_si(i16 %a) nounwind { 3288; RV32IZFH-LABEL: fcvt_h_si: 3289; RV32IZFH: # %bb.0: 3290; RV32IZFH-NEXT: slli a0, a0, 16 3291; RV32IZFH-NEXT: srai a0, a0, 16 3292; RV32IZFH-NEXT: fcvt.h.w fa0, a0 3293; RV32IZFH-NEXT: ret 3294; 3295; RV64IZFH-LABEL: fcvt_h_si: 3296; RV64IZFH: # %bb.0: 3297; RV64IZFH-NEXT: slli a0, a0, 48 3298; RV64IZFH-NEXT: srai a0, a0, 48 3299; RV64IZFH-NEXT: fcvt.h.w fa0, a0 3300; RV64IZFH-NEXT: ret 3301; 3302; RV32IDZFH-LABEL: fcvt_h_si: 3303; RV32IDZFH: # %bb.0: 3304; RV32IDZFH-NEXT: slli a0, a0, 16 3305; RV32IDZFH-NEXT: srai a0, a0, 16 3306; RV32IDZFH-NEXT: fcvt.h.w fa0, a0 3307; RV32IDZFH-NEXT: ret 3308; 3309; RV64IDZFH-LABEL: fcvt_h_si: 3310; RV64IDZFH: # %bb.0: 3311; RV64IDZFH-NEXT: slli a0, a0, 48 3312; RV64IDZFH-NEXT: srai a0, a0, 48 3313; RV64IDZFH-NEXT: fcvt.h.w fa0, a0 3314; RV64IDZFH-NEXT: ret 3315; 3316; RV32IZHINX-LABEL: fcvt_h_si: 3317; RV32IZHINX: # %bb.0: 3318; RV32IZHINX-NEXT: slli a0, a0, 16 3319; RV32IZHINX-NEXT: srai a0, a0, 16 3320; RV32IZHINX-NEXT: fcvt.h.w a0, a0 3321; RV32IZHINX-NEXT: ret 3322; 3323; RV64IZHINX-LABEL: fcvt_h_si: 3324; RV64IZHINX: # %bb.0: 3325; RV64IZHINX-NEXT: slli a0, a0, 48 3326; RV64IZHINX-NEXT: srai a0, a0, 48 3327; RV64IZHINX-NEXT: fcvt.h.w a0, a0 3328; RV64IZHINX-NEXT: ret 3329; 3330; RV32IZDINXZHINX-LABEL: fcvt_h_si: 3331; RV32IZDINXZHINX: # %bb.0: 3332; RV32IZDINXZHINX-NEXT: slli a0, a0, 16 3333; RV32IZDINXZHINX-NEXT: srai a0, a0, 16 3334; RV32IZDINXZHINX-NEXT: fcvt.h.w a0, a0 3335; RV32IZDINXZHINX-NEXT: ret 3336; 3337; RV64IZDINXZHINX-LABEL: fcvt_h_si: 3338; RV64IZDINXZHINX: # %bb.0: 3339; RV64IZDINXZHINX-NEXT: slli a0, a0, 48 3340; RV64IZDINXZHINX-NEXT: srai a0, a0, 48 3341; RV64IZDINXZHINX-NEXT: fcvt.h.w a0, a0 3342; RV64IZDINXZHINX-NEXT: ret 3343; 3344; RV32I-LABEL: fcvt_h_si: 3345; RV32I: # %bb.0: 3346; RV32I-NEXT: addi sp, sp, -16 3347; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3348; RV32I-NEXT: slli a0, a0, 16 3349; RV32I-NEXT: srai a0, a0, 16 3350; RV32I-NEXT: call __floatsisf 3351; RV32I-NEXT: call __truncsfhf2 3352; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3353; RV32I-NEXT: addi sp, sp, 16 3354; RV32I-NEXT: ret 3355; 3356; RV64I-LABEL: fcvt_h_si: 3357; RV64I: # %bb.0: 3358; RV64I-NEXT: addi sp, sp, -16 3359; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3360; RV64I-NEXT: slli a0, a0, 48 3361; RV64I-NEXT: srai a0, a0, 48 3362; RV64I-NEXT: call __floatsisf 3363; RV64I-NEXT: call __truncsfhf2 3364; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3365; RV64I-NEXT: addi sp, sp, 16 3366; RV64I-NEXT: ret 3367; 3368; RV32ID-ILP32-LABEL: fcvt_h_si: 3369; RV32ID-ILP32: # %bb.0: 3370; RV32ID-ILP32-NEXT: addi sp, sp, -16 3371; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3372; RV32ID-ILP32-NEXT: slli a0, a0, 16 3373; RV32ID-ILP32-NEXT: srai a0, a0, 16 3374; RV32ID-ILP32-NEXT: fcvt.s.w fa5, a0 3375; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 3376; RV32ID-ILP32-NEXT: call __truncsfhf2 3377; RV32ID-ILP32-NEXT: lui a1, 1048560 3378; RV32ID-ILP32-NEXT: or a0, a0, a1 3379; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3380; RV32ID-ILP32-NEXT: addi sp, sp, 16 3381; RV32ID-ILP32-NEXT: ret 3382; 3383; RV64ID-LP64-LABEL: fcvt_h_si: 3384; RV64ID-LP64: # %bb.0: 3385; RV64ID-LP64-NEXT: addi sp, sp, -16 3386; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3387; RV64ID-LP64-NEXT: slli a0, a0, 48 3388; RV64ID-LP64-NEXT: srai a0, a0, 48 3389; RV64ID-LP64-NEXT: fcvt.s.w fa5, a0 3390; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 3391; RV64ID-LP64-NEXT: call __truncsfhf2 3392; RV64ID-LP64-NEXT: lui a1, 1048560 3393; RV64ID-LP64-NEXT: or a0, a0, a1 3394; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3395; RV64ID-LP64-NEXT: addi sp, sp, 16 3396; RV64ID-LP64-NEXT: ret 3397; 3398; RV32ID-LABEL: fcvt_h_si: 3399; RV32ID: # %bb.0: 3400; RV32ID-NEXT: addi sp, sp, -16 3401; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3402; RV32ID-NEXT: slli a0, a0, 16 3403; RV32ID-NEXT: srai a0, a0, 16 3404; RV32ID-NEXT: fcvt.s.w fa0, a0 3405; RV32ID-NEXT: call __truncsfhf2 3406; RV32ID-NEXT: fmv.x.w a0, fa0 3407; RV32ID-NEXT: lui a1, 1048560 3408; RV32ID-NEXT: or a0, a0, a1 3409; RV32ID-NEXT: fmv.w.x fa0, a0 3410; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3411; RV32ID-NEXT: addi sp, sp, 16 3412; RV32ID-NEXT: ret 3413; 3414; RV64ID-LABEL: fcvt_h_si: 3415; RV64ID: # %bb.0: 3416; RV64ID-NEXT: addi sp, sp, -16 3417; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3418; RV64ID-NEXT: slli a0, a0, 48 3419; RV64ID-NEXT: srai a0, a0, 48 3420; RV64ID-NEXT: fcvt.s.w fa0, a0 3421; RV64ID-NEXT: call __truncsfhf2 3422; RV64ID-NEXT: fmv.x.w a0, fa0 3423; RV64ID-NEXT: lui a1, 1048560 3424; RV64ID-NEXT: or a0, a0, a1 3425; RV64ID-NEXT: fmv.w.x fa0, a0 3426; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3427; RV64ID-NEXT: addi sp, sp, 16 3428; RV64ID-NEXT: ret 3429; 3430; CHECK32-IZFHMIN-LABEL: fcvt_h_si: 3431; CHECK32-IZFHMIN: # %bb.0: 3432; CHECK32-IZFHMIN-NEXT: slli a0, a0, 16 3433; CHECK32-IZFHMIN-NEXT: srai a0, a0, 16 3434; CHECK32-IZFHMIN-NEXT: fcvt.s.w fa5, a0 3435; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3436; CHECK32-IZFHMIN-NEXT: ret 3437; 3438; CHECK64-IZFHMIN-LABEL: fcvt_h_si: 3439; CHECK64-IZFHMIN: # %bb.0: 3440; CHECK64-IZFHMIN-NEXT: slli a0, a0, 48 3441; CHECK64-IZFHMIN-NEXT: srai a0, a0, 48 3442; CHECK64-IZFHMIN-NEXT: fcvt.s.w fa5, a0 3443; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3444; CHECK64-IZFHMIN-NEXT: ret 3445; 3446; CHECK32-IZHINXMIN-LABEL: fcvt_h_si: 3447; CHECK32-IZHINXMIN: # %bb.0: 3448; CHECK32-IZHINXMIN-NEXT: slli a0, a0, 16 3449; CHECK32-IZHINXMIN-NEXT: srai a0, a0, 16 3450; CHECK32-IZHINXMIN-NEXT: fcvt.s.w a0, a0 3451; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3452; CHECK32-IZHINXMIN-NEXT: ret 3453; 3454; CHECK64-IZHINXMIN-LABEL: fcvt_h_si: 3455; CHECK64-IZHINXMIN: # %bb.0: 3456; CHECK64-IZHINXMIN-NEXT: slli a0, a0, 48 3457; CHECK64-IZHINXMIN-NEXT: srai a0, a0, 48 3458; CHECK64-IZHINXMIN-NEXT: fcvt.s.w a0, a0 3459; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3460; CHECK64-IZHINXMIN-NEXT: ret 3461; 3462; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_si: 3463; CHECK32-IZDINXZHINXMIN: # %bb.0: 3464; CHECK32-IZDINXZHINXMIN-NEXT: slli a0, a0, 16 3465; CHECK32-IZDINXZHINXMIN-NEXT: srai a0, a0, 16 3466; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 3467; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3468; CHECK32-IZDINXZHINXMIN-NEXT: ret 3469; 3470; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_si: 3471; CHECK64-IZDINXZHINXMIN: # %bb.0: 3472; CHECK64-IZDINXZHINXMIN-NEXT: slli a0, a0, 48 3473; CHECK64-IZDINXZHINXMIN-NEXT: srai a0, a0, 48 3474; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 3475; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3476; CHECK64-IZDINXZHINXMIN-NEXT: ret 3477 %1 = sitofp i16 %a to half 3478 ret half %1 3479} 3480 3481define half @fcvt_h_si_signext(i16 signext %a) nounwind { 3482; CHECKIZFH-LABEL: fcvt_h_si_signext: 3483; CHECKIZFH: # %bb.0: 3484; CHECKIZFH-NEXT: fcvt.h.w fa0, a0 3485; CHECKIZFH-NEXT: ret 3486; 3487; RV32IDZFH-LABEL: fcvt_h_si_signext: 3488; RV32IDZFH: # %bb.0: 3489; RV32IDZFH-NEXT: fcvt.h.w fa0, a0 3490; RV32IDZFH-NEXT: ret 3491; 3492; RV64IDZFH-LABEL: fcvt_h_si_signext: 3493; RV64IDZFH: # %bb.0: 3494; RV64IDZFH-NEXT: fcvt.h.w fa0, a0 3495; RV64IDZFH-NEXT: ret 3496; 3497; CHECKIZHINX-LABEL: fcvt_h_si_signext: 3498; CHECKIZHINX: # %bb.0: 3499; CHECKIZHINX-NEXT: fcvt.h.w a0, a0 3500; CHECKIZHINX-NEXT: ret 3501; 3502; CHECKIZDINXZHINX-LABEL: fcvt_h_si_signext: 3503; CHECKIZDINXZHINX: # %bb.0: 3504; CHECKIZDINXZHINX-NEXT: fcvt.h.w a0, a0 3505; CHECKIZDINXZHINX-NEXT: ret 3506; 3507; RV32I-LABEL: fcvt_h_si_signext: 3508; RV32I: # %bb.0: 3509; RV32I-NEXT: addi sp, sp, -16 3510; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3511; RV32I-NEXT: call __floatsisf 3512; RV32I-NEXT: call __truncsfhf2 3513; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3514; RV32I-NEXT: addi sp, sp, 16 3515; RV32I-NEXT: ret 3516; 3517; RV64I-LABEL: fcvt_h_si_signext: 3518; RV64I: # %bb.0: 3519; RV64I-NEXT: addi sp, sp, -16 3520; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3521; RV64I-NEXT: call __floatsisf 3522; RV64I-NEXT: call __truncsfhf2 3523; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3524; RV64I-NEXT: addi sp, sp, 16 3525; RV64I-NEXT: ret 3526; 3527; RV32ID-ILP32-LABEL: fcvt_h_si_signext: 3528; RV32ID-ILP32: # %bb.0: 3529; RV32ID-ILP32-NEXT: addi sp, sp, -16 3530; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3531; RV32ID-ILP32-NEXT: fcvt.s.w fa5, a0 3532; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 3533; RV32ID-ILP32-NEXT: call __truncsfhf2 3534; RV32ID-ILP32-NEXT: lui a1, 1048560 3535; RV32ID-ILP32-NEXT: or a0, a0, a1 3536; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3537; RV32ID-ILP32-NEXT: addi sp, sp, 16 3538; RV32ID-ILP32-NEXT: ret 3539; 3540; RV64ID-LP64-LABEL: fcvt_h_si_signext: 3541; RV64ID-LP64: # %bb.0: 3542; RV64ID-LP64-NEXT: addi sp, sp, -16 3543; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3544; RV64ID-LP64-NEXT: fcvt.s.w fa5, a0 3545; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 3546; RV64ID-LP64-NEXT: call __truncsfhf2 3547; RV64ID-LP64-NEXT: lui a1, 1048560 3548; RV64ID-LP64-NEXT: or a0, a0, a1 3549; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3550; RV64ID-LP64-NEXT: addi sp, sp, 16 3551; RV64ID-LP64-NEXT: ret 3552; 3553; RV32ID-LABEL: fcvt_h_si_signext: 3554; RV32ID: # %bb.0: 3555; RV32ID-NEXT: addi sp, sp, -16 3556; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3557; RV32ID-NEXT: fcvt.s.w fa0, a0 3558; RV32ID-NEXT: call __truncsfhf2 3559; RV32ID-NEXT: fmv.x.w a0, fa0 3560; RV32ID-NEXT: lui a1, 1048560 3561; RV32ID-NEXT: or a0, a0, a1 3562; RV32ID-NEXT: fmv.w.x fa0, a0 3563; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3564; RV32ID-NEXT: addi sp, sp, 16 3565; RV32ID-NEXT: ret 3566; 3567; RV64ID-LABEL: fcvt_h_si_signext: 3568; RV64ID: # %bb.0: 3569; RV64ID-NEXT: addi sp, sp, -16 3570; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3571; RV64ID-NEXT: fcvt.s.w fa0, a0 3572; RV64ID-NEXT: call __truncsfhf2 3573; RV64ID-NEXT: fmv.x.w a0, fa0 3574; RV64ID-NEXT: lui a1, 1048560 3575; RV64ID-NEXT: or a0, a0, a1 3576; RV64ID-NEXT: fmv.w.x fa0, a0 3577; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3578; RV64ID-NEXT: addi sp, sp, 16 3579; RV64ID-NEXT: ret 3580; 3581; CHECK32-IZFHMIN-LABEL: fcvt_h_si_signext: 3582; CHECK32-IZFHMIN: # %bb.0: 3583; CHECK32-IZFHMIN-NEXT: fcvt.s.w fa5, a0 3584; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3585; CHECK32-IZFHMIN-NEXT: ret 3586; 3587; CHECK64-IZFHMIN-LABEL: fcvt_h_si_signext: 3588; CHECK64-IZFHMIN: # %bb.0: 3589; CHECK64-IZFHMIN-NEXT: fcvt.s.w fa5, a0 3590; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3591; CHECK64-IZFHMIN-NEXT: ret 3592; 3593; CHECK32-IZHINXMIN-LABEL: fcvt_h_si_signext: 3594; CHECK32-IZHINXMIN: # %bb.0: 3595; CHECK32-IZHINXMIN-NEXT: fcvt.s.w a0, a0 3596; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3597; CHECK32-IZHINXMIN-NEXT: ret 3598; 3599; CHECK64-IZHINXMIN-LABEL: fcvt_h_si_signext: 3600; CHECK64-IZHINXMIN: # %bb.0: 3601; CHECK64-IZHINXMIN-NEXT: fcvt.s.w a0, a0 3602; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3603; CHECK64-IZHINXMIN-NEXT: ret 3604; 3605; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_si_signext: 3606; CHECK32-IZDINXZHINXMIN: # %bb.0: 3607; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 3608; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3609; CHECK32-IZDINXZHINXMIN-NEXT: ret 3610; 3611; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_si_signext: 3612; CHECK64-IZDINXZHINXMIN: # %bb.0: 3613; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 3614; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3615; CHECK64-IZDINXZHINXMIN-NEXT: ret 3616 %1 = sitofp i16 %a to half 3617 ret half %1 3618} 3619 3620define half @fcvt_h_ui(i16 %a) nounwind { 3621; RV32IZFH-LABEL: fcvt_h_ui: 3622; RV32IZFH: # %bb.0: 3623; RV32IZFH-NEXT: slli a0, a0, 16 3624; RV32IZFH-NEXT: srli a0, a0, 16 3625; RV32IZFH-NEXT: fcvt.h.wu fa0, a0 3626; RV32IZFH-NEXT: ret 3627; 3628; RV64IZFH-LABEL: fcvt_h_ui: 3629; RV64IZFH: # %bb.0: 3630; RV64IZFH-NEXT: slli a0, a0, 48 3631; RV64IZFH-NEXT: srli a0, a0, 48 3632; RV64IZFH-NEXT: fcvt.h.wu fa0, a0 3633; RV64IZFH-NEXT: ret 3634; 3635; RV32IDZFH-LABEL: fcvt_h_ui: 3636; RV32IDZFH: # %bb.0: 3637; RV32IDZFH-NEXT: slli a0, a0, 16 3638; RV32IDZFH-NEXT: srli a0, a0, 16 3639; RV32IDZFH-NEXT: fcvt.h.wu fa0, a0 3640; RV32IDZFH-NEXT: ret 3641; 3642; RV64IDZFH-LABEL: fcvt_h_ui: 3643; RV64IDZFH: # %bb.0: 3644; RV64IDZFH-NEXT: slli a0, a0, 48 3645; RV64IDZFH-NEXT: srli a0, a0, 48 3646; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 3647; RV64IDZFH-NEXT: ret 3648; 3649; RV32IZHINX-LABEL: fcvt_h_ui: 3650; RV32IZHINX: # %bb.0: 3651; RV32IZHINX-NEXT: slli a0, a0, 16 3652; RV32IZHINX-NEXT: srli a0, a0, 16 3653; RV32IZHINX-NEXT: fcvt.h.wu a0, a0 3654; RV32IZHINX-NEXT: ret 3655; 3656; RV64IZHINX-LABEL: fcvt_h_ui: 3657; RV64IZHINX: # %bb.0: 3658; RV64IZHINX-NEXT: slli a0, a0, 48 3659; RV64IZHINX-NEXT: srli a0, a0, 48 3660; RV64IZHINX-NEXT: fcvt.h.wu a0, a0 3661; RV64IZHINX-NEXT: ret 3662; 3663; RV32IZDINXZHINX-LABEL: fcvt_h_ui: 3664; RV32IZDINXZHINX: # %bb.0: 3665; RV32IZDINXZHINX-NEXT: slli a0, a0, 16 3666; RV32IZDINXZHINX-NEXT: srli a0, a0, 16 3667; RV32IZDINXZHINX-NEXT: fcvt.h.wu a0, a0 3668; RV32IZDINXZHINX-NEXT: ret 3669; 3670; RV64IZDINXZHINX-LABEL: fcvt_h_ui: 3671; RV64IZDINXZHINX: # %bb.0: 3672; RV64IZDINXZHINX-NEXT: slli a0, a0, 48 3673; RV64IZDINXZHINX-NEXT: srli a0, a0, 48 3674; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0 3675; RV64IZDINXZHINX-NEXT: ret 3676; 3677; RV32I-LABEL: fcvt_h_ui: 3678; RV32I: # %bb.0: 3679; RV32I-NEXT: addi sp, sp, -16 3680; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3681; RV32I-NEXT: slli a0, a0, 16 3682; RV32I-NEXT: srli a0, a0, 16 3683; RV32I-NEXT: call __floatunsisf 3684; RV32I-NEXT: call __truncsfhf2 3685; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3686; RV32I-NEXT: addi sp, sp, 16 3687; RV32I-NEXT: ret 3688; 3689; RV64I-LABEL: fcvt_h_ui: 3690; RV64I: # %bb.0: 3691; RV64I-NEXT: addi sp, sp, -16 3692; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3693; RV64I-NEXT: slli a0, a0, 48 3694; RV64I-NEXT: srli a0, a0, 48 3695; RV64I-NEXT: call __floatunsisf 3696; RV64I-NEXT: call __truncsfhf2 3697; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3698; RV64I-NEXT: addi sp, sp, 16 3699; RV64I-NEXT: ret 3700; 3701; RV32ID-ILP32-LABEL: fcvt_h_ui: 3702; RV32ID-ILP32: # %bb.0: 3703; RV32ID-ILP32-NEXT: addi sp, sp, -16 3704; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3705; RV32ID-ILP32-NEXT: slli a0, a0, 16 3706; RV32ID-ILP32-NEXT: srli a0, a0, 16 3707; RV32ID-ILP32-NEXT: fcvt.s.wu fa5, a0 3708; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 3709; RV32ID-ILP32-NEXT: call __truncsfhf2 3710; RV32ID-ILP32-NEXT: lui a1, 1048560 3711; RV32ID-ILP32-NEXT: or a0, a0, a1 3712; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3713; RV32ID-ILP32-NEXT: addi sp, sp, 16 3714; RV32ID-ILP32-NEXT: ret 3715; 3716; RV64ID-LP64-LABEL: fcvt_h_ui: 3717; RV64ID-LP64: # %bb.0: 3718; RV64ID-LP64-NEXT: addi sp, sp, -16 3719; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3720; RV64ID-LP64-NEXT: slli a0, a0, 48 3721; RV64ID-LP64-NEXT: srli a0, a0, 48 3722; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0 3723; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 3724; RV64ID-LP64-NEXT: call __truncsfhf2 3725; RV64ID-LP64-NEXT: lui a1, 1048560 3726; RV64ID-LP64-NEXT: or a0, a0, a1 3727; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3728; RV64ID-LP64-NEXT: addi sp, sp, 16 3729; RV64ID-LP64-NEXT: ret 3730; 3731; RV32ID-LABEL: fcvt_h_ui: 3732; RV32ID: # %bb.0: 3733; RV32ID-NEXT: addi sp, sp, -16 3734; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3735; RV32ID-NEXT: slli a0, a0, 16 3736; RV32ID-NEXT: srli a0, a0, 16 3737; RV32ID-NEXT: fcvt.s.wu fa0, a0 3738; RV32ID-NEXT: call __truncsfhf2 3739; RV32ID-NEXT: fmv.x.w a0, fa0 3740; RV32ID-NEXT: lui a1, 1048560 3741; RV32ID-NEXT: or a0, a0, a1 3742; RV32ID-NEXT: fmv.w.x fa0, a0 3743; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3744; RV32ID-NEXT: addi sp, sp, 16 3745; RV32ID-NEXT: ret 3746; 3747; RV64ID-LABEL: fcvt_h_ui: 3748; RV64ID: # %bb.0: 3749; RV64ID-NEXT: addi sp, sp, -16 3750; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3751; RV64ID-NEXT: slli a0, a0, 48 3752; RV64ID-NEXT: srli a0, a0, 48 3753; RV64ID-NEXT: fcvt.s.wu fa0, a0 3754; RV64ID-NEXT: call __truncsfhf2 3755; RV64ID-NEXT: fmv.x.w a0, fa0 3756; RV64ID-NEXT: lui a1, 1048560 3757; RV64ID-NEXT: or a0, a0, a1 3758; RV64ID-NEXT: fmv.w.x fa0, a0 3759; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3760; RV64ID-NEXT: addi sp, sp, 16 3761; RV64ID-NEXT: ret 3762; 3763; CHECK32-IZFHMIN-LABEL: fcvt_h_ui: 3764; CHECK32-IZFHMIN: # %bb.0: 3765; CHECK32-IZFHMIN-NEXT: slli a0, a0, 16 3766; CHECK32-IZFHMIN-NEXT: srli a0, a0, 16 3767; CHECK32-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 3768; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3769; CHECK32-IZFHMIN-NEXT: ret 3770; 3771; CHECK64-IZFHMIN-LABEL: fcvt_h_ui: 3772; CHECK64-IZFHMIN: # %bb.0: 3773; CHECK64-IZFHMIN-NEXT: slli a0, a0, 48 3774; CHECK64-IZFHMIN-NEXT: srli a0, a0, 48 3775; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 3776; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3777; CHECK64-IZFHMIN-NEXT: ret 3778; 3779; CHECK32-IZHINXMIN-LABEL: fcvt_h_ui: 3780; CHECK32-IZHINXMIN: # %bb.0: 3781; CHECK32-IZHINXMIN-NEXT: slli a0, a0, 16 3782; CHECK32-IZHINXMIN-NEXT: srli a0, a0, 16 3783; CHECK32-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 3784; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3785; CHECK32-IZHINXMIN-NEXT: ret 3786; 3787; CHECK64-IZHINXMIN-LABEL: fcvt_h_ui: 3788; CHECK64-IZHINXMIN: # %bb.0: 3789; CHECK64-IZHINXMIN-NEXT: slli a0, a0, 48 3790; CHECK64-IZHINXMIN-NEXT: srli a0, a0, 48 3791; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 3792; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3793; CHECK64-IZHINXMIN-NEXT: ret 3794; 3795; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_ui: 3796; CHECK32-IZDINXZHINXMIN: # %bb.0: 3797; CHECK32-IZDINXZHINXMIN-NEXT: slli a0, a0, 16 3798; CHECK32-IZDINXZHINXMIN-NEXT: srli a0, a0, 16 3799; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 3800; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3801; CHECK32-IZDINXZHINXMIN-NEXT: ret 3802; 3803; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_ui: 3804; CHECK64-IZDINXZHINXMIN: # %bb.0: 3805; CHECK64-IZDINXZHINXMIN-NEXT: slli a0, a0, 48 3806; CHECK64-IZDINXZHINXMIN-NEXT: srli a0, a0, 48 3807; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 3808; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3809; CHECK64-IZDINXZHINXMIN-NEXT: ret 3810 %1 = uitofp i16 %a to half 3811 ret half %1 3812} 3813 3814define half @fcvt_h_ui_zeroext(i16 zeroext %a) nounwind { 3815; CHECKIZFH-LABEL: fcvt_h_ui_zeroext: 3816; CHECKIZFH: # %bb.0: 3817; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0 3818; CHECKIZFH-NEXT: ret 3819; 3820; RV32IDZFH-LABEL: fcvt_h_ui_zeroext: 3821; RV32IDZFH: # %bb.0: 3822; RV32IDZFH-NEXT: fcvt.h.wu fa0, a0 3823; RV32IDZFH-NEXT: ret 3824; 3825; RV64IDZFH-LABEL: fcvt_h_ui_zeroext: 3826; RV64IDZFH: # %bb.0: 3827; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 3828; RV64IDZFH-NEXT: ret 3829; 3830; CHECKIZHINX-LABEL: fcvt_h_ui_zeroext: 3831; CHECKIZHINX: # %bb.0: 3832; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0 3833; CHECKIZHINX-NEXT: ret 3834; 3835; CHECKIZDINXZHINX-LABEL: fcvt_h_ui_zeroext: 3836; CHECKIZDINXZHINX: # %bb.0: 3837; CHECKIZDINXZHINX-NEXT: fcvt.h.wu a0, a0 3838; CHECKIZDINXZHINX-NEXT: ret 3839; 3840; RV32I-LABEL: fcvt_h_ui_zeroext: 3841; RV32I: # %bb.0: 3842; RV32I-NEXT: addi sp, sp, -16 3843; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3844; RV32I-NEXT: call __floatunsisf 3845; RV32I-NEXT: call __truncsfhf2 3846; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3847; RV32I-NEXT: addi sp, sp, 16 3848; RV32I-NEXT: ret 3849; 3850; RV64I-LABEL: fcvt_h_ui_zeroext: 3851; RV64I: # %bb.0: 3852; RV64I-NEXT: addi sp, sp, -16 3853; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3854; RV64I-NEXT: call __floatunsisf 3855; RV64I-NEXT: call __truncsfhf2 3856; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3857; RV64I-NEXT: addi sp, sp, 16 3858; RV64I-NEXT: ret 3859; 3860; RV32ID-ILP32-LABEL: fcvt_h_ui_zeroext: 3861; RV32ID-ILP32: # %bb.0: 3862; RV32ID-ILP32-NEXT: addi sp, sp, -16 3863; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3864; RV32ID-ILP32-NEXT: fcvt.s.wu fa5, a0 3865; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 3866; RV32ID-ILP32-NEXT: call __truncsfhf2 3867; RV32ID-ILP32-NEXT: lui a1, 1048560 3868; RV32ID-ILP32-NEXT: or a0, a0, a1 3869; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3870; RV32ID-ILP32-NEXT: addi sp, sp, 16 3871; RV32ID-ILP32-NEXT: ret 3872; 3873; RV64ID-LP64-LABEL: fcvt_h_ui_zeroext: 3874; RV64ID-LP64: # %bb.0: 3875; RV64ID-LP64-NEXT: addi sp, sp, -16 3876; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3877; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0 3878; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 3879; RV64ID-LP64-NEXT: call __truncsfhf2 3880; RV64ID-LP64-NEXT: lui a1, 1048560 3881; RV64ID-LP64-NEXT: or a0, a0, a1 3882; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3883; RV64ID-LP64-NEXT: addi sp, sp, 16 3884; RV64ID-LP64-NEXT: ret 3885; 3886; RV32ID-LABEL: fcvt_h_ui_zeroext: 3887; RV32ID: # %bb.0: 3888; RV32ID-NEXT: addi sp, sp, -16 3889; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3890; RV32ID-NEXT: fcvt.s.wu fa0, a0 3891; RV32ID-NEXT: call __truncsfhf2 3892; RV32ID-NEXT: fmv.x.w a0, fa0 3893; RV32ID-NEXT: lui a1, 1048560 3894; RV32ID-NEXT: or a0, a0, a1 3895; RV32ID-NEXT: fmv.w.x fa0, a0 3896; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3897; RV32ID-NEXT: addi sp, sp, 16 3898; RV32ID-NEXT: ret 3899; 3900; RV64ID-LABEL: fcvt_h_ui_zeroext: 3901; RV64ID: # %bb.0: 3902; RV64ID-NEXT: addi sp, sp, -16 3903; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3904; RV64ID-NEXT: fcvt.s.wu fa0, a0 3905; RV64ID-NEXT: call __truncsfhf2 3906; RV64ID-NEXT: fmv.x.w a0, fa0 3907; RV64ID-NEXT: lui a1, 1048560 3908; RV64ID-NEXT: or a0, a0, a1 3909; RV64ID-NEXT: fmv.w.x fa0, a0 3910; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3911; RV64ID-NEXT: addi sp, sp, 16 3912; RV64ID-NEXT: ret 3913; 3914; CHECK32-IZFHMIN-LABEL: fcvt_h_ui_zeroext: 3915; CHECK32-IZFHMIN: # %bb.0: 3916; CHECK32-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 3917; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3918; CHECK32-IZFHMIN-NEXT: ret 3919; 3920; CHECK64-IZFHMIN-LABEL: fcvt_h_ui_zeroext: 3921; CHECK64-IZFHMIN: # %bb.0: 3922; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 3923; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 3924; CHECK64-IZFHMIN-NEXT: ret 3925; 3926; CHECK32-IZHINXMIN-LABEL: fcvt_h_ui_zeroext: 3927; CHECK32-IZHINXMIN: # %bb.0: 3928; CHECK32-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 3929; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3930; CHECK32-IZHINXMIN-NEXT: ret 3931; 3932; CHECK64-IZHINXMIN-LABEL: fcvt_h_ui_zeroext: 3933; CHECK64-IZHINXMIN: # %bb.0: 3934; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 3935; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 3936; CHECK64-IZHINXMIN-NEXT: ret 3937; 3938; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_ui_zeroext: 3939; CHECK32-IZDINXZHINXMIN: # %bb.0: 3940; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 3941; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3942; CHECK32-IZDINXZHINXMIN-NEXT: ret 3943; 3944; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_ui_zeroext: 3945; CHECK64-IZDINXZHINXMIN: # %bb.0: 3946; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 3947; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 3948; CHECK64-IZDINXZHINXMIN-NEXT: ret 3949 %1 = uitofp i16 %a to half 3950 ret half %1 3951} 3952 3953define half @fcvt_h_w(i32 %a) nounwind { 3954; CHECKIZFH-LABEL: fcvt_h_w: 3955; CHECKIZFH: # %bb.0: 3956; CHECKIZFH-NEXT: fcvt.h.w fa0, a0 3957; CHECKIZFH-NEXT: ret 3958; 3959; RV32IDZFH-LABEL: fcvt_h_w: 3960; RV32IDZFH: # %bb.0: 3961; RV32IDZFH-NEXT: fcvt.h.w fa0, a0 3962; RV32IDZFH-NEXT: ret 3963; 3964; RV64IDZFH-LABEL: fcvt_h_w: 3965; RV64IDZFH: # %bb.0: 3966; RV64IDZFH-NEXT: fcvt.h.w fa0, a0 3967; RV64IDZFH-NEXT: ret 3968; 3969; CHECKIZHINX-LABEL: fcvt_h_w: 3970; CHECKIZHINX: # %bb.0: 3971; CHECKIZHINX-NEXT: fcvt.h.w a0, a0 3972; CHECKIZHINX-NEXT: ret 3973; 3974; CHECKIZDINXZHINX-LABEL: fcvt_h_w: 3975; CHECKIZDINXZHINX: # %bb.0: 3976; CHECKIZDINXZHINX-NEXT: fcvt.h.w a0, a0 3977; CHECKIZDINXZHINX-NEXT: ret 3978; 3979; RV32I-LABEL: fcvt_h_w: 3980; RV32I: # %bb.0: 3981; RV32I-NEXT: addi sp, sp, -16 3982; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3983; RV32I-NEXT: call __floatsisf 3984; RV32I-NEXT: call __truncsfhf2 3985; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3986; RV32I-NEXT: addi sp, sp, 16 3987; RV32I-NEXT: ret 3988; 3989; RV64I-LABEL: fcvt_h_w: 3990; RV64I: # %bb.0: 3991; RV64I-NEXT: addi sp, sp, -16 3992; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3993; RV64I-NEXT: sext.w a0, a0 3994; RV64I-NEXT: call __floatsisf 3995; RV64I-NEXT: call __truncsfhf2 3996; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3997; RV64I-NEXT: addi sp, sp, 16 3998; RV64I-NEXT: ret 3999; 4000; RV32ID-ILP32-LABEL: fcvt_h_w: 4001; RV32ID-ILP32: # %bb.0: 4002; RV32ID-ILP32-NEXT: addi sp, sp, -16 4003; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4004; RV32ID-ILP32-NEXT: fcvt.s.w fa5, a0 4005; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 4006; RV32ID-ILP32-NEXT: call __truncsfhf2 4007; RV32ID-ILP32-NEXT: lui a1, 1048560 4008; RV32ID-ILP32-NEXT: or a0, a0, a1 4009; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4010; RV32ID-ILP32-NEXT: addi sp, sp, 16 4011; RV32ID-ILP32-NEXT: ret 4012; 4013; RV64ID-LP64-LABEL: fcvt_h_w: 4014; RV64ID-LP64: # %bb.0: 4015; RV64ID-LP64-NEXT: addi sp, sp, -16 4016; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4017; RV64ID-LP64-NEXT: fcvt.s.w fa5, a0 4018; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4019; RV64ID-LP64-NEXT: call __truncsfhf2 4020; RV64ID-LP64-NEXT: lui a1, 1048560 4021; RV64ID-LP64-NEXT: or a0, a0, a1 4022; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4023; RV64ID-LP64-NEXT: addi sp, sp, 16 4024; RV64ID-LP64-NEXT: ret 4025; 4026; RV32ID-LABEL: fcvt_h_w: 4027; RV32ID: # %bb.0: 4028; RV32ID-NEXT: addi sp, sp, -16 4029; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4030; RV32ID-NEXT: fcvt.s.w fa0, a0 4031; RV32ID-NEXT: call __truncsfhf2 4032; RV32ID-NEXT: fmv.x.w a0, fa0 4033; RV32ID-NEXT: lui a1, 1048560 4034; RV32ID-NEXT: or a0, a0, a1 4035; RV32ID-NEXT: fmv.w.x fa0, a0 4036; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4037; RV32ID-NEXT: addi sp, sp, 16 4038; RV32ID-NEXT: ret 4039; 4040; RV64ID-LABEL: fcvt_h_w: 4041; RV64ID: # %bb.0: 4042; RV64ID-NEXT: addi sp, sp, -16 4043; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4044; RV64ID-NEXT: fcvt.s.w fa0, a0 4045; RV64ID-NEXT: call __truncsfhf2 4046; RV64ID-NEXT: fmv.x.w a0, fa0 4047; RV64ID-NEXT: lui a1, 1048560 4048; RV64ID-NEXT: or a0, a0, a1 4049; RV64ID-NEXT: fmv.w.x fa0, a0 4050; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4051; RV64ID-NEXT: addi sp, sp, 16 4052; RV64ID-NEXT: ret 4053; 4054; CHECK32-IZFHMIN-LABEL: fcvt_h_w: 4055; CHECK32-IZFHMIN: # %bb.0: 4056; CHECK32-IZFHMIN-NEXT: fcvt.s.w fa5, a0 4057; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4058; CHECK32-IZFHMIN-NEXT: ret 4059; 4060; CHECK64-IZFHMIN-LABEL: fcvt_h_w: 4061; CHECK64-IZFHMIN: # %bb.0: 4062; CHECK64-IZFHMIN-NEXT: fcvt.s.w fa5, a0 4063; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4064; CHECK64-IZFHMIN-NEXT: ret 4065; 4066; CHECK32-IZHINXMIN-LABEL: fcvt_h_w: 4067; CHECK32-IZHINXMIN: # %bb.0: 4068; CHECK32-IZHINXMIN-NEXT: fcvt.s.w a0, a0 4069; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4070; CHECK32-IZHINXMIN-NEXT: ret 4071; 4072; CHECK64-IZHINXMIN-LABEL: fcvt_h_w: 4073; CHECK64-IZHINXMIN: # %bb.0: 4074; CHECK64-IZHINXMIN-NEXT: fcvt.s.w a0, a0 4075; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4076; CHECK64-IZHINXMIN-NEXT: ret 4077; 4078; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w: 4079; CHECK32-IZDINXZHINXMIN: # %bb.0: 4080; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 4081; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4082; CHECK32-IZDINXZHINXMIN-NEXT: ret 4083; 4084; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w: 4085; CHECK64-IZDINXZHINXMIN: # %bb.0: 4086; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 4087; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4088; CHECK64-IZDINXZHINXMIN-NEXT: ret 4089 %1 = sitofp i32 %a to half 4090 ret half %1 4091} 4092 4093define half @fcvt_h_w_load(ptr %p) nounwind { 4094; CHECKIZFH-LABEL: fcvt_h_w_load: 4095; CHECKIZFH: # %bb.0: 4096; CHECKIZFH-NEXT: lw a0, 0(a0) 4097; CHECKIZFH-NEXT: fcvt.h.w fa0, a0 4098; CHECKIZFH-NEXT: ret 4099; 4100; RV32IDZFH-LABEL: fcvt_h_w_load: 4101; RV32IDZFH: # %bb.0: 4102; RV32IDZFH-NEXT: lw a0, 0(a0) 4103; RV32IDZFH-NEXT: fcvt.h.w fa0, a0 4104; RV32IDZFH-NEXT: ret 4105; 4106; RV64IDZFH-LABEL: fcvt_h_w_load: 4107; RV64IDZFH: # %bb.0: 4108; RV64IDZFH-NEXT: lw a0, 0(a0) 4109; RV64IDZFH-NEXT: fcvt.h.w fa0, a0 4110; RV64IDZFH-NEXT: ret 4111; 4112; CHECKIZHINX-LABEL: fcvt_h_w_load: 4113; CHECKIZHINX: # %bb.0: 4114; CHECKIZHINX-NEXT: lw a0, 0(a0) 4115; CHECKIZHINX-NEXT: fcvt.h.w a0, a0 4116; CHECKIZHINX-NEXT: ret 4117; 4118; CHECKIZDINXZHINX-LABEL: fcvt_h_w_load: 4119; CHECKIZDINXZHINX: # %bb.0: 4120; CHECKIZDINXZHINX-NEXT: lw a0, 0(a0) 4121; CHECKIZDINXZHINX-NEXT: fcvt.h.w a0, a0 4122; CHECKIZDINXZHINX-NEXT: ret 4123; 4124; RV32I-LABEL: fcvt_h_w_load: 4125; RV32I: # %bb.0: 4126; RV32I-NEXT: addi sp, sp, -16 4127; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4128; RV32I-NEXT: lw a0, 0(a0) 4129; RV32I-NEXT: call __floatsisf 4130; RV32I-NEXT: call __truncsfhf2 4131; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4132; RV32I-NEXT: addi sp, sp, 16 4133; RV32I-NEXT: ret 4134; 4135; RV64I-LABEL: fcvt_h_w_load: 4136; RV64I: # %bb.0: 4137; RV64I-NEXT: addi sp, sp, -16 4138; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4139; RV64I-NEXT: lw a0, 0(a0) 4140; RV64I-NEXT: call __floatsisf 4141; RV64I-NEXT: call __truncsfhf2 4142; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4143; RV64I-NEXT: addi sp, sp, 16 4144; RV64I-NEXT: ret 4145; 4146; RV32ID-ILP32-LABEL: fcvt_h_w_load: 4147; RV32ID-ILP32: # %bb.0: 4148; RV32ID-ILP32-NEXT: addi sp, sp, -16 4149; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4150; RV32ID-ILP32-NEXT: lw a0, 0(a0) 4151; RV32ID-ILP32-NEXT: fcvt.s.w fa5, a0 4152; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 4153; RV32ID-ILP32-NEXT: call __truncsfhf2 4154; RV32ID-ILP32-NEXT: lui a1, 1048560 4155; RV32ID-ILP32-NEXT: or a0, a0, a1 4156; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4157; RV32ID-ILP32-NEXT: addi sp, sp, 16 4158; RV32ID-ILP32-NEXT: ret 4159; 4160; RV64ID-LP64-LABEL: fcvt_h_w_load: 4161; RV64ID-LP64: # %bb.0: 4162; RV64ID-LP64-NEXT: addi sp, sp, -16 4163; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4164; RV64ID-LP64-NEXT: lw a0, 0(a0) 4165; RV64ID-LP64-NEXT: fcvt.s.w fa5, a0 4166; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4167; RV64ID-LP64-NEXT: call __truncsfhf2 4168; RV64ID-LP64-NEXT: lui a1, 1048560 4169; RV64ID-LP64-NEXT: or a0, a0, a1 4170; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4171; RV64ID-LP64-NEXT: addi sp, sp, 16 4172; RV64ID-LP64-NEXT: ret 4173; 4174; RV32ID-LABEL: fcvt_h_w_load: 4175; RV32ID: # %bb.0: 4176; RV32ID-NEXT: addi sp, sp, -16 4177; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4178; RV32ID-NEXT: lw a0, 0(a0) 4179; RV32ID-NEXT: fcvt.s.w fa0, a0 4180; RV32ID-NEXT: call __truncsfhf2 4181; RV32ID-NEXT: fmv.x.w a0, fa0 4182; RV32ID-NEXT: lui a1, 1048560 4183; RV32ID-NEXT: or a0, a0, a1 4184; RV32ID-NEXT: fmv.w.x fa0, a0 4185; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4186; RV32ID-NEXT: addi sp, sp, 16 4187; RV32ID-NEXT: ret 4188; 4189; RV64ID-LABEL: fcvt_h_w_load: 4190; RV64ID: # %bb.0: 4191; RV64ID-NEXT: addi sp, sp, -16 4192; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4193; RV64ID-NEXT: lw a0, 0(a0) 4194; RV64ID-NEXT: fcvt.s.w fa0, a0 4195; RV64ID-NEXT: call __truncsfhf2 4196; RV64ID-NEXT: fmv.x.w a0, fa0 4197; RV64ID-NEXT: lui a1, 1048560 4198; RV64ID-NEXT: or a0, a0, a1 4199; RV64ID-NEXT: fmv.w.x fa0, a0 4200; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4201; RV64ID-NEXT: addi sp, sp, 16 4202; RV64ID-NEXT: ret 4203; 4204; CHECK32-IZFHMIN-LABEL: fcvt_h_w_load: 4205; CHECK32-IZFHMIN: # %bb.0: 4206; CHECK32-IZFHMIN-NEXT: lw a0, 0(a0) 4207; CHECK32-IZFHMIN-NEXT: fcvt.s.w fa5, a0 4208; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4209; CHECK32-IZFHMIN-NEXT: ret 4210; 4211; CHECK64-IZFHMIN-LABEL: fcvt_h_w_load: 4212; CHECK64-IZFHMIN: # %bb.0: 4213; CHECK64-IZFHMIN-NEXT: lw a0, 0(a0) 4214; CHECK64-IZFHMIN-NEXT: fcvt.s.w fa5, a0 4215; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4216; CHECK64-IZFHMIN-NEXT: ret 4217; 4218; CHECK32-IZHINXMIN-LABEL: fcvt_h_w_load: 4219; CHECK32-IZHINXMIN: # %bb.0: 4220; CHECK32-IZHINXMIN-NEXT: lw a0, 0(a0) 4221; CHECK32-IZHINXMIN-NEXT: fcvt.s.w a0, a0 4222; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4223; CHECK32-IZHINXMIN-NEXT: ret 4224; 4225; CHECK64-IZHINXMIN-LABEL: fcvt_h_w_load: 4226; CHECK64-IZHINXMIN: # %bb.0: 4227; CHECK64-IZHINXMIN-NEXT: lw a0, 0(a0) 4228; CHECK64-IZHINXMIN-NEXT: fcvt.s.w a0, a0 4229; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4230; CHECK64-IZHINXMIN-NEXT: ret 4231; 4232; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w_load: 4233; CHECK32-IZDINXZHINXMIN: # %bb.0: 4234; CHECK32-IZDINXZHINXMIN-NEXT: lw a0, 0(a0) 4235; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 4236; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4237; CHECK32-IZDINXZHINXMIN-NEXT: ret 4238; 4239; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w_load: 4240; CHECK64-IZDINXZHINXMIN: # %bb.0: 4241; CHECK64-IZDINXZHINXMIN-NEXT: lw a0, 0(a0) 4242; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.w a0, a0 4243; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4244; CHECK64-IZDINXZHINXMIN-NEXT: ret 4245 %a = load i32, ptr %p 4246 %1 = sitofp i32 %a to half 4247 ret half %1 4248} 4249 4250define half @fcvt_h_wu(i32 %a) nounwind { 4251; CHECKIZFH-LABEL: fcvt_h_wu: 4252; CHECKIZFH: # %bb.0: 4253; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0 4254; CHECKIZFH-NEXT: ret 4255; 4256; RV32IDZFH-LABEL: fcvt_h_wu: 4257; RV32IDZFH: # %bb.0: 4258; RV32IDZFH-NEXT: fcvt.h.wu fa0, a0 4259; RV32IDZFH-NEXT: ret 4260; 4261; RV64IDZFH-LABEL: fcvt_h_wu: 4262; RV64IDZFH: # %bb.0: 4263; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 4264; RV64IDZFH-NEXT: ret 4265; 4266; CHECKIZHINX-LABEL: fcvt_h_wu: 4267; CHECKIZHINX: # %bb.0: 4268; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0 4269; CHECKIZHINX-NEXT: ret 4270; 4271; CHECKIZDINXZHINX-LABEL: fcvt_h_wu: 4272; CHECKIZDINXZHINX: # %bb.0: 4273; CHECKIZDINXZHINX-NEXT: fcvt.h.wu a0, a0 4274; CHECKIZDINXZHINX-NEXT: ret 4275; 4276; RV32I-LABEL: fcvt_h_wu: 4277; RV32I: # %bb.0: 4278; RV32I-NEXT: addi sp, sp, -16 4279; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4280; RV32I-NEXT: call __floatunsisf 4281; RV32I-NEXT: call __truncsfhf2 4282; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4283; RV32I-NEXT: addi sp, sp, 16 4284; RV32I-NEXT: ret 4285; 4286; RV64I-LABEL: fcvt_h_wu: 4287; RV64I: # %bb.0: 4288; RV64I-NEXT: addi sp, sp, -16 4289; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4290; RV64I-NEXT: sext.w a0, a0 4291; RV64I-NEXT: call __floatunsisf 4292; RV64I-NEXT: call __truncsfhf2 4293; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4294; RV64I-NEXT: addi sp, sp, 16 4295; RV64I-NEXT: ret 4296; 4297; RV32ID-ILP32-LABEL: fcvt_h_wu: 4298; RV32ID-ILP32: # %bb.0: 4299; RV32ID-ILP32-NEXT: addi sp, sp, -16 4300; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4301; RV32ID-ILP32-NEXT: fcvt.s.wu fa5, a0 4302; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 4303; RV32ID-ILP32-NEXT: call __truncsfhf2 4304; RV32ID-ILP32-NEXT: lui a1, 1048560 4305; RV32ID-ILP32-NEXT: or a0, a0, a1 4306; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4307; RV32ID-ILP32-NEXT: addi sp, sp, 16 4308; RV32ID-ILP32-NEXT: ret 4309; 4310; RV64ID-LP64-LABEL: fcvt_h_wu: 4311; RV64ID-LP64: # %bb.0: 4312; RV64ID-LP64-NEXT: addi sp, sp, -16 4313; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4314; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0 4315; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4316; RV64ID-LP64-NEXT: call __truncsfhf2 4317; RV64ID-LP64-NEXT: lui a1, 1048560 4318; RV64ID-LP64-NEXT: or a0, a0, a1 4319; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4320; RV64ID-LP64-NEXT: addi sp, sp, 16 4321; RV64ID-LP64-NEXT: ret 4322; 4323; RV32ID-LABEL: fcvt_h_wu: 4324; RV32ID: # %bb.0: 4325; RV32ID-NEXT: addi sp, sp, -16 4326; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4327; RV32ID-NEXT: fcvt.s.wu fa0, a0 4328; RV32ID-NEXT: call __truncsfhf2 4329; RV32ID-NEXT: fmv.x.w a0, fa0 4330; RV32ID-NEXT: lui a1, 1048560 4331; RV32ID-NEXT: or a0, a0, a1 4332; RV32ID-NEXT: fmv.w.x fa0, a0 4333; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4334; RV32ID-NEXT: addi sp, sp, 16 4335; RV32ID-NEXT: ret 4336; 4337; RV64ID-LABEL: fcvt_h_wu: 4338; RV64ID: # %bb.0: 4339; RV64ID-NEXT: addi sp, sp, -16 4340; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4341; RV64ID-NEXT: fcvt.s.wu fa0, a0 4342; RV64ID-NEXT: call __truncsfhf2 4343; RV64ID-NEXT: fmv.x.w a0, fa0 4344; RV64ID-NEXT: lui a1, 1048560 4345; RV64ID-NEXT: or a0, a0, a1 4346; RV64ID-NEXT: fmv.w.x fa0, a0 4347; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4348; RV64ID-NEXT: addi sp, sp, 16 4349; RV64ID-NEXT: ret 4350; 4351; CHECK32-IZFHMIN-LABEL: fcvt_h_wu: 4352; CHECK32-IZFHMIN: # %bb.0: 4353; CHECK32-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 4354; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4355; CHECK32-IZFHMIN-NEXT: ret 4356; 4357; CHECK64-IZFHMIN-LABEL: fcvt_h_wu: 4358; CHECK64-IZFHMIN: # %bb.0: 4359; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 4360; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4361; CHECK64-IZFHMIN-NEXT: ret 4362; 4363; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu: 4364; CHECK32-IZHINXMIN: # %bb.0: 4365; CHECK32-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 4366; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4367; CHECK32-IZHINXMIN-NEXT: ret 4368; 4369; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu: 4370; CHECK64-IZHINXMIN: # %bb.0: 4371; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 4372; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4373; CHECK64-IZHINXMIN-NEXT: ret 4374; 4375; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu: 4376; CHECK32-IZDINXZHINXMIN: # %bb.0: 4377; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 4378; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4379; CHECK32-IZDINXZHINXMIN-NEXT: ret 4380; 4381; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu: 4382; CHECK64-IZDINXZHINXMIN: # %bb.0: 4383; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 4384; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4385; CHECK64-IZDINXZHINXMIN-NEXT: ret 4386 %1 = uitofp i32 %a to half 4387 ret half %1 4388} 4389 4390define half @fcvt_h_wu_load(ptr %p) nounwind { 4391; RV32IZFH-LABEL: fcvt_h_wu_load: 4392; RV32IZFH: # %bb.0: 4393; RV32IZFH-NEXT: lw a0, 0(a0) 4394; RV32IZFH-NEXT: fcvt.h.wu fa0, a0 4395; RV32IZFH-NEXT: ret 4396; 4397; RV64IZFH-LABEL: fcvt_h_wu_load: 4398; RV64IZFH: # %bb.0: 4399; RV64IZFH-NEXT: lwu a0, 0(a0) 4400; RV64IZFH-NEXT: fcvt.h.wu fa0, a0 4401; RV64IZFH-NEXT: ret 4402; 4403; RV32IDZFH-LABEL: fcvt_h_wu_load: 4404; RV32IDZFH: # %bb.0: 4405; RV32IDZFH-NEXT: lw a0, 0(a0) 4406; RV32IDZFH-NEXT: fcvt.h.wu fa0, a0 4407; RV32IDZFH-NEXT: ret 4408; 4409; RV64IDZFH-LABEL: fcvt_h_wu_load: 4410; RV64IDZFH: # %bb.0: 4411; RV64IDZFH-NEXT: lwu a0, 0(a0) 4412; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 4413; RV64IDZFH-NEXT: ret 4414; 4415; RV32IZHINX-LABEL: fcvt_h_wu_load: 4416; RV32IZHINX: # %bb.0: 4417; RV32IZHINX-NEXT: lw a0, 0(a0) 4418; RV32IZHINX-NEXT: fcvt.h.wu a0, a0 4419; RV32IZHINX-NEXT: ret 4420; 4421; RV64IZHINX-LABEL: fcvt_h_wu_load: 4422; RV64IZHINX: # %bb.0: 4423; RV64IZHINX-NEXT: lwu a0, 0(a0) 4424; RV64IZHINX-NEXT: fcvt.h.wu a0, a0 4425; RV64IZHINX-NEXT: ret 4426; 4427; RV32IZDINXZHINX-LABEL: fcvt_h_wu_load: 4428; RV32IZDINXZHINX: # %bb.0: 4429; RV32IZDINXZHINX-NEXT: lw a0, 0(a0) 4430; RV32IZDINXZHINX-NEXT: fcvt.h.wu a0, a0 4431; RV32IZDINXZHINX-NEXT: ret 4432; 4433; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load: 4434; RV64IZDINXZHINX: # %bb.0: 4435; RV64IZDINXZHINX-NEXT: lwu a0, 0(a0) 4436; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0 4437; RV64IZDINXZHINX-NEXT: ret 4438; 4439; RV32I-LABEL: fcvt_h_wu_load: 4440; RV32I: # %bb.0: 4441; RV32I-NEXT: addi sp, sp, -16 4442; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4443; RV32I-NEXT: lw a0, 0(a0) 4444; RV32I-NEXT: call __floatunsisf 4445; RV32I-NEXT: call __truncsfhf2 4446; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4447; RV32I-NEXT: addi sp, sp, 16 4448; RV32I-NEXT: ret 4449; 4450; RV64I-LABEL: fcvt_h_wu_load: 4451; RV64I: # %bb.0: 4452; RV64I-NEXT: addi sp, sp, -16 4453; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4454; RV64I-NEXT: lw a0, 0(a0) 4455; RV64I-NEXT: call __floatunsisf 4456; RV64I-NEXT: call __truncsfhf2 4457; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4458; RV64I-NEXT: addi sp, sp, 16 4459; RV64I-NEXT: ret 4460; 4461; RV32ID-ILP32-LABEL: fcvt_h_wu_load: 4462; RV32ID-ILP32: # %bb.0: 4463; RV32ID-ILP32-NEXT: addi sp, sp, -16 4464; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4465; RV32ID-ILP32-NEXT: lw a0, 0(a0) 4466; RV32ID-ILP32-NEXT: fcvt.s.wu fa5, a0 4467; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 4468; RV32ID-ILP32-NEXT: call __truncsfhf2 4469; RV32ID-ILP32-NEXT: lui a1, 1048560 4470; RV32ID-ILP32-NEXT: or a0, a0, a1 4471; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4472; RV32ID-ILP32-NEXT: addi sp, sp, 16 4473; RV32ID-ILP32-NEXT: ret 4474; 4475; RV64ID-LP64-LABEL: fcvt_h_wu_load: 4476; RV64ID-LP64: # %bb.0: 4477; RV64ID-LP64-NEXT: addi sp, sp, -16 4478; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4479; RV64ID-LP64-NEXT: lwu a0, 0(a0) 4480; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0 4481; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4482; RV64ID-LP64-NEXT: call __truncsfhf2 4483; RV64ID-LP64-NEXT: lui a1, 1048560 4484; RV64ID-LP64-NEXT: or a0, a0, a1 4485; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4486; RV64ID-LP64-NEXT: addi sp, sp, 16 4487; RV64ID-LP64-NEXT: ret 4488; 4489; RV32ID-LABEL: fcvt_h_wu_load: 4490; RV32ID: # %bb.0: 4491; RV32ID-NEXT: addi sp, sp, -16 4492; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4493; RV32ID-NEXT: lw a0, 0(a0) 4494; RV32ID-NEXT: fcvt.s.wu fa0, a0 4495; RV32ID-NEXT: call __truncsfhf2 4496; RV32ID-NEXT: fmv.x.w a0, fa0 4497; RV32ID-NEXT: lui a1, 1048560 4498; RV32ID-NEXT: or a0, a0, a1 4499; RV32ID-NEXT: fmv.w.x fa0, a0 4500; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4501; RV32ID-NEXT: addi sp, sp, 16 4502; RV32ID-NEXT: ret 4503; 4504; RV64ID-LABEL: fcvt_h_wu_load: 4505; RV64ID: # %bb.0: 4506; RV64ID-NEXT: addi sp, sp, -16 4507; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4508; RV64ID-NEXT: lwu a0, 0(a0) 4509; RV64ID-NEXT: fcvt.s.wu fa0, a0 4510; RV64ID-NEXT: call __truncsfhf2 4511; RV64ID-NEXT: fmv.x.w a0, fa0 4512; RV64ID-NEXT: lui a1, 1048560 4513; RV64ID-NEXT: or a0, a0, a1 4514; RV64ID-NEXT: fmv.w.x fa0, a0 4515; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4516; RV64ID-NEXT: addi sp, sp, 16 4517; RV64ID-NEXT: ret 4518; 4519; CHECK32-IZFHMIN-LABEL: fcvt_h_wu_load: 4520; CHECK32-IZFHMIN: # %bb.0: 4521; CHECK32-IZFHMIN-NEXT: lw a0, 0(a0) 4522; CHECK32-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 4523; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4524; CHECK32-IZFHMIN-NEXT: ret 4525; 4526; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load: 4527; CHECK64-IZFHMIN: # %bb.0: 4528; CHECK64-IZFHMIN-NEXT: lwu a0, 0(a0) 4529; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 4530; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4531; CHECK64-IZFHMIN-NEXT: ret 4532; 4533; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu_load: 4534; CHECK32-IZHINXMIN: # %bb.0: 4535; CHECK32-IZHINXMIN-NEXT: lw a0, 0(a0) 4536; CHECK32-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 4537; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4538; CHECK32-IZHINXMIN-NEXT: ret 4539; 4540; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load: 4541; CHECK64-IZHINXMIN: # %bb.0: 4542; CHECK64-IZHINXMIN-NEXT: lwu a0, 0(a0) 4543; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 4544; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4545; CHECK64-IZHINXMIN-NEXT: ret 4546; 4547; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load: 4548; CHECK32-IZDINXZHINXMIN: # %bb.0: 4549; CHECK32-IZDINXZHINXMIN-NEXT: lw a0, 0(a0) 4550; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 4551; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4552; CHECK32-IZDINXZHINXMIN-NEXT: ret 4553; 4554; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load: 4555; CHECK64-IZDINXZHINXMIN: # %bb.0: 4556; CHECK64-IZDINXZHINXMIN-NEXT: lwu a0, 0(a0) 4557; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 4558; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4559; CHECK64-IZDINXZHINXMIN-NEXT: ret 4560 %a = load i32, ptr %p 4561 %1 = uitofp i32 %a to half 4562 ret half %1 4563} 4564 4565define half @fcvt_h_l(i64 %a) nounwind { 4566; RV32IZFH-LABEL: fcvt_h_l: 4567; RV32IZFH: # %bb.0: 4568; RV32IZFH-NEXT: addi sp, sp, -16 4569; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4570; RV32IZFH-NEXT: call __floatdihf 4571; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4572; RV32IZFH-NEXT: addi sp, sp, 16 4573; RV32IZFH-NEXT: ret 4574; 4575; RV64IZFH-LABEL: fcvt_h_l: 4576; RV64IZFH: # %bb.0: 4577; RV64IZFH-NEXT: fcvt.h.l fa0, a0 4578; RV64IZFH-NEXT: ret 4579; 4580; RV32IDZFH-LABEL: fcvt_h_l: 4581; RV32IDZFH: # %bb.0: 4582; RV32IDZFH-NEXT: addi sp, sp, -16 4583; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4584; RV32IDZFH-NEXT: call __floatdihf 4585; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4586; RV32IDZFH-NEXT: addi sp, sp, 16 4587; RV32IDZFH-NEXT: ret 4588; 4589; RV64IDZFH-LABEL: fcvt_h_l: 4590; RV64IDZFH: # %bb.0: 4591; RV64IDZFH-NEXT: fcvt.h.l fa0, a0 4592; RV64IDZFH-NEXT: ret 4593; 4594; RV32IZHINX-LABEL: fcvt_h_l: 4595; RV32IZHINX: # %bb.0: 4596; RV32IZHINX-NEXT: addi sp, sp, -16 4597; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4598; RV32IZHINX-NEXT: call __floatdihf 4599; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4600; RV32IZHINX-NEXT: addi sp, sp, 16 4601; RV32IZHINX-NEXT: ret 4602; 4603; RV64IZHINX-LABEL: fcvt_h_l: 4604; RV64IZHINX: # %bb.0: 4605; RV64IZHINX-NEXT: fcvt.h.l a0, a0 4606; RV64IZHINX-NEXT: ret 4607; 4608; RV32IZDINXZHINX-LABEL: fcvt_h_l: 4609; RV32IZDINXZHINX: # %bb.0: 4610; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 4611; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4612; RV32IZDINXZHINX-NEXT: call __floatdihf 4613; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4614; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 4615; RV32IZDINXZHINX-NEXT: ret 4616; 4617; RV64IZDINXZHINX-LABEL: fcvt_h_l: 4618; RV64IZDINXZHINX: # %bb.0: 4619; RV64IZDINXZHINX-NEXT: fcvt.h.l a0, a0 4620; RV64IZDINXZHINX-NEXT: ret 4621; 4622; RV32I-LABEL: fcvt_h_l: 4623; RV32I: # %bb.0: 4624; RV32I-NEXT: addi sp, sp, -16 4625; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4626; RV32I-NEXT: call __floatdisf 4627; RV32I-NEXT: call __truncsfhf2 4628; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4629; RV32I-NEXT: addi sp, sp, 16 4630; RV32I-NEXT: ret 4631; 4632; RV64I-LABEL: fcvt_h_l: 4633; RV64I: # %bb.0: 4634; RV64I-NEXT: addi sp, sp, -16 4635; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4636; RV64I-NEXT: call __floatdisf 4637; RV64I-NEXT: call __truncsfhf2 4638; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4639; RV64I-NEXT: addi sp, sp, 16 4640; RV64I-NEXT: ret 4641; 4642; RV32ID-ILP32-LABEL: fcvt_h_l: 4643; RV32ID-ILP32: # %bb.0: 4644; RV32ID-ILP32-NEXT: addi sp, sp, -16 4645; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4646; RV32ID-ILP32-NEXT: call __floatdisf 4647; RV32ID-ILP32-NEXT: call __truncsfhf2 4648; RV32ID-ILP32-NEXT: lui a1, 1048560 4649; RV32ID-ILP32-NEXT: or a0, a0, a1 4650; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4651; RV32ID-ILP32-NEXT: addi sp, sp, 16 4652; RV32ID-ILP32-NEXT: ret 4653; 4654; RV64ID-LP64-LABEL: fcvt_h_l: 4655; RV64ID-LP64: # %bb.0: 4656; RV64ID-LP64-NEXT: addi sp, sp, -16 4657; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4658; RV64ID-LP64-NEXT: fcvt.s.l fa5, a0 4659; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4660; RV64ID-LP64-NEXT: call __truncsfhf2 4661; RV64ID-LP64-NEXT: lui a1, 1048560 4662; RV64ID-LP64-NEXT: or a0, a0, a1 4663; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4664; RV64ID-LP64-NEXT: addi sp, sp, 16 4665; RV64ID-LP64-NEXT: ret 4666; 4667; RV32ID-LABEL: fcvt_h_l: 4668; RV32ID: # %bb.0: 4669; RV32ID-NEXT: addi sp, sp, -16 4670; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4671; RV32ID-NEXT: call __floatdisf 4672; RV32ID-NEXT: call __truncsfhf2 4673; RV32ID-NEXT: fmv.x.w a0, fa0 4674; RV32ID-NEXT: lui a1, 1048560 4675; RV32ID-NEXT: or a0, a0, a1 4676; RV32ID-NEXT: fmv.w.x fa0, a0 4677; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4678; RV32ID-NEXT: addi sp, sp, 16 4679; RV32ID-NEXT: ret 4680; 4681; RV64ID-LABEL: fcvt_h_l: 4682; RV64ID: # %bb.0: 4683; RV64ID-NEXT: addi sp, sp, -16 4684; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4685; RV64ID-NEXT: fcvt.s.l fa0, a0 4686; RV64ID-NEXT: call __truncsfhf2 4687; RV64ID-NEXT: fmv.x.w a0, fa0 4688; RV64ID-NEXT: lui a1, 1048560 4689; RV64ID-NEXT: or a0, a0, a1 4690; RV64ID-NEXT: fmv.w.x fa0, a0 4691; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4692; RV64ID-NEXT: addi sp, sp, 16 4693; RV64ID-NEXT: ret 4694; 4695; CHECK32-IZFHMIN-LABEL: fcvt_h_l: 4696; CHECK32-IZFHMIN: # %bb.0: 4697; CHECK32-IZFHMIN-NEXT: addi sp, sp, -16 4698; CHECK32-IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4699; CHECK32-IZFHMIN-NEXT: call __floatdihf 4700; CHECK32-IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4701; CHECK32-IZFHMIN-NEXT: addi sp, sp, 16 4702; CHECK32-IZFHMIN-NEXT: ret 4703; 4704; CHECK64-IZFHMIN-LABEL: fcvt_h_l: 4705; CHECK64-IZFHMIN: # %bb.0: 4706; CHECK64-IZFHMIN-NEXT: fcvt.s.l fa5, a0 4707; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4708; CHECK64-IZFHMIN-NEXT: ret 4709; 4710; CHECK32-IZHINXMIN-LABEL: fcvt_h_l: 4711; CHECK32-IZHINXMIN: # %bb.0: 4712; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 4713; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4714; CHECK32-IZHINXMIN-NEXT: call __floatdihf 4715; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4716; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 4717; CHECK32-IZHINXMIN-NEXT: ret 4718; 4719; CHECK64-IZHINXMIN-LABEL: fcvt_h_l: 4720; CHECK64-IZHINXMIN: # %bb.0: 4721; CHECK64-IZHINXMIN-NEXT: fcvt.s.l a0, a0 4722; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4723; CHECK64-IZHINXMIN-NEXT: ret 4724; 4725; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_l: 4726; CHECK32-IZDINXZHINXMIN: # %bb.0: 4727; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 4728; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4729; CHECK32-IZDINXZHINXMIN-NEXT: call __floatdihf 4730; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4731; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 4732; CHECK32-IZDINXZHINXMIN-NEXT: ret 4733; 4734; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_l: 4735; CHECK64-IZDINXZHINXMIN: # %bb.0: 4736; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.l a0, a0 4737; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4738; CHECK64-IZDINXZHINXMIN-NEXT: ret 4739 %1 = sitofp i64 %a to half 4740 ret half %1 4741} 4742 4743define half @fcvt_h_lu(i64 %a) nounwind { 4744; RV32IZFH-LABEL: fcvt_h_lu: 4745; RV32IZFH: # %bb.0: 4746; RV32IZFH-NEXT: addi sp, sp, -16 4747; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4748; RV32IZFH-NEXT: call __floatundihf 4749; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4750; RV32IZFH-NEXT: addi sp, sp, 16 4751; RV32IZFH-NEXT: ret 4752; 4753; RV64IZFH-LABEL: fcvt_h_lu: 4754; RV64IZFH: # %bb.0: 4755; RV64IZFH-NEXT: fcvt.h.lu fa0, a0 4756; RV64IZFH-NEXT: ret 4757; 4758; RV32IDZFH-LABEL: fcvt_h_lu: 4759; RV32IDZFH: # %bb.0: 4760; RV32IDZFH-NEXT: addi sp, sp, -16 4761; RV32IDZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4762; RV32IDZFH-NEXT: call __floatundihf 4763; RV32IDZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4764; RV32IDZFH-NEXT: addi sp, sp, 16 4765; RV32IDZFH-NEXT: ret 4766; 4767; RV64IDZFH-LABEL: fcvt_h_lu: 4768; RV64IDZFH: # %bb.0: 4769; RV64IDZFH-NEXT: fcvt.h.lu fa0, a0 4770; RV64IDZFH-NEXT: ret 4771; 4772; RV32IZHINX-LABEL: fcvt_h_lu: 4773; RV32IZHINX: # %bb.0: 4774; RV32IZHINX-NEXT: addi sp, sp, -16 4775; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4776; RV32IZHINX-NEXT: call __floatundihf 4777; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4778; RV32IZHINX-NEXT: addi sp, sp, 16 4779; RV32IZHINX-NEXT: ret 4780; 4781; RV64IZHINX-LABEL: fcvt_h_lu: 4782; RV64IZHINX: # %bb.0: 4783; RV64IZHINX-NEXT: fcvt.h.lu a0, a0 4784; RV64IZHINX-NEXT: ret 4785; 4786; RV32IZDINXZHINX-LABEL: fcvt_h_lu: 4787; RV32IZDINXZHINX: # %bb.0: 4788; RV32IZDINXZHINX-NEXT: addi sp, sp, -16 4789; RV32IZDINXZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4790; RV32IZDINXZHINX-NEXT: call __floatundihf 4791; RV32IZDINXZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4792; RV32IZDINXZHINX-NEXT: addi sp, sp, 16 4793; RV32IZDINXZHINX-NEXT: ret 4794; 4795; RV64IZDINXZHINX-LABEL: fcvt_h_lu: 4796; RV64IZDINXZHINX: # %bb.0: 4797; RV64IZDINXZHINX-NEXT: fcvt.h.lu a0, a0 4798; RV64IZDINXZHINX-NEXT: ret 4799; 4800; RV32I-LABEL: fcvt_h_lu: 4801; RV32I: # %bb.0: 4802; RV32I-NEXT: addi sp, sp, -16 4803; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4804; RV32I-NEXT: call __floatundisf 4805; RV32I-NEXT: call __truncsfhf2 4806; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4807; RV32I-NEXT: addi sp, sp, 16 4808; RV32I-NEXT: ret 4809; 4810; RV64I-LABEL: fcvt_h_lu: 4811; RV64I: # %bb.0: 4812; RV64I-NEXT: addi sp, sp, -16 4813; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4814; RV64I-NEXT: call __floatundisf 4815; RV64I-NEXT: call __truncsfhf2 4816; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4817; RV64I-NEXT: addi sp, sp, 16 4818; RV64I-NEXT: ret 4819; 4820; RV32ID-ILP32-LABEL: fcvt_h_lu: 4821; RV32ID-ILP32: # %bb.0: 4822; RV32ID-ILP32-NEXT: addi sp, sp, -16 4823; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4824; RV32ID-ILP32-NEXT: call __floatundisf 4825; RV32ID-ILP32-NEXT: call __truncsfhf2 4826; RV32ID-ILP32-NEXT: lui a1, 1048560 4827; RV32ID-ILP32-NEXT: or a0, a0, a1 4828; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4829; RV32ID-ILP32-NEXT: addi sp, sp, 16 4830; RV32ID-ILP32-NEXT: ret 4831; 4832; RV64ID-LP64-LABEL: fcvt_h_lu: 4833; RV64ID-LP64: # %bb.0: 4834; RV64ID-LP64-NEXT: addi sp, sp, -16 4835; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4836; RV64ID-LP64-NEXT: fcvt.s.lu fa5, a0 4837; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 4838; RV64ID-LP64-NEXT: call __truncsfhf2 4839; RV64ID-LP64-NEXT: lui a1, 1048560 4840; RV64ID-LP64-NEXT: or a0, a0, a1 4841; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4842; RV64ID-LP64-NEXT: addi sp, sp, 16 4843; RV64ID-LP64-NEXT: ret 4844; 4845; RV32ID-LABEL: fcvt_h_lu: 4846; RV32ID: # %bb.0: 4847; RV32ID-NEXT: addi sp, sp, -16 4848; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4849; RV32ID-NEXT: call __floatundisf 4850; RV32ID-NEXT: call __truncsfhf2 4851; RV32ID-NEXT: fmv.x.w a0, fa0 4852; RV32ID-NEXT: lui a1, 1048560 4853; RV32ID-NEXT: or a0, a0, a1 4854; RV32ID-NEXT: fmv.w.x fa0, a0 4855; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4856; RV32ID-NEXT: addi sp, sp, 16 4857; RV32ID-NEXT: ret 4858; 4859; RV64ID-LABEL: fcvt_h_lu: 4860; RV64ID: # %bb.0: 4861; RV64ID-NEXT: addi sp, sp, -16 4862; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4863; RV64ID-NEXT: fcvt.s.lu fa0, a0 4864; RV64ID-NEXT: call __truncsfhf2 4865; RV64ID-NEXT: fmv.x.w a0, fa0 4866; RV64ID-NEXT: lui a1, 1048560 4867; RV64ID-NEXT: or a0, a0, a1 4868; RV64ID-NEXT: fmv.w.x fa0, a0 4869; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4870; RV64ID-NEXT: addi sp, sp, 16 4871; RV64ID-NEXT: ret 4872; 4873; CHECK32-IZFHMIN-LABEL: fcvt_h_lu: 4874; CHECK32-IZFHMIN: # %bb.0: 4875; CHECK32-IZFHMIN-NEXT: addi sp, sp, -16 4876; CHECK32-IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4877; CHECK32-IZFHMIN-NEXT: call __floatundihf 4878; CHECK32-IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4879; CHECK32-IZFHMIN-NEXT: addi sp, sp, 16 4880; CHECK32-IZFHMIN-NEXT: ret 4881; 4882; CHECK64-IZFHMIN-LABEL: fcvt_h_lu: 4883; CHECK64-IZFHMIN: # %bb.0: 4884; CHECK64-IZFHMIN-NEXT: fcvt.s.lu fa5, a0 4885; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 4886; CHECK64-IZFHMIN-NEXT: ret 4887; 4888; CHECK32-IZHINXMIN-LABEL: fcvt_h_lu: 4889; CHECK32-IZHINXMIN: # %bb.0: 4890; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 4891; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4892; CHECK32-IZHINXMIN-NEXT: call __floatundihf 4893; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4894; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 4895; CHECK32-IZHINXMIN-NEXT: ret 4896; 4897; CHECK64-IZHINXMIN-LABEL: fcvt_h_lu: 4898; CHECK64-IZHINXMIN: # %bb.0: 4899; CHECK64-IZHINXMIN-NEXT: fcvt.s.lu a0, a0 4900; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 4901; CHECK64-IZHINXMIN-NEXT: ret 4902; 4903; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_lu: 4904; CHECK32-IZDINXZHINXMIN: # %bb.0: 4905; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 4906; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4907; CHECK32-IZDINXZHINXMIN-NEXT: call __floatundihf 4908; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4909; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 4910; CHECK32-IZDINXZHINXMIN-NEXT: ret 4911; 4912; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_lu: 4913; CHECK64-IZDINXZHINXMIN: # %bb.0: 4914; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.lu a0, a0 4915; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 4916; CHECK64-IZDINXZHINXMIN-NEXT: ret 4917 %1 = uitofp i64 %a to half 4918 ret half %1 4919} 4920 4921define half @fcvt_h_s(float %a) nounwind { 4922; CHECKIZFH-LABEL: fcvt_h_s: 4923; CHECKIZFH: # %bb.0: 4924; CHECKIZFH-NEXT: fcvt.h.s fa0, fa0 4925; CHECKIZFH-NEXT: ret 4926; 4927; RV32IDZFH-LABEL: fcvt_h_s: 4928; RV32IDZFH: # %bb.0: 4929; RV32IDZFH-NEXT: fcvt.h.s fa0, fa0 4930; RV32IDZFH-NEXT: ret 4931; 4932; RV64IDZFH-LABEL: fcvt_h_s: 4933; RV64IDZFH: # %bb.0: 4934; RV64IDZFH-NEXT: fcvt.h.s fa0, fa0 4935; RV64IDZFH-NEXT: ret 4936; 4937; CHECKIZHINX-LABEL: fcvt_h_s: 4938; CHECKIZHINX: # %bb.0: 4939; CHECKIZHINX-NEXT: fcvt.h.s a0, a0 4940; CHECKIZHINX-NEXT: ret 4941; 4942; CHECKIZDINXZHINX-LABEL: fcvt_h_s: 4943; CHECKIZDINXZHINX: # %bb.0: 4944; CHECKIZDINXZHINX-NEXT: fcvt.h.s a0, a0 4945; CHECKIZDINXZHINX-NEXT: ret 4946; 4947; RV32I-LABEL: fcvt_h_s: 4948; RV32I: # %bb.0: 4949; RV32I-NEXT: addi sp, sp, -16 4950; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4951; RV32I-NEXT: call __truncsfhf2 4952; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4953; RV32I-NEXT: addi sp, sp, 16 4954; RV32I-NEXT: ret 4955; 4956; RV64I-LABEL: fcvt_h_s: 4957; RV64I: # %bb.0: 4958; RV64I-NEXT: addi sp, sp, -16 4959; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4960; RV64I-NEXT: call __truncsfhf2 4961; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4962; RV64I-NEXT: addi sp, sp, 16 4963; RV64I-NEXT: ret 4964; 4965; RV32ID-ILP32-LABEL: fcvt_h_s: 4966; RV32ID-ILP32: # %bb.0: 4967; RV32ID-ILP32-NEXT: addi sp, sp, -16 4968; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4969; RV32ID-ILP32-NEXT: call __truncsfhf2 4970; RV32ID-ILP32-NEXT: lui a1, 1048560 4971; RV32ID-ILP32-NEXT: or a0, a0, a1 4972; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4973; RV32ID-ILP32-NEXT: addi sp, sp, 16 4974; RV32ID-ILP32-NEXT: ret 4975; 4976; RV64ID-LP64-LABEL: fcvt_h_s: 4977; RV64ID-LP64: # %bb.0: 4978; RV64ID-LP64-NEXT: addi sp, sp, -16 4979; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4980; RV64ID-LP64-NEXT: call __truncsfhf2 4981; RV64ID-LP64-NEXT: lui a1, 1048560 4982; RV64ID-LP64-NEXT: or a0, a0, a1 4983; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4984; RV64ID-LP64-NEXT: addi sp, sp, 16 4985; RV64ID-LP64-NEXT: ret 4986; 4987; RV32ID-LABEL: fcvt_h_s: 4988; RV32ID: # %bb.0: 4989; RV32ID-NEXT: addi sp, sp, -16 4990; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4991; RV32ID-NEXT: call __truncsfhf2 4992; RV32ID-NEXT: fmv.x.w a0, fa0 4993; RV32ID-NEXT: lui a1, 1048560 4994; RV32ID-NEXT: or a0, a0, a1 4995; RV32ID-NEXT: fmv.w.x fa0, a0 4996; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4997; RV32ID-NEXT: addi sp, sp, 16 4998; RV32ID-NEXT: ret 4999; 5000; RV64ID-LABEL: fcvt_h_s: 5001; RV64ID: # %bb.0: 5002; RV64ID-NEXT: addi sp, sp, -16 5003; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5004; RV64ID-NEXT: call __truncsfhf2 5005; RV64ID-NEXT: fmv.x.w a0, fa0 5006; RV64ID-NEXT: lui a1, 1048560 5007; RV64ID-NEXT: or a0, a0, a1 5008; RV64ID-NEXT: fmv.w.x fa0, a0 5009; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5010; RV64ID-NEXT: addi sp, sp, 16 5011; RV64ID-NEXT: ret 5012; 5013; CHECK32-IZFHMIN-LABEL: fcvt_h_s: 5014; CHECK32-IZFHMIN: # %bb.0: 5015; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa0, fa0 5016; CHECK32-IZFHMIN-NEXT: ret 5017; 5018; CHECK64-IZFHMIN-LABEL: fcvt_h_s: 5019; CHECK64-IZFHMIN: # %bb.0: 5020; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa0 5021; CHECK64-IZFHMIN-NEXT: ret 5022; 5023; CHECK32-IZHINXMIN-LABEL: fcvt_h_s: 5024; CHECK32-IZHINXMIN: # %bb.0: 5025; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a0, a0 5026; CHECK32-IZHINXMIN-NEXT: ret 5027; 5028; CHECK64-IZHINXMIN-LABEL: fcvt_h_s: 5029; CHECK64-IZHINXMIN: # %bb.0: 5030; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 5031; CHECK64-IZHINXMIN-NEXT: ret 5032; 5033; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_s: 5034; CHECK32-IZDINXZHINXMIN: # %bb.0: 5035; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 5036; CHECK32-IZDINXZHINXMIN-NEXT: ret 5037; 5038; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_s: 5039; CHECK64-IZDINXZHINXMIN: # %bb.0: 5040; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 5041; CHECK64-IZDINXZHINXMIN-NEXT: ret 5042 %1 = fptrunc float %a to half 5043 ret half %1 5044} 5045 5046define float @fcvt_s_h(half %a) nounwind { 5047; CHECKIZFH-LABEL: fcvt_s_h: 5048; CHECKIZFH: # %bb.0: 5049; CHECKIZFH-NEXT: fcvt.s.h fa0, fa0 5050; CHECKIZFH-NEXT: ret 5051; 5052; RV32IDZFH-LABEL: fcvt_s_h: 5053; RV32IDZFH: # %bb.0: 5054; RV32IDZFH-NEXT: fcvt.s.h fa0, fa0 5055; RV32IDZFH-NEXT: ret 5056; 5057; RV64IDZFH-LABEL: fcvt_s_h: 5058; RV64IDZFH: # %bb.0: 5059; RV64IDZFH-NEXT: fcvt.s.h fa0, fa0 5060; RV64IDZFH-NEXT: ret 5061; 5062; CHECKIZHINX-LABEL: fcvt_s_h: 5063; CHECKIZHINX: # %bb.0: 5064; CHECKIZHINX-NEXT: fcvt.s.h a0, a0 5065; CHECKIZHINX-NEXT: ret 5066; 5067; CHECKIZDINXZHINX-LABEL: fcvt_s_h: 5068; CHECKIZDINXZHINX: # %bb.0: 5069; CHECKIZDINXZHINX-NEXT: fcvt.s.h a0, a0 5070; CHECKIZDINXZHINX-NEXT: ret 5071; 5072; RV32I-LABEL: fcvt_s_h: 5073; RV32I: # %bb.0: 5074; RV32I-NEXT: addi sp, sp, -16 5075; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5076; RV32I-NEXT: call __extendhfsf2 5077; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5078; RV32I-NEXT: addi sp, sp, 16 5079; RV32I-NEXT: ret 5080; 5081; RV64I-LABEL: fcvt_s_h: 5082; RV64I: # %bb.0: 5083; RV64I-NEXT: addi sp, sp, -16 5084; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5085; RV64I-NEXT: call __extendhfsf2 5086; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5087; RV64I-NEXT: addi sp, sp, 16 5088; RV64I-NEXT: ret 5089; 5090; RV32ID-ILP32-LABEL: fcvt_s_h: 5091; RV32ID-ILP32: # %bb.0: 5092; RV32ID-ILP32-NEXT: addi sp, sp, -16 5093; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5094; RV32ID-ILP32-NEXT: call __extendhfsf2 5095; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5096; RV32ID-ILP32-NEXT: addi sp, sp, 16 5097; RV32ID-ILP32-NEXT: ret 5098; 5099; RV64ID-LP64-LABEL: fcvt_s_h: 5100; RV64ID-LP64: # %bb.0: 5101; RV64ID-LP64-NEXT: addi sp, sp, -16 5102; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5103; RV64ID-LP64-NEXT: call __extendhfsf2 5104; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5105; RV64ID-LP64-NEXT: addi sp, sp, 16 5106; RV64ID-LP64-NEXT: ret 5107; 5108; RV32ID-LABEL: fcvt_s_h: 5109; RV32ID: # %bb.0: 5110; RV32ID-NEXT: addi sp, sp, -16 5111; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5112; RV32ID-NEXT: call __extendhfsf2 5113; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5114; RV32ID-NEXT: addi sp, sp, 16 5115; RV32ID-NEXT: ret 5116; 5117; RV64ID-LABEL: fcvt_s_h: 5118; RV64ID: # %bb.0: 5119; RV64ID-NEXT: addi sp, sp, -16 5120; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5121; RV64ID-NEXT: call __extendhfsf2 5122; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5123; RV64ID-NEXT: addi sp, sp, 16 5124; RV64ID-NEXT: ret 5125; 5126; CHECK32-IZFHMIN-LABEL: fcvt_s_h: 5127; CHECK32-IZFHMIN: # %bb.0: 5128; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa0, fa0 5129; CHECK32-IZFHMIN-NEXT: ret 5130; 5131; CHECK64-IZFHMIN-LABEL: fcvt_s_h: 5132; CHECK64-IZFHMIN: # %bb.0: 5133; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa0, fa0 5134; CHECK64-IZFHMIN-NEXT: ret 5135; 5136; CHECK32-IZHINXMIN-LABEL: fcvt_s_h: 5137; CHECK32-IZHINXMIN: # %bb.0: 5138; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 5139; CHECK32-IZHINXMIN-NEXT: ret 5140; 5141; CHECK64-IZHINXMIN-LABEL: fcvt_s_h: 5142; CHECK64-IZHINXMIN: # %bb.0: 5143; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 5144; CHECK64-IZHINXMIN-NEXT: ret 5145; 5146; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_s_h: 5147; CHECK32-IZDINXZHINXMIN: # %bb.0: 5148; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 5149; CHECK32-IZDINXZHINXMIN-NEXT: ret 5150; 5151; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_s_h: 5152; CHECK64-IZDINXZHINXMIN: # %bb.0: 5153; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 5154; CHECK64-IZDINXZHINXMIN-NEXT: ret 5155 %1 = fpext half %a to float 5156 ret float %1 5157} 5158 5159define half @fcvt_h_d(double %a) nounwind { 5160; RV32IZFH-LABEL: fcvt_h_d: 5161; RV32IZFH: # %bb.0: 5162; RV32IZFH-NEXT: addi sp, sp, -16 5163; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5164; RV32IZFH-NEXT: call __truncdfhf2 5165; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5166; RV32IZFH-NEXT: addi sp, sp, 16 5167; RV32IZFH-NEXT: ret 5168; 5169; RV64IZFH-LABEL: fcvt_h_d: 5170; RV64IZFH: # %bb.0: 5171; RV64IZFH-NEXT: addi sp, sp, -16 5172; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5173; RV64IZFH-NEXT: call __truncdfhf2 5174; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5175; RV64IZFH-NEXT: addi sp, sp, 16 5176; RV64IZFH-NEXT: ret 5177; 5178; RV32IDZFH-LABEL: fcvt_h_d: 5179; RV32IDZFH: # %bb.0: 5180; RV32IDZFH-NEXT: fcvt.h.d fa0, fa0 5181; RV32IDZFH-NEXT: ret 5182; 5183; RV64IDZFH-LABEL: fcvt_h_d: 5184; RV64IDZFH: # %bb.0: 5185; RV64IDZFH-NEXT: fcvt.h.d fa0, fa0 5186; RV64IDZFH-NEXT: ret 5187; 5188; RV32IZHINX-LABEL: fcvt_h_d: 5189; RV32IZHINX: # %bb.0: 5190; RV32IZHINX-NEXT: addi sp, sp, -16 5191; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5192; RV32IZHINX-NEXT: call __truncdfhf2 5193; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5194; RV32IZHINX-NEXT: addi sp, sp, 16 5195; RV32IZHINX-NEXT: ret 5196; 5197; RV64IZHINX-LABEL: fcvt_h_d: 5198; RV64IZHINX: # %bb.0: 5199; RV64IZHINX-NEXT: addi sp, sp, -16 5200; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5201; RV64IZHINX-NEXT: call __truncdfhf2 5202; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5203; RV64IZHINX-NEXT: addi sp, sp, 16 5204; RV64IZHINX-NEXT: ret 5205; 5206; CHECKIZDINXZHINX-LABEL: fcvt_h_d: 5207; CHECKIZDINXZHINX: # %bb.0: 5208; CHECKIZDINXZHINX-NEXT: fcvt.h.d a0, a0 5209; CHECKIZDINXZHINX-NEXT: ret 5210; 5211; RV32I-LABEL: fcvt_h_d: 5212; RV32I: # %bb.0: 5213; RV32I-NEXT: addi sp, sp, -16 5214; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5215; RV32I-NEXT: call __truncdfhf2 5216; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5217; RV32I-NEXT: addi sp, sp, 16 5218; RV32I-NEXT: ret 5219; 5220; RV64I-LABEL: fcvt_h_d: 5221; RV64I: # %bb.0: 5222; RV64I-NEXT: addi sp, sp, -16 5223; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5224; RV64I-NEXT: call __truncdfhf2 5225; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5226; RV64I-NEXT: addi sp, sp, 16 5227; RV64I-NEXT: ret 5228; 5229; RV32ID-ILP32-LABEL: fcvt_h_d: 5230; RV32ID-ILP32: # %bb.0: 5231; RV32ID-ILP32-NEXT: addi sp, sp, -16 5232; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5233; RV32ID-ILP32-NEXT: call __truncdfhf2 5234; RV32ID-ILP32-NEXT: lui a1, 1048560 5235; RV32ID-ILP32-NEXT: or a0, a0, a1 5236; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5237; RV32ID-ILP32-NEXT: addi sp, sp, 16 5238; RV32ID-ILP32-NEXT: ret 5239; 5240; RV64ID-LP64-LABEL: fcvt_h_d: 5241; RV64ID-LP64: # %bb.0: 5242; RV64ID-LP64-NEXT: addi sp, sp, -16 5243; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5244; RV64ID-LP64-NEXT: call __truncdfhf2 5245; RV64ID-LP64-NEXT: lui a1, 1048560 5246; RV64ID-LP64-NEXT: or a0, a0, a1 5247; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5248; RV64ID-LP64-NEXT: addi sp, sp, 16 5249; RV64ID-LP64-NEXT: ret 5250; 5251; RV32ID-LABEL: fcvt_h_d: 5252; RV32ID: # %bb.0: 5253; RV32ID-NEXT: addi sp, sp, -16 5254; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5255; RV32ID-NEXT: call __truncdfhf2 5256; RV32ID-NEXT: fmv.x.w a0, fa0 5257; RV32ID-NEXT: lui a1, 1048560 5258; RV32ID-NEXT: or a0, a0, a1 5259; RV32ID-NEXT: fmv.w.x fa0, a0 5260; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5261; RV32ID-NEXT: addi sp, sp, 16 5262; RV32ID-NEXT: ret 5263; 5264; RV64ID-LABEL: fcvt_h_d: 5265; RV64ID: # %bb.0: 5266; RV64ID-NEXT: addi sp, sp, -16 5267; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5268; RV64ID-NEXT: call __truncdfhf2 5269; RV64ID-NEXT: fmv.x.w a0, fa0 5270; RV64ID-NEXT: lui a1, 1048560 5271; RV64ID-NEXT: or a0, a0, a1 5272; RV64ID-NEXT: fmv.w.x fa0, a0 5273; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5274; RV64ID-NEXT: addi sp, sp, 16 5275; RV64ID-NEXT: ret 5276; 5277; RV32IFZFHMIN-LABEL: fcvt_h_d: 5278; RV32IFZFHMIN: # %bb.0: 5279; RV32IFZFHMIN-NEXT: addi sp, sp, -16 5280; RV32IFZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5281; RV32IFZFHMIN-NEXT: call __truncdfhf2 5282; RV32IFZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5283; RV32IFZFHMIN-NEXT: addi sp, sp, 16 5284; RV32IFZFHMIN-NEXT: ret 5285; 5286; RV64IFZFHMIN-LABEL: fcvt_h_d: 5287; RV64IFZFHMIN: # %bb.0: 5288; RV64IFZFHMIN-NEXT: addi sp, sp, -16 5289; RV64IFZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5290; RV64IFZFHMIN-NEXT: call __truncdfhf2 5291; RV64IFZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5292; RV64IFZFHMIN-NEXT: addi sp, sp, 16 5293; RV64IFZFHMIN-NEXT: ret 5294; 5295; RV32IDZFHMIN-LABEL: fcvt_h_d: 5296; RV32IDZFHMIN: # %bb.0: 5297; RV32IDZFHMIN-NEXT: fcvt.h.d fa0, fa0 5298; RV32IDZFHMIN-NEXT: ret 5299; 5300; RV64IDZFHMIN-LABEL: fcvt_h_d: 5301; RV64IDZFHMIN: # %bb.0: 5302; RV64IDZFHMIN-NEXT: fcvt.h.d fa0, fa0 5303; RV64IDZFHMIN-NEXT: ret 5304; 5305; CHECK32-IZHINXMIN-LABEL: fcvt_h_d: 5306; CHECK32-IZHINXMIN: # %bb.0: 5307; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 5308; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5309; CHECK32-IZHINXMIN-NEXT: call __truncdfhf2 5310; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5311; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 5312; CHECK32-IZHINXMIN-NEXT: ret 5313; 5314; CHECK64-IZHINXMIN-LABEL: fcvt_h_d: 5315; CHECK64-IZHINXMIN: # %bb.0: 5316; CHECK64-IZHINXMIN-NEXT: addi sp, sp, -16 5317; CHECK64-IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5318; CHECK64-IZHINXMIN-NEXT: call __truncdfhf2 5319; CHECK64-IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5320; CHECK64-IZHINXMIN-NEXT: addi sp, sp, 16 5321; CHECK64-IZHINXMIN-NEXT: ret 5322; 5323; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_d: 5324; CHECK32-IZDINXZHINXMIN: # %bb.0: 5325; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.d a0, a0 5326; CHECK32-IZDINXZHINXMIN-NEXT: ret 5327; 5328; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_d: 5329; CHECK64-IZDINXZHINXMIN: # %bb.0: 5330; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.d a0, a0 5331; CHECK64-IZDINXZHINXMIN-NEXT: ret 5332 %1 = fptrunc double %a to half 5333 ret half %1 5334} 5335 5336define double @fcvt_d_h(half %a) nounwind { 5337; RV32IZFH-LABEL: fcvt_d_h: 5338; RV32IZFH: # %bb.0: 5339; RV32IZFH-NEXT: addi sp, sp, -16 5340; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5341; RV32IZFH-NEXT: fcvt.s.h fa0, fa0 5342; RV32IZFH-NEXT: call __extendsfdf2 5343; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5344; RV32IZFH-NEXT: addi sp, sp, 16 5345; RV32IZFH-NEXT: ret 5346; 5347; RV64IZFH-LABEL: fcvt_d_h: 5348; RV64IZFH: # %bb.0: 5349; RV64IZFH-NEXT: addi sp, sp, -16 5350; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5351; RV64IZFH-NEXT: fcvt.s.h fa0, fa0 5352; RV64IZFH-NEXT: call __extendsfdf2 5353; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5354; RV64IZFH-NEXT: addi sp, sp, 16 5355; RV64IZFH-NEXT: ret 5356; 5357; RV32IDZFH-LABEL: fcvt_d_h: 5358; RV32IDZFH: # %bb.0: 5359; RV32IDZFH-NEXT: fcvt.d.h fa0, fa0 5360; RV32IDZFH-NEXT: ret 5361; 5362; RV64IDZFH-LABEL: fcvt_d_h: 5363; RV64IDZFH: # %bb.0: 5364; RV64IDZFH-NEXT: fcvt.d.h fa0, fa0 5365; RV64IDZFH-NEXT: ret 5366; 5367; RV32IZHINX-LABEL: fcvt_d_h: 5368; RV32IZHINX: # %bb.0: 5369; RV32IZHINX-NEXT: addi sp, sp, -16 5370; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5371; RV32IZHINX-NEXT: fcvt.s.h a0, a0 5372; RV32IZHINX-NEXT: call __extendsfdf2 5373; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5374; RV32IZHINX-NEXT: addi sp, sp, 16 5375; RV32IZHINX-NEXT: ret 5376; 5377; RV64IZHINX-LABEL: fcvt_d_h: 5378; RV64IZHINX: # %bb.0: 5379; RV64IZHINX-NEXT: addi sp, sp, -16 5380; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5381; RV64IZHINX-NEXT: fcvt.s.h a0, a0 5382; RV64IZHINX-NEXT: call __extendsfdf2 5383; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5384; RV64IZHINX-NEXT: addi sp, sp, 16 5385; RV64IZHINX-NEXT: ret 5386; 5387; CHECKIZDINXZHINX-LABEL: fcvt_d_h: 5388; CHECKIZDINXZHINX: # %bb.0: 5389; CHECKIZDINXZHINX-NEXT: fcvt.d.h a0, a0 5390; CHECKIZDINXZHINX-NEXT: ret 5391; 5392; RV32I-LABEL: fcvt_d_h: 5393; RV32I: # %bb.0: 5394; RV32I-NEXT: addi sp, sp, -16 5395; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5396; RV32I-NEXT: call __extendhfsf2 5397; RV32I-NEXT: call __extendsfdf2 5398; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5399; RV32I-NEXT: addi sp, sp, 16 5400; RV32I-NEXT: ret 5401; 5402; RV64I-LABEL: fcvt_d_h: 5403; RV64I: # %bb.0: 5404; RV64I-NEXT: addi sp, sp, -16 5405; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5406; RV64I-NEXT: call __extendhfsf2 5407; RV64I-NEXT: call __extendsfdf2 5408; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5409; RV64I-NEXT: addi sp, sp, 16 5410; RV64I-NEXT: ret 5411; 5412; RV32ID-ILP32-LABEL: fcvt_d_h: 5413; RV32ID-ILP32: # %bb.0: 5414; RV32ID-ILP32-NEXT: addi sp, sp, -16 5415; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5416; RV32ID-ILP32-NEXT: call __extendhfsf2 5417; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 5418; RV32ID-ILP32-NEXT: fcvt.d.s fa5, fa5 5419; RV32ID-ILP32-NEXT: fsd fa5, 0(sp) 5420; RV32ID-ILP32-NEXT: lw a0, 0(sp) 5421; RV32ID-ILP32-NEXT: lw a1, 4(sp) 5422; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5423; RV32ID-ILP32-NEXT: addi sp, sp, 16 5424; RV32ID-ILP32-NEXT: ret 5425; 5426; RV64ID-LP64-LABEL: fcvt_d_h: 5427; RV64ID-LP64: # %bb.0: 5428; RV64ID-LP64-NEXT: addi sp, sp, -16 5429; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5430; RV64ID-LP64-NEXT: call __extendhfsf2 5431; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 5432; RV64ID-LP64-NEXT: fcvt.d.s fa5, fa5 5433; RV64ID-LP64-NEXT: fmv.x.d a0, fa5 5434; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5435; RV64ID-LP64-NEXT: addi sp, sp, 16 5436; RV64ID-LP64-NEXT: ret 5437; 5438; RV32ID-LABEL: fcvt_d_h: 5439; RV32ID: # %bb.0: 5440; RV32ID-NEXT: addi sp, sp, -16 5441; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5442; RV32ID-NEXT: call __extendhfsf2 5443; RV32ID-NEXT: fcvt.d.s fa0, fa0 5444; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5445; RV32ID-NEXT: addi sp, sp, 16 5446; RV32ID-NEXT: ret 5447; 5448; RV64ID-LABEL: fcvt_d_h: 5449; RV64ID: # %bb.0: 5450; RV64ID-NEXT: addi sp, sp, -16 5451; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5452; RV64ID-NEXT: call __extendhfsf2 5453; RV64ID-NEXT: fcvt.d.s fa0, fa0 5454; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5455; RV64ID-NEXT: addi sp, sp, 16 5456; RV64ID-NEXT: ret 5457; 5458; RV32IFZFHMIN-LABEL: fcvt_d_h: 5459; RV32IFZFHMIN: # %bb.0: 5460; RV32IFZFHMIN-NEXT: addi sp, sp, -16 5461; RV32IFZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5462; RV32IFZFHMIN-NEXT: fcvt.s.h fa0, fa0 5463; RV32IFZFHMIN-NEXT: call __extendsfdf2 5464; RV32IFZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5465; RV32IFZFHMIN-NEXT: addi sp, sp, 16 5466; RV32IFZFHMIN-NEXT: ret 5467; 5468; RV64IFZFHMIN-LABEL: fcvt_d_h: 5469; RV64IFZFHMIN: # %bb.0: 5470; RV64IFZFHMIN-NEXT: addi sp, sp, -16 5471; RV64IFZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5472; RV64IFZFHMIN-NEXT: fcvt.s.h fa0, fa0 5473; RV64IFZFHMIN-NEXT: call __extendsfdf2 5474; RV64IFZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5475; RV64IFZFHMIN-NEXT: addi sp, sp, 16 5476; RV64IFZFHMIN-NEXT: ret 5477; 5478; RV32IDZFHMIN-LABEL: fcvt_d_h: 5479; RV32IDZFHMIN: # %bb.0: 5480; RV32IDZFHMIN-NEXT: fcvt.d.h fa0, fa0 5481; RV32IDZFHMIN-NEXT: ret 5482; 5483; RV64IDZFHMIN-LABEL: fcvt_d_h: 5484; RV64IDZFHMIN: # %bb.0: 5485; RV64IDZFHMIN-NEXT: fcvt.d.h fa0, fa0 5486; RV64IDZFHMIN-NEXT: ret 5487; 5488; CHECK32-IZHINXMIN-LABEL: fcvt_d_h: 5489; CHECK32-IZHINXMIN: # %bb.0: 5490; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -16 5491; CHECK32-IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5492; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 5493; CHECK32-IZHINXMIN-NEXT: call __extendsfdf2 5494; CHECK32-IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5495; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 16 5496; CHECK32-IZHINXMIN-NEXT: ret 5497; 5498; CHECK64-IZHINXMIN-LABEL: fcvt_d_h: 5499; CHECK64-IZHINXMIN: # %bb.0: 5500; CHECK64-IZHINXMIN-NEXT: addi sp, sp, -16 5501; CHECK64-IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5502; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 5503; CHECK64-IZHINXMIN-NEXT: call __extendsfdf2 5504; CHECK64-IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5505; CHECK64-IZHINXMIN-NEXT: addi sp, sp, 16 5506; CHECK64-IZHINXMIN-NEXT: ret 5507; 5508; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_d_h: 5509; CHECK32-IZDINXZHINXMIN: # %bb.0: 5510; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.d.h a0, a0 5511; CHECK32-IZDINXZHINXMIN-NEXT: ret 5512; 5513; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_d_h: 5514; CHECK64-IZDINXZHINXMIN: # %bb.0: 5515; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.d.h a0, a0 5516; CHECK64-IZDINXZHINXMIN-NEXT: ret 5517 %1 = fpext half %a to double 5518 ret double %1 5519} 5520 5521define half @bitcast_h_i16(i16 %a) nounwind { 5522; CHECKIZFH-LABEL: bitcast_h_i16: 5523; CHECKIZFH: # %bb.0: 5524; CHECKIZFH-NEXT: fmv.h.x fa0, a0 5525; CHECKIZFH-NEXT: ret 5526; 5527; RV32IDZFH-LABEL: bitcast_h_i16: 5528; RV32IDZFH: # %bb.0: 5529; RV32IDZFH-NEXT: fmv.h.x fa0, a0 5530; RV32IDZFH-NEXT: ret 5531; 5532; RV64IDZFH-LABEL: bitcast_h_i16: 5533; RV64IDZFH: # %bb.0: 5534; RV64IDZFH-NEXT: fmv.h.x fa0, a0 5535; RV64IDZFH-NEXT: ret 5536; 5537; CHECKIZHINX-LABEL: bitcast_h_i16: 5538; CHECKIZHINX: # %bb.0: 5539; CHECKIZHINX-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5540; CHECKIZHINX-NEXT: ret 5541; 5542; CHECKIZDINXZHINX-LABEL: bitcast_h_i16: 5543; CHECKIZDINXZHINX: # %bb.0: 5544; CHECKIZDINXZHINX-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5545; CHECKIZDINXZHINX-NEXT: ret 5546; 5547; RV32I-LABEL: bitcast_h_i16: 5548; RV32I: # %bb.0: 5549; RV32I-NEXT: ret 5550; 5551; RV64I-LABEL: bitcast_h_i16: 5552; RV64I: # %bb.0: 5553; RV64I-NEXT: ret 5554; 5555; RV32ID-ILP32-LABEL: bitcast_h_i16: 5556; RV32ID-ILP32: # %bb.0: 5557; RV32ID-ILP32-NEXT: lui a1, 1048560 5558; RV32ID-ILP32-NEXT: or a0, a0, a1 5559; RV32ID-ILP32-NEXT: ret 5560; 5561; RV64ID-LP64-LABEL: bitcast_h_i16: 5562; RV64ID-LP64: # %bb.0: 5563; RV64ID-LP64-NEXT: lui a1, 1048560 5564; RV64ID-LP64-NEXT: or a0, a0, a1 5565; RV64ID-LP64-NEXT: ret 5566; 5567; RV32ID-LABEL: bitcast_h_i16: 5568; RV32ID: # %bb.0: 5569; RV32ID-NEXT: lui a1, 1048560 5570; RV32ID-NEXT: or a0, a0, a1 5571; RV32ID-NEXT: fmv.w.x fa0, a0 5572; RV32ID-NEXT: ret 5573; 5574; RV64ID-LABEL: bitcast_h_i16: 5575; RV64ID: # %bb.0: 5576; RV64ID-NEXT: lui a1, 1048560 5577; RV64ID-NEXT: or a0, a0, a1 5578; RV64ID-NEXT: fmv.w.x fa0, a0 5579; RV64ID-NEXT: ret 5580; 5581; CHECK32-IZFHMIN-LABEL: bitcast_h_i16: 5582; CHECK32-IZFHMIN: # %bb.0: 5583; CHECK32-IZFHMIN-NEXT: fmv.h.x fa0, a0 5584; CHECK32-IZFHMIN-NEXT: ret 5585; 5586; CHECK64-IZFHMIN-LABEL: bitcast_h_i16: 5587; CHECK64-IZFHMIN: # %bb.0: 5588; CHECK64-IZFHMIN-NEXT: fmv.h.x fa0, a0 5589; CHECK64-IZFHMIN-NEXT: ret 5590; 5591; CHECK32-IZHINXMIN-LABEL: bitcast_h_i16: 5592; CHECK32-IZHINXMIN: # %bb.0: 5593; CHECK32-IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5594; CHECK32-IZHINXMIN-NEXT: ret 5595; 5596; CHECK64-IZHINXMIN-LABEL: bitcast_h_i16: 5597; CHECK64-IZHINXMIN: # %bb.0: 5598; CHECK64-IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5599; CHECK64-IZHINXMIN-NEXT: ret 5600; 5601; CHECK32-IZDINXZHINXMIN-LABEL: bitcast_h_i16: 5602; CHECK32-IZDINXZHINXMIN: # %bb.0: 5603; CHECK32-IZDINXZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5604; CHECK32-IZDINXZHINXMIN-NEXT: ret 5605; 5606; CHECK64-IZDINXZHINXMIN-LABEL: bitcast_h_i16: 5607; CHECK64-IZDINXZHINXMIN: # %bb.0: 5608; CHECK64-IZDINXZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x10 5609; CHECK64-IZDINXZHINXMIN-NEXT: ret 5610 %1 = bitcast i16 %a to half 5611 ret half %1 5612} 5613 5614define i16 @bitcast_i16_h(half %a) nounwind { 5615; CHECKIZFH-LABEL: bitcast_i16_h: 5616; CHECKIZFH: # %bb.0: 5617; CHECKIZFH-NEXT: fmv.x.h a0, fa0 5618; CHECKIZFH-NEXT: ret 5619; 5620; RV32IDZFH-LABEL: bitcast_i16_h: 5621; RV32IDZFH: # %bb.0: 5622; RV32IDZFH-NEXT: fmv.x.h a0, fa0 5623; RV32IDZFH-NEXT: ret 5624; 5625; RV64IDZFH-LABEL: bitcast_i16_h: 5626; RV64IDZFH: # %bb.0: 5627; RV64IDZFH-NEXT: fmv.x.h a0, fa0 5628; RV64IDZFH-NEXT: ret 5629; 5630; CHECKIZHINX-LABEL: bitcast_i16_h: 5631; CHECKIZHINX: # %bb.0: 5632; CHECKIZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 5633; CHECKIZHINX-NEXT: ret 5634; 5635; CHECKIZDINXZHINX-LABEL: bitcast_i16_h: 5636; CHECKIZDINXZHINX: # %bb.0: 5637; CHECKIZDINXZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 5638; CHECKIZDINXZHINX-NEXT: ret 5639; 5640; RV32I-LABEL: bitcast_i16_h: 5641; RV32I: # %bb.0: 5642; RV32I-NEXT: ret 5643; 5644; RV64I-LABEL: bitcast_i16_h: 5645; RV64I: # %bb.0: 5646; RV64I-NEXT: ret 5647; 5648; RV32ID-ILP32-LABEL: bitcast_i16_h: 5649; RV32ID-ILP32: # %bb.0: 5650; RV32ID-ILP32-NEXT: ret 5651; 5652; RV64ID-LP64-LABEL: bitcast_i16_h: 5653; RV64ID-LP64: # %bb.0: 5654; RV64ID-LP64-NEXT: ret 5655; 5656; RV32ID-LABEL: bitcast_i16_h: 5657; RV32ID: # %bb.0: 5658; RV32ID-NEXT: fmv.x.w a0, fa0 5659; RV32ID-NEXT: ret 5660; 5661; RV64ID-LABEL: bitcast_i16_h: 5662; RV64ID: # %bb.0: 5663; RV64ID-NEXT: fmv.x.w a0, fa0 5664; RV64ID-NEXT: ret 5665; 5666; CHECK32-IZFHMIN-LABEL: bitcast_i16_h: 5667; CHECK32-IZFHMIN: # %bb.0: 5668; CHECK32-IZFHMIN-NEXT: fmv.x.h a0, fa0 5669; CHECK32-IZFHMIN-NEXT: ret 5670; 5671; CHECK64-IZFHMIN-LABEL: bitcast_i16_h: 5672; CHECK64-IZFHMIN: # %bb.0: 5673; CHECK64-IZFHMIN-NEXT: fmv.x.h a0, fa0 5674; CHECK64-IZFHMIN-NEXT: ret 5675; 5676; CHECK32-IZHINXMIN-LABEL: bitcast_i16_h: 5677; CHECK32-IZHINXMIN: # %bb.0: 5678; CHECK32-IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10 5679; CHECK32-IZHINXMIN-NEXT: ret 5680; 5681; CHECK64-IZHINXMIN-LABEL: bitcast_i16_h: 5682; CHECK64-IZHINXMIN: # %bb.0: 5683; CHECK64-IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10 5684; CHECK64-IZHINXMIN-NEXT: ret 5685; 5686; CHECK32-IZDINXZHINXMIN-LABEL: bitcast_i16_h: 5687; CHECK32-IZDINXZHINXMIN: # %bb.0: 5688; CHECK32-IZDINXZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10 5689; CHECK32-IZDINXZHINXMIN-NEXT: ret 5690; 5691; CHECK64-IZDINXZHINXMIN-LABEL: bitcast_i16_h: 5692; CHECK64-IZDINXZHINXMIN: # %bb.0: 5693; CHECK64-IZDINXZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x10 5694; CHECK64-IZDINXZHINXMIN-NEXT: ret 5695 %1 = bitcast half %a to i16 5696 ret i16 %1 5697} 5698 5699; Make sure we select W version of addi on RV64. 5700define signext i32 @fcvt_h_w_demanded_bits(i32 signext %0, ptr %1) nounwind { 5701; RV32IZFH-LABEL: fcvt_h_w_demanded_bits: 5702; RV32IZFH: # %bb.0: 5703; RV32IZFH-NEXT: addi a0, a0, 1 5704; RV32IZFH-NEXT: fcvt.h.w fa5, a0 5705; RV32IZFH-NEXT: fsh fa5, 0(a1) 5706; RV32IZFH-NEXT: ret 5707; 5708; RV64IZFH-LABEL: fcvt_h_w_demanded_bits: 5709; RV64IZFH: # %bb.0: 5710; RV64IZFH-NEXT: addiw a0, a0, 1 5711; RV64IZFH-NEXT: fcvt.h.w fa5, a0 5712; RV64IZFH-NEXT: fsh fa5, 0(a1) 5713; RV64IZFH-NEXT: ret 5714; 5715; RV32IDZFH-LABEL: fcvt_h_w_demanded_bits: 5716; RV32IDZFH: # %bb.0: 5717; RV32IDZFH-NEXT: addi a0, a0, 1 5718; RV32IDZFH-NEXT: fcvt.h.w fa5, a0 5719; RV32IDZFH-NEXT: fsh fa5, 0(a1) 5720; RV32IDZFH-NEXT: ret 5721; 5722; RV64IDZFH-LABEL: fcvt_h_w_demanded_bits: 5723; RV64IDZFH: # %bb.0: 5724; RV64IDZFH-NEXT: addiw a0, a0, 1 5725; RV64IDZFH-NEXT: fcvt.h.w fa5, a0 5726; RV64IDZFH-NEXT: fsh fa5, 0(a1) 5727; RV64IDZFH-NEXT: ret 5728; 5729; RV32IZHINX-LABEL: fcvt_h_w_demanded_bits: 5730; RV32IZHINX: # %bb.0: 5731; RV32IZHINX-NEXT: addi a0, a0, 1 5732; RV32IZHINX-NEXT: fcvt.h.w a2, a0 5733; RV32IZHINX-NEXT: sh a2, 0(a1) 5734; RV32IZHINX-NEXT: ret 5735; 5736; RV64IZHINX-LABEL: fcvt_h_w_demanded_bits: 5737; RV64IZHINX: # %bb.0: 5738; RV64IZHINX-NEXT: addiw a0, a0, 1 5739; RV64IZHINX-NEXT: fcvt.h.w a2, a0 5740; RV64IZHINX-NEXT: sh a2, 0(a1) 5741; RV64IZHINX-NEXT: ret 5742; 5743; RV32IZDINXZHINX-LABEL: fcvt_h_w_demanded_bits: 5744; RV32IZDINXZHINX: # %bb.0: 5745; RV32IZDINXZHINX-NEXT: addi a0, a0, 1 5746; RV32IZDINXZHINX-NEXT: fcvt.h.w a2, a0 5747; RV32IZDINXZHINX-NEXT: sh a2, 0(a1) 5748; RV32IZDINXZHINX-NEXT: ret 5749; 5750; RV64IZDINXZHINX-LABEL: fcvt_h_w_demanded_bits: 5751; RV64IZDINXZHINX: # %bb.0: 5752; RV64IZDINXZHINX-NEXT: addiw a0, a0, 1 5753; RV64IZDINXZHINX-NEXT: fcvt.h.w a2, a0 5754; RV64IZDINXZHINX-NEXT: sh a2, 0(a1) 5755; RV64IZDINXZHINX-NEXT: ret 5756; 5757; RV32I-LABEL: fcvt_h_w_demanded_bits: 5758; RV32I: # %bb.0: 5759; RV32I-NEXT: addi sp, sp, -16 5760; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5761; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5762; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5763; RV32I-NEXT: mv s0, a1 5764; RV32I-NEXT: addi s1, a0, 1 5765; RV32I-NEXT: mv a0, s1 5766; RV32I-NEXT: call __floatsisf 5767; RV32I-NEXT: call __truncsfhf2 5768; RV32I-NEXT: sh a0, 0(s0) 5769; RV32I-NEXT: mv a0, s1 5770; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5771; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5772; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5773; RV32I-NEXT: addi sp, sp, 16 5774; RV32I-NEXT: ret 5775; 5776; RV64I-LABEL: fcvt_h_w_demanded_bits: 5777; RV64I: # %bb.0: 5778; RV64I-NEXT: addi sp, sp, -32 5779; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5780; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5781; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5782; RV64I-NEXT: mv s0, a1 5783; RV64I-NEXT: addiw s1, a0, 1 5784; RV64I-NEXT: mv a0, s1 5785; RV64I-NEXT: call __floatsisf 5786; RV64I-NEXT: call __truncsfhf2 5787; RV64I-NEXT: sh a0, 0(s0) 5788; RV64I-NEXT: mv a0, s1 5789; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5790; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5791; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 5792; RV64I-NEXT: addi sp, sp, 32 5793; RV64I-NEXT: ret 5794; 5795; RV32ID-ILP32-LABEL: fcvt_h_w_demanded_bits: 5796; RV32ID-ILP32: # %bb.0: 5797; RV32ID-ILP32-NEXT: addi sp, sp, -16 5798; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5799; RV32ID-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5800; RV32ID-ILP32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5801; RV32ID-ILP32-NEXT: mv s0, a1 5802; RV32ID-ILP32-NEXT: addi s1, a0, 1 5803; RV32ID-ILP32-NEXT: fcvt.s.w fa5, s1 5804; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 5805; RV32ID-ILP32-NEXT: call __truncsfhf2 5806; RV32ID-ILP32-NEXT: sh a0, 0(s0) 5807; RV32ID-ILP32-NEXT: mv a0, s1 5808; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5809; RV32ID-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5810; RV32ID-ILP32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5811; RV32ID-ILP32-NEXT: addi sp, sp, 16 5812; RV32ID-ILP32-NEXT: ret 5813; 5814; RV64ID-LP64-LABEL: fcvt_h_w_demanded_bits: 5815; RV64ID-LP64: # %bb.0: 5816; RV64ID-LP64-NEXT: addi sp, sp, -32 5817; RV64ID-LP64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5818; RV64ID-LP64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5819; RV64ID-LP64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5820; RV64ID-LP64-NEXT: mv s0, a1 5821; RV64ID-LP64-NEXT: addiw s1, a0, 1 5822; RV64ID-LP64-NEXT: fcvt.s.w fa5, s1 5823; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 5824; RV64ID-LP64-NEXT: call __truncsfhf2 5825; RV64ID-LP64-NEXT: sh a0, 0(s0) 5826; RV64ID-LP64-NEXT: mv a0, s1 5827; RV64ID-LP64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5828; RV64ID-LP64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5829; RV64ID-LP64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 5830; RV64ID-LP64-NEXT: addi sp, sp, 32 5831; RV64ID-LP64-NEXT: ret 5832; 5833; RV32ID-LABEL: fcvt_h_w_demanded_bits: 5834; RV32ID: # %bb.0: 5835; RV32ID-NEXT: addi sp, sp, -16 5836; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5837; RV32ID-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5838; RV32ID-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5839; RV32ID-NEXT: mv s0, a1 5840; RV32ID-NEXT: addi s1, a0, 1 5841; RV32ID-NEXT: fcvt.s.w fa0, s1 5842; RV32ID-NEXT: call __truncsfhf2 5843; RV32ID-NEXT: fmv.x.w a0, fa0 5844; RV32ID-NEXT: sh a0, 0(s0) 5845; RV32ID-NEXT: mv a0, s1 5846; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5847; RV32ID-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5848; RV32ID-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5849; RV32ID-NEXT: addi sp, sp, 16 5850; RV32ID-NEXT: ret 5851; 5852; RV64ID-LABEL: fcvt_h_w_demanded_bits: 5853; RV64ID: # %bb.0: 5854; RV64ID-NEXT: addi sp, sp, -32 5855; RV64ID-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5856; RV64ID-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5857; RV64ID-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5858; RV64ID-NEXT: mv s0, a1 5859; RV64ID-NEXT: addiw s1, a0, 1 5860; RV64ID-NEXT: fcvt.s.w fa0, s1 5861; RV64ID-NEXT: call __truncsfhf2 5862; RV64ID-NEXT: fmv.x.w a0, fa0 5863; RV64ID-NEXT: sh a0, 0(s0) 5864; RV64ID-NEXT: mv a0, s1 5865; RV64ID-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5866; RV64ID-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5867; RV64ID-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 5868; RV64ID-NEXT: addi sp, sp, 32 5869; RV64ID-NEXT: ret 5870; 5871; CHECK32-IZFHMIN-LABEL: fcvt_h_w_demanded_bits: 5872; CHECK32-IZFHMIN: # %bb.0: 5873; CHECK32-IZFHMIN-NEXT: addi a0, a0, 1 5874; CHECK32-IZFHMIN-NEXT: fcvt.s.w fa5, a0 5875; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa5, fa5 5876; CHECK32-IZFHMIN-NEXT: fsh fa5, 0(a1) 5877; CHECK32-IZFHMIN-NEXT: ret 5878; 5879; CHECK64-IZFHMIN-LABEL: fcvt_h_w_demanded_bits: 5880; CHECK64-IZFHMIN: # %bb.0: 5881; CHECK64-IZFHMIN-NEXT: addiw a0, a0, 1 5882; CHECK64-IZFHMIN-NEXT: fcvt.s.w fa5, a0 5883; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa5, fa5 5884; CHECK64-IZFHMIN-NEXT: fsh fa5, 0(a1) 5885; CHECK64-IZFHMIN-NEXT: ret 5886; 5887; CHECK32-IZHINXMIN-LABEL: fcvt_h_w_demanded_bits: 5888; CHECK32-IZHINXMIN: # %bb.0: 5889; CHECK32-IZHINXMIN-NEXT: addi a0, a0, 1 5890; CHECK32-IZHINXMIN-NEXT: fcvt.s.w a2, a0 5891; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a2, a2 5892; CHECK32-IZHINXMIN-NEXT: sh a2, 0(a1) 5893; CHECK32-IZHINXMIN-NEXT: ret 5894; 5895; CHECK64-IZHINXMIN-LABEL: fcvt_h_w_demanded_bits: 5896; CHECK64-IZHINXMIN: # %bb.0: 5897; CHECK64-IZHINXMIN-NEXT: addiw a0, a0, 1 5898; CHECK64-IZHINXMIN-NEXT: fcvt.s.w a2, a0 5899; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a2, a2 5900; CHECK64-IZHINXMIN-NEXT: sh a2, 0(a1) 5901; CHECK64-IZHINXMIN-NEXT: ret 5902; 5903; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_w_demanded_bits: 5904; CHECK32-IZDINXZHINXMIN: # %bb.0: 5905; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, 1 5906; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.w a2, a0 5907; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a2, a2 5908; CHECK32-IZDINXZHINXMIN-NEXT: sh a2, 0(a1) 5909; CHECK32-IZDINXZHINXMIN-NEXT: ret 5910; 5911; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_w_demanded_bits: 5912; CHECK64-IZDINXZHINXMIN: # %bb.0: 5913; CHECK64-IZDINXZHINXMIN-NEXT: addiw a0, a0, 1 5914; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.w a2, a0 5915; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a2, a2 5916; CHECK64-IZDINXZHINXMIN-NEXT: sh a2, 0(a1) 5917; CHECK64-IZDINXZHINXMIN-NEXT: ret 5918 %3 = add i32 %0, 1 5919 %4 = sitofp i32 %3 to half 5920 store half %4, ptr %1, align 2 5921 ret i32 %3 5922} 5923 5924; Make sure we select W version of addi on RV64. 5925define signext i32 @fcvt_h_wu_demanded_bits(i32 signext %0, ptr %1) nounwind { 5926; RV32IZFH-LABEL: fcvt_h_wu_demanded_bits: 5927; RV32IZFH: # %bb.0: 5928; RV32IZFH-NEXT: addi a0, a0, 1 5929; RV32IZFH-NEXT: fcvt.h.wu fa5, a0 5930; RV32IZFH-NEXT: fsh fa5, 0(a1) 5931; RV32IZFH-NEXT: ret 5932; 5933; RV64IZFH-LABEL: fcvt_h_wu_demanded_bits: 5934; RV64IZFH: # %bb.0: 5935; RV64IZFH-NEXT: addiw a0, a0, 1 5936; RV64IZFH-NEXT: fcvt.h.wu fa5, a0 5937; RV64IZFH-NEXT: fsh fa5, 0(a1) 5938; RV64IZFH-NEXT: ret 5939; 5940; RV32IDZFH-LABEL: fcvt_h_wu_demanded_bits: 5941; RV32IDZFH: # %bb.0: 5942; RV32IDZFH-NEXT: addi a0, a0, 1 5943; RV32IDZFH-NEXT: fcvt.h.wu fa5, a0 5944; RV32IDZFH-NEXT: fsh fa5, 0(a1) 5945; RV32IDZFH-NEXT: ret 5946; 5947; RV64IDZFH-LABEL: fcvt_h_wu_demanded_bits: 5948; RV64IDZFH: # %bb.0: 5949; RV64IDZFH-NEXT: addiw a0, a0, 1 5950; RV64IDZFH-NEXT: fcvt.h.wu fa5, a0 5951; RV64IDZFH-NEXT: fsh fa5, 0(a1) 5952; RV64IDZFH-NEXT: ret 5953; 5954; RV32IZHINX-LABEL: fcvt_h_wu_demanded_bits: 5955; RV32IZHINX: # %bb.0: 5956; RV32IZHINX-NEXT: addi a0, a0, 1 5957; RV32IZHINX-NEXT: fcvt.h.wu a2, a0 5958; RV32IZHINX-NEXT: sh a2, 0(a1) 5959; RV32IZHINX-NEXT: ret 5960; 5961; RV64IZHINX-LABEL: fcvt_h_wu_demanded_bits: 5962; RV64IZHINX: # %bb.0: 5963; RV64IZHINX-NEXT: addiw a0, a0, 1 5964; RV64IZHINX-NEXT: fcvt.h.wu a2, a0 5965; RV64IZHINX-NEXT: sh a2, 0(a1) 5966; RV64IZHINX-NEXT: ret 5967; 5968; RV32IZDINXZHINX-LABEL: fcvt_h_wu_demanded_bits: 5969; RV32IZDINXZHINX: # %bb.0: 5970; RV32IZDINXZHINX-NEXT: addi a0, a0, 1 5971; RV32IZDINXZHINX-NEXT: fcvt.h.wu a2, a0 5972; RV32IZDINXZHINX-NEXT: sh a2, 0(a1) 5973; RV32IZDINXZHINX-NEXT: ret 5974; 5975; RV64IZDINXZHINX-LABEL: fcvt_h_wu_demanded_bits: 5976; RV64IZDINXZHINX: # %bb.0: 5977; RV64IZDINXZHINX-NEXT: addiw a0, a0, 1 5978; RV64IZDINXZHINX-NEXT: fcvt.h.wu a2, a0 5979; RV64IZDINXZHINX-NEXT: sh a2, 0(a1) 5980; RV64IZDINXZHINX-NEXT: ret 5981; 5982; RV32I-LABEL: fcvt_h_wu_demanded_bits: 5983; RV32I: # %bb.0: 5984; RV32I-NEXT: addi sp, sp, -16 5985; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5986; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5987; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5988; RV32I-NEXT: mv s0, a1 5989; RV32I-NEXT: addi s1, a0, 1 5990; RV32I-NEXT: mv a0, s1 5991; RV32I-NEXT: call __floatunsisf 5992; RV32I-NEXT: call __truncsfhf2 5993; RV32I-NEXT: sh a0, 0(s0) 5994; RV32I-NEXT: mv a0, s1 5995; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5996; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5997; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5998; RV32I-NEXT: addi sp, sp, 16 5999; RV32I-NEXT: ret 6000; 6001; RV64I-LABEL: fcvt_h_wu_demanded_bits: 6002; RV64I: # %bb.0: 6003; RV64I-NEXT: addi sp, sp, -32 6004; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 6005; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 6006; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 6007; RV64I-NEXT: mv s0, a1 6008; RV64I-NEXT: addiw s1, a0, 1 6009; RV64I-NEXT: mv a0, s1 6010; RV64I-NEXT: call __floatunsisf 6011; RV64I-NEXT: call __truncsfhf2 6012; RV64I-NEXT: sh a0, 0(s0) 6013; RV64I-NEXT: mv a0, s1 6014; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 6015; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 6016; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 6017; RV64I-NEXT: addi sp, sp, 32 6018; RV64I-NEXT: ret 6019; 6020; RV32ID-ILP32-LABEL: fcvt_h_wu_demanded_bits: 6021; RV32ID-ILP32: # %bb.0: 6022; RV32ID-ILP32-NEXT: addi sp, sp, -16 6023; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6024; RV32ID-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 6025; RV32ID-ILP32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 6026; RV32ID-ILP32-NEXT: mv s0, a1 6027; RV32ID-ILP32-NEXT: addi s1, a0, 1 6028; RV32ID-ILP32-NEXT: fcvt.s.wu fa5, s1 6029; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5 6030; RV32ID-ILP32-NEXT: call __truncsfhf2 6031; RV32ID-ILP32-NEXT: sh a0, 0(s0) 6032; RV32ID-ILP32-NEXT: mv a0, s1 6033; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6034; RV32ID-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 6035; RV32ID-ILP32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 6036; RV32ID-ILP32-NEXT: addi sp, sp, 16 6037; RV32ID-ILP32-NEXT: ret 6038; 6039; RV64ID-LP64-LABEL: fcvt_h_wu_demanded_bits: 6040; RV64ID-LP64: # %bb.0: 6041; RV64ID-LP64-NEXT: addi sp, sp, -32 6042; RV64ID-LP64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 6043; RV64ID-LP64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 6044; RV64ID-LP64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 6045; RV64ID-LP64-NEXT: mv s0, a1 6046; RV64ID-LP64-NEXT: addiw s1, a0, 1 6047; RV64ID-LP64-NEXT: fcvt.s.wu fa5, s1 6048; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 6049; RV64ID-LP64-NEXT: call __truncsfhf2 6050; RV64ID-LP64-NEXT: sh a0, 0(s0) 6051; RV64ID-LP64-NEXT: mv a0, s1 6052; RV64ID-LP64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 6053; RV64ID-LP64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 6054; RV64ID-LP64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 6055; RV64ID-LP64-NEXT: addi sp, sp, 32 6056; RV64ID-LP64-NEXT: ret 6057; 6058; RV32ID-LABEL: fcvt_h_wu_demanded_bits: 6059; RV32ID: # %bb.0: 6060; RV32ID-NEXT: addi sp, sp, -16 6061; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6062; RV32ID-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 6063; RV32ID-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 6064; RV32ID-NEXT: mv s0, a1 6065; RV32ID-NEXT: addi s1, a0, 1 6066; RV32ID-NEXT: fcvt.s.wu fa0, s1 6067; RV32ID-NEXT: call __truncsfhf2 6068; RV32ID-NEXT: fmv.x.w a0, fa0 6069; RV32ID-NEXT: sh a0, 0(s0) 6070; RV32ID-NEXT: mv a0, s1 6071; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6072; RV32ID-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 6073; RV32ID-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 6074; RV32ID-NEXT: addi sp, sp, 16 6075; RV32ID-NEXT: ret 6076; 6077; RV64ID-LABEL: fcvt_h_wu_demanded_bits: 6078; RV64ID: # %bb.0: 6079; RV64ID-NEXT: addi sp, sp, -32 6080; RV64ID-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 6081; RV64ID-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 6082; RV64ID-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 6083; RV64ID-NEXT: mv s0, a1 6084; RV64ID-NEXT: addiw s1, a0, 1 6085; RV64ID-NEXT: fcvt.s.wu fa0, s1 6086; RV64ID-NEXT: call __truncsfhf2 6087; RV64ID-NEXT: fmv.x.w a0, fa0 6088; RV64ID-NEXT: sh a0, 0(s0) 6089; RV64ID-NEXT: mv a0, s1 6090; RV64ID-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 6091; RV64ID-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 6092; RV64ID-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 6093; RV64ID-NEXT: addi sp, sp, 32 6094; RV64ID-NEXT: ret 6095; 6096; CHECK32-IZFHMIN-LABEL: fcvt_h_wu_demanded_bits: 6097; CHECK32-IZFHMIN: # %bb.0: 6098; CHECK32-IZFHMIN-NEXT: addi a0, a0, 1 6099; CHECK32-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 6100; CHECK32-IZFHMIN-NEXT: fcvt.h.s fa5, fa5 6101; CHECK32-IZFHMIN-NEXT: fsh fa5, 0(a1) 6102; CHECK32-IZFHMIN-NEXT: ret 6103; 6104; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_demanded_bits: 6105; CHECK64-IZFHMIN: # %bb.0: 6106; CHECK64-IZFHMIN-NEXT: addiw a0, a0, 1 6107; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 6108; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa5, fa5 6109; CHECK64-IZFHMIN-NEXT: fsh fa5, 0(a1) 6110; CHECK64-IZFHMIN-NEXT: ret 6111; 6112; CHECK32-IZHINXMIN-LABEL: fcvt_h_wu_demanded_bits: 6113; CHECK32-IZHINXMIN: # %bb.0: 6114; CHECK32-IZHINXMIN-NEXT: addi a0, a0, 1 6115; CHECK32-IZHINXMIN-NEXT: fcvt.s.wu a2, a0 6116; CHECK32-IZHINXMIN-NEXT: fcvt.h.s a2, a2 6117; CHECK32-IZHINXMIN-NEXT: sh a2, 0(a1) 6118; CHECK32-IZHINXMIN-NEXT: ret 6119; 6120; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_demanded_bits: 6121; CHECK64-IZHINXMIN: # %bb.0: 6122; CHECK64-IZHINXMIN-NEXT: addiw a0, a0, 1 6123; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a2, a0 6124; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a2, a2 6125; CHECK64-IZHINXMIN-NEXT: sh a2, 0(a1) 6126; CHECK64-IZHINXMIN-NEXT: ret 6127; 6128; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_wu_demanded_bits: 6129; CHECK32-IZDINXZHINXMIN: # %bb.0: 6130; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, 1 6131; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.wu a2, a0 6132; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.h.s a2, a2 6133; CHECK32-IZDINXZHINXMIN-NEXT: sh a2, 0(a1) 6134; CHECK32-IZDINXZHINXMIN-NEXT: ret 6135; 6136; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_demanded_bits: 6137; CHECK64-IZDINXZHINXMIN: # %bb.0: 6138; CHECK64-IZDINXZHINXMIN-NEXT: addiw a0, a0, 1 6139; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a2, a0 6140; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a2, a2 6141; CHECK64-IZDINXZHINXMIN-NEXT: sh a2, 0(a1) 6142; CHECK64-IZDINXZHINXMIN-NEXT: ret 6143 %3 = add i32 %0, 1 6144 %4 = uitofp i32 %3 to half 6145 store half %4, ptr %1, align 2 6146 ret i32 %3 6147} 6148 6149define signext i16 @fcvt_w_s_i16(half %a) nounwind { 6150; RV32IZFH-LABEL: fcvt_w_s_i16: 6151; RV32IZFH: # %bb.0: 6152; RV32IZFH-NEXT: fcvt.w.h a0, fa0, rtz 6153; RV32IZFH-NEXT: ret 6154; 6155; RV64IZFH-LABEL: fcvt_w_s_i16: 6156; RV64IZFH: # %bb.0: 6157; RV64IZFH-NEXT: fcvt.l.h a0, fa0, rtz 6158; RV64IZFH-NEXT: ret 6159; 6160; RV32IDZFH-LABEL: fcvt_w_s_i16: 6161; RV32IDZFH: # %bb.0: 6162; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 6163; RV32IDZFH-NEXT: ret 6164; 6165; RV64IDZFH-LABEL: fcvt_w_s_i16: 6166; RV64IDZFH: # %bb.0: 6167; RV64IDZFH-NEXT: fcvt.l.h a0, fa0, rtz 6168; RV64IDZFH-NEXT: ret 6169; 6170; RV32IZHINX-LABEL: fcvt_w_s_i16: 6171; RV32IZHINX: # %bb.0: 6172; RV32IZHINX-NEXT: fcvt.w.h a0, a0, rtz 6173; RV32IZHINX-NEXT: ret 6174; 6175; RV64IZHINX-LABEL: fcvt_w_s_i16: 6176; RV64IZHINX: # %bb.0: 6177; RV64IZHINX-NEXT: fcvt.l.h a0, a0, rtz 6178; RV64IZHINX-NEXT: ret 6179; 6180; RV32IZDINXZHINX-LABEL: fcvt_w_s_i16: 6181; RV32IZDINXZHINX: # %bb.0: 6182; RV32IZDINXZHINX-NEXT: fcvt.w.h a0, a0, rtz 6183; RV32IZDINXZHINX-NEXT: ret 6184; 6185; RV64IZDINXZHINX-LABEL: fcvt_w_s_i16: 6186; RV64IZDINXZHINX: # %bb.0: 6187; RV64IZDINXZHINX-NEXT: fcvt.l.h a0, a0, rtz 6188; RV64IZDINXZHINX-NEXT: ret 6189; 6190; RV32I-LABEL: fcvt_w_s_i16: 6191; RV32I: # %bb.0: 6192; RV32I-NEXT: addi sp, sp, -16 6193; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6194; RV32I-NEXT: slli a0, a0, 16 6195; RV32I-NEXT: srli a0, a0, 16 6196; RV32I-NEXT: call __extendhfsf2 6197; RV32I-NEXT: call __fixsfsi 6198; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6199; RV32I-NEXT: addi sp, sp, 16 6200; RV32I-NEXT: ret 6201; 6202; RV64I-LABEL: fcvt_w_s_i16: 6203; RV64I: # %bb.0: 6204; RV64I-NEXT: addi sp, sp, -16 6205; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6206; RV64I-NEXT: slli a0, a0, 48 6207; RV64I-NEXT: srli a0, a0, 48 6208; RV64I-NEXT: call __extendhfsf2 6209; RV64I-NEXT: call __fixsfdi 6210; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6211; RV64I-NEXT: addi sp, sp, 16 6212; RV64I-NEXT: ret 6213; 6214; RV32ID-ILP32-LABEL: fcvt_w_s_i16: 6215; RV32ID-ILP32: # %bb.0: 6216; RV32ID-ILP32-NEXT: addi sp, sp, -16 6217; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6218; RV32ID-ILP32-NEXT: call __extendhfsf2 6219; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 6220; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 6221; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6222; RV32ID-ILP32-NEXT: addi sp, sp, 16 6223; RV32ID-ILP32-NEXT: ret 6224; 6225; RV64ID-LP64-LABEL: fcvt_w_s_i16: 6226; RV64ID-LP64: # %bb.0: 6227; RV64ID-LP64-NEXT: addi sp, sp, -16 6228; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6229; RV64ID-LP64-NEXT: call __extendhfsf2 6230; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 6231; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 6232; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6233; RV64ID-LP64-NEXT: addi sp, sp, 16 6234; RV64ID-LP64-NEXT: ret 6235; 6236; RV32ID-LABEL: fcvt_w_s_i16: 6237; RV32ID: # %bb.0: 6238; RV32ID-NEXT: addi sp, sp, -16 6239; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6240; RV32ID-NEXT: call __extendhfsf2 6241; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 6242; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6243; RV32ID-NEXT: addi sp, sp, 16 6244; RV32ID-NEXT: ret 6245; 6246; RV64ID-LABEL: fcvt_w_s_i16: 6247; RV64ID: # %bb.0: 6248; RV64ID-NEXT: addi sp, sp, -16 6249; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6250; RV64ID-NEXT: call __extendhfsf2 6251; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 6252; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6253; RV64ID-NEXT: addi sp, sp, 16 6254; RV64ID-NEXT: ret 6255; 6256; CHECK32-IZFHMIN-LABEL: fcvt_w_s_i16: 6257; CHECK32-IZFHMIN: # %bb.0: 6258; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6259; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 6260; CHECK32-IZFHMIN-NEXT: ret 6261; 6262; CHECK64-IZFHMIN-LABEL: fcvt_w_s_i16: 6263; CHECK64-IZFHMIN: # %bb.0: 6264; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6265; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 6266; CHECK64-IZFHMIN-NEXT: ret 6267; 6268; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_i16: 6269; CHECK32-IZHINXMIN: # %bb.0: 6270; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6271; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 6272; CHECK32-IZHINXMIN-NEXT: ret 6273; 6274; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_i16: 6275; CHECK64-IZHINXMIN: # %bb.0: 6276; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6277; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 6278; CHECK64-IZHINXMIN-NEXT: ret 6279; 6280; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_i16: 6281; CHECK32-IZDINXZHINXMIN: # %bb.0: 6282; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6283; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 6284; CHECK32-IZDINXZHINXMIN-NEXT: ret 6285; 6286; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_i16: 6287; CHECK64-IZDINXZHINXMIN: # %bb.0: 6288; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6289; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 6290; CHECK64-IZDINXZHINXMIN-NEXT: ret 6291 %1 = fptosi half %a to i16 6292 ret i16 %1 6293} 6294 6295define signext i16 @fcvt_w_s_sat_i16(half %a) nounwind { 6296; RV32IZFH-LABEL: fcvt_w_s_sat_i16: 6297; RV32IZFH: # %bb.0: # %start 6298; RV32IZFH-NEXT: fcvt.s.h fa5, fa0 6299; RV32IZFH-NEXT: lui a0, %hi(.LCPI32_0) 6300; RV32IZFH-NEXT: feq.s a1, fa5, fa5 6301; RV32IZFH-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6302; RV32IZFH-NEXT: lui a0, 815104 6303; RV32IZFH-NEXT: fmv.w.x fa3, a0 6304; RV32IZFH-NEXT: fmax.s fa5, fa5, fa3 6305; RV32IZFH-NEXT: neg a0, a1 6306; RV32IZFH-NEXT: fmin.s fa5, fa5, fa4 6307; RV32IZFH-NEXT: fcvt.w.s a1, fa5, rtz 6308; RV32IZFH-NEXT: and a0, a0, a1 6309; RV32IZFH-NEXT: ret 6310; 6311; RV64IZFH-LABEL: fcvt_w_s_sat_i16: 6312; RV64IZFH: # %bb.0: # %start 6313; RV64IZFH-NEXT: fcvt.s.h fa5, fa0 6314; RV64IZFH-NEXT: lui a0, %hi(.LCPI32_0) 6315; RV64IZFH-NEXT: feq.s a1, fa5, fa5 6316; RV64IZFH-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6317; RV64IZFH-NEXT: lui a0, 815104 6318; RV64IZFH-NEXT: fmv.w.x fa3, a0 6319; RV64IZFH-NEXT: fmax.s fa5, fa5, fa3 6320; RV64IZFH-NEXT: neg a0, a1 6321; RV64IZFH-NEXT: fmin.s fa5, fa5, fa4 6322; RV64IZFH-NEXT: fcvt.l.s a1, fa5, rtz 6323; RV64IZFH-NEXT: and a0, a0, a1 6324; RV64IZFH-NEXT: ret 6325; 6326; RV32IDZFH-LABEL: fcvt_w_s_sat_i16: 6327; RV32IDZFH: # %bb.0: # %start 6328; RV32IDZFH-NEXT: fcvt.s.h fa5, fa0 6329; RV32IDZFH-NEXT: lui a0, %hi(.LCPI32_0) 6330; RV32IDZFH-NEXT: feq.s a1, fa5, fa5 6331; RV32IDZFH-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6332; RV32IDZFH-NEXT: lui a0, 815104 6333; RV32IDZFH-NEXT: fmv.w.x fa3, a0 6334; RV32IDZFH-NEXT: fmax.s fa5, fa5, fa3 6335; RV32IDZFH-NEXT: neg a0, a1 6336; RV32IDZFH-NEXT: fmin.s fa5, fa5, fa4 6337; RV32IDZFH-NEXT: fcvt.w.s a1, fa5, rtz 6338; RV32IDZFH-NEXT: and a0, a0, a1 6339; RV32IDZFH-NEXT: ret 6340; 6341; RV64IDZFH-LABEL: fcvt_w_s_sat_i16: 6342; RV64IDZFH: # %bb.0: # %start 6343; RV64IDZFH-NEXT: fcvt.s.h fa5, fa0 6344; RV64IDZFH-NEXT: lui a0, %hi(.LCPI32_0) 6345; RV64IDZFH-NEXT: feq.s a1, fa5, fa5 6346; RV64IDZFH-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6347; RV64IDZFH-NEXT: lui a0, 815104 6348; RV64IDZFH-NEXT: fmv.w.x fa3, a0 6349; RV64IDZFH-NEXT: fmax.s fa5, fa5, fa3 6350; RV64IDZFH-NEXT: neg a0, a1 6351; RV64IDZFH-NEXT: fmin.s fa5, fa5, fa4 6352; RV64IDZFH-NEXT: fcvt.l.s a1, fa5, rtz 6353; RV64IDZFH-NEXT: and a0, a0, a1 6354; RV64IDZFH-NEXT: ret 6355; 6356; RV32IZHINX-LABEL: fcvt_w_s_sat_i16: 6357; RV32IZHINX: # %bb.0: # %start 6358; RV32IZHINX-NEXT: fcvt.s.h a0, a0 6359; RV32IZHINX-NEXT: lui a1, 815104 6360; RV32IZHINX-NEXT: lui a2, 290816 6361; RV32IZHINX-NEXT: fmax.s a1, a0, a1 6362; RV32IZHINX-NEXT: feq.s a0, a0, a0 6363; RV32IZHINX-NEXT: addi a2, a2, -512 6364; RV32IZHINX-NEXT: neg a0, a0 6365; RV32IZHINX-NEXT: fmin.s a1, a1, a2 6366; RV32IZHINX-NEXT: fcvt.w.s a1, a1, rtz 6367; RV32IZHINX-NEXT: and a0, a0, a1 6368; RV32IZHINX-NEXT: ret 6369; 6370; RV64IZHINX-LABEL: fcvt_w_s_sat_i16: 6371; RV64IZHINX: # %bb.0: # %start 6372; RV64IZHINX-NEXT: fcvt.s.h a0, a0 6373; RV64IZHINX-NEXT: lui a1, 815104 6374; RV64IZHINX-NEXT: lui a2, 290816 6375; RV64IZHINX-NEXT: fmax.s a1, a0, a1 6376; RV64IZHINX-NEXT: feq.s a0, a0, a0 6377; RV64IZHINX-NEXT: addiw a2, a2, -512 6378; RV64IZHINX-NEXT: neg a0, a0 6379; RV64IZHINX-NEXT: fmin.s a1, a1, a2 6380; RV64IZHINX-NEXT: fcvt.l.s a1, a1, rtz 6381; RV64IZHINX-NEXT: and a0, a0, a1 6382; RV64IZHINX-NEXT: ret 6383; 6384; RV32IZDINXZHINX-LABEL: fcvt_w_s_sat_i16: 6385; RV32IZDINXZHINX: # %bb.0: # %start 6386; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 6387; RV32IZDINXZHINX-NEXT: lui a1, 815104 6388; RV32IZDINXZHINX-NEXT: lui a2, 290816 6389; RV32IZDINXZHINX-NEXT: fmax.s a1, a0, a1 6390; RV32IZDINXZHINX-NEXT: feq.s a0, a0, a0 6391; RV32IZDINXZHINX-NEXT: addi a2, a2, -512 6392; RV32IZDINXZHINX-NEXT: neg a0, a0 6393; RV32IZDINXZHINX-NEXT: fmin.s a1, a1, a2 6394; RV32IZDINXZHINX-NEXT: fcvt.w.s a1, a1, rtz 6395; RV32IZDINXZHINX-NEXT: and a0, a0, a1 6396; RV32IZDINXZHINX-NEXT: ret 6397; 6398; RV64IZDINXZHINX-LABEL: fcvt_w_s_sat_i16: 6399; RV64IZDINXZHINX: # %bb.0: # %start 6400; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 6401; RV64IZDINXZHINX-NEXT: lui a1, 815104 6402; RV64IZDINXZHINX-NEXT: lui a2, 290816 6403; RV64IZDINXZHINX-NEXT: fmax.s a1, a0, a1 6404; RV64IZDINXZHINX-NEXT: feq.s a0, a0, a0 6405; RV64IZDINXZHINX-NEXT: addiw a2, a2, -512 6406; RV64IZDINXZHINX-NEXT: neg a0, a0 6407; RV64IZDINXZHINX-NEXT: fmin.s a1, a1, a2 6408; RV64IZDINXZHINX-NEXT: fcvt.l.s a1, a1, rtz 6409; RV64IZDINXZHINX-NEXT: and a0, a0, a1 6410; RV64IZDINXZHINX-NEXT: ret 6411; 6412; RV32I-LABEL: fcvt_w_s_sat_i16: 6413; RV32I: # %bb.0: # %start 6414; RV32I-NEXT: addi sp, sp, -16 6415; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6416; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 6417; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 6418; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 6419; RV32I-NEXT: slli a0, a0, 16 6420; RV32I-NEXT: srli a0, a0, 16 6421; RV32I-NEXT: call __extendhfsf2 6422; RV32I-NEXT: mv s0, a0 6423; RV32I-NEXT: lui a1, 815104 6424; RV32I-NEXT: call __gesf2 6425; RV32I-NEXT: mv s2, a0 6426; RV32I-NEXT: mv a0, s0 6427; RV32I-NEXT: call __fixsfsi 6428; RV32I-NEXT: mv s1, a0 6429; RV32I-NEXT: bgez s2, .LBB32_2 6430; RV32I-NEXT: # %bb.1: # %start 6431; RV32I-NEXT: lui s1, 1048568 6432; RV32I-NEXT: .LBB32_2: # %start 6433; RV32I-NEXT: lui a0, 290816 6434; RV32I-NEXT: addi a1, a0, -512 6435; RV32I-NEXT: mv a0, s0 6436; RV32I-NEXT: call __gtsf2 6437; RV32I-NEXT: blez a0, .LBB32_4 6438; RV32I-NEXT: # %bb.3: # %start 6439; RV32I-NEXT: lui s1, 8 6440; RV32I-NEXT: addi s1, s1, -1 6441; RV32I-NEXT: .LBB32_4: # %start 6442; RV32I-NEXT: mv a0, s0 6443; RV32I-NEXT: mv a1, s0 6444; RV32I-NEXT: call __unordsf2 6445; RV32I-NEXT: snez a0, a0 6446; RV32I-NEXT: addi a0, a0, -1 6447; RV32I-NEXT: and a0, a0, s1 6448; RV32I-NEXT: slli a0, a0, 16 6449; RV32I-NEXT: srai a0, a0, 16 6450; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6451; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 6452; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 6453; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 6454; RV32I-NEXT: addi sp, sp, 16 6455; RV32I-NEXT: ret 6456; 6457; RV64I-LABEL: fcvt_w_s_sat_i16: 6458; RV64I: # %bb.0: # %start 6459; RV64I-NEXT: addi sp, sp, -32 6460; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 6461; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 6462; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 6463; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 6464; RV64I-NEXT: slli a0, a0, 48 6465; RV64I-NEXT: srli a0, a0, 48 6466; RV64I-NEXT: call __extendhfsf2 6467; RV64I-NEXT: mv s0, a0 6468; RV64I-NEXT: lui a1, 815104 6469; RV64I-NEXT: call __gesf2 6470; RV64I-NEXT: mv s2, a0 6471; RV64I-NEXT: mv a0, s0 6472; RV64I-NEXT: call __fixsfdi 6473; RV64I-NEXT: mv s1, a0 6474; RV64I-NEXT: bgez s2, .LBB32_2 6475; RV64I-NEXT: # %bb.1: # %start 6476; RV64I-NEXT: lui s1, 1048568 6477; RV64I-NEXT: .LBB32_2: # %start 6478; RV64I-NEXT: lui a0, 290816 6479; RV64I-NEXT: addiw a1, a0, -512 6480; RV64I-NEXT: mv a0, s0 6481; RV64I-NEXT: call __gtsf2 6482; RV64I-NEXT: blez a0, .LBB32_4 6483; RV64I-NEXT: # %bb.3: # %start 6484; RV64I-NEXT: lui s1, 8 6485; RV64I-NEXT: addi s1, s1, -1 6486; RV64I-NEXT: .LBB32_4: # %start 6487; RV64I-NEXT: mv a0, s0 6488; RV64I-NEXT: mv a1, s0 6489; RV64I-NEXT: call __unordsf2 6490; RV64I-NEXT: snez a0, a0 6491; RV64I-NEXT: addi a0, a0, -1 6492; RV64I-NEXT: and a0, a0, s1 6493; RV64I-NEXT: slli a0, a0, 48 6494; RV64I-NEXT: srai a0, a0, 48 6495; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 6496; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 6497; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 6498; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 6499; RV64I-NEXT: addi sp, sp, 32 6500; RV64I-NEXT: ret 6501; 6502; RV32ID-ILP32-LABEL: fcvt_w_s_sat_i16: 6503; RV32ID-ILP32: # %bb.0: # %start 6504; RV32ID-ILP32-NEXT: addi sp, sp, -16 6505; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6506; RV32ID-ILP32-NEXT: call __extendhfsf2 6507; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 6508; RV32ID-ILP32-NEXT: lui a0, %hi(.LCPI32_0) 6509; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 6510; RV32ID-ILP32-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6511; RV32ID-ILP32-NEXT: lui a0, 815104 6512; RV32ID-ILP32-NEXT: fmv.w.x fa3, a0 6513; RV32ID-ILP32-NEXT: fmax.s fa5, fa5, fa3 6514; RV32ID-ILP32-NEXT: neg a0, a1 6515; RV32ID-ILP32-NEXT: fmin.s fa5, fa5, fa4 6516; RV32ID-ILP32-NEXT: fcvt.w.s a1, fa5, rtz 6517; RV32ID-ILP32-NEXT: and a0, a0, a1 6518; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6519; RV32ID-ILP32-NEXT: addi sp, sp, 16 6520; RV32ID-ILP32-NEXT: ret 6521; 6522; RV64ID-LP64-LABEL: fcvt_w_s_sat_i16: 6523; RV64ID-LP64: # %bb.0: # %start 6524; RV64ID-LP64-NEXT: addi sp, sp, -16 6525; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6526; RV64ID-LP64-NEXT: call __extendhfsf2 6527; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 6528; RV64ID-LP64-NEXT: lui a0, %hi(.LCPI32_0) 6529; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 6530; RV64ID-LP64-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6531; RV64ID-LP64-NEXT: lui a0, 815104 6532; RV64ID-LP64-NEXT: fmv.w.x fa3, a0 6533; RV64ID-LP64-NEXT: fmax.s fa5, fa5, fa3 6534; RV64ID-LP64-NEXT: neg a0, a1 6535; RV64ID-LP64-NEXT: fmin.s fa5, fa5, fa4 6536; RV64ID-LP64-NEXT: fcvt.l.s a1, fa5, rtz 6537; RV64ID-LP64-NEXT: and a0, a0, a1 6538; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6539; RV64ID-LP64-NEXT: addi sp, sp, 16 6540; RV64ID-LP64-NEXT: ret 6541; 6542; RV32ID-LABEL: fcvt_w_s_sat_i16: 6543; RV32ID: # %bb.0: # %start 6544; RV32ID-NEXT: addi sp, sp, -16 6545; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6546; RV32ID-NEXT: call __extendhfsf2 6547; RV32ID-NEXT: feq.s a0, fa0, fa0 6548; RV32ID-NEXT: lui a1, %hi(.LCPI32_0) 6549; RV32ID-NEXT: flw fa5, %lo(.LCPI32_0)(a1) 6550; RV32ID-NEXT: lui a1, 815104 6551; RV32ID-NEXT: fmv.w.x fa4, a1 6552; RV32ID-NEXT: fmax.s fa4, fa0, fa4 6553; RV32ID-NEXT: neg a0, a0 6554; RV32ID-NEXT: fmin.s fa5, fa4, fa5 6555; RV32ID-NEXT: fcvt.w.s a1, fa5, rtz 6556; RV32ID-NEXT: and a0, a0, a1 6557; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6558; RV32ID-NEXT: addi sp, sp, 16 6559; RV32ID-NEXT: ret 6560; 6561; RV64ID-LABEL: fcvt_w_s_sat_i16: 6562; RV64ID: # %bb.0: # %start 6563; RV64ID-NEXT: addi sp, sp, -16 6564; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6565; RV64ID-NEXT: call __extendhfsf2 6566; RV64ID-NEXT: feq.s a0, fa0, fa0 6567; RV64ID-NEXT: lui a1, %hi(.LCPI32_0) 6568; RV64ID-NEXT: flw fa5, %lo(.LCPI32_0)(a1) 6569; RV64ID-NEXT: lui a1, 815104 6570; RV64ID-NEXT: fmv.w.x fa4, a1 6571; RV64ID-NEXT: fmax.s fa4, fa0, fa4 6572; RV64ID-NEXT: neg a0, a0 6573; RV64ID-NEXT: fmin.s fa5, fa4, fa5 6574; RV64ID-NEXT: fcvt.l.s a1, fa5, rtz 6575; RV64ID-NEXT: and a0, a0, a1 6576; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6577; RV64ID-NEXT: addi sp, sp, 16 6578; RV64ID-NEXT: ret 6579; 6580; CHECK32-IZFHMIN-LABEL: fcvt_w_s_sat_i16: 6581; CHECK32-IZFHMIN: # %bb.0: # %start 6582; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6583; CHECK32-IZFHMIN-NEXT: lui a0, %hi(.LCPI32_0) 6584; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 6585; CHECK32-IZFHMIN-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6586; CHECK32-IZFHMIN-NEXT: lui a0, 815104 6587; CHECK32-IZFHMIN-NEXT: fmv.w.x fa3, a0 6588; CHECK32-IZFHMIN-NEXT: fmax.s fa5, fa5, fa3 6589; CHECK32-IZFHMIN-NEXT: neg a0, a1 6590; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 6591; CHECK32-IZFHMIN-NEXT: fcvt.w.s a1, fa5, rtz 6592; CHECK32-IZFHMIN-NEXT: and a0, a0, a1 6593; CHECK32-IZFHMIN-NEXT: ret 6594; 6595; CHECK64-IZFHMIN-LABEL: fcvt_w_s_sat_i16: 6596; CHECK64-IZFHMIN: # %bb.0: # %start 6597; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6598; CHECK64-IZFHMIN-NEXT: lui a0, %hi(.LCPI32_0) 6599; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 6600; CHECK64-IZFHMIN-NEXT: flw fa4, %lo(.LCPI32_0)(a0) 6601; CHECK64-IZFHMIN-NEXT: lui a0, 815104 6602; CHECK64-IZFHMIN-NEXT: fmv.w.x fa3, a0 6603; CHECK64-IZFHMIN-NEXT: fmax.s fa5, fa5, fa3 6604; CHECK64-IZFHMIN-NEXT: neg a0, a1 6605; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 6606; CHECK64-IZFHMIN-NEXT: fcvt.l.s a1, fa5, rtz 6607; CHECK64-IZFHMIN-NEXT: and a0, a0, a1 6608; CHECK64-IZFHMIN-NEXT: ret 6609; 6610; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_sat_i16: 6611; CHECK32-IZHINXMIN: # %bb.0: # %start 6612; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6613; CHECK32-IZHINXMIN-NEXT: lui a1, 815104 6614; CHECK32-IZHINXMIN-NEXT: lui a2, 290816 6615; CHECK32-IZHINXMIN-NEXT: fmax.s a1, a0, a1 6616; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 6617; CHECK32-IZHINXMIN-NEXT: addi a2, a2, -512 6618; CHECK32-IZHINXMIN-NEXT: neg a0, a0 6619; CHECK32-IZHINXMIN-NEXT: fmin.s a1, a1, a2 6620; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 6621; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 6622; CHECK32-IZHINXMIN-NEXT: ret 6623; 6624; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_sat_i16: 6625; CHECK64-IZHINXMIN: # %bb.0: # %start 6626; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6627; CHECK64-IZHINXMIN-NEXT: lui a1, 815104 6628; CHECK64-IZHINXMIN-NEXT: lui a2, 290816 6629; CHECK64-IZHINXMIN-NEXT: fmax.s a1, a0, a1 6630; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 6631; CHECK64-IZHINXMIN-NEXT: addiw a2, a2, -512 6632; CHECK64-IZHINXMIN-NEXT: neg a0, a0 6633; CHECK64-IZHINXMIN-NEXT: fmin.s a1, a1, a2 6634; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 6635; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 6636; CHECK64-IZHINXMIN-NEXT: ret 6637; 6638; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i16: 6639; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 6640; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6641; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 815104 6642; CHECK32-IZDINXZHINXMIN-NEXT: lui a2, 290816 6643; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 6644; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 6645; CHECK32-IZDINXZHINXMIN-NEXT: addi a2, a2, -512 6646; CHECK32-IZDINXZHINXMIN-NEXT: neg a0, a0 6647; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 6648; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 6649; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 6650; CHECK32-IZDINXZHINXMIN-NEXT: ret 6651; 6652; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i16: 6653; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 6654; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6655; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 815104 6656; CHECK64-IZDINXZHINXMIN-NEXT: lui a2, 290816 6657; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 6658; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 6659; CHECK64-IZDINXZHINXMIN-NEXT: addiw a2, a2, -512 6660; CHECK64-IZDINXZHINXMIN-NEXT: neg a0, a0 6661; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 6662; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 6663; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 6664; CHECK64-IZDINXZHINXMIN-NEXT: ret 6665start: 6666 %0 = tail call i16 @llvm.fptosi.sat.i16.f16(half %a) 6667 ret i16 %0 6668} 6669 6670define zeroext i16 @fcvt_wu_s_i16(half %a) nounwind { 6671; RV32IZFH-LABEL: fcvt_wu_s_i16: 6672; RV32IZFH: # %bb.0: 6673; RV32IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 6674; RV32IZFH-NEXT: ret 6675; 6676; RV64IZFH-LABEL: fcvt_wu_s_i16: 6677; RV64IZFH: # %bb.0: 6678; RV64IZFH-NEXT: fcvt.lu.h a0, fa0, rtz 6679; RV64IZFH-NEXT: ret 6680; 6681; RV32IDZFH-LABEL: fcvt_wu_s_i16: 6682; RV32IDZFH: # %bb.0: 6683; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 6684; RV32IDZFH-NEXT: ret 6685; 6686; RV64IDZFH-LABEL: fcvt_wu_s_i16: 6687; RV64IDZFH: # %bb.0: 6688; RV64IDZFH-NEXT: fcvt.lu.h a0, fa0, rtz 6689; RV64IDZFH-NEXT: ret 6690; 6691; RV32IZHINX-LABEL: fcvt_wu_s_i16: 6692; RV32IZHINX: # %bb.0: 6693; RV32IZHINX-NEXT: fcvt.wu.h a0, a0, rtz 6694; RV32IZHINX-NEXT: ret 6695; 6696; RV64IZHINX-LABEL: fcvt_wu_s_i16: 6697; RV64IZHINX: # %bb.0: 6698; RV64IZHINX-NEXT: fcvt.lu.h a0, a0, rtz 6699; RV64IZHINX-NEXT: ret 6700; 6701; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i16: 6702; RV32IZDINXZHINX: # %bb.0: 6703; RV32IZDINXZHINX-NEXT: fcvt.wu.h a0, a0, rtz 6704; RV32IZDINXZHINX-NEXT: ret 6705; 6706; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i16: 6707; RV64IZDINXZHINX: # %bb.0: 6708; RV64IZDINXZHINX-NEXT: fcvt.lu.h a0, a0, rtz 6709; RV64IZDINXZHINX-NEXT: ret 6710; 6711; RV32I-LABEL: fcvt_wu_s_i16: 6712; RV32I: # %bb.0: 6713; RV32I-NEXT: addi sp, sp, -16 6714; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6715; RV32I-NEXT: slli a0, a0, 16 6716; RV32I-NEXT: srli a0, a0, 16 6717; RV32I-NEXT: call __extendhfsf2 6718; RV32I-NEXT: call __fixunssfsi 6719; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6720; RV32I-NEXT: addi sp, sp, 16 6721; RV32I-NEXT: ret 6722; 6723; RV64I-LABEL: fcvt_wu_s_i16: 6724; RV64I: # %bb.0: 6725; RV64I-NEXT: addi sp, sp, -16 6726; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6727; RV64I-NEXT: slli a0, a0, 48 6728; RV64I-NEXT: srli a0, a0, 48 6729; RV64I-NEXT: call __extendhfsf2 6730; RV64I-NEXT: call __fixunssfdi 6731; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6732; RV64I-NEXT: addi sp, sp, 16 6733; RV64I-NEXT: ret 6734; 6735; RV32ID-ILP32-LABEL: fcvt_wu_s_i16: 6736; RV32ID-ILP32: # %bb.0: 6737; RV32ID-ILP32-NEXT: addi sp, sp, -16 6738; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6739; RV32ID-ILP32-NEXT: call __extendhfsf2 6740; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 6741; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 6742; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6743; RV32ID-ILP32-NEXT: addi sp, sp, 16 6744; RV32ID-ILP32-NEXT: ret 6745; 6746; RV64ID-LP64-LABEL: fcvt_wu_s_i16: 6747; RV64ID-LP64: # %bb.0: 6748; RV64ID-LP64-NEXT: addi sp, sp, -16 6749; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6750; RV64ID-LP64-NEXT: call __extendhfsf2 6751; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 6752; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 6753; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6754; RV64ID-LP64-NEXT: addi sp, sp, 16 6755; RV64ID-LP64-NEXT: ret 6756; 6757; RV32ID-LABEL: fcvt_wu_s_i16: 6758; RV32ID: # %bb.0: 6759; RV32ID-NEXT: addi sp, sp, -16 6760; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6761; RV32ID-NEXT: call __extendhfsf2 6762; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 6763; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6764; RV32ID-NEXT: addi sp, sp, 16 6765; RV32ID-NEXT: ret 6766; 6767; RV64ID-LABEL: fcvt_wu_s_i16: 6768; RV64ID: # %bb.0: 6769; RV64ID-NEXT: addi sp, sp, -16 6770; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6771; RV64ID-NEXT: call __extendhfsf2 6772; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 6773; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6774; RV64ID-NEXT: addi sp, sp, 16 6775; RV64ID-NEXT: ret 6776; 6777; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_i16: 6778; CHECK32-IZFHMIN: # %bb.0: 6779; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6780; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 6781; CHECK32-IZFHMIN-NEXT: ret 6782; 6783; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_i16: 6784; CHECK64-IZFHMIN: # %bb.0: 6785; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 6786; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 6787; CHECK64-IZFHMIN-NEXT: ret 6788; 6789; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_i16: 6790; CHECK32-IZHINXMIN: # %bb.0: 6791; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6792; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 6793; CHECK32-IZHINXMIN-NEXT: ret 6794; 6795; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_i16: 6796; CHECK64-IZHINXMIN: # %bb.0: 6797; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 6798; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 6799; CHECK64-IZHINXMIN-NEXT: ret 6800; 6801; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i16: 6802; CHECK32-IZDINXZHINXMIN: # %bb.0: 6803; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6804; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 6805; CHECK32-IZDINXZHINXMIN-NEXT: ret 6806; 6807; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i16: 6808; CHECK64-IZDINXZHINXMIN: # %bb.0: 6809; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 6810; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 6811; CHECK64-IZDINXZHINXMIN-NEXT: ret 6812 %1 = fptoui half %a to i16 6813 ret i16 %1 6814} 6815 6816define zeroext i16 @fcvt_wu_s_sat_i16(half %a) nounwind { 6817; RV32IZFH-LABEL: fcvt_wu_s_sat_i16: 6818; RV32IZFH: # %bb.0: # %start 6819; RV32IZFH-NEXT: lui a0, %hi(.LCPI34_0) 6820; RV32IZFH-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 6821; RV32IZFH-NEXT: fcvt.s.h fa4, fa0 6822; RV32IZFH-NEXT: fmv.w.x fa3, zero 6823; RV32IZFH-NEXT: fmax.s fa4, fa4, fa3 6824; RV32IZFH-NEXT: fmin.s fa5, fa4, fa5 6825; RV32IZFH-NEXT: fcvt.wu.s a0, fa5, rtz 6826; RV32IZFH-NEXT: ret 6827; 6828; RV64IZFH-LABEL: fcvt_wu_s_sat_i16: 6829; RV64IZFH: # %bb.0: # %start 6830; RV64IZFH-NEXT: lui a0, %hi(.LCPI34_0) 6831; RV64IZFH-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 6832; RV64IZFH-NEXT: fcvt.s.h fa4, fa0 6833; RV64IZFH-NEXT: fmv.w.x fa3, zero 6834; RV64IZFH-NEXT: fmax.s fa4, fa4, fa3 6835; RV64IZFH-NEXT: fmin.s fa5, fa4, fa5 6836; RV64IZFH-NEXT: fcvt.lu.s a0, fa5, rtz 6837; RV64IZFH-NEXT: ret 6838; 6839; RV32IDZFH-LABEL: fcvt_wu_s_sat_i16: 6840; RV32IDZFH: # %bb.0: # %start 6841; RV32IDZFH-NEXT: lui a0, %hi(.LCPI34_0) 6842; RV32IDZFH-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 6843; RV32IDZFH-NEXT: fcvt.s.h fa4, fa0 6844; RV32IDZFH-NEXT: fmv.w.x fa3, zero 6845; RV32IDZFH-NEXT: fmax.s fa4, fa4, fa3 6846; RV32IDZFH-NEXT: fmin.s fa5, fa4, fa5 6847; RV32IDZFH-NEXT: fcvt.wu.s a0, fa5, rtz 6848; RV32IDZFH-NEXT: ret 6849; 6850; RV64IDZFH-LABEL: fcvt_wu_s_sat_i16: 6851; RV64IDZFH: # %bb.0: # %start 6852; RV64IDZFH-NEXT: lui a0, %hi(.LCPI34_0) 6853; RV64IDZFH-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 6854; RV64IDZFH-NEXT: fcvt.s.h fa4, fa0 6855; RV64IDZFH-NEXT: fmv.w.x fa3, zero 6856; RV64IDZFH-NEXT: fmax.s fa4, fa4, fa3 6857; RV64IDZFH-NEXT: fmin.s fa5, fa4, fa5 6858; RV64IDZFH-NEXT: fcvt.lu.s a0, fa5, rtz 6859; RV64IDZFH-NEXT: ret 6860; 6861; RV32IZHINX-LABEL: fcvt_wu_s_sat_i16: 6862; RV32IZHINX: # %bb.0: # %start 6863; RV32IZHINX-NEXT: fcvt.s.h a0, a0 6864; RV32IZHINX-NEXT: lui a1, 292864 6865; RV32IZHINX-NEXT: fmax.s a0, a0, zero 6866; RV32IZHINX-NEXT: addi a1, a1, -256 6867; RV32IZHINX-NEXT: fmin.s a0, a0, a1 6868; RV32IZHINX-NEXT: fcvt.wu.s a0, a0, rtz 6869; RV32IZHINX-NEXT: ret 6870; 6871; RV64IZHINX-LABEL: fcvt_wu_s_sat_i16: 6872; RV64IZHINX: # %bb.0: # %start 6873; RV64IZHINX-NEXT: fcvt.s.h a0, a0 6874; RV64IZHINX-NEXT: lui a1, 292864 6875; RV64IZHINX-NEXT: fmax.s a0, a0, zero 6876; RV64IZHINX-NEXT: addiw a1, a1, -256 6877; RV64IZHINX-NEXT: fmin.s a0, a0, a1 6878; RV64IZHINX-NEXT: fcvt.lu.s a0, a0, rtz 6879; RV64IZHINX-NEXT: ret 6880; 6881; RV32IZDINXZHINX-LABEL: fcvt_wu_s_sat_i16: 6882; RV32IZDINXZHINX: # %bb.0: # %start 6883; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 6884; RV32IZDINXZHINX-NEXT: lui a1, 292864 6885; RV32IZDINXZHINX-NEXT: fmax.s a0, a0, zero 6886; RV32IZDINXZHINX-NEXT: addi a1, a1, -256 6887; RV32IZDINXZHINX-NEXT: fmin.s a0, a0, a1 6888; RV32IZDINXZHINX-NEXT: fcvt.wu.s a0, a0, rtz 6889; RV32IZDINXZHINX-NEXT: ret 6890; 6891; RV64IZDINXZHINX-LABEL: fcvt_wu_s_sat_i16: 6892; RV64IZDINXZHINX: # %bb.0: # %start 6893; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 6894; RV64IZDINXZHINX-NEXT: lui a1, 292864 6895; RV64IZDINXZHINX-NEXT: fmax.s a0, a0, zero 6896; RV64IZDINXZHINX-NEXT: addiw a1, a1, -256 6897; RV64IZDINXZHINX-NEXT: fmin.s a0, a0, a1 6898; RV64IZDINXZHINX-NEXT: fcvt.lu.s a0, a0, rtz 6899; RV64IZDINXZHINX-NEXT: ret 6900; 6901; RV32I-LABEL: fcvt_wu_s_sat_i16: 6902; RV32I: # %bb.0: # %start 6903; RV32I-NEXT: addi sp, sp, -32 6904; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6905; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6906; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6907; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6908; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 6909; RV32I-NEXT: lui s3, 16 6910; RV32I-NEXT: addi s3, s3, -1 6911; RV32I-NEXT: and a0, a0, s3 6912; RV32I-NEXT: call __extendhfsf2 6913; RV32I-NEXT: mv s2, a0 6914; RV32I-NEXT: call __fixunssfsi 6915; RV32I-NEXT: mv s0, a0 6916; RV32I-NEXT: mv a0, s2 6917; RV32I-NEXT: li a1, 0 6918; RV32I-NEXT: call __gesf2 6919; RV32I-NEXT: mv s1, a0 6920; RV32I-NEXT: lui a0, 292864 6921; RV32I-NEXT: addi a1, a0, -256 6922; RV32I-NEXT: mv a0, s2 6923; RV32I-NEXT: call __gtsf2 6924; RV32I-NEXT: blez a0, .LBB34_2 6925; RV32I-NEXT: # %bb.1: # %start 6926; RV32I-NEXT: mv a0, s3 6927; RV32I-NEXT: j .LBB34_3 6928; RV32I-NEXT: .LBB34_2: 6929; RV32I-NEXT: slti a0, s1, 0 6930; RV32I-NEXT: addi a0, a0, -1 6931; RV32I-NEXT: and a0, a0, s0 6932; RV32I-NEXT: .LBB34_3: # %start 6933; RV32I-NEXT: and a0, a0, s3 6934; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6935; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6936; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6937; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6938; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 6939; RV32I-NEXT: addi sp, sp, 32 6940; RV32I-NEXT: ret 6941; 6942; RV64I-LABEL: fcvt_wu_s_sat_i16: 6943; RV64I: # %bb.0: # %start 6944; RV64I-NEXT: addi sp, sp, -48 6945; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6946; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6947; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6948; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6949; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 6950; RV64I-NEXT: lui s3, 16 6951; RV64I-NEXT: addiw s3, s3, -1 6952; RV64I-NEXT: and a0, a0, s3 6953; RV64I-NEXT: call __extendhfsf2 6954; RV64I-NEXT: mv s2, a0 6955; RV64I-NEXT: call __fixunssfdi 6956; RV64I-NEXT: mv s0, a0 6957; RV64I-NEXT: mv a0, s2 6958; RV64I-NEXT: li a1, 0 6959; RV64I-NEXT: call __gesf2 6960; RV64I-NEXT: mv s1, a0 6961; RV64I-NEXT: lui a0, 292864 6962; RV64I-NEXT: addiw a1, a0, -256 6963; RV64I-NEXT: mv a0, s2 6964; RV64I-NEXT: call __gtsf2 6965; RV64I-NEXT: blez a0, .LBB34_2 6966; RV64I-NEXT: # %bb.1: # %start 6967; RV64I-NEXT: mv a0, s3 6968; RV64I-NEXT: j .LBB34_3 6969; RV64I-NEXT: .LBB34_2: 6970; RV64I-NEXT: slti a0, s1, 0 6971; RV64I-NEXT: addi a0, a0, -1 6972; RV64I-NEXT: and a0, a0, s0 6973; RV64I-NEXT: .LBB34_3: # %start 6974; RV64I-NEXT: and a0, a0, s3 6975; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6976; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6977; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6978; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6979; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 6980; RV64I-NEXT: addi sp, sp, 48 6981; RV64I-NEXT: ret 6982; 6983; RV32ID-ILP32-LABEL: fcvt_wu_s_sat_i16: 6984; RV32ID-ILP32: # %bb.0: # %start 6985; RV32ID-ILP32-NEXT: addi sp, sp, -16 6986; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6987; RV32ID-ILP32-NEXT: call __extendhfsf2 6988; RV32ID-ILP32-NEXT: lui a1, %hi(.LCPI34_0) 6989; RV32ID-ILP32-NEXT: flw fa5, %lo(.LCPI34_0)(a1) 6990; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 6991; RV32ID-ILP32-NEXT: fmv.w.x fa3, zero 6992; RV32ID-ILP32-NEXT: fmax.s fa4, fa4, fa3 6993; RV32ID-ILP32-NEXT: fmin.s fa5, fa4, fa5 6994; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 6995; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6996; RV32ID-ILP32-NEXT: addi sp, sp, 16 6997; RV32ID-ILP32-NEXT: ret 6998; 6999; RV64ID-LP64-LABEL: fcvt_wu_s_sat_i16: 7000; RV64ID-LP64: # %bb.0: # %start 7001; RV64ID-LP64-NEXT: addi sp, sp, -16 7002; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7003; RV64ID-LP64-NEXT: call __extendhfsf2 7004; RV64ID-LP64-NEXT: lui a1, %hi(.LCPI34_0) 7005; RV64ID-LP64-NEXT: flw fa5, %lo(.LCPI34_0)(a1) 7006; RV64ID-LP64-NEXT: fmv.w.x fa4, a0 7007; RV64ID-LP64-NEXT: fmv.w.x fa3, zero 7008; RV64ID-LP64-NEXT: fmax.s fa4, fa4, fa3 7009; RV64ID-LP64-NEXT: fmin.s fa5, fa4, fa5 7010; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 7011; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7012; RV64ID-LP64-NEXT: addi sp, sp, 16 7013; RV64ID-LP64-NEXT: ret 7014; 7015; RV32ID-LABEL: fcvt_wu_s_sat_i16: 7016; RV32ID: # %bb.0: # %start 7017; RV32ID-NEXT: addi sp, sp, -16 7018; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7019; RV32ID-NEXT: call __extendhfsf2 7020; RV32ID-NEXT: lui a0, %hi(.LCPI34_0) 7021; RV32ID-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 7022; RV32ID-NEXT: fmv.w.x fa4, zero 7023; RV32ID-NEXT: fmax.s fa4, fa0, fa4 7024; RV32ID-NEXT: fmin.s fa5, fa4, fa5 7025; RV32ID-NEXT: fcvt.wu.s a0, fa5, rtz 7026; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7027; RV32ID-NEXT: addi sp, sp, 16 7028; RV32ID-NEXT: ret 7029; 7030; RV64ID-LABEL: fcvt_wu_s_sat_i16: 7031; RV64ID: # %bb.0: # %start 7032; RV64ID-NEXT: addi sp, sp, -16 7033; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7034; RV64ID-NEXT: call __extendhfsf2 7035; RV64ID-NEXT: lui a0, %hi(.LCPI34_0) 7036; RV64ID-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 7037; RV64ID-NEXT: fmv.w.x fa4, zero 7038; RV64ID-NEXT: fmax.s fa4, fa0, fa4 7039; RV64ID-NEXT: fmin.s fa5, fa4, fa5 7040; RV64ID-NEXT: fcvt.lu.s a0, fa5, rtz 7041; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7042; RV64ID-NEXT: addi sp, sp, 16 7043; RV64ID-NEXT: ret 7044; 7045; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_sat_i16: 7046; CHECK32-IZFHMIN: # %bb.0: # %start 7047; CHECK32-IZFHMIN-NEXT: lui a0, %hi(.LCPI34_0) 7048; CHECK32-IZFHMIN-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 7049; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa4, fa0 7050; CHECK32-IZFHMIN-NEXT: fmv.w.x fa3, zero 7051; CHECK32-IZFHMIN-NEXT: fmax.s fa4, fa4, fa3 7052; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa4, fa5 7053; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 7054; CHECK32-IZFHMIN-NEXT: ret 7055; 7056; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_sat_i16: 7057; CHECK64-IZFHMIN: # %bb.0: # %start 7058; CHECK64-IZFHMIN-NEXT: lui a0, %hi(.LCPI34_0) 7059; CHECK64-IZFHMIN-NEXT: flw fa5, %lo(.LCPI34_0)(a0) 7060; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa4, fa0 7061; CHECK64-IZFHMIN-NEXT: fmv.w.x fa3, zero 7062; CHECK64-IZFHMIN-NEXT: fmax.s fa4, fa4, fa3 7063; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa4, fa5 7064; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 7065; CHECK64-IZFHMIN-NEXT: ret 7066; 7067; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_sat_i16: 7068; CHECK32-IZHINXMIN: # %bb.0: # %start 7069; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7070; CHECK32-IZHINXMIN-NEXT: lui a1, 292864 7071; CHECK32-IZHINXMIN-NEXT: fmax.s a0, a0, zero 7072; CHECK32-IZHINXMIN-NEXT: addi a1, a1, -256 7073; CHECK32-IZHINXMIN-NEXT: fmin.s a0, a0, a1 7074; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 7075; CHECK32-IZHINXMIN-NEXT: ret 7076; 7077; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_sat_i16: 7078; CHECK64-IZHINXMIN: # %bb.0: # %start 7079; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7080; CHECK64-IZHINXMIN-NEXT: lui a1, 292864 7081; CHECK64-IZHINXMIN-NEXT: fmax.s a0, a0, zero 7082; CHECK64-IZHINXMIN-NEXT: addiw a1, a1, -256 7083; CHECK64-IZHINXMIN-NEXT: fmin.s a0, a0, a1 7084; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 7085; CHECK64-IZHINXMIN-NEXT: ret 7086; 7087; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i16: 7088; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 7089; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7090; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 292864 7091; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 7092; CHECK32-IZDINXZHINXMIN-NEXT: addi a1, a1, -256 7093; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 7094; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 7095; CHECK32-IZDINXZHINXMIN-NEXT: ret 7096; 7097; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i16: 7098; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 7099; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7100; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 292864 7101; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 7102; CHECK64-IZDINXZHINXMIN-NEXT: addiw a1, a1, -256 7103; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 7104; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 7105; CHECK64-IZDINXZHINXMIN-NEXT: ret 7106start: 7107 %0 = tail call i16 @llvm.fptoui.sat.i16.f16(half %a) 7108 ret i16 %0 7109} 7110 7111define signext i8 @fcvt_w_s_i8(half %a) nounwind { 7112; RV32IZFH-LABEL: fcvt_w_s_i8: 7113; RV32IZFH: # %bb.0: 7114; RV32IZFH-NEXT: fcvt.w.h a0, fa0, rtz 7115; RV32IZFH-NEXT: ret 7116; 7117; RV64IZFH-LABEL: fcvt_w_s_i8: 7118; RV64IZFH: # %bb.0: 7119; RV64IZFH-NEXT: fcvt.l.h a0, fa0, rtz 7120; RV64IZFH-NEXT: ret 7121; 7122; RV32IDZFH-LABEL: fcvt_w_s_i8: 7123; RV32IDZFH: # %bb.0: 7124; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 7125; RV32IDZFH-NEXT: ret 7126; 7127; RV64IDZFH-LABEL: fcvt_w_s_i8: 7128; RV64IDZFH: # %bb.0: 7129; RV64IDZFH-NEXT: fcvt.l.h a0, fa0, rtz 7130; RV64IDZFH-NEXT: ret 7131; 7132; RV32IZHINX-LABEL: fcvt_w_s_i8: 7133; RV32IZHINX: # %bb.0: 7134; RV32IZHINX-NEXT: fcvt.w.h a0, a0, rtz 7135; RV32IZHINX-NEXT: ret 7136; 7137; RV64IZHINX-LABEL: fcvt_w_s_i8: 7138; RV64IZHINX: # %bb.0: 7139; RV64IZHINX-NEXT: fcvt.l.h a0, a0, rtz 7140; RV64IZHINX-NEXT: ret 7141; 7142; RV32IZDINXZHINX-LABEL: fcvt_w_s_i8: 7143; RV32IZDINXZHINX: # %bb.0: 7144; RV32IZDINXZHINX-NEXT: fcvt.w.h a0, a0, rtz 7145; RV32IZDINXZHINX-NEXT: ret 7146; 7147; RV64IZDINXZHINX-LABEL: fcvt_w_s_i8: 7148; RV64IZDINXZHINX: # %bb.0: 7149; RV64IZDINXZHINX-NEXT: fcvt.l.h a0, a0, rtz 7150; RV64IZDINXZHINX-NEXT: ret 7151; 7152; RV32I-LABEL: fcvt_w_s_i8: 7153; RV32I: # %bb.0: 7154; RV32I-NEXT: addi sp, sp, -16 7155; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7156; RV32I-NEXT: slli a0, a0, 16 7157; RV32I-NEXT: srli a0, a0, 16 7158; RV32I-NEXT: call __extendhfsf2 7159; RV32I-NEXT: call __fixsfsi 7160; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7161; RV32I-NEXT: addi sp, sp, 16 7162; RV32I-NEXT: ret 7163; 7164; RV64I-LABEL: fcvt_w_s_i8: 7165; RV64I: # %bb.0: 7166; RV64I-NEXT: addi sp, sp, -16 7167; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7168; RV64I-NEXT: slli a0, a0, 48 7169; RV64I-NEXT: srli a0, a0, 48 7170; RV64I-NEXT: call __extendhfsf2 7171; RV64I-NEXT: call __fixsfdi 7172; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7173; RV64I-NEXT: addi sp, sp, 16 7174; RV64I-NEXT: ret 7175; 7176; RV32ID-ILP32-LABEL: fcvt_w_s_i8: 7177; RV32ID-ILP32: # %bb.0: 7178; RV32ID-ILP32-NEXT: addi sp, sp, -16 7179; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7180; RV32ID-ILP32-NEXT: call __extendhfsf2 7181; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 7182; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 7183; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7184; RV32ID-ILP32-NEXT: addi sp, sp, 16 7185; RV32ID-ILP32-NEXT: ret 7186; 7187; RV64ID-LP64-LABEL: fcvt_w_s_i8: 7188; RV64ID-LP64: # %bb.0: 7189; RV64ID-LP64-NEXT: addi sp, sp, -16 7190; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7191; RV64ID-LP64-NEXT: call __extendhfsf2 7192; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 7193; RV64ID-LP64-NEXT: fcvt.l.s a0, fa5, rtz 7194; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7195; RV64ID-LP64-NEXT: addi sp, sp, 16 7196; RV64ID-LP64-NEXT: ret 7197; 7198; RV32ID-LABEL: fcvt_w_s_i8: 7199; RV32ID: # %bb.0: 7200; RV32ID-NEXT: addi sp, sp, -16 7201; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7202; RV32ID-NEXT: call __extendhfsf2 7203; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 7204; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7205; RV32ID-NEXT: addi sp, sp, 16 7206; RV32ID-NEXT: ret 7207; 7208; RV64ID-LABEL: fcvt_w_s_i8: 7209; RV64ID: # %bb.0: 7210; RV64ID-NEXT: addi sp, sp, -16 7211; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7212; RV64ID-NEXT: call __extendhfsf2 7213; RV64ID-NEXT: fcvt.l.s a0, fa0, rtz 7214; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7215; RV64ID-NEXT: addi sp, sp, 16 7216; RV64ID-NEXT: ret 7217; 7218; CHECK32-IZFHMIN-LABEL: fcvt_w_s_i8: 7219; CHECK32-IZFHMIN: # %bb.0: 7220; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7221; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 7222; CHECK32-IZFHMIN-NEXT: ret 7223; 7224; CHECK64-IZFHMIN-LABEL: fcvt_w_s_i8: 7225; CHECK64-IZFHMIN: # %bb.0: 7226; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7227; CHECK64-IZFHMIN-NEXT: fcvt.l.s a0, fa5, rtz 7228; CHECK64-IZFHMIN-NEXT: ret 7229; 7230; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_i8: 7231; CHECK32-IZHINXMIN: # %bb.0: 7232; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7233; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 7234; CHECK32-IZHINXMIN-NEXT: ret 7235; 7236; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_i8: 7237; CHECK64-IZHINXMIN: # %bb.0: 7238; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7239; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 7240; CHECK64-IZHINXMIN-NEXT: ret 7241; 7242; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_i8: 7243; CHECK32-IZDINXZHINXMIN: # %bb.0: 7244; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7245; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 7246; CHECK32-IZDINXZHINXMIN-NEXT: ret 7247; 7248; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_i8: 7249; CHECK64-IZDINXZHINXMIN: # %bb.0: 7250; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7251; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a0, a0, rtz 7252; CHECK64-IZDINXZHINXMIN-NEXT: ret 7253 %1 = fptosi half %a to i8 7254 ret i8 %1 7255} 7256 7257define signext i8 @fcvt_w_s_sat_i8(half %a) nounwind { 7258; RV32IZFH-LABEL: fcvt_w_s_sat_i8: 7259; RV32IZFH: # %bb.0: # %start 7260; RV32IZFH-NEXT: fcvt.s.h fa5, fa0 7261; RV32IZFH-NEXT: lui a0, 798720 7262; RV32IZFH-NEXT: lui a1, 274400 7263; RV32IZFH-NEXT: fmv.w.x fa4, a0 7264; RV32IZFH-NEXT: feq.s a0, fa5, fa5 7265; RV32IZFH-NEXT: neg a0, a0 7266; RV32IZFH-NEXT: fmax.s fa5, fa5, fa4 7267; RV32IZFH-NEXT: fmv.w.x fa4, a1 7268; RV32IZFH-NEXT: fmin.s fa5, fa5, fa4 7269; RV32IZFH-NEXT: fcvt.w.s a1, fa5, rtz 7270; RV32IZFH-NEXT: and a0, a0, a1 7271; RV32IZFH-NEXT: ret 7272; 7273; RV64IZFH-LABEL: fcvt_w_s_sat_i8: 7274; RV64IZFH: # %bb.0: # %start 7275; RV64IZFH-NEXT: fcvt.s.h fa5, fa0 7276; RV64IZFH-NEXT: lui a0, 798720 7277; RV64IZFH-NEXT: lui a1, 274400 7278; RV64IZFH-NEXT: fmv.w.x fa4, a0 7279; RV64IZFH-NEXT: feq.s a0, fa5, fa5 7280; RV64IZFH-NEXT: neg a0, a0 7281; RV64IZFH-NEXT: fmax.s fa5, fa5, fa4 7282; RV64IZFH-NEXT: fmv.w.x fa4, a1 7283; RV64IZFH-NEXT: fmin.s fa5, fa5, fa4 7284; RV64IZFH-NEXT: fcvt.l.s a1, fa5, rtz 7285; RV64IZFH-NEXT: and a0, a0, a1 7286; RV64IZFH-NEXT: ret 7287; 7288; RV32IDZFH-LABEL: fcvt_w_s_sat_i8: 7289; RV32IDZFH: # %bb.0: # %start 7290; RV32IDZFH-NEXT: fcvt.s.h fa5, fa0 7291; RV32IDZFH-NEXT: lui a0, 798720 7292; RV32IDZFH-NEXT: lui a1, 274400 7293; RV32IDZFH-NEXT: fmv.w.x fa4, a0 7294; RV32IDZFH-NEXT: feq.s a0, fa5, fa5 7295; RV32IDZFH-NEXT: neg a0, a0 7296; RV32IDZFH-NEXT: fmax.s fa5, fa5, fa4 7297; RV32IDZFH-NEXT: fmv.w.x fa4, a1 7298; RV32IDZFH-NEXT: fmin.s fa5, fa5, fa4 7299; RV32IDZFH-NEXT: fcvt.w.s a1, fa5, rtz 7300; RV32IDZFH-NEXT: and a0, a0, a1 7301; RV32IDZFH-NEXT: ret 7302; 7303; RV64IDZFH-LABEL: fcvt_w_s_sat_i8: 7304; RV64IDZFH: # %bb.0: # %start 7305; RV64IDZFH-NEXT: fcvt.s.h fa5, fa0 7306; RV64IDZFH-NEXT: lui a0, 798720 7307; RV64IDZFH-NEXT: lui a1, 274400 7308; RV64IDZFH-NEXT: fmv.w.x fa4, a0 7309; RV64IDZFH-NEXT: feq.s a0, fa5, fa5 7310; RV64IDZFH-NEXT: neg a0, a0 7311; RV64IDZFH-NEXT: fmax.s fa5, fa5, fa4 7312; RV64IDZFH-NEXT: fmv.w.x fa4, a1 7313; RV64IDZFH-NEXT: fmin.s fa5, fa5, fa4 7314; RV64IDZFH-NEXT: fcvt.l.s a1, fa5, rtz 7315; RV64IDZFH-NEXT: and a0, a0, a1 7316; RV64IDZFH-NEXT: ret 7317; 7318; RV32IZHINX-LABEL: fcvt_w_s_sat_i8: 7319; RV32IZHINX: # %bb.0: # %start 7320; RV32IZHINX-NEXT: fcvt.s.h a0, a0 7321; RV32IZHINX-NEXT: lui a1, 798720 7322; RV32IZHINX-NEXT: lui a2, 274400 7323; RV32IZHINX-NEXT: fmax.s a1, a0, a1 7324; RV32IZHINX-NEXT: feq.s a0, a0, a0 7325; RV32IZHINX-NEXT: neg a0, a0 7326; RV32IZHINX-NEXT: fmin.s a1, a1, a2 7327; RV32IZHINX-NEXT: fcvt.w.s a1, a1, rtz 7328; RV32IZHINX-NEXT: and a0, a0, a1 7329; RV32IZHINX-NEXT: ret 7330; 7331; RV64IZHINX-LABEL: fcvt_w_s_sat_i8: 7332; RV64IZHINX: # %bb.0: # %start 7333; RV64IZHINX-NEXT: fcvt.s.h a0, a0 7334; RV64IZHINX-NEXT: lui a1, 798720 7335; RV64IZHINX-NEXT: lui a2, 274400 7336; RV64IZHINX-NEXT: fmax.s a1, a0, a1 7337; RV64IZHINX-NEXT: feq.s a0, a0, a0 7338; RV64IZHINX-NEXT: neg a0, a0 7339; RV64IZHINX-NEXT: fmin.s a1, a1, a2 7340; RV64IZHINX-NEXT: fcvt.l.s a1, a1, rtz 7341; RV64IZHINX-NEXT: and a0, a0, a1 7342; RV64IZHINX-NEXT: ret 7343; 7344; RV32IZDINXZHINX-LABEL: fcvt_w_s_sat_i8: 7345; RV32IZDINXZHINX: # %bb.0: # %start 7346; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 7347; RV32IZDINXZHINX-NEXT: lui a1, 798720 7348; RV32IZDINXZHINX-NEXT: lui a2, 274400 7349; RV32IZDINXZHINX-NEXT: fmax.s a1, a0, a1 7350; RV32IZDINXZHINX-NEXT: feq.s a0, a0, a0 7351; RV32IZDINXZHINX-NEXT: neg a0, a0 7352; RV32IZDINXZHINX-NEXT: fmin.s a1, a1, a2 7353; RV32IZDINXZHINX-NEXT: fcvt.w.s a1, a1, rtz 7354; RV32IZDINXZHINX-NEXT: and a0, a0, a1 7355; RV32IZDINXZHINX-NEXT: ret 7356; 7357; RV64IZDINXZHINX-LABEL: fcvt_w_s_sat_i8: 7358; RV64IZDINXZHINX: # %bb.0: # %start 7359; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 7360; RV64IZDINXZHINX-NEXT: lui a1, 798720 7361; RV64IZDINXZHINX-NEXT: lui a2, 274400 7362; RV64IZDINXZHINX-NEXT: fmax.s a1, a0, a1 7363; RV64IZDINXZHINX-NEXT: feq.s a0, a0, a0 7364; RV64IZDINXZHINX-NEXT: neg a0, a0 7365; RV64IZDINXZHINX-NEXT: fmin.s a1, a1, a2 7366; RV64IZDINXZHINX-NEXT: fcvt.l.s a1, a1, rtz 7367; RV64IZDINXZHINX-NEXT: and a0, a0, a1 7368; RV64IZDINXZHINX-NEXT: ret 7369; 7370; RV32I-LABEL: fcvt_w_s_sat_i8: 7371; RV32I: # %bb.0: # %start 7372; RV32I-NEXT: addi sp, sp, -16 7373; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7374; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 7375; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 7376; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 7377; RV32I-NEXT: slli a0, a0, 16 7378; RV32I-NEXT: srli a0, a0, 16 7379; RV32I-NEXT: call __extendhfsf2 7380; RV32I-NEXT: mv s0, a0 7381; RV32I-NEXT: lui a1, 798720 7382; RV32I-NEXT: call __gesf2 7383; RV32I-NEXT: mv s2, a0 7384; RV32I-NEXT: mv a0, s0 7385; RV32I-NEXT: call __fixsfsi 7386; RV32I-NEXT: mv s1, a0 7387; RV32I-NEXT: bgez s2, .LBB36_2 7388; RV32I-NEXT: # %bb.1: # %start 7389; RV32I-NEXT: li s1, -128 7390; RV32I-NEXT: .LBB36_2: # %start 7391; RV32I-NEXT: lui a1, 274400 7392; RV32I-NEXT: mv a0, s0 7393; RV32I-NEXT: call __gtsf2 7394; RV32I-NEXT: blez a0, .LBB36_4 7395; RV32I-NEXT: # %bb.3: # %start 7396; RV32I-NEXT: li s1, 127 7397; RV32I-NEXT: .LBB36_4: # %start 7398; RV32I-NEXT: mv a0, s0 7399; RV32I-NEXT: mv a1, s0 7400; RV32I-NEXT: call __unordsf2 7401; RV32I-NEXT: snez a0, a0 7402; RV32I-NEXT: addi a0, a0, -1 7403; RV32I-NEXT: and a0, a0, s1 7404; RV32I-NEXT: slli a0, a0, 24 7405; RV32I-NEXT: srai a0, a0, 24 7406; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7407; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 7408; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 7409; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 7410; RV32I-NEXT: addi sp, sp, 16 7411; RV32I-NEXT: ret 7412; 7413; RV64I-LABEL: fcvt_w_s_sat_i8: 7414; RV64I: # %bb.0: # %start 7415; RV64I-NEXT: addi sp, sp, -32 7416; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 7417; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 7418; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 7419; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 7420; RV64I-NEXT: slli a0, a0, 48 7421; RV64I-NEXT: srli a0, a0, 48 7422; RV64I-NEXT: call __extendhfsf2 7423; RV64I-NEXT: mv s0, a0 7424; RV64I-NEXT: lui a1, 798720 7425; RV64I-NEXT: call __gesf2 7426; RV64I-NEXT: mv s2, a0 7427; RV64I-NEXT: mv a0, s0 7428; RV64I-NEXT: call __fixsfdi 7429; RV64I-NEXT: mv s1, a0 7430; RV64I-NEXT: bgez s2, .LBB36_2 7431; RV64I-NEXT: # %bb.1: # %start 7432; RV64I-NEXT: li s1, -128 7433; RV64I-NEXT: .LBB36_2: # %start 7434; RV64I-NEXT: lui a1, 274400 7435; RV64I-NEXT: mv a0, s0 7436; RV64I-NEXT: call __gtsf2 7437; RV64I-NEXT: blez a0, .LBB36_4 7438; RV64I-NEXT: # %bb.3: # %start 7439; RV64I-NEXT: li s1, 127 7440; RV64I-NEXT: .LBB36_4: # %start 7441; RV64I-NEXT: mv a0, s0 7442; RV64I-NEXT: mv a1, s0 7443; RV64I-NEXT: call __unordsf2 7444; RV64I-NEXT: snez a0, a0 7445; RV64I-NEXT: addi a0, a0, -1 7446; RV64I-NEXT: and a0, a0, s1 7447; RV64I-NEXT: slli a0, a0, 56 7448; RV64I-NEXT: srai a0, a0, 56 7449; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 7450; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 7451; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 7452; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 7453; RV64I-NEXT: addi sp, sp, 32 7454; RV64I-NEXT: ret 7455; 7456; RV32ID-ILP32-LABEL: fcvt_w_s_sat_i8: 7457; RV32ID-ILP32: # %bb.0: # %start 7458; RV32ID-ILP32-NEXT: addi sp, sp, -16 7459; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7460; RV32ID-ILP32-NEXT: call __extendhfsf2 7461; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 7462; RV32ID-ILP32-NEXT: lui a0, 798720 7463; RV32ID-ILP32-NEXT: lui a1, 274400 7464; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 7465; RV32ID-ILP32-NEXT: feq.s a0, fa5, fa5 7466; RV32ID-ILP32-NEXT: neg a0, a0 7467; RV32ID-ILP32-NEXT: fmax.s fa5, fa5, fa4 7468; RV32ID-ILP32-NEXT: fmv.w.x fa4, a1 7469; RV32ID-ILP32-NEXT: fmin.s fa5, fa5, fa4 7470; RV32ID-ILP32-NEXT: fcvt.w.s a1, fa5, rtz 7471; RV32ID-ILP32-NEXT: and a0, a0, a1 7472; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7473; RV32ID-ILP32-NEXT: addi sp, sp, 16 7474; RV32ID-ILP32-NEXT: ret 7475; 7476; RV64ID-LP64-LABEL: fcvt_w_s_sat_i8: 7477; RV64ID-LP64: # %bb.0: # %start 7478; RV64ID-LP64-NEXT: addi sp, sp, -16 7479; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7480; RV64ID-LP64-NEXT: call __extendhfsf2 7481; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 7482; RV64ID-LP64-NEXT: lui a0, 798720 7483; RV64ID-LP64-NEXT: lui a1, 274400 7484; RV64ID-LP64-NEXT: fmv.w.x fa4, a0 7485; RV64ID-LP64-NEXT: feq.s a0, fa5, fa5 7486; RV64ID-LP64-NEXT: neg a0, a0 7487; RV64ID-LP64-NEXT: fmax.s fa5, fa5, fa4 7488; RV64ID-LP64-NEXT: fmv.w.x fa4, a1 7489; RV64ID-LP64-NEXT: fmin.s fa5, fa5, fa4 7490; RV64ID-LP64-NEXT: fcvt.l.s a1, fa5, rtz 7491; RV64ID-LP64-NEXT: and a0, a0, a1 7492; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7493; RV64ID-LP64-NEXT: addi sp, sp, 16 7494; RV64ID-LP64-NEXT: ret 7495; 7496; RV32ID-LABEL: fcvt_w_s_sat_i8: 7497; RV32ID: # %bb.0: # %start 7498; RV32ID-NEXT: addi sp, sp, -16 7499; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7500; RV32ID-NEXT: call __extendhfsf2 7501; RV32ID-NEXT: feq.s a0, fa0, fa0 7502; RV32ID-NEXT: lui a1, 798720 7503; RV32ID-NEXT: fmv.w.x fa5, a1 7504; RV32ID-NEXT: lui a1, 274400 7505; RV32ID-NEXT: neg a0, a0 7506; RV32ID-NEXT: fmax.s fa5, fa0, fa5 7507; RV32ID-NEXT: fmv.w.x fa4, a1 7508; RV32ID-NEXT: fmin.s fa5, fa5, fa4 7509; RV32ID-NEXT: fcvt.w.s a1, fa5, rtz 7510; RV32ID-NEXT: and a0, a0, a1 7511; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7512; RV32ID-NEXT: addi sp, sp, 16 7513; RV32ID-NEXT: ret 7514; 7515; RV64ID-LABEL: fcvt_w_s_sat_i8: 7516; RV64ID: # %bb.0: # %start 7517; RV64ID-NEXT: addi sp, sp, -16 7518; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7519; RV64ID-NEXT: call __extendhfsf2 7520; RV64ID-NEXT: feq.s a0, fa0, fa0 7521; RV64ID-NEXT: lui a1, 798720 7522; RV64ID-NEXT: fmv.w.x fa5, a1 7523; RV64ID-NEXT: lui a1, 274400 7524; RV64ID-NEXT: neg a0, a0 7525; RV64ID-NEXT: fmax.s fa5, fa0, fa5 7526; RV64ID-NEXT: fmv.w.x fa4, a1 7527; RV64ID-NEXT: fmin.s fa5, fa5, fa4 7528; RV64ID-NEXT: fcvt.l.s a1, fa5, rtz 7529; RV64ID-NEXT: and a0, a0, a1 7530; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7531; RV64ID-NEXT: addi sp, sp, 16 7532; RV64ID-NEXT: ret 7533; 7534; CHECK32-IZFHMIN-LABEL: fcvt_w_s_sat_i8: 7535; CHECK32-IZFHMIN: # %bb.0: # %start 7536; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7537; CHECK32-IZFHMIN-NEXT: lui a0, 798720 7538; CHECK32-IZFHMIN-NEXT: lui a1, 274400 7539; CHECK32-IZFHMIN-NEXT: fmv.w.x fa4, a0 7540; CHECK32-IZFHMIN-NEXT: feq.s a0, fa5, fa5 7541; CHECK32-IZFHMIN-NEXT: neg a0, a0 7542; CHECK32-IZFHMIN-NEXT: fmax.s fa5, fa5, fa4 7543; CHECK32-IZFHMIN-NEXT: fmv.w.x fa4, a1 7544; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 7545; CHECK32-IZFHMIN-NEXT: fcvt.w.s a1, fa5, rtz 7546; CHECK32-IZFHMIN-NEXT: and a0, a0, a1 7547; CHECK32-IZFHMIN-NEXT: ret 7548; 7549; CHECK64-IZFHMIN-LABEL: fcvt_w_s_sat_i8: 7550; CHECK64-IZFHMIN: # %bb.0: # %start 7551; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7552; CHECK64-IZFHMIN-NEXT: lui a0, 798720 7553; CHECK64-IZFHMIN-NEXT: lui a1, 274400 7554; CHECK64-IZFHMIN-NEXT: fmv.w.x fa4, a0 7555; CHECK64-IZFHMIN-NEXT: feq.s a0, fa5, fa5 7556; CHECK64-IZFHMIN-NEXT: neg a0, a0 7557; CHECK64-IZFHMIN-NEXT: fmax.s fa5, fa5, fa4 7558; CHECK64-IZFHMIN-NEXT: fmv.w.x fa4, a1 7559; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 7560; CHECK64-IZFHMIN-NEXT: fcvt.l.s a1, fa5, rtz 7561; CHECK64-IZFHMIN-NEXT: and a0, a0, a1 7562; CHECK64-IZFHMIN-NEXT: ret 7563; 7564; CHECK32-IZHINXMIN-LABEL: fcvt_w_s_sat_i8: 7565; CHECK32-IZHINXMIN: # %bb.0: # %start 7566; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7567; CHECK32-IZHINXMIN-NEXT: lui a1, 798720 7568; CHECK32-IZHINXMIN-NEXT: lui a2, 274400 7569; CHECK32-IZHINXMIN-NEXT: fmax.s a1, a0, a1 7570; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 7571; CHECK32-IZHINXMIN-NEXT: neg a0, a0 7572; CHECK32-IZHINXMIN-NEXT: fmin.s a1, a1, a2 7573; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 7574; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 7575; CHECK32-IZHINXMIN-NEXT: ret 7576; 7577; CHECK64-IZHINXMIN-LABEL: fcvt_w_s_sat_i8: 7578; CHECK64-IZHINXMIN: # %bb.0: # %start 7579; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7580; CHECK64-IZHINXMIN-NEXT: lui a1, 798720 7581; CHECK64-IZHINXMIN-NEXT: lui a2, 274400 7582; CHECK64-IZHINXMIN-NEXT: fmax.s a1, a0, a1 7583; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 7584; CHECK64-IZHINXMIN-NEXT: neg a0, a0 7585; CHECK64-IZHINXMIN-NEXT: fmin.s a1, a1, a2 7586; CHECK64-IZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 7587; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 7588; CHECK64-IZHINXMIN-NEXT: ret 7589; 7590; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i8: 7591; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 7592; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7593; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 798720 7594; CHECK32-IZDINXZHINXMIN-NEXT: lui a2, 274400 7595; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 7596; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 7597; CHECK32-IZDINXZHINXMIN-NEXT: neg a0, a0 7598; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 7599; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a1, rtz 7600; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 7601; CHECK32-IZDINXZHINXMIN-NEXT: ret 7602; 7603; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_s_sat_i8: 7604; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 7605; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7606; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 798720 7607; CHECK64-IZDINXZHINXMIN-NEXT: lui a2, 274400 7608; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a1, a0, a1 7609; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 7610; CHECK64-IZDINXZHINXMIN-NEXT: neg a0, a0 7611; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a1, a1, a2 7612; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.l.s a1, a1, rtz 7613; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 7614; CHECK64-IZDINXZHINXMIN-NEXT: ret 7615start: 7616 %0 = tail call i8 @llvm.fptosi.sat.i8.f16(half %a) 7617 ret i8 %0 7618} 7619declare i8 @llvm.fptosi.sat.i8.f16(half) 7620 7621define zeroext i8 @fcvt_wu_s_i8(half %a) nounwind { 7622; RV32IZFH-LABEL: fcvt_wu_s_i8: 7623; RV32IZFH: # %bb.0: 7624; RV32IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 7625; RV32IZFH-NEXT: ret 7626; 7627; RV64IZFH-LABEL: fcvt_wu_s_i8: 7628; RV64IZFH: # %bb.0: 7629; RV64IZFH-NEXT: fcvt.lu.h a0, fa0, rtz 7630; RV64IZFH-NEXT: ret 7631; 7632; RV32IDZFH-LABEL: fcvt_wu_s_i8: 7633; RV32IDZFH: # %bb.0: 7634; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 7635; RV32IDZFH-NEXT: ret 7636; 7637; RV64IDZFH-LABEL: fcvt_wu_s_i8: 7638; RV64IDZFH: # %bb.0: 7639; RV64IDZFH-NEXT: fcvt.lu.h a0, fa0, rtz 7640; RV64IDZFH-NEXT: ret 7641; 7642; RV32IZHINX-LABEL: fcvt_wu_s_i8: 7643; RV32IZHINX: # %bb.0: 7644; RV32IZHINX-NEXT: fcvt.wu.h a0, a0, rtz 7645; RV32IZHINX-NEXT: ret 7646; 7647; RV64IZHINX-LABEL: fcvt_wu_s_i8: 7648; RV64IZHINX: # %bb.0: 7649; RV64IZHINX-NEXT: fcvt.lu.h a0, a0, rtz 7650; RV64IZHINX-NEXT: ret 7651; 7652; RV32IZDINXZHINX-LABEL: fcvt_wu_s_i8: 7653; RV32IZDINXZHINX: # %bb.0: 7654; RV32IZDINXZHINX-NEXT: fcvt.wu.h a0, a0, rtz 7655; RV32IZDINXZHINX-NEXT: ret 7656; 7657; RV64IZDINXZHINX-LABEL: fcvt_wu_s_i8: 7658; RV64IZDINXZHINX: # %bb.0: 7659; RV64IZDINXZHINX-NEXT: fcvt.lu.h a0, a0, rtz 7660; RV64IZDINXZHINX-NEXT: ret 7661; 7662; RV32I-LABEL: fcvt_wu_s_i8: 7663; RV32I: # %bb.0: 7664; RV32I-NEXT: addi sp, sp, -16 7665; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7666; RV32I-NEXT: slli a0, a0, 16 7667; RV32I-NEXT: srli a0, a0, 16 7668; RV32I-NEXT: call __extendhfsf2 7669; RV32I-NEXT: call __fixunssfsi 7670; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7671; RV32I-NEXT: addi sp, sp, 16 7672; RV32I-NEXT: ret 7673; 7674; RV64I-LABEL: fcvt_wu_s_i8: 7675; RV64I: # %bb.0: 7676; RV64I-NEXT: addi sp, sp, -16 7677; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7678; RV64I-NEXT: slli a0, a0, 48 7679; RV64I-NEXT: srli a0, a0, 48 7680; RV64I-NEXT: call __extendhfsf2 7681; RV64I-NEXT: call __fixunssfdi 7682; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7683; RV64I-NEXT: addi sp, sp, 16 7684; RV64I-NEXT: ret 7685; 7686; RV32ID-ILP32-LABEL: fcvt_wu_s_i8: 7687; RV32ID-ILP32: # %bb.0: 7688; RV32ID-ILP32-NEXT: addi sp, sp, -16 7689; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7690; RV32ID-ILP32-NEXT: call __extendhfsf2 7691; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 7692; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 7693; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7694; RV32ID-ILP32-NEXT: addi sp, sp, 16 7695; RV32ID-ILP32-NEXT: ret 7696; 7697; RV64ID-LP64-LABEL: fcvt_wu_s_i8: 7698; RV64ID-LP64: # %bb.0: 7699; RV64ID-LP64-NEXT: addi sp, sp, -16 7700; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7701; RV64ID-LP64-NEXT: call __extendhfsf2 7702; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 7703; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 7704; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7705; RV64ID-LP64-NEXT: addi sp, sp, 16 7706; RV64ID-LP64-NEXT: ret 7707; 7708; RV32ID-LABEL: fcvt_wu_s_i8: 7709; RV32ID: # %bb.0: 7710; RV32ID-NEXT: addi sp, sp, -16 7711; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7712; RV32ID-NEXT: call __extendhfsf2 7713; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 7714; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7715; RV32ID-NEXT: addi sp, sp, 16 7716; RV32ID-NEXT: ret 7717; 7718; RV64ID-LABEL: fcvt_wu_s_i8: 7719; RV64ID: # %bb.0: 7720; RV64ID-NEXT: addi sp, sp, -16 7721; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7722; RV64ID-NEXT: call __extendhfsf2 7723; RV64ID-NEXT: fcvt.lu.s a0, fa0, rtz 7724; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7725; RV64ID-NEXT: addi sp, sp, 16 7726; RV64ID-NEXT: ret 7727; 7728; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_i8: 7729; CHECK32-IZFHMIN: # %bb.0: 7730; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7731; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 7732; CHECK32-IZFHMIN-NEXT: ret 7733; 7734; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_i8: 7735; CHECK64-IZFHMIN: # %bb.0: 7736; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7737; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 7738; CHECK64-IZFHMIN-NEXT: ret 7739; 7740; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_i8: 7741; CHECK32-IZHINXMIN: # %bb.0: 7742; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7743; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 7744; CHECK32-IZHINXMIN-NEXT: ret 7745; 7746; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_i8: 7747; CHECK64-IZHINXMIN: # %bb.0: 7748; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 7749; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 7750; CHECK64-IZHINXMIN-NEXT: ret 7751; 7752; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i8: 7753; CHECK32-IZDINXZHINXMIN: # %bb.0: 7754; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7755; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a0, a0, rtz 7756; CHECK32-IZDINXZHINXMIN-NEXT: ret 7757; 7758; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_i8: 7759; CHECK64-IZDINXZHINXMIN: # %bb.0: 7760; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 7761; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 7762; CHECK64-IZDINXZHINXMIN-NEXT: ret 7763 %1 = fptoui half %a to i8 7764 ret i8 %1 7765} 7766 7767define zeroext i8 @fcvt_wu_s_sat_i8(half %a) nounwind { 7768; RV32IZFH-LABEL: fcvt_wu_s_sat_i8: 7769; RV32IZFH: # %bb.0: # %start 7770; RV32IZFH-NEXT: fcvt.s.h fa5, fa0 7771; RV32IZFH-NEXT: fmv.w.x fa4, zero 7772; RV32IZFH-NEXT: lui a0, 276464 7773; RV32IZFH-NEXT: fmax.s fa5, fa5, fa4 7774; RV32IZFH-NEXT: fmv.w.x fa4, a0 7775; RV32IZFH-NEXT: fmin.s fa5, fa5, fa4 7776; RV32IZFH-NEXT: fcvt.wu.s a0, fa5, rtz 7777; RV32IZFH-NEXT: ret 7778; 7779; RV64IZFH-LABEL: fcvt_wu_s_sat_i8: 7780; RV64IZFH: # %bb.0: # %start 7781; RV64IZFH-NEXT: fcvt.s.h fa5, fa0 7782; RV64IZFH-NEXT: fmv.w.x fa4, zero 7783; RV64IZFH-NEXT: lui a0, 276464 7784; RV64IZFH-NEXT: fmax.s fa5, fa5, fa4 7785; RV64IZFH-NEXT: fmv.w.x fa4, a0 7786; RV64IZFH-NEXT: fmin.s fa5, fa5, fa4 7787; RV64IZFH-NEXT: fcvt.lu.s a0, fa5, rtz 7788; RV64IZFH-NEXT: ret 7789; 7790; RV32IDZFH-LABEL: fcvt_wu_s_sat_i8: 7791; RV32IDZFH: # %bb.0: # %start 7792; RV32IDZFH-NEXT: fcvt.s.h fa5, fa0 7793; RV32IDZFH-NEXT: fmv.w.x fa4, zero 7794; RV32IDZFH-NEXT: lui a0, 276464 7795; RV32IDZFH-NEXT: fmax.s fa5, fa5, fa4 7796; RV32IDZFH-NEXT: fmv.w.x fa4, a0 7797; RV32IDZFH-NEXT: fmin.s fa5, fa5, fa4 7798; RV32IDZFH-NEXT: fcvt.wu.s a0, fa5, rtz 7799; RV32IDZFH-NEXT: ret 7800; 7801; RV64IDZFH-LABEL: fcvt_wu_s_sat_i8: 7802; RV64IDZFH: # %bb.0: # %start 7803; RV64IDZFH-NEXT: fcvt.s.h fa5, fa0 7804; RV64IDZFH-NEXT: fmv.w.x fa4, zero 7805; RV64IDZFH-NEXT: lui a0, 276464 7806; RV64IDZFH-NEXT: fmax.s fa5, fa5, fa4 7807; RV64IDZFH-NEXT: fmv.w.x fa4, a0 7808; RV64IDZFH-NEXT: fmin.s fa5, fa5, fa4 7809; RV64IDZFH-NEXT: fcvt.lu.s a0, fa5, rtz 7810; RV64IDZFH-NEXT: ret 7811; 7812; RV32IZHINX-LABEL: fcvt_wu_s_sat_i8: 7813; RV32IZHINX: # %bb.0: # %start 7814; RV32IZHINX-NEXT: fcvt.s.h a0, a0 7815; RV32IZHINX-NEXT: fmax.s a0, a0, zero 7816; RV32IZHINX-NEXT: lui a1, 276464 7817; RV32IZHINX-NEXT: fmin.s a0, a0, a1 7818; RV32IZHINX-NEXT: fcvt.wu.s a0, a0, rtz 7819; RV32IZHINX-NEXT: ret 7820; 7821; RV64IZHINX-LABEL: fcvt_wu_s_sat_i8: 7822; RV64IZHINX: # %bb.0: # %start 7823; RV64IZHINX-NEXT: fcvt.s.h a0, a0 7824; RV64IZHINX-NEXT: fmax.s a0, a0, zero 7825; RV64IZHINX-NEXT: lui a1, 276464 7826; RV64IZHINX-NEXT: fmin.s a0, a0, a1 7827; RV64IZHINX-NEXT: fcvt.lu.s a0, a0, rtz 7828; RV64IZHINX-NEXT: ret 7829; 7830; RV32IZDINXZHINX-LABEL: fcvt_wu_s_sat_i8: 7831; RV32IZDINXZHINX: # %bb.0: # %start 7832; RV32IZDINXZHINX-NEXT: fcvt.s.h a0, a0 7833; RV32IZDINXZHINX-NEXT: fmax.s a0, a0, zero 7834; RV32IZDINXZHINX-NEXT: lui a1, 276464 7835; RV32IZDINXZHINX-NEXT: fmin.s a0, a0, a1 7836; RV32IZDINXZHINX-NEXT: fcvt.wu.s a0, a0, rtz 7837; RV32IZDINXZHINX-NEXT: ret 7838; 7839; RV64IZDINXZHINX-LABEL: fcvt_wu_s_sat_i8: 7840; RV64IZDINXZHINX: # %bb.0: # %start 7841; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 7842; RV64IZDINXZHINX-NEXT: fmax.s a0, a0, zero 7843; RV64IZDINXZHINX-NEXT: lui a1, 276464 7844; RV64IZDINXZHINX-NEXT: fmin.s a0, a0, a1 7845; RV64IZDINXZHINX-NEXT: fcvt.lu.s a0, a0, rtz 7846; RV64IZDINXZHINX-NEXT: ret 7847; 7848; RV32I-LABEL: fcvt_wu_s_sat_i8: 7849; RV32I: # %bb.0: # %start 7850; RV32I-NEXT: addi sp, sp, -16 7851; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7852; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 7853; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 7854; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 7855; RV32I-NEXT: slli a0, a0, 16 7856; RV32I-NEXT: srli a0, a0, 16 7857; RV32I-NEXT: call __extendhfsf2 7858; RV32I-NEXT: mv s2, a0 7859; RV32I-NEXT: li a1, 0 7860; RV32I-NEXT: call __gesf2 7861; RV32I-NEXT: mv s0, a0 7862; RV32I-NEXT: mv a0, s2 7863; RV32I-NEXT: call __fixunssfsi 7864; RV32I-NEXT: mv s1, a0 7865; RV32I-NEXT: lui a1, 276464 7866; RV32I-NEXT: mv a0, s2 7867; RV32I-NEXT: call __gtsf2 7868; RV32I-NEXT: blez a0, .LBB38_2 7869; RV32I-NEXT: # %bb.1: # %start 7870; RV32I-NEXT: li a0, 255 7871; RV32I-NEXT: j .LBB38_3 7872; RV32I-NEXT: .LBB38_2: 7873; RV32I-NEXT: slti a0, s0, 0 7874; RV32I-NEXT: addi a0, a0, -1 7875; RV32I-NEXT: and a0, a0, s1 7876; RV32I-NEXT: .LBB38_3: # %start 7877; RV32I-NEXT: andi a0, a0, 255 7878; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7879; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 7880; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 7881; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 7882; RV32I-NEXT: addi sp, sp, 16 7883; RV32I-NEXT: ret 7884; 7885; RV64I-LABEL: fcvt_wu_s_sat_i8: 7886; RV64I: # %bb.0: # %start 7887; RV64I-NEXT: addi sp, sp, -32 7888; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 7889; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 7890; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 7891; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 7892; RV64I-NEXT: slli a0, a0, 48 7893; RV64I-NEXT: srli a0, a0, 48 7894; RV64I-NEXT: call __extendhfsf2 7895; RV64I-NEXT: mv s2, a0 7896; RV64I-NEXT: li a1, 0 7897; RV64I-NEXT: call __gesf2 7898; RV64I-NEXT: mv s0, a0 7899; RV64I-NEXT: mv a0, s2 7900; RV64I-NEXT: call __fixunssfdi 7901; RV64I-NEXT: mv s1, a0 7902; RV64I-NEXT: lui a1, 276464 7903; RV64I-NEXT: mv a0, s2 7904; RV64I-NEXT: call __gtsf2 7905; RV64I-NEXT: blez a0, .LBB38_2 7906; RV64I-NEXT: # %bb.1: # %start 7907; RV64I-NEXT: li a0, 255 7908; RV64I-NEXT: j .LBB38_3 7909; RV64I-NEXT: .LBB38_2: 7910; RV64I-NEXT: slti a0, s0, 0 7911; RV64I-NEXT: addi a0, a0, -1 7912; RV64I-NEXT: and a0, a0, s1 7913; RV64I-NEXT: .LBB38_3: # %start 7914; RV64I-NEXT: andi a0, a0, 255 7915; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 7916; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 7917; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 7918; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 7919; RV64I-NEXT: addi sp, sp, 32 7920; RV64I-NEXT: ret 7921; 7922; RV32ID-ILP32-LABEL: fcvt_wu_s_sat_i8: 7923; RV32ID-ILP32: # %bb.0: # %start 7924; RV32ID-ILP32-NEXT: addi sp, sp, -16 7925; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7926; RV32ID-ILP32-NEXT: call __extendhfsf2 7927; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 7928; RV32ID-ILP32-NEXT: fmv.w.x fa4, zero 7929; RV32ID-ILP32-NEXT: lui a0, 276464 7930; RV32ID-ILP32-NEXT: fmax.s fa5, fa5, fa4 7931; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0 7932; RV32ID-ILP32-NEXT: fmin.s fa5, fa5, fa4 7933; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 7934; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7935; RV32ID-ILP32-NEXT: addi sp, sp, 16 7936; RV32ID-ILP32-NEXT: ret 7937; 7938; RV64ID-LP64-LABEL: fcvt_wu_s_sat_i8: 7939; RV64ID-LP64: # %bb.0: # %start 7940; RV64ID-LP64-NEXT: addi sp, sp, -16 7941; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7942; RV64ID-LP64-NEXT: call __extendhfsf2 7943; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 7944; RV64ID-LP64-NEXT: fmv.w.x fa4, zero 7945; RV64ID-LP64-NEXT: lui a0, 276464 7946; RV64ID-LP64-NEXT: fmax.s fa5, fa5, fa4 7947; RV64ID-LP64-NEXT: fmv.w.x fa4, a0 7948; RV64ID-LP64-NEXT: fmin.s fa5, fa5, fa4 7949; RV64ID-LP64-NEXT: fcvt.lu.s a0, fa5, rtz 7950; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7951; RV64ID-LP64-NEXT: addi sp, sp, 16 7952; RV64ID-LP64-NEXT: ret 7953; 7954; RV32ID-LABEL: fcvt_wu_s_sat_i8: 7955; RV32ID: # %bb.0: # %start 7956; RV32ID-NEXT: addi sp, sp, -16 7957; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7958; RV32ID-NEXT: call __extendhfsf2 7959; RV32ID-NEXT: fmv.w.x fa5, zero 7960; RV32ID-NEXT: lui a0, 276464 7961; RV32ID-NEXT: fmax.s fa5, fa0, fa5 7962; RV32ID-NEXT: fmv.w.x fa4, a0 7963; RV32ID-NEXT: fmin.s fa5, fa5, fa4 7964; RV32ID-NEXT: fcvt.wu.s a0, fa5, rtz 7965; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7966; RV32ID-NEXT: addi sp, sp, 16 7967; RV32ID-NEXT: ret 7968; 7969; RV64ID-LABEL: fcvt_wu_s_sat_i8: 7970; RV64ID: # %bb.0: # %start 7971; RV64ID-NEXT: addi sp, sp, -16 7972; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 7973; RV64ID-NEXT: call __extendhfsf2 7974; RV64ID-NEXT: fmv.w.x fa5, zero 7975; RV64ID-NEXT: lui a0, 276464 7976; RV64ID-NEXT: fmax.s fa5, fa0, fa5 7977; RV64ID-NEXT: fmv.w.x fa4, a0 7978; RV64ID-NEXT: fmin.s fa5, fa5, fa4 7979; RV64ID-NEXT: fcvt.lu.s a0, fa5, rtz 7980; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 7981; RV64ID-NEXT: addi sp, sp, 16 7982; RV64ID-NEXT: ret 7983; 7984; CHECK32-IZFHMIN-LABEL: fcvt_wu_s_sat_i8: 7985; CHECK32-IZFHMIN: # %bb.0: # %start 7986; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7987; CHECK32-IZFHMIN-NEXT: fmv.w.x fa4, zero 7988; CHECK32-IZFHMIN-NEXT: lui a0, 276464 7989; CHECK32-IZFHMIN-NEXT: fmax.s fa5, fa5, fa4 7990; CHECK32-IZFHMIN-NEXT: fmv.w.x fa4, a0 7991; CHECK32-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 7992; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 7993; CHECK32-IZFHMIN-NEXT: ret 7994; 7995; CHECK64-IZFHMIN-LABEL: fcvt_wu_s_sat_i8: 7996; CHECK64-IZFHMIN: # %bb.0: # %start 7997; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 7998; CHECK64-IZFHMIN-NEXT: fmv.w.x fa4, zero 7999; CHECK64-IZFHMIN-NEXT: lui a0, 276464 8000; CHECK64-IZFHMIN-NEXT: fmax.s fa5, fa5, fa4 8001; CHECK64-IZFHMIN-NEXT: fmv.w.x fa4, a0 8002; CHECK64-IZFHMIN-NEXT: fmin.s fa5, fa5, fa4 8003; CHECK64-IZFHMIN-NEXT: fcvt.lu.s a0, fa5, rtz 8004; CHECK64-IZFHMIN-NEXT: ret 8005; 8006; CHECK32-IZHINXMIN-LABEL: fcvt_wu_s_sat_i8: 8007; CHECK32-IZHINXMIN: # %bb.0: # %start 8008; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8009; CHECK32-IZHINXMIN-NEXT: fmax.s a0, a0, zero 8010; CHECK32-IZHINXMIN-NEXT: lui a1, 276464 8011; CHECK32-IZHINXMIN-NEXT: fmin.s a0, a0, a1 8012; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 8013; CHECK32-IZHINXMIN-NEXT: ret 8014; 8015; CHECK64-IZHINXMIN-LABEL: fcvt_wu_s_sat_i8: 8016; CHECK64-IZHINXMIN: # %bb.0: # %start 8017; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8018; CHECK64-IZHINXMIN-NEXT: fmax.s a0, a0, zero 8019; CHECK64-IZHINXMIN-NEXT: lui a1, 276464 8020; CHECK64-IZHINXMIN-NEXT: fmin.s a0, a0, a1 8021; CHECK64-IZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 8022; CHECK64-IZHINXMIN-NEXT: ret 8023; 8024; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i8: 8025; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 8026; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8027; CHECK32-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 8028; CHECK32-IZDINXZHINXMIN-NEXT: lui a1, 276464 8029; CHECK32-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 8030; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a0, a0, rtz 8031; CHECK32-IZDINXZHINXMIN-NEXT: ret 8032; 8033; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_s_sat_i8: 8034; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 8035; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8036; CHECK64-IZDINXZHINXMIN-NEXT: fmax.s a0, a0, zero 8037; CHECK64-IZDINXZHINXMIN-NEXT: lui a1, 276464 8038; CHECK64-IZDINXZHINXMIN-NEXT: fmin.s a0, a0, a1 8039; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.lu.s a0, a0, rtz 8040; CHECK64-IZDINXZHINXMIN-NEXT: ret 8041start: 8042 %0 = tail call i8 @llvm.fptoui.sat.i8.f16(half %a) 8043 ret i8 %0 8044} 8045declare i8 @llvm.fptoui.sat.i8.f16(half) 8046 8047define zeroext i32 @fcvt_wu_h_sat_zext(half %a) nounwind { 8048; RV32IZFH-LABEL: fcvt_wu_h_sat_zext: 8049; RV32IZFH: # %bb.0: # %start 8050; RV32IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 8051; RV32IZFH-NEXT: feq.h a1, fa0, fa0 8052; RV32IZFH-NEXT: seqz a1, a1 8053; RV32IZFH-NEXT: addi a1, a1, -1 8054; RV32IZFH-NEXT: and a0, a1, a0 8055; RV32IZFH-NEXT: ret 8056; 8057; RV64IZFH-LABEL: fcvt_wu_h_sat_zext: 8058; RV64IZFH: # %bb.0: # %start 8059; RV64IZFH-NEXT: fcvt.wu.h a0, fa0, rtz 8060; RV64IZFH-NEXT: feq.h a1, fa0, fa0 8061; RV64IZFH-NEXT: seqz a1, a1 8062; RV64IZFH-NEXT: addi a1, a1, -1 8063; RV64IZFH-NEXT: and a0, a0, a1 8064; RV64IZFH-NEXT: slli a0, a0, 32 8065; RV64IZFH-NEXT: srli a0, a0, 32 8066; RV64IZFH-NEXT: ret 8067; 8068; RV32IDZFH-LABEL: fcvt_wu_h_sat_zext: 8069; RV32IDZFH: # %bb.0: # %start 8070; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 8071; RV32IDZFH-NEXT: feq.h a1, fa0, fa0 8072; RV32IDZFH-NEXT: seqz a1, a1 8073; RV32IDZFH-NEXT: addi a1, a1, -1 8074; RV32IDZFH-NEXT: and a0, a1, a0 8075; RV32IDZFH-NEXT: ret 8076; 8077; RV64IDZFH-LABEL: fcvt_wu_h_sat_zext: 8078; RV64IDZFH: # %bb.0: # %start 8079; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz 8080; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 8081; RV64IDZFH-NEXT: seqz a1, a1 8082; RV64IDZFH-NEXT: addi a1, a1, -1 8083; RV64IDZFH-NEXT: and a0, a0, a1 8084; RV64IDZFH-NEXT: slli a0, a0, 32 8085; RV64IDZFH-NEXT: srli a0, a0, 32 8086; RV64IDZFH-NEXT: ret 8087; 8088; RV32IZHINX-LABEL: fcvt_wu_h_sat_zext: 8089; RV32IZHINX: # %bb.0: # %start 8090; RV32IZHINX-NEXT: fcvt.wu.h a1, a0, rtz 8091; RV32IZHINX-NEXT: feq.h a0, a0, a0 8092; RV32IZHINX-NEXT: seqz a0, a0 8093; RV32IZHINX-NEXT: addi a0, a0, -1 8094; RV32IZHINX-NEXT: and a0, a0, a1 8095; RV32IZHINX-NEXT: ret 8096; 8097; RV64IZHINX-LABEL: fcvt_wu_h_sat_zext: 8098; RV64IZHINX: # %bb.0: # %start 8099; RV64IZHINX-NEXT: fcvt.wu.h a1, a0, rtz 8100; RV64IZHINX-NEXT: feq.h a0, a0, a0 8101; RV64IZHINX-NEXT: seqz a0, a0 8102; RV64IZHINX-NEXT: addi a0, a0, -1 8103; RV64IZHINX-NEXT: and a0, a1, a0 8104; RV64IZHINX-NEXT: slli a0, a0, 32 8105; RV64IZHINX-NEXT: srli a0, a0, 32 8106; RV64IZHINX-NEXT: ret 8107; 8108; RV32IZDINXZHINX-LABEL: fcvt_wu_h_sat_zext: 8109; RV32IZDINXZHINX: # %bb.0: # %start 8110; RV32IZDINXZHINX-NEXT: fcvt.wu.h a1, a0, rtz 8111; RV32IZDINXZHINX-NEXT: feq.h a0, a0, a0 8112; RV32IZDINXZHINX-NEXT: seqz a0, a0 8113; RV32IZDINXZHINX-NEXT: addi a0, a0, -1 8114; RV32IZDINXZHINX-NEXT: and a0, a0, a1 8115; RV32IZDINXZHINX-NEXT: ret 8116; 8117; RV64IZDINXZHINX-LABEL: fcvt_wu_h_sat_zext: 8118; RV64IZDINXZHINX: # %bb.0: # %start 8119; RV64IZDINXZHINX-NEXT: fcvt.wu.h a1, a0, rtz 8120; RV64IZDINXZHINX-NEXT: feq.h a0, a0, a0 8121; RV64IZDINXZHINX-NEXT: seqz a0, a0 8122; RV64IZDINXZHINX-NEXT: addi a0, a0, -1 8123; RV64IZDINXZHINX-NEXT: and a0, a1, a0 8124; RV64IZDINXZHINX-NEXT: slli a0, a0, 32 8125; RV64IZDINXZHINX-NEXT: srli a0, a0, 32 8126; RV64IZDINXZHINX-NEXT: ret 8127; 8128; RV32I-LABEL: fcvt_wu_h_sat_zext: 8129; RV32I: # %bb.0: # %start 8130; RV32I-NEXT: addi sp, sp, -16 8131; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 8132; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 8133; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 8134; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill 8135; RV32I-NEXT: slli a0, a0, 16 8136; RV32I-NEXT: srli a0, a0, 16 8137; RV32I-NEXT: call __extendhfsf2 8138; RV32I-NEXT: mv s0, a0 8139; RV32I-NEXT: lui a1, 325632 8140; RV32I-NEXT: addi a1, a1, -1 8141; RV32I-NEXT: call __gtsf2 8142; RV32I-NEXT: sgtz a0, a0 8143; RV32I-NEXT: neg s1, a0 8144; RV32I-NEXT: mv a0, s0 8145; RV32I-NEXT: li a1, 0 8146; RV32I-NEXT: call __gesf2 8147; RV32I-NEXT: slti a0, a0, 0 8148; RV32I-NEXT: addi s2, a0, -1 8149; RV32I-NEXT: mv a0, s0 8150; RV32I-NEXT: call __fixunssfsi 8151; RV32I-NEXT: and a0, s2, a0 8152; RV32I-NEXT: or a0, s1, a0 8153; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 8154; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 8155; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 8156; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload 8157; RV32I-NEXT: addi sp, sp, 16 8158; RV32I-NEXT: ret 8159; 8160; RV64I-LABEL: fcvt_wu_h_sat_zext: 8161; RV64I: # %bb.0: # %start 8162; RV64I-NEXT: addi sp, sp, -32 8163; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 8164; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 8165; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 8166; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 8167; RV64I-NEXT: slli a0, a0, 48 8168; RV64I-NEXT: srli a0, a0, 48 8169; RV64I-NEXT: call __extendhfsf2 8170; RV64I-NEXT: mv s2, a0 8171; RV64I-NEXT: li a1, 0 8172; RV64I-NEXT: call __gesf2 8173; RV64I-NEXT: mv s0, a0 8174; RV64I-NEXT: mv a0, s2 8175; RV64I-NEXT: call __fixunssfdi 8176; RV64I-NEXT: mv s1, a0 8177; RV64I-NEXT: lui a1, 325632 8178; RV64I-NEXT: addiw a1, a1, -1 8179; RV64I-NEXT: mv a0, s2 8180; RV64I-NEXT: call __gtsf2 8181; RV64I-NEXT: blez a0, .LBB39_2 8182; RV64I-NEXT: # %bb.1: # %start 8183; RV64I-NEXT: li a0, -1 8184; RV64I-NEXT: srli a0, a0, 32 8185; RV64I-NEXT: j .LBB39_3 8186; RV64I-NEXT: .LBB39_2: 8187; RV64I-NEXT: slti a0, s0, 0 8188; RV64I-NEXT: addi a0, a0, -1 8189; RV64I-NEXT: and a0, a0, s1 8190; RV64I-NEXT: .LBB39_3: # %start 8191; RV64I-NEXT: slli a0, a0, 32 8192; RV64I-NEXT: srli a0, a0, 32 8193; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 8194; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 8195; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 8196; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 8197; RV64I-NEXT: addi sp, sp, 32 8198; RV64I-NEXT: ret 8199; 8200; RV32ID-ILP32-LABEL: fcvt_wu_h_sat_zext: 8201; RV32ID-ILP32: # %bb.0: # %start 8202; RV32ID-ILP32-NEXT: addi sp, sp, -16 8203; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 8204; RV32ID-ILP32-NEXT: call __extendhfsf2 8205; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 8206; RV32ID-ILP32-NEXT: fcvt.wu.s a0, fa5, rtz 8207; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 8208; RV32ID-ILP32-NEXT: seqz a1, a1 8209; RV32ID-ILP32-NEXT: addi a1, a1, -1 8210; RV32ID-ILP32-NEXT: and a0, a1, a0 8211; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 8212; RV32ID-ILP32-NEXT: addi sp, sp, 16 8213; RV32ID-ILP32-NEXT: ret 8214; 8215; RV64ID-LP64-LABEL: fcvt_wu_h_sat_zext: 8216; RV64ID-LP64: # %bb.0: # %start 8217; RV64ID-LP64-NEXT: addi sp, sp, -16 8218; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8219; RV64ID-LP64-NEXT: call __extendhfsf2 8220; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 8221; RV64ID-LP64-NEXT: fcvt.wu.s a0, fa5, rtz 8222; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 8223; RV64ID-LP64-NEXT: seqz a1, a1 8224; RV64ID-LP64-NEXT: addi a1, a1, -1 8225; RV64ID-LP64-NEXT: and a0, a0, a1 8226; RV64ID-LP64-NEXT: slli a0, a0, 32 8227; RV64ID-LP64-NEXT: srli a0, a0, 32 8228; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8229; RV64ID-LP64-NEXT: addi sp, sp, 16 8230; RV64ID-LP64-NEXT: ret 8231; 8232; RV32ID-LABEL: fcvt_wu_h_sat_zext: 8233; RV32ID: # %bb.0: # %start 8234; RV32ID-NEXT: addi sp, sp, -16 8235; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 8236; RV32ID-NEXT: call __extendhfsf2 8237; RV32ID-NEXT: fcvt.wu.s a0, fa0, rtz 8238; RV32ID-NEXT: feq.s a1, fa0, fa0 8239; RV32ID-NEXT: seqz a1, a1 8240; RV32ID-NEXT: addi a1, a1, -1 8241; RV32ID-NEXT: and a0, a1, a0 8242; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 8243; RV32ID-NEXT: addi sp, sp, 16 8244; RV32ID-NEXT: ret 8245; 8246; RV64ID-LABEL: fcvt_wu_h_sat_zext: 8247; RV64ID: # %bb.0: # %start 8248; RV64ID-NEXT: addi sp, sp, -16 8249; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8250; RV64ID-NEXT: call __extendhfsf2 8251; RV64ID-NEXT: fcvt.wu.s a0, fa0, rtz 8252; RV64ID-NEXT: feq.s a1, fa0, fa0 8253; RV64ID-NEXT: seqz a1, a1 8254; RV64ID-NEXT: addi a1, a1, -1 8255; RV64ID-NEXT: and a0, a0, a1 8256; RV64ID-NEXT: slli a0, a0, 32 8257; RV64ID-NEXT: srli a0, a0, 32 8258; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8259; RV64ID-NEXT: addi sp, sp, 16 8260; RV64ID-NEXT: ret 8261; 8262; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_sat_zext: 8263; CHECK32-IZFHMIN: # %bb.0: # %start 8264; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 8265; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 8266; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 8267; CHECK32-IZFHMIN-NEXT: seqz a1, a1 8268; CHECK32-IZFHMIN-NEXT: addi a1, a1, -1 8269; CHECK32-IZFHMIN-NEXT: and a0, a1, a0 8270; CHECK32-IZFHMIN-NEXT: ret 8271; 8272; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_sat_zext: 8273; CHECK64-IZFHMIN: # %bb.0: # %start 8274; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 8275; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, fa5, rtz 8276; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 8277; CHECK64-IZFHMIN-NEXT: seqz a1, a1 8278; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 8279; CHECK64-IZFHMIN-NEXT: and a0, a0, a1 8280; CHECK64-IZFHMIN-NEXT: slli a0, a0, 32 8281; CHECK64-IZFHMIN-NEXT: srli a0, a0, 32 8282; CHECK64-IZFHMIN-NEXT: ret 8283; 8284; CHECK32-IZHINXMIN-LABEL: fcvt_wu_h_sat_zext: 8285; CHECK32-IZHINXMIN: # %bb.0: # %start 8286; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8287; CHECK32-IZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 8288; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 8289; CHECK32-IZHINXMIN-NEXT: seqz a0, a0 8290; CHECK32-IZHINXMIN-NEXT: addi a0, a0, -1 8291; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 8292; CHECK32-IZHINXMIN-NEXT: ret 8293; 8294; CHECK64-IZHINXMIN-LABEL: fcvt_wu_h_sat_zext: 8295; CHECK64-IZHINXMIN: # %bb.0: # %start 8296; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8297; CHECK64-IZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 8298; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 8299; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 8300; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 8301; CHECK64-IZHINXMIN-NEXT: and a0, a1, a0 8302; CHECK64-IZHINXMIN-NEXT: slli a0, a0, 32 8303; CHECK64-IZHINXMIN-NEXT: srli a0, a0, 32 8304; CHECK64-IZHINXMIN-NEXT: ret 8305; 8306; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat_zext: 8307; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 8308; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8309; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 8310; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 8311; CHECK32-IZDINXZHINXMIN-NEXT: seqz a0, a0 8312; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 8313; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 8314; CHECK32-IZDINXZHINXMIN-NEXT: ret 8315; 8316; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_wu_h_sat_zext: 8317; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 8318; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8319; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.wu.s a1, a0, rtz 8320; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 8321; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 8322; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 8323; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a1, a0 8324; CHECK64-IZDINXZHINXMIN-NEXT: slli a0, a0, 32 8325; CHECK64-IZDINXZHINXMIN-NEXT: srli a0, a0, 32 8326; CHECK64-IZDINXZHINXMIN-NEXT: ret 8327start: 8328 %0 = tail call i32 @llvm.fptoui.sat.i32.f16(half %a) 8329 ret i32 %0 8330} 8331 8332define signext i32 @fcvt_w_h_sat_sext(half %a) nounwind { 8333; CHECKIZFH-LABEL: fcvt_w_h_sat_sext: 8334; CHECKIZFH: # %bb.0: # %start 8335; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rtz 8336; CHECKIZFH-NEXT: feq.h a1, fa0, fa0 8337; CHECKIZFH-NEXT: seqz a1, a1 8338; CHECKIZFH-NEXT: addi a1, a1, -1 8339; CHECKIZFH-NEXT: and a0, a1, a0 8340; CHECKIZFH-NEXT: ret 8341; 8342; RV32IDZFH-LABEL: fcvt_w_h_sat_sext: 8343; RV32IDZFH: # %bb.0: # %start 8344; RV32IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 8345; RV32IDZFH-NEXT: feq.h a1, fa0, fa0 8346; RV32IDZFH-NEXT: seqz a1, a1 8347; RV32IDZFH-NEXT: addi a1, a1, -1 8348; RV32IDZFH-NEXT: and a0, a1, a0 8349; RV32IDZFH-NEXT: ret 8350; 8351; RV64IDZFH-LABEL: fcvt_w_h_sat_sext: 8352; RV64IDZFH: # %bb.0: # %start 8353; RV64IDZFH-NEXT: fcvt.w.h a0, fa0, rtz 8354; RV64IDZFH-NEXT: feq.h a1, fa0, fa0 8355; RV64IDZFH-NEXT: seqz a1, a1 8356; RV64IDZFH-NEXT: addi a1, a1, -1 8357; RV64IDZFH-NEXT: and a0, a1, a0 8358; RV64IDZFH-NEXT: ret 8359; 8360; CHECKIZHINX-LABEL: fcvt_w_h_sat_sext: 8361; CHECKIZHINX: # %bb.0: # %start 8362; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rtz 8363; CHECKIZHINX-NEXT: feq.h a0, a0, a0 8364; CHECKIZHINX-NEXT: seqz a0, a0 8365; CHECKIZHINX-NEXT: addi a0, a0, -1 8366; CHECKIZHINX-NEXT: and a0, a0, a1 8367; CHECKIZHINX-NEXT: ret 8368; 8369; CHECKIZDINXZHINX-LABEL: fcvt_w_h_sat_sext: 8370; CHECKIZDINXZHINX: # %bb.0: # %start 8371; CHECKIZDINXZHINX-NEXT: fcvt.w.h a1, a0, rtz 8372; CHECKIZDINXZHINX-NEXT: feq.h a0, a0, a0 8373; CHECKIZDINXZHINX-NEXT: seqz a0, a0 8374; CHECKIZDINXZHINX-NEXT: addi a0, a0, -1 8375; CHECKIZDINXZHINX-NEXT: and a0, a0, a1 8376; CHECKIZDINXZHINX-NEXT: ret 8377; 8378; RV32I-LABEL: fcvt_w_h_sat_sext: 8379; RV32I: # %bb.0: # %start 8380; RV32I-NEXT: addi sp, sp, -32 8381; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8382; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8383; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8384; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8385; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8386; RV32I-NEXT: slli a0, a0, 16 8387; RV32I-NEXT: srli a0, a0, 16 8388; RV32I-NEXT: call __extendhfsf2 8389; RV32I-NEXT: mv s0, a0 8390; RV32I-NEXT: lui a1, 847872 8391; RV32I-NEXT: call __gesf2 8392; RV32I-NEXT: mv s2, a0 8393; RV32I-NEXT: mv a0, s0 8394; RV32I-NEXT: call __fixsfsi 8395; RV32I-NEXT: mv s1, a0 8396; RV32I-NEXT: lui s3, 524288 8397; RV32I-NEXT: bgez s2, .LBB40_2 8398; RV32I-NEXT: # %bb.1: # %start 8399; RV32I-NEXT: lui s1, 524288 8400; RV32I-NEXT: .LBB40_2: # %start 8401; RV32I-NEXT: lui a1, 323584 8402; RV32I-NEXT: addi a1, a1, -1 8403; RV32I-NEXT: mv a0, s0 8404; RV32I-NEXT: call __gtsf2 8405; RV32I-NEXT: blez a0, .LBB40_4 8406; RV32I-NEXT: # %bb.3: # %start 8407; RV32I-NEXT: addi s1, s3, -1 8408; RV32I-NEXT: .LBB40_4: # %start 8409; RV32I-NEXT: mv a0, s0 8410; RV32I-NEXT: mv a1, s0 8411; RV32I-NEXT: call __unordsf2 8412; RV32I-NEXT: snez a0, a0 8413; RV32I-NEXT: addi a0, a0, -1 8414; RV32I-NEXT: and a0, a0, s1 8415; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8416; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8417; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8418; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8419; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8420; RV32I-NEXT: addi sp, sp, 32 8421; RV32I-NEXT: ret 8422; 8423; RV64I-LABEL: fcvt_w_h_sat_sext: 8424; RV64I: # %bb.0: # %start 8425; RV64I-NEXT: addi sp, sp, -48 8426; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8427; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8428; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8429; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8430; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8431; RV64I-NEXT: slli a0, a0, 48 8432; RV64I-NEXT: srli a0, a0, 48 8433; RV64I-NEXT: call __extendhfsf2 8434; RV64I-NEXT: mv s0, a0 8435; RV64I-NEXT: lui a1, 847872 8436; RV64I-NEXT: call __gesf2 8437; RV64I-NEXT: mv s2, a0 8438; RV64I-NEXT: mv a0, s0 8439; RV64I-NEXT: call __fixsfdi 8440; RV64I-NEXT: mv s1, a0 8441; RV64I-NEXT: lui s3, 524288 8442; RV64I-NEXT: bgez s2, .LBB40_2 8443; RV64I-NEXT: # %bb.1: # %start 8444; RV64I-NEXT: lui s1, 524288 8445; RV64I-NEXT: .LBB40_2: # %start 8446; RV64I-NEXT: lui a1, 323584 8447; RV64I-NEXT: addiw a1, a1, -1 8448; RV64I-NEXT: mv a0, s0 8449; RV64I-NEXT: call __gtsf2 8450; RV64I-NEXT: blez a0, .LBB40_4 8451; RV64I-NEXT: # %bb.3: # %start 8452; RV64I-NEXT: addi s1, s3, -1 8453; RV64I-NEXT: .LBB40_4: # %start 8454; RV64I-NEXT: mv a0, s0 8455; RV64I-NEXT: mv a1, s0 8456; RV64I-NEXT: call __unordsf2 8457; RV64I-NEXT: snez a0, a0 8458; RV64I-NEXT: addi a0, a0, -1 8459; RV64I-NEXT: and a0, a0, s1 8460; RV64I-NEXT: sext.w a0, a0 8461; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8462; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8463; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8464; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8465; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8466; RV64I-NEXT: addi sp, sp, 48 8467; RV64I-NEXT: ret 8468; 8469; RV32ID-ILP32-LABEL: fcvt_w_h_sat_sext: 8470; RV32ID-ILP32: # %bb.0: # %start 8471; RV32ID-ILP32-NEXT: addi sp, sp, -16 8472; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 8473; RV32ID-ILP32-NEXT: call __extendhfsf2 8474; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0 8475; RV32ID-ILP32-NEXT: fcvt.w.s a0, fa5, rtz 8476; RV32ID-ILP32-NEXT: feq.s a1, fa5, fa5 8477; RV32ID-ILP32-NEXT: seqz a1, a1 8478; RV32ID-ILP32-NEXT: addi a1, a1, -1 8479; RV32ID-ILP32-NEXT: and a0, a1, a0 8480; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 8481; RV32ID-ILP32-NEXT: addi sp, sp, 16 8482; RV32ID-ILP32-NEXT: ret 8483; 8484; RV64ID-LP64-LABEL: fcvt_w_h_sat_sext: 8485; RV64ID-LP64: # %bb.0: # %start 8486; RV64ID-LP64-NEXT: addi sp, sp, -16 8487; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8488; RV64ID-LP64-NEXT: call __extendhfsf2 8489; RV64ID-LP64-NEXT: fmv.w.x fa5, a0 8490; RV64ID-LP64-NEXT: fcvt.w.s a0, fa5, rtz 8491; RV64ID-LP64-NEXT: feq.s a1, fa5, fa5 8492; RV64ID-LP64-NEXT: seqz a1, a1 8493; RV64ID-LP64-NEXT: addi a1, a1, -1 8494; RV64ID-LP64-NEXT: and a0, a1, a0 8495; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8496; RV64ID-LP64-NEXT: addi sp, sp, 16 8497; RV64ID-LP64-NEXT: ret 8498; 8499; RV32ID-LABEL: fcvt_w_h_sat_sext: 8500; RV32ID: # %bb.0: # %start 8501; RV32ID-NEXT: addi sp, sp, -16 8502; RV32ID-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 8503; RV32ID-NEXT: call __extendhfsf2 8504; RV32ID-NEXT: fcvt.w.s a0, fa0, rtz 8505; RV32ID-NEXT: feq.s a1, fa0, fa0 8506; RV32ID-NEXT: seqz a1, a1 8507; RV32ID-NEXT: addi a1, a1, -1 8508; RV32ID-NEXT: and a0, a1, a0 8509; RV32ID-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 8510; RV32ID-NEXT: addi sp, sp, 16 8511; RV32ID-NEXT: ret 8512; 8513; RV64ID-LABEL: fcvt_w_h_sat_sext: 8514; RV64ID: # %bb.0: # %start 8515; RV64ID-NEXT: addi sp, sp, -16 8516; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8517; RV64ID-NEXT: call __extendhfsf2 8518; RV64ID-NEXT: fcvt.w.s a0, fa0, rtz 8519; RV64ID-NEXT: feq.s a1, fa0, fa0 8520; RV64ID-NEXT: seqz a1, a1 8521; RV64ID-NEXT: addi a1, a1, -1 8522; RV64ID-NEXT: and a0, a1, a0 8523; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8524; RV64ID-NEXT: addi sp, sp, 16 8525; RV64ID-NEXT: ret 8526; 8527; CHECK32-IZFHMIN-LABEL: fcvt_w_h_sat_sext: 8528; CHECK32-IZFHMIN: # %bb.0: # %start 8529; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 8530; CHECK32-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 8531; CHECK32-IZFHMIN-NEXT: feq.s a1, fa5, fa5 8532; CHECK32-IZFHMIN-NEXT: seqz a1, a1 8533; CHECK32-IZFHMIN-NEXT: addi a1, a1, -1 8534; CHECK32-IZFHMIN-NEXT: and a0, a1, a0 8535; CHECK32-IZFHMIN-NEXT: ret 8536; 8537; CHECK64-IZFHMIN-LABEL: fcvt_w_h_sat_sext: 8538; CHECK64-IZFHMIN: # %bb.0: # %start 8539; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa5, fa0 8540; CHECK64-IZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz 8541; CHECK64-IZFHMIN-NEXT: feq.s a1, fa5, fa5 8542; CHECK64-IZFHMIN-NEXT: seqz a1, a1 8543; CHECK64-IZFHMIN-NEXT: addi a1, a1, -1 8544; CHECK64-IZFHMIN-NEXT: and a0, a1, a0 8545; CHECK64-IZFHMIN-NEXT: ret 8546; 8547; CHECK32-IZHINXMIN-LABEL: fcvt_w_h_sat_sext: 8548; CHECK32-IZHINXMIN: # %bb.0: # %start 8549; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8550; CHECK32-IZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 8551; CHECK32-IZHINXMIN-NEXT: feq.s a0, a0, a0 8552; CHECK32-IZHINXMIN-NEXT: seqz a0, a0 8553; CHECK32-IZHINXMIN-NEXT: addi a0, a0, -1 8554; CHECK32-IZHINXMIN-NEXT: and a0, a0, a1 8555; CHECK32-IZHINXMIN-NEXT: ret 8556; 8557; CHECK64-IZHINXMIN-LABEL: fcvt_w_h_sat_sext: 8558; CHECK64-IZHINXMIN: # %bb.0: # %start 8559; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 8560; CHECK64-IZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 8561; CHECK64-IZHINXMIN-NEXT: feq.s a0, a0, a0 8562; CHECK64-IZHINXMIN-NEXT: seqz a0, a0 8563; CHECK64-IZHINXMIN-NEXT: addi a0, a0, -1 8564; CHECK64-IZHINXMIN-NEXT: and a0, a0, a1 8565; CHECK64-IZHINXMIN-NEXT: ret 8566; 8567; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat_sext: 8568; CHECK32-IZDINXZHINXMIN: # %bb.0: # %start 8569; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8570; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 8571; CHECK32-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 8572; CHECK32-IZDINXZHINXMIN-NEXT: seqz a0, a0 8573; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 8574; CHECK32-IZDINXZHINXMIN-NEXT: and a0, a0, a1 8575; CHECK32-IZDINXZHINXMIN-NEXT: ret 8576; 8577; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_w_h_sat_sext: 8578; CHECK64-IZDINXZHINXMIN: # %bb.0: # %start 8579; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 8580; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz 8581; CHECK64-IZDINXZHINXMIN-NEXT: feq.s a0, a0, a0 8582; CHECK64-IZDINXZHINXMIN-NEXT: seqz a0, a0 8583; CHECK64-IZDINXZHINXMIN-NEXT: addi a0, a0, -1 8584; CHECK64-IZDINXZHINXMIN-NEXT: and a0, a0, a1 8585; CHECK64-IZDINXZHINXMIN-NEXT: ret 8586start: 8587 %0 = tail call i32 @llvm.fptosi.sat.i32.f16(half %a) 8588 ret i32 %0 8589} 8590 8591; Test lib call lowering for fp128->half to make sure it matches the ABI. 8592define void @fcvt_h_q(fp128 %x, ptr %y) nounwind { 8593; RV32IZFH-LABEL: fcvt_h_q: 8594; RV32IZFH: # %bb.0: 8595; RV32IZFH-NEXT: addi sp, sp, -32 8596; RV32IZFH-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8597; RV32IZFH-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8598; RV32IZFH-NEXT: lw a2, 0(a0) 8599; RV32IZFH-NEXT: lw a3, 4(a0) 8600; RV32IZFH-NEXT: lw a4, 8(a0) 8601; RV32IZFH-NEXT: lw a5, 12(a0) 8602; RV32IZFH-NEXT: mv s0, a1 8603; RV32IZFH-NEXT: addi a0, sp, 8 8604; RV32IZFH-NEXT: sw a2, 8(sp) 8605; RV32IZFH-NEXT: sw a3, 12(sp) 8606; RV32IZFH-NEXT: sw a4, 16(sp) 8607; RV32IZFH-NEXT: sw a5, 20(sp) 8608; RV32IZFH-NEXT: call __trunctfhf2 8609; RV32IZFH-NEXT: fsh fa0, 0(s0) 8610; RV32IZFH-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8611; RV32IZFH-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8612; RV32IZFH-NEXT: addi sp, sp, 32 8613; RV32IZFH-NEXT: ret 8614; 8615; RV64IZFH-LABEL: fcvt_h_q: 8616; RV64IZFH: # %bb.0: 8617; RV64IZFH-NEXT: addi sp, sp, -16 8618; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8619; RV64IZFH-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8620; RV64IZFH-NEXT: mv s0, a2 8621; RV64IZFH-NEXT: call __trunctfhf2 8622; RV64IZFH-NEXT: fsh fa0, 0(s0) 8623; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8624; RV64IZFH-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8625; RV64IZFH-NEXT: addi sp, sp, 16 8626; RV64IZFH-NEXT: ret 8627; 8628; RV32IDZFH-LABEL: fcvt_h_q: 8629; RV32IDZFH: # %bb.0: 8630; RV32IDZFH-NEXT: addi sp, sp, -32 8631; RV32IDZFH-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8632; RV32IDZFH-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8633; RV32IDZFH-NEXT: lw a2, 0(a0) 8634; RV32IDZFH-NEXT: lw a3, 4(a0) 8635; RV32IDZFH-NEXT: lw a4, 8(a0) 8636; RV32IDZFH-NEXT: lw a5, 12(a0) 8637; RV32IDZFH-NEXT: mv s0, a1 8638; RV32IDZFH-NEXT: addi a0, sp, 8 8639; RV32IDZFH-NEXT: sw a2, 8(sp) 8640; RV32IDZFH-NEXT: sw a3, 12(sp) 8641; RV32IDZFH-NEXT: sw a4, 16(sp) 8642; RV32IDZFH-NEXT: sw a5, 20(sp) 8643; RV32IDZFH-NEXT: call __trunctfhf2 8644; RV32IDZFH-NEXT: fsh fa0, 0(s0) 8645; RV32IDZFH-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8646; RV32IDZFH-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8647; RV32IDZFH-NEXT: addi sp, sp, 32 8648; RV32IDZFH-NEXT: ret 8649; 8650; RV64IDZFH-LABEL: fcvt_h_q: 8651; RV64IDZFH: # %bb.0: 8652; RV64IDZFH-NEXT: addi sp, sp, -16 8653; RV64IDZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8654; RV64IDZFH-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8655; RV64IDZFH-NEXT: mv s0, a2 8656; RV64IDZFH-NEXT: call __trunctfhf2 8657; RV64IDZFH-NEXT: fsh fa0, 0(s0) 8658; RV64IDZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8659; RV64IDZFH-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8660; RV64IDZFH-NEXT: addi sp, sp, 16 8661; RV64IDZFH-NEXT: ret 8662; 8663; RV32IZHINX-LABEL: fcvt_h_q: 8664; RV32IZHINX: # %bb.0: 8665; RV32IZHINX-NEXT: addi sp, sp, -32 8666; RV32IZHINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8667; RV32IZHINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8668; RV32IZHINX-NEXT: lw a2, 0(a0) 8669; RV32IZHINX-NEXT: lw a3, 4(a0) 8670; RV32IZHINX-NEXT: lw a4, 8(a0) 8671; RV32IZHINX-NEXT: lw a5, 12(a0) 8672; RV32IZHINX-NEXT: mv s0, a1 8673; RV32IZHINX-NEXT: addi a0, sp, 8 8674; RV32IZHINX-NEXT: sw a2, 8(sp) 8675; RV32IZHINX-NEXT: sw a3, 12(sp) 8676; RV32IZHINX-NEXT: sw a4, 16(sp) 8677; RV32IZHINX-NEXT: sw a5, 20(sp) 8678; RV32IZHINX-NEXT: call __trunctfhf2 8679; RV32IZHINX-NEXT: sh a0, 0(s0) 8680; RV32IZHINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8681; RV32IZHINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8682; RV32IZHINX-NEXT: addi sp, sp, 32 8683; RV32IZHINX-NEXT: ret 8684; 8685; RV64IZHINX-LABEL: fcvt_h_q: 8686; RV64IZHINX: # %bb.0: 8687; RV64IZHINX-NEXT: addi sp, sp, -16 8688; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8689; RV64IZHINX-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8690; RV64IZHINX-NEXT: mv s0, a2 8691; RV64IZHINX-NEXT: call __trunctfhf2 8692; RV64IZHINX-NEXT: sh a0, 0(s0) 8693; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8694; RV64IZHINX-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8695; RV64IZHINX-NEXT: addi sp, sp, 16 8696; RV64IZHINX-NEXT: ret 8697; 8698; RV32IZDINXZHINX-LABEL: fcvt_h_q: 8699; RV32IZDINXZHINX: # %bb.0: 8700; RV32IZDINXZHINX-NEXT: addi sp, sp, -32 8701; RV32IZDINXZHINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8702; RV32IZDINXZHINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8703; RV32IZDINXZHINX-NEXT: lw a2, 0(a0) 8704; RV32IZDINXZHINX-NEXT: lw a3, 4(a0) 8705; RV32IZDINXZHINX-NEXT: lw a4, 8(a0) 8706; RV32IZDINXZHINX-NEXT: lw a5, 12(a0) 8707; RV32IZDINXZHINX-NEXT: mv s0, a1 8708; RV32IZDINXZHINX-NEXT: addi a0, sp, 8 8709; RV32IZDINXZHINX-NEXT: sw a2, 8(sp) 8710; RV32IZDINXZHINX-NEXT: sw a3, 12(sp) 8711; RV32IZDINXZHINX-NEXT: sw a4, 16(sp) 8712; RV32IZDINXZHINX-NEXT: sw a5, 20(sp) 8713; RV32IZDINXZHINX-NEXT: call __trunctfhf2 8714; RV32IZDINXZHINX-NEXT: sh a0, 0(s0) 8715; RV32IZDINXZHINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8716; RV32IZDINXZHINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8717; RV32IZDINXZHINX-NEXT: addi sp, sp, 32 8718; RV32IZDINXZHINX-NEXT: ret 8719; 8720; RV64IZDINXZHINX-LABEL: fcvt_h_q: 8721; RV64IZDINXZHINX: # %bb.0: 8722; RV64IZDINXZHINX-NEXT: addi sp, sp, -16 8723; RV64IZDINXZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8724; RV64IZDINXZHINX-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8725; RV64IZDINXZHINX-NEXT: mv s0, a2 8726; RV64IZDINXZHINX-NEXT: call __trunctfhf2 8727; RV64IZDINXZHINX-NEXT: sh a0, 0(s0) 8728; RV64IZDINXZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8729; RV64IZDINXZHINX-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8730; RV64IZDINXZHINX-NEXT: addi sp, sp, 16 8731; RV64IZDINXZHINX-NEXT: ret 8732; 8733; RV32I-LABEL: fcvt_h_q: 8734; RV32I: # %bb.0: 8735; RV32I-NEXT: addi sp, sp, -32 8736; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8737; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8738; RV32I-NEXT: lw a2, 0(a0) 8739; RV32I-NEXT: lw a3, 4(a0) 8740; RV32I-NEXT: lw a4, 8(a0) 8741; RV32I-NEXT: lw a5, 12(a0) 8742; RV32I-NEXT: mv s0, a1 8743; RV32I-NEXT: addi a0, sp, 8 8744; RV32I-NEXT: sw a2, 8(sp) 8745; RV32I-NEXT: sw a3, 12(sp) 8746; RV32I-NEXT: sw a4, 16(sp) 8747; RV32I-NEXT: sw a5, 20(sp) 8748; RV32I-NEXT: call __trunctfhf2 8749; RV32I-NEXT: sh a0, 0(s0) 8750; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8751; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8752; RV32I-NEXT: addi sp, sp, 32 8753; RV32I-NEXT: ret 8754; 8755; RV64I-LABEL: fcvt_h_q: 8756; RV64I: # %bb.0: 8757; RV64I-NEXT: addi sp, sp, -16 8758; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8759; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8760; RV64I-NEXT: mv s0, a2 8761; RV64I-NEXT: call __trunctfhf2 8762; RV64I-NEXT: sh a0, 0(s0) 8763; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8764; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8765; RV64I-NEXT: addi sp, sp, 16 8766; RV64I-NEXT: ret 8767; 8768; RV32ID-ILP32-LABEL: fcvt_h_q: 8769; RV32ID-ILP32: # %bb.0: 8770; RV32ID-ILP32-NEXT: addi sp, sp, -32 8771; RV32ID-ILP32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8772; RV32ID-ILP32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8773; RV32ID-ILP32-NEXT: lw a2, 0(a0) 8774; RV32ID-ILP32-NEXT: lw a3, 4(a0) 8775; RV32ID-ILP32-NEXT: lw a4, 8(a0) 8776; RV32ID-ILP32-NEXT: lw a5, 12(a0) 8777; RV32ID-ILP32-NEXT: mv s0, a1 8778; RV32ID-ILP32-NEXT: addi a0, sp, 8 8779; RV32ID-ILP32-NEXT: sw a2, 8(sp) 8780; RV32ID-ILP32-NEXT: sw a3, 12(sp) 8781; RV32ID-ILP32-NEXT: sw a4, 16(sp) 8782; RV32ID-ILP32-NEXT: sw a5, 20(sp) 8783; RV32ID-ILP32-NEXT: call __trunctfhf2 8784; RV32ID-ILP32-NEXT: sh a0, 0(s0) 8785; RV32ID-ILP32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8786; RV32ID-ILP32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8787; RV32ID-ILP32-NEXT: addi sp, sp, 32 8788; RV32ID-ILP32-NEXT: ret 8789; 8790; RV64ID-LP64-LABEL: fcvt_h_q: 8791; RV64ID-LP64: # %bb.0: 8792; RV64ID-LP64-NEXT: addi sp, sp, -16 8793; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8794; RV64ID-LP64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8795; RV64ID-LP64-NEXT: mv s0, a2 8796; RV64ID-LP64-NEXT: call __trunctfhf2 8797; RV64ID-LP64-NEXT: sh a0, 0(s0) 8798; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8799; RV64ID-LP64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8800; RV64ID-LP64-NEXT: addi sp, sp, 16 8801; RV64ID-LP64-NEXT: ret 8802; 8803; RV32ID-LABEL: fcvt_h_q: 8804; RV32ID: # %bb.0: 8805; RV32ID-NEXT: addi sp, sp, -32 8806; RV32ID-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8807; RV32ID-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8808; RV32ID-NEXT: lw a2, 0(a0) 8809; RV32ID-NEXT: lw a3, 4(a0) 8810; RV32ID-NEXT: lw a4, 8(a0) 8811; RV32ID-NEXT: lw a5, 12(a0) 8812; RV32ID-NEXT: mv s0, a1 8813; RV32ID-NEXT: addi a0, sp, 8 8814; RV32ID-NEXT: sw a2, 8(sp) 8815; RV32ID-NEXT: sw a3, 12(sp) 8816; RV32ID-NEXT: sw a4, 16(sp) 8817; RV32ID-NEXT: sw a5, 20(sp) 8818; RV32ID-NEXT: call __trunctfhf2 8819; RV32ID-NEXT: fmv.x.w a0, fa0 8820; RV32ID-NEXT: sh a0, 0(s0) 8821; RV32ID-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8822; RV32ID-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8823; RV32ID-NEXT: addi sp, sp, 32 8824; RV32ID-NEXT: ret 8825; 8826; RV64ID-LABEL: fcvt_h_q: 8827; RV64ID: # %bb.0: 8828; RV64ID-NEXT: addi sp, sp, -16 8829; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8830; RV64ID-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8831; RV64ID-NEXT: mv s0, a2 8832; RV64ID-NEXT: call __trunctfhf2 8833; RV64ID-NEXT: fmv.x.w a0, fa0 8834; RV64ID-NEXT: sh a0, 0(s0) 8835; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8836; RV64ID-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8837; RV64ID-NEXT: addi sp, sp, 16 8838; RV64ID-NEXT: ret 8839; 8840; CHECK32-IZFHMIN-LABEL: fcvt_h_q: 8841; CHECK32-IZFHMIN: # %bb.0: 8842; CHECK32-IZFHMIN-NEXT: addi sp, sp, -32 8843; CHECK32-IZFHMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8844; CHECK32-IZFHMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8845; CHECK32-IZFHMIN-NEXT: lw a2, 0(a0) 8846; CHECK32-IZFHMIN-NEXT: lw a3, 4(a0) 8847; CHECK32-IZFHMIN-NEXT: lw a4, 8(a0) 8848; CHECK32-IZFHMIN-NEXT: lw a5, 12(a0) 8849; CHECK32-IZFHMIN-NEXT: mv s0, a1 8850; CHECK32-IZFHMIN-NEXT: addi a0, sp, 8 8851; CHECK32-IZFHMIN-NEXT: sw a2, 8(sp) 8852; CHECK32-IZFHMIN-NEXT: sw a3, 12(sp) 8853; CHECK32-IZFHMIN-NEXT: sw a4, 16(sp) 8854; CHECK32-IZFHMIN-NEXT: sw a5, 20(sp) 8855; CHECK32-IZFHMIN-NEXT: call __trunctfhf2 8856; CHECK32-IZFHMIN-NEXT: fsh fa0, 0(s0) 8857; CHECK32-IZFHMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8858; CHECK32-IZFHMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8859; CHECK32-IZFHMIN-NEXT: addi sp, sp, 32 8860; CHECK32-IZFHMIN-NEXT: ret 8861; 8862; CHECK64-IZFHMIN-LABEL: fcvt_h_q: 8863; CHECK64-IZFHMIN: # %bb.0: 8864; CHECK64-IZFHMIN-NEXT: addi sp, sp, -16 8865; CHECK64-IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8866; CHECK64-IZFHMIN-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8867; CHECK64-IZFHMIN-NEXT: mv s0, a2 8868; CHECK64-IZFHMIN-NEXT: call __trunctfhf2 8869; CHECK64-IZFHMIN-NEXT: fsh fa0, 0(s0) 8870; CHECK64-IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8871; CHECK64-IZFHMIN-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8872; CHECK64-IZFHMIN-NEXT: addi sp, sp, 16 8873; CHECK64-IZFHMIN-NEXT: ret 8874; 8875; CHECK32-IZHINXMIN-LABEL: fcvt_h_q: 8876; CHECK32-IZHINXMIN: # %bb.0: 8877; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -32 8878; CHECK32-IZHINXMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8879; CHECK32-IZHINXMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8880; CHECK32-IZHINXMIN-NEXT: lw a2, 0(a0) 8881; CHECK32-IZHINXMIN-NEXT: lw a3, 4(a0) 8882; CHECK32-IZHINXMIN-NEXT: lw a4, 8(a0) 8883; CHECK32-IZHINXMIN-NEXT: lw a5, 12(a0) 8884; CHECK32-IZHINXMIN-NEXT: mv s0, a1 8885; CHECK32-IZHINXMIN-NEXT: addi a0, sp, 8 8886; CHECK32-IZHINXMIN-NEXT: sw a2, 8(sp) 8887; CHECK32-IZHINXMIN-NEXT: sw a3, 12(sp) 8888; CHECK32-IZHINXMIN-NEXT: sw a4, 16(sp) 8889; CHECK32-IZHINXMIN-NEXT: sw a5, 20(sp) 8890; CHECK32-IZHINXMIN-NEXT: call __trunctfhf2 8891; CHECK32-IZHINXMIN-NEXT: sh a0, 0(s0) 8892; CHECK32-IZHINXMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8893; CHECK32-IZHINXMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8894; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 32 8895; CHECK32-IZHINXMIN-NEXT: ret 8896; 8897; CHECK64-IZHINXMIN-LABEL: fcvt_h_q: 8898; CHECK64-IZHINXMIN: # %bb.0: 8899; CHECK64-IZHINXMIN-NEXT: addi sp, sp, -16 8900; CHECK64-IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8901; CHECK64-IZHINXMIN-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8902; CHECK64-IZHINXMIN-NEXT: mv s0, a2 8903; CHECK64-IZHINXMIN-NEXT: call __trunctfhf2 8904; CHECK64-IZHINXMIN-NEXT: sh a0, 0(s0) 8905; CHECK64-IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8906; CHECK64-IZHINXMIN-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8907; CHECK64-IZHINXMIN-NEXT: addi sp, sp, 16 8908; CHECK64-IZHINXMIN-NEXT: ret 8909; 8910; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_h_q: 8911; CHECK32-IZDINXZHINXMIN: # %bb.0: 8912; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -32 8913; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8914; CHECK32-IZDINXZHINXMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8915; CHECK32-IZDINXZHINXMIN-NEXT: lw a2, 0(a0) 8916; CHECK32-IZDINXZHINXMIN-NEXT: lw a3, 4(a0) 8917; CHECK32-IZDINXZHINXMIN-NEXT: lw a4, 8(a0) 8918; CHECK32-IZDINXZHINXMIN-NEXT: lw a5, 12(a0) 8919; CHECK32-IZDINXZHINXMIN-NEXT: mv s0, a1 8920; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, sp, 8 8921; CHECK32-IZDINXZHINXMIN-NEXT: sw a2, 8(sp) 8922; CHECK32-IZDINXZHINXMIN-NEXT: sw a3, 12(sp) 8923; CHECK32-IZDINXZHINXMIN-NEXT: sw a4, 16(sp) 8924; CHECK32-IZDINXZHINXMIN-NEXT: sw a5, 20(sp) 8925; CHECK32-IZDINXZHINXMIN-NEXT: call __trunctfhf2 8926; CHECK32-IZDINXZHINXMIN-NEXT: sh a0, 0(s0) 8927; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8928; CHECK32-IZDINXZHINXMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8929; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 32 8930; CHECK32-IZDINXZHINXMIN-NEXT: ret 8931; 8932; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_q: 8933; CHECK64-IZDINXZHINXMIN: # %bb.0: 8934; CHECK64-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 8935; CHECK64-IZDINXZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8936; CHECK64-IZDINXZHINXMIN-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 8937; CHECK64-IZDINXZHINXMIN-NEXT: mv s0, a2 8938; CHECK64-IZDINXZHINXMIN-NEXT: call __trunctfhf2 8939; CHECK64-IZDINXZHINXMIN-NEXT: sh a0, 0(s0) 8940; CHECK64-IZDINXZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8941; CHECK64-IZDINXZHINXMIN-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 8942; CHECK64-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 8943; CHECK64-IZDINXZHINXMIN-NEXT: ret 8944 %a = fptrunc fp128 %x to half 8945 store half %a, ptr %y 8946 ret void 8947} 8948 8949; Test lib call lowering for half->fp128 to make sure it follows the ABI. 8950define fp128 @fcvt_q_h(ptr %x) { 8951; RV32IZFH-LABEL: fcvt_q_h: 8952; RV32IZFH: # %bb.0: 8953; RV32IZFH-NEXT: addi sp, sp, -32 8954; RV32IZFH-NEXT: .cfi_def_cfa_offset 32 8955; RV32IZFH-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8956; RV32IZFH-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8957; RV32IZFH-NEXT: .cfi_offset ra, -4 8958; RV32IZFH-NEXT: .cfi_offset s0, -8 8959; RV32IZFH-NEXT: mv s0, a0 8960; RV32IZFH-NEXT: flh fa5, 0(a1) 8961; RV32IZFH-NEXT: fcvt.s.h fa0, fa5 8962; RV32IZFH-NEXT: addi a0, sp, 8 8963; RV32IZFH-NEXT: call __extendsftf2 8964; RV32IZFH-NEXT: lw a0, 8(sp) 8965; RV32IZFH-NEXT: lw a1, 12(sp) 8966; RV32IZFH-NEXT: lw a2, 16(sp) 8967; RV32IZFH-NEXT: lw a3, 20(sp) 8968; RV32IZFH-NEXT: sw a0, 0(s0) 8969; RV32IZFH-NEXT: sw a1, 4(s0) 8970; RV32IZFH-NEXT: sw a2, 8(s0) 8971; RV32IZFH-NEXT: sw a3, 12(s0) 8972; RV32IZFH-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8973; RV32IZFH-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8974; RV32IZFH-NEXT: .cfi_restore ra 8975; RV32IZFH-NEXT: .cfi_restore s0 8976; RV32IZFH-NEXT: addi sp, sp, 32 8977; RV32IZFH-NEXT: .cfi_def_cfa_offset 0 8978; RV32IZFH-NEXT: ret 8979; 8980; RV64IZFH-LABEL: fcvt_q_h: 8981; RV64IZFH: # %bb.0: 8982; RV64IZFH-NEXT: addi sp, sp, -16 8983; RV64IZFH-NEXT: .cfi_def_cfa_offset 16 8984; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 8985; RV64IZFH-NEXT: .cfi_offset ra, -8 8986; RV64IZFH-NEXT: flh fa5, 0(a0) 8987; RV64IZFH-NEXT: fcvt.s.h fa0, fa5 8988; RV64IZFH-NEXT: call __extendsftf2 8989; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8990; RV64IZFH-NEXT: .cfi_restore ra 8991; RV64IZFH-NEXT: addi sp, sp, 16 8992; RV64IZFH-NEXT: .cfi_def_cfa_offset 0 8993; RV64IZFH-NEXT: ret 8994; 8995; RV32IDZFH-LABEL: fcvt_q_h: 8996; RV32IDZFH: # %bb.0: 8997; RV32IDZFH-NEXT: addi sp, sp, -32 8998; RV32IDZFH-NEXT: .cfi_def_cfa_offset 32 8999; RV32IDZFH-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9000; RV32IDZFH-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9001; RV32IDZFH-NEXT: .cfi_offset ra, -4 9002; RV32IDZFH-NEXT: .cfi_offset s0, -8 9003; RV32IDZFH-NEXT: mv s0, a0 9004; RV32IDZFH-NEXT: flh fa5, 0(a1) 9005; RV32IDZFH-NEXT: fcvt.s.h fa0, fa5 9006; RV32IDZFH-NEXT: addi a0, sp, 8 9007; RV32IDZFH-NEXT: call __extendsftf2 9008; RV32IDZFH-NEXT: lw a0, 8(sp) 9009; RV32IDZFH-NEXT: lw a1, 12(sp) 9010; RV32IDZFH-NEXT: lw a2, 16(sp) 9011; RV32IDZFH-NEXT: lw a3, 20(sp) 9012; RV32IDZFH-NEXT: sw a0, 0(s0) 9013; RV32IDZFH-NEXT: sw a1, 4(s0) 9014; RV32IDZFH-NEXT: sw a2, 8(s0) 9015; RV32IDZFH-NEXT: sw a3, 12(s0) 9016; RV32IDZFH-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9017; RV32IDZFH-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9018; RV32IDZFH-NEXT: .cfi_restore ra 9019; RV32IDZFH-NEXT: .cfi_restore s0 9020; RV32IDZFH-NEXT: addi sp, sp, 32 9021; RV32IDZFH-NEXT: .cfi_def_cfa_offset 0 9022; RV32IDZFH-NEXT: ret 9023; 9024; RV64IDZFH-LABEL: fcvt_q_h: 9025; RV64IDZFH: # %bb.0: 9026; RV64IDZFH-NEXT: addi sp, sp, -16 9027; RV64IDZFH-NEXT: .cfi_def_cfa_offset 16 9028; RV64IDZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9029; RV64IDZFH-NEXT: .cfi_offset ra, -8 9030; RV64IDZFH-NEXT: flh fa5, 0(a0) 9031; RV64IDZFH-NEXT: fcvt.s.h fa0, fa5 9032; RV64IDZFH-NEXT: call __extendsftf2 9033; RV64IDZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9034; RV64IDZFH-NEXT: .cfi_restore ra 9035; RV64IDZFH-NEXT: addi sp, sp, 16 9036; RV64IDZFH-NEXT: .cfi_def_cfa_offset 0 9037; RV64IDZFH-NEXT: ret 9038; 9039; RV32IZHINX-LABEL: fcvt_q_h: 9040; RV32IZHINX: # %bb.0: 9041; RV32IZHINX-NEXT: addi sp, sp, -32 9042; RV32IZHINX-NEXT: .cfi_def_cfa_offset 32 9043; RV32IZHINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9044; RV32IZHINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9045; RV32IZHINX-NEXT: .cfi_offset ra, -4 9046; RV32IZHINX-NEXT: .cfi_offset s0, -8 9047; RV32IZHINX-NEXT: mv s0, a0 9048; RV32IZHINX-NEXT: lh a0, 0(a1) 9049; RV32IZHINX-NEXT: fcvt.s.h a1, a0 9050; RV32IZHINX-NEXT: addi a0, sp, 8 9051; RV32IZHINX-NEXT: call __extendsftf2 9052; RV32IZHINX-NEXT: lw a0, 8(sp) 9053; RV32IZHINX-NEXT: lw a1, 12(sp) 9054; RV32IZHINX-NEXT: lw a2, 16(sp) 9055; RV32IZHINX-NEXT: lw a3, 20(sp) 9056; RV32IZHINX-NEXT: sw a0, 0(s0) 9057; RV32IZHINX-NEXT: sw a1, 4(s0) 9058; RV32IZHINX-NEXT: sw a2, 8(s0) 9059; RV32IZHINX-NEXT: sw a3, 12(s0) 9060; RV32IZHINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9061; RV32IZHINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9062; RV32IZHINX-NEXT: .cfi_restore ra 9063; RV32IZHINX-NEXT: .cfi_restore s0 9064; RV32IZHINX-NEXT: addi sp, sp, 32 9065; RV32IZHINX-NEXT: .cfi_def_cfa_offset 0 9066; RV32IZHINX-NEXT: ret 9067; 9068; RV64IZHINX-LABEL: fcvt_q_h: 9069; RV64IZHINX: # %bb.0: 9070; RV64IZHINX-NEXT: addi sp, sp, -16 9071; RV64IZHINX-NEXT: .cfi_def_cfa_offset 16 9072; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9073; RV64IZHINX-NEXT: .cfi_offset ra, -8 9074; RV64IZHINX-NEXT: lh a0, 0(a0) 9075; RV64IZHINX-NEXT: fcvt.s.h a0, a0 9076; RV64IZHINX-NEXT: call __extendsftf2 9077; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9078; RV64IZHINX-NEXT: .cfi_restore ra 9079; RV64IZHINX-NEXT: addi sp, sp, 16 9080; RV64IZHINX-NEXT: .cfi_def_cfa_offset 0 9081; RV64IZHINX-NEXT: ret 9082; 9083; RV32IZDINXZHINX-LABEL: fcvt_q_h: 9084; RV32IZDINXZHINX: # %bb.0: 9085; RV32IZDINXZHINX-NEXT: addi sp, sp, -32 9086; RV32IZDINXZHINX-NEXT: .cfi_def_cfa_offset 32 9087; RV32IZDINXZHINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9088; RV32IZDINXZHINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9089; RV32IZDINXZHINX-NEXT: .cfi_offset ra, -4 9090; RV32IZDINXZHINX-NEXT: .cfi_offset s0, -8 9091; RV32IZDINXZHINX-NEXT: mv s0, a0 9092; RV32IZDINXZHINX-NEXT: lh a0, 0(a1) 9093; RV32IZDINXZHINX-NEXT: fcvt.s.h a1, a0 9094; RV32IZDINXZHINX-NEXT: addi a0, sp, 8 9095; RV32IZDINXZHINX-NEXT: call __extendsftf2 9096; RV32IZDINXZHINX-NEXT: lw a0, 8(sp) 9097; RV32IZDINXZHINX-NEXT: lw a1, 12(sp) 9098; RV32IZDINXZHINX-NEXT: lw a2, 16(sp) 9099; RV32IZDINXZHINX-NEXT: lw a3, 20(sp) 9100; RV32IZDINXZHINX-NEXT: sw a0, 0(s0) 9101; RV32IZDINXZHINX-NEXT: sw a1, 4(s0) 9102; RV32IZDINXZHINX-NEXT: sw a2, 8(s0) 9103; RV32IZDINXZHINX-NEXT: sw a3, 12(s0) 9104; RV32IZDINXZHINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9105; RV32IZDINXZHINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9106; RV32IZDINXZHINX-NEXT: .cfi_restore ra 9107; RV32IZDINXZHINX-NEXT: .cfi_restore s0 9108; RV32IZDINXZHINX-NEXT: addi sp, sp, 32 9109; RV32IZDINXZHINX-NEXT: .cfi_def_cfa_offset 0 9110; RV32IZDINXZHINX-NEXT: ret 9111; 9112; RV64IZDINXZHINX-LABEL: fcvt_q_h: 9113; RV64IZDINXZHINX: # %bb.0: 9114; RV64IZDINXZHINX-NEXT: addi sp, sp, -16 9115; RV64IZDINXZHINX-NEXT: .cfi_def_cfa_offset 16 9116; RV64IZDINXZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9117; RV64IZDINXZHINX-NEXT: .cfi_offset ra, -8 9118; RV64IZDINXZHINX-NEXT: lh a0, 0(a0) 9119; RV64IZDINXZHINX-NEXT: fcvt.s.h a0, a0 9120; RV64IZDINXZHINX-NEXT: call __extendsftf2 9121; RV64IZDINXZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9122; RV64IZDINXZHINX-NEXT: .cfi_restore ra 9123; RV64IZDINXZHINX-NEXT: addi sp, sp, 16 9124; RV64IZDINXZHINX-NEXT: .cfi_def_cfa_offset 0 9125; RV64IZDINXZHINX-NEXT: ret 9126; 9127; RV32I-LABEL: fcvt_q_h: 9128; RV32I: # %bb.0: 9129; RV32I-NEXT: addi sp, sp, -32 9130; RV32I-NEXT: .cfi_def_cfa_offset 32 9131; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9132; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9133; RV32I-NEXT: .cfi_offset ra, -4 9134; RV32I-NEXT: .cfi_offset s0, -8 9135; RV32I-NEXT: mv s0, a0 9136; RV32I-NEXT: lh a0, 0(a1) 9137; RV32I-NEXT: call __extendhfsf2 9138; RV32I-NEXT: mv a1, a0 9139; RV32I-NEXT: addi a0, sp, 8 9140; RV32I-NEXT: call __extendsftf2 9141; RV32I-NEXT: lw a0, 8(sp) 9142; RV32I-NEXT: lw a1, 12(sp) 9143; RV32I-NEXT: lw a2, 16(sp) 9144; RV32I-NEXT: lw a3, 20(sp) 9145; RV32I-NEXT: sw a0, 0(s0) 9146; RV32I-NEXT: sw a1, 4(s0) 9147; RV32I-NEXT: sw a2, 8(s0) 9148; RV32I-NEXT: sw a3, 12(s0) 9149; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9150; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9151; RV32I-NEXT: .cfi_restore ra 9152; RV32I-NEXT: .cfi_restore s0 9153; RV32I-NEXT: addi sp, sp, 32 9154; RV32I-NEXT: .cfi_def_cfa_offset 0 9155; RV32I-NEXT: ret 9156; 9157; RV64I-LABEL: fcvt_q_h: 9158; RV64I: # %bb.0: 9159; RV64I-NEXT: addi sp, sp, -16 9160; RV64I-NEXT: .cfi_def_cfa_offset 16 9161; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9162; RV64I-NEXT: .cfi_offset ra, -8 9163; RV64I-NEXT: lh a0, 0(a0) 9164; RV64I-NEXT: call __extendhfsf2 9165; RV64I-NEXT: call __extendsftf2 9166; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9167; RV64I-NEXT: .cfi_restore ra 9168; RV64I-NEXT: addi sp, sp, 16 9169; RV64I-NEXT: .cfi_def_cfa_offset 0 9170; RV64I-NEXT: ret 9171; 9172; RV32ID-ILP32-LABEL: fcvt_q_h: 9173; RV32ID-ILP32: # %bb.0: 9174; RV32ID-ILP32-NEXT: addi sp, sp, -32 9175; RV32ID-ILP32-NEXT: .cfi_def_cfa_offset 32 9176; RV32ID-ILP32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9177; RV32ID-ILP32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9178; RV32ID-ILP32-NEXT: .cfi_offset ra, -4 9179; RV32ID-ILP32-NEXT: .cfi_offset s0, -8 9180; RV32ID-ILP32-NEXT: mv s0, a0 9181; RV32ID-ILP32-NEXT: lhu a0, 0(a1) 9182; RV32ID-ILP32-NEXT: call __extendhfsf2 9183; RV32ID-ILP32-NEXT: mv a1, a0 9184; RV32ID-ILP32-NEXT: addi a0, sp, 8 9185; RV32ID-ILP32-NEXT: call __extendsftf2 9186; RV32ID-ILP32-NEXT: lw a0, 8(sp) 9187; RV32ID-ILP32-NEXT: lw a1, 12(sp) 9188; RV32ID-ILP32-NEXT: lw a2, 16(sp) 9189; RV32ID-ILP32-NEXT: lw a3, 20(sp) 9190; RV32ID-ILP32-NEXT: sw a0, 0(s0) 9191; RV32ID-ILP32-NEXT: sw a1, 4(s0) 9192; RV32ID-ILP32-NEXT: sw a2, 8(s0) 9193; RV32ID-ILP32-NEXT: sw a3, 12(s0) 9194; RV32ID-ILP32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9195; RV32ID-ILP32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9196; RV32ID-ILP32-NEXT: .cfi_restore ra 9197; RV32ID-ILP32-NEXT: .cfi_restore s0 9198; RV32ID-ILP32-NEXT: addi sp, sp, 32 9199; RV32ID-ILP32-NEXT: .cfi_def_cfa_offset 0 9200; RV32ID-ILP32-NEXT: ret 9201; 9202; RV64ID-LP64-LABEL: fcvt_q_h: 9203; RV64ID-LP64: # %bb.0: 9204; RV64ID-LP64-NEXT: addi sp, sp, -16 9205; RV64ID-LP64-NEXT: .cfi_def_cfa_offset 16 9206; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9207; RV64ID-LP64-NEXT: .cfi_offset ra, -8 9208; RV64ID-LP64-NEXT: lhu a0, 0(a0) 9209; RV64ID-LP64-NEXT: call __extendhfsf2 9210; RV64ID-LP64-NEXT: call __extendsftf2 9211; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9212; RV64ID-LP64-NEXT: .cfi_restore ra 9213; RV64ID-LP64-NEXT: addi sp, sp, 16 9214; RV64ID-LP64-NEXT: .cfi_def_cfa_offset 0 9215; RV64ID-LP64-NEXT: ret 9216; 9217; RV32ID-LABEL: fcvt_q_h: 9218; RV32ID: # %bb.0: 9219; RV32ID-NEXT: addi sp, sp, -32 9220; RV32ID-NEXT: .cfi_def_cfa_offset 32 9221; RV32ID-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9222; RV32ID-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9223; RV32ID-NEXT: .cfi_offset ra, -4 9224; RV32ID-NEXT: .cfi_offset s0, -8 9225; RV32ID-NEXT: mv s0, a0 9226; RV32ID-NEXT: lhu a0, 0(a1) 9227; RV32ID-NEXT: fmv.w.x fa0, a0 9228; RV32ID-NEXT: call __extendhfsf2 9229; RV32ID-NEXT: addi a0, sp, 8 9230; RV32ID-NEXT: call __extendsftf2 9231; RV32ID-NEXT: lw a0, 8(sp) 9232; RV32ID-NEXT: lw a1, 12(sp) 9233; RV32ID-NEXT: lw a2, 16(sp) 9234; RV32ID-NEXT: lw a3, 20(sp) 9235; RV32ID-NEXT: sw a0, 0(s0) 9236; RV32ID-NEXT: sw a1, 4(s0) 9237; RV32ID-NEXT: sw a2, 8(s0) 9238; RV32ID-NEXT: sw a3, 12(s0) 9239; RV32ID-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9240; RV32ID-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9241; RV32ID-NEXT: .cfi_restore ra 9242; RV32ID-NEXT: .cfi_restore s0 9243; RV32ID-NEXT: addi sp, sp, 32 9244; RV32ID-NEXT: .cfi_def_cfa_offset 0 9245; RV32ID-NEXT: ret 9246; 9247; RV64ID-LABEL: fcvt_q_h: 9248; RV64ID: # %bb.0: 9249; RV64ID-NEXT: addi sp, sp, -16 9250; RV64ID-NEXT: .cfi_def_cfa_offset 16 9251; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9252; RV64ID-NEXT: .cfi_offset ra, -8 9253; RV64ID-NEXT: lhu a0, 0(a0) 9254; RV64ID-NEXT: fmv.w.x fa0, a0 9255; RV64ID-NEXT: call __extendhfsf2 9256; RV64ID-NEXT: call __extendsftf2 9257; RV64ID-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9258; RV64ID-NEXT: .cfi_restore ra 9259; RV64ID-NEXT: addi sp, sp, 16 9260; RV64ID-NEXT: .cfi_def_cfa_offset 0 9261; RV64ID-NEXT: ret 9262; 9263; CHECK32-IZFHMIN-LABEL: fcvt_q_h: 9264; CHECK32-IZFHMIN: # %bb.0: 9265; CHECK32-IZFHMIN-NEXT: addi sp, sp, -32 9266; CHECK32-IZFHMIN-NEXT: .cfi_def_cfa_offset 32 9267; CHECK32-IZFHMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9268; CHECK32-IZFHMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9269; CHECK32-IZFHMIN-NEXT: .cfi_offset ra, -4 9270; CHECK32-IZFHMIN-NEXT: .cfi_offset s0, -8 9271; CHECK32-IZFHMIN-NEXT: mv s0, a0 9272; CHECK32-IZFHMIN-NEXT: flh fa5, 0(a1) 9273; CHECK32-IZFHMIN-NEXT: fcvt.s.h fa0, fa5 9274; CHECK32-IZFHMIN-NEXT: addi a0, sp, 8 9275; CHECK32-IZFHMIN-NEXT: call __extendsftf2 9276; CHECK32-IZFHMIN-NEXT: lw a0, 8(sp) 9277; CHECK32-IZFHMIN-NEXT: lw a1, 12(sp) 9278; CHECK32-IZFHMIN-NEXT: lw a2, 16(sp) 9279; CHECK32-IZFHMIN-NEXT: lw a3, 20(sp) 9280; CHECK32-IZFHMIN-NEXT: sw a0, 0(s0) 9281; CHECK32-IZFHMIN-NEXT: sw a1, 4(s0) 9282; CHECK32-IZFHMIN-NEXT: sw a2, 8(s0) 9283; CHECK32-IZFHMIN-NEXT: sw a3, 12(s0) 9284; CHECK32-IZFHMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9285; CHECK32-IZFHMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9286; CHECK32-IZFHMIN-NEXT: .cfi_restore ra 9287; CHECK32-IZFHMIN-NEXT: .cfi_restore s0 9288; CHECK32-IZFHMIN-NEXT: addi sp, sp, 32 9289; CHECK32-IZFHMIN-NEXT: .cfi_def_cfa_offset 0 9290; CHECK32-IZFHMIN-NEXT: ret 9291; 9292; CHECK64-IZFHMIN-LABEL: fcvt_q_h: 9293; CHECK64-IZFHMIN: # %bb.0: 9294; CHECK64-IZFHMIN-NEXT: addi sp, sp, -16 9295; CHECK64-IZFHMIN-NEXT: .cfi_def_cfa_offset 16 9296; CHECK64-IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9297; CHECK64-IZFHMIN-NEXT: .cfi_offset ra, -8 9298; CHECK64-IZFHMIN-NEXT: flh fa5, 0(a0) 9299; CHECK64-IZFHMIN-NEXT: fcvt.s.h fa0, fa5 9300; CHECK64-IZFHMIN-NEXT: call __extendsftf2 9301; CHECK64-IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9302; CHECK64-IZFHMIN-NEXT: .cfi_restore ra 9303; CHECK64-IZFHMIN-NEXT: addi sp, sp, 16 9304; CHECK64-IZFHMIN-NEXT: .cfi_def_cfa_offset 0 9305; CHECK64-IZFHMIN-NEXT: ret 9306; 9307; CHECK32-IZHINXMIN-LABEL: fcvt_q_h: 9308; CHECK32-IZHINXMIN: # %bb.0: 9309; CHECK32-IZHINXMIN-NEXT: addi sp, sp, -32 9310; CHECK32-IZHINXMIN-NEXT: .cfi_def_cfa_offset 32 9311; CHECK32-IZHINXMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9312; CHECK32-IZHINXMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9313; CHECK32-IZHINXMIN-NEXT: .cfi_offset ra, -4 9314; CHECK32-IZHINXMIN-NEXT: .cfi_offset s0, -8 9315; CHECK32-IZHINXMIN-NEXT: mv s0, a0 9316; CHECK32-IZHINXMIN-NEXT: lh a0, 0(a1) 9317; CHECK32-IZHINXMIN-NEXT: fcvt.s.h a1, a0 9318; CHECK32-IZHINXMIN-NEXT: addi a0, sp, 8 9319; CHECK32-IZHINXMIN-NEXT: call __extendsftf2 9320; CHECK32-IZHINXMIN-NEXT: lw a0, 8(sp) 9321; CHECK32-IZHINXMIN-NEXT: lw a1, 12(sp) 9322; CHECK32-IZHINXMIN-NEXT: lw a2, 16(sp) 9323; CHECK32-IZHINXMIN-NEXT: lw a3, 20(sp) 9324; CHECK32-IZHINXMIN-NEXT: sw a0, 0(s0) 9325; CHECK32-IZHINXMIN-NEXT: sw a1, 4(s0) 9326; CHECK32-IZHINXMIN-NEXT: sw a2, 8(s0) 9327; CHECK32-IZHINXMIN-NEXT: sw a3, 12(s0) 9328; CHECK32-IZHINXMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9329; CHECK32-IZHINXMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9330; CHECK32-IZHINXMIN-NEXT: .cfi_restore ra 9331; CHECK32-IZHINXMIN-NEXT: .cfi_restore s0 9332; CHECK32-IZHINXMIN-NEXT: addi sp, sp, 32 9333; CHECK32-IZHINXMIN-NEXT: .cfi_def_cfa_offset 0 9334; CHECK32-IZHINXMIN-NEXT: ret 9335; 9336; CHECK64-IZHINXMIN-LABEL: fcvt_q_h: 9337; CHECK64-IZHINXMIN: # %bb.0: 9338; CHECK64-IZHINXMIN-NEXT: addi sp, sp, -16 9339; CHECK64-IZHINXMIN-NEXT: .cfi_def_cfa_offset 16 9340; CHECK64-IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9341; CHECK64-IZHINXMIN-NEXT: .cfi_offset ra, -8 9342; CHECK64-IZHINXMIN-NEXT: lh a0, 0(a0) 9343; CHECK64-IZHINXMIN-NEXT: fcvt.s.h a0, a0 9344; CHECK64-IZHINXMIN-NEXT: call __extendsftf2 9345; CHECK64-IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9346; CHECK64-IZHINXMIN-NEXT: .cfi_restore ra 9347; CHECK64-IZHINXMIN-NEXT: addi sp, sp, 16 9348; CHECK64-IZHINXMIN-NEXT: .cfi_def_cfa_offset 0 9349; CHECK64-IZHINXMIN-NEXT: ret 9350; 9351; CHECK32-IZDINXZHINXMIN-LABEL: fcvt_q_h: 9352; CHECK32-IZDINXZHINXMIN: # %bb.0: 9353; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, -32 9354; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_def_cfa_offset 32 9355; CHECK32-IZDINXZHINXMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9356; CHECK32-IZDINXZHINXMIN-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9357; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_offset ra, -4 9358; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_offset s0, -8 9359; CHECK32-IZDINXZHINXMIN-NEXT: mv s0, a0 9360; CHECK32-IZDINXZHINXMIN-NEXT: lh a0, 0(a1) 9361; CHECK32-IZDINXZHINXMIN-NEXT: fcvt.s.h a1, a0 9362; CHECK32-IZDINXZHINXMIN-NEXT: addi a0, sp, 8 9363; CHECK32-IZDINXZHINXMIN-NEXT: call __extendsftf2 9364; CHECK32-IZDINXZHINXMIN-NEXT: lw a0, 8(sp) 9365; CHECK32-IZDINXZHINXMIN-NEXT: lw a1, 12(sp) 9366; CHECK32-IZDINXZHINXMIN-NEXT: lw a2, 16(sp) 9367; CHECK32-IZDINXZHINXMIN-NEXT: lw a3, 20(sp) 9368; CHECK32-IZDINXZHINXMIN-NEXT: sw a0, 0(s0) 9369; CHECK32-IZDINXZHINXMIN-NEXT: sw a1, 4(s0) 9370; CHECK32-IZDINXZHINXMIN-NEXT: sw a2, 8(s0) 9371; CHECK32-IZDINXZHINXMIN-NEXT: sw a3, 12(s0) 9372; CHECK32-IZDINXZHINXMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9373; CHECK32-IZDINXZHINXMIN-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9374; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_restore ra 9375; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_restore s0 9376; CHECK32-IZDINXZHINXMIN-NEXT: addi sp, sp, 32 9377; CHECK32-IZDINXZHINXMIN-NEXT: .cfi_def_cfa_offset 0 9378; CHECK32-IZDINXZHINXMIN-NEXT: ret 9379; 9380; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_q_h: 9381; CHECK64-IZDINXZHINXMIN: # %bb.0: 9382; CHECK64-IZDINXZHINXMIN-NEXT: addi sp, sp, -16 9383; CHECK64-IZDINXZHINXMIN-NEXT: .cfi_def_cfa_offset 16 9384; CHECK64-IZDINXZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9385; CHECK64-IZDINXZHINXMIN-NEXT: .cfi_offset ra, -8 9386; CHECK64-IZDINXZHINXMIN-NEXT: lh a0, 0(a0) 9387; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0 9388; CHECK64-IZDINXZHINXMIN-NEXT: call __extendsftf2 9389; CHECK64-IZDINXZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9390; CHECK64-IZDINXZHINXMIN-NEXT: .cfi_restore ra 9391; CHECK64-IZDINXZHINXMIN-NEXT: addi sp, sp, 16 9392; CHECK64-IZDINXZHINXMIN-NEXT: .cfi_def_cfa_offset 0 9393; CHECK64-IZDINXZHINXMIN-NEXT: ret 9394 %a = load half, ptr %x 9395 %b = fpext half %a to fp128 9396 ret fp128 %b 9397} 9398