1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+d \ 3; RUN: -verify-machineinstrs -target-abi=ilp32d < %s \ 4; RUN: | FileCheck -check-prefix=RV32IFD %s 5; RUN: llc -mtriple=riscv64 -mattr=+d \ 6; RUN: -verify-machineinstrs -target-abi=lp64d < %s \ 7; RUN: | FileCheck -check-prefix=RV64IFD %s 8; RUN: llc -mtriple=riscv32 -mattr=+zdinx \ 9; RUN: -verify-machineinstrs -target-abi=ilp32 < %s \ 10; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s 11; RUN: llc -mtriple=riscv64 -mattr=+zdinx \ 12; RUN: -verify-machineinstrs -target-abi=lp64 < %s \ 13; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s 14; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 15; RUN: | FileCheck -check-prefix=RV32I %s 16; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 17; RUN: | FileCheck -check-prefix=RV64I %s 18 19; TODO: FIXMEs are copied blindly across from the X86 version of this test. 20 21define { half, i32 } @test_frexp_f16_i32(half %a) nounwind { 22; RV32IFD-LABEL: test_frexp_f16_i32: 23; RV32IFD: # %bb.0: 24; RV32IFD-NEXT: addi sp, sp, -16 25; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 26; RV32IFD-NEXT: call __extendhfsf2 27; RV32IFD-NEXT: addi a0, sp, 8 28; RV32IFD-NEXT: call frexpf 29; RV32IFD-NEXT: call __truncsfhf2 30; RV32IFD-NEXT: fmv.x.w a1, fa0 31; RV32IFD-NEXT: lw a0, 8(sp) 32; RV32IFD-NEXT: lui a2, 1048560 33; RV32IFD-NEXT: or a1, a1, a2 34; RV32IFD-NEXT: fmv.w.x fa0, a1 35; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 36; RV32IFD-NEXT: addi sp, sp, 16 37; RV32IFD-NEXT: ret 38; 39; RV64IFD-LABEL: test_frexp_f16_i32: 40; RV64IFD: # %bb.0: 41; RV64IFD-NEXT: addi sp, sp, -16 42; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 43; RV64IFD-NEXT: call __extendhfsf2 44; RV64IFD-NEXT: mv a0, sp 45; RV64IFD-NEXT: call frexpf 46; RV64IFD-NEXT: call __truncsfhf2 47; RV64IFD-NEXT: fmv.x.w a1, fa0 48; RV64IFD-NEXT: ld a0, 0(sp) 49; RV64IFD-NEXT: lui a2, 1048560 50; RV64IFD-NEXT: or a1, a1, a2 51; RV64IFD-NEXT: fmv.w.x fa0, a1 52; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 53; RV64IFD-NEXT: addi sp, sp, 16 54; RV64IFD-NEXT: ret 55; 56; RV32IZFINXZDINX-LABEL: test_frexp_f16_i32: 57; RV32IZFINXZDINX: # %bb.0: 58; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 59; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 60; RV32IZFINXZDINX-NEXT: call __extendhfsf2 61; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 62; RV32IZFINXZDINX-NEXT: call frexpf 63; RV32IZFINXZDINX-NEXT: call __truncsfhf2 64; RV32IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w def $x10 65; RV32IZFINXZDINX-NEXT: lw a1, 8(sp) 66; RV32IZFINXZDINX-NEXT: lui a2, 1048560 67; RV32IZFINXZDINX-NEXT: or a0, a0, a2 68; RV32IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10 69; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 70; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 71; RV32IZFINXZDINX-NEXT: ret 72; 73; RV64IZFINXZDINX-LABEL: test_frexp_f16_i32: 74; RV64IZFINXZDINX: # %bb.0: 75; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 76; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 77; RV64IZFINXZDINX-NEXT: call __extendhfsf2 78; RV64IZFINXZDINX-NEXT: mv a1, sp 79; RV64IZFINXZDINX-NEXT: call frexpf 80; RV64IZFINXZDINX-NEXT: call __truncsfhf2 81; RV64IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w def $x10 82; RV64IZFINXZDINX-NEXT: ld a1, 0(sp) 83; RV64IZFINXZDINX-NEXT: lui a2, 1048560 84; RV64IZFINXZDINX-NEXT: or a0, a0, a2 85; RV64IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10 86; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 87; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 88; RV64IZFINXZDINX-NEXT: ret 89; 90; RV32I-LABEL: test_frexp_f16_i32: 91; RV32I: # %bb.0: 92; RV32I-NEXT: addi sp, sp, -16 93; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 94; RV32I-NEXT: slli a0, a0, 16 95; RV32I-NEXT: srli a0, a0, 16 96; RV32I-NEXT: call __extendhfsf2 97; RV32I-NEXT: addi a1, sp, 8 98; RV32I-NEXT: call frexpf 99; RV32I-NEXT: call __truncsfhf2 100; RV32I-NEXT: lw a1, 8(sp) 101; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 102; RV32I-NEXT: addi sp, sp, 16 103; RV32I-NEXT: ret 104; 105; RV64I-LABEL: test_frexp_f16_i32: 106; RV64I: # %bb.0: 107; RV64I-NEXT: addi sp, sp, -16 108; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 109; RV64I-NEXT: slli a0, a0, 48 110; RV64I-NEXT: srli a0, a0, 48 111; RV64I-NEXT: call __extendhfsf2 112; RV64I-NEXT: addi a1, sp, 4 113; RV64I-NEXT: call frexpf 114; RV64I-NEXT: call __truncsfhf2 115; RV64I-NEXT: lw a1, 4(sp) 116; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 117; RV64I-NEXT: addi sp, sp, 16 118; RV64I-NEXT: ret 119 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a) 120 ret { half, i32 } %result 121} 122 123define half @test_frexp_f16_i32_only_use_fract(half %a) nounwind { 124; RV32IFD-LABEL: test_frexp_f16_i32_only_use_fract: 125; RV32IFD: # %bb.0: 126; RV32IFD-NEXT: addi sp, sp, -16 127; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 128; RV32IFD-NEXT: call __extendhfsf2 129; RV32IFD-NEXT: addi a0, sp, 8 130; RV32IFD-NEXT: call frexpf 131; RV32IFD-NEXT: call __truncsfhf2 132; RV32IFD-NEXT: fmv.x.w a0, fa0 133; RV32IFD-NEXT: lui a1, 1048560 134; RV32IFD-NEXT: or a0, a0, a1 135; RV32IFD-NEXT: fmv.w.x fa0, a0 136; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 137; RV32IFD-NEXT: addi sp, sp, 16 138; RV32IFD-NEXT: ret 139; 140; RV64IFD-LABEL: test_frexp_f16_i32_only_use_fract: 141; RV64IFD: # %bb.0: 142; RV64IFD-NEXT: addi sp, sp, -16 143; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 144; RV64IFD-NEXT: call __extendhfsf2 145; RV64IFD-NEXT: mv a0, sp 146; RV64IFD-NEXT: call frexpf 147; RV64IFD-NEXT: call __truncsfhf2 148; RV64IFD-NEXT: fmv.x.w a0, fa0 149; RV64IFD-NEXT: lui a1, 1048560 150; RV64IFD-NEXT: or a0, a0, a1 151; RV64IFD-NEXT: fmv.w.x fa0, a0 152; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 153; RV64IFD-NEXT: addi sp, sp, 16 154; RV64IFD-NEXT: ret 155; 156; RV32IZFINXZDINX-LABEL: test_frexp_f16_i32_only_use_fract: 157; RV32IZFINXZDINX: # %bb.0: 158; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 159; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 160; RV32IZFINXZDINX-NEXT: call __extendhfsf2 161; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 162; RV32IZFINXZDINX-NEXT: call frexpf 163; RV32IZFINXZDINX-NEXT: call __truncsfhf2 164; RV32IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w def $x10 165; RV32IZFINXZDINX-NEXT: lui a1, 1048560 166; RV32IZFINXZDINX-NEXT: or a0, a0, a1 167; RV32IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10 168; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 169; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 170; RV32IZFINXZDINX-NEXT: ret 171; 172; RV64IZFINXZDINX-LABEL: test_frexp_f16_i32_only_use_fract: 173; RV64IZFINXZDINX: # %bb.0: 174; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 175; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 176; RV64IZFINXZDINX-NEXT: call __extendhfsf2 177; RV64IZFINXZDINX-NEXT: mv a1, sp 178; RV64IZFINXZDINX-NEXT: call frexpf 179; RV64IZFINXZDINX-NEXT: call __truncsfhf2 180; RV64IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w def $x10 181; RV64IZFINXZDINX-NEXT: lui a1, 1048560 182; RV64IZFINXZDINX-NEXT: or a0, a0, a1 183; RV64IZFINXZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10 184; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 185; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 186; RV64IZFINXZDINX-NEXT: ret 187; 188; RV32I-LABEL: test_frexp_f16_i32_only_use_fract: 189; RV32I: # %bb.0: 190; RV32I-NEXT: addi sp, sp, -16 191; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 192; RV32I-NEXT: slli a0, a0, 16 193; RV32I-NEXT: srli a0, a0, 16 194; RV32I-NEXT: call __extendhfsf2 195; RV32I-NEXT: addi a1, sp, 8 196; RV32I-NEXT: call frexpf 197; RV32I-NEXT: call __truncsfhf2 198; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 199; RV32I-NEXT: addi sp, sp, 16 200; RV32I-NEXT: ret 201; 202; RV64I-LABEL: test_frexp_f16_i32_only_use_fract: 203; RV64I: # %bb.0: 204; RV64I-NEXT: addi sp, sp, -16 205; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 206; RV64I-NEXT: slli a0, a0, 48 207; RV64I-NEXT: srli a0, a0, 48 208; RV64I-NEXT: call __extendhfsf2 209; RV64I-NEXT: addi a1, sp, 4 210; RV64I-NEXT: call frexpf 211; RV64I-NEXT: call __truncsfhf2 212; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 213; RV64I-NEXT: addi sp, sp, 16 214; RV64I-NEXT: ret 215 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a) 216 %result.0 = extractvalue { half, i32 } %result, 0 217 ret half %result.0 218} 219 220define i32 @test_frexp_f16_i32_only_use_exp(half %a) nounwind { 221; RV32IFD-LABEL: test_frexp_f16_i32_only_use_exp: 222; RV32IFD: # %bb.0: 223; RV32IFD-NEXT: addi sp, sp, -16 224; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 225; RV32IFD-NEXT: call __extendhfsf2 226; RV32IFD-NEXT: addi a0, sp, 8 227; RV32IFD-NEXT: call frexpf 228; RV32IFD-NEXT: lw a0, 8(sp) 229; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 230; RV32IFD-NEXT: addi sp, sp, 16 231; RV32IFD-NEXT: ret 232; 233; RV64IFD-LABEL: test_frexp_f16_i32_only_use_exp: 234; RV64IFD: # %bb.0: 235; RV64IFD-NEXT: addi sp, sp, -16 236; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 237; RV64IFD-NEXT: call __extendhfsf2 238; RV64IFD-NEXT: mv a0, sp 239; RV64IFD-NEXT: call frexpf 240; RV64IFD-NEXT: ld a0, 0(sp) 241; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 242; RV64IFD-NEXT: addi sp, sp, 16 243; RV64IFD-NEXT: ret 244; 245; RV32IZFINXZDINX-LABEL: test_frexp_f16_i32_only_use_exp: 246; RV32IZFINXZDINX: # %bb.0: 247; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 248; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 249; RV32IZFINXZDINX-NEXT: call __extendhfsf2 250; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 251; RV32IZFINXZDINX-NEXT: call frexpf 252; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 253; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 254; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 255; RV32IZFINXZDINX-NEXT: ret 256; 257; RV64IZFINXZDINX-LABEL: test_frexp_f16_i32_only_use_exp: 258; RV64IZFINXZDINX: # %bb.0: 259; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 260; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 261; RV64IZFINXZDINX-NEXT: call __extendhfsf2 262; RV64IZFINXZDINX-NEXT: mv a1, sp 263; RV64IZFINXZDINX-NEXT: call frexpf 264; RV64IZFINXZDINX-NEXT: ld a0, 0(sp) 265; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 266; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 267; RV64IZFINXZDINX-NEXT: ret 268; 269; RV32I-LABEL: test_frexp_f16_i32_only_use_exp: 270; RV32I: # %bb.0: 271; RV32I-NEXT: addi sp, sp, -16 272; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 273; RV32I-NEXT: slli a0, a0, 16 274; RV32I-NEXT: srli a0, a0, 16 275; RV32I-NEXT: call __extendhfsf2 276; RV32I-NEXT: addi a1, sp, 8 277; RV32I-NEXT: call frexpf 278; RV32I-NEXT: lw a0, 8(sp) 279; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 280; RV32I-NEXT: addi sp, sp, 16 281; RV32I-NEXT: ret 282; 283; RV64I-LABEL: test_frexp_f16_i32_only_use_exp: 284; RV64I: # %bb.0: 285; RV64I-NEXT: addi sp, sp, -16 286; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 287; RV64I-NEXT: slli a0, a0, 48 288; RV64I-NEXT: srli a0, a0, 48 289; RV64I-NEXT: call __extendhfsf2 290; RV64I-NEXT: addi a1, sp, 4 291; RV64I-NEXT: call frexpf 292; RV64I-NEXT: lw a0, 4(sp) 293; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 294; RV64I-NEXT: addi sp, sp, 16 295; RV64I-NEXT: ret 296 %result = call { half, i32 } @llvm.frexp.f16.i32(half %a) 297 %result.0 = extractvalue { half, i32 } %result, 1 298 ret i32 %result.0 299} 300 301; FIXME 302; define { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) nounwind { 303; %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a) 304; ret { <2 x half>, <2 x i32> } %result 305; } 306 307; define <2 x half> @test_frexp_v2f16_v2i32_only_use_fract(<2 x half> %a) nounwind { 308; %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a) 309; %result.0 = extractvalue { <2 x half>, <2 x i32> } %result, 0 310; ret <2 x half> %result.0 311; } 312 313; define <2 x i32> @test_frexp_v2f16_v2i32_only_use_exp(<2 x half> %a) nounwind { 314; %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a) 315; %result.1 = extractvalue { <2 x half>, <2 x i32> } %result, 1 316; ret <2 x i32> %result.1 317; } 318 319define { float, i32 } @test_frexp_f32_i32(float %a) nounwind { 320; RV32IFD-LABEL: test_frexp_f32_i32: 321; RV32IFD: # %bb.0: 322; RV32IFD-NEXT: addi sp, sp, -16 323; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 324; RV32IFD-NEXT: addi a0, sp, 8 325; RV32IFD-NEXT: call frexpf 326; RV32IFD-NEXT: lw a0, 8(sp) 327; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 328; RV32IFD-NEXT: addi sp, sp, 16 329; RV32IFD-NEXT: ret 330; 331; RV64IFD-LABEL: test_frexp_f32_i32: 332; RV64IFD: # %bb.0: 333; RV64IFD-NEXT: addi sp, sp, -16 334; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 335; RV64IFD-NEXT: mv a0, sp 336; RV64IFD-NEXT: call frexpf 337; RV64IFD-NEXT: ld a0, 0(sp) 338; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 339; RV64IFD-NEXT: addi sp, sp, 16 340; RV64IFD-NEXT: ret 341; 342; RV32IZFINXZDINX-LABEL: test_frexp_f32_i32: 343; RV32IZFINXZDINX: # %bb.0: 344; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 345; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 346; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 347; RV32IZFINXZDINX-NEXT: call frexpf 348; RV32IZFINXZDINX-NEXT: lw a1, 8(sp) 349; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 350; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 351; RV32IZFINXZDINX-NEXT: ret 352; 353; RV64IZFINXZDINX-LABEL: test_frexp_f32_i32: 354; RV64IZFINXZDINX: # %bb.0: 355; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 356; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 357; RV64IZFINXZDINX-NEXT: mv a1, sp 358; RV64IZFINXZDINX-NEXT: call frexpf 359; RV64IZFINXZDINX-NEXT: ld a1, 0(sp) 360; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 361; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 362; RV64IZFINXZDINX-NEXT: ret 363; 364; RV32I-LABEL: test_frexp_f32_i32: 365; RV32I: # %bb.0: 366; RV32I-NEXT: addi sp, sp, -16 367; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 368; RV32I-NEXT: addi a1, sp, 8 369; RV32I-NEXT: call frexpf 370; RV32I-NEXT: lw a1, 8(sp) 371; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 372; RV32I-NEXT: addi sp, sp, 16 373; RV32I-NEXT: ret 374; 375; RV64I-LABEL: test_frexp_f32_i32: 376; RV64I: # %bb.0: 377; RV64I-NEXT: addi sp, sp, -16 378; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 379; RV64I-NEXT: addi a1, sp, 4 380; RV64I-NEXT: call frexpf 381; RV64I-NEXT: lw a1, 4(sp) 382; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 383; RV64I-NEXT: addi sp, sp, 16 384; RV64I-NEXT: ret 385 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a) 386 ret { float, i32 } %result 387} 388 389define float @test_frexp_f32_i32_only_use_fract(float %a) nounwind { 390; RV32IFD-LABEL: test_frexp_f32_i32_only_use_fract: 391; RV32IFD: # %bb.0: 392; RV32IFD-NEXT: addi sp, sp, -16 393; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 394; RV32IFD-NEXT: addi a0, sp, 8 395; RV32IFD-NEXT: call frexpf 396; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 397; RV32IFD-NEXT: addi sp, sp, 16 398; RV32IFD-NEXT: ret 399; 400; RV64IFD-LABEL: test_frexp_f32_i32_only_use_fract: 401; RV64IFD: # %bb.0: 402; RV64IFD-NEXT: addi sp, sp, -16 403; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 404; RV64IFD-NEXT: mv a0, sp 405; RV64IFD-NEXT: call frexpf 406; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 407; RV64IFD-NEXT: addi sp, sp, 16 408; RV64IFD-NEXT: ret 409; 410; RV32IZFINXZDINX-LABEL: test_frexp_f32_i32_only_use_fract: 411; RV32IZFINXZDINX: # %bb.0: 412; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 413; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 414; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 415; RV32IZFINXZDINX-NEXT: call frexpf 416; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 417; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 418; RV32IZFINXZDINX-NEXT: ret 419; 420; RV64IZFINXZDINX-LABEL: test_frexp_f32_i32_only_use_fract: 421; RV64IZFINXZDINX: # %bb.0: 422; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 423; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 424; RV64IZFINXZDINX-NEXT: mv a1, sp 425; RV64IZFINXZDINX-NEXT: call frexpf 426; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 427; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 428; RV64IZFINXZDINX-NEXT: ret 429; 430; RV32I-LABEL: test_frexp_f32_i32_only_use_fract: 431; RV32I: # %bb.0: 432; RV32I-NEXT: addi sp, sp, -16 433; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 434; RV32I-NEXT: addi a1, sp, 8 435; RV32I-NEXT: call frexpf 436; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 437; RV32I-NEXT: addi sp, sp, 16 438; RV32I-NEXT: ret 439; 440; RV64I-LABEL: test_frexp_f32_i32_only_use_fract: 441; RV64I: # %bb.0: 442; RV64I-NEXT: addi sp, sp, -16 443; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 444; RV64I-NEXT: addi a1, sp, 4 445; RV64I-NEXT: call frexpf 446; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 447; RV64I-NEXT: addi sp, sp, 16 448; RV64I-NEXT: ret 449 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a) 450 %result.0 = extractvalue { float, i32 } %result, 0 451 ret float %result.0 452} 453 454define i32 @test_frexp_f32_i32_only_use_exp(float %a) nounwind { 455; RV32IFD-LABEL: test_frexp_f32_i32_only_use_exp: 456; RV32IFD: # %bb.0: 457; RV32IFD-NEXT: addi sp, sp, -16 458; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 459; RV32IFD-NEXT: addi a0, sp, 8 460; RV32IFD-NEXT: call frexpf 461; RV32IFD-NEXT: lw a0, 8(sp) 462; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 463; RV32IFD-NEXT: addi sp, sp, 16 464; RV32IFD-NEXT: ret 465; 466; RV64IFD-LABEL: test_frexp_f32_i32_only_use_exp: 467; RV64IFD: # %bb.0: 468; RV64IFD-NEXT: addi sp, sp, -16 469; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 470; RV64IFD-NEXT: mv a0, sp 471; RV64IFD-NEXT: call frexpf 472; RV64IFD-NEXT: ld a0, 0(sp) 473; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 474; RV64IFD-NEXT: addi sp, sp, 16 475; RV64IFD-NEXT: ret 476; 477; RV32IZFINXZDINX-LABEL: test_frexp_f32_i32_only_use_exp: 478; RV32IZFINXZDINX: # %bb.0: 479; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 480; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 481; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 482; RV32IZFINXZDINX-NEXT: call frexpf 483; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 484; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 485; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 486; RV32IZFINXZDINX-NEXT: ret 487; 488; RV64IZFINXZDINX-LABEL: test_frexp_f32_i32_only_use_exp: 489; RV64IZFINXZDINX: # %bb.0: 490; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 491; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 492; RV64IZFINXZDINX-NEXT: mv a1, sp 493; RV64IZFINXZDINX-NEXT: call frexpf 494; RV64IZFINXZDINX-NEXT: ld a0, 0(sp) 495; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 496; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 497; RV64IZFINXZDINX-NEXT: ret 498; 499; RV32I-LABEL: test_frexp_f32_i32_only_use_exp: 500; RV32I: # %bb.0: 501; RV32I-NEXT: addi sp, sp, -16 502; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 503; RV32I-NEXT: addi a1, sp, 8 504; RV32I-NEXT: call frexpf 505; RV32I-NEXT: lw a0, 8(sp) 506; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 507; RV32I-NEXT: addi sp, sp, 16 508; RV32I-NEXT: ret 509; 510; RV64I-LABEL: test_frexp_f32_i32_only_use_exp: 511; RV64I: # %bb.0: 512; RV64I-NEXT: addi sp, sp, -16 513; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 514; RV64I-NEXT: addi a1, sp, 4 515; RV64I-NEXT: call frexpf 516; RV64I-NEXT: lw a0, 4(sp) 517; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 518; RV64I-NEXT: addi sp, sp, 16 519; RV64I-NEXT: ret 520 %result = call { float, i32 } @llvm.frexp.f32.i32(float %a) 521 %result.0 = extractvalue { float, i32 } %result, 1 522 ret i32 %result.0 523} 524 525; FIXME: Widen vector result 526; define { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) nounwind { 527; %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a) 528; ret { <2 x float>, <2 x i32> } %result 529; } 530 531; define <2 x float> @test_frexp_v2f32_v2i32_only_use_fract(<2 x float> %a) nounwind { 532; %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a) 533; %result.0 = extractvalue { <2 x float>, <2 x i32> } %result, 0 534; ret <2 x float> %result.0 535; } 536 537; define <2 x i32> @test_frexp_v2f32_v2i32_only_use_exp(<2 x float> %a) nounwind { 538; %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a) 539; %result.1 = extractvalue { <2 x float>, <2 x i32> } %result, 1 540; ret <2 x i32> %result.1 541; } 542 543define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) nounwind { 544; RV32IFD-LABEL: test_frexp_v4f32_v4i32: 545; RV32IFD: # %bb.0: 546; RV32IFD-NEXT: addi sp, sp, -48 547; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 548; RV32IFD-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 549; RV32IFD-NEXT: fsd fs0, 32(sp) # 8-byte Folded Spill 550; RV32IFD-NEXT: fsd fs1, 24(sp) # 8-byte Folded Spill 551; RV32IFD-NEXT: fsd fs2, 16(sp) # 8-byte Folded Spill 552; RV32IFD-NEXT: fsd fs3, 8(sp) # 8-byte Folded Spill 553; RV32IFD-NEXT: fmv.s fs0, fa3 554; RV32IFD-NEXT: fmv.s fs1, fa2 555; RV32IFD-NEXT: fmv.s fs2, fa1 556; RV32IFD-NEXT: mv s0, a0 557; RV32IFD-NEXT: addi a0, a0, 16 558; RV32IFD-NEXT: call frexpf 559; RV32IFD-NEXT: fmv.s fs3, fa0 560; RV32IFD-NEXT: addi a0, s0, 20 561; RV32IFD-NEXT: fmv.s fa0, fs2 562; RV32IFD-NEXT: call frexpf 563; RV32IFD-NEXT: fmv.s fs2, fa0 564; RV32IFD-NEXT: addi a0, s0, 24 565; RV32IFD-NEXT: fmv.s fa0, fs1 566; RV32IFD-NEXT: call frexpf 567; RV32IFD-NEXT: fmv.s fs1, fa0 568; RV32IFD-NEXT: addi a0, s0, 28 569; RV32IFD-NEXT: fmv.s fa0, fs0 570; RV32IFD-NEXT: call frexpf 571; RV32IFD-NEXT: fsw fs3, 0(s0) 572; RV32IFD-NEXT: fsw fs2, 4(s0) 573; RV32IFD-NEXT: fsw fs1, 8(s0) 574; RV32IFD-NEXT: fsw fa0, 12(s0) 575; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 576; RV32IFD-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 577; RV32IFD-NEXT: fld fs0, 32(sp) # 8-byte Folded Reload 578; RV32IFD-NEXT: fld fs1, 24(sp) # 8-byte Folded Reload 579; RV32IFD-NEXT: fld fs2, 16(sp) # 8-byte Folded Reload 580; RV32IFD-NEXT: fld fs3, 8(sp) # 8-byte Folded Reload 581; RV32IFD-NEXT: addi sp, sp, 48 582; RV32IFD-NEXT: ret 583; 584; RV64IFD-LABEL: test_frexp_v4f32_v4i32: 585; RV64IFD: # %bb.0: 586; RV64IFD-NEXT: addi sp, sp, -80 587; RV64IFD-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 588; RV64IFD-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 589; RV64IFD-NEXT: fsd fs0, 56(sp) # 8-byte Folded Spill 590; RV64IFD-NEXT: fsd fs1, 48(sp) # 8-byte Folded Spill 591; RV64IFD-NEXT: fsd fs2, 40(sp) # 8-byte Folded Spill 592; RV64IFD-NEXT: fsd fs3, 32(sp) # 8-byte Folded Spill 593; RV64IFD-NEXT: fmv.s fs0, fa3 594; RV64IFD-NEXT: fmv.s fs1, fa2 595; RV64IFD-NEXT: fmv.s fs2, fa1 596; RV64IFD-NEXT: mv s0, a0 597; RV64IFD-NEXT: mv a0, sp 598; RV64IFD-NEXT: call frexpf 599; RV64IFD-NEXT: fmv.s fs3, fa0 600; RV64IFD-NEXT: addi a0, sp, 8 601; RV64IFD-NEXT: fmv.s fa0, fs2 602; RV64IFD-NEXT: call frexpf 603; RV64IFD-NEXT: fmv.s fs2, fa0 604; RV64IFD-NEXT: addi a0, sp, 16 605; RV64IFD-NEXT: fmv.s fa0, fs1 606; RV64IFD-NEXT: call frexpf 607; RV64IFD-NEXT: fmv.s fs1, fa0 608; RV64IFD-NEXT: addi a0, sp, 24 609; RV64IFD-NEXT: fmv.s fa0, fs0 610; RV64IFD-NEXT: call frexpf 611; RV64IFD-NEXT: ld a0, 0(sp) 612; RV64IFD-NEXT: ld a1, 8(sp) 613; RV64IFD-NEXT: ld a2, 16(sp) 614; RV64IFD-NEXT: ld a3, 24(sp) 615; RV64IFD-NEXT: sw a0, 16(s0) 616; RV64IFD-NEXT: sw a1, 20(s0) 617; RV64IFD-NEXT: sw a2, 24(s0) 618; RV64IFD-NEXT: sw a3, 28(s0) 619; RV64IFD-NEXT: fsw fs3, 0(s0) 620; RV64IFD-NEXT: fsw fs2, 4(s0) 621; RV64IFD-NEXT: fsw fs1, 8(s0) 622; RV64IFD-NEXT: fsw fa0, 12(s0) 623; RV64IFD-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 624; RV64IFD-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 625; RV64IFD-NEXT: fld fs0, 56(sp) # 8-byte Folded Reload 626; RV64IFD-NEXT: fld fs1, 48(sp) # 8-byte Folded Reload 627; RV64IFD-NEXT: fld fs2, 40(sp) # 8-byte Folded Reload 628; RV64IFD-NEXT: fld fs3, 32(sp) # 8-byte Folded Reload 629; RV64IFD-NEXT: addi sp, sp, 80 630; RV64IFD-NEXT: ret 631; 632; RV32IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32: 633; RV32IZFINXZDINX: # %bb.0: 634; RV32IZFINXZDINX-NEXT: addi sp, sp, -32 635; RV32IZFINXZDINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 636; RV32IZFINXZDINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 637; RV32IZFINXZDINX-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 638; RV32IZFINXZDINX-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 639; RV32IZFINXZDINX-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 640; RV32IZFINXZDINX-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 641; RV32IZFINXZDINX-NEXT: mv s0, a4 642; RV32IZFINXZDINX-NEXT: mv s1, a3 643; RV32IZFINXZDINX-NEXT: mv s2, a2 644; RV32IZFINXZDINX-NEXT: mv a2, a1 645; RV32IZFINXZDINX-NEXT: mv s3, a0 646; RV32IZFINXZDINX-NEXT: addi a1, a0, 16 647; RV32IZFINXZDINX-NEXT: mv a0, a2 648; RV32IZFINXZDINX-NEXT: call frexpf 649; RV32IZFINXZDINX-NEXT: mv s4, a0 650; RV32IZFINXZDINX-NEXT: addi a1, s3, 20 651; RV32IZFINXZDINX-NEXT: mv a0, s2 652; RV32IZFINXZDINX-NEXT: call frexpf 653; RV32IZFINXZDINX-NEXT: mv s2, a0 654; RV32IZFINXZDINX-NEXT: addi a1, s3, 24 655; RV32IZFINXZDINX-NEXT: mv a0, s1 656; RV32IZFINXZDINX-NEXT: call frexpf 657; RV32IZFINXZDINX-NEXT: mv s1, a0 658; RV32IZFINXZDINX-NEXT: addi a1, s3, 28 659; RV32IZFINXZDINX-NEXT: mv a0, s0 660; RV32IZFINXZDINX-NEXT: call frexpf 661; RV32IZFINXZDINX-NEXT: sw s4, 0(s3) 662; RV32IZFINXZDINX-NEXT: sw s2, 4(s3) 663; RV32IZFINXZDINX-NEXT: sw s1, 8(s3) 664; RV32IZFINXZDINX-NEXT: sw a0, 12(s3) 665; RV32IZFINXZDINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 666; RV32IZFINXZDINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 667; RV32IZFINXZDINX-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 668; RV32IZFINXZDINX-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 669; RV32IZFINXZDINX-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 670; RV32IZFINXZDINX-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 671; RV32IZFINXZDINX-NEXT: addi sp, sp, 32 672; RV32IZFINXZDINX-NEXT: ret 673; 674; RV64IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32: 675; RV64IZFINXZDINX: # %bb.0: 676; RV64IZFINXZDINX-NEXT: addi sp, sp, -80 677; RV64IZFINXZDINX-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 678; RV64IZFINXZDINX-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 679; RV64IZFINXZDINX-NEXT: sd s1, 56(sp) # 8-byte Folded Spill 680; RV64IZFINXZDINX-NEXT: sd s2, 48(sp) # 8-byte Folded Spill 681; RV64IZFINXZDINX-NEXT: sd s3, 40(sp) # 8-byte Folded Spill 682; RV64IZFINXZDINX-NEXT: sd s4, 32(sp) # 8-byte Folded Spill 683; RV64IZFINXZDINX-NEXT: mv s0, a4 684; RV64IZFINXZDINX-NEXT: mv s1, a3 685; RV64IZFINXZDINX-NEXT: mv s2, a2 686; RV64IZFINXZDINX-NEXT: mv a2, a1 687; RV64IZFINXZDINX-NEXT: mv s3, a0 688; RV64IZFINXZDINX-NEXT: mv a1, sp 689; RV64IZFINXZDINX-NEXT: mv a0, a2 690; RV64IZFINXZDINX-NEXT: call frexpf 691; RV64IZFINXZDINX-NEXT: mv s4, a0 692; RV64IZFINXZDINX-NEXT: addi a1, sp, 8 693; RV64IZFINXZDINX-NEXT: mv a0, s2 694; RV64IZFINXZDINX-NEXT: call frexpf 695; RV64IZFINXZDINX-NEXT: mv s2, a0 696; RV64IZFINXZDINX-NEXT: addi a1, sp, 16 697; RV64IZFINXZDINX-NEXT: mv a0, s1 698; RV64IZFINXZDINX-NEXT: call frexpf 699; RV64IZFINXZDINX-NEXT: mv s1, a0 700; RV64IZFINXZDINX-NEXT: addi a1, sp, 24 701; RV64IZFINXZDINX-NEXT: mv a0, s0 702; RV64IZFINXZDINX-NEXT: call frexpf 703; RV64IZFINXZDINX-NEXT: ld a1, 0(sp) 704; RV64IZFINXZDINX-NEXT: ld a2, 8(sp) 705; RV64IZFINXZDINX-NEXT: ld a3, 16(sp) 706; RV64IZFINXZDINX-NEXT: ld a4, 24(sp) 707; RV64IZFINXZDINX-NEXT: sw a1, 16(s3) 708; RV64IZFINXZDINX-NEXT: sw a2, 20(s3) 709; RV64IZFINXZDINX-NEXT: sw a3, 24(s3) 710; RV64IZFINXZDINX-NEXT: sw a4, 28(s3) 711; RV64IZFINXZDINX-NEXT: sw s4, 0(s3) 712; RV64IZFINXZDINX-NEXT: sw s2, 4(s3) 713; RV64IZFINXZDINX-NEXT: sw s1, 8(s3) 714; RV64IZFINXZDINX-NEXT: sw a0, 12(s3) 715; RV64IZFINXZDINX-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 716; RV64IZFINXZDINX-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 717; RV64IZFINXZDINX-NEXT: ld s1, 56(sp) # 8-byte Folded Reload 718; RV64IZFINXZDINX-NEXT: ld s2, 48(sp) # 8-byte Folded Reload 719; RV64IZFINXZDINX-NEXT: ld s3, 40(sp) # 8-byte Folded Reload 720; RV64IZFINXZDINX-NEXT: ld s4, 32(sp) # 8-byte Folded Reload 721; RV64IZFINXZDINX-NEXT: addi sp, sp, 80 722; RV64IZFINXZDINX-NEXT: ret 723; 724; RV32I-LABEL: test_frexp_v4f32_v4i32: 725; RV32I: # %bb.0: 726; RV32I-NEXT: addi sp, sp, -48 727; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 728; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 729; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 730; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 731; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 732; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 733; RV32I-NEXT: lw a2, 0(a1) 734; RV32I-NEXT: lw s0, 4(a1) 735; RV32I-NEXT: lw s1, 8(a1) 736; RV32I-NEXT: lw s2, 12(a1) 737; RV32I-NEXT: mv s3, a0 738; RV32I-NEXT: addi a1, sp, 8 739; RV32I-NEXT: mv a0, a2 740; RV32I-NEXT: call frexpf 741; RV32I-NEXT: mv s4, a0 742; RV32I-NEXT: addi a1, sp, 12 743; RV32I-NEXT: mv a0, s0 744; RV32I-NEXT: call frexpf 745; RV32I-NEXT: mv s0, a0 746; RV32I-NEXT: addi a1, sp, 16 747; RV32I-NEXT: mv a0, s1 748; RV32I-NEXT: call frexpf 749; RV32I-NEXT: mv s1, a0 750; RV32I-NEXT: addi a1, sp, 20 751; RV32I-NEXT: mv a0, s2 752; RV32I-NEXT: call frexpf 753; RV32I-NEXT: lw a1, 8(sp) 754; RV32I-NEXT: lw a2, 12(sp) 755; RV32I-NEXT: lw a3, 16(sp) 756; RV32I-NEXT: lw a4, 20(sp) 757; RV32I-NEXT: sw s4, 0(s3) 758; RV32I-NEXT: sw s0, 4(s3) 759; RV32I-NEXT: sw s1, 8(s3) 760; RV32I-NEXT: sw a0, 12(s3) 761; RV32I-NEXT: sw a1, 16(s3) 762; RV32I-NEXT: sw a2, 20(s3) 763; RV32I-NEXT: sw a3, 24(s3) 764; RV32I-NEXT: sw a4, 28(s3) 765; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 766; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 767; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 768; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 769; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 770; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 771; RV32I-NEXT: addi sp, sp, 48 772; RV32I-NEXT: ret 773; 774; RV64I-LABEL: test_frexp_v4f32_v4i32: 775; RV64I: # %bb.0: 776; RV64I-NEXT: addi sp, sp, -64 777; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 778; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 779; RV64I-NEXT: sd s1, 40(sp) # 8-byte Folded Spill 780; RV64I-NEXT: sd s2, 32(sp) # 8-byte Folded Spill 781; RV64I-NEXT: sd s3, 24(sp) # 8-byte Folded Spill 782; RV64I-NEXT: sd s4, 16(sp) # 8-byte Folded Spill 783; RV64I-NEXT: lw a2, 0(a1) 784; RV64I-NEXT: lw s0, 8(a1) 785; RV64I-NEXT: lw s1, 16(a1) 786; RV64I-NEXT: lw s2, 24(a1) 787; RV64I-NEXT: mv s3, a0 788; RV64I-NEXT: mv a1, sp 789; RV64I-NEXT: mv a0, a2 790; RV64I-NEXT: call frexpf 791; RV64I-NEXT: mv s4, a0 792; RV64I-NEXT: addi a1, sp, 4 793; RV64I-NEXT: mv a0, s0 794; RV64I-NEXT: call frexpf 795; RV64I-NEXT: mv s0, a0 796; RV64I-NEXT: addi a1, sp, 8 797; RV64I-NEXT: mv a0, s1 798; RV64I-NEXT: call frexpf 799; RV64I-NEXT: mv s1, a0 800; RV64I-NEXT: addi a1, sp, 12 801; RV64I-NEXT: mv a0, s2 802; RV64I-NEXT: call frexpf 803; RV64I-NEXT: lw a1, 0(sp) 804; RV64I-NEXT: lw a2, 4(sp) 805; RV64I-NEXT: lw a3, 8(sp) 806; RV64I-NEXT: lw a4, 12(sp) 807; RV64I-NEXT: sw s4, 0(s3) 808; RV64I-NEXT: sw s0, 4(s3) 809; RV64I-NEXT: sw s1, 8(s3) 810; RV64I-NEXT: sw a0, 12(s3) 811; RV64I-NEXT: sw a1, 16(s3) 812; RV64I-NEXT: sw a2, 20(s3) 813; RV64I-NEXT: sw a3, 24(s3) 814; RV64I-NEXT: sw a4, 28(s3) 815; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 816; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 817; RV64I-NEXT: ld s1, 40(sp) # 8-byte Folded Reload 818; RV64I-NEXT: ld s2, 32(sp) # 8-byte Folded Reload 819; RV64I-NEXT: ld s3, 24(sp) # 8-byte Folded Reload 820; RV64I-NEXT: ld s4, 16(sp) # 8-byte Folded Reload 821; RV64I-NEXT: addi sp, sp, 64 822; RV64I-NEXT: ret 823 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a) 824 ret { <4 x float>, <4 x i32> } %result 825} 826 827define <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) nounwind { 828; RV32IFD-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 829; RV32IFD: # %bb.0: 830; RV32IFD-NEXT: addi sp, sp, -64 831; RV32IFD-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 832; RV32IFD-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 833; RV32IFD-NEXT: fsd fs0, 48(sp) # 8-byte Folded Spill 834; RV32IFD-NEXT: fsd fs1, 40(sp) # 8-byte Folded Spill 835; RV32IFD-NEXT: fsd fs2, 32(sp) # 8-byte Folded Spill 836; RV32IFD-NEXT: fsd fs3, 24(sp) # 8-byte Folded Spill 837; RV32IFD-NEXT: fmv.s fs0, fa3 838; RV32IFD-NEXT: fmv.s fs1, fa2 839; RV32IFD-NEXT: fmv.s fs2, fa1 840; RV32IFD-NEXT: mv s0, a0 841; RV32IFD-NEXT: addi a0, sp, 8 842; RV32IFD-NEXT: call frexpf 843; RV32IFD-NEXT: fmv.s fs3, fa0 844; RV32IFD-NEXT: addi a0, sp, 12 845; RV32IFD-NEXT: fmv.s fa0, fs2 846; RV32IFD-NEXT: call frexpf 847; RV32IFD-NEXT: fmv.s fs2, fa0 848; RV32IFD-NEXT: addi a0, sp, 16 849; RV32IFD-NEXT: fmv.s fa0, fs1 850; RV32IFD-NEXT: call frexpf 851; RV32IFD-NEXT: fmv.s fs1, fa0 852; RV32IFD-NEXT: addi a0, sp, 20 853; RV32IFD-NEXT: fmv.s fa0, fs0 854; RV32IFD-NEXT: call frexpf 855; RV32IFD-NEXT: fsw fs3, 0(s0) 856; RV32IFD-NEXT: fsw fs2, 4(s0) 857; RV32IFD-NEXT: fsw fs1, 8(s0) 858; RV32IFD-NEXT: fsw fa0, 12(s0) 859; RV32IFD-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 860; RV32IFD-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 861; RV32IFD-NEXT: fld fs0, 48(sp) # 8-byte Folded Reload 862; RV32IFD-NEXT: fld fs1, 40(sp) # 8-byte Folded Reload 863; RV32IFD-NEXT: fld fs2, 32(sp) # 8-byte Folded Reload 864; RV32IFD-NEXT: fld fs3, 24(sp) # 8-byte Folded Reload 865; RV32IFD-NEXT: addi sp, sp, 64 866; RV32IFD-NEXT: ret 867; 868; RV64IFD-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 869; RV64IFD: # %bb.0: 870; RV64IFD-NEXT: addi sp, sp, -80 871; RV64IFD-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 872; RV64IFD-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 873; RV64IFD-NEXT: fsd fs0, 56(sp) # 8-byte Folded Spill 874; RV64IFD-NEXT: fsd fs1, 48(sp) # 8-byte Folded Spill 875; RV64IFD-NEXT: fsd fs2, 40(sp) # 8-byte Folded Spill 876; RV64IFD-NEXT: fsd fs3, 32(sp) # 8-byte Folded Spill 877; RV64IFD-NEXT: fmv.s fs0, fa3 878; RV64IFD-NEXT: fmv.s fs1, fa2 879; RV64IFD-NEXT: fmv.s fs2, fa1 880; RV64IFD-NEXT: mv s0, a0 881; RV64IFD-NEXT: mv a0, sp 882; RV64IFD-NEXT: call frexpf 883; RV64IFD-NEXT: fmv.s fs3, fa0 884; RV64IFD-NEXT: addi a0, sp, 8 885; RV64IFD-NEXT: fmv.s fa0, fs2 886; RV64IFD-NEXT: call frexpf 887; RV64IFD-NEXT: fmv.s fs2, fa0 888; RV64IFD-NEXT: addi a0, sp, 16 889; RV64IFD-NEXT: fmv.s fa0, fs1 890; RV64IFD-NEXT: call frexpf 891; RV64IFD-NEXT: fmv.s fs1, fa0 892; RV64IFD-NEXT: addi a0, sp, 24 893; RV64IFD-NEXT: fmv.s fa0, fs0 894; RV64IFD-NEXT: call frexpf 895; RV64IFD-NEXT: fsw fs3, 0(s0) 896; RV64IFD-NEXT: fsw fs2, 4(s0) 897; RV64IFD-NEXT: fsw fs1, 8(s0) 898; RV64IFD-NEXT: fsw fa0, 12(s0) 899; RV64IFD-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 900; RV64IFD-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 901; RV64IFD-NEXT: fld fs0, 56(sp) # 8-byte Folded Reload 902; RV64IFD-NEXT: fld fs1, 48(sp) # 8-byte Folded Reload 903; RV64IFD-NEXT: fld fs2, 40(sp) # 8-byte Folded Reload 904; RV64IFD-NEXT: fld fs3, 32(sp) # 8-byte Folded Reload 905; RV64IFD-NEXT: addi sp, sp, 80 906; RV64IFD-NEXT: ret 907; 908; RV32IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 909; RV32IZFINXZDINX: # %bb.0: 910; RV32IZFINXZDINX-NEXT: addi sp, sp, -48 911; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 912; RV32IZFINXZDINX-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 913; RV32IZFINXZDINX-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 914; RV32IZFINXZDINX-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 915; RV32IZFINXZDINX-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 916; RV32IZFINXZDINX-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 917; RV32IZFINXZDINX-NEXT: mv s0, a4 918; RV32IZFINXZDINX-NEXT: mv s1, a3 919; RV32IZFINXZDINX-NEXT: mv s2, a2 920; RV32IZFINXZDINX-NEXT: mv a2, a1 921; RV32IZFINXZDINX-NEXT: mv s3, a0 922; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 923; RV32IZFINXZDINX-NEXT: mv a0, a2 924; RV32IZFINXZDINX-NEXT: call frexpf 925; RV32IZFINXZDINX-NEXT: mv s4, a0 926; RV32IZFINXZDINX-NEXT: addi a1, sp, 12 927; RV32IZFINXZDINX-NEXT: mv a0, s2 928; RV32IZFINXZDINX-NEXT: call frexpf 929; RV32IZFINXZDINX-NEXT: mv s2, a0 930; RV32IZFINXZDINX-NEXT: addi a1, sp, 16 931; RV32IZFINXZDINX-NEXT: mv a0, s1 932; RV32IZFINXZDINX-NEXT: call frexpf 933; RV32IZFINXZDINX-NEXT: mv s1, a0 934; RV32IZFINXZDINX-NEXT: addi a1, sp, 20 935; RV32IZFINXZDINX-NEXT: mv a0, s0 936; RV32IZFINXZDINX-NEXT: call frexpf 937; RV32IZFINXZDINX-NEXT: sw s4, 0(s3) 938; RV32IZFINXZDINX-NEXT: sw s2, 4(s3) 939; RV32IZFINXZDINX-NEXT: sw s1, 8(s3) 940; RV32IZFINXZDINX-NEXT: sw a0, 12(s3) 941; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 942; RV32IZFINXZDINX-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 943; RV32IZFINXZDINX-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 944; RV32IZFINXZDINX-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 945; RV32IZFINXZDINX-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 946; RV32IZFINXZDINX-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 947; RV32IZFINXZDINX-NEXT: addi sp, sp, 48 948; RV32IZFINXZDINX-NEXT: ret 949; 950; RV64IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 951; RV64IZFINXZDINX: # %bb.0: 952; RV64IZFINXZDINX-NEXT: addi sp, sp, -80 953; RV64IZFINXZDINX-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 954; RV64IZFINXZDINX-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 955; RV64IZFINXZDINX-NEXT: sd s1, 56(sp) # 8-byte Folded Spill 956; RV64IZFINXZDINX-NEXT: sd s2, 48(sp) # 8-byte Folded Spill 957; RV64IZFINXZDINX-NEXT: sd s3, 40(sp) # 8-byte Folded Spill 958; RV64IZFINXZDINX-NEXT: sd s4, 32(sp) # 8-byte Folded Spill 959; RV64IZFINXZDINX-NEXT: mv s0, a4 960; RV64IZFINXZDINX-NEXT: mv s1, a3 961; RV64IZFINXZDINX-NEXT: mv s2, a2 962; RV64IZFINXZDINX-NEXT: mv a2, a1 963; RV64IZFINXZDINX-NEXT: mv s3, a0 964; RV64IZFINXZDINX-NEXT: mv a1, sp 965; RV64IZFINXZDINX-NEXT: mv a0, a2 966; RV64IZFINXZDINX-NEXT: call frexpf 967; RV64IZFINXZDINX-NEXT: mv s4, a0 968; RV64IZFINXZDINX-NEXT: addi a1, sp, 8 969; RV64IZFINXZDINX-NEXT: mv a0, s2 970; RV64IZFINXZDINX-NEXT: call frexpf 971; RV64IZFINXZDINX-NEXT: mv s2, a0 972; RV64IZFINXZDINX-NEXT: addi a1, sp, 16 973; RV64IZFINXZDINX-NEXT: mv a0, s1 974; RV64IZFINXZDINX-NEXT: call frexpf 975; RV64IZFINXZDINX-NEXT: mv s1, a0 976; RV64IZFINXZDINX-NEXT: addi a1, sp, 24 977; RV64IZFINXZDINX-NEXT: mv a0, s0 978; RV64IZFINXZDINX-NEXT: call frexpf 979; RV64IZFINXZDINX-NEXT: sw s4, 0(s3) 980; RV64IZFINXZDINX-NEXT: sw s2, 4(s3) 981; RV64IZFINXZDINX-NEXT: sw s1, 8(s3) 982; RV64IZFINXZDINX-NEXT: sw a0, 12(s3) 983; RV64IZFINXZDINX-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 984; RV64IZFINXZDINX-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 985; RV64IZFINXZDINX-NEXT: ld s1, 56(sp) # 8-byte Folded Reload 986; RV64IZFINXZDINX-NEXT: ld s2, 48(sp) # 8-byte Folded Reload 987; RV64IZFINXZDINX-NEXT: ld s3, 40(sp) # 8-byte Folded Reload 988; RV64IZFINXZDINX-NEXT: ld s4, 32(sp) # 8-byte Folded Reload 989; RV64IZFINXZDINX-NEXT: addi sp, sp, 80 990; RV64IZFINXZDINX-NEXT: ret 991; 992; RV32I-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 993; RV32I: # %bb.0: 994; RV32I-NEXT: addi sp, sp, -48 995; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 996; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 997; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 998; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 999; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 1000; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 1001; RV32I-NEXT: lw a2, 0(a1) 1002; RV32I-NEXT: lw s0, 4(a1) 1003; RV32I-NEXT: lw s1, 8(a1) 1004; RV32I-NEXT: lw s2, 12(a1) 1005; RV32I-NEXT: mv s3, a0 1006; RV32I-NEXT: addi a1, sp, 8 1007; RV32I-NEXT: mv a0, a2 1008; RV32I-NEXT: call frexpf 1009; RV32I-NEXT: mv s4, a0 1010; RV32I-NEXT: addi a1, sp, 12 1011; RV32I-NEXT: mv a0, s0 1012; RV32I-NEXT: call frexpf 1013; RV32I-NEXT: mv s0, a0 1014; RV32I-NEXT: addi a1, sp, 16 1015; RV32I-NEXT: mv a0, s1 1016; RV32I-NEXT: call frexpf 1017; RV32I-NEXT: mv s1, a0 1018; RV32I-NEXT: addi a1, sp, 20 1019; RV32I-NEXT: mv a0, s2 1020; RV32I-NEXT: call frexpf 1021; RV32I-NEXT: sw s4, 0(s3) 1022; RV32I-NEXT: sw s0, 4(s3) 1023; RV32I-NEXT: sw s1, 8(s3) 1024; RV32I-NEXT: sw a0, 12(s3) 1025; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1026; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1027; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 1028; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 1029; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 1030; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 1031; RV32I-NEXT: addi sp, sp, 48 1032; RV32I-NEXT: ret 1033; 1034; RV64I-LABEL: test_frexp_v4f32_v4i32_only_use_fract: 1035; RV64I: # %bb.0: 1036; RV64I-NEXT: addi sp, sp, -64 1037; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 1038; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 1039; RV64I-NEXT: sd s1, 40(sp) # 8-byte Folded Spill 1040; RV64I-NEXT: sd s2, 32(sp) # 8-byte Folded Spill 1041; RV64I-NEXT: sd s3, 24(sp) # 8-byte Folded Spill 1042; RV64I-NEXT: sd s4, 16(sp) # 8-byte Folded Spill 1043; RV64I-NEXT: lw a2, 0(a1) 1044; RV64I-NEXT: lw s0, 8(a1) 1045; RV64I-NEXT: lw s1, 16(a1) 1046; RV64I-NEXT: lw s2, 24(a1) 1047; RV64I-NEXT: mv s3, a0 1048; RV64I-NEXT: mv a1, sp 1049; RV64I-NEXT: mv a0, a2 1050; RV64I-NEXT: call frexpf 1051; RV64I-NEXT: mv s4, a0 1052; RV64I-NEXT: addi a1, sp, 4 1053; RV64I-NEXT: mv a0, s0 1054; RV64I-NEXT: call frexpf 1055; RV64I-NEXT: mv s0, a0 1056; RV64I-NEXT: addi a1, sp, 8 1057; RV64I-NEXT: mv a0, s1 1058; RV64I-NEXT: call frexpf 1059; RV64I-NEXT: mv s1, a0 1060; RV64I-NEXT: addi a1, sp, 12 1061; RV64I-NEXT: mv a0, s2 1062; RV64I-NEXT: call frexpf 1063; RV64I-NEXT: sw s4, 0(s3) 1064; RV64I-NEXT: sw s0, 4(s3) 1065; RV64I-NEXT: sw s1, 8(s3) 1066; RV64I-NEXT: sw a0, 12(s3) 1067; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 1068; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 1069; RV64I-NEXT: ld s1, 40(sp) # 8-byte Folded Reload 1070; RV64I-NEXT: ld s2, 32(sp) # 8-byte Folded Reload 1071; RV64I-NEXT: ld s3, 24(sp) # 8-byte Folded Reload 1072; RV64I-NEXT: ld s4, 16(sp) # 8-byte Folded Reload 1073; RV64I-NEXT: addi sp, sp, 64 1074; RV64I-NEXT: ret 1075 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a) 1076 %result.0 = extractvalue { <4 x float>, <4 x i32> } %result, 0 1077 ret <4 x float> %result.0 1078} 1079 1080define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) nounwind { 1081; RV32IFD-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1082; RV32IFD: # %bb.0: 1083; RV32IFD-NEXT: addi sp, sp, -32 1084; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1085; RV32IFD-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1086; RV32IFD-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill 1087; RV32IFD-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill 1088; RV32IFD-NEXT: fsd fs2, 0(sp) # 8-byte Folded Spill 1089; RV32IFD-NEXT: fmv.s fs0, fa2 1090; RV32IFD-NEXT: fmv.s fs1, fa1 1091; RV32IFD-NEXT: fmv.s fs2, fa0 1092; RV32IFD-NEXT: mv s0, a0 1093; RV32IFD-NEXT: addi a0, a0, 12 1094; RV32IFD-NEXT: fmv.s fa0, fa3 1095; RV32IFD-NEXT: call frexpf 1096; RV32IFD-NEXT: addi a0, s0, 8 1097; RV32IFD-NEXT: fmv.s fa0, fs0 1098; RV32IFD-NEXT: call frexpf 1099; RV32IFD-NEXT: addi a0, s0, 4 1100; RV32IFD-NEXT: fmv.s fa0, fs1 1101; RV32IFD-NEXT: call frexpf 1102; RV32IFD-NEXT: fmv.s fa0, fs2 1103; RV32IFD-NEXT: mv a0, s0 1104; RV32IFD-NEXT: call frexpf 1105; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1106; RV32IFD-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1107; RV32IFD-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload 1108; RV32IFD-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload 1109; RV32IFD-NEXT: fld fs2, 0(sp) # 8-byte Folded Reload 1110; RV32IFD-NEXT: addi sp, sp, 32 1111; RV32IFD-NEXT: ret 1112; 1113; RV64IFD-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1114; RV64IFD: # %bb.0: 1115; RV64IFD-NEXT: addi sp, sp, -80 1116; RV64IFD-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 1117; RV64IFD-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 1118; RV64IFD-NEXT: fsd fs0, 56(sp) # 8-byte Folded Spill 1119; RV64IFD-NEXT: fsd fs1, 48(sp) # 8-byte Folded Spill 1120; RV64IFD-NEXT: fsd fs2, 40(sp) # 8-byte Folded Spill 1121; RV64IFD-NEXT: fmv.s fs0, fa3 1122; RV64IFD-NEXT: fmv.s fs1, fa2 1123; RV64IFD-NEXT: fmv.s fs2, fa1 1124; RV64IFD-NEXT: mv s0, a0 1125; RV64IFD-NEXT: addi a0, sp, 8 1126; RV64IFD-NEXT: call frexpf 1127; RV64IFD-NEXT: addi a0, sp, 16 1128; RV64IFD-NEXT: fmv.s fa0, fs2 1129; RV64IFD-NEXT: call frexpf 1130; RV64IFD-NEXT: addi a0, sp, 24 1131; RV64IFD-NEXT: fmv.s fa0, fs1 1132; RV64IFD-NEXT: call frexpf 1133; RV64IFD-NEXT: addi a0, sp, 32 1134; RV64IFD-NEXT: fmv.s fa0, fs0 1135; RV64IFD-NEXT: call frexpf 1136; RV64IFD-NEXT: ld a0, 8(sp) 1137; RV64IFD-NEXT: ld a1, 16(sp) 1138; RV64IFD-NEXT: ld a2, 24(sp) 1139; RV64IFD-NEXT: ld a3, 32(sp) 1140; RV64IFD-NEXT: sw a0, 0(s0) 1141; RV64IFD-NEXT: sw a1, 4(s0) 1142; RV64IFD-NEXT: sw a2, 8(s0) 1143; RV64IFD-NEXT: sw a3, 12(s0) 1144; RV64IFD-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 1145; RV64IFD-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 1146; RV64IFD-NEXT: fld fs0, 56(sp) # 8-byte Folded Reload 1147; RV64IFD-NEXT: fld fs1, 48(sp) # 8-byte Folded Reload 1148; RV64IFD-NEXT: fld fs2, 40(sp) # 8-byte Folded Reload 1149; RV64IFD-NEXT: addi sp, sp, 80 1150; RV64IFD-NEXT: ret 1151; 1152; RV32IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1153; RV32IZFINXZDINX: # %bb.0: 1154; RV32IZFINXZDINX-NEXT: addi sp, sp, -32 1155; RV32IZFINXZDINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1156; RV32IZFINXZDINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1157; RV32IZFINXZDINX-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1158; RV32IZFINXZDINX-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1159; RV32IZFINXZDINX-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1160; RV32IZFINXZDINX-NEXT: mv s0, a3 1161; RV32IZFINXZDINX-NEXT: mv s1, a2 1162; RV32IZFINXZDINX-NEXT: mv s2, a1 1163; RV32IZFINXZDINX-NEXT: mv s3, a0 1164; RV32IZFINXZDINX-NEXT: addi a1, a0, 12 1165; RV32IZFINXZDINX-NEXT: mv a0, a4 1166; RV32IZFINXZDINX-NEXT: call frexpf 1167; RV32IZFINXZDINX-NEXT: addi a1, s3, 8 1168; RV32IZFINXZDINX-NEXT: mv a0, s0 1169; RV32IZFINXZDINX-NEXT: call frexpf 1170; RV32IZFINXZDINX-NEXT: addi a1, s3, 4 1171; RV32IZFINXZDINX-NEXT: mv a0, s1 1172; RV32IZFINXZDINX-NEXT: call frexpf 1173; RV32IZFINXZDINX-NEXT: mv a0, s2 1174; RV32IZFINXZDINX-NEXT: mv a1, s3 1175; RV32IZFINXZDINX-NEXT: call frexpf 1176; RV32IZFINXZDINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1177; RV32IZFINXZDINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1178; RV32IZFINXZDINX-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1179; RV32IZFINXZDINX-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1180; RV32IZFINXZDINX-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1181; RV32IZFINXZDINX-NEXT: addi sp, sp, 32 1182; RV32IZFINXZDINX-NEXT: ret 1183; 1184; RV64IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1185; RV64IZFINXZDINX: # %bb.0: 1186; RV64IZFINXZDINX-NEXT: addi sp, sp, -80 1187; RV64IZFINXZDINX-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 1188; RV64IZFINXZDINX-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 1189; RV64IZFINXZDINX-NEXT: sd s1, 56(sp) # 8-byte Folded Spill 1190; RV64IZFINXZDINX-NEXT: sd s2, 48(sp) # 8-byte Folded Spill 1191; RV64IZFINXZDINX-NEXT: sd s3, 40(sp) # 8-byte Folded Spill 1192; RV64IZFINXZDINX-NEXT: mv s0, a4 1193; RV64IZFINXZDINX-NEXT: mv s1, a3 1194; RV64IZFINXZDINX-NEXT: mv s2, a2 1195; RV64IZFINXZDINX-NEXT: mv a2, a1 1196; RV64IZFINXZDINX-NEXT: mv s3, a0 1197; RV64IZFINXZDINX-NEXT: addi a1, sp, 8 1198; RV64IZFINXZDINX-NEXT: mv a0, a2 1199; RV64IZFINXZDINX-NEXT: call frexpf 1200; RV64IZFINXZDINX-NEXT: addi a1, sp, 16 1201; RV64IZFINXZDINX-NEXT: mv a0, s2 1202; RV64IZFINXZDINX-NEXT: call frexpf 1203; RV64IZFINXZDINX-NEXT: addi a1, sp, 24 1204; RV64IZFINXZDINX-NEXT: mv a0, s1 1205; RV64IZFINXZDINX-NEXT: call frexpf 1206; RV64IZFINXZDINX-NEXT: addi a1, sp, 32 1207; RV64IZFINXZDINX-NEXT: mv a0, s0 1208; RV64IZFINXZDINX-NEXT: call frexpf 1209; RV64IZFINXZDINX-NEXT: ld a0, 8(sp) 1210; RV64IZFINXZDINX-NEXT: ld a1, 16(sp) 1211; RV64IZFINXZDINX-NEXT: ld a2, 24(sp) 1212; RV64IZFINXZDINX-NEXT: ld a3, 32(sp) 1213; RV64IZFINXZDINX-NEXT: sw a0, 0(s3) 1214; RV64IZFINXZDINX-NEXT: sw a1, 4(s3) 1215; RV64IZFINXZDINX-NEXT: sw a2, 8(s3) 1216; RV64IZFINXZDINX-NEXT: sw a3, 12(s3) 1217; RV64IZFINXZDINX-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 1218; RV64IZFINXZDINX-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 1219; RV64IZFINXZDINX-NEXT: ld s1, 56(sp) # 8-byte Folded Reload 1220; RV64IZFINXZDINX-NEXT: ld s2, 48(sp) # 8-byte Folded Reload 1221; RV64IZFINXZDINX-NEXT: ld s3, 40(sp) # 8-byte Folded Reload 1222; RV64IZFINXZDINX-NEXT: addi sp, sp, 80 1223; RV64IZFINXZDINX-NEXT: ret 1224; 1225; RV32I-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1226; RV32I: # %bb.0: 1227; RV32I-NEXT: addi sp, sp, -48 1228; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1229; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1230; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 1231; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 1232; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 1233; RV32I-NEXT: lw a2, 0(a1) 1234; RV32I-NEXT: lw s0, 4(a1) 1235; RV32I-NEXT: lw s1, 8(a1) 1236; RV32I-NEXT: lw s2, 12(a1) 1237; RV32I-NEXT: mv s3, a0 1238; RV32I-NEXT: addi a1, sp, 12 1239; RV32I-NEXT: mv a0, a2 1240; RV32I-NEXT: call frexpf 1241; RV32I-NEXT: addi a1, sp, 16 1242; RV32I-NEXT: mv a0, s0 1243; RV32I-NEXT: call frexpf 1244; RV32I-NEXT: addi a1, sp, 20 1245; RV32I-NEXT: mv a0, s1 1246; RV32I-NEXT: call frexpf 1247; RV32I-NEXT: addi a1, sp, 24 1248; RV32I-NEXT: mv a0, s2 1249; RV32I-NEXT: call frexpf 1250; RV32I-NEXT: lw a0, 12(sp) 1251; RV32I-NEXT: lw a1, 16(sp) 1252; RV32I-NEXT: lw a2, 20(sp) 1253; RV32I-NEXT: lw a3, 24(sp) 1254; RV32I-NEXT: sw a0, 0(s3) 1255; RV32I-NEXT: sw a1, 4(s3) 1256; RV32I-NEXT: sw a2, 8(s3) 1257; RV32I-NEXT: sw a3, 12(s3) 1258; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1259; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1260; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 1261; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 1262; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 1263; RV32I-NEXT: addi sp, sp, 48 1264; RV32I-NEXT: ret 1265; 1266; RV64I-LABEL: test_frexp_v4f32_v4i32_only_use_exp: 1267; RV64I: # %bb.0: 1268; RV64I-NEXT: addi sp, sp, -64 1269; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 1270; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 1271; RV64I-NEXT: sd s1, 40(sp) # 8-byte Folded Spill 1272; RV64I-NEXT: sd s2, 32(sp) # 8-byte Folded Spill 1273; RV64I-NEXT: sd s3, 24(sp) # 8-byte Folded Spill 1274; RV64I-NEXT: lw a2, 0(a1) 1275; RV64I-NEXT: lw s0, 8(a1) 1276; RV64I-NEXT: lw s1, 16(a1) 1277; RV64I-NEXT: lw s2, 24(a1) 1278; RV64I-NEXT: mv s3, a0 1279; RV64I-NEXT: addi a1, sp, 8 1280; RV64I-NEXT: mv a0, a2 1281; RV64I-NEXT: call frexpf 1282; RV64I-NEXT: addi a1, sp, 12 1283; RV64I-NEXT: mv a0, s0 1284; RV64I-NEXT: call frexpf 1285; RV64I-NEXT: addi a1, sp, 16 1286; RV64I-NEXT: mv a0, s1 1287; RV64I-NEXT: call frexpf 1288; RV64I-NEXT: addi a1, sp, 20 1289; RV64I-NEXT: mv a0, s2 1290; RV64I-NEXT: call frexpf 1291; RV64I-NEXT: lw a0, 8(sp) 1292; RV64I-NEXT: lw a1, 12(sp) 1293; RV64I-NEXT: lw a2, 16(sp) 1294; RV64I-NEXT: lw a3, 20(sp) 1295; RV64I-NEXT: sw a0, 0(s3) 1296; RV64I-NEXT: sw a1, 4(s3) 1297; RV64I-NEXT: sw a2, 8(s3) 1298; RV64I-NEXT: sw a3, 12(s3) 1299; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 1300; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 1301; RV64I-NEXT: ld s1, 40(sp) # 8-byte Folded Reload 1302; RV64I-NEXT: ld s2, 32(sp) # 8-byte Folded Reload 1303; RV64I-NEXT: ld s3, 24(sp) # 8-byte Folded Reload 1304; RV64I-NEXT: addi sp, sp, 64 1305; RV64I-NEXT: ret 1306 %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a) 1307 %result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1 1308 ret <4 x i32> %result.1 1309} 1310 1311define { double, i32 } @test_frexp_f64_i32(double %a) nounwind { 1312; RV32IFD-LABEL: test_frexp_f64_i32: 1313; RV32IFD: # %bb.0: 1314; RV32IFD-NEXT: addi sp, sp, -16 1315; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1316; RV32IFD-NEXT: addi a0, sp, 8 1317; RV32IFD-NEXT: call frexp 1318; RV32IFD-NEXT: lw a0, 8(sp) 1319; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1320; RV32IFD-NEXT: addi sp, sp, 16 1321; RV32IFD-NEXT: ret 1322; 1323; RV64IFD-LABEL: test_frexp_f64_i32: 1324; RV64IFD: # %bb.0: 1325; RV64IFD-NEXT: addi sp, sp, -16 1326; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1327; RV64IFD-NEXT: mv a0, sp 1328; RV64IFD-NEXT: call frexp 1329; RV64IFD-NEXT: ld a0, 0(sp) 1330; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1331; RV64IFD-NEXT: addi sp, sp, 16 1332; RV64IFD-NEXT: ret 1333; 1334; RV32IZFINXZDINX-LABEL: test_frexp_f64_i32: 1335; RV32IZFINXZDINX: # %bb.0: 1336; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 1337; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1338; RV32IZFINXZDINX-NEXT: addi a2, sp, 8 1339; RV32IZFINXZDINX-NEXT: call frexp 1340; RV32IZFINXZDINX-NEXT: lw a2, 8(sp) 1341; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1342; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 1343; RV32IZFINXZDINX-NEXT: ret 1344; 1345; RV64IZFINXZDINX-LABEL: test_frexp_f64_i32: 1346; RV64IZFINXZDINX: # %bb.0: 1347; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 1348; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1349; RV64IZFINXZDINX-NEXT: mv a1, sp 1350; RV64IZFINXZDINX-NEXT: call frexp 1351; RV64IZFINXZDINX-NEXT: ld a1, 0(sp) 1352; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1353; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 1354; RV64IZFINXZDINX-NEXT: ret 1355; 1356; RV32I-LABEL: test_frexp_f64_i32: 1357; RV32I: # %bb.0: 1358; RV32I-NEXT: addi sp, sp, -16 1359; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1360; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1361; RV32I-NEXT: mv a3, a2 1362; RV32I-NEXT: mv s0, a0 1363; RV32I-NEXT: addi a2, sp, 4 1364; RV32I-NEXT: mv a0, a1 1365; RV32I-NEXT: mv a1, a3 1366; RV32I-NEXT: call frexp 1367; RV32I-NEXT: lw a2, 4(sp) 1368; RV32I-NEXT: sw a0, 0(s0) 1369; RV32I-NEXT: sw a1, 4(s0) 1370; RV32I-NEXT: sw a2, 8(s0) 1371; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1372; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1373; RV32I-NEXT: addi sp, sp, 16 1374; RV32I-NEXT: ret 1375; 1376; RV64I-LABEL: test_frexp_f64_i32: 1377; RV64I: # %bb.0: 1378; RV64I-NEXT: addi sp, sp, -16 1379; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1380; RV64I-NEXT: addi a1, sp, 4 1381; RV64I-NEXT: call frexp 1382; RV64I-NEXT: lw a1, 4(sp) 1383; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1384; RV64I-NEXT: addi sp, sp, 16 1385; RV64I-NEXT: ret 1386 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a) 1387 ret { double, i32 } %result 1388} 1389 1390define double @test_frexp_f64_i32_only_use_fract(double %a) nounwind { 1391; RV32IFD-LABEL: test_frexp_f64_i32_only_use_fract: 1392; RV32IFD: # %bb.0: 1393; RV32IFD-NEXT: addi sp, sp, -16 1394; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1395; RV32IFD-NEXT: addi a0, sp, 8 1396; RV32IFD-NEXT: call frexp 1397; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1398; RV32IFD-NEXT: addi sp, sp, 16 1399; RV32IFD-NEXT: ret 1400; 1401; RV64IFD-LABEL: test_frexp_f64_i32_only_use_fract: 1402; RV64IFD: # %bb.0: 1403; RV64IFD-NEXT: addi sp, sp, -16 1404; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1405; RV64IFD-NEXT: mv a0, sp 1406; RV64IFD-NEXT: call frexp 1407; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1408; RV64IFD-NEXT: addi sp, sp, 16 1409; RV64IFD-NEXT: ret 1410; 1411; RV32IZFINXZDINX-LABEL: test_frexp_f64_i32_only_use_fract: 1412; RV32IZFINXZDINX: # %bb.0: 1413; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 1414; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1415; RV32IZFINXZDINX-NEXT: addi a2, sp, 8 1416; RV32IZFINXZDINX-NEXT: call frexp 1417; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1418; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 1419; RV32IZFINXZDINX-NEXT: ret 1420; 1421; RV64IZFINXZDINX-LABEL: test_frexp_f64_i32_only_use_fract: 1422; RV64IZFINXZDINX: # %bb.0: 1423; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 1424; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1425; RV64IZFINXZDINX-NEXT: mv a1, sp 1426; RV64IZFINXZDINX-NEXT: call frexp 1427; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1428; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 1429; RV64IZFINXZDINX-NEXT: ret 1430; 1431; RV32I-LABEL: test_frexp_f64_i32_only_use_fract: 1432; RV32I: # %bb.0: 1433; RV32I-NEXT: addi sp, sp, -16 1434; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1435; RV32I-NEXT: addi a2, sp, 8 1436; RV32I-NEXT: call frexp 1437; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1438; RV32I-NEXT: addi sp, sp, 16 1439; RV32I-NEXT: ret 1440; 1441; RV64I-LABEL: test_frexp_f64_i32_only_use_fract: 1442; RV64I: # %bb.0: 1443; RV64I-NEXT: addi sp, sp, -16 1444; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1445; RV64I-NEXT: addi a1, sp, 4 1446; RV64I-NEXT: call frexp 1447; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1448; RV64I-NEXT: addi sp, sp, 16 1449; RV64I-NEXT: ret 1450 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a) 1451 %result.0 = extractvalue { double, i32 } %result, 0 1452 ret double %result.0 1453} 1454 1455define i32 @test_frexp_f64_i32_only_use_exp(double %a) nounwind { 1456; RV32IFD-LABEL: test_frexp_f64_i32_only_use_exp: 1457; RV32IFD: # %bb.0: 1458; RV32IFD-NEXT: addi sp, sp, -16 1459; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1460; RV32IFD-NEXT: addi a0, sp, 8 1461; RV32IFD-NEXT: call frexp 1462; RV32IFD-NEXT: lw a0, 8(sp) 1463; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1464; RV32IFD-NEXT: addi sp, sp, 16 1465; RV32IFD-NEXT: ret 1466; 1467; RV64IFD-LABEL: test_frexp_f64_i32_only_use_exp: 1468; RV64IFD: # %bb.0: 1469; RV64IFD-NEXT: addi sp, sp, -16 1470; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1471; RV64IFD-NEXT: mv a0, sp 1472; RV64IFD-NEXT: call frexp 1473; RV64IFD-NEXT: ld a0, 0(sp) 1474; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1475; RV64IFD-NEXT: addi sp, sp, 16 1476; RV64IFD-NEXT: ret 1477; 1478; RV32IZFINXZDINX-LABEL: test_frexp_f64_i32_only_use_exp: 1479; RV32IZFINXZDINX: # %bb.0: 1480; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 1481; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1482; RV32IZFINXZDINX-NEXT: addi a2, sp, 8 1483; RV32IZFINXZDINX-NEXT: call frexp 1484; RV32IZFINXZDINX-NEXT: lw a0, 8(sp) 1485; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1486; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 1487; RV32IZFINXZDINX-NEXT: ret 1488; 1489; RV64IZFINXZDINX-LABEL: test_frexp_f64_i32_only_use_exp: 1490; RV64IZFINXZDINX: # %bb.0: 1491; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 1492; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1493; RV64IZFINXZDINX-NEXT: mv a1, sp 1494; RV64IZFINXZDINX-NEXT: call frexp 1495; RV64IZFINXZDINX-NEXT: ld a0, 0(sp) 1496; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1497; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 1498; RV64IZFINXZDINX-NEXT: ret 1499; 1500; RV32I-LABEL: test_frexp_f64_i32_only_use_exp: 1501; RV32I: # %bb.0: 1502; RV32I-NEXT: addi sp, sp, -16 1503; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1504; RV32I-NEXT: addi a2, sp, 8 1505; RV32I-NEXT: call frexp 1506; RV32I-NEXT: lw a0, 8(sp) 1507; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1508; RV32I-NEXT: addi sp, sp, 16 1509; RV32I-NEXT: ret 1510; 1511; RV64I-LABEL: test_frexp_f64_i32_only_use_exp: 1512; RV64I: # %bb.0: 1513; RV64I-NEXT: addi sp, sp, -16 1514; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1515; RV64I-NEXT: addi a1, sp, 4 1516; RV64I-NEXT: call frexp 1517; RV64I-NEXT: lw a0, 4(sp) 1518; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1519; RV64I-NEXT: addi sp, sp, 16 1520; RV64I-NEXT: ret 1521 %result = call { double, i32 } @llvm.frexp.f64.i32(double %a) 1522 %result.0 = extractvalue { double, i32 } %result, 1 1523 ret i32 %result.0 1524} 1525 1526; FIXME: Widen vector result 1527; define { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) nounwind { 1528; %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a) 1529; ret { <2 x double>, <2 x i32> } %result 1530; } 1531 1532; define <2 x double> @test_frexp_v2f64_v2i32_only_use_fract(<2 x double> %a) nounwind { 1533; %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a) 1534; %result.0 = extractvalue { <2 x double>, <2 x i32> } %result, 0 1535; ret <2 x double> %result.0 1536; } 1537 1538; define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) nounwind { 1539; %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a) 1540; %result.1 = extractvalue { <2 x double>, <2 x i32> } %result, 1 1541; ret <2 x i32> %result.1 1542; } 1543 1544define { fp128, i32 } @test_frexp_f128_i32(fp128 %a) nounwind { 1545; RV32IFD-LABEL: test_frexp_f128_i32: 1546; RV32IFD: # %bb.0: 1547; RV32IFD-NEXT: addi sp, sp, -48 1548; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1549; RV32IFD-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1550; RV32IFD-NEXT: lw a3, 0(a1) 1551; RV32IFD-NEXT: lw a4, 4(a1) 1552; RV32IFD-NEXT: lw a5, 8(a1) 1553; RV32IFD-NEXT: lw a6, 12(a1) 1554; RV32IFD-NEXT: mv s0, a0 1555; RV32IFD-NEXT: addi a0, sp, 16 1556; RV32IFD-NEXT: mv a1, sp 1557; RV32IFD-NEXT: addi a2, sp, 36 1558; RV32IFD-NEXT: sw a3, 0(sp) 1559; RV32IFD-NEXT: sw a4, 4(sp) 1560; RV32IFD-NEXT: sw a5, 8(sp) 1561; RV32IFD-NEXT: sw a6, 12(sp) 1562; RV32IFD-NEXT: call frexpl 1563; RV32IFD-NEXT: lw a0, 36(sp) 1564; RV32IFD-NEXT: lw a1, 16(sp) 1565; RV32IFD-NEXT: lw a2, 20(sp) 1566; RV32IFD-NEXT: lw a3, 24(sp) 1567; RV32IFD-NEXT: lw a4, 28(sp) 1568; RV32IFD-NEXT: sw a1, 0(s0) 1569; RV32IFD-NEXT: sw a2, 4(s0) 1570; RV32IFD-NEXT: sw a3, 8(s0) 1571; RV32IFD-NEXT: sw a4, 12(s0) 1572; RV32IFD-NEXT: sw a0, 16(s0) 1573; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1574; RV32IFD-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1575; RV32IFD-NEXT: addi sp, sp, 48 1576; RV32IFD-NEXT: ret 1577; 1578; RV64IFD-LABEL: test_frexp_f128_i32: 1579; RV64IFD: # %bb.0: 1580; RV64IFD-NEXT: addi sp, sp, -32 1581; RV64IFD-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1582; RV64IFD-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1583; RV64IFD-NEXT: mv a3, a2 1584; RV64IFD-NEXT: mv s0, a0 1585; RV64IFD-NEXT: addi a2, sp, 12 1586; RV64IFD-NEXT: mv a0, a1 1587; RV64IFD-NEXT: mv a1, a3 1588; RV64IFD-NEXT: call frexpl 1589; RV64IFD-NEXT: lw a2, 12(sp) 1590; RV64IFD-NEXT: sd a0, 0(s0) 1591; RV64IFD-NEXT: sd a1, 8(s0) 1592; RV64IFD-NEXT: sw a2, 16(s0) 1593; RV64IFD-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1594; RV64IFD-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1595; RV64IFD-NEXT: addi sp, sp, 32 1596; RV64IFD-NEXT: ret 1597; 1598; RV32IZFINXZDINX-LABEL: test_frexp_f128_i32: 1599; RV32IZFINXZDINX: # %bb.0: 1600; RV32IZFINXZDINX-NEXT: addi sp, sp, -48 1601; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1602; RV32IZFINXZDINX-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1603; RV32IZFINXZDINX-NEXT: lw a3, 0(a1) 1604; RV32IZFINXZDINX-NEXT: lw a4, 4(a1) 1605; RV32IZFINXZDINX-NEXT: lw a5, 8(a1) 1606; RV32IZFINXZDINX-NEXT: lw a6, 12(a1) 1607; RV32IZFINXZDINX-NEXT: mv s0, a0 1608; RV32IZFINXZDINX-NEXT: addi a0, sp, 16 1609; RV32IZFINXZDINX-NEXT: mv a1, sp 1610; RV32IZFINXZDINX-NEXT: addi a2, sp, 36 1611; RV32IZFINXZDINX-NEXT: sw a3, 0(sp) 1612; RV32IZFINXZDINX-NEXT: sw a4, 4(sp) 1613; RV32IZFINXZDINX-NEXT: sw a5, 8(sp) 1614; RV32IZFINXZDINX-NEXT: sw a6, 12(sp) 1615; RV32IZFINXZDINX-NEXT: call frexpl 1616; RV32IZFINXZDINX-NEXT: lw a0, 36(sp) 1617; RV32IZFINXZDINX-NEXT: lw a1, 16(sp) 1618; RV32IZFINXZDINX-NEXT: lw a2, 20(sp) 1619; RV32IZFINXZDINX-NEXT: lw a3, 24(sp) 1620; RV32IZFINXZDINX-NEXT: lw a4, 28(sp) 1621; RV32IZFINXZDINX-NEXT: sw a1, 0(s0) 1622; RV32IZFINXZDINX-NEXT: sw a2, 4(s0) 1623; RV32IZFINXZDINX-NEXT: sw a3, 8(s0) 1624; RV32IZFINXZDINX-NEXT: sw a4, 12(s0) 1625; RV32IZFINXZDINX-NEXT: sw a0, 16(s0) 1626; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1627; RV32IZFINXZDINX-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1628; RV32IZFINXZDINX-NEXT: addi sp, sp, 48 1629; RV32IZFINXZDINX-NEXT: ret 1630; 1631; RV64IZFINXZDINX-LABEL: test_frexp_f128_i32: 1632; RV64IZFINXZDINX: # %bb.0: 1633; RV64IZFINXZDINX-NEXT: addi sp, sp, -32 1634; RV64IZFINXZDINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1635; RV64IZFINXZDINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1636; RV64IZFINXZDINX-NEXT: mv a3, a2 1637; RV64IZFINXZDINX-NEXT: mv s0, a0 1638; RV64IZFINXZDINX-NEXT: addi a2, sp, 12 1639; RV64IZFINXZDINX-NEXT: mv a0, a1 1640; RV64IZFINXZDINX-NEXT: mv a1, a3 1641; RV64IZFINXZDINX-NEXT: call frexpl 1642; RV64IZFINXZDINX-NEXT: lw a2, 12(sp) 1643; RV64IZFINXZDINX-NEXT: sd a0, 0(s0) 1644; RV64IZFINXZDINX-NEXT: sd a1, 8(s0) 1645; RV64IZFINXZDINX-NEXT: sw a2, 16(s0) 1646; RV64IZFINXZDINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1647; RV64IZFINXZDINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1648; RV64IZFINXZDINX-NEXT: addi sp, sp, 32 1649; RV64IZFINXZDINX-NEXT: ret 1650; 1651; RV32I-LABEL: test_frexp_f128_i32: 1652; RV32I: # %bb.0: 1653; RV32I-NEXT: addi sp, sp, -48 1654; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1655; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1656; RV32I-NEXT: lw a3, 0(a1) 1657; RV32I-NEXT: lw a4, 4(a1) 1658; RV32I-NEXT: lw a5, 8(a1) 1659; RV32I-NEXT: lw a6, 12(a1) 1660; RV32I-NEXT: mv s0, a0 1661; RV32I-NEXT: addi a0, sp, 16 1662; RV32I-NEXT: mv a1, sp 1663; RV32I-NEXT: addi a2, sp, 36 1664; RV32I-NEXT: sw a3, 0(sp) 1665; RV32I-NEXT: sw a4, 4(sp) 1666; RV32I-NEXT: sw a5, 8(sp) 1667; RV32I-NEXT: sw a6, 12(sp) 1668; RV32I-NEXT: call frexpl 1669; RV32I-NEXT: lw a0, 36(sp) 1670; RV32I-NEXT: lw a1, 16(sp) 1671; RV32I-NEXT: lw a2, 20(sp) 1672; RV32I-NEXT: lw a3, 24(sp) 1673; RV32I-NEXT: lw a4, 28(sp) 1674; RV32I-NEXT: sw a1, 0(s0) 1675; RV32I-NEXT: sw a2, 4(s0) 1676; RV32I-NEXT: sw a3, 8(s0) 1677; RV32I-NEXT: sw a4, 12(s0) 1678; RV32I-NEXT: sw a0, 16(s0) 1679; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1680; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1681; RV32I-NEXT: addi sp, sp, 48 1682; RV32I-NEXT: ret 1683; 1684; RV64I-LABEL: test_frexp_f128_i32: 1685; RV64I: # %bb.0: 1686; RV64I-NEXT: addi sp, sp, -32 1687; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1688; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1689; RV64I-NEXT: mv a3, a2 1690; RV64I-NEXT: mv s0, a0 1691; RV64I-NEXT: addi a2, sp, 12 1692; RV64I-NEXT: mv a0, a1 1693; RV64I-NEXT: mv a1, a3 1694; RV64I-NEXT: call frexpl 1695; RV64I-NEXT: lw a2, 12(sp) 1696; RV64I-NEXT: sd a0, 0(s0) 1697; RV64I-NEXT: sd a1, 8(s0) 1698; RV64I-NEXT: sw a2, 16(s0) 1699; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1700; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1701; RV64I-NEXT: addi sp, sp, 32 1702; RV64I-NEXT: ret 1703 %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a) 1704 ret { fp128, i32 } %result 1705} 1706 1707define fp128 @test_frexp_f128_i32_only_use_fract(fp128 %a) nounwind { 1708; RV32IFD-LABEL: test_frexp_f128_i32_only_use_fract: 1709; RV32IFD: # %bb.0: 1710; RV32IFD-NEXT: addi sp, sp, -48 1711; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1712; RV32IFD-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1713; RV32IFD-NEXT: lw a3, 0(a1) 1714; RV32IFD-NEXT: lw a4, 4(a1) 1715; RV32IFD-NEXT: lw a5, 8(a1) 1716; RV32IFD-NEXT: lw a6, 12(a1) 1717; RV32IFD-NEXT: mv s0, a0 1718; RV32IFD-NEXT: addi a0, sp, 16 1719; RV32IFD-NEXT: mv a1, sp 1720; RV32IFD-NEXT: addi a2, sp, 36 1721; RV32IFD-NEXT: sw a3, 0(sp) 1722; RV32IFD-NEXT: sw a4, 4(sp) 1723; RV32IFD-NEXT: sw a5, 8(sp) 1724; RV32IFD-NEXT: sw a6, 12(sp) 1725; RV32IFD-NEXT: call frexpl 1726; RV32IFD-NEXT: lw a0, 16(sp) 1727; RV32IFD-NEXT: lw a1, 20(sp) 1728; RV32IFD-NEXT: lw a2, 24(sp) 1729; RV32IFD-NEXT: lw a3, 28(sp) 1730; RV32IFD-NEXT: sw a0, 0(s0) 1731; RV32IFD-NEXT: sw a1, 4(s0) 1732; RV32IFD-NEXT: sw a2, 8(s0) 1733; RV32IFD-NEXT: sw a3, 12(s0) 1734; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1735; RV32IFD-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1736; RV32IFD-NEXT: addi sp, sp, 48 1737; RV32IFD-NEXT: ret 1738; 1739; RV64IFD-LABEL: test_frexp_f128_i32_only_use_fract: 1740; RV64IFD: # %bb.0: 1741; RV64IFD-NEXT: addi sp, sp, -16 1742; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1743; RV64IFD-NEXT: addi a2, sp, 4 1744; RV64IFD-NEXT: call frexpl 1745; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1746; RV64IFD-NEXT: addi sp, sp, 16 1747; RV64IFD-NEXT: ret 1748; 1749; RV32IZFINXZDINX-LABEL: test_frexp_f128_i32_only_use_fract: 1750; RV32IZFINXZDINX: # %bb.0: 1751; RV32IZFINXZDINX-NEXT: addi sp, sp, -48 1752; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1753; RV32IZFINXZDINX-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1754; RV32IZFINXZDINX-NEXT: lw a3, 0(a1) 1755; RV32IZFINXZDINX-NEXT: lw a4, 4(a1) 1756; RV32IZFINXZDINX-NEXT: lw a5, 8(a1) 1757; RV32IZFINXZDINX-NEXT: lw a6, 12(a1) 1758; RV32IZFINXZDINX-NEXT: mv s0, a0 1759; RV32IZFINXZDINX-NEXT: addi a0, sp, 16 1760; RV32IZFINXZDINX-NEXT: mv a1, sp 1761; RV32IZFINXZDINX-NEXT: addi a2, sp, 36 1762; RV32IZFINXZDINX-NEXT: sw a3, 0(sp) 1763; RV32IZFINXZDINX-NEXT: sw a4, 4(sp) 1764; RV32IZFINXZDINX-NEXT: sw a5, 8(sp) 1765; RV32IZFINXZDINX-NEXT: sw a6, 12(sp) 1766; RV32IZFINXZDINX-NEXT: call frexpl 1767; RV32IZFINXZDINX-NEXT: lw a0, 16(sp) 1768; RV32IZFINXZDINX-NEXT: lw a1, 20(sp) 1769; RV32IZFINXZDINX-NEXT: lw a2, 24(sp) 1770; RV32IZFINXZDINX-NEXT: lw a3, 28(sp) 1771; RV32IZFINXZDINX-NEXT: sw a0, 0(s0) 1772; RV32IZFINXZDINX-NEXT: sw a1, 4(s0) 1773; RV32IZFINXZDINX-NEXT: sw a2, 8(s0) 1774; RV32IZFINXZDINX-NEXT: sw a3, 12(s0) 1775; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1776; RV32IZFINXZDINX-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1777; RV32IZFINXZDINX-NEXT: addi sp, sp, 48 1778; RV32IZFINXZDINX-NEXT: ret 1779; 1780; RV64IZFINXZDINX-LABEL: test_frexp_f128_i32_only_use_fract: 1781; RV64IZFINXZDINX: # %bb.0: 1782; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 1783; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1784; RV64IZFINXZDINX-NEXT: addi a2, sp, 4 1785; RV64IZFINXZDINX-NEXT: call frexpl 1786; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1787; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 1788; RV64IZFINXZDINX-NEXT: ret 1789; 1790; RV32I-LABEL: test_frexp_f128_i32_only_use_fract: 1791; RV32I: # %bb.0: 1792; RV32I-NEXT: addi sp, sp, -48 1793; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1794; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1795; RV32I-NEXT: lw a3, 0(a1) 1796; RV32I-NEXT: lw a4, 4(a1) 1797; RV32I-NEXT: lw a5, 8(a1) 1798; RV32I-NEXT: lw a6, 12(a1) 1799; RV32I-NEXT: mv s0, a0 1800; RV32I-NEXT: addi a0, sp, 16 1801; RV32I-NEXT: mv a1, sp 1802; RV32I-NEXT: addi a2, sp, 36 1803; RV32I-NEXT: sw a3, 0(sp) 1804; RV32I-NEXT: sw a4, 4(sp) 1805; RV32I-NEXT: sw a5, 8(sp) 1806; RV32I-NEXT: sw a6, 12(sp) 1807; RV32I-NEXT: call frexpl 1808; RV32I-NEXT: lw a0, 16(sp) 1809; RV32I-NEXT: lw a1, 20(sp) 1810; RV32I-NEXT: lw a2, 24(sp) 1811; RV32I-NEXT: lw a3, 28(sp) 1812; RV32I-NEXT: sw a0, 0(s0) 1813; RV32I-NEXT: sw a1, 4(s0) 1814; RV32I-NEXT: sw a2, 8(s0) 1815; RV32I-NEXT: sw a3, 12(s0) 1816; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1817; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1818; RV32I-NEXT: addi sp, sp, 48 1819; RV32I-NEXT: ret 1820; 1821; RV64I-LABEL: test_frexp_f128_i32_only_use_fract: 1822; RV64I: # %bb.0: 1823; RV64I-NEXT: addi sp, sp, -16 1824; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1825; RV64I-NEXT: addi a2, sp, 4 1826; RV64I-NEXT: call frexpl 1827; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1828; RV64I-NEXT: addi sp, sp, 16 1829; RV64I-NEXT: ret 1830 %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a) 1831 %result.0 = extractvalue { fp128, i32 } %result, 0 1832 ret fp128 %result.0 1833} 1834 1835define i32 @test_frexp_f128_i32_only_use_exp(fp128 %a) nounwind { 1836; RV32IFD-LABEL: test_frexp_f128_i32_only_use_exp: 1837; RV32IFD: # %bb.0: 1838; RV32IFD-NEXT: addi sp, sp, -48 1839; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1840; RV32IFD-NEXT: lw a3, 0(a0) 1841; RV32IFD-NEXT: lw a4, 4(a0) 1842; RV32IFD-NEXT: lw a5, 8(a0) 1843; RV32IFD-NEXT: lw a6, 12(a0) 1844; RV32IFD-NEXT: addi a0, sp, 24 1845; RV32IFD-NEXT: addi a1, sp, 8 1846; RV32IFD-NEXT: addi a2, sp, 40 1847; RV32IFD-NEXT: sw a3, 8(sp) 1848; RV32IFD-NEXT: sw a4, 12(sp) 1849; RV32IFD-NEXT: sw a5, 16(sp) 1850; RV32IFD-NEXT: sw a6, 20(sp) 1851; RV32IFD-NEXT: call frexpl 1852; RV32IFD-NEXT: lw a0, 40(sp) 1853; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1854; RV32IFD-NEXT: addi sp, sp, 48 1855; RV32IFD-NEXT: ret 1856; 1857; RV64IFD-LABEL: test_frexp_f128_i32_only_use_exp: 1858; RV64IFD: # %bb.0: 1859; RV64IFD-NEXT: addi sp, sp, -16 1860; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1861; RV64IFD-NEXT: addi a2, sp, 4 1862; RV64IFD-NEXT: call frexpl 1863; RV64IFD-NEXT: lw a0, 4(sp) 1864; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1865; RV64IFD-NEXT: addi sp, sp, 16 1866; RV64IFD-NEXT: ret 1867; 1868; RV32IZFINXZDINX-LABEL: test_frexp_f128_i32_only_use_exp: 1869; RV32IZFINXZDINX: # %bb.0: 1870; RV32IZFINXZDINX-NEXT: addi sp, sp, -48 1871; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1872; RV32IZFINXZDINX-NEXT: lw a3, 0(a0) 1873; RV32IZFINXZDINX-NEXT: lw a4, 4(a0) 1874; RV32IZFINXZDINX-NEXT: lw a5, 8(a0) 1875; RV32IZFINXZDINX-NEXT: lw a6, 12(a0) 1876; RV32IZFINXZDINX-NEXT: addi a0, sp, 24 1877; RV32IZFINXZDINX-NEXT: addi a1, sp, 8 1878; RV32IZFINXZDINX-NEXT: addi a2, sp, 40 1879; RV32IZFINXZDINX-NEXT: sw a3, 8(sp) 1880; RV32IZFINXZDINX-NEXT: sw a4, 12(sp) 1881; RV32IZFINXZDINX-NEXT: sw a5, 16(sp) 1882; RV32IZFINXZDINX-NEXT: sw a6, 20(sp) 1883; RV32IZFINXZDINX-NEXT: call frexpl 1884; RV32IZFINXZDINX-NEXT: lw a0, 40(sp) 1885; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1886; RV32IZFINXZDINX-NEXT: addi sp, sp, 48 1887; RV32IZFINXZDINX-NEXT: ret 1888; 1889; RV64IZFINXZDINX-LABEL: test_frexp_f128_i32_only_use_exp: 1890; RV64IZFINXZDINX: # %bb.0: 1891; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 1892; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1893; RV64IZFINXZDINX-NEXT: addi a2, sp, 4 1894; RV64IZFINXZDINX-NEXT: call frexpl 1895; RV64IZFINXZDINX-NEXT: lw a0, 4(sp) 1896; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1897; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 1898; RV64IZFINXZDINX-NEXT: ret 1899; 1900; RV32I-LABEL: test_frexp_f128_i32_only_use_exp: 1901; RV32I: # %bb.0: 1902; RV32I-NEXT: addi sp, sp, -48 1903; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1904; RV32I-NEXT: lw a3, 0(a0) 1905; RV32I-NEXT: lw a4, 4(a0) 1906; RV32I-NEXT: lw a5, 8(a0) 1907; RV32I-NEXT: lw a6, 12(a0) 1908; RV32I-NEXT: addi a0, sp, 24 1909; RV32I-NEXT: addi a1, sp, 8 1910; RV32I-NEXT: addi a2, sp, 40 1911; RV32I-NEXT: sw a3, 8(sp) 1912; RV32I-NEXT: sw a4, 12(sp) 1913; RV32I-NEXT: sw a5, 16(sp) 1914; RV32I-NEXT: sw a6, 20(sp) 1915; RV32I-NEXT: call frexpl 1916; RV32I-NEXT: lw a0, 40(sp) 1917; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1918; RV32I-NEXT: addi sp, sp, 48 1919; RV32I-NEXT: ret 1920; 1921; RV64I-LABEL: test_frexp_f128_i32_only_use_exp: 1922; RV64I: # %bb.0: 1923; RV64I-NEXT: addi sp, sp, -16 1924; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1925; RV64I-NEXT: addi a2, sp, 4 1926; RV64I-NEXT: call frexpl 1927; RV64I-NEXT: lw a0, 4(sp) 1928; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1929; RV64I-NEXT: addi sp, sp, 16 1930; RV64I-NEXT: ret 1931 %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a) 1932 %result.0 = extractvalue { fp128, i32 } %result, 1 1933 ret i32 %result.0 1934} 1935 1936declare { float, i32 } @llvm.frexp.f32.i32(float) #0 1937declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0 1938declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0 1939 1940declare { half, i32 } @llvm.frexp.f16.i32(half) #0 1941declare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #0 1942 1943declare { double, i32 } @llvm.frexp.f64.i32(double) #0 1944declare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #0 1945 1946declare { half, i16 } @llvm.frexp.f16.i16(half) #0 1947declare { <2 x half>, <2 x i16> } @llvm.frexp.v2f16.v2i16(<2 x half>) #0 1948 1949declare { fp128, i32 } @llvm.frexp.f128.i32(fp128) #0 1950 1951attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } 1952