1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r5 -mattr=+abs2008 \ 3; RUN: -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \ 4; RUN: --check-prefixes=MIPS32,MIPS32-O32 5; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \ 6; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \ 7; RUN: --check-prefixes=MIPS64-N32,MIPS64R5-N32 8; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \ 9; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \ 10; RUN: --check-prefixes=MIPS64-N64,MIPS64R5-N64 11 12; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r6 \ 13; RUN: -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \ 14; RUN: --check-prefixes=MIPS32,MIPSR6-O32 15; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \ 16; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \ 17; RUN: --check-prefixes=MIPS64-N32,MIPSR6-N32 18; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \ 19; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \ 20; RUN: --check-prefixes=MIPS64-N64,MIPSR6-N64 21 22 23; Check the use of frame indexes in the msa pseudo f16 instructions. 24 25@k = external global float 26 27declare float @k2(ptr) 28 29define void @f3(i16 %b) { 30; MIPS32-LABEL: f3: 31; MIPS32: # %bb.0: # %entry 32; MIPS32-NEXT: lui $2, %hi(_gp_disp) 33; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 34; MIPS32-NEXT: addiu $sp, $sp, -32 35; MIPS32-NEXT: .cfi_def_cfa_offset 32 36; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 37; MIPS32-NEXT: sw $16, 24($sp) # 4-byte Folded Spill 38; MIPS32-NEXT: .cfi_offset 31, -4 39; MIPS32-NEXT: .cfi_offset 16, -8 40; MIPS32-NEXT: addu $16, $2, $25 41; MIPS32-NEXT: sh $4, 22($sp) 42; MIPS32-NEXT: addiu $4, $sp, 22 43; MIPS32-NEXT: lw $25, %call16(k2)($16) 44; MIPS32-NEXT: jalr $25 45; MIPS32-NEXT: move $gp, $16 46; MIPS32-NEXT: lw $1, %got(k)($16) 47; MIPS32-NEXT: swc1 $f0, 0($1) 48; MIPS32-NEXT: lw $16, 24($sp) # 4-byte Folded Reload 49; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 50; MIPS32-NEXT: jr $ra 51; MIPS32-NEXT: addiu $sp, $sp, 32 52; 53; MIPS64-N32-LABEL: f3: 54; MIPS64-N32: # %bb.0: # %entry 55; MIPS64-N32-NEXT: addiu $sp, $sp, -32 56; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 57; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 58; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 59; MIPS64-N32-NEXT: .cfi_offset 31, -8 60; MIPS64-N32-NEXT: .cfi_offset 28, -16 61; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f3))) 62; MIPS64-N32-NEXT: addu $1, $1, $25 63; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f3))) 64; MIPS64-N32-NEXT: sh $4, 14($sp) 65; MIPS64-N32-NEXT: lw $25, %call16(k2)($gp) 66; MIPS64-N32-NEXT: jalr $25 67; MIPS64-N32-NEXT: addiu $4, $sp, 14 68; MIPS64-N32-NEXT: lw $1, %got_disp(k)($gp) 69; MIPS64-N32-NEXT: swc1 $f0, 0($1) 70; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 71; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 72; MIPS64-N32-NEXT: jr $ra 73; MIPS64-N32-NEXT: addiu $sp, $sp, 32 74; 75; MIPS64-N64-LABEL: f3: 76; MIPS64-N64: # %bb.0: # %entry 77; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 78; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 79; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 80; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 81; MIPS64-N64-NEXT: .cfi_offset 31, -8 82; MIPS64-N64-NEXT: .cfi_offset 28, -16 83; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f3))) 84; MIPS64-N64-NEXT: daddu $1, $1, $25 85; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f3))) 86; MIPS64-N64-NEXT: sh $4, 14($sp) 87; MIPS64-N64-NEXT: ld $25, %call16(k2)($gp) 88; MIPS64-N64-NEXT: jalr $25 89; MIPS64-N64-NEXT: daddiu $4, $sp, 14 90; MIPS64-N64-NEXT: ld $1, %got_disp(k)($gp) 91; MIPS64-N64-NEXT: swc1 $f0, 0($1) 92; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 93; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 94; MIPS64-N64-NEXT: jr $ra 95; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 96entry: 97 %0 = alloca half 98 %1 = bitcast i16 %b to half 99 store half %1, ptr %0 100 %2 = call float @k2(ptr %0) 101 store float %2, ptr @k 102 ret void 103} 104 105define void @f(i16 %b) { 106; MIPS32-LABEL: f: 107; MIPS32: # %bb.0: 108; MIPS32-NEXT: lui $2, %hi(_gp_disp) 109; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 110; MIPS32-NEXT: addiu $sp, $sp, -8 111; MIPS32-NEXT: .cfi_def_cfa_offset 8 112; MIPS32-NEXT: addu $1, $2, $25 113; MIPS32-NEXT: sh $4, 4($sp) 114; MIPS32-NEXT: lh $2, 4($sp) 115; MIPS32-NEXT: fill.h $w0, $2 116; MIPS32-NEXT: fexupr.w $w0, $w0 117; MIPS32-NEXT: copy_s.w $2, $w0[0] 118; MIPS32-NEXT: mtc1 $2, $f0 119; MIPS32-NEXT: lw $1, %got(k)($1) 120; MIPS32-NEXT: swc1 $f0, 0($1) 121; MIPS32-NEXT: jr $ra 122; MIPS32-NEXT: addiu $sp, $sp, 8 123; 124; MIPS64-N32-LABEL: f: 125; MIPS64-N32: # %bb.0: 126; MIPS64-N32-NEXT: addiu $sp, $sp, -16 127; MIPS64-N32-NEXT: .cfi_def_cfa_offset 16 128; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f))) 129; MIPS64-N32-NEXT: addu $1, $1, $25 130; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(f))) 131; MIPS64-N32-NEXT: sh $4, 12($sp) 132; MIPS64-N32-NEXT: lh $2, 12($sp) 133; MIPS64-N32-NEXT: fill.h $w0, $2 134; MIPS64-N32-NEXT: fexupr.w $w0, $w0 135; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 136; MIPS64-N32-NEXT: mtc1 $2, $f0 137; MIPS64-N32-NEXT: lw $1, %got_disp(k)($1) 138; MIPS64-N32-NEXT: swc1 $f0, 0($1) 139; MIPS64-N32-NEXT: jr $ra 140; MIPS64-N32-NEXT: addiu $sp, $sp, 16 141; 142; MIPS64-N64-LABEL: f: 143; MIPS64-N64: # %bb.0: 144; MIPS64-N64-NEXT: daddiu $sp, $sp, -16 145; MIPS64-N64-NEXT: .cfi_def_cfa_offset 16 146; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f))) 147; MIPS64-N64-NEXT: daddu $1, $1, $25 148; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(f))) 149; MIPS64-N64-NEXT: sh $4, 12($sp) 150; MIPS64-N64-NEXT: lh $2, 12($sp) 151; MIPS64-N64-NEXT: fill.h $w0, $2 152; MIPS64-N64-NEXT: fexupr.w $w0, $w0 153; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 154; MIPS64-N64-NEXT: mtc1 $2, $f0 155; MIPS64-N64-NEXT: ld $1, %got_disp(k)($1) 156; MIPS64-N64-NEXT: swc1 $f0, 0($1) 157; MIPS64-N64-NEXT: jr $ra 158; MIPS64-N64-NEXT: daddiu $sp, $sp, 16 159 %1 = bitcast i16 %b to half 160 %2 = fpext half %1 to float 161 store float %2, ptr @k 162 ret void 163} 164 165@g = external global i16, align 2 166@h = external global half, align 2 167 168; Check that fext f16 to double has a fexupr.w, fexupr.d sequence. 169; Check that ftrunc double to f16 has fexdo.w, fexdo.h sequence. 170; Check that MIPS64R5+ uses 64-bit floating point <-> 64-bit GPR transfers. 171 172; We don't need to check if pre-MIPSR5 expansions occur, the MSA ASE requires 173; MIPSR5. Additionally, fp64 mode / FR=1 is required to use MSA. 174 175define void @fadd_f64() { 176; MIPS32-LABEL: fadd_f64: 177; MIPS32: # %bb.0: # %entry 178; MIPS32-NEXT: lui $2, %hi(_gp_disp) 179; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 180; MIPS32-NEXT: addu $1, $2, $25 181; MIPS32-NEXT: lw $1, %got(h)($1) 182; MIPS32-NEXT: lh $2, 0($1) 183; MIPS32-NEXT: fill.h $w0, $2 184; MIPS32-NEXT: fexupr.w $w0, $w0 185; MIPS32-NEXT: fexupr.d $w0, $w0 186; MIPS32-NEXT: copy_s.w $2, $w0[0] 187; MIPS32-NEXT: mtc1 $2, $f1 188; MIPS32-NEXT: copy_s.w $2, $w0[1] 189; MIPS32-NEXT: mthc1 $2, $f1 190; MIPS32-NEXT: add.d $f0, $f1, $f1 191; MIPS32-NEXT: mfc1 $2, $f0 192; MIPS32-NEXT: fill.w $w1, $2 193; MIPS32-NEXT: mfhc1 $2, $f0 194; MIPS32-NEXT: insert.w $w1[1], $2 195; MIPS32-NEXT: insert.w $w1[3], $2 196; MIPS32-NEXT: fexdo.w $w0, $w1, $w1 197; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 198; MIPS32-NEXT: copy_u.h $2, $w0[0] 199; MIPS32-NEXT: jr $ra 200; MIPS32-NEXT: sh $2, 0($1) 201; 202; MIPS64-N32-LABEL: fadd_f64: 203; MIPS64-N32: # %bb.0: # %entry 204; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64))) 205; MIPS64-N32-NEXT: addu $1, $1, $25 206; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fadd_f64))) 207; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1) 208; MIPS64-N32-NEXT: lh $2, 0($1) 209; MIPS64-N32-NEXT: fill.h $w0, $2 210; MIPS64-N32-NEXT: fexupr.w $w0, $w0 211; MIPS64-N32-NEXT: fexupr.d $w0, $w0 212; MIPS64-N32-NEXT: copy_s.d $2, $w0[0] 213; MIPS64-N32-NEXT: dmtc1 $2, $f0 214; MIPS64-N32-NEXT: add.d $f0, $f0, $f0 215; MIPS64-N32-NEXT: dmfc1 $2, $f0 216; MIPS64-N32-NEXT: fill.d $w0, $2 217; MIPS64-N32-NEXT: fexdo.w $w0, $w0, $w0 218; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 219; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 220; MIPS64-N32-NEXT: jr $ra 221; MIPS64-N32-NEXT: sh $2, 0($1) 222; 223; MIPS64-N64-LABEL: fadd_f64: 224; MIPS64-N64: # %bb.0: # %entry 225; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64))) 226; MIPS64-N64-NEXT: daddu $1, $1, $25 227; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fadd_f64))) 228; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1) 229; MIPS64-N64-NEXT: lh $2, 0($1) 230; MIPS64-N64-NEXT: fill.h $w0, $2 231; MIPS64-N64-NEXT: fexupr.w $w0, $w0 232; MIPS64-N64-NEXT: fexupr.d $w0, $w0 233; MIPS64-N64-NEXT: copy_s.d $2, $w0[0] 234; MIPS64-N64-NEXT: dmtc1 $2, $f0 235; MIPS64-N64-NEXT: add.d $f0, $f0, $f0 236; MIPS64-N64-NEXT: dmfc1 $2, $f0 237; MIPS64-N64-NEXT: fill.d $w0, $2 238; MIPS64-N64-NEXT: fexdo.w $w0, $w0, $w0 239; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 240; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 241; MIPS64-N64-NEXT: jr $ra 242; MIPS64-N64-NEXT: sh $2, 0($1) 243entry: 244 %0 = load half, ptr @h, align 2 245 %1 = fpext half %0 to double 246 %2 = load half, ptr @h, align 2 247 %3 = fpext half %2 to double 248 %add = fadd double %1, %3 249 %4 = fptrunc double %add to half 250 store half %4, ptr @h, align 2 251 ret void 252} 253 254; Entire fp16 (unsigned) range fits into (signed) i32. 255define i32 @ffptoui() { 256; MIPS32-LABEL: ffptoui: 257; MIPS32: # %bb.0: # %entry 258; MIPS32-NEXT: lui $2, %hi(_gp_disp) 259; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 260; MIPS32-NEXT: addu $1, $2, $25 261; MIPS32-NEXT: lw $1, %got(h)($1) 262; MIPS32-NEXT: lh $1, 0($1) 263; MIPS32-NEXT: fill.h $w0, $1 264; MIPS32-NEXT: fexupr.w $w0, $w0 265; MIPS32-NEXT: fexupr.d $w0, $w0 266; MIPS32-NEXT: copy_s.w $1, $w0[0] 267; MIPS32-NEXT: mtc1 $1, $f1 268; MIPS32-NEXT: copy_s.w $1, $w0[1] 269; MIPS32-NEXT: mthc1 $1, $f1 270; MIPS32-NEXT: trunc.w.d $f0, $f1 271; MIPS32-NEXT: jr $ra 272; MIPS32-NEXT: mfc1 $2, $f0 273; 274; MIPS64-N32-LABEL: ffptoui: 275; MIPS64-N32: # %bb.0: # %entry 276; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui))) 277; MIPS64-N32-NEXT: addu $1, $1, $25 278; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffptoui))) 279; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1) 280; MIPS64-N32-NEXT: lh $1, 0($1) 281; MIPS64-N32-NEXT: fill.h $w0, $1 282; MIPS64-N32-NEXT: fexupr.w $w0, $w0 283; MIPS64-N32-NEXT: fexupr.d $w0, $w0 284; MIPS64-N32-NEXT: copy_s.d $1, $w0[0] 285; MIPS64-N32-NEXT: dmtc1 $1, $f0 286; MIPS64-N32-NEXT: trunc.w.d $f0, $f0 287; MIPS64-N32-NEXT: jr $ra 288; MIPS64-N32-NEXT: mfc1 $2, $f0 289; 290; MIPS64-N64-LABEL: ffptoui: 291; MIPS64-N64: # %bb.0: # %entry 292; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui))) 293; MIPS64-N64-NEXT: daddu $1, $1, $25 294; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffptoui))) 295; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1) 296; MIPS64-N64-NEXT: lh $1, 0($1) 297; MIPS64-N64-NEXT: fill.h $w0, $1 298; MIPS64-N64-NEXT: fexupr.w $w0, $w0 299; MIPS64-N64-NEXT: fexupr.d $w0, $w0 300; MIPS64-N64-NEXT: copy_s.d $1, $w0[0] 301; MIPS64-N64-NEXT: dmtc1 $1, $f0 302; MIPS64-N64-NEXT: trunc.w.d $f0, $f0 303; MIPS64-N64-NEXT: jr $ra 304; MIPS64-N64-NEXT: mfc1 $2, $f0 305entry: 306 %0 = load half, ptr @h, align 2 307 %1 = fptoui half %0 to i32 308 ret i32 %1 309} 310 311define i32 @ffptosi() { 312; MIPS32-LABEL: ffptosi: 313; MIPS32: # %bb.0: # %entry 314; MIPS32-NEXT: lui $2, %hi(_gp_disp) 315; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 316; MIPS32-NEXT: addu $1, $2, $25 317; MIPS32-NEXT: lw $1, %got(h)($1) 318; MIPS32-NEXT: lh $1, 0($1) 319; MIPS32-NEXT: fill.h $w0, $1 320; MIPS32-NEXT: fexupr.w $w0, $w0 321; MIPS32-NEXT: fexupr.d $w0, $w0 322; MIPS32-NEXT: copy_s.w $1, $w0[0] 323; MIPS32-NEXT: mtc1 $1, $f1 324; MIPS32-NEXT: copy_s.w $1, $w0[1] 325; MIPS32-NEXT: mthc1 $1, $f1 326; MIPS32-NEXT: trunc.w.d $f0, $f1 327; MIPS32-NEXT: jr $ra 328; MIPS32-NEXT: mfc1 $2, $f0 329; 330; MIPS64-N32-LABEL: ffptosi: 331; MIPS64-N32: # %bb.0: # %entry 332; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi))) 333; MIPS64-N32-NEXT: addu $1, $1, $25 334; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffptosi))) 335; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1) 336; MIPS64-N32-NEXT: lh $1, 0($1) 337; MIPS64-N32-NEXT: fill.h $w0, $1 338; MIPS64-N32-NEXT: fexupr.w $w0, $w0 339; MIPS64-N32-NEXT: fexupr.d $w0, $w0 340; MIPS64-N32-NEXT: copy_s.d $1, $w0[0] 341; MIPS64-N32-NEXT: dmtc1 $1, $f0 342; MIPS64-N32-NEXT: trunc.w.d $f0, $f0 343; MIPS64-N32-NEXT: jr $ra 344; MIPS64-N32-NEXT: mfc1 $2, $f0 345; 346; MIPS64-N64-LABEL: ffptosi: 347; MIPS64-N64: # %bb.0: # %entry 348; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi))) 349; MIPS64-N64-NEXT: daddu $1, $1, $25 350; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffptosi))) 351; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1) 352; MIPS64-N64-NEXT: lh $1, 0($1) 353; MIPS64-N64-NEXT: fill.h $w0, $1 354; MIPS64-N64-NEXT: fexupr.w $w0, $w0 355; MIPS64-N64-NEXT: fexupr.d $w0, $w0 356; MIPS64-N64-NEXT: copy_s.d $1, $w0[0] 357; MIPS64-N64-NEXT: dmtc1 $1, $f0 358; MIPS64-N64-NEXT: trunc.w.d $f0, $f0 359; MIPS64-N64-NEXT: jr $ra 360; MIPS64-N64-NEXT: mfc1 $2, $f0 361entry: 362 %0 = load half, ptr @h, align 2 363 %1 = fptosi half %0 to i32 364 ret i32 %1 365 366 367 368 369} 370 371define void @uitofp(i32 %a) { 372; MIPS32-LABEL: uitofp: 373; MIPS32: # %bb.0: # %entry 374; MIPS32-NEXT: lui $2, %hi(_gp_disp) 375; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 376; MIPS32-NEXT: addiu $sp, $sp, -8 377; MIPS32-NEXT: .cfi_def_cfa_offset 8 378; MIPS32-NEXT: addu $1, $2, $25 379; MIPS32-NEXT: lui $2, 17200 380; MIPS32-NEXT: sw $2, 4($sp) 381; MIPS32-NEXT: sw $4, 0($sp) 382; MIPS32-NEXT: lw $2, %got($CPI5_0)($1) 383; MIPS32-NEXT: ldc1 $f0, %lo($CPI5_0)($2) 384; MIPS32-NEXT: ldc1 $f1, 0($sp) 385; MIPS32-NEXT: sub.d $f0, $f1, $f0 386; MIPS32-NEXT: mfc1 $2, $f0 387; MIPS32-NEXT: fill.w $w1, $2 388; MIPS32-NEXT: mfhc1 $2, $f0 389; MIPS32-NEXT: insert.w $w1[1], $2 390; MIPS32-NEXT: insert.w $w1[3], $2 391; MIPS32-NEXT: fexdo.w $w0, $w1, $w1 392; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 393; MIPS32-NEXT: lw $1, %got(h)($1) 394; MIPS32-NEXT: copy_u.h $2, $w0[0] 395; MIPS32-NEXT: sh $2, 0($1) 396; MIPS32-NEXT: jr $ra 397; MIPS32-NEXT: addiu $sp, $sp, 8 398; 399; MIPS64-N32-LABEL: uitofp: 400; MIPS64-N32: # %bb.0: # %entry 401; MIPS64-N32-NEXT: addiu $sp, $sp, -16 402; MIPS64-N32-NEXT: .cfi_def_cfa_offset 16 403; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp))) 404; MIPS64-N32-NEXT: addu $1, $1, $25 405; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(uitofp))) 406; MIPS64-N32-NEXT: lui $2, 17200 407; MIPS64-N32-NEXT: sw $2, 12($sp) 408; MIPS64R5-N32-NEXT: sll $2, $4, 0 409; MIPS64R5-N32-NEXT: sw $2, 8($sp) 410; MIPSR6-N32-NEXT: sw $4, 8($sp) 411; MIPS64-N32-NEXT: lw $2, %got_page(.LCPI5_0)($1) 412; MIPS64-N32-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2) 413; MIPS64-N32-NEXT: ldc1 $f1, 8($sp) 414; MIPS64-N32-NEXT: sub.d $f0, $f1, $f0 415; MIPS64-N32-NEXT: dmfc1 $2, $f0 416; MIPS64-N32-NEXT: fill.d $w0, $2 417; MIPS64-N32-NEXT: fexdo.w $w0, $w0, $w0 418; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 419; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1) 420; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 421; MIPS64-N32-NEXT: sh $2, 0($1) 422; MIPS64-N32-NEXT: jr $ra 423; MIPS64-N32-NEXT: addiu $sp, $sp, 16 424; 425; MIPS64-N64-LABEL: uitofp: 426; MIPS64-N64: # %bb.0: # %entry 427; MIPS64-N64-NEXT: daddiu $sp, $sp, -16 428; MIPS64-N64-NEXT: .cfi_def_cfa_offset 16 429; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp))) 430; MIPS64-N64-NEXT: daddu $1, $1, $25 431; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(uitofp))) 432; MIPS64-N64-NEXT: lui $2, 17200 433; MIPS64-N64-NEXT: sw $2, 12($sp) 434; MIPS64R5-N64-NEXT: sll $2, $4, 0 435; MIPS64R5-N64-NEXT: sw $2, 8($sp) 436; MIPSR6-N64-NEXT: sw $4, 8($sp) 437; MIPS64-N64-NEXT: ld $2, %got_page(.LCPI5_0)($1) 438; MIPS64-N64-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2) 439; MIPS64-N64-NEXT: ldc1 $f1, 8($sp) 440; MIPS64-N64-NEXT: sub.d $f0, $f1, $f0 441; MIPS64-N64-NEXT: dmfc1 $2, $f0 442; MIPS64-N64-NEXT: fill.d $w0, $2 443; MIPS64-N64-NEXT: fexdo.w $w0, $w0, $w0 444; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 445; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1) 446; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 447; MIPS64-N64-NEXT: sh $2, 0($1) 448; MIPS64-N64-NEXT: jr $ra 449; MIPS64-N64-NEXT: daddiu $sp, $sp, 16 450entry: 451 452 453 454 455 456 457 458 459 460 %0 = uitofp i32 %a to half 461 store half %0, ptr @h, align 2 462 ret void 463} 464 465 466; Check that f16 is expanded to f32 and relevant transfer ops occur. 467; We don't check f16 -> f64 expansion occurs, as we expand f16 to f32. 468 469define void @fadd() { 470; MIPS32-LABEL: fadd: 471; MIPS32: # %bb.0: # %entry 472; MIPS32-NEXT: lui $2, %hi(_gp_disp) 473; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 474; MIPS32-NEXT: addu $1, $2, $25 475; MIPS32-NEXT: lw $1, %got(g)($1) 476; MIPS32-NEXT: lh $2, 0($1) 477; MIPS32-NEXT: fill.h $w0, $2 478; MIPS32-NEXT: fexupr.w $w0, $w0 479; MIPS32-NEXT: copy_s.w $2, $w0[0] 480; MIPS32-NEXT: mtc1 $2, $f0 481; MIPS32-NEXT: add.s $f0, $f0, $f0 482; MIPS32-NEXT: mfc1 $2, $f0 483; MIPS32-NEXT: fill.w $w0, $2 484; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 485; MIPS32-NEXT: copy_u.h $2, $w0[0] 486; MIPS32-NEXT: jr $ra 487; MIPS32-NEXT: sh $2, 0($1) 488; 489; MIPS64-N32-LABEL: fadd: 490; MIPS64-N32: # %bb.0: # %entry 491; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd))) 492; MIPS64-N32-NEXT: addu $1, $1, $25 493; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fadd))) 494; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 495; MIPS64-N32-NEXT: lh $2, 0($1) 496; MIPS64-N32-NEXT: fill.h $w0, $2 497; MIPS64-N32-NEXT: fexupr.w $w0, $w0 498; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 499; MIPS64-N32-NEXT: mtc1 $2, $f0 500; MIPS64-N32-NEXT: add.s $f0, $f0, $f0 501; MIPS64-N32-NEXT: mfc1 $2, $f0 502; MIPS64-N32-NEXT: fill.w $w0, $2 503; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 504; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 505; MIPS64-N32-NEXT: jr $ra 506; MIPS64-N32-NEXT: sh $2, 0($1) 507; 508; MIPS64-N64-LABEL: fadd: 509; MIPS64-N64: # %bb.0: # %entry 510; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd))) 511; MIPS64-N64-NEXT: daddu $1, $1, $25 512; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fadd))) 513; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 514; MIPS64-N64-NEXT: lh $2, 0($1) 515; MIPS64-N64-NEXT: fill.h $w0, $2 516; MIPS64-N64-NEXT: fexupr.w $w0, $w0 517; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 518; MIPS64-N64-NEXT: mtc1 $2, $f0 519; MIPS64-N64-NEXT: add.s $f0, $f0, $f0 520; MIPS64-N64-NEXT: mfc1 $2, $f0 521; MIPS64-N64-NEXT: fill.w $w0, $2 522; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 523; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 524; MIPS64-N64-NEXT: jr $ra 525; MIPS64-N64-NEXT: sh $2, 0($1) 526entry: 527 %0 = load i16, ptr @g, align 2 528 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 529 530 531 %2 = load i16, ptr @g, align 2 532 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 533 %add = fadd float %1, %3 534 535 536 %4 = call i16 @llvm.convert.to.fp16.f32(float %add) 537 538 store i16 %4, ptr @g, align 2 539 ret void 540} 541 542; Function Attrs: nounwind readnone 543declare float @llvm.convert.from.fp16.f32(i16) 544 545; Function Attrs: nounwind readnone 546declare i16 @llvm.convert.to.fp16.f32(float) 547 548; Function Attrs: nounwind 549define void @fsub() { 550; MIPS32-LABEL: fsub: 551; MIPS32: # %bb.0: # %entry 552; MIPS32-NEXT: lui $2, %hi(_gp_disp) 553; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 554; MIPS32-NEXT: addu $1, $2, $25 555; MIPS32-NEXT: lw $1, %got(g)($1) 556; MIPS32-NEXT: lh $2, 0($1) 557; MIPS32-NEXT: fill.h $w0, $2 558; MIPS32-NEXT: fexupr.w $w0, $w0 559; MIPS32-NEXT: copy_s.w $2, $w0[0] 560; MIPS32-NEXT: mtc1 $2, $f0 561; MIPS32-NEXT: sub.s $f0, $f0, $f0 562; MIPS32-NEXT: mfc1 $2, $f0 563; MIPS32-NEXT: fill.w $w0, $2 564; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 565; MIPS32-NEXT: copy_u.h $2, $w0[0] 566; MIPS32-NEXT: jr $ra 567; MIPS32-NEXT: sh $2, 0($1) 568; 569; MIPS64-N32-LABEL: fsub: 570; MIPS64-N32: # %bb.0: # %entry 571; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsub))) 572; MIPS64-N32-NEXT: addu $1, $1, $25 573; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsub))) 574; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 575; MIPS64-N32-NEXT: lh $2, 0($1) 576; MIPS64-N32-NEXT: fill.h $w0, $2 577; MIPS64-N32-NEXT: fexupr.w $w0, $w0 578; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 579; MIPS64-N32-NEXT: mtc1 $2, $f0 580; MIPS64-N32-NEXT: sub.s $f0, $f0, $f0 581; MIPS64-N32-NEXT: mfc1 $2, $f0 582; MIPS64-N32-NEXT: fill.w $w0, $2 583; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 584; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 585; MIPS64-N32-NEXT: jr $ra 586; MIPS64-N32-NEXT: sh $2, 0($1) 587; 588; MIPS64-N64-LABEL: fsub: 589; MIPS64-N64: # %bb.0: # %entry 590; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsub))) 591; MIPS64-N64-NEXT: daddu $1, $1, $25 592; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsub))) 593; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 594; MIPS64-N64-NEXT: lh $2, 0($1) 595; MIPS64-N64-NEXT: fill.h $w0, $2 596; MIPS64-N64-NEXT: fexupr.w $w0, $w0 597; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 598; MIPS64-N64-NEXT: mtc1 $2, $f0 599; MIPS64-N64-NEXT: sub.s $f0, $f0, $f0 600; MIPS64-N64-NEXT: mfc1 $2, $f0 601; MIPS64-N64-NEXT: fill.w $w0, $2 602; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 603; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 604; MIPS64-N64-NEXT: jr $ra 605; MIPS64-N64-NEXT: sh $2, 0($1) 606entry: 607 %0 = load i16, ptr @g, align 2 608 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 609 610 611 %2 = load i16, ptr @g, align 2 612 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 613 %sub = fsub float %1, %3 614 615 616 %4 = call i16 @llvm.convert.to.fp16.f32(float %sub) 617 618 619 store i16 %4, ptr @g, align 2 620 ret void 621} 622 623define void @fmult() { 624; MIPS32-LABEL: fmult: 625; MIPS32: # %bb.0: # %entry 626; MIPS32-NEXT: lui $2, %hi(_gp_disp) 627; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 628; MIPS32-NEXT: addu $1, $2, $25 629; MIPS32-NEXT: lw $1, %got(g)($1) 630; MIPS32-NEXT: lh $2, 0($1) 631; MIPS32-NEXT: fill.h $w0, $2 632; MIPS32-NEXT: fexupr.w $w0, $w0 633; MIPS32-NEXT: copy_s.w $2, $w0[0] 634; MIPS32-NEXT: mtc1 $2, $f0 635; MIPS32-NEXT: mul.s $f0, $f0, $f0 636; MIPS32-NEXT: mfc1 $2, $f0 637; MIPS32-NEXT: fill.w $w0, $2 638; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 639; MIPS32-NEXT: copy_u.h $2, $w0[0] 640; MIPS32-NEXT: jr $ra 641; MIPS32-NEXT: sh $2, 0($1) 642; 643; MIPS64-N32-LABEL: fmult: 644; MIPS64-N32: # %bb.0: # %entry 645; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmult))) 646; MIPS64-N32-NEXT: addu $1, $1, $25 647; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fmult))) 648; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 649; MIPS64-N32-NEXT: lh $2, 0($1) 650; MIPS64-N32-NEXT: fill.h $w0, $2 651; MIPS64-N32-NEXT: fexupr.w $w0, $w0 652; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 653; MIPS64-N32-NEXT: mtc1 $2, $f0 654; MIPS64-N32-NEXT: mul.s $f0, $f0, $f0 655; MIPS64-N32-NEXT: mfc1 $2, $f0 656; MIPS64-N32-NEXT: fill.w $w0, $2 657; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 658; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 659; MIPS64-N32-NEXT: jr $ra 660; MIPS64-N32-NEXT: sh $2, 0($1) 661; 662; MIPS64-N64-LABEL: fmult: 663; MIPS64-N64: # %bb.0: # %entry 664; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmult))) 665; MIPS64-N64-NEXT: daddu $1, $1, $25 666; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fmult))) 667; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 668; MIPS64-N64-NEXT: lh $2, 0($1) 669; MIPS64-N64-NEXT: fill.h $w0, $2 670; MIPS64-N64-NEXT: fexupr.w $w0, $w0 671; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 672; MIPS64-N64-NEXT: mtc1 $2, $f0 673; MIPS64-N64-NEXT: mul.s $f0, $f0, $f0 674; MIPS64-N64-NEXT: mfc1 $2, $f0 675; MIPS64-N64-NEXT: fill.w $w0, $2 676; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 677; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 678; MIPS64-N64-NEXT: jr $ra 679; MIPS64-N64-NEXT: sh $2, 0($1) 680entry: 681 %0 = load i16, ptr @g, align 2 682 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 683 684 685 %2 = load i16, ptr @g, align 2 686 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 687 %mul = fmul float %1, %3 688 689 690 %4 = call i16 @llvm.convert.to.fp16.f32(float %mul) 691 692 693 store i16 %4, ptr @g, align 2 694 695 ret void 696} 697 698define void @fdiv() { 699; MIPS32-LABEL: fdiv: 700; MIPS32: # %bb.0: # %entry 701; MIPS32-NEXT: lui $2, %hi(_gp_disp) 702; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 703; MIPS32-NEXT: addu $1, $2, $25 704; MIPS32-NEXT: lw $1, %got(g)($1) 705; MIPS32-NEXT: lh $2, 0($1) 706; MIPS32-NEXT: fill.h $w0, $2 707; MIPS32-NEXT: fexupr.w $w0, $w0 708; MIPS32-NEXT: copy_s.w $2, $w0[0] 709; MIPS32-NEXT: mtc1 $2, $f0 710; MIPS32-NEXT: div.s $f0, $f0, $f0 711; MIPS32-NEXT: mfc1 $2, $f0 712; MIPS32-NEXT: fill.w $w0, $2 713; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 714; MIPS32-NEXT: copy_u.h $2, $w0[0] 715; MIPS32-NEXT: jr $ra 716; MIPS32-NEXT: sh $2, 0($1) 717; 718; MIPS64-N32-LABEL: fdiv: 719; MIPS64-N32: # %bb.0: # %entry 720; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv))) 721; MIPS64-N32-NEXT: addu $1, $1, $25 722; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fdiv))) 723; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 724; MIPS64-N32-NEXT: lh $2, 0($1) 725; MIPS64-N32-NEXT: fill.h $w0, $2 726; MIPS64-N32-NEXT: fexupr.w $w0, $w0 727; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 728; MIPS64-N32-NEXT: mtc1 $2, $f0 729; MIPS64-N32-NEXT: div.s $f0, $f0, $f0 730; MIPS64-N32-NEXT: mfc1 $2, $f0 731; MIPS64-N32-NEXT: fill.w $w0, $2 732; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 733; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 734; MIPS64-N32-NEXT: jr $ra 735; MIPS64-N32-NEXT: sh $2, 0($1) 736; 737; MIPS64-N64-LABEL: fdiv: 738; MIPS64-N64: # %bb.0: # %entry 739; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv))) 740; MIPS64-N64-NEXT: daddu $1, $1, $25 741; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fdiv))) 742; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 743; MIPS64-N64-NEXT: lh $2, 0($1) 744; MIPS64-N64-NEXT: fill.h $w0, $2 745; MIPS64-N64-NEXT: fexupr.w $w0, $w0 746; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 747; MIPS64-N64-NEXT: mtc1 $2, $f0 748; MIPS64-N64-NEXT: div.s $f0, $f0, $f0 749; MIPS64-N64-NEXT: mfc1 $2, $f0 750; MIPS64-N64-NEXT: fill.w $w0, $2 751; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 752; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 753; MIPS64-N64-NEXT: jr $ra 754; MIPS64-N64-NEXT: sh $2, 0($1) 755entry: 756 757 %0 = load i16, ptr @g, align 2 758 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 759 760 761 %2 = load i16, ptr @g, align 2 762 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 763 %div = fdiv float %1, %3 764 765 766 %4 = call i16 @llvm.convert.to.fp16.f32(float %div) 767 768 store i16 %4, ptr @g, align 2 769 ret void 770} 771 772define void @frem() { 773; MIPS32-LABEL: frem: 774; MIPS32: # %bb.0: # %entry 775; MIPS32-NEXT: lui $2, %hi(_gp_disp) 776; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 777; MIPS32-NEXT: addiu $sp, $sp, -24 778; MIPS32-NEXT: .cfi_def_cfa_offset 24 779; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 780; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 781; MIPS32-NEXT: .cfi_offset 31, -4 782; MIPS32-NEXT: .cfi_offset 16, -8 783; MIPS32-NEXT: addu $gp, $2, $25 784; MIPS32-NEXT: lw $16, %got(g)($gp) 785; MIPS32-NEXT: lh $1, 0($16) 786; MIPS32-NEXT: fill.h $w0, $1 787; MIPS32-NEXT: fexupr.w $w0, $w0 788; MIPS32-NEXT: copy_s.w $1, $w0[0] 789; MIPS32-NEXT: mtc1 $1, $f12 790; MIPS32-NEXT: lw $25, %call16(fmodf)($gp) 791; MIPS32-NEXT: jalr $25 792; MIPS32-NEXT: mov.s $f14, $f12 793; MIPS32-NEXT: mfc1 $1, $f0 794; MIPS32-NEXT: fill.w $w0, $1 795; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 796; MIPS32-NEXT: copy_u.h $1, $w0[0] 797; MIPS32-NEXT: sh $1, 0($16) 798; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 799; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 800; MIPS32-NEXT: jr $ra 801; MIPS32-NEXT: addiu $sp, $sp, 24 802; 803; MIPS64-N32-LABEL: frem: 804; MIPS64-N32: # %bb.0: # %entry 805; MIPS64-N32-NEXT: addiu $sp, $sp, -32 806; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 807; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 808; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 809; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 810; MIPS64-N32-NEXT: .cfi_offset 31, -8 811; MIPS64-N32-NEXT: .cfi_offset 28, -16 812; MIPS64-N32-NEXT: .cfi_offset 16, -24 813; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frem))) 814; MIPS64-N32-NEXT: addu $1, $1, $25 815; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frem))) 816; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 817; MIPS64-N32-NEXT: lh $1, 0($16) 818; MIPS64-N32-NEXT: fill.h $w0, $1 819; MIPS64-N32-NEXT: fexupr.w $w0, $w0 820; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 821; MIPS64-N32-NEXT: mtc1 $1, $f12 822; MIPS64-N32-NEXT: lw $25, %call16(fmodf)($gp) 823; MIPS64-N32-NEXT: jalr $25 824; MIPS64-N32-NEXT: mov.s $f13, $f12 825; MIPS64-N32-NEXT: mfc1 $1, $f0 826; MIPS64-N32-NEXT: fill.w $w0, $1 827; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 828; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 829; MIPS64-N32-NEXT: sh $1, 0($16) 830; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 831; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 832; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 833; MIPS64-N32-NEXT: jr $ra 834; MIPS64-N32-NEXT: addiu $sp, $sp, 32 835; 836; MIPS64-N64-LABEL: frem: 837; MIPS64-N64: # %bb.0: # %entry 838; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 839; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 840; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 841; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 842; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 843; MIPS64-N64-NEXT: .cfi_offset 31, -8 844; MIPS64-N64-NEXT: .cfi_offset 28, -16 845; MIPS64-N64-NEXT: .cfi_offset 16, -24 846; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frem))) 847; MIPS64-N64-NEXT: daddu $1, $1, $25 848; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frem))) 849; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 850; MIPS64-N64-NEXT: lh $1, 0($16) 851; MIPS64-N64-NEXT: fill.h $w0, $1 852; MIPS64-N64-NEXT: fexupr.w $w0, $w0 853; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 854; MIPS64-N64-NEXT: mtc1 $1, $f12 855; MIPS64-N64-NEXT: ld $25, %call16(fmodf)($gp) 856; MIPS64-N64-NEXT: jalr $25 857; MIPS64-N64-NEXT: mov.s $f13, $f12 858; MIPS64-N64-NEXT: mfc1 $1, $f0 859; MIPS64-N64-NEXT: fill.w $w0, $1 860; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 861; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 862; MIPS64-N64-NEXT: sh $1, 0($16) 863; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 864; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 865; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 866; MIPS64-N64-NEXT: jr $ra 867; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 868entry: 869 %0 = load i16, ptr @g, align 2 870 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 871 872 873 %2 = load i16, ptr @g, align 2 874 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 875 %rem = frem float %1, %3 876 877 878 %4 = call i16 @llvm.convert.to.fp16.f32(float %rem) 879 880 881 store i16 %4, ptr @g, align 2 882 883 ret void 884} 885 886@i1 = external global i16, align 1 887 888define void @fcmp() { 889; MIPS32-O32-LABEL: fcmp: 890; MIPS32-O32: # %bb.0: # %entry 891; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp) 892; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 893; MIPS32-O32-NEXT: addu $1, $2, $25 894; MIPS32-O32-NEXT: lw $2, %got(g)($1) 895; MIPS32-O32-NEXT: lh $2, 0($2) 896; MIPS32-O32-NEXT: fill.h $w0, $2 897; MIPS32-O32-NEXT: fexupr.w $w0, $w0 898; MIPS32-O32-NEXT: copy_s.w $2, $w0[0] 899; MIPS32-O32-NEXT: mtc1 $2, $f0 900; MIPS32-O32-NEXT: addiu $2, $zero, 1 901; MIPS32-O32-NEXT: c.un.s $f0, $f0 902; MIPS32-O32-NEXT: movt $2, $zero, $fcc0 903; MIPS32-O32-NEXT: lw $1, %got(i1)($1) 904; MIPS32-O32-NEXT: jr $ra 905; MIPS32-O32-NEXT: sh $2, 0($1) 906; 907; MIPS64R5-N32-LABEL: fcmp: 908; MIPS64R5-N32: # %bb.0: # %entry 909; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp))) 910; MIPS64R5-N32-NEXT: addu $1, $1, $25 911; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp))) 912; MIPS64R5-N32-NEXT: lw $2, %got_disp(g)($1) 913; MIPS64R5-N32-NEXT: lh $2, 0($2) 914; MIPS64R5-N32-NEXT: fill.h $w0, $2 915; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0 916; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0] 917; MIPS64R5-N32-NEXT: mtc1 $2, $f0 918; MIPS64R5-N32-NEXT: addiu $2, $zero, 1 919; MIPS64R5-N32-NEXT: c.un.s $f0, $f0 920; MIPS64R5-N32-NEXT: movt $2, $zero, $fcc0 921; MIPS64R5-N32-NEXT: lw $1, %got_disp(i1)($1) 922; MIPS64R5-N32-NEXT: jr $ra 923; MIPS64R5-N32-NEXT: sh $2, 0($1) 924; 925; MIPS64R5-N64-LABEL: fcmp: 926; MIPS64R5-N64: # %bb.0: # %entry 927; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp))) 928; MIPS64R5-N64-NEXT: daddu $1, $1, $25 929; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp))) 930; MIPS64R5-N64-NEXT: ld $2, %got_disp(g)($1) 931; MIPS64R5-N64-NEXT: lh $2, 0($2) 932; MIPS64R5-N64-NEXT: fill.h $w0, $2 933; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0 934; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0] 935; MIPS64R5-N64-NEXT: mtc1 $2, $f0 936; MIPS64R5-N64-NEXT: addiu $2, $zero, 1 937; MIPS64R5-N64-NEXT: c.un.s $f0, $f0 938; MIPS64R5-N64-NEXT: movt $2, $zero, $fcc0 939; MIPS64R5-N64-NEXT: ld $1, %got_disp(i1)($1) 940; MIPS64R5-N64-NEXT: jr $ra 941; MIPS64R5-N64-NEXT: sh $2, 0($1) 942; 943; MIPSR6-O32-LABEL: fcmp: 944; MIPSR6-O32: # %bb.0: # %entry 945; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp) 946; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 947; MIPSR6-O32-NEXT: addu $1, $2, $25 948; MIPSR6-O32-NEXT: lw $2, %got(g)($1) 949; MIPSR6-O32-NEXT: lh $2, 0($2) 950; MIPSR6-O32-NEXT: fill.h $w0, $2 951; MIPSR6-O32-NEXT: fexupr.w $w0, $w0 952; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0] 953; MIPSR6-O32-NEXT: mtc1 $2, $f0 954; MIPSR6-O32-NEXT: cmp.un.s $f0, $f0, $f0 955; MIPSR6-O32-NEXT: mfc1 $2, $f0 956; MIPSR6-O32-NEXT: not $2, $2 957; MIPSR6-O32-NEXT: andi $2, $2, 1 958; MIPSR6-O32-NEXT: lw $1, %got(i1)($1) 959; MIPSR6-O32-NEXT: jr $ra 960; MIPSR6-O32-NEXT: sh $2, 0($1) 961; 962; MIPSR6-N32-LABEL: fcmp: 963; MIPSR6-N32: # %bb.0: # %entry 964; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp))) 965; MIPSR6-N32-NEXT: addu $1, $1, $25 966; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp))) 967; MIPSR6-N32-NEXT: lw $2, %got_disp(g)($1) 968; MIPSR6-N32-NEXT: lh $2, 0($2) 969; MIPSR6-N32-NEXT: fill.h $w0, $2 970; MIPSR6-N32-NEXT: fexupr.w $w0, $w0 971; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0] 972; MIPSR6-N32-NEXT: mtc1 $2, $f0 973; MIPSR6-N32-NEXT: cmp.un.s $f0, $f0, $f0 974; MIPSR6-N32-NEXT: mfc1 $2, $f0 975; MIPSR6-N32-NEXT: not $2, $2 976; MIPSR6-N32-NEXT: andi $2, $2, 1 977; MIPSR6-N32-NEXT: lw $1, %got_disp(i1)($1) 978; MIPSR6-N32-NEXT: jr $ra 979; MIPSR6-N32-NEXT: sh $2, 0($1) 980; 981; MIPSR6-N64-LABEL: fcmp: 982; MIPSR6-N64: # %bb.0: # %entry 983; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp))) 984; MIPSR6-N64-NEXT: daddu $1, $1, $25 985; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp))) 986; MIPSR6-N64-NEXT: ld $2, %got_disp(g)($1) 987; MIPSR6-N64-NEXT: lh $2, 0($2) 988; MIPSR6-N64-NEXT: fill.h $w0, $2 989; MIPSR6-N64-NEXT: fexupr.w $w0, $w0 990; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0] 991; MIPSR6-N64-NEXT: mtc1 $2, $f0 992; MIPSR6-N64-NEXT: cmp.un.s $f0, $f0, $f0 993; MIPSR6-N64-NEXT: mfc1 $2, $f0 994; MIPSR6-N64-NEXT: not $2, $2 995; MIPSR6-N64-NEXT: andi $2, $2, 1 996; MIPSR6-N64-NEXT: ld $1, %got_disp(i1)($1) 997; MIPSR6-N64-NEXT: jr $ra 998; MIPSR6-N64-NEXT: sh $2, 0($1) 999entry: 1000 %0 = load i16, ptr @g, align 2 1001 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1002 1003 %2 = load i16, ptr @g, align 2 1004 %3 = call float @llvm.convert.from.fp16.f32(i16 %2) 1005 %fcmp = fcmp oeq float %1, %3 1006 1007 1008 %4 = zext i1 %fcmp to i16 1009 store i16 %4, ptr @i1, align 2 1010 1011 ret void 1012} 1013 1014declare float @llvm.powi.f32.i32(float, i32) 1015 1016define void @fpowi() { 1017; MIPS32-LABEL: fpowi: 1018; MIPS32: # %bb.0: # %entry 1019; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1020; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1021; MIPS32-NEXT: addu $1, $2, $25 1022; MIPS32-NEXT: lw $1, %got(g)($1) 1023; MIPS32-NEXT: lh $2, 0($1) 1024; MIPS32-NEXT: fill.h $w0, $2 1025; MIPS32-NEXT: fexupr.w $w0, $w0 1026; MIPS32-NEXT: copy_s.w $2, $w0[0] 1027; MIPS32-NEXT: mtc1 $2, $f0 1028; MIPS32-NEXT: mul.s $f0, $f0, $f0 1029; MIPS32-NEXT: mfc1 $2, $f0 1030; MIPS32-NEXT: fill.w $w0, $2 1031; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1032; MIPS32-NEXT: copy_u.h $2, $w0[0] 1033; MIPS32-NEXT: jr $ra 1034; MIPS32-NEXT: sh $2, 0($1) 1035; 1036; MIPS64-N32-LABEL: fpowi: 1037; MIPS64-N32: # %bb.0: # %entry 1038; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi))) 1039; MIPS64-N32-NEXT: addu $1, $1, $25 1040; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fpowi))) 1041; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 1042; MIPS64-N32-NEXT: lh $2, 0($1) 1043; MIPS64-N32-NEXT: fill.h $w0, $2 1044; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1045; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 1046; MIPS64-N32-NEXT: mtc1 $2, $f0 1047; MIPS64-N32-NEXT: mul.s $f0, $f0, $f0 1048; MIPS64-N32-NEXT: mfc1 $2, $f0 1049; MIPS64-N32-NEXT: fill.w $w0, $2 1050; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1051; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 1052; MIPS64-N32-NEXT: jr $ra 1053; MIPS64-N32-NEXT: sh $2, 0($1) 1054; 1055; MIPS64-N64-LABEL: fpowi: 1056; MIPS64-N64: # %bb.0: # %entry 1057; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi))) 1058; MIPS64-N64-NEXT: daddu $1, $1, $25 1059; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fpowi))) 1060; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 1061; MIPS64-N64-NEXT: lh $2, 0($1) 1062; MIPS64-N64-NEXT: fill.h $w0, $2 1063; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1064; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 1065; MIPS64-N64-NEXT: mtc1 $2, $f0 1066; MIPS64-N64-NEXT: mul.s $f0, $f0, $f0 1067; MIPS64-N64-NEXT: mfc1 $2, $f0 1068; MIPS64-N64-NEXT: fill.w $w0, $2 1069; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1070; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 1071; MIPS64-N64-NEXT: jr $ra 1072; MIPS64-N64-NEXT: sh $2, 0($1) 1073entry: 1074 %0 = load i16, ptr @g, align 2 1075 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1076 1077 1078 %powi = call float @llvm.powi.f32.i32(float %1, i32 2) 1079 1080 1081 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi) 1082 1083 1084 store i16 %2, ptr @g, align 2 1085 ret void 1086} 1087 1088define void @fpowi_var(i32 %var) { 1089; MIPS32-LABEL: fpowi_var: 1090; MIPS32: # %bb.0: # %entry 1091; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1092; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1093; MIPS32-NEXT: addiu $sp, $sp, -24 1094; MIPS32-NEXT: .cfi_def_cfa_offset 24 1095; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1096; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1097; MIPS32-NEXT: .cfi_offset 31, -4 1098; MIPS32-NEXT: .cfi_offset 16, -8 1099; MIPS32-NEXT: addu $gp, $2, $25 1100; MIPS32-NEXT: lw $16, %got(g)($gp) 1101; MIPS32-NEXT: lh $1, 0($16) 1102; MIPS32-NEXT: fill.h $w0, $1 1103; MIPS32-NEXT: fexupr.w $w0, $w0 1104; MIPS32-NEXT: copy_s.w $1, $w0[0] 1105; MIPS32-NEXT: mtc1 $1, $f12 1106; MIPS32-NEXT: lw $25, %call16(__powisf2)($gp) 1107; MIPS32-NEXT: jalr $25 1108; MIPS32-NEXT: move $5, $4 1109; MIPS32-NEXT: mfc1 $1, $f0 1110; MIPS32-NEXT: fill.w $w0, $1 1111; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1112; MIPS32-NEXT: copy_u.h $1, $w0[0] 1113; MIPS32-NEXT: sh $1, 0($16) 1114; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1115; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1116; MIPS32-NEXT: jr $ra 1117; MIPS32-NEXT: addiu $sp, $sp, 24 1118; 1119; MIPS64-N32-LABEL: fpowi_var: 1120; MIPS64-N32: # %bb.0: # %entry 1121; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1122; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1123; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1124; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1125; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1126; MIPS64-N32-NEXT: .cfi_offset 31, -8 1127; MIPS64-N32-NEXT: .cfi_offset 28, -16 1128; MIPS64-N32-NEXT: .cfi_offset 16, -24 1129; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var))) 1130; MIPS64-N32-NEXT: addu $1, $1, $25 1131; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var))) 1132; MIPS64-N32-NEXT: sll $5, $4, 0 1133; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1134; MIPS64-N32-NEXT: lh $1, 0($16) 1135; MIPS64-N32-NEXT: fill.h $w0, $1 1136; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1137; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1138; MIPS64-N32-NEXT: lw $25, %call16(__powisf2)($gp) 1139; MIPS64-N32-NEXT: jalr $25 1140; MIPS64-N32-NEXT: mtc1 $1, $f12 1141; MIPS64-N32-NEXT: mfc1 $1, $f0 1142; MIPS64-N32-NEXT: fill.w $w0, $1 1143; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1144; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1145; MIPS64-N32-NEXT: sh $1, 0($16) 1146; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1147; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1148; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1149; MIPS64-N32-NEXT: jr $ra 1150; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1151; 1152; MIPS64-N64-LABEL: fpowi_var: 1153; MIPS64-N64: # %bb.0: # %entry 1154; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1155; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1156; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1157; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1158; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1159; MIPS64-N64-NEXT: .cfi_offset 31, -8 1160; MIPS64-N64-NEXT: .cfi_offset 28, -16 1161; MIPS64-N64-NEXT: .cfi_offset 16, -24 1162; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var))) 1163; MIPS64-N64-NEXT: daddu $1, $1, $25 1164; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var))) 1165; MIPS64-N64-NEXT: sll $5, $4, 0 1166; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1167; MIPS64-N64-NEXT: lh $1, 0($16) 1168; MIPS64-N64-NEXT: fill.h $w0, $1 1169; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1170; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1171; MIPS64-N64-NEXT: ld $25, %call16(__powisf2)($gp) 1172; MIPS64-N64-NEXT: jalr $25 1173; MIPS64-N64-NEXT: mtc1 $1, $f12 1174; MIPS64-N64-NEXT: mfc1 $1, $f0 1175; MIPS64-N64-NEXT: fill.w $w0, $1 1176; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1177; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1178; MIPS64-N64-NEXT: sh $1, 0($16) 1179; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1180; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1181; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1182; MIPS64-N64-NEXT: jr $ra 1183; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1184entry: 1185 %0 = load i16, ptr @g, align 2 1186 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1187 1188 1189 %powi = call float @llvm.powi.f32.i32(float %1, i32 %var) 1190 1191 1192 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi) 1193 1194 1195 store i16 %2, ptr @g, align 2 1196 ret void 1197} 1198 1199declare float @llvm.pow.f32(float %Val, float %power) 1200 1201define void @fpow(float %var) { 1202; MIPS32-LABEL: fpow: 1203; MIPS32: # %bb.0: # %entry 1204; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1205; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1206; MIPS32-NEXT: addiu $sp, $sp, -24 1207; MIPS32-NEXT: .cfi_def_cfa_offset 24 1208; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1209; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1210; MIPS32-NEXT: .cfi_offset 31, -4 1211; MIPS32-NEXT: .cfi_offset 16, -8 1212; MIPS32-NEXT: addu $gp, $2, $25 1213; MIPS32-NEXT: mov.s $f14, $f12 1214; MIPS32-NEXT: lw $16, %got(g)($gp) 1215; MIPS32-NEXT: lh $1, 0($16) 1216; MIPS32-NEXT: fill.h $w0, $1 1217; MIPS32-NEXT: fexupr.w $w0, $w0 1218; MIPS32-NEXT: copy_s.w $1, $w0[0] 1219; MIPS32-NEXT: lw $25, %call16(powf)($gp) 1220; MIPS32-NEXT: jalr $25 1221; MIPS32-NEXT: mtc1 $1, $f12 1222; MIPS32-NEXT: mfc1 $1, $f0 1223; MIPS32-NEXT: fill.w $w0, $1 1224; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1225; MIPS32-NEXT: copy_u.h $1, $w0[0] 1226; MIPS32-NEXT: sh $1, 0($16) 1227; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1228; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1229; MIPS32-NEXT: jr $ra 1230; MIPS32-NEXT: addiu $sp, $sp, 24 1231; 1232; MIPS64-N32-LABEL: fpow: 1233; MIPS64-N32: # %bb.0: # %entry 1234; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1235; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1236; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1237; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1238; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1239; MIPS64-N32-NEXT: .cfi_offset 31, -8 1240; MIPS64-N32-NEXT: .cfi_offset 28, -16 1241; MIPS64-N32-NEXT: .cfi_offset 16, -24 1242; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpow))) 1243; MIPS64-N32-NEXT: addu $1, $1, $25 1244; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpow))) 1245; MIPS64-N32-NEXT: mov.s $f13, $f12 1246; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1247; MIPS64-N32-NEXT: lh $1, 0($16) 1248; MIPS64-N32-NEXT: fill.h $w0, $1 1249; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1250; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1251; MIPS64-N32-NEXT: lw $25, %call16(powf)($gp) 1252; MIPS64-N32-NEXT: jalr $25 1253; MIPS64-N32-NEXT: mtc1 $1, $f12 1254; MIPS64-N32-NEXT: mfc1 $1, $f0 1255; MIPS64-N32-NEXT: fill.w $w0, $1 1256; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1257; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1258; MIPS64-N32-NEXT: sh $1, 0($16) 1259; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1260; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1261; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1262; MIPS64-N32-NEXT: jr $ra 1263; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1264; 1265; MIPS64-N64-LABEL: fpow: 1266; MIPS64-N64: # %bb.0: # %entry 1267; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1268; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1269; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1270; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1271; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1272; MIPS64-N64-NEXT: .cfi_offset 31, -8 1273; MIPS64-N64-NEXT: .cfi_offset 28, -16 1274; MIPS64-N64-NEXT: .cfi_offset 16, -24 1275; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpow))) 1276; MIPS64-N64-NEXT: daddu $1, $1, $25 1277; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpow))) 1278; MIPS64-N64-NEXT: mov.s $f13, $f12 1279; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1280; MIPS64-N64-NEXT: lh $1, 0($16) 1281; MIPS64-N64-NEXT: fill.h $w0, $1 1282; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1283; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1284; MIPS64-N64-NEXT: ld $25, %call16(powf)($gp) 1285; MIPS64-N64-NEXT: jalr $25 1286; MIPS64-N64-NEXT: mtc1 $1, $f12 1287; MIPS64-N64-NEXT: mfc1 $1, $f0 1288; MIPS64-N64-NEXT: fill.w $w0, $1 1289; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1290; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1291; MIPS64-N64-NEXT: sh $1, 0($16) 1292; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1293; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1294; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1295; MIPS64-N64-NEXT: jr $ra 1296; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1297entry: 1298 %0 = load i16, ptr @g, align 2 1299 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1300 1301 1302 %powi = call float @llvm.pow.f32(float %1, float %var) 1303 1304 1305 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi) 1306 1307 1308 store i16 %2, ptr @g, align 2 1309 ret void 1310} 1311 1312declare float @llvm.log2.f32(float %Val) 1313 1314define void @flog2() { 1315; MIPS32-LABEL: flog2: 1316; MIPS32: # %bb.0: # %entry 1317; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1318; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1319; MIPS32-NEXT: addiu $sp, $sp, -24 1320; MIPS32-NEXT: .cfi_def_cfa_offset 24 1321; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1322; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1323; MIPS32-NEXT: .cfi_offset 31, -4 1324; MIPS32-NEXT: .cfi_offset 16, -8 1325; MIPS32-NEXT: addu $gp, $2, $25 1326; MIPS32-NEXT: lw $16, %got(g)($gp) 1327; MIPS32-NEXT: lh $1, 0($16) 1328; MIPS32-NEXT: fill.h $w0, $1 1329; MIPS32-NEXT: fexupr.w $w0, $w0 1330; MIPS32-NEXT: copy_s.w $1, $w0[0] 1331; MIPS32-NEXT: lw $25, %call16(log2f)($gp) 1332; MIPS32-NEXT: jalr $25 1333; MIPS32-NEXT: mtc1 $1, $f12 1334; MIPS32-NEXT: mfc1 $1, $f0 1335; MIPS32-NEXT: fill.w $w0, $1 1336; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1337; MIPS32-NEXT: copy_u.h $1, $w0[0] 1338; MIPS32-NEXT: sh $1, 0($16) 1339; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1340; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1341; MIPS32-NEXT: jr $ra 1342; MIPS32-NEXT: addiu $sp, $sp, 24 1343; 1344; MIPS64-N32-LABEL: flog2: 1345; MIPS64-N32: # %bb.0: # %entry 1346; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1347; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1348; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1349; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1350; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1351; MIPS64-N32-NEXT: .cfi_offset 31, -8 1352; MIPS64-N32-NEXT: .cfi_offset 28, -16 1353; MIPS64-N32-NEXT: .cfi_offset 16, -24 1354; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog2))) 1355; MIPS64-N32-NEXT: addu $1, $1, $25 1356; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog2))) 1357; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1358; MIPS64-N32-NEXT: lh $1, 0($16) 1359; MIPS64-N32-NEXT: fill.h $w0, $1 1360; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1361; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1362; MIPS64-N32-NEXT: lw $25, %call16(log2f)($gp) 1363; MIPS64-N32-NEXT: jalr $25 1364; MIPS64-N32-NEXT: mtc1 $1, $f12 1365; MIPS64-N32-NEXT: mfc1 $1, $f0 1366; MIPS64-N32-NEXT: fill.w $w0, $1 1367; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1368; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1369; MIPS64-N32-NEXT: sh $1, 0($16) 1370; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1371; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1372; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1373; MIPS64-N32-NEXT: jr $ra 1374; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1375; 1376; MIPS64-N64-LABEL: flog2: 1377; MIPS64-N64: # %bb.0: # %entry 1378; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1379; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1380; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1381; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1382; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1383; MIPS64-N64-NEXT: .cfi_offset 31, -8 1384; MIPS64-N64-NEXT: .cfi_offset 28, -16 1385; MIPS64-N64-NEXT: .cfi_offset 16, -24 1386; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog2))) 1387; MIPS64-N64-NEXT: daddu $1, $1, $25 1388; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog2))) 1389; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1390; MIPS64-N64-NEXT: lh $1, 0($16) 1391; MIPS64-N64-NEXT: fill.h $w0, $1 1392; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1393; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1394; MIPS64-N64-NEXT: ld $25, %call16(log2f)($gp) 1395; MIPS64-N64-NEXT: jalr $25 1396; MIPS64-N64-NEXT: mtc1 $1, $f12 1397; MIPS64-N64-NEXT: mfc1 $1, $f0 1398; MIPS64-N64-NEXT: fill.w $w0, $1 1399; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1400; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1401; MIPS64-N64-NEXT: sh $1, 0($16) 1402; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1403; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1404; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1405; MIPS64-N64-NEXT: jr $ra 1406; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1407entry: 1408 %0 = load i16, ptr @g, align 2 1409 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1410 1411 1412 %log2 = call float @llvm.log2.f32(float %1) 1413 %2 = call i16 @llvm.convert.to.fp16.f32(float %log2) 1414 1415 1416 store i16 %2, ptr @g, align 2 1417 1418 ret void 1419} 1420 1421declare float @llvm.log10.f32(float %Val) 1422 1423define void @flog10() { 1424; MIPS32-LABEL: flog10: 1425; MIPS32: # %bb.0: # %entry 1426; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1427; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1428; MIPS32-NEXT: addiu $sp, $sp, -24 1429; MIPS32-NEXT: .cfi_def_cfa_offset 24 1430; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1431; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1432; MIPS32-NEXT: .cfi_offset 31, -4 1433; MIPS32-NEXT: .cfi_offset 16, -8 1434; MIPS32-NEXT: addu $gp, $2, $25 1435; MIPS32-NEXT: lw $16, %got(g)($gp) 1436; MIPS32-NEXT: lh $1, 0($16) 1437; MIPS32-NEXT: fill.h $w0, $1 1438; MIPS32-NEXT: fexupr.w $w0, $w0 1439; MIPS32-NEXT: copy_s.w $1, $w0[0] 1440; MIPS32-NEXT: lw $25, %call16(log10f)($gp) 1441; MIPS32-NEXT: jalr $25 1442; MIPS32-NEXT: mtc1 $1, $f12 1443; MIPS32-NEXT: mfc1 $1, $f0 1444; MIPS32-NEXT: fill.w $w0, $1 1445; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1446; MIPS32-NEXT: copy_u.h $1, $w0[0] 1447; MIPS32-NEXT: sh $1, 0($16) 1448; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1449; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1450; MIPS32-NEXT: jr $ra 1451; MIPS32-NEXT: addiu $sp, $sp, 24 1452; 1453; MIPS64-N32-LABEL: flog10: 1454; MIPS64-N32: # %bb.0: # %entry 1455; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1456; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1457; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1458; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1459; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1460; MIPS64-N32-NEXT: .cfi_offset 31, -8 1461; MIPS64-N32-NEXT: .cfi_offset 28, -16 1462; MIPS64-N32-NEXT: .cfi_offset 16, -24 1463; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog10))) 1464; MIPS64-N32-NEXT: addu $1, $1, $25 1465; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog10))) 1466; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1467; MIPS64-N32-NEXT: lh $1, 0($16) 1468; MIPS64-N32-NEXT: fill.h $w0, $1 1469; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1470; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1471; MIPS64-N32-NEXT: lw $25, %call16(log10f)($gp) 1472; MIPS64-N32-NEXT: jalr $25 1473; MIPS64-N32-NEXT: mtc1 $1, $f12 1474; MIPS64-N32-NEXT: mfc1 $1, $f0 1475; MIPS64-N32-NEXT: fill.w $w0, $1 1476; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1477; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1478; MIPS64-N32-NEXT: sh $1, 0($16) 1479; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1480; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1481; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1482; MIPS64-N32-NEXT: jr $ra 1483; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1484; 1485; MIPS64-N64-LABEL: flog10: 1486; MIPS64-N64: # %bb.0: # %entry 1487; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1488; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1489; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1490; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1491; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1492; MIPS64-N64-NEXT: .cfi_offset 31, -8 1493; MIPS64-N64-NEXT: .cfi_offset 28, -16 1494; MIPS64-N64-NEXT: .cfi_offset 16, -24 1495; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog10))) 1496; MIPS64-N64-NEXT: daddu $1, $1, $25 1497; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog10))) 1498; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1499; MIPS64-N64-NEXT: lh $1, 0($16) 1500; MIPS64-N64-NEXT: fill.h $w0, $1 1501; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1502; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1503; MIPS64-N64-NEXT: ld $25, %call16(log10f)($gp) 1504; MIPS64-N64-NEXT: jalr $25 1505; MIPS64-N64-NEXT: mtc1 $1, $f12 1506; MIPS64-N64-NEXT: mfc1 $1, $f0 1507; MIPS64-N64-NEXT: fill.w $w0, $1 1508; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1509; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1510; MIPS64-N64-NEXT: sh $1, 0($16) 1511; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1512; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1513; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1514; MIPS64-N64-NEXT: jr $ra 1515; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1516entry: 1517 %0 = load i16, ptr @g, align 2 1518 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1519 1520 1521 %log10 = call float @llvm.log10.f32(float %1) 1522 %2 = call i16 @llvm.convert.to.fp16.f32(float %log10) 1523 1524 1525 store i16 %2, ptr @g, align 2 1526 1527 ret void 1528} 1529 1530declare float @llvm.sqrt.f32(float %Val) 1531 1532define void @fsqrt() { 1533; MIPS32-LABEL: fsqrt: 1534; MIPS32: # %bb.0: # %entry 1535; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1536; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1537; MIPS32-NEXT: addu $1, $2, $25 1538; MIPS32-NEXT: lw $1, %got(g)($1) 1539; MIPS32-NEXT: lh $2, 0($1) 1540; MIPS32-NEXT: fill.h $w0, $2 1541; MIPS32-NEXT: fexupr.w $w0, $w0 1542; MIPS32-NEXT: copy_s.w $2, $w0[0] 1543; MIPS32-NEXT: mtc1 $2, $f0 1544; MIPS32-NEXT: sqrt.s $f0, $f0 1545; MIPS32-NEXT: mfc1 $2, $f0 1546; MIPS32-NEXT: fill.w $w0, $2 1547; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1548; MIPS32-NEXT: copy_u.h $2, $w0[0] 1549; MIPS32-NEXT: jr $ra 1550; MIPS32-NEXT: sh $2, 0($1) 1551; 1552; MIPS64-N32-LABEL: fsqrt: 1553; MIPS64-N32: # %bb.0: # %entry 1554; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt))) 1555; MIPS64-N32-NEXT: addu $1, $1, $25 1556; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsqrt))) 1557; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 1558; MIPS64-N32-NEXT: lh $2, 0($1) 1559; MIPS64-N32-NEXT: fill.h $w0, $2 1560; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1561; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 1562; MIPS64-N32-NEXT: mtc1 $2, $f0 1563; MIPS64-N32-NEXT: sqrt.s $f0, $f0 1564; MIPS64-N32-NEXT: mfc1 $2, $f0 1565; MIPS64-N32-NEXT: fill.w $w0, $2 1566; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1567; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 1568; MIPS64-N32-NEXT: jr $ra 1569; MIPS64-N32-NEXT: sh $2, 0($1) 1570; 1571; MIPS64-N64-LABEL: fsqrt: 1572; MIPS64-N64: # %bb.0: # %entry 1573; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt))) 1574; MIPS64-N64-NEXT: daddu $1, $1, $25 1575; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsqrt))) 1576; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 1577; MIPS64-N64-NEXT: lh $2, 0($1) 1578; MIPS64-N64-NEXT: fill.h $w0, $2 1579; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1580; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 1581; MIPS64-N64-NEXT: mtc1 $2, $f0 1582; MIPS64-N64-NEXT: sqrt.s $f0, $f0 1583; MIPS64-N64-NEXT: mfc1 $2, $f0 1584; MIPS64-N64-NEXT: fill.w $w0, $2 1585; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1586; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 1587; MIPS64-N64-NEXT: jr $ra 1588; MIPS64-N64-NEXT: sh $2, 0($1) 1589entry: 1590 %0 = load i16, ptr @g, align 2 1591 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1592 1593 1594 %sqrt = call float @llvm.sqrt.f32(float %1) 1595 %2 = call i16 @llvm.convert.to.fp16.f32(float %sqrt) 1596 1597 1598 store i16 %2, ptr @g, align 2 1599 1600 ret void 1601} 1602 1603declare float @llvm.sin.f32(float %Val) 1604 1605define void @fsin() { 1606; MIPS32-LABEL: fsin: 1607; MIPS32: # %bb.0: # %entry 1608; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1609; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1610; MIPS32-NEXT: addiu $sp, $sp, -24 1611; MIPS32-NEXT: .cfi_def_cfa_offset 24 1612; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1613; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1614; MIPS32-NEXT: .cfi_offset 31, -4 1615; MIPS32-NEXT: .cfi_offset 16, -8 1616; MIPS32-NEXT: addu $gp, $2, $25 1617; MIPS32-NEXT: lw $16, %got(g)($gp) 1618; MIPS32-NEXT: lh $1, 0($16) 1619; MIPS32-NEXT: fill.h $w0, $1 1620; MIPS32-NEXT: fexupr.w $w0, $w0 1621; MIPS32-NEXT: copy_s.w $1, $w0[0] 1622; MIPS32-NEXT: lw $25, %call16(sinf)($gp) 1623; MIPS32-NEXT: jalr $25 1624; MIPS32-NEXT: mtc1 $1, $f12 1625; MIPS32-NEXT: mfc1 $1, $f0 1626; MIPS32-NEXT: fill.w $w0, $1 1627; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1628; MIPS32-NEXT: copy_u.h $1, $w0[0] 1629; MIPS32-NEXT: sh $1, 0($16) 1630; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1631; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1632; MIPS32-NEXT: jr $ra 1633; MIPS32-NEXT: addiu $sp, $sp, 24 1634; 1635; MIPS64-N32-LABEL: fsin: 1636; MIPS64-N32: # %bb.0: # %entry 1637; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1638; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1639; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1640; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1641; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1642; MIPS64-N32-NEXT: .cfi_offset 31, -8 1643; MIPS64-N32-NEXT: .cfi_offset 28, -16 1644; MIPS64-N32-NEXT: .cfi_offset 16, -24 1645; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsin))) 1646; MIPS64-N32-NEXT: addu $1, $1, $25 1647; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fsin))) 1648; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1649; MIPS64-N32-NEXT: lh $1, 0($16) 1650; MIPS64-N32-NEXT: fill.h $w0, $1 1651; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1652; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1653; MIPS64-N32-NEXT: lw $25, %call16(sinf)($gp) 1654; MIPS64-N32-NEXT: jalr $25 1655; MIPS64-N32-NEXT: mtc1 $1, $f12 1656; MIPS64-N32-NEXT: mfc1 $1, $f0 1657; MIPS64-N32-NEXT: fill.w $w0, $1 1658; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1659; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1660; MIPS64-N32-NEXT: sh $1, 0($16) 1661; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1662; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1663; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1664; MIPS64-N32-NEXT: jr $ra 1665; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1666; 1667; MIPS64-N64-LABEL: fsin: 1668; MIPS64-N64: # %bb.0: # %entry 1669; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1670; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1671; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1672; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1673; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1674; MIPS64-N64-NEXT: .cfi_offset 31, -8 1675; MIPS64-N64-NEXT: .cfi_offset 28, -16 1676; MIPS64-N64-NEXT: .cfi_offset 16, -24 1677; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsin))) 1678; MIPS64-N64-NEXT: daddu $1, $1, $25 1679; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fsin))) 1680; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1681; MIPS64-N64-NEXT: lh $1, 0($16) 1682; MIPS64-N64-NEXT: fill.h $w0, $1 1683; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1684; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1685; MIPS64-N64-NEXT: ld $25, %call16(sinf)($gp) 1686; MIPS64-N64-NEXT: jalr $25 1687; MIPS64-N64-NEXT: mtc1 $1, $f12 1688; MIPS64-N64-NEXT: mfc1 $1, $f0 1689; MIPS64-N64-NEXT: fill.w $w0, $1 1690; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1691; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1692; MIPS64-N64-NEXT: sh $1, 0($16) 1693; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1694; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1695; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1696; MIPS64-N64-NEXT: jr $ra 1697; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1698entry: 1699 %0 = load i16, ptr @g, align 2 1700 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1701 1702 1703 %sin = call float @llvm.sin.f32(float %1) 1704 %2 = call i16 @llvm.convert.to.fp16.f32(float %sin) 1705 1706 1707 store i16 %2, ptr @g, align 2 1708 1709 ret void 1710} 1711 1712declare float @llvm.cos.f32(float %Val) 1713 1714define void @fcos() { 1715; MIPS32-LABEL: fcos: 1716; MIPS32: # %bb.0: # %entry 1717; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1718; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1719; MIPS32-NEXT: addiu $sp, $sp, -24 1720; MIPS32-NEXT: .cfi_def_cfa_offset 24 1721; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1722; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1723; MIPS32-NEXT: .cfi_offset 31, -4 1724; MIPS32-NEXT: .cfi_offset 16, -8 1725; MIPS32-NEXT: addu $gp, $2, $25 1726; MIPS32-NEXT: lw $16, %got(g)($gp) 1727; MIPS32-NEXT: lh $1, 0($16) 1728; MIPS32-NEXT: fill.h $w0, $1 1729; MIPS32-NEXT: fexupr.w $w0, $w0 1730; MIPS32-NEXT: copy_s.w $1, $w0[0] 1731; MIPS32-NEXT: lw $25, %call16(cosf)($gp) 1732; MIPS32-NEXT: jalr $25 1733; MIPS32-NEXT: mtc1 $1, $f12 1734; MIPS32-NEXT: mfc1 $1, $f0 1735; MIPS32-NEXT: fill.w $w0, $1 1736; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1737; MIPS32-NEXT: copy_u.h $1, $w0[0] 1738; MIPS32-NEXT: sh $1, 0($16) 1739; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1740; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1741; MIPS32-NEXT: jr $ra 1742; MIPS32-NEXT: addiu $sp, $sp, 24 1743; 1744; MIPS64-N32-LABEL: fcos: 1745; MIPS64-N32: # %bb.0: # %entry 1746; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1747; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1748; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1749; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1750; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1751; MIPS64-N32-NEXT: .cfi_offset 31, -8 1752; MIPS64-N32-NEXT: .cfi_offset 28, -16 1753; MIPS64-N32-NEXT: .cfi_offset 16, -24 1754; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcos))) 1755; MIPS64-N32-NEXT: addu $1, $1, $25 1756; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fcos))) 1757; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1758; MIPS64-N32-NEXT: lh $1, 0($16) 1759; MIPS64-N32-NEXT: fill.h $w0, $1 1760; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1761; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1762; MIPS64-N32-NEXT: lw $25, %call16(cosf)($gp) 1763; MIPS64-N32-NEXT: jalr $25 1764; MIPS64-N32-NEXT: mtc1 $1, $f12 1765; MIPS64-N32-NEXT: mfc1 $1, $f0 1766; MIPS64-N32-NEXT: fill.w $w0, $1 1767; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1768; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1769; MIPS64-N32-NEXT: sh $1, 0($16) 1770; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1771; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1772; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1773; MIPS64-N32-NEXT: jr $ra 1774; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1775; 1776; MIPS64-N64-LABEL: fcos: 1777; MIPS64-N64: # %bb.0: # %entry 1778; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1779; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1780; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1781; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1782; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1783; MIPS64-N64-NEXT: .cfi_offset 31, -8 1784; MIPS64-N64-NEXT: .cfi_offset 28, -16 1785; MIPS64-N64-NEXT: .cfi_offset 16, -24 1786; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcos))) 1787; MIPS64-N64-NEXT: daddu $1, $1, $25 1788; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fcos))) 1789; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1790; MIPS64-N64-NEXT: lh $1, 0($16) 1791; MIPS64-N64-NEXT: fill.h $w0, $1 1792; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1793; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1794; MIPS64-N64-NEXT: ld $25, %call16(cosf)($gp) 1795; MIPS64-N64-NEXT: jalr $25 1796; MIPS64-N64-NEXT: mtc1 $1, $f12 1797; MIPS64-N64-NEXT: mfc1 $1, $f0 1798; MIPS64-N64-NEXT: fill.w $w0, $1 1799; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1800; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1801; MIPS64-N64-NEXT: sh $1, 0($16) 1802; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1803; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1804; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1805; MIPS64-N64-NEXT: jr $ra 1806; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1807entry: 1808 %0 = load i16, ptr @g, align 2 1809 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1810 1811 1812 %cos = call float @llvm.cos.f32(float %1) 1813 %2 = call i16 @llvm.convert.to.fp16.f32(float %cos) 1814 1815 1816 store i16 %2, ptr @g, align 2 1817 1818 ret void 1819} 1820 1821declare float @llvm.exp.f32(float %Val) 1822 1823define void @fexp() { 1824; MIPS32-LABEL: fexp: 1825; MIPS32: # %bb.0: # %entry 1826; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1827; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1828; MIPS32-NEXT: addiu $sp, $sp, -24 1829; MIPS32-NEXT: .cfi_def_cfa_offset 24 1830; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1831; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1832; MIPS32-NEXT: .cfi_offset 31, -4 1833; MIPS32-NEXT: .cfi_offset 16, -8 1834; MIPS32-NEXT: addu $gp, $2, $25 1835; MIPS32-NEXT: lw $16, %got(g)($gp) 1836; MIPS32-NEXT: lh $1, 0($16) 1837; MIPS32-NEXT: fill.h $w0, $1 1838; MIPS32-NEXT: fexupr.w $w0, $w0 1839; MIPS32-NEXT: copy_s.w $1, $w0[0] 1840; MIPS32-NEXT: lw $25, %call16(expf)($gp) 1841; MIPS32-NEXT: jalr $25 1842; MIPS32-NEXT: mtc1 $1, $f12 1843; MIPS32-NEXT: mfc1 $1, $f0 1844; MIPS32-NEXT: fill.w $w0, $1 1845; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1846; MIPS32-NEXT: copy_u.h $1, $w0[0] 1847; MIPS32-NEXT: sh $1, 0($16) 1848; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1849; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1850; MIPS32-NEXT: jr $ra 1851; MIPS32-NEXT: addiu $sp, $sp, 24 1852; 1853; MIPS64-N32-LABEL: fexp: 1854; MIPS64-N32: # %bb.0: # %entry 1855; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1856; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1857; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1858; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1859; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1860; MIPS64-N32-NEXT: .cfi_offset 31, -8 1861; MIPS64-N32-NEXT: .cfi_offset 28, -16 1862; MIPS64-N32-NEXT: .cfi_offset 16, -24 1863; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp))) 1864; MIPS64-N32-NEXT: addu $1, $1, $25 1865; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp))) 1866; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1867; MIPS64-N32-NEXT: lh $1, 0($16) 1868; MIPS64-N32-NEXT: fill.h $w0, $1 1869; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1870; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1871; MIPS64-N32-NEXT: lw $25, %call16(expf)($gp) 1872; MIPS64-N32-NEXT: jalr $25 1873; MIPS64-N32-NEXT: mtc1 $1, $f12 1874; MIPS64-N32-NEXT: mfc1 $1, $f0 1875; MIPS64-N32-NEXT: fill.w $w0, $1 1876; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1877; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1878; MIPS64-N32-NEXT: sh $1, 0($16) 1879; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1880; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1881; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1882; MIPS64-N32-NEXT: jr $ra 1883; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1884; 1885; MIPS64-N64-LABEL: fexp: 1886; MIPS64-N64: # %bb.0: # %entry 1887; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1888; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1889; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1890; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1891; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1892; MIPS64-N64-NEXT: .cfi_offset 31, -8 1893; MIPS64-N64-NEXT: .cfi_offset 28, -16 1894; MIPS64-N64-NEXT: .cfi_offset 16, -24 1895; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp))) 1896; MIPS64-N64-NEXT: daddu $1, $1, $25 1897; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp))) 1898; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 1899; MIPS64-N64-NEXT: lh $1, 0($16) 1900; MIPS64-N64-NEXT: fill.h $w0, $1 1901; MIPS64-N64-NEXT: fexupr.w $w0, $w0 1902; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 1903; MIPS64-N64-NEXT: ld $25, %call16(expf)($gp) 1904; MIPS64-N64-NEXT: jalr $25 1905; MIPS64-N64-NEXT: mtc1 $1, $f12 1906; MIPS64-N64-NEXT: mfc1 $1, $f0 1907; MIPS64-N64-NEXT: fill.w $w0, $1 1908; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 1909; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 1910; MIPS64-N64-NEXT: sh $1, 0($16) 1911; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1912; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1913; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1914; MIPS64-N64-NEXT: jr $ra 1915; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 1916entry: 1917 %0 = load i16, ptr @g, align 2 1918 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 1919 1920 %exp = call float @llvm.exp.f32(float %1) 1921 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp) 1922 1923 1924 store i16 %2, ptr @g, align 2 1925 1926 ret void 1927} 1928 1929declare float @llvm.exp2.f32(float %Val) 1930 1931define void @fexp2() { 1932; MIPS32-LABEL: fexp2: 1933; MIPS32: # %bb.0: # %entry 1934; MIPS32-NEXT: lui $2, %hi(_gp_disp) 1935; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 1936; MIPS32-NEXT: addiu $sp, $sp, -24 1937; MIPS32-NEXT: .cfi_def_cfa_offset 24 1938; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 1939; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 1940; MIPS32-NEXT: .cfi_offset 31, -4 1941; MIPS32-NEXT: .cfi_offset 16, -8 1942; MIPS32-NEXT: addu $gp, $2, $25 1943; MIPS32-NEXT: lw $16, %got(g)($gp) 1944; MIPS32-NEXT: lh $1, 0($16) 1945; MIPS32-NEXT: fill.h $w0, $1 1946; MIPS32-NEXT: fexupr.w $w0, $w0 1947; MIPS32-NEXT: copy_s.w $1, $w0[0] 1948; MIPS32-NEXT: lw $25, %call16(exp2f)($gp) 1949; MIPS32-NEXT: jalr $25 1950; MIPS32-NEXT: mtc1 $1, $f12 1951; MIPS32-NEXT: mfc1 $1, $f0 1952; MIPS32-NEXT: fill.w $w0, $1 1953; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 1954; MIPS32-NEXT: copy_u.h $1, $w0[0] 1955; MIPS32-NEXT: sh $1, 0($16) 1956; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 1957; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 1958; MIPS32-NEXT: jr $ra 1959; MIPS32-NEXT: addiu $sp, $sp, 24 1960; 1961; MIPS64-N32-LABEL: fexp2: 1962; MIPS64-N32: # %bb.0: # %entry 1963; MIPS64-N32-NEXT: addiu $sp, $sp, -32 1964; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 1965; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1966; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1967; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 1968; MIPS64-N32-NEXT: .cfi_offset 31, -8 1969; MIPS64-N32-NEXT: .cfi_offset 28, -16 1970; MIPS64-N32-NEXT: .cfi_offset 16, -24 1971; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2))) 1972; MIPS64-N32-NEXT: addu $1, $1, $25 1973; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp2))) 1974; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 1975; MIPS64-N32-NEXT: lh $1, 0($16) 1976; MIPS64-N32-NEXT: fill.h $w0, $1 1977; MIPS64-N32-NEXT: fexupr.w $w0, $w0 1978; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 1979; MIPS64-N32-NEXT: lw $25, %call16(exp2f)($gp) 1980; MIPS64-N32-NEXT: jalr $25 1981; MIPS64-N32-NEXT: mtc1 $1, $f12 1982; MIPS64-N32-NEXT: mfc1 $1, $f0 1983; MIPS64-N32-NEXT: fill.w $w0, $1 1984; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 1985; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 1986; MIPS64-N32-NEXT: sh $1, 0($16) 1987; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 1988; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 1989; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 1990; MIPS64-N32-NEXT: jr $ra 1991; MIPS64-N32-NEXT: addiu $sp, $sp, 32 1992; 1993; MIPS64-N64-LABEL: fexp2: 1994; MIPS64-N64: # %bb.0: # %entry 1995; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 1996; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 1997; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 1998; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 1999; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2000; MIPS64-N64-NEXT: .cfi_offset 31, -8 2001; MIPS64-N64-NEXT: .cfi_offset 28, -16 2002; MIPS64-N64-NEXT: .cfi_offset 16, -24 2003; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2))) 2004; MIPS64-N64-NEXT: daddu $1, $1, $25 2005; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp2))) 2006; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 2007; MIPS64-N64-NEXT: lh $1, 0($16) 2008; MIPS64-N64-NEXT: fill.h $w0, $1 2009; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2010; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 2011; MIPS64-N64-NEXT: ld $25, %call16(exp2f)($gp) 2012; MIPS64-N64-NEXT: jalr $25 2013; MIPS64-N64-NEXT: mtc1 $1, $f12 2014; MIPS64-N64-NEXT: mfc1 $1, $f0 2015; MIPS64-N64-NEXT: fill.w $w0, $1 2016; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2017; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 2018; MIPS64-N64-NEXT: sh $1, 0($16) 2019; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2020; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2021; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2022; MIPS64-N64-NEXT: jr $ra 2023; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 2024entry: 2025 %0 = load i16, ptr @g, align 2 2026 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2027 2028 2029 %exp2 = call float @llvm.exp2.f32(float %1) 2030 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp2) 2031 2032 2033 store i16 %2, ptr @g, align 2 2034 2035 ret void 2036} 2037 2038declare float @llvm.fma.f32(float, float, float) 2039 2040define void @ffma(float %b, float %c) { 2041; MIPS32-LABEL: ffma: 2042; MIPS32: # %bb.0: # %entry 2043; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2044; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2045; MIPS32-NEXT: addiu $sp, $sp, -24 2046; MIPS32-NEXT: .cfi_def_cfa_offset 24 2047; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 2048; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 2049; MIPS32-NEXT: .cfi_offset 31, -4 2050; MIPS32-NEXT: .cfi_offset 16, -8 2051; MIPS32-NEXT: addu $gp, $2, $25 2052; MIPS32-NEXT: mov.s $f0, $f12 2053; MIPS32-NEXT: mfc1 $6, $f14 2054; MIPS32-NEXT: lw $16, %got(g)($gp) 2055; MIPS32-NEXT: lh $1, 0($16) 2056; MIPS32-NEXT: fill.h $w1, $1 2057; MIPS32-NEXT: fexupr.w $w1, $w1 2058; MIPS32-NEXT: copy_s.w $1, $w1[0] 2059; MIPS32-NEXT: mtc1 $1, $f12 2060; MIPS32-NEXT: lw $25, %call16(fmaf)($gp) 2061; MIPS32-NEXT: jalr $25 2062; MIPS32-NEXT: mov.s $f14, $f0 2063; MIPS32-NEXT: mfc1 $1, $f0 2064; MIPS32-NEXT: fill.w $w0, $1 2065; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 2066; MIPS32-NEXT: copy_u.h $1, $w0[0] 2067; MIPS32-NEXT: sh $1, 0($16) 2068; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 2069; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 2070; MIPS32-NEXT: jr $ra 2071; MIPS32-NEXT: addiu $sp, $sp, 24 2072; 2073; MIPS64-N32-LABEL: ffma: 2074; MIPS64-N32: # %bb.0: # %entry 2075; MIPS64-N32-NEXT: addiu $sp, $sp, -32 2076; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 2077; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2078; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2079; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2080; MIPS64-N32-NEXT: .cfi_offset 31, -8 2081; MIPS64-N32-NEXT: .cfi_offset 28, -16 2082; MIPS64-N32-NEXT: .cfi_offset 16, -24 2083; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffma))) 2084; MIPS64-N32-NEXT: addu $1, $1, $25 2085; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffma))) 2086; MIPS64-N32-NEXT: mov.s $f14, $f13 2087; MIPS64-N32-NEXT: mov.s $f13, $f12 2088; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 2089; MIPS64-N32-NEXT: lh $1, 0($16) 2090; MIPS64-N32-NEXT: fill.h $w0, $1 2091; MIPS64-N32-NEXT: fexupr.w $w0, $w0 2092; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 2093; MIPS64-N32-NEXT: lw $25, %call16(fmaf)($gp) 2094; MIPS64-N32-NEXT: jalr $25 2095; MIPS64-N32-NEXT: mtc1 $1, $f12 2096; MIPS64-N32-NEXT: mfc1 $1, $f0 2097; MIPS64-N32-NEXT: fill.w $w0, $1 2098; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 2099; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 2100; MIPS64-N32-NEXT: sh $1, 0($16) 2101; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2102; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2103; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2104; MIPS64-N32-NEXT: jr $ra 2105; MIPS64-N32-NEXT: addiu $sp, $sp, 32 2106; 2107; MIPS64-N64-LABEL: ffma: 2108; MIPS64-N64: # %bb.0: # %entry 2109; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 2110; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 2111; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2112; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2113; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2114; MIPS64-N64-NEXT: .cfi_offset 31, -8 2115; MIPS64-N64-NEXT: .cfi_offset 28, -16 2116; MIPS64-N64-NEXT: .cfi_offset 16, -24 2117; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffma))) 2118; MIPS64-N64-NEXT: daddu $1, $1, $25 2119; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffma))) 2120; MIPS64-N64-NEXT: mov.s $f14, $f13 2121; MIPS64-N64-NEXT: mov.s $f13, $f12 2122; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 2123; MIPS64-N64-NEXT: lh $1, 0($16) 2124; MIPS64-N64-NEXT: fill.h $w0, $1 2125; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2126; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 2127; MIPS64-N64-NEXT: ld $25, %call16(fmaf)($gp) 2128; MIPS64-N64-NEXT: jalr $25 2129; MIPS64-N64-NEXT: mtc1 $1, $f12 2130; MIPS64-N64-NEXT: mfc1 $1, $f0 2131; MIPS64-N64-NEXT: fill.w $w0, $1 2132; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2133; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 2134; MIPS64-N64-NEXT: sh $1, 0($16) 2135; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2136; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2137; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2138; MIPS64-N64-NEXT: jr $ra 2139; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 2140entry: 2141 %0 = load i16, ptr @g, align 2 2142 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2143 2144 2145 %fma = call float @llvm.fma.f32(float %1, float %b, float %c) 2146 %2 = call i16 @llvm.convert.to.fp16.f32(float %fma) 2147 2148 2149 store i16 %2, ptr @g, align 2 2150 2151 ret void 2152} 2153 2154; FIXME: For MIPSR6, this should produced the maddf.s instruction. MIPSR5 cannot 2155; fuse the operation such that the intermediate result is not rounded. 2156 2157declare float @llvm.fmuladd.f32(float, float, float) 2158 2159define void @ffmuladd(float %b, float %c) { 2160; MIPS32-O32-LABEL: ffmuladd: 2161; MIPS32-O32: # %bb.0: # %entry 2162; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp) 2163; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2164; MIPS32-O32-NEXT: addu $1, $2, $25 2165; MIPS32-O32-NEXT: lw $1, %got(g)($1) 2166; MIPS32-O32-NEXT: lh $2, 0($1) 2167; MIPS32-O32-NEXT: fill.h $w0, $2 2168; MIPS32-O32-NEXT: fexupr.w $w0, $w0 2169; MIPS32-O32-NEXT: copy_s.w $2, $w0[0] 2170; MIPS32-O32-NEXT: mtc1 $2, $f0 2171; MIPS32-O32-NEXT: madd.s $f0, $f14, $f0, $f12 2172; MIPS32-O32-NEXT: mfc1 $2, $f0 2173; MIPS32-O32-NEXT: fill.w $w0, $2 2174; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w0 2175; MIPS32-O32-NEXT: copy_u.h $2, $w0[0] 2176; MIPS32-O32-NEXT: jr $ra 2177; MIPS32-O32-NEXT: sh $2, 0($1) 2178; 2179; MIPS64R5-N32-LABEL: ffmuladd: 2180; MIPS64R5-N32: # %bb.0: # %entry 2181; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd))) 2182; MIPS64R5-N32-NEXT: addu $1, $1, $25 2183; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd))) 2184; MIPS64R5-N32-NEXT: lw $1, %got_disp(g)($1) 2185; MIPS64R5-N32-NEXT: lh $2, 0($1) 2186; MIPS64R5-N32-NEXT: fill.h $w0, $2 2187; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0 2188; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0] 2189; MIPS64R5-N32-NEXT: mtc1 $2, $f0 2190; MIPS64R5-N32-NEXT: madd.s $f0, $f13, $f0, $f12 2191; MIPS64R5-N32-NEXT: mfc1 $2, $f0 2192; MIPS64R5-N32-NEXT: fill.w $w0, $2 2193; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w0 2194; MIPS64R5-N32-NEXT: copy_u.h $2, $w0[0] 2195; MIPS64R5-N32-NEXT: jr $ra 2196; MIPS64R5-N32-NEXT: sh $2, 0($1) 2197; 2198; MIPS64R5-N64-LABEL: ffmuladd: 2199; MIPS64R5-N64: # %bb.0: # %entry 2200; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd))) 2201; MIPS64R5-N64-NEXT: daddu $1, $1, $25 2202; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd))) 2203; MIPS64R5-N64-NEXT: ld $1, %got_disp(g)($1) 2204; MIPS64R5-N64-NEXT: lh $2, 0($1) 2205; MIPS64R5-N64-NEXT: fill.h $w0, $2 2206; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0 2207; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0] 2208; MIPS64R5-N64-NEXT: mtc1 $2, $f0 2209; MIPS64R5-N64-NEXT: madd.s $f0, $f13, $f0, $f12 2210; MIPS64R5-N64-NEXT: mfc1 $2, $f0 2211; MIPS64R5-N64-NEXT: fill.w $w0, $2 2212; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w0 2213; MIPS64R5-N64-NEXT: copy_u.h $2, $w0[0] 2214; MIPS64R5-N64-NEXT: jr $ra 2215; MIPS64R5-N64-NEXT: sh $2, 0($1) 2216; 2217; MIPSR6-O32-LABEL: ffmuladd: 2218; MIPSR6-O32: # %bb.0: # %entry 2219; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp) 2220; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2221; MIPSR6-O32-NEXT: addu $1, $2, $25 2222; MIPSR6-O32-NEXT: lw $1, %got(g)($1) 2223; MIPSR6-O32-NEXT: lh $2, 0($1) 2224; MIPSR6-O32-NEXT: fill.h $w0, $2 2225; MIPSR6-O32-NEXT: fexupr.w $w0, $w0 2226; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0] 2227; MIPSR6-O32-NEXT: mtc1 $2, $f0 2228; MIPSR6-O32-NEXT: mul.s $f0, $f0, $f12 2229; MIPSR6-O32-NEXT: add.s $f0, $f0, $f14 2230; MIPSR6-O32-NEXT: mfc1 $2, $f0 2231; MIPSR6-O32-NEXT: fill.w $w0, $2 2232; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w0 2233; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0] 2234; MIPSR6-O32-NEXT: jr $ra 2235; MIPSR6-O32-NEXT: sh $2, 0($1) 2236; 2237; MIPSR6-N32-LABEL: ffmuladd: 2238; MIPSR6-N32: # %bb.0: # %entry 2239; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd))) 2240; MIPSR6-N32-NEXT: addu $1, $1, $25 2241; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd))) 2242; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1) 2243; MIPSR6-N32-NEXT: lh $2, 0($1) 2244; MIPSR6-N32-NEXT: fill.h $w0, $2 2245; MIPSR6-N32-NEXT: fexupr.w $w0, $w0 2246; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0] 2247; MIPSR6-N32-NEXT: mtc1 $2, $f0 2248; MIPSR6-N32-NEXT: mul.s $f0, $f0, $f12 2249; MIPSR6-N32-NEXT: add.s $f0, $f0, $f13 2250; MIPSR6-N32-NEXT: mfc1 $2, $f0 2251; MIPSR6-N32-NEXT: fill.w $w0, $2 2252; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w0 2253; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0] 2254; MIPSR6-N32-NEXT: jr $ra 2255; MIPSR6-N32-NEXT: sh $2, 0($1) 2256; 2257; MIPSR6-N64-LABEL: ffmuladd: 2258; MIPSR6-N64: # %bb.0: # %entry 2259; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd))) 2260; MIPSR6-N64-NEXT: daddu $1, $1, $25 2261; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd))) 2262; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1) 2263; MIPSR6-N64-NEXT: lh $2, 0($1) 2264; MIPSR6-N64-NEXT: fill.h $w0, $2 2265; MIPSR6-N64-NEXT: fexupr.w $w0, $w0 2266; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0] 2267; MIPSR6-N64-NEXT: mtc1 $2, $f0 2268; MIPSR6-N64-NEXT: mul.s $f0, $f0, $f12 2269; MIPSR6-N64-NEXT: add.s $f0, $f0, $f13 2270; MIPSR6-N64-NEXT: mfc1 $2, $f0 2271; MIPSR6-N64-NEXT: fill.w $w0, $2 2272; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w0 2273; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0] 2274; MIPSR6-N64-NEXT: jr $ra 2275; MIPSR6-N64-NEXT: sh $2, 0($1) 2276entry: 2277 %0 = load i16, ptr @g, align 2 2278 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2279 2280; MIPS32-N32: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12 2281; MIPS32-N64: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12 2282 2283 %fmuladd = call float @llvm.fmuladd.f32(float %1, float %b, float %c) 2284 %2 = call i16 @llvm.convert.to.fp16.f32(float %fmuladd) 2285 2286 2287 store i16 %2, ptr @g, align 2 2288 2289 ret void 2290} 2291 2292declare float @llvm.fabs.f32(float %Val) 2293 2294define void @ffabs() { 2295; MIPS32-LABEL: ffabs: 2296; MIPS32: # %bb.0: # %entry 2297; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2298; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2299; MIPS32-NEXT: addu $1, $2, $25 2300; MIPS32-NEXT: lw $1, %got(g)($1) 2301; MIPS32-NEXT: lh $2, 0($1) 2302; MIPS32-NEXT: fill.h $w0, $2 2303; MIPS32-NEXT: fexupr.w $w0, $w0 2304; MIPS32-NEXT: copy_s.w $2, $w0[0] 2305; MIPS32-NEXT: mtc1 $2, $f0 2306; MIPS32-NEXT: abs.s $f0, $f0 2307; MIPS32-NEXT: mfc1 $2, $f0 2308; MIPS32-NEXT: fill.w $w0, $2 2309; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 2310; MIPS32-NEXT: copy_u.h $2, $w0[0] 2311; MIPS32-NEXT: jr $ra 2312; MIPS32-NEXT: sh $2, 0($1) 2313; 2314; MIPS64-N32-LABEL: ffabs: 2315; MIPS64-N32: # %bb.0: # %entry 2316; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs))) 2317; MIPS64-N32-NEXT: addu $1, $1, $25 2318; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffabs))) 2319; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 2320; MIPS64-N32-NEXT: lh $2, 0($1) 2321; MIPS64-N32-NEXT: fill.h $w0, $2 2322; MIPS64-N32-NEXT: fexupr.w $w0, $w0 2323; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 2324; MIPS64-N32-NEXT: mtc1 $2, $f0 2325; MIPS64-N32-NEXT: abs.s $f0, $f0 2326; MIPS64-N32-NEXT: mfc1 $2, $f0 2327; MIPS64-N32-NEXT: fill.w $w0, $2 2328; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 2329; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 2330; MIPS64-N32-NEXT: jr $ra 2331; MIPS64-N32-NEXT: sh $2, 0($1) 2332; 2333; MIPS64-N64-LABEL: ffabs: 2334; MIPS64-N64: # %bb.0: # %entry 2335; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs))) 2336; MIPS64-N64-NEXT: daddu $1, $1, $25 2337; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffabs))) 2338; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 2339; MIPS64-N64-NEXT: lh $2, 0($1) 2340; MIPS64-N64-NEXT: fill.h $w0, $2 2341; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2342; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 2343; MIPS64-N64-NEXT: mtc1 $2, $f0 2344; MIPS64-N64-NEXT: abs.s $f0, $f0 2345; MIPS64-N64-NEXT: mfc1 $2, $f0 2346; MIPS64-N64-NEXT: fill.w $w0, $2 2347; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2348; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 2349; MIPS64-N64-NEXT: jr $ra 2350; MIPS64-N64-NEXT: sh $2, 0($1) 2351entry: 2352 %0 = load i16, ptr @g, align 2 2353 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2354 2355 2356 %fabs = call float @llvm.fabs.f32(float %1) 2357 %2 = call i16 @llvm.convert.to.fp16.f32(float %fabs) 2358 2359 2360 store i16 %2, ptr @g, align 2 2361 2362 ret void 2363} 2364 2365declare float @llvm.minnum.f32(float %Val, float %b) 2366 2367define void @fminnum(float %b) { 2368; MIPS32-O32-LABEL: fminnum: 2369; MIPS32-O32: # %bb.0: # %entry 2370; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp) 2371; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2372; MIPS32-O32-NEXT: addiu $sp, $sp, -24 2373; MIPS32-O32-NEXT: .cfi_def_cfa_offset 24 2374; MIPS32-O32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 2375; MIPS32-O32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 2376; MIPS32-O32-NEXT: .cfi_offset 31, -4 2377; MIPS32-O32-NEXT: .cfi_offset 16, -8 2378; MIPS32-O32-NEXT: addu $gp, $2, $25 2379; MIPS32-O32-NEXT: mov.s $f14, $f12 2380; MIPS32-O32-NEXT: lw $16, %got(g)($gp) 2381; MIPS32-O32-NEXT: lh $1, 0($16) 2382; MIPS32-O32-NEXT: fill.h $w0, $1 2383; MIPS32-O32-NEXT: fexupr.w $w0, $w0 2384; MIPS32-O32-NEXT: copy_s.w $1, $w0[0] 2385; MIPS32-O32-NEXT: lw $25, %call16(fminf)($gp) 2386; MIPS32-O32-NEXT: jalr $25 2387; MIPS32-O32-NEXT: mtc1 $1, $f12 2388; MIPS32-O32-NEXT: mfc1 $1, $f0 2389; MIPS32-O32-NEXT: fill.w $w0, $1 2390; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w0 2391; MIPS32-O32-NEXT: copy_u.h $1, $w0[0] 2392; MIPS32-O32-NEXT: sh $1, 0($16) 2393; MIPS32-O32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 2394; MIPS32-O32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 2395; MIPS32-O32-NEXT: jr $ra 2396; MIPS32-O32-NEXT: addiu $sp, $sp, 24 2397; 2398; MIPS64R5-N32-LABEL: fminnum: 2399; MIPS64R5-N32: # %bb.0: # %entry 2400; MIPS64R5-N32-NEXT: addiu $sp, $sp, -32 2401; MIPS64R5-N32-NEXT: .cfi_def_cfa_offset 32 2402; MIPS64R5-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2403; MIPS64R5-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2404; MIPS64R5-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2405; MIPS64R5-N32-NEXT: .cfi_offset 31, -8 2406; MIPS64R5-N32-NEXT: .cfi_offset 28, -16 2407; MIPS64R5-N32-NEXT: .cfi_offset 16, -24 2408; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum))) 2409; MIPS64R5-N32-NEXT: addu $1, $1, $25 2410; MIPS64R5-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fminnum))) 2411; MIPS64R5-N32-NEXT: mov.s $f13, $f12 2412; MIPS64R5-N32-NEXT: lw $16, %got_disp(g)($gp) 2413; MIPS64R5-N32-NEXT: lh $1, 0($16) 2414; MIPS64R5-N32-NEXT: fill.h $w0, $1 2415; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0 2416; MIPS64R5-N32-NEXT: copy_s.w $1, $w0[0] 2417; MIPS64R5-N32-NEXT: lw $25, %call16(fminf)($gp) 2418; MIPS64R5-N32-NEXT: jalr $25 2419; MIPS64R5-N32-NEXT: mtc1 $1, $f12 2420; MIPS64R5-N32-NEXT: mfc1 $1, $f0 2421; MIPS64R5-N32-NEXT: fill.w $w0, $1 2422; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w0 2423; MIPS64R5-N32-NEXT: copy_u.h $1, $w0[0] 2424; MIPS64R5-N32-NEXT: sh $1, 0($16) 2425; MIPS64R5-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2426; MIPS64R5-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2427; MIPS64R5-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2428; MIPS64R5-N32-NEXT: jr $ra 2429; MIPS64R5-N32-NEXT: addiu $sp, $sp, 32 2430; 2431; MIPS64R5-N64-LABEL: fminnum: 2432; MIPS64R5-N64: # %bb.0: # %entry 2433; MIPS64R5-N64-NEXT: daddiu $sp, $sp, -32 2434; MIPS64R5-N64-NEXT: .cfi_def_cfa_offset 32 2435; MIPS64R5-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2436; MIPS64R5-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2437; MIPS64R5-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2438; MIPS64R5-N64-NEXT: .cfi_offset 31, -8 2439; MIPS64R5-N64-NEXT: .cfi_offset 28, -16 2440; MIPS64R5-N64-NEXT: .cfi_offset 16, -24 2441; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum))) 2442; MIPS64R5-N64-NEXT: daddu $1, $1, $25 2443; MIPS64R5-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fminnum))) 2444; MIPS64R5-N64-NEXT: mov.s $f13, $f12 2445; MIPS64R5-N64-NEXT: ld $16, %got_disp(g)($gp) 2446; MIPS64R5-N64-NEXT: lh $1, 0($16) 2447; MIPS64R5-N64-NEXT: fill.h $w0, $1 2448; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0 2449; MIPS64R5-N64-NEXT: copy_s.w $1, $w0[0] 2450; MIPS64R5-N64-NEXT: ld $25, %call16(fminf)($gp) 2451; MIPS64R5-N64-NEXT: jalr $25 2452; MIPS64R5-N64-NEXT: mtc1 $1, $f12 2453; MIPS64R5-N64-NEXT: mfc1 $1, $f0 2454; MIPS64R5-N64-NEXT: fill.w $w0, $1 2455; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w0 2456; MIPS64R5-N64-NEXT: copy_u.h $1, $w0[0] 2457; MIPS64R5-N64-NEXT: sh $1, 0($16) 2458; MIPS64R5-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2459; MIPS64R5-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2460; MIPS64R5-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2461; MIPS64R5-N64-NEXT: jr $ra 2462; MIPS64R5-N64-NEXT: daddiu $sp, $sp, 32 2463; 2464; MIPSR6-O32-LABEL: fminnum: 2465; MIPSR6-O32: # %bb.0: # %entry 2466; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp) 2467; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2468; MIPSR6-O32-NEXT: addu $1, $2, $25 2469; MIPSR6-O32-NEXT: min.s $f0, $f12, $f12 2470; MIPSR6-O32-NEXT: lw $1, %got(g)($1) 2471; MIPSR6-O32-NEXT: lh $2, 0($1) 2472; MIPSR6-O32-NEXT: fill.h $w1, $2 2473; MIPSR6-O32-NEXT: fexupr.w $w1, $w1 2474; MIPSR6-O32-NEXT: copy_s.w $2, $w1[0] 2475; MIPSR6-O32-NEXT: mtc1 $2, $f1 2476; MIPSR6-O32-NEXT: min.s $f0, $f1, $f0 2477; MIPSR6-O32-NEXT: mfc1 $2, $f0 2478; MIPSR6-O32-NEXT: fill.w $w0, $2 2479; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w0 2480; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0] 2481; MIPSR6-O32-NEXT: jr $ra 2482; MIPSR6-O32-NEXT: sh $2, 0($1) 2483; 2484; MIPSR6-N32-LABEL: fminnum: 2485; MIPSR6-N32: # %bb.0: # %entry 2486; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum))) 2487; MIPSR6-N32-NEXT: addu $1, $1, $25 2488; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fminnum))) 2489; MIPSR6-N32-NEXT: min.s $f0, $f12, $f12 2490; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1) 2491; MIPSR6-N32-NEXT: lh $2, 0($1) 2492; MIPSR6-N32-NEXT: fill.h $w1, $2 2493; MIPSR6-N32-NEXT: fexupr.w $w1, $w1 2494; MIPSR6-N32-NEXT: copy_s.w $2, $w1[0] 2495; MIPSR6-N32-NEXT: mtc1 $2, $f1 2496; MIPSR6-N32-NEXT: min.s $f0, $f1, $f0 2497; MIPSR6-N32-NEXT: mfc1 $2, $f0 2498; MIPSR6-N32-NEXT: fill.w $w0, $2 2499; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w0 2500; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0] 2501; MIPSR6-N32-NEXT: jr $ra 2502; MIPSR6-N32-NEXT: sh $2, 0($1) 2503; 2504; MIPSR6-N64-LABEL: fminnum: 2505; MIPSR6-N64: # %bb.0: # %entry 2506; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum))) 2507; MIPSR6-N64-NEXT: daddu $1, $1, $25 2508; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fminnum))) 2509; MIPSR6-N64-NEXT: min.s $f0, $f12, $f12 2510; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1) 2511; MIPSR6-N64-NEXT: lh $2, 0($1) 2512; MIPSR6-N64-NEXT: fill.h $w1, $2 2513; MIPSR6-N64-NEXT: fexupr.w $w1, $w1 2514; MIPSR6-N64-NEXT: copy_s.w $2, $w1[0] 2515; MIPSR6-N64-NEXT: mtc1 $2, $f1 2516; MIPSR6-N64-NEXT: min.s $f0, $f1, $f0 2517; MIPSR6-N64-NEXT: mfc1 $2, $f0 2518; MIPSR6-N64-NEXT: fill.w $w0, $2 2519; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w0 2520; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0] 2521; MIPSR6-N64-NEXT: jr $ra 2522; MIPSR6-N64-NEXT: sh $2, 0($1) 2523entry: 2524 %0 = load i16, ptr @g, align 2 2525 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2526 2527 2528 %minnum = call float @llvm.minnum.f32(float %1, float %b) 2529 %2 = call i16 @llvm.convert.to.fp16.f32(float %minnum) 2530 2531 2532 store i16 %2, ptr @g, align 2 2533 2534 ret void 2535} 2536 2537declare float @llvm.maxnum.f32(float %Val, float %b) 2538 2539define void @fmaxnum(float %b) { 2540; MIPS32-O32-LABEL: fmaxnum: 2541; MIPS32-O32: # %bb.0: # %entry 2542; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp) 2543; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2544; MIPS32-O32-NEXT: addiu $sp, $sp, -24 2545; MIPS32-O32-NEXT: .cfi_def_cfa_offset 24 2546; MIPS32-O32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 2547; MIPS32-O32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 2548; MIPS32-O32-NEXT: .cfi_offset 31, -4 2549; MIPS32-O32-NEXT: .cfi_offset 16, -8 2550; MIPS32-O32-NEXT: addu $gp, $2, $25 2551; MIPS32-O32-NEXT: mov.s $f14, $f12 2552; MIPS32-O32-NEXT: lw $16, %got(g)($gp) 2553; MIPS32-O32-NEXT: lh $1, 0($16) 2554; MIPS32-O32-NEXT: fill.h $w0, $1 2555; MIPS32-O32-NEXT: fexupr.w $w0, $w0 2556; MIPS32-O32-NEXT: copy_s.w $1, $w0[0] 2557; MIPS32-O32-NEXT: lw $25, %call16(fmaxf)($gp) 2558; MIPS32-O32-NEXT: jalr $25 2559; MIPS32-O32-NEXT: mtc1 $1, $f12 2560; MIPS32-O32-NEXT: mfc1 $1, $f0 2561; MIPS32-O32-NEXT: fill.w $w0, $1 2562; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w0 2563; MIPS32-O32-NEXT: copy_u.h $1, $w0[0] 2564; MIPS32-O32-NEXT: sh $1, 0($16) 2565; MIPS32-O32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 2566; MIPS32-O32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 2567; MIPS32-O32-NEXT: jr $ra 2568; MIPS32-O32-NEXT: addiu $sp, $sp, 24 2569; 2570; MIPS64R5-N32-LABEL: fmaxnum: 2571; MIPS64R5-N32: # %bb.0: # %entry 2572; MIPS64R5-N32-NEXT: addiu $sp, $sp, -32 2573; MIPS64R5-N32-NEXT: .cfi_def_cfa_offset 32 2574; MIPS64R5-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2575; MIPS64R5-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2576; MIPS64R5-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2577; MIPS64R5-N32-NEXT: .cfi_offset 31, -8 2578; MIPS64R5-N32-NEXT: .cfi_offset 28, -16 2579; MIPS64R5-N32-NEXT: .cfi_offset 16, -24 2580; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum))) 2581; MIPS64R5-N32-NEXT: addu $1, $1, $25 2582; MIPS64R5-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum))) 2583; MIPS64R5-N32-NEXT: mov.s $f13, $f12 2584; MIPS64R5-N32-NEXT: lw $16, %got_disp(g)($gp) 2585; MIPS64R5-N32-NEXT: lh $1, 0($16) 2586; MIPS64R5-N32-NEXT: fill.h $w0, $1 2587; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0 2588; MIPS64R5-N32-NEXT: copy_s.w $1, $w0[0] 2589; MIPS64R5-N32-NEXT: lw $25, %call16(fmaxf)($gp) 2590; MIPS64R5-N32-NEXT: jalr $25 2591; MIPS64R5-N32-NEXT: mtc1 $1, $f12 2592; MIPS64R5-N32-NEXT: mfc1 $1, $f0 2593; MIPS64R5-N32-NEXT: fill.w $w0, $1 2594; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w0 2595; MIPS64R5-N32-NEXT: copy_u.h $1, $w0[0] 2596; MIPS64R5-N32-NEXT: sh $1, 0($16) 2597; MIPS64R5-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2598; MIPS64R5-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2599; MIPS64R5-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2600; MIPS64R5-N32-NEXT: jr $ra 2601; MIPS64R5-N32-NEXT: addiu $sp, $sp, 32 2602; 2603; MIPS64R5-N64-LABEL: fmaxnum: 2604; MIPS64R5-N64: # %bb.0: # %entry 2605; MIPS64R5-N64-NEXT: daddiu $sp, $sp, -32 2606; MIPS64R5-N64-NEXT: .cfi_def_cfa_offset 32 2607; MIPS64R5-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2608; MIPS64R5-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2609; MIPS64R5-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2610; MIPS64R5-N64-NEXT: .cfi_offset 31, -8 2611; MIPS64R5-N64-NEXT: .cfi_offset 28, -16 2612; MIPS64R5-N64-NEXT: .cfi_offset 16, -24 2613; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum))) 2614; MIPS64R5-N64-NEXT: daddu $1, $1, $25 2615; MIPS64R5-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum))) 2616; MIPS64R5-N64-NEXT: mov.s $f13, $f12 2617; MIPS64R5-N64-NEXT: ld $16, %got_disp(g)($gp) 2618; MIPS64R5-N64-NEXT: lh $1, 0($16) 2619; MIPS64R5-N64-NEXT: fill.h $w0, $1 2620; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0 2621; MIPS64R5-N64-NEXT: copy_s.w $1, $w0[0] 2622; MIPS64R5-N64-NEXT: ld $25, %call16(fmaxf)($gp) 2623; MIPS64R5-N64-NEXT: jalr $25 2624; MIPS64R5-N64-NEXT: mtc1 $1, $f12 2625; MIPS64R5-N64-NEXT: mfc1 $1, $f0 2626; MIPS64R5-N64-NEXT: fill.w $w0, $1 2627; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w0 2628; MIPS64R5-N64-NEXT: copy_u.h $1, $w0[0] 2629; MIPS64R5-N64-NEXT: sh $1, 0($16) 2630; MIPS64R5-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2631; MIPS64R5-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2632; MIPS64R5-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2633; MIPS64R5-N64-NEXT: jr $ra 2634; MIPS64R5-N64-NEXT: daddiu $sp, $sp, 32 2635; 2636; MIPSR6-O32-LABEL: fmaxnum: 2637; MIPSR6-O32: # %bb.0: # %entry 2638; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp) 2639; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp) 2640; MIPSR6-O32-NEXT: addu $1, $2, $25 2641; MIPSR6-O32-NEXT: min.s $f0, $f12, $f12 2642; MIPSR6-O32-NEXT: lw $1, %got(g)($1) 2643; MIPSR6-O32-NEXT: lh $2, 0($1) 2644; MIPSR6-O32-NEXT: fill.h $w1, $2 2645; MIPSR6-O32-NEXT: fexupr.w $w1, $w1 2646; MIPSR6-O32-NEXT: copy_s.w $2, $w1[0] 2647; MIPSR6-O32-NEXT: mtc1 $2, $f1 2648; MIPSR6-O32-NEXT: max.s $f0, $f1, $f0 2649; MIPSR6-O32-NEXT: mfc1 $2, $f0 2650; MIPSR6-O32-NEXT: fill.w $w0, $2 2651; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w0 2652; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0] 2653; MIPSR6-O32-NEXT: jr $ra 2654; MIPSR6-O32-NEXT: sh $2, 0($1) 2655; 2656; MIPSR6-N32-LABEL: fmaxnum: 2657; MIPSR6-N32: # %bb.0: # %entry 2658; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum))) 2659; MIPSR6-N32-NEXT: addu $1, $1, $25 2660; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fmaxnum))) 2661; MIPSR6-N32-NEXT: min.s $f0, $f12, $f12 2662; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1) 2663; MIPSR6-N32-NEXT: lh $2, 0($1) 2664; MIPSR6-N32-NEXT: fill.h $w1, $2 2665; MIPSR6-N32-NEXT: fexupr.w $w1, $w1 2666; MIPSR6-N32-NEXT: copy_s.w $2, $w1[0] 2667; MIPSR6-N32-NEXT: mtc1 $2, $f1 2668; MIPSR6-N32-NEXT: max.s $f0, $f1, $f0 2669; MIPSR6-N32-NEXT: mfc1 $2, $f0 2670; MIPSR6-N32-NEXT: fill.w $w0, $2 2671; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w0 2672; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0] 2673; MIPSR6-N32-NEXT: jr $ra 2674; MIPSR6-N32-NEXT: sh $2, 0($1) 2675; 2676; MIPSR6-N64-LABEL: fmaxnum: 2677; MIPSR6-N64: # %bb.0: # %entry 2678; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum))) 2679; MIPSR6-N64-NEXT: daddu $1, $1, $25 2680; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fmaxnum))) 2681; MIPSR6-N64-NEXT: min.s $f0, $f12, $f12 2682; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1) 2683; MIPSR6-N64-NEXT: lh $2, 0($1) 2684; MIPSR6-N64-NEXT: fill.h $w1, $2 2685; MIPSR6-N64-NEXT: fexupr.w $w1, $w1 2686; MIPSR6-N64-NEXT: copy_s.w $2, $w1[0] 2687; MIPSR6-N64-NEXT: mtc1 $2, $f1 2688; MIPSR6-N64-NEXT: max.s $f0, $f1, $f0 2689; MIPSR6-N64-NEXT: mfc1 $2, $f0 2690; MIPSR6-N64-NEXT: fill.w $w0, $2 2691; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w0 2692; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0] 2693; MIPSR6-N64-NEXT: jr $ra 2694; MIPSR6-N64-NEXT: sh $2, 0($1) 2695entry: 2696 %0 = load i16, ptr @g, align 2 2697 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2698 2699 2700 %maxnum = call float @llvm.maxnum.f32(float %1, float %b) 2701 %2 = call i16 @llvm.convert.to.fp16.f32(float %maxnum) 2702 2703 2704 store i16 %2, ptr @g, align 2 2705 2706 ret void 2707} 2708 2709; This expansion of fcopysign could be done without converting f16 to float. 2710 2711declare float @llvm.copysign.f32(float %Val, float %b) 2712 2713define void @fcopysign(float %b) { 2714; MIPS32-LABEL: fcopysign: 2715; MIPS32: # %bb.0: # %entry 2716; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2717; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2718; MIPS32-NEXT: addu $1, $2, $25 2719; MIPS32-NEXT: lw $1, %got(g)($1) 2720; MIPS32-NEXT: lh $2, 0($1) 2721; MIPS32-NEXT: fill.h $w0, $2 2722; MIPS32-NEXT: fexupr.w $w0, $w0 2723; MIPS32-NEXT: copy_s.w $2, $w0[0] 2724; MIPS32-NEXT: mfc1 $3, $f12 2725; MIPS32-NEXT: ext $3, $3, 31, 1 2726; MIPS32-NEXT: ins $2, $3, 31, 1 2727; MIPS32-NEXT: fill.w $w0, $2 2728; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 2729; MIPS32-NEXT: copy_u.h $2, $w0[0] 2730; MIPS32-NEXT: jr $ra 2731; MIPS32-NEXT: sh $2, 0($1) 2732; 2733; MIPS64-N32-LABEL: fcopysign: 2734; MIPS64-N32: # %bb.0: # %entry 2735; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign))) 2736; MIPS64-N32-NEXT: addu $1, $1, $25 2737; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcopysign))) 2738; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1) 2739; MIPS64-N32-NEXT: lh $2, 0($1) 2740; MIPS64-N32-NEXT: fill.h $w0, $2 2741; MIPS64-N32-NEXT: fexupr.w $w0, $w0 2742; MIPS64-N32-NEXT: copy_s.w $2, $w0[0] 2743; MIPS64-N32-NEXT: mfc1 $3, $f12 2744; MIPS64-N32-NEXT: ext $3, $3, 31, 1 2745; MIPS64-N32-NEXT: ins $2, $3, 31, 1 2746; MIPS64-N32-NEXT: fill.w $w0, $2 2747; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 2748; MIPS64-N32-NEXT: copy_u.h $2, $w0[0] 2749; MIPS64-N32-NEXT: jr $ra 2750; MIPS64-N32-NEXT: sh $2, 0($1) 2751; 2752; MIPS64-N64-LABEL: fcopysign: 2753; MIPS64-N64: # %bb.0: # %entry 2754; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign))) 2755; MIPS64-N64-NEXT: daddu $1, $1, $25 2756; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcopysign))) 2757; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1) 2758; MIPS64-N64-NEXT: lh $2, 0($1) 2759; MIPS64-N64-NEXT: fill.h $w0, $2 2760; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2761; MIPS64-N64-NEXT: copy_s.w $2, $w0[0] 2762; MIPS64-N64-NEXT: mfc1 $3, $f12 2763; MIPS64-N64-NEXT: ext $3, $3, 31, 1 2764; MIPS64-N64-NEXT: ins $2, $3, 31, 1 2765; MIPS64-N64-NEXT: fill.w $w0, $2 2766; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2767; MIPS64-N64-NEXT: copy_u.h $2, $w0[0] 2768; MIPS64-N64-NEXT: jr $ra 2769; MIPS64-N64-NEXT: sh $2, 0($1) 2770entry: 2771 %0 = load i16, ptr @g, align 2 2772 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2773 2774 2775 %copysign = call float @llvm.copysign.f32(float %1, float %b) 2776 %2 = call i16 @llvm.convert.to.fp16.f32(float %copysign) 2777 2778 2779 store i16 %2, ptr @g, align 2 2780 2781 ret void 2782} 2783 2784declare float @llvm.floor.f32(float %Val) 2785 2786define void @ffloor() { 2787; MIPS32-LABEL: ffloor: 2788; MIPS32: # %bb.0: # %entry 2789; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2790; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2791; MIPS32-NEXT: addiu $sp, $sp, -24 2792; MIPS32-NEXT: .cfi_def_cfa_offset 24 2793; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 2794; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 2795; MIPS32-NEXT: .cfi_offset 31, -4 2796; MIPS32-NEXT: .cfi_offset 16, -8 2797; MIPS32-NEXT: addu $gp, $2, $25 2798; MIPS32-NEXT: lw $16, %got(g)($gp) 2799; MIPS32-NEXT: lh $1, 0($16) 2800; MIPS32-NEXT: fill.h $w0, $1 2801; MIPS32-NEXT: fexupr.w $w0, $w0 2802; MIPS32-NEXT: copy_s.w $1, $w0[0] 2803; MIPS32-NEXT: lw $25, %call16(floorf)($gp) 2804; MIPS32-NEXT: jalr $25 2805; MIPS32-NEXT: mtc1 $1, $f12 2806; MIPS32-NEXT: mfc1 $1, $f0 2807; MIPS32-NEXT: fill.w $w0, $1 2808; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 2809; MIPS32-NEXT: copy_u.h $1, $w0[0] 2810; MIPS32-NEXT: sh $1, 0($16) 2811; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 2812; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 2813; MIPS32-NEXT: jr $ra 2814; MIPS32-NEXT: addiu $sp, $sp, 24 2815; 2816; MIPS64-N32-LABEL: ffloor: 2817; MIPS64-N32: # %bb.0: # %entry 2818; MIPS64-N32-NEXT: addiu $sp, $sp, -32 2819; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 2820; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2821; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2822; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2823; MIPS64-N32-NEXT: .cfi_offset 31, -8 2824; MIPS64-N32-NEXT: .cfi_offset 28, -16 2825; MIPS64-N32-NEXT: .cfi_offset 16, -24 2826; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor))) 2827; MIPS64-N32-NEXT: addu $1, $1, $25 2828; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffloor))) 2829; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 2830; MIPS64-N32-NEXT: lh $1, 0($16) 2831; MIPS64-N32-NEXT: fill.h $w0, $1 2832; MIPS64-N32-NEXT: fexupr.w $w0, $w0 2833; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 2834; MIPS64-N32-NEXT: lw $25, %call16(floorf)($gp) 2835; MIPS64-N32-NEXT: jalr $25 2836; MIPS64-N32-NEXT: mtc1 $1, $f12 2837; MIPS64-N32-NEXT: mfc1 $1, $f0 2838; MIPS64-N32-NEXT: fill.w $w0, $1 2839; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 2840; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 2841; MIPS64-N32-NEXT: sh $1, 0($16) 2842; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2843; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2844; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2845; MIPS64-N32-NEXT: jr $ra 2846; MIPS64-N32-NEXT: addiu $sp, $sp, 32 2847; 2848; MIPS64-N64-LABEL: ffloor: 2849; MIPS64-N64: # %bb.0: # %entry 2850; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 2851; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 2852; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2853; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2854; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2855; MIPS64-N64-NEXT: .cfi_offset 31, -8 2856; MIPS64-N64-NEXT: .cfi_offset 28, -16 2857; MIPS64-N64-NEXT: .cfi_offset 16, -24 2858; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor))) 2859; MIPS64-N64-NEXT: daddu $1, $1, $25 2860; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffloor))) 2861; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 2862; MIPS64-N64-NEXT: lh $1, 0($16) 2863; MIPS64-N64-NEXT: fill.h $w0, $1 2864; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2865; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 2866; MIPS64-N64-NEXT: ld $25, %call16(floorf)($gp) 2867; MIPS64-N64-NEXT: jalr $25 2868; MIPS64-N64-NEXT: mtc1 $1, $f12 2869; MIPS64-N64-NEXT: mfc1 $1, $f0 2870; MIPS64-N64-NEXT: fill.w $w0, $1 2871; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2872; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 2873; MIPS64-N64-NEXT: sh $1, 0($16) 2874; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2875; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2876; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2877; MIPS64-N64-NEXT: jr $ra 2878; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 2879entry: 2880 %0 = load i16, ptr @g, align 2 2881 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2882 2883 2884 %floor = call float @llvm.floor.f32(float %1) 2885 %2 = call i16 @llvm.convert.to.fp16.f32(float %floor) 2886 2887 2888 store i16 %2, ptr @g, align 2 2889 2890 ret void 2891} 2892 2893declare float @llvm.ceil.f32(float %Val) 2894 2895define void @fceil() { 2896; MIPS32-LABEL: fceil: 2897; MIPS32: # %bb.0: # %entry 2898; MIPS32-NEXT: lui $2, %hi(_gp_disp) 2899; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 2900; MIPS32-NEXT: addiu $sp, $sp, -24 2901; MIPS32-NEXT: .cfi_def_cfa_offset 24 2902; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 2903; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 2904; MIPS32-NEXT: .cfi_offset 31, -4 2905; MIPS32-NEXT: .cfi_offset 16, -8 2906; MIPS32-NEXT: addu $gp, $2, $25 2907; MIPS32-NEXT: lw $16, %got(g)($gp) 2908; MIPS32-NEXT: lh $1, 0($16) 2909; MIPS32-NEXT: fill.h $w0, $1 2910; MIPS32-NEXT: fexupr.w $w0, $w0 2911; MIPS32-NEXT: copy_s.w $1, $w0[0] 2912; MIPS32-NEXT: lw $25, %call16(ceilf)($gp) 2913; MIPS32-NEXT: jalr $25 2914; MIPS32-NEXT: mtc1 $1, $f12 2915; MIPS32-NEXT: mfc1 $1, $f0 2916; MIPS32-NEXT: fill.w $w0, $1 2917; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 2918; MIPS32-NEXT: copy_u.h $1, $w0[0] 2919; MIPS32-NEXT: sh $1, 0($16) 2920; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 2921; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 2922; MIPS32-NEXT: jr $ra 2923; MIPS32-NEXT: addiu $sp, $sp, 24 2924; 2925; MIPS64-N32-LABEL: fceil: 2926; MIPS64-N32: # %bb.0: # %entry 2927; MIPS64-N32-NEXT: addiu $sp, $sp, -32 2928; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 2929; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2930; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2931; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2932; MIPS64-N32-NEXT: .cfi_offset 31, -8 2933; MIPS64-N32-NEXT: .cfi_offset 28, -16 2934; MIPS64-N32-NEXT: .cfi_offset 16, -24 2935; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fceil))) 2936; MIPS64-N32-NEXT: addu $1, $1, $25 2937; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fceil))) 2938; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 2939; MIPS64-N32-NEXT: lh $1, 0($16) 2940; MIPS64-N32-NEXT: fill.h $w0, $1 2941; MIPS64-N32-NEXT: fexupr.w $w0, $w0 2942; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 2943; MIPS64-N32-NEXT: lw $25, %call16(ceilf)($gp) 2944; MIPS64-N32-NEXT: jalr $25 2945; MIPS64-N32-NEXT: mtc1 $1, $f12 2946; MIPS64-N32-NEXT: mfc1 $1, $f0 2947; MIPS64-N32-NEXT: fill.w $w0, $1 2948; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 2949; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 2950; MIPS64-N32-NEXT: sh $1, 0($16) 2951; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2952; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2953; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2954; MIPS64-N32-NEXT: jr $ra 2955; MIPS64-N32-NEXT: addiu $sp, $sp, 32 2956; 2957; MIPS64-N64-LABEL: fceil: 2958; MIPS64-N64: # %bb.0: # %entry 2959; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 2960; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 2961; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 2962; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 2963; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 2964; MIPS64-N64-NEXT: .cfi_offset 31, -8 2965; MIPS64-N64-NEXT: .cfi_offset 28, -16 2966; MIPS64-N64-NEXT: .cfi_offset 16, -24 2967; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fceil))) 2968; MIPS64-N64-NEXT: daddu $1, $1, $25 2969; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fceil))) 2970; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 2971; MIPS64-N64-NEXT: lh $1, 0($16) 2972; MIPS64-N64-NEXT: fill.h $w0, $1 2973; MIPS64-N64-NEXT: fexupr.w $w0, $w0 2974; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 2975; MIPS64-N64-NEXT: ld $25, %call16(ceilf)($gp) 2976; MIPS64-N64-NEXT: jalr $25 2977; MIPS64-N64-NEXT: mtc1 $1, $f12 2978; MIPS64-N64-NEXT: mfc1 $1, $f0 2979; MIPS64-N64-NEXT: fill.w $w0, $1 2980; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 2981; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 2982; MIPS64-N64-NEXT: sh $1, 0($16) 2983; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 2984; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 2985; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 2986; MIPS64-N64-NEXT: jr $ra 2987; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 2988entry: 2989 %0 = load i16, ptr @g, align 2 2990 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 2991 2992 2993 %ceil = call float @llvm.ceil.f32(float %1) 2994 %2 = call i16 @llvm.convert.to.fp16.f32(float %ceil) 2995 2996 2997 store i16 %2, ptr @g, align 2 2998 2999 ret void 3000} 3001 3002declare float @llvm.trunc.f32(float %Val) 3003 3004define void @ftrunc() { 3005; MIPS32-LABEL: ftrunc: 3006; MIPS32: # %bb.0: # %entry 3007; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3008; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3009; MIPS32-NEXT: addiu $sp, $sp, -24 3010; MIPS32-NEXT: .cfi_def_cfa_offset 24 3011; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 3012; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 3013; MIPS32-NEXT: .cfi_offset 31, -4 3014; MIPS32-NEXT: .cfi_offset 16, -8 3015; MIPS32-NEXT: addu $gp, $2, $25 3016; MIPS32-NEXT: lw $16, %got(g)($gp) 3017; MIPS32-NEXT: lh $1, 0($16) 3018; MIPS32-NEXT: fill.h $w0, $1 3019; MIPS32-NEXT: fexupr.w $w0, $w0 3020; MIPS32-NEXT: copy_s.w $1, $w0[0] 3021; MIPS32-NEXT: lw $25, %call16(truncf)($gp) 3022; MIPS32-NEXT: jalr $25 3023; MIPS32-NEXT: mtc1 $1, $f12 3024; MIPS32-NEXT: mfc1 $1, $f0 3025; MIPS32-NEXT: fill.w $w0, $1 3026; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 3027; MIPS32-NEXT: copy_u.h $1, $w0[0] 3028; MIPS32-NEXT: sh $1, 0($16) 3029; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 3030; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 3031; MIPS32-NEXT: jr $ra 3032; MIPS32-NEXT: addiu $sp, $sp, 24 3033; 3034; MIPS64-N32-LABEL: ftrunc: 3035; MIPS64-N32: # %bb.0: # %entry 3036; MIPS64-N32-NEXT: addiu $sp, $sp, -32 3037; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 3038; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3039; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3040; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3041; MIPS64-N32-NEXT: .cfi_offset 31, -8 3042; MIPS64-N32-NEXT: .cfi_offset 28, -16 3043; MIPS64-N32-NEXT: .cfi_offset 16, -24 3044; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc))) 3045; MIPS64-N32-NEXT: addu $1, $1, $25 3046; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ftrunc))) 3047; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 3048; MIPS64-N32-NEXT: lh $1, 0($16) 3049; MIPS64-N32-NEXT: fill.h $w0, $1 3050; MIPS64-N32-NEXT: fexupr.w $w0, $w0 3051; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 3052; MIPS64-N32-NEXT: lw $25, %call16(truncf)($gp) 3053; MIPS64-N32-NEXT: jalr $25 3054; MIPS64-N32-NEXT: mtc1 $1, $f12 3055; MIPS64-N32-NEXT: mfc1 $1, $f0 3056; MIPS64-N32-NEXT: fill.w $w0, $1 3057; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 3058; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 3059; MIPS64-N32-NEXT: sh $1, 0($16) 3060; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3061; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3062; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3063; MIPS64-N32-NEXT: jr $ra 3064; MIPS64-N32-NEXT: addiu $sp, $sp, 32 3065; 3066; MIPS64-N64-LABEL: ftrunc: 3067; MIPS64-N64: # %bb.0: # %entry 3068; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 3069; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 3070; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3071; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3072; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3073; MIPS64-N64-NEXT: .cfi_offset 31, -8 3074; MIPS64-N64-NEXT: .cfi_offset 28, -16 3075; MIPS64-N64-NEXT: .cfi_offset 16, -24 3076; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc))) 3077; MIPS64-N64-NEXT: daddu $1, $1, $25 3078; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ftrunc))) 3079; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 3080; MIPS64-N64-NEXT: lh $1, 0($16) 3081; MIPS64-N64-NEXT: fill.h $w0, $1 3082; MIPS64-N64-NEXT: fexupr.w $w0, $w0 3083; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 3084; MIPS64-N64-NEXT: ld $25, %call16(truncf)($gp) 3085; MIPS64-N64-NEXT: jalr $25 3086; MIPS64-N64-NEXT: mtc1 $1, $f12 3087; MIPS64-N64-NEXT: mfc1 $1, $f0 3088; MIPS64-N64-NEXT: fill.w $w0, $1 3089; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 3090; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 3091; MIPS64-N64-NEXT: sh $1, 0($16) 3092; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3093; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3094; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3095; MIPS64-N64-NEXT: jr $ra 3096; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 3097entry: 3098 %0 = load i16, ptr @g, align 2 3099 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 3100 3101 3102 %trunc = call float @llvm.trunc.f32(float %1) 3103 %2 = call i16 @llvm.convert.to.fp16.f32(float %trunc) 3104 3105 3106 store i16 %2, ptr @g, align 2 3107 3108 ret void 3109} 3110 3111declare float @llvm.rint.f32(float %Val) 3112 3113define void @frint() { 3114; MIPS32-LABEL: frint: 3115; MIPS32: # %bb.0: # %entry 3116; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3117; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3118; MIPS32-NEXT: addiu $sp, $sp, -24 3119; MIPS32-NEXT: .cfi_def_cfa_offset 24 3120; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 3121; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 3122; MIPS32-NEXT: .cfi_offset 31, -4 3123; MIPS32-NEXT: .cfi_offset 16, -8 3124; MIPS32-NEXT: addu $gp, $2, $25 3125; MIPS32-NEXT: lw $16, %got(g)($gp) 3126; MIPS32-NEXT: lh $1, 0($16) 3127; MIPS32-NEXT: fill.h $w0, $1 3128; MIPS32-NEXT: fexupr.w $w0, $w0 3129; MIPS32-NEXT: copy_s.w $1, $w0[0] 3130; MIPS32-NEXT: lw $25, %call16(rintf)($gp) 3131; MIPS32-NEXT: jalr $25 3132; MIPS32-NEXT: mtc1 $1, $f12 3133; MIPS32-NEXT: mfc1 $1, $f0 3134; MIPS32-NEXT: fill.w $w0, $1 3135; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 3136; MIPS32-NEXT: copy_u.h $1, $w0[0] 3137; MIPS32-NEXT: sh $1, 0($16) 3138; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 3139; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 3140; MIPS32-NEXT: jr $ra 3141; MIPS32-NEXT: addiu $sp, $sp, 24 3142; 3143; MIPS64-N32-LABEL: frint: 3144; MIPS64-N32: # %bb.0: # %entry 3145; MIPS64-N32-NEXT: addiu $sp, $sp, -32 3146; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 3147; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3148; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3149; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3150; MIPS64-N32-NEXT: .cfi_offset 31, -8 3151; MIPS64-N32-NEXT: .cfi_offset 28, -16 3152; MIPS64-N32-NEXT: .cfi_offset 16, -24 3153; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frint))) 3154; MIPS64-N32-NEXT: addu $1, $1, $25 3155; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frint))) 3156; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 3157; MIPS64-N32-NEXT: lh $1, 0($16) 3158; MIPS64-N32-NEXT: fill.h $w0, $1 3159; MIPS64-N32-NEXT: fexupr.w $w0, $w0 3160; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 3161; MIPS64-N32-NEXT: lw $25, %call16(rintf)($gp) 3162; MIPS64-N32-NEXT: jalr $25 3163; MIPS64-N32-NEXT: mtc1 $1, $f12 3164; MIPS64-N32-NEXT: mfc1 $1, $f0 3165; MIPS64-N32-NEXT: fill.w $w0, $1 3166; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 3167; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 3168; MIPS64-N32-NEXT: sh $1, 0($16) 3169; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3170; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3171; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3172; MIPS64-N32-NEXT: jr $ra 3173; MIPS64-N32-NEXT: addiu $sp, $sp, 32 3174; 3175; MIPS64-N64-LABEL: frint: 3176; MIPS64-N64: # %bb.0: # %entry 3177; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 3178; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 3179; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3180; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3181; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3182; MIPS64-N64-NEXT: .cfi_offset 31, -8 3183; MIPS64-N64-NEXT: .cfi_offset 28, -16 3184; MIPS64-N64-NEXT: .cfi_offset 16, -24 3185; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frint))) 3186; MIPS64-N64-NEXT: daddu $1, $1, $25 3187; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frint))) 3188; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 3189; MIPS64-N64-NEXT: lh $1, 0($16) 3190; MIPS64-N64-NEXT: fill.h $w0, $1 3191; MIPS64-N64-NEXT: fexupr.w $w0, $w0 3192; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 3193; MIPS64-N64-NEXT: ld $25, %call16(rintf)($gp) 3194; MIPS64-N64-NEXT: jalr $25 3195; MIPS64-N64-NEXT: mtc1 $1, $f12 3196; MIPS64-N64-NEXT: mfc1 $1, $f0 3197; MIPS64-N64-NEXT: fill.w $w0, $1 3198; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 3199; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 3200; MIPS64-N64-NEXT: sh $1, 0($16) 3201; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3202; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3203; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3204; MIPS64-N64-NEXT: jr $ra 3205; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 3206entry: 3207 %0 = load i16, ptr @g, align 2 3208 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 3209 3210 %rint = call float @llvm.rint.f32(float %1) 3211 %2 = call i16 @llvm.convert.to.fp16.f32(float %rint) 3212 3213 store i16 %2, ptr @g, align 2 3214 3215 ret void 3216} 3217 3218declare float @llvm.nearbyint.f32(float %Val) 3219 3220define void @fnearbyint() { 3221; MIPS32-LABEL: fnearbyint: 3222; MIPS32: # %bb.0: # %entry 3223; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3224; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3225; MIPS32-NEXT: addiu $sp, $sp, -24 3226; MIPS32-NEXT: .cfi_def_cfa_offset 24 3227; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 3228; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 3229; MIPS32-NEXT: .cfi_offset 31, -4 3230; MIPS32-NEXT: .cfi_offset 16, -8 3231; MIPS32-NEXT: addu $gp, $2, $25 3232; MIPS32-NEXT: lw $16, %got(g)($gp) 3233; MIPS32-NEXT: lh $1, 0($16) 3234; MIPS32-NEXT: fill.h $w0, $1 3235; MIPS32-NEXT: fexupr.w $w0, $w0 3236; MIPS32-NEXT: copy_s.w $1, $w0[0] 3237; MIPS32-NEXT: lw $25, %call16(nearbyintf)($gp) 3238; MIPS32-NEXT: jalr $25 3239; MIPS32-NEXT: mtc1 $1, $f12 3240; MIPS32-NEXT: mfc1 $1, $f0 3241; MIPS32-NEXT: fill.w $w0, $1 3242; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 3243; MIPS32-NEXT: copy_u.h $1, $w0[0] 3244; MIPS32-NEXT: sh $1, 0($16) 3245; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 3246; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 3247; MIPS32-NEXT: jr $ra 3248; MIPS32-NEXT: addiu $sp, $sp, 24 3249; 3250; MIPS64-N32-LABEL: fnearbyint: 3251; MIPS64-N32: # %bb.0: # %entry 3252; MIPS64-N32-NEXT: addiu $sp, $sp, -32 3253; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 3254; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3255; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3256; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3257; MIPS64-N32-NEXT: .cfi_offset 31, -8 3258; MIPS64-N32-NEXT: .cfi_offset 28, -16 3259; MIPS64-N32-NEXT: .cfi_offset 16, -24 3260; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint))) 3261; MIPS64-N32-NEXT: addu $1, $1, $25 3262; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint))) 3263; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 3264; MIPS64-N32-NEXT: lh $1, 0($16) 3265; MIPS64-N32-NEXT: fill.h $w0, $1 3266; MIPS64-N32-NEXT: fexupr.w $w0, $w0 3267; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 3268; MIPS64-N32-NEXT: lw $25, %call16(nearbyintf)($gp) 3269; MIPS64-N32-NEXT: jalr $25 3270; MIPS64-N32-NEXT: mtc1 $1, $f12 3271; MIPS64-N32-NEXT: mfc1 $1, $f0 3272; MIPS64-N32-NEXT: fill.w $w0, $1 3273; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 3274; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 3275; MIPS64-N32-NEXT: sh $1, 0($16) 3276; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3277; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3278; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3279; MIPS64-N32-NEXT: jr $ra 3280; MIPS64-N32-NEXT: addiu $sp, $sp, 32 3281; 3282; MIPS64-N64-LABEL: fnearbyint: 3283; MIPS64-N64: # %bb.0: # %entry 3284; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 3285; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 3286; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3287; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3288; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3289; MIPS64-N64-NEXT: .cfi_offset 31, -8 3290; MIPS64-N64-NEXT: .cfi_offset 28, -16 3291; MIPS64-N64-NEXT: .cfi_offset 16, -24 3292; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint))) 3293; MIPS64-N64-NEXT: daddu $1, $1, $25 3294; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint))) 3295; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 3296; MIPS64-N64-NEXT: lh $1, 0($16) 3297; MIPS64-N64-NEXT: fill.h $w0, $1 3298; MIPS64-N64-NEXT: fexupr.w $w0, $w0 3299; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 3300; MIPS64-N64-NEXT: ld $25, %call16(nearbyintf)($gp) 3301; MIPS64-N64-NEXT: jalr $25 3302; MIPS64-N64-NEXT: mtc1 $1, $f12 3303; MIPS64-N64-NEXT: mfc1 $1, $f0 3304; MIPS64-N64-NEXT: fill.w $w0, $1 3305; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 3306; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 3307; MIPS64-N64-NEXT: sh $1, 0($16) 3308; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3309; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3310; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3311; MIPS64-N64-NEXT: jr $ra 3312; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 3313entry: 3314 %0 = load i16, ptr @g, align 2 3315 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 3316 3317 3318 %nearbyint = call float @llvm.nearbyint.f32(float %1) 3319 %2 = call i16 @llvm.convert.to.fp16.f32(float %nearbyint) 3320 3321 3322 store i16 %2, ptr @g, align 2 3323 3324 ret void 3325} 3326 3327declare float @llvm.round.f32(float %Val) 3328 3329define void @fround() { 3330; MIPS32-LABEL: fround: 3331; MIPS32: # %bb.0: # %entry 3332; MIPS32-NEXT: lui $2, %hi(_gp_disp) 3333; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp) 3334; MIPS32-NEXT: addiu $sp, $sp, -24 3335; MIPS32-NEXT: .cfi_def_cfa_offset 24 3336; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 3337; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 3338; MIPS32-NEXT: .cfi_offset 31, -4 3339; MIPS32-NEXT: .cfi_offset 16, -8 3340; MIPS32-NEXT: addu $gp, $2, $25 3341; MIPS32-NEXT: lw $16, %got(g)($gp) 3342; MIPS32-NEXT: lh $1, 0($16) 3343; MIPS32-NEXT: fill.h $w0, $1 3344; MIPS32-NEXT: fexupr.w $w0, $w0 3345; MIPS32-NEXT: copy_s.w $1, $w0[0] 3346; MIPS32-NEXT: lw $25, %call16(roundf)($gp) 3347; MIPS32-NEXT: jalr $25 3348; MIPS32-NEXT: mtc1 $1, $f12 3349; MIPS32-NEXT: mfc1 $1, $f0 3350; MIPS32-NEXT: fill.w $w0, $1 3351; MIPS32-NEXT: fexdo.h $w0, $w0, $w0 3352; MIPS32-NEXT: copy_u.h $1, $w0[0] 3353; MIPS32-NEXT: sh $1, 0($16) 3354; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 3355; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 3356; MIPS32-NEXT: jr $ra 3357; MIPS32-NEXT: addiu $sp, $sp, 24 3358; 3359; MIPS64-N32-LABEL: fround: 3360; MIPS64-N32: # %bb.0: # %entry 3361; MIPS64-N32-NEXT: addiu $sp, $sp, -32 3362; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32 3363; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3364; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3365; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3366; MIPS64-N32-NEXT: .cfi_offset 31, -8 3367; MIPS64-N32-NEXT: .cfi_offset 28, -16 3368; MIPS64-N32-NEXT: .cfi_offset 16, -24 3369; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fround))) 3370; MIPS64-N32-NEXT: addu $1, $1, $25 3371; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fround))) 3372; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp) 3373; MIPS64-N32-NEXT: lh $1, 0($16) 3374; MIPS64-N32-NEXT: fill.h $w0, $1 3375; MIPS64-N32-NEXT: fexupr.w $w0, $w0 3376; MIPS64-N32-NEXT: copy_s.w $1, $w0[0] 3377; MIPS64-N32-NEXT: lw $25, %call16(roundf)($gp) 3378; MIPS64-N32-NEXT: jalr $25 3379; MIPS64-N32-NEXT: mtc1 $1, $f12 3380; MIPS64-N32-NEXT: mfc1 $1, $f0 3381; MIPS64-N32-NEXT: fill.w $w0, $1 3382; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0 3383; MIPS64-N32-NEXT: copy_u.h $1, $w0[0] 3384; MIPS64-N32-NEXT: sh $1, 0($16) 3385; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3386; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3387; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3388; MIPS64-N32-NEXT: jr $ra 3389; MIPS64-N32-NEXT: addiu $sp, $sp, 32 3390; 3391; MIPS64-N64-LABEL: fround: 3392; MIPS64-N64: # %bb.0: # %entry 3393; MIPS64-N64-NEXT: daddiu $sp, $sp, -32 3394; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32 3395; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 3396; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 3397; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 3398; MIPS64-N64-NEXT: .cfi_offset 31, -8 3399; MIPS64-N64-NEXT: .cfi_offset 28, -16 3400; MIPS64-N64-NEXT: .cfi_offset 16, -24 3401; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fround))) 3402; MIPS64-N64-NEXT: daddu $1, $1, $25 3403; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fround))) 3404; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp) 3405; MIPS64-N64-NEXT: lh $1, 0($16) 3406; MIPS64-N64-NEXT: fill.h $w0, $1 3407; MIPS64-N64-NEXT: fexupr.w $w0, $w0 3408; MIPS64-N64-NEXT: copy_s.w $1, $w0[0] 3409; MIPS64-N64-NEXT: ld $25, %call16(roundf)($gp) 3410; MIPS64-N64-NEXT: jalr $25 3411; MIPS64-N64-NEXT: mtc1 $1, $f12 3412; MIPS64-N64-NEXT: mfc1 $1, $f0 3413; MIPS64-N64-NEXT: fill.w $w0, $1 3414; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0 3415; MIPS64-N64-NEXT: copy_u.h $1, $w0[0] 3416; MIPS64-N64-NEXT: sh $1, 0($16) 3417; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 3418; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 3419; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 3420; MIPS64-N64-NEXT: jr $ra 3421; MIPS64-N64-NEXT: daddiu $sp, $sp, 32 3422entry: 3423 %0 = load i16, ptr @g, align 2 3424 %1 = call float @llvm.convert.from.fp16.f32(i16 %0) 3425 3426 3427 %round = call float @llvm.round.f32(float %1) 3428 %2 = call i16 @llvm.convert.to.fp16.f32(float %round) 3429 3430 3431 store i16 %2, ptr @g, align 2 3432 3433 ret void 3434} 3435