1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+f \ 3; RUN: -target-abi=ilp32f \ 4; RUN: | FileCheck -check-prefix=RV32IF %s 5; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+d \ 6; RUN: -target-abi=ilp32f \ 7; RUN: | FileCheck -check-prefix=RV32IF %s 8; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -mattr=+f \ 9; RUN: -target-abi=lp64f \ 10; RUN: | FileCheck -check-prefix=RV64IF %s 11; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -mattr=+d \ 12; RUN: -target-abi=lp64d \ 13; RUN: | FileCheck -check-prefix=RV64IF %s 14; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel \ 15; RUN: | FileCheck -check-prefix=RV32I %s 16; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel \ 17; RUN: | FileCheck -check-prefix=RV64I %s 18 19define float @sqrt_f32(float %a) nounwind { 20; RV32IF-LABEL: sqrt_f32: 21; RV32IF: # %bb.0: 22; RV32IF-NEXT: fsqrt.s fa0, fa0 23; RV32IF-NEXT: ret 24; 25; RV64IF-LABEL: sqrt_f32: 26; RV64IF: # %bb.0: 27; RV64IF-NEXT: fsqrt.s fa0, fa0 28; RV64IF-NEXT: ret 29; 30; RV32I-LABEL: sqrt_f32: 31; RV32I: # %bb.0: 32; RV32I-NEXT: addi sp, sp, -16 33; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 34; RV32I-NEXT: call sqrtf 35; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 36; RV32I-NEXT: addi sp, sp, 16 37; RV32I-NEXT: ret 38; 39; RV64I-LABEL: sqrt_f32: 40; RV64I: # %bb.0: 41; RV64I-NEXT: addi sp, sp, -16 42; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 43; RV64I-NEXT: call sqrtf 44; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 45; RV64I-NEXT: addi sp, sp, 16 46; RV64I-NEXT: ret 47 %1 = call float @llvm.sqrt.f32(float %a) 48 ret float %1 49} 50 51define float @powi_f32(float %a, i32 %b) nounwind { 52; RV32IF-LABEL: powi_f32: 53; RV32IF: # %bb.0: 54; RV32IF-NEXT: addi sp, sp, -16 55; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 56; RV32IF-NEXT: call __powisf2 57; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 58; RV32IF-NEXT: addi sp, sp, 16 59; RV32IF-NEXT: ret 60; 61; RV64IF-LABEL: powi_f32: 62; RV64IF: # %bb.0: 63; RV64IF-NEXT: addi sp, sp, -16 64; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 65; RV64IF-NEXT: sext.w a0, a0 66; RV64IF-NEXT: call __powisf2 67; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 68; RV64IF-NEXT: addi sp, sp, 16 69; RV64IF-NEXT: ret 70; 71; RV32I-LABEL: powi_f32: 72; RV32I: # %bb.0: 73; RV32I-NEXT: addi sp, sp, -16 74; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 75; RV32I-NEXT: call __powisf2 76; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 77; RV32I-NEXT: addi sp, sp, 16 78; RV32I-NEXT: ret 79; 80; RV64I-LABEL: powi_f32: 81; RV64I: # %bb.0: 82; RV64I-NEXT: addi sp, sp, -16 83; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 84; RV64I-NEXT: sext.w a1, a1 85; RV64I-NEXT: call __powisf2 86; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 87; RV64I-NEXT: addi sp, sp, 16 88; RV64I-NEXT: ret 89 %1 = call float @llvm.powi.f32.i32(float %a, i32 %b) 90 ret float %1 91} 92 93define float @sin_f32(float %a) nounwind { 94; RV32IF-LABEL: sin_f32: 95; RV32IF: # %bb.0: 96; RV32IF-NEXT: addi sp, sp, -16 97; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 98; RV32IF-NEXT: call sinf 99; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 100; RV32IF-NEXT: addi sp, sp, 16 101; RV32IF-NEXT: ret 102; 103; RV64IF-LABEL: sin_f32: 104; RV64IF: # %bb.0: 105; RV64IF-NEXT: addi sp, sp, -16 106; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 107; RV64IF-NEXT: call sinf 108; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 109; RV64IF-NEXT: addi sp, sp, 16 110; RV64IF-NEXT: ret 111; 112; RV32I-LABEL: sin_f32: 113; RV32I: # %bb.0: 114; RV32I-NEXT: addi sp, sp, -16 115; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 116; RV32I-NEXT: call sinf 117; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 118; RV32I-NEXT: addi sp, sp, 16 119; RV32I-NEXT: ret 120; 121; RV64I-LABEL: sin_f32: 122; RV64I: # %bb.0: 123; RV64I-NEXT: addi sp, sp, -16 124; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 125; RV64I-NEXT: call sinf 126; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 127; RV64I-NEXT: addi sp, sp, 16 128; RV64I-NEXT: ret 129 %1 = call float @llvm.sin.f32(float %a) 130 ret float %1 131} 132 133define float @cos_f32(float %a) nounwind { 134; RV32IF-LABEL: cos_f32: 135; RV32IF: # %bb.0: 136; RV32IF-NEXT: addi sp, sp, -16 137; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 138; RV32IF-NEXT: call cosf 139; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 140; RV32IF-NEXT: addi sp, sp, 16 141; RV32IF-NEXT: ret 142; 143; RV64IF-LABEL: cos_f32: 144; RV64IF: # %bb.0: 145; RV64IF-NEXT: addi sp, sp, -16 146; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 147; RV64IF-NEXT: call cosf 148; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 149; RV64IF-NEXT: addi sp, sp, 16 150; RV64IF-NEXT: ret 151; 152; RV32I-LABEL: cos_f32: 153; RV32I: # %bb.0: 154; RV32I-NEXT: addi sp, sp, -16 155; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 156; RV32I-NEXT: call cosf 157; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 158; RV32I-NEXT: addi sp, sp, 16 159; RV32I-NEXT: ret 160; 161; RV64I-LABEL: cos_f32: 162; RV64I: # %bb.0: 163; RV64I-NEXT: addi sp, sp, -16 164; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 165; RV64I-NEXT: call cosf 166; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 167; RV64I-NEXT: addi sp, sp, 16 168; RV64I-NEXT: ret 169 %1 = call float @llvm.cos.f32(float %a) 170 ret float %1 171} 172 173; The sin+cos combination results in an FSINCOS SelectionDAG node. 174define float @sincos_f32(float %a) nounwind { 175; RV32IF-LABEL: sincos_f32: 176; RV32IF: # %bb.0: 177; RV32IF-NEXT: addi sp, sp, -16 178; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 179; RV32IF-NEXT: fsw fs0, 8(sp) # 4-byte Folded Spill 180; RV32IF-NEXT: fsw fs1, 4(sp) # 4-byte Folded Spill 181; RV32IF-NEXT: fmv.s fs0, fa0 182; RV32IF-NEXT: call sinf 183; RV32IF-NEXT: fmv.s fs1, fa0 184; RV32IF-NEXT: fmv.s fa0, fs0 185; RV32IF-NEXT: call cosf 186; RV32IF-NEXT: fadd.s fa0, fs1, fa0 187; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 188; RV32IF-NEXT: flw fs0, 8(sp) # 4-byte Folded Reload 189; RV32IF-NEXT: flw fs1, 4(sp) # 4-byte Folded Reload 190; RV32IF-NEXT: addi sp, sp, 16 191; RV32IF-NEXT: ret 192; 193; RV32I-LABEL: sincos_f32: 194; RV32I: # %bb.0: 195; RV32I-NEXT: addi sp, sp, -16 196; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 197; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 198; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 199; RV32I-NEXT: mv s0, a0 200; RV32I-NEXT: call sinf 201; RV32I-NEXT: mv s1, a0 202; RV32I-NEXT: mv a0, s0 203; RV32I-NEXT: call cosf 204; RV32I-NEXT: mv a1, a0 205; RV32I-NEXT: mv a0, s1 206; RV32I-NEXT: call __addsf3 207; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 208; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 209; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 210; RV32I-NEXT: addi sp, sp, 16 211; RV32I-NEXT: ret 212; 213; RV64I-LABEL: sincos_f32: 214; RV64I: # %bb.0: 215; RV64I-NEXT: addi sp, sp, -32 216; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 217; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 218; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 219; RV64I-NEXT: mv s0, a0 220; RV64I-NEXT: call sinf 221; RV64I-NEXT: mv s1, a0 222; RV64I-NEXT: mv a0, s0 223; RV64I-NEXT: call cosf 224; RV64I-NEXT: mv a1, a0 225; RV64I-NEXT: mv a0, s1 226; RV64I-NEXT: call __addsf3 227; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 228; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 229; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 230; RV64I-NEXT: addi sp, sp, 32 231; RV64I-NEXT: ret 232 %1 = call float @llvm.sin.f32(float %a) 233 %2 = call float @llvm.cos.f32(float %a) 234 %3 = fadd float %1, %2 235 ret float %3 236} 237 238define float @pow_f32(float %a, float %b) nounwind { 239; RV32IF-LABEL: pow_f32: 240; RV32IF: # %bb.0: 241; RV32IF-NEXT: addi sp, sp, -16 242; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 243; RV32IF-NEXT: call powf 244; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 245; RV32IF-NEXT: addi sp, sp, 16 246; RV32IF-NEXT: ret 247; 248; RV64IF-LABEL: pow_f32: 249; RV64IF: # %bb.0: 250; RV64IF-NEXT: addi sp, sp, -16 251; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 252; RV64IF-NEXT: call powf 253; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 254; RV64IF-NEXT: addi sp, sp, 16 255; RV64IF-NEXT: ret 256; 257; RV32I-LABEL: pow_f32: 258; RV32I: # %bb.0: 259; RV32I-NEXT: addi sp, sp, -16 260; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 261; RV32I-NEXT: call powf 262; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 263; RV32I-NEXT: addi sp, sp, 16 264; RV32I-NEXT: ret 265; 266; RV64I-LABEL: pow_f32: 267; RV64I: # %bb.0: 268; RV64I-NEXT: addi sp, sp, -16 269; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 270; RV64I-NEXT: call powf 271; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 272; RV64I-NEXT: addi sp, sp, 16 273; RV64I-NEXT: ret 274 %1 = call float @llvm.pow.f32(float %a, float %b) 275 ret float %1 276} 277 278define float @exp_f32(float %a) nounwind { 279; RV32IF-LABEL: exp_f32: 280; RV32IF: # %bb.0: 281; RV32IF-NEXT: addi sp, sp, -16 282; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 283; RV32IF-NEXT: call expf 284; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 285; RV32IF-NEXT: addi sp, sp, 16 286; RV32IF-NEXT: ret 287; 288; RV64IF-LABEL: exp_f32: 289; RV64IF: # %bb.0: 290; RV64IF-NEXT: addi sp, sp, -16 291; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 292; RV64IF-NEXT: call expf 293; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 294; RV64IF-NEXT: addi sp, sp, 16 295; RV64IF-NEXT: ret 296; 297; RV32I-LABEL: exp_f32: 298; RV32I: # %bb.0: 299; RV32I-NEXT: addi sp, sp, -16 300; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 301; RV32I-NEXT: call expf 302; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 303; RV32I-NEXT: addi sp, sp, 16 304; RV32I-NEXT: ret 305; 306; RV64I-LABEL: exp_f32: 307; RV64I: # %bb.0: 308; RV64I-NEXT: addi sp, sp, -16 309; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 310; RV64I-NEXT: call expf 311; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 312; RV64I-NEXT: addi sp, sp, 16 313; RV64I-NEXT: ret 314 %1 = call float @llvm.exp.f32(float %a) 315 ret float %1 316} 317 318define float @exp2_f32(float %a) nounwind { 319; RV32IF-LABEL: exp2_f32: 320; RV32IF: # %bb.0: 321; RV32IF-NEXT: addi sp, sp, -16 322; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 323; RV32IF-NEXT: call exp2f 324; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 325; RV32IF-NEXT: addi sp, sp, 16 326; RV32IF-NEXT: ret 327; 328; RV64IF-LABEL: exp2_f32: 329; RV64IF: # %bb.0: 330; RV64IF-NEXT: addi sp, sp, -16 331; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 332; RV64IF-NEXT: call exp2f 333; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 334; RV64IF-NEXT: addi sp, sp, 16 335; RV64IF-NEXT: ret 336; 337; RV32I-LABEL: exp2_f32: 338; RV32I: # %bb.0: 339; RV32I-NEXT: addi sp, sp, -16 340; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 341; RV32I-NEXT: call exp2f 342; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 343; RV32I-NEXT: addi sp, sp, 16 344; RV32I-NEXT: ret 345; 346; RV64I-LABEL: exp2_f32: 347; RV64I: # %bb.0: 348; RV64I-NEXT: addi sp, sp, -16 349; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 350; RV64I-NEXT: call exp2f 351; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 352; RV64I-NEXT: addi sp, sp, 16 353; RV64I-NEXT: ret 354 %1 = call float @llvm.exp2.f32(float %a) 355 ret float %1 356} 357 358define float @exp10_f32(float %a) nounwind { 359; RV32IF-LABEL: exp10_f32: 360; RV32IF: # %bb.0: 361; RV32IF-NEXT: addi sp, sp, -16 362; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 363; RV32IF-NEXT: call exp10f 364; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 365; RV32IF-NEXT: addi sp, sp, 16 366; RV32IF-NEXT: ret 367; 368; RV64IF-LABEL: exp10_f32: 369; RV64IF: # %bb.0: 370; RV64IF-NEXT: addi sp, sp, -16 371; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 372; RV64IF-NEXT: call exp10f 373; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 374; RV64IF-NEXT: addi sp, sp, 16 375; RV64IF-NEXT: ret 376; 377; RV32I-LABEL: exp10_f32: 378; RV32I: # %bb.0: 379; RV32I-NEXT: addi sp, sp, -16 380; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 381; RV32I-NEXT: call exp10f 382; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 383; RV32I-NEXT: addi sp, sp, 16 384; RV32I-NEXT: ret 385; 386; RV64I-LABEL: exp10_f32: 387; RV64I: # %bb.0: 388; RV64I-NEXT: addi sp, sp, -16 389; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 390; RV64I-NEXT: call exp10f 391; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 392; RV64I-NEXT: addi sp, sp, 16 393; RV64I-NEXT: ret 394 %1 = call float @llvm.exp10.f32(float %a) 395 ret float %1 396} 397 398define float @log_f32(float %a) nounwind { 399; RV32IF-LABEL: log_f32: 400; RV32IF: # %bb.0: 401; RV32IF-NEXT: addi sp, sp, -16 402; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 403; RV32IF-NEXT: call logf 404; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 405; RV32IF-NEXT: addi sp, sp, 16 406; RV32IF-NEXT: ret 407; 408; RV64IF-LABEL: log_f32: 409; RV64IF: # %bb.0: 410; RV64IF-NEXT: addi sp, sp, -16 411; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 412; RV64IF-NEXT: call logf 413; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 414; RV64IF-NEXT: addi sp, sp, 16 415; RV64IF-NEXT: ret 416; 417; RV32I-LABEL: log_f32: 418; RV32I: # %bb.0: 419; RV32I-NEXT: addi sp, sp, -16 420; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 421; RV32I-NEXT: call logf 422; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 423; RV32I-NEXT: addi sp, sp, 16 424; RV32I-NEXT: ret 425; 426; RV64I-LABEL: log_f32: 427; RV64I: # %bb.0: 428; RV64I-NEXT: addi sp, sp, -16 429; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 430; RV64I-NEXT: call logf 431; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 432; RV64I-NEXT: addi sp, sp, 16 433; RV64I-NEXT: ret 434 %1 = call float @llvm.log.f32(float %a) 435 ret float %1 436} 437 438define float @log10_f32(float %a) nounwind { 439; RV32IF-LABEL: log10_f32: 440; RV32IF: # %bb.0: 441; RV32IF-NEXT: addi sp, sp, -16 442; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 443; RV32IF-NEXT: call log10f 444; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 445; RV32IF-NEXT: addi sp, sp, 16 446; RV32IF-NEXT: ret 447; 448; RV64IF-LABEL: log10_f32: 449; RV64IF: # %bb.0: 450; RV64IF-NEXT: addi sp, sp, -16 451; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 452; RV64IF-NEXT: call log10f 453; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 454; RV64IF-NEXT: addi sp, sp, 16 455; RV64IF-NEXT: ret 456; 457; RV32I-LABEL: log10_f32: 458; RV32I: # %bb.0: 459; RV32I-NEXT: addi sp, sp, -16 460; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 461; RV32I-NEXT: call log10f 462; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 463; RV32I-NEXT: addi sp, sp, 16 464; RV32I-NEXT: ret 465; 466; RV64I-LABEL: log10_f32: 467; RV64I: # %bb.0: 468; RV64I-NEXT: addi sp, sp, -16 469; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 470; RV64I-NEXT: call log10f 471; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 472; RV64I-NEXT: addi sp, sp, 16 473; RV64I-NEXT: ret 474 %1 = call float @llvm.log10.f32(float %a) 475 ret float %1 476} 477 478define float @log2_f32(float %a) nounwind { 479; RV32IF-LABEL: log2_f32: 480; RV32IF: # %bb.0: 481; RV32IF-NEXT: addi sp, sp, -16 482; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 483; RV32IF-NEXT: call log2f 484; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 485; RV32IF-NEXT: addi sp, sp, 16 486; RV32IF-NEXT: ret 487; 488; RV64IF-LABEL: log2_f32: 489; RV64IF: # %bb.0: 490; RV64IF-NEXT: addi sp, sp, -16 491; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 492; RV64IF-NEXT: call log2f 493; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 494; RV64IF-NEXT: addi sp, sp, 16 495; RV64IF-NEXT: ret 496; 497; RV32I-LABEL: log2_f32: 498; RV32I: # %bb.0: 499; RV32I-NEXT: addi sp, sp, -16 500; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 501; RV32I-NEXT: call log2f 502; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 503; RV32I-NEXT: addi sp, sp, 16 504; RV32I-NEXT: ret 505; 506; RV64I-LABEL: log2_f32: 507; RV64I: # %bb.0: 508; RV64I-NEXT: addi sp, sp, -16 509; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 510; RV64I-NEXT: call log2f 511; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 512; RV64I-NEXT: addi sp, sp, 16 513; RV64I-NEXT: ret 514 %1 = call float @llvm.log2.f32(float %a) 515 ret float %1 516} 517 518define float @fma_f32(float %a, float %b, float %c) nounwind { 519; RV32IF-LABEL: fma_f32: 520; RV32IF: # %bb.0: 521; RV32IF-NEXT: fmadd.s fa0, fa0, fa1, fa2 522; RV32IF-NEXT: ret 523; 524; RV64IF-LABEL: fma_f32: 525; RV64IF: # %bb.0: 526; RV64IF-NEXT: fmadd.s fa0, fa0, fa1, fa2 527; RV64IF-NEXT: ret 528; 529; RV32I-LABEL: fma_f32: 530; RV32I: # %bb.0: 531; RV32I-NEXT: addi sp, sp, -16 532; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 533; RV32I-NEXT: call fmaf 534; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 535; RV32I-NEXT: addi sp, sp, 16 536; RV32I-NEXT: ret 537; 538; RV64I-LABEL: fma_f32: 539; RV64I: # %bb.0: 540; RV64I-NEXT: addi sp, sp, -16 541; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 542; RV64I-NEXT: call fmaf 543; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 544; RV64I-NEXT: addi sp, sp, 16 545; RV64I-NEXT: ret 546 %1 = call float @llvm.fma.f32(float %a, float %b, float %c) 547 ret float %1 548} 549 550define float @fmuladd_f32(float %a, float %b, float %c) nounwind { 551; RV32IF-LABEL: fmuladd_f32: 552; RV32IF: # %bb.0: 553; RV32IF-NEXT: fmadd.s fa0, fa0, fa1, fa2 554; RV32IF-NEXT: ret 555; 556; RV64IF-LABEL: fmuladd_f32: 557; RV64IF: # %bb.0: 558; RV64IF-NEXT: fmadd.s fa0, fa0, fa1, fa2 559; RV64IF-NEXT: ret 560; 561; RV32I-LABEL: fmuladd_f32: 562; RV32I: # %bb.0: 563; RV32I-NEXT: addi sp, sp, -16 564; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 565; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 566; RV32I-NEXT: mv s0, a2 567; RV32I-NEXT: call __mulsf3 568; RV32I-NEXT: mv a1, s0 569; RV32I-NEXT: call __addsf3 570; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 571; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 572; RV32I-NEXT: addi sp, sp, 16 573; RV32I-NEXT: ret 574; 575; RV64I-LABEL: fmuladd_f32: 576; RV64I: # %bb.0: 577; RV64I-NEXT: addi sp, sp, -16 578; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 579; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 580; RV64I-NEXT: mv s0, a2 581; RV64I-NEXT: call __mulsf3 582; RV64I-NEXT: mv a1, s0 583; RV64I-NEXT: call __addsf3 584; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 585; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 586; RV64I-NEXT: addi sp, sp, 16 587; RV64I-NEXT: ret 588 %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c) 589 ret float %1 590} 591 592define float @fabs_f32(float %a) nounwind { 593; RV32IF-LABEL: fabs_f32: 594; RV32IF: # %bb.0: 595; RV32IF-NEXT: fabs.s fa0, fa0 596; RV32IF-NEXT: ret 597; 598; RV64IF-LABEL: fabs_f32: 599; RV64IF: # %bb.0: 600; RV64IF-NEXT: fabs.s fa0, fa0 601; RV64IF-NEXT: ret 602; 603; RV32I-LABEL: fabs_f32: 604; RV32I: # %bb.0: 605; RV32I-NEXT: slli a0, a0, 1 606; RV32I-NEXT: srli a0, a0, 1 607; RV32I-NEXT: ret 608; 609; RV64I-LABEL: fabs_f32: 610; RV64I: # %bb.0: 611; RV64I-NEXT: slli a0, a0, 33 612; RV64I-NEXT: srli a0, a0, 33 613; RV64I-NEXT: ret 614 %1 = call float @llvm.fabs.f32(float %a) 615 ret float %1 616} 617 618define float @minnum_f32(float %a, float %b) nounwind { 619; RV32IF-LABEL: minnum_f32: 620; RV32IF: # %bb.0: 621; RV32IF-NEXT: fmin.s fa0, fa0, fa1 622; RV32IF-NEXT: ret 623; 624; RV64IF-LABEL: minnum_f32: 625; RV64IF: # %bb.0: 626; RV64IF-NEXT: fmin.s fa0, fa0, fa1 627; RV64IF-NEXT: ret 628; 629; RV32I-LABEL: minnum_f32: 630; RV32I: # %bb.0: 631; RV32I-NEXT: addi sp, sp, -16 632; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 633; RV32I-NEXT: call fminf 634; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 635; RV32I-NEXT: addi sp, sp, 16 636; RV32I-NEXT: ret 637; 638; RV64I-LABEL: minnum_f32: 639; RV64I: # %bb.0: 640; RV64I-NEXT: addi sp, sp, -16 641; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 642; RV64I-NEXT: call fminf 643; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 644; RV64I-NEXT: addi sp, sp, 16 645; RV64I-NEXT: ret 646 %1 = call float @llvm.minnum.f32(float %a, float %b) 647 ret float %1 648} 649 650define float @maxnum_f32(float %a, float %b) nounwind { 651; RV32IF-LABEL: maxnum_f32: 652; RV32IF: # %bb.0: 653; RV32IF-NEXT: fmax.s fa0, fa0, fa1 654; RV32IF-NEXT: ret 655; 656; RV64IF-LABEL: maxnum_f32: 657; RV64IF: # %bb.0: 658; RV64IF-NEXT: fmax.s fa0, fa0, fa1 659; RV64IF-NEXT: ret 660; 661; RV32I-LABEL: maxnum_f32: 662; RV32I: # %bb.0: 663; RV32I-NEXT: addi sp, sp, -16 664; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 665; RV32I-NEXT: call fmaxf 666; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 667; RV32I-NEXT: addi sp, sp, 16 668; RV32I-NEXT: ret 669; 670; RV64I-LABEL: maxnum_f32: 671; RV64I: # %bb.0: 672; RV64I-NEXT: addi sp, sp, -16 673; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 674; RV64I-NEXT: call fmaxf 675; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 676; RV64I-NEXT: addi sp, sp, 16 677; RV64I-NEXT: ret 678 %1 = call float @llvm.maxnum.f32(float %a, float %b) 679 ret float %1 680} 681 682define float @copysign_f32(float %a, float %b) nounwind { 683; RV32IF-LABEL: copysign_f32: 684; RV32IF: # %bb.0: 685; RV32IF-NEXT: fsgnj.s fa0, fa0, fa1 686; RV32IF-NEXT: ret 687; 688; RV64IF-LABEL: copysign_f32: 689; RV64IF: # %bb.0: 690; RV64IF-NEXT: fsgnj.s fa0, fa0, fa1 691; RV64IF-NEXT: ret 692; 693; RV32I-LABEL: copysign_f32: 694; RV32I: # %bb.0: 695; RV32I-NEXT: lui a2, 524288 696; RV32I-NEXT: slli a0, a0, 1 697; RV32I-NEXT: srli a0, a0, 1 698; RV32I-NEXT: and a1, a1, a2 699; RV32I-NEXT: or a0, a0, a1 700; RV32I-NEXT: ret 701; 702; RV64I-LABEL: copysign_f32: 703; RV64I: # %bb.0: 704; RV64I-NEXT: lui a2, 524288 705; RV64I-NEXT: slli a0, a0, 33 706; RV64I-NEXT: srli a0, a0, 33 707; RV64I-NEXT: and a1, a1, a2 708; RV64I-NEXT: or a0, a0, a1 709; RV64I-NEXT: ret 710 %1 = call float @llvm.copysign.f32(float %a, float %b) 711 ret float %1 712} 713 714define float @ceil_f32(float %a) nounwind { 715; RV32IF-LABEL: ceil_f32: 716; RV32IF: # %bb.0: 717; RV32IF-NEXT: addi sp, sp, -16 718; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 719; RV32IF-NEXT: call ceilf 720; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 721; RV32IF-NEXT: addi sp, sp, 16 722; RV32IF-NEXT: ret 723; 724; RV64IF-LABEL: ceil_f32: 725; RV64IF: # %bb.0: 726; RV64IF-NEXT: addi sp, sp, -16 727; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 728; RV64IF-NEXT: call ceilf 729; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 730; RV64IF-NEXT: addi sp, sp, 16 731; RV64IF-NEXT: ret 732; 733; RV32I-LABEL: ceil_f32: 734; RV32I: # %bb.0: 735; RV32I-NEXT: addi sp, sp, -16 736; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 737; RV32I-NEXT: call ceilf 738; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 739; RV32I-NEXT: addi sp, sp, 16 740; RV32I-NEXT: ret 741; 742; RV64I-LABEL: ceil_f32: 743; RV64I: # %bb.0: 744; RV64I-NEXT: addi sp, sp, -16 745; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 746; RV64I-NEXT: call ceilf 747; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 748; RV64I-NEXT: addi sp, sp, 16 749; RV64I-NEXT: ret 750 %1 = call float @llvm.ceil.f32(float %a) 751 ret float %1 752} 753 754define float @trunc_f32(float %a) nounwind { 755; RV32IF-LABEL: trunc_f32: 756; RV32IF: # %bb.0: 757; RV32IF-NEXT: addi sp, sp, -16 758; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 759; RV32IF-NEXT: call truncf 760; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 761; RV32IF-NEXT: addi sp, sp, 16 762; RV32IF-NEXT: ret 763; 764; RV64IF-LABEL: trunc_f32: 765; RV64IF: # %bb.0: 766; RV64IF-NEXT: addi sp, sp, -16 767; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 768; RV64IF-NEXT: call truncf 769; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 770; RV64IF-NEXT: addi sp, sp, 16 771; RV64IF-NEXT: ret 772; 773; RV32I-LABEL: trunc_f32: 774; RV32I: # %bb.0: 775; RV32I-NEXT: addi sp, sp, -16 776; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 777; RV32I-NEXT: call truncf 778; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 779; RV32I-NEXT: addi sp, sp, 16 780; RV32I-NEXT: ret 781; 782; RV64I-LABEL: trunc_f32: 783; RV64I: # %bb.0: 784; RV64I-NEXT: addi sp, sp, -16 785; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 786; RV64I-NEXT: call truncf 787; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 788; RV64I-NEXT: addi sp, sp, 16 789; RV64I-NEXT: ret 790 %1 = call float @llvm.trunc.f32(float %a) 791 ret float %1 792} 793 794define float @rint_f32(float %a) nounwind { 795; RV32IF-LABEL: rint_f32: 796; RV32IF: # %bb.0: 797; RV32IF-NEXT: addi sp, sp, -16 798; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 799; RV32IF-NEXT: call rintf 800; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 801; RV32IF-NEXT: addi sp, sp, 16 802; RV32IF-NEXT: ret 803; 804; RV64IF-LABEL: rint_f32: 805; RV64IF: # %bb.0: 806; RV64IF-NEXT: addi sp, sp, -16 807; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 808; RV64IF-NEXT: call rintf 809; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 810; RV64IF-NEXT: addi sp, sp, 16 811; RV64IF-NEXT: ret 812; 813; RV32I-LABEL: rint_f32: 814; RV32I: # %bb.0: 815; RV32I-NEXT: addi sp, sp, -16 816; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 817; RV32I-NEXT: call rintf 818; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 819; RV32I-NEXT: addi sp, sp, 16 820; RV32I-NEXT: ret 821; 822; RV64I-LABEL: rint_f32: 823; RV64I: # %bb.0: 824; RV64I-NEXT: addi sp, sp, -16 825; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 826; RV64I-NEXT: call rintf 827; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 828; RV64I-NEXT: addi sp, sp, 16 829; RV64I-NEXT: ret 830 %1 = call float @llvm.rint.f32(float %a) 831 ret float %1 832} 833 834define float @nearbyint_f32(float %a) nounwind { 835; RV32IF-LABEL: nearbyint_f32: 836; RV32IF: # %bb.0: 837; RV32IF-NEXT: addi sp, sp, -16 838; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 839; RV32IF-NEXT: call nearbyintf 840; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 841; RV32IF-NEXT: addi sp, sp, 16 842; RV32IF-NEXT: ret 843; 844; RV64IF-LABEL: nearbyint_f32: 845; RV64IF: # %bb.0: 846; RV64IF-NEXT: addi sp, sp, -16 847; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 848; RV64IF-NEXT: call nearbyintf 849; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 850; RV64IF-NEXT: addi sp, sp, 16 851; RV64IF-NEXT: ret 852; 853; RV32I-LABEL: nearbyint_f32: 854; RV32I: # %bb.0: 855; RV32I-NEXT: addi sp, sp, -16 856; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 857; RV32I-NEXT: call nearbyintf 858; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 859; RV32I-NEXT: addi sp, sp, 16 860; RV32I-NEXT: ret 861; 862; RV64I-LABEL: nearbyint_f32: 863; RV64I: # %bb.0: 864; RV64I-NEXT: addi sp, sp, -16 865; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 866; RV64I-NEXT: call nearbyintf 867; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 868; RV64I-NEXT: addi sp, sp, 16 869; RV64I-NEXT: ret 870 %1 = call float @llvm.nearbyint.f32(float %a) 871 ret float %1 872} 873 874define float @round_f32(float %a) nounwind { 875; RV32IF-LABEL: round_f32: 876; RV32IF: # %bb.0: 877; RV32IF-NEXT: addi sp, sp, -16 878; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 879; RV32IF-NEXT: call roundf 880; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 881; RV32IF-NEXT: addi sp, sp, 16 882; RV32IF-NEXT: ret 883; 884; RV64IF-LABEL: round_f32: 885; RV64IF: # %bb.0: 886; RV64IF-NEXT: addi sp, sp, -16 887; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 888; RV64IF-NEXT: call roundf 889; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 890; RV64IF-NEXT: addi sp, sp, 16 891; RV64IF-NEXT: ret 892; 893; RV32I-LABEL: round_f32: 894; RV32I: # %bb.0: 895; RV32I-NEXT: addi sp, sp, -16 896; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 897; RV32I-NEXT: call roundf 898; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 899; RV32I-NEXT: addi sp, sp, 16 900; RV32I-NEXT: ret 901; 902; RV64I-LABEL: round_f32: 903; RV64I: # %bb.0: 904; RV64I-NEXT: addi sp, sp, -16 905; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 906; RV64I-NEXT: call roundf 907; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 908; RV64I-NEXT: addi sp, sp, 16 909; RV64I-NEXT: ret 910 %1 = call float @llvm.round.f32(float %a) 911 ret float %1 912} 913 914define float @roundeven_f32(float %a) nounwind { 915; RV32IF-LABEL: roundeven_f32: 916; RV32IF: # %bb.0: 917; RV32IF-NEXT: addi sp, sp, -16 918; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 919; RV32IF-NEXT: call roundevenf 920; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 921; RV32IF-NEXT: addi sp, sp, 16 922; RV32IF-NEXT: ret 923; 924; RV64IF-LABEL: roundeven_f32: 925; RV64IF: # %bb.0: 926; RV64IF-NEXT: addi sp, sp, -16 927; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 928; RV64IF-NEXT: call roundevenf 929; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 930; RV64IF-NEXT: addi sp, sp, 16 931; RV64IF-NEXT: ret 932; 933; RV32I-LABEL: roundeven_f32: 934; RV32I: # %bb.0: 935; RV32I-NEXT: addi sp, sp, -16 936; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 937; RV32I-NEXT: call roundevenf 938; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 939; RV32I-NEXT: addi sp, sp, 16 940; RV32I-NEXT: ret 941; 942; RV64I-LABEL: roundeven_f32: 943; RV64I: # %bb.0: 944; RV64I-NEXT: addi sp, sp, -16 945; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 946; RV64I-NEXT: call roundevenf 947; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 948; RV64I-NEXT: addi sp, sp, 16 949; RV64I-NEXT: ret 950 %1 = call float @llvm.roundeven.f32(float %a) 951 ret float %1 952} 953 954define i1 @fpclass(float %x) { 955; RV32IF-LABEL: fpclass: 956; RV32IF: # %bb.0: 957; RV32IF-NEXT: fclass.s a0, fa0 958; RV32IF-NEXT: andi a0, a0, 927 959; RV32IF-NEXT: snez a0, a0 960; RV32IF-NEXT: ret 961; 962; RV64IF-LABEL: fpclass: 963; RV64IF: # %bb.0: 964; RV64IF-NEXT: fclass.s a0, fa0 965; RV64IF-NEXT: andi a0, a0, 927 966; RV64IF-NEXT: snez a0, a0 967; RV64IF-NEXT: ret 968; 969; RV32I-LABEL: fpclass: 970; RV32I: # %bb.0: 971; RV32I-NEXT: lui a1, 522240 972; RV32I-NEXT: slli a2, a0, 1 973; RV32I-NEXT: lui a3, 2048 974; RV32I-NEXT: lui a4, 1046528 975; RV32I-NEXT: srli a2, a2, 1 976; RV32I-NEXT: addi a3, a3, -1 977; RV32I-NEXT: addi a5, a2, -1 978; RV32I-NEXT: sltu a3, a5, a3 979; RV32I-NEXT: lui a5, 520192 980; RV32I-NEXT: xor a0, a0, a2 981; RV32I-NEXT: add a4, a2, a4 982; RV32I-NEXT: sltu a4, a4, a5 983; RV32I-NEXT: xor a5, a2, a1 984; RV32I-NEXT: sltu a1, a1, a2 985; RV32I-NEXT: seqz a2, a2 986; RV32I-NEXT: snez a0, a0 987; RV32I-NEXT: seqz a5, a5 988; RV32I-NEXT: and a3, a3, a0 989; RV32I-NEXT: or a2, a2, a5 990; RV32I-NEXT: and a0, a4, a0 991; RV32I-NEXT: or a2, a2, a3 992; RV32I-NEXT: or a0, a1, a0 993; RV32I-NEXT: or a0, a2, a0 994; RV32I-NEXT: ret 995; 996; RV64I-LABEL: fpclass: 997; RV64I: # %bb.0: 998; RV64I-NEXT: lui a1, 522240 999; RV64I-NEXT: slli a2, a0, 33 1000; RV64I-NEXT: sext.w a0, a0 1001; RV64I-NEXT: li a3, 1 1002; RV64I-NEXT: lui a4, 2048 1003; RV64I-NEXT: lui a5, 520192 1004; RV64I-NEXT: srli a2, a2, 33 1005; RV64I-NEXT: addiw a6, a4, -1 1006; RV64I-NEXT: xor a0, a0, a2 1007; RV64I-NEXT: subw a3, a2, a3 1008; RV64I-NEXT: sltu a3, a3, a6 1009; RV64I-NEXT: xor a6, a2, a1 1010; RV64I-NEXT: sltu a1, a1, a2 1011; RV64I-NEXT: subw a4, a2, a4 1012; RV64I-NEXT: seqz a2, a2 1013; RV64I-NEXT: snez a0, a0 1014; RV64I-NEXT: seqz a6, a6 1015; RV64I-NEXT: sltu a4, a4, a5 1016; RV64I-NEXT: and a3, a3, a0 1017; RV64I-NEXT: or a2, a2, a6 1018; RV64I-NEXT: or a1, a2, a1 1019; RV64I-NEXT: or a1, a1, a3 1020; RV64I-NEXT: and a0, a4, a0 1021; RV64I-NEXT: or a0, a1, a0 1022; RV64I-NEXT: ret 1023 %cmp = call i1 @llvm.is.fpclass.f32(float %x, i32 639) 1024 ret i1 %cmp 1025} 1026 1027define i1 @isnan_fpclass(float %x) { 1028; RV32IF-LABEL: isnan_fpclass: 1029; RV32IF: # %bb.0: 1030; RV32IF-NEXT: fclass.s a0, fa0 1031; RV32IF-NEXT: andi a0, a0, 768 1032; RV32IF-NEXT: snez a0, a0 1033; RV32IF-NEXT: ret 1034; 1035; RV64IF-LABEL: isnan_fpclass: 1036; RV64IF: # %bb.0: 1037; RV64IF-NEXT: fclass.s a0, fa0 1038; RV64IF-NEXT: andi a0, a0, 768 1039; RV64IF-NEXT: snez a0, a0 1040; RV64IF-NEXT: ret 1041; 1042; RV32I-LABEL: isnan_fpclass: 1043; RV32I: # %bb.0: 1044; RV32I-NEXT: lui a1, 522240 1045; RV32I-NEXT: slli a0, a0, 1 1046; RV32I-NEXT: srli a0, a0, 1 1047; RV32I-NEXT: sltu a0, a1, a0 1048; RV32I-NEXT: ret 1049; 1050; RV64I-LABEL: isnan_fpclass: 1051; RV64I: # %bb.0: 1052; RV64I-NEXT: lui a1, 522240 1053; RV64I-NEXT: slli a0, a0, 33 1054; RV64I-NEXT: srli a0, a0, 33 1055; RV64I-NEXT: sltu a0, a1, a0 1056; RV64I-NEXT: ret 1057 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 3) ; nan 1058 ret i1 %1 1059} 1060 1061define i1 @isqnan_fpclass(float %x) { 1062; RV32IF-LABEL: isqnan_fpclass: 1063; RV32IF: # %bb.0: 1064; RV32IF-NEXT: fclass.s a0, fa0 1065; RV32IF-NEXT: andi a0, a0, 512 1066; RV32IF-NEXT: snez a0, a0 1067; RV32IF-NEXT: ret 1068; 1069; RV64IF-LABEL: isqnan_fpclass: 1070; RV64IF: # %bb.0: 1071; RV64IF-NEXT: fclass.s a0, fa0 1072; RV64IF-NEXT: andi a0, a0, 512 1073; RV64IF-NEXT: snez a0, a0 1074; RV64IF-NEXT: ret 1075; 1076; RV32I-LABEL: isqnan_fpclass: 1077; RV32I: # %bb.0: 1078; RV32I-NEXT: slli a0, a0, 1 1079; RV32I-NEXT: srli a0, a0, 1 1080; RV32I-NEXT: lui a1, 523264 1081; RV32I-NEXT: sltu a0, a0, a1 1082; RV32I-NEXT: xori a0, a0, 1 1083; RV32I-NEXT: ret 1084; 1085; RV64I-LABEL: isqnan_fpclass: 1086; RV64I: # %bb.0: 1087; RV64I-NEXT: slli a0, a0, 33 1088; RV64I-NEXT: srli a0, a0, 33 1089; RV64I-NEXT: lui a1, 523264 1090; RV64I-NEXT: sltu a0, a0, a1 1091; RV64I-NEXT: xori a0, a0, 1 1092; RV64I-NEXT: ret 1093 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 2) ; qnan 1094 ret i1 %1 1095} 1096 1097define i1 @issnan_fpclass(float %x) { 1098; RV32IF-LABEL: issnan_fpclass: 1099; RV32IF: # %bb.0: 1100; RV32IF-NEXT: fclass.s a0, fa0 1101; RV32IF-NEXT: andi a0, a0, 256 1102; RV32IF-NEXT: snez a0, a0 1103; RV32IF-NEXT: ret 1104; 1105; RV64IF-LABEL: issnan_fpclass: 1106; RV64IF: # %bb.0: 1107; RV64IF-NEXT: fclass.s a0, fa0 1108; RV64IF-NEXT: andi a0, a0, 256 1109; RV64IF-NEXT: snez a0, a0 1110; RV64IF-NEXT: ret 1111; 1112; RV32I-LABEL: issnan_fpclass: 1113; RV32I: # %bb.0: 1114; RV32I-NEXT: lui a1, 522240 1115; RV32I-NEXT: slli a0, a0, 1 1116; RV32I-NEXT: lui a2, 523264 1117; RV32I-NEXT: srli a0, a0, 1 1118; RV32I-NEXT: sltu a1, a1, a0 1119; RV32I-NEXT: sltu a0, a0, a2 1120; RV32I-NEXT: and a0, a1, a0 1121; RV32I-NEXT: ret 1122; 1123; RV64I-LABEL: issnan_fpclass: 1124; RV64I: # %bb.0: 1125; RV64I-NEXT: lui a1, 522240 1126; RV64I-NEXT: slli a0, a0, 33 1127; RV64I-NEXT: lui a2, 523264 1128; RV64I-NEXT: srli a0, a0, 33 1129; RV64I-NEXT: sltu a1, a1, a0 1130; RV64I-NEXT: sltu a0, a0, a2 1131; RV64I-NEXT: and a0, a1, a0 1132; RV64I-NEXT: ret 1133 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 1) ; snan 1134 ret i1 %1 1135} 1136 1137define i1 @isinf_fpclass(float %x) { 1138; RV32IF-LABEL: isinf_fpclass: 1139; RV32IF: # %bb.0: 1140; RV32IF-NEXT: fclass.s a0, fa0 1141; RV32IF-NEXT: andi a0, a0, 129 1142; RV32IF-NEXT: snez a0, a0 1143; RV32IF-NEXT: ret 1144; 1145; RV64IF-LABEL: isinf_fpclass: 1146; RV64IF: # %bb.0: 1147; RV64IF-NEXT: fclass.s a0, fa0 1148; RV64IF-NEXT: andi a0, a0, 129 1149; RV64IF-NEXT: snez a0, a0 1150; RV64IF-NEXT: ret 1151; 1152; RV32I-LABEL: isinf_fpclass: 1153; RV32I: # %bb.0: 1154; RV32I-NEXT: lui a1, 522240 1155; RV32I-NEXT: slli a0, a0, 1 1156; RV32I-NEXT: srli a0, a0, 1 1157; RV32I-NEXT: xor a0, a0, a1 1158; RV32I-NEXT: seqz a0, a0 1159; RV32I-NEXT: ret 1160; 1161; RV64I-LABEL: isinf_fpclass: 1162; RV64I: # %bb.0: 1163; RV64I-NEXT: lui a1, 522240 1164; RV64I-NEXT: slli a0, a0, 33 1165; RV64I-NEXT: srli a0, a0, 33 1166; RV64I-NEXT: xor a0, a0, a1 1167; RV64I-NEXT: seqz a0, a0 1168; RV64I-NEXT: ret 1169 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 516) ; 0x204 = "inf" 1170 ret i1 %1 1171} 1172 1173define i1 @isposinf_fpclass(float %x) { 1174; RV32IF-LABEL: isposinf_fpclass: 1175; RV32IF: # %bb.0: 1176; RV32IF-NEXT: fclass.s a0, fa0 1177; RV32IF-NEXT: andi a0, a0, 128 1178; RV32IF-NEXT: snez a0, a0 1179; RV32IF-NEXT: ret 1180; 1181; RV64IF-LABEL: isposinf_fpclass: 1182; RV64IF: # %bb.0: 1183; RV64IF-NEXT: fclass.s a0, fa0 1184; RV64IF-NEXT: andi a0, a0, 128 1185; RV64IF-NEXT: snez a0, a0 1186; RV64IF-NEXT: ret 1187; 1188; RV32I-LABEL: isposinf_fpclass: 1189; RV32I: # %bb.0: 1190; RV32I-NEXT: lui a1, 522240 1191; RV32I-NEXT: xor a0, a0, a1 1192; RV32I-NEXT: seqz a0, a0 1193; RV32I-NEXT: ret 1194; 1195; RV64I-LABEL: isposinf_fpclass: 1196; RV64I: # %bb.0: 1197; RV64I-NEXT: lui a1, 522240 1198; RV64I-NEXT: sext.w a0, a0 1199; RV64I-NEXT: xor a0, a0, a1 1200; RV64I-NEXT: seqz a0, a0 1201; RV64I-NEXT: ret 1202 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 512) ; 0x200 = "+inf" 1203 ret i1 %1 1204} 1205 1206define i1 @isneginf_fpclass(float %x) { 1207; RV32IF-LABEL: isneginf_fpclass: 1208; RV32IF: # %bb.0: 1209; RV32IF-NEXT: fclass.s a0, fa0 1210; RV32IF-NEXT: andi a0, a0, 1 1211; RV32IF-NEXT: snez a0, a0 1212; RV32IF-NEXT: ret 1213; 1214; RV64IF-LABEL: isneginf_fpclass: 1215; RV64IF: # %bb.0: 1216; RV64IF-NEXT: fclass.s a0, fa0 1217; RV64IF-NEXT: andi a0, a0, 1 1218; RV64IF-NEXT: snez a0, a0 1219; RV64IF-NEXT: ret 1220; 1221; RV32I-LABEL: isneginf_fpclass: 1222; RV32I: # %bb.0: 1223; RV32I-NEXT: lui a1, 1046528 1224; RV32I-NEXT: xor a0, a0, a1 1225; RV32I-NEXT: seqz a0, a0 1226; RV32I-NEXT: ret 1227; 1228; RV64I-LABEL: isneginf_fpclass: 1229; RV64I: # %bb.0: 1230; RV64I-NEXT: lui a1, 1046528 1231; RV64I-NEXT: sext.w a0, a0 1232; RV64I-NEXT: xor a0, a0, a1 1233; RV64I-NEXT: seqz a0, a0 1234; RV64I-NEXT: ret 1235 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 4) ; "-inf" 1236 ret i1 %1 1237} 1238 1239define i1 @isfinite_fpclass(float %x) { 1240; RV32IF-LABEL: isfinite_fpclass: 1241; RV32IF: # %bb.0: 1242; RV32IF-NEXT: fclass.s a0, fa0 1243; RV32IF-NEXT: andi a0, a0, 126 1244; RV32IF-NEXT: snez a0, a0 1245; RV32IF-NEXT: ret 1246; 1247; RV64IF-LABEL: isfinite_fpclass: 1248; RV64IF: # %bb.0: 1249; RV64IF-NEXT: fclass.s a0, fa0 1250; RV64IF-NEXT: andi a0, a0, 126 1251; RV64IF-NEXT: snez a0, a0 1252; RV64IF-NEXT: ret 1253; 1254; RV32I-LABEL: isfinite_fpclass: 1255; RV32I: # %bb.0: 1256; RV32I-NEXT: lui a1, 522240 1257; RV32I-NEXT: slli a0, a0, 1 1258; RV32I-NEXT: srli a0, a0, 1 1259; RV32I-NEXT: sltu a0, a0, a1 1260; RV32I-NEXT: ret 1261; 1262; RV64I-LABEL: isfinite_fpclass: 1263; RV64I: # %bb.0: 1264; RV64I-NEXT: lui a1, 522240 1265; RV64I-NEXT: slli a0, a0, 33 1266; RV64I-NEXT: srli a0, a0, 33 1267; RV64I-NEXT: sltu a0, a0, a1 1268; RV64I-NEXT: ret 1269 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; 0x1f8 = "finite" 1270 ret i1 %1 1271} 1272 1273define i1 @isposfinite_fpclass(float %x) { 1274; RV32IF-LABEL: isposfinite_fpclass: 1275; RV32IF: # %bb.0: 1276; RV32IF-NEXT: fclass.s a0, fa0 1277; RV32IF-NEXT: andi a0, a0, 112 1278; RV32IF-NEXT: snez a0, a0 1279; RV32IF-NEXT: ret 1280; 1281; RV64IF-LABEL: isposfinite_fpclass: 1282; RV64IF: # %bb.0: 1283; RV64IF-NEXT: fclass.s a0, fa0 1284; RV64IF-NEXT: andi a0, a0, 112 1285; RV64IF-NEXT: snez a0, a0 1286; RV64IF-NEXT: ret 1287; 1288; RV32I-LABEL: isposfinite_fpclass: 1289; RV32I: # %bb.0: 1290; RV32I-NEXT: lui a1, 522240 1291; RV32I-NEXT: sltu a0, a0, a1 1292; RV32I-NEXT: ret 1293; 1294; RV64I-LABEL: isposfinite_fpclass: 1295; RV64I: # %bb.0: 1296; RV64I-NEXT: lui a1, 522240 1297; RV64I-NEXT: sext.w a0, a0 1298; RV64I-NEXT: sltu a0, a0, a1 1299; RV64I-NEXT: ret 1300 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 448) ; 0x1c0 = "+finite" 1301 ret i1 %1 1302} 1303 1304define i1 @isnegfinite_fpclass(float %x) { 1305; RV32IF-LABEL: isnegfinite_fpclass: 1306; RV32IF: # %bb.0: 1307; RV32IF-NEXT: fclass.s a0, fa0 1308; RV32IF-NEXT: andi a0, a0, 14 1309; RV32IF-NEXT: snez a0, a0 1310; RV32IF-NEXT: ret 1311; 1312; RV64IF-LABEL: isnegfinite_fpclass: 1313; RV64IF: # %bb.0: 1314; RV64IF-NEXT: fclass.s a0, fa0 1315; RV64IF-NEXT: andi a0, a0, 14 1316; RV64IF-NEXT: snez a0, a0 1317; RV64IF-NEXT: ret 1318; 1319; RV32I-LABEL: isnegfinite_fpclass: 1320; RV32I: # %bb.0: 1321; RV32I-NEXT: lui a1, 522240 1322; RV32I-NEXT: slli a2, a0, 1 1323; RV32I-NEXT: srli a2, a2, 1 1324; RV32I-NEXT: xor a0, a0, a2 1325; RV32I-NEXT: snez a0, a0 1326; RV32I-NEXT: sltu a1, a2, a1 1327; RV32I-NEXT: and a0, a1, a0 1328; RV32I-NEXT: ret 1329; 1330; RV64I-LABEL: isnegfinite_fpclass: 1331; RV64I: # %bb.0: 1332; RV64I-NEXT: lui a1, 522240 1333; RV64I-NEXT: slli a2, a0, 33 1334; RV64I-NEXT: sext.w a0, a0 1335; RV64I-NEXT: srli a2, a2, 33 1336; RV64I-NEXT: xor a0, a0, a2 1337; RV64I-NEXT: snez a0, a0 1338; RV64I-NEXT: sltu a1, a2, a1 1339; RV64I-NEXT: and a0, a1, a0 1340; RV64I-NEXT: ret 1341 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 56) ; 0x38 = "-finite" 1342 ret i1 %1 1343} 1344 1345define i1 @isnotfinite_fpclass(float %x) { 1346; RV32IF-LABEL: isnotfinite_fpclass: 1347; RV32IF: # %bb.0: 1348; RV32IF-NEXT: fclass.s a0, fa0 1349; RV32IF-NEXT: andi a0, a0, 897 1350; RV32IF-NEXT: snez a0, a0 1351; RV32IF-NEXT: ret 1352; 1353; RV64IF-LABEL: isnotfinite_fpclass: 1354; RV64IF: # %bb.0: 1355; RV64IF-NEXT: fclass.s a0, fa0 1356; RV64IF-NEXT: andi a0, a0, 897 1357; RV64IF-NEXT: snez a0, a0 1358; RV64IF-NEXT: ret 1359; 1360; RV32I-LABEL: isnotfinite_fpclass: 1361; RV32I: # %bb.0: 1362; RV32I-NEXT: lui a1, 522240 1363; RV32I-NEXT: slli a0, a0, 1 1364; RV32I-NEXT: srli a0, a0, 1 1365; RV32I-NEXT: xor a2, a0, a1 1366; RV32I-NEXT: seqz a2, a2 1367; RV32I-NEXT: sltu a0, a1, a0 1368; RV32I-NEXT: or a0, a2, a0 1369; RV32I-NEXT: ret 1370; 1371; RV64I-LABEL: isnotfinite_fpclass: 1372; RV64I: # %bb.0: 1373; RV64I-NEXT: lui a1, 522240 1374; RV64I-NEXT: slli a0, a0, 33 1375; RV64I-NEXT: srli a0, a0, 33 1376; RV64I-NEXT: xor a2, a0, a1 1377; RV64I-NEXT: seqz a2, a2 1378; RV64I-NEXT: sltu a0, a1, a0 1379; RV64I-NEXT: or a0, a2, a0 1380; RV64I-NEXT: ret 1381 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; ox207 = "inf|nan" 1382 ret i1 %1 1383} 1384 1385define float @tan_f32(float %a) nounwind { 1386; RV32IF-LABEL: tan_f32: 1387; RV32IF: # %bb.0: 1388; RV32IF-NEXT: addi sp, sp, -16 1389; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1390; RV32IF-NEXT: call tanf 1391; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1392; RV32IF-NEXT: addi sp, sp, 16 1393; RV32IF-NEXT: ret 1394; 1395; RV64IF-LABEL: tan_f32: 1396; RV64IF: # %bb.0: 1397; RV64IF-NEXT: addi sp, sp, -16 1398; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1399; RV64IF-NEXT: call tanf 1400; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1401; RV64IF-NEXT: addi sp, sp, 16 1402; RV64IF-NEXT: ret 1403; 1404; RV32I-LABEL: tan_f32: 1405; RV32I: # %bb.0: 1406; RV32I-NEXT: addi sp, sp, -16 1407; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1408; RV32I-NEXT: call tanf 1409; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1410; RV32I-NEXT: addi sp, sp, 16 1411; RV32I-NEXT: ret 1412; 1413; RV64I-LABEL: tan_f32: 1414; RV64I: # %bb.0: 1415; RV64I-NEXT: addi sp, sp, -16 1416; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1417; RV64I-NEXT: call tanf 1418; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1419; RV64I-NEXT: addi sp, sp, 16 1420; RV64I-NEXT: ret 1421 %1 = call float @llvm.tan.f32(float %a) 1422 ret float %1 1423} 1424 1425define float @ldexp_float(float %x, i32 %y) nounwind { 1426; RV32IF-LABEL: ldexp_float: 1427; RV32IF: # %bb.0: 1428; RV32IF-NEXT: addi sp, sp, -16 1429; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1430; RV32IF-NEXT: call ldexpf 1431; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1432; RV32IF-NEXT: addi sp, sp, 16 1433; RV32IF-NEXT: ret 1434; 1435; RV64IF-LABEL: ldexp_float: 1436; RV64IF: # %bb.0: 1437; RV64IF-NEXT: addi sp, sp, -16 1438; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1439; RV64IF-NEXT: sext.w a0, a0 1440; RV64IF-NEXT: call ldexpf 1441; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1442; RV64IF-NEXT: addi sp, sp, 16 1443; RV64IF-NEXT: ret 1444; 1445; RV32I-LABEL: ldexp_float: 1446; RV32I: # %bb.0: 1447; RV32I-NEXT: addi sp, sp, -16 1448; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1449; RV32I-NEXT: call ldexpf 1450; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1451; RV32I-NEXT: addi sp, sp, 16 1452; RV32I-NEXT: ret 1453; 1454; RV64I-LABEL: ldexp_float: 1455; RV64I: # %bb.0: 1456; RV64I-NEXT: addi sp, sp, -16 1457; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1458; RV64I-NEXT: sext.w a1, a1 1459; RV64I-NEXT: call ldexpf 1460; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1461; RV64I-NEXT: addi sp, sp, 16 1462; RV64I-NEXT: ret 1463 %z = call float @llvm.ldexp.f32.i32(float %x, i32 %y) 1464 ret float %z 1465} 1466 1467define float @asin_f32(float %a) nounwind { 1468; RV32IF-LABEL: asin_f32: 1469; RV32IF: # %bb.0: 1470; RV32IF-NEXT: addi sp, sp, -16 1471; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1472; RV32IF-NEXT: call asinf 1473; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1474; RV32IF-NEXT: addi sp, sp, 16 1475; RV32IF-NEXT: ret 1476; 1477; RV64IF-LABEL: asin_f32: 1478; RV64IF: # %bb.0: 1479; RV64IF-NEXT: addi sp, sp, -16 1480; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1481; RV64IF-NEXT: call asinf 1482; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1483; RV64IF-NEXT: addi sp, sp, 16 1484; RV64IF-NEXT: ret 1485; 1486; RV32I-LABEL: asin_f32: 1487; RV32I: # %bb.0: 1488; RV32I-NEXT: addi sp, sp, -16 1489; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1490; RV32I-NEXT: call asinf 1491; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1492; RV32I-NEXT: addi sp, sp, 16 1493; RV32I-NEXT: ret 1494; 1495; RV64I-LABEL: asin_f32: 1496; RV64I: # %bb.0: 1497; RV64I-NEXT: addi sp, sp, -16 1498; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1499; RV64I-NEXT: call asinf 1500; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1501; RV64I-NEXT: addi sp, sp, 16 1502; RV64I-NEXT: ret 1503 %1 = call float @llvm.asin.f32(float %a) 1504 ret float %1 1505} 1506 1507define float @acos_f32(float %a) nounwind { 1508; RV32IF-LABEL: acos_f32: 1509; RV32IF: # %bb.0: 1510; RV32IF-NEXT: addi sp, sp, -16 1511; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1512; RV32IF-NEXT: call acosf 1513; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1514; RV32IF-NEXT: addi sp, sp, 16 1515; RV32IF-NEXT: ret 1516; 1517; RV64IF-LABEL: acos_f32: 1518; RV64IF: # %bb.0: 1519; RV64IF-NEXT: addi sp, sp, -16 1520; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1521; RV64IF-NEXT: call acosf 1522; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1523; RV64IF-NEXT: addi sp, sp, 16 1524; RV64IF-NEXT: ret 1525; 1526; RV32I-LABEL: acos_f32: 1527; RV32I: # %bb.0: 1528; RV32I-NEXT: addi sp, sp, -16 1529; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1530; RV32I-NEXT: call acosf 1531; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1532; RV32I-NEXT: addi sp, sp, 16 1533; RV32I-NEXT: ret 1534; 1535; RV64I-LABEL: acos_f32: 1536; RV64I: # %bb.0: 1537; RV64I-NEXT: addi sp, sp, -16 1538; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1539; RV64I-NEXT: call acosf 1540; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1541; RV64I-NEXT: addi sp, sp, 16 1542; RV64I-NEXT: ret 1543 %1 = call float @llvm.acos.f32(float %a) 1544 ret float %1 1545} 1546 1547define float @atan_f32(float %a) nounwind { 1548; RV32IF-LABEL: atan_f32: 1549; RV32IF: # %bb.0: 1550; RV32IF-NEXT: addi sp, sp, -16 1551; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1552; RV32IF-NEXT: call atanf 1553; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1554; RV32IF-NEXT: addi sp, sp, 16 1555; RV32IF-NEXT: ret 1556; 1557; RV64IF-LABEL: atan_f32: 1558; RV64IF: # %bb.0: 1559; RV64IF-NEXT: addi sp, sp, -16 1560; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1561; RV64IF-NEXT: call atanf 1562; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1563; RV64IF-NEXT: addi sp, sp, 16 1564; RV64IF-NEXT: ret 1565; 1566; RV32I-LABEL: atan_f32: 1567; RV32I: # %bb.0: 1568; RV32I-NEXT: addi sp, sp, -16 1569; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1570; RV32I-NEXT: call atanf 1571; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1572; RV32I-NEXT: addi sp, sp, 16 1573; RV32I-NEXT: ret 1574; 1575; RV64I-LABEL: atan_f32: 1576; RV64I: # %bb.0: 1577; RV64I-NEXT: addi sp, sp, -16 1578; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1579; RV64I-NEXT: call atanf 1580; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1581; RV64I-NEXT: addi sp, sp, 16 1582; RV64I-NEXT: ret 1583 %1 = call float @llvm.atan.f32(float %a) 1584 ret float %1 1585} 1586 1587define float @atan2_f32(float %a, float %b) nounwind { 1588; RV32IF-LABEL: atan2_f32: 1589; RV32IF: # %bb.0: 1590; RV32IF-NEXT: addi sp, sp, -16 1591; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1592; RV32IF-NEXT: call atan2f 1593; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1594; RV32IF-NEXT: addi sp, sp, 16 1595; RV32IF-NEXT: ret 1596; 1597; RV64IF-LABEL: atan2_f32: 1598; RV64IF: # %bb.0: 1599; RV64IF-NEXT: addi sp, sp, -16 1600; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1601; RV64IF-NEXT: call atan2f 1602; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1603; RV64IF-NEXT: addi sp, sp, 16 1604; RV64IF-NEXT: ret 1605; 1606; RV32I-LABEL: atan2_f32: 1607; RV32I: # %bb.0: 1608; RV32I-NEXT: addi sp, sp, -16 1609; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1610; RV32I-NEXT: call atan2f 1611; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1612; RV32I-NEXT: addi sp, sp, 16 1613; RV32I-NEXT: ret 1614; 1615; RV64I-LABEL: atan2_f32: 1616; RV64I: # %bb.0: 1617; RV64I-NEXT: addi sp, sp, -16 1618; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1619; RV64I-NEXT: call atan2f 1620; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1621; RV64I-NEXT: addi sp, sp, 16 1622; RV64I-NEXT: ret 1623 %1 = call float @llvm.atan2.f32(float %a, float %b) 1624 ret float %1 1625} 1626 1627define float @sinh_f32(float %a) nounwind { 1628; RV32IF-LABEL: sinh_f32: 1629; RV32IF: # %bb.0: 1630; RV32IF-NEXT: addi sp, sp, -16 1631; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1632; RV32IF-NEXT: call sinhf 1633; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1634; RV32IF-NEXT: addi sp, sp, 16 1635; RV32IF-NEXT: ret 1636; 1637; RV64IF-LABEL: sinh_f32: 1638; RV64IF: # %bb.0: 1639; RV64IF-NEXT: addi sp, sp, -16 1640; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1641; RV64IF-NEXT: call sinhf 1642; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1643; RV64IF-NEXT: addi sp, sp, 16 1644; RV64IF-NEXT: ret 1645; 1646; RV32I-LABEL: sinh_f32: 1647; RV32I: # %bb.0: 1648; RV32I-NEXT: addi sp, sp, -16 1649; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1650; RV32I-NEXT: call sinhf 1651; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1652; RV32I-NEXT: addi sp, sp, 16 1653; RV32I-NEXT: ret 1654; 1655; RV64I-LABEL: sinh_f32: 1656; RV64I: # %bb.0: 1657; RV64I-NEXT: addi sp, sp, -16 1658; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1659; RV64I-NEXT: call sinhf 1660; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1661; RV64I-NEXT: addi sp, sp, 16 1662; RV64I-NEXT: ret 1663 %1 = call float @llvm.sinh.f32(float %a) 1664 ret float %1 1665} 1666 1667define float @cosh_f32(float %a) nounwind { 1668; RV32IF-LABEL: cosh_f32: 1669; RV32IF: # %bb.0: 1670; RV32IF-NEXT: addi sp, sp, -16 1671; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1672; RV32IF-NEXT: call coshf 1673; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1674; RV32IF-NEXT: addi sp, sp, 16 1675; RV32IF-NEXT: ret 1676; 1677; RV64IF-LABEL: cosh_f32: 1678; RV64IF: # %bb.0: 1679; RV64IF-NEXT: addi sp, sp, -16 1680; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1681; RV64IF-NEXT: call coshf 1682; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1683; RV64IF-NEXT: addi sp, sp, 16 1684; RV64IF-NEXT: ret 1685; 1686; RV32I-LABEL: cosh_f32: 1687; RV32I: # %bb.0: 1688; RV32I-NEXT: addi sp, sp, -16 1689; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1690; RV32I-NEXT: call coshf 1691; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1692; RV32I-NEXT: addi sp, sp, 16 1693; RV32I-NEXT: ret 1694; 1695; RV64I-LABEL: cosh_f32: 1696; RV64I: # %bb.0: 1697; RV64I-NEXT: addi sp, sp, -16 1698; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1699; RV64I-NEXT: call coshf 1700; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1701; RV64I-NEXT: addi sp, sp, 16 1702; RV64I-NEXT: ret 1703 %1 = call float @llvm.cosh.f32(float %a) 1704 ret float %1 1705} 1706 1707define float @tanh_f32(float %a) nounwind { 1708; RV32IF-LABEL: tanh_f32: 1709; RV32IF: # %bb.0: 1710; RV32IF-NEXT: addi sp, sp, -16 1711; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1712; RV32IF-NEXT: call tanhf 1713; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1714; RV32IF-NEXT: addi sp, sp, 16 1715; RV32IF-NEXT: ret 1716; 1717; RV64IF-LABEL: tanh_f32: 1718; RV64IF: # %bb.0: 1719; RV64IF-NEXT: addi sp, sp, -16 1720; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1721; RV64IF-NEXT: call tanhf 1722; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1723; RV64IF-NEXT: addi sp, sp, 16 1724; RV64IF-NEXT: ret 1725; 1726; RV32I-LABEL: tanh_f32: 1727; RV32I: # %bb.0: 1728; RV32I-NEXT: addi sp, sp, -16 1729; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1730; RV32I-NEXT: call tanhf 1731; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1732; RV32I-NEXT: addi sp, sp, 16 1733; RV32I-NEXT: ret 1734; 1735; RV64I-LABEL: tanh_f32: 1736; RV64I: # %bb.0: 1737; RV64I-NEXT: addi sp, sp, -16 1738; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1739; RV64I-NEXT: call tanhf 1740; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1741; RV64I-NEXT: addi sp, sp, 16 1742; RV64I-NEXT: ret 1743 %1 = call float @llvm.tanh.f32(float %a) 1744 ret float %1 1745} 1746