3475 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; 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-O325; 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-N328; 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-N6411 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-O3215; 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-N3218; 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-N6421 22 23; Check the use of frame indexes in the msa pseudo f16 instructions.24 25@k = external global float26 27declare float @k2(ptr)28 29define void @f3(i16 %b) {30; MIPS32-LABEL: f3:31; MIPS32: # %bb.0: # %entry32; MIPS32-NEXT: lui $2, %hi(_gp_disp)33; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)34; MIPS32-NEXT: addiu $sp, $sp, -3235; MIPS32-NEXT: .cfi_def_cfa_offset 3236; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill37; MIPS32-NEXT: sw $16, 24($sp) # 4-byte Folded Spill38; MIPS32-NEXT: .cfi_offset 31, -439; MIPS32-NEXT: .cfi_offset 16, -840; MIPS32-NEXT: addu $16, $2, $2541; MIPS32-NEXT: sh $4, 22($sp)42; MIPS32-NEXT: addiu $4, $sp, 2243; MIPS32-NEXT: lw $25, %call16(k2)($16)44; MIPS32-NEXT: jalr $2545; MIPS32-NEXT: move $gp, $1646; MIPS32-NEXT: lw $1, %got(k)($16)47; MIPS32-NEXT: swc1 $f0, 0($1)48; MIPS32-NEXT: lw $16, 24($sp) # 4-byte Folded Reload49; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload50; MIPS32-NEXT: jr $ra51; MIPS32-NEXT: addiu $sp, $sp, 3252;53; MIPS64-N32-LABEL: f3:54; MIPS64-N32: # %bb.0: # %entry55; MIPS64-N32-NEXT: addiu $sp, $sp, -3256; MIPS64-N32-NEXT: .cfi_def_cfa_offset 3257; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill58; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill59; MIPS64-N32-NEXT: .cfi_offset 31, -860; MIPS64-N32-NEXT: .cfi_offset 28, -1661; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f3)))62; MIPS64-N32-NEXT: addu $1, $1, $2563; 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 $2567; MIPS64-N32-NEXT: addiu $4, $sp, 1468; 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 Reload71; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload72; MIPS64-N32-NEXT: jr $ra73; MIPS64-N32-NEXT: addiu $sp, $sp, 3274;75; MIPS64-N64-LABEL: f3:76; MIPS64-N64: # %bb.0: # %entry77; MIPS64-N64-NEXT: daddiu $sp, $sp, -3278; MIPS64-N64-NEXT: .cfi_def_cfa_offset 3279; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill80; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill81; MIPS64-N64-NEXT: .cfi_offset 31, -882; MIPS64-N64-NEXT: .cfi_offset 28, -1683; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f3)))84; MIPS64-N64-NEXT: daddu $1, $1, $2585; 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 $2589; MIPS64-N64-NEXT: daddiu $4, $sp, 1490; 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 Reload93; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload94; MIPS64-N64-NEXT: jr $ra95; MIPS64-N64-NEXT: daddiu $sp, $sp, 3296entry:97 %0 = alloca half98 %1 = bitcast i16 %b to half99 store half %1, ptr %0100 %2 = call float @k2(ptr %0)101 store float %2, ptr @k102 ret void103}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, -8111; MIPS32-NEXT: .cfi_def_cfa_offset 8112; MIPS32-NEXT: addu $1, $2, $25113; MIPS32-NEXT: sh $4, 4($sp)114; MIPS32-NEXT: lh $2, 4($sp)115; MIPS32-NEXT: fill.h $w0, $2116; MIPS32-NEXT: fexupr.w $w0, $w0117; MIPS32-NEXT: copy_s.w $2, $w0[0]118; MIPS32-NEXT: mtc1 $2, $f0119; MIPS32-NEXT: lw $1, %got(k)($1)120; MIPS32-NEXT: swc1 $f0, 0($1)121; MIPS32-NEXT: jr $ra122; MIPS32-NEXT: addiu $sp, $sp, 8123;124; MIPS64-N32-LABEL: f:125; MIPS64-N32: # %bb.0:126; MIPS64-N32-NEXT: addiu $sp, $sp, -16127; MIPS64-N32-NEXT: .cfi_def_cfa_offset 16128; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f)))129; MIPS64-N32-NEXT: addu $1, $1, $25130; 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, $2134; MIPS64-N32-NEXT: fexupr.w $w0, $w0135; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]136; MIPS64-N32-NEXT: mtc1 $2, $f0137; MIPS64-N32-NEXT: lw $1, %got_disp(k)($1)138; MIPS64-N32-NEXT: swc1 $f0, 0($1)139; MIPS64-N32-NEXT: jr $ra140; MIPS64-N32-NEXT: addiu $sp, $sp, 16141;142; MIPS64-N64-LABEL: f:143; MIPS64-N64: # %bb.0:144; MIPS64-N64-NEXT: daddiu $sp, $sp, -16145; MIPS64-N64-NEXT: .cfi_def_cfa_offset 16146; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f)))147; MIPS64-N64-NEXT: daddu $1, $1, $25148; 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, $2152; MIPS64-N64-NEXT: fexupr.w $w0, $w0153; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]154; MIPS64-N64-NEXT: mtc1 $2, $f0155; MIPS64-N64-NEXT: ld $1, %got_disp(k)($1)156; MIPS64-N64-NEXT: swc1 $f0, 0($1)157; MIPS64-N64-NEXT: jr $ra158; MIPS64-N64-NEXT: daddiu $sp, $sp, 16159 %1 = bitcast i16 %b to half160 %2 = fpext half %1 to float161 store float %2, ptr @k162 ret void163}164 165@g = external global i16, align 2166@h = external global half, align 2167 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 requires173; 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: # %entry178; MIPS32-NEXT: lui $2, %hi(_gp_disp)179; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)180; MIPS32-NEXT: addu $1, $2, $25181; MIPS32-NEXT: lw $1, %got(h)($1)182; MIPS32-NEXT: lh $2, 0($1)183; MIPS32-NEXT: fill.h $w0, $2184; MIPS32-NEXT: fexupr.w $w0, $w0185; MIPS32-NEXT: fexupr.d $w0, $w0186; MIPS32-NEXT: copy_s.w $2, $w0[0]187; MIPS32-NEXT: mtc1 $2, $f1188; MIPS32-NEXT: copy_s.w $2, $w0[1]189; MIPS32-NEXT: mthc1 $2, $f1190; MIPS32-NEXT: add.d $f0, $f1, $f1191; MIPS32-NEXT: mfc1 $2, $f0192; MIPS32-NEXT: fill.w $w1, $2193; MIPS32-NEXT: mfhc1 $2, $f0194; MIPS32-NEXT: insert.w $w1[1], $2195; MIPS32-NEXT: insert.w $w1[3], $2196; MIPS32-NEXT: fexdo.w $w0, $w1, $w1197; MIPS32-NEXT: fexdo.h $w0, $w0, $w0198; MIPS32-NEXT: copy_u.h $2, $w0[0]199; MIPS32-NEXT: jr $ra200; MIPS32-NEXT: sh $2, 0($1)201;202; MIPS64-N32-LABEL: fadd_f64:203; MIPS64-N32: # %bb.0: # %entry204; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64)))205; MIPS64-N32-NEXT: addu $1, $1, $25206; 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, $2210; MIPS64-N32-NEXT: fexupr.w $w0, $w0211; MIPS64-N32-NEXT: fexupr.d $w0, $w0212; MIPS64-N32-NEXT: copy_s.d $2, $w0[0]213; MIPS64-N32-NEXT: dmtc1 $2, $f0214; MIPS64-N32-NEXT: add.d $f0, $f0, $f0215; MIPS64-N32-NEXT: dmfc1 $2, $f0216; MIPS64-N32-NEXT: fill.d $w0, $2217; MIPS64-N32-NEXT: fexdo.w $w0, $w0, $w0218; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0219; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]220; MIPS64-N32-NEXT: jr $ra221; MIPS64-N32-NEXT: sh $2, 0($1)222;223; MIPS64-N64-LABEL: fadd_f64:224; MIPS64-N64: # %bb.0: # %entry225; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64)))226; MIPS64-N64-NEXT: daddu $1, $1, $25227; 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, $2231; MIPS64-N64-NEXT: fexupr.w $w0, $w0232; MIPS64-N64-NEXT: fexupr.d $w0, $w0233; MIPS64-N64-NEXT: copy_s.d $2, $w0[0]234; MIPS64-N64-NEXT: dmtc1 $2, $f0235; MIPS64-N64-NEXT: add.d $f0, $f0, $f0236; MIPS64-N64-NEXT: dmfc1 $2, $f0237; MIPS64-N64-NEXT: fill.d $w0, $2238; MIPS64-N64-NEXT: fexdo.w $w0, $w0, $w0239; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0240; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]241; MIPS64-N64-NEXT: jr $ra242; MIPS64-N64-NEXT: sh $2, 0($1)243entry:244 %0 = load half, ptr @h, align 2245 %1 = fpext half %0 to double246 %2 = load half, ptr @h, align 2247 %3 = fpext half %2 to double248 %add = fadd double %1, %3249 %4 = fptrunc double %add to half250 store half %4, ptr @h, align 2251 ret void252}253 254; Entire fp16 (unsigned) range fits into (signed) i32.255define i32 @ffptoui() {256; MIPS32-LABEL: ffptoui:257; MIPS32: # %bb.0: # %entry258; MIPS32-NEXT: lui $2, %hi(_gp_disp)259; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)260; MIPS32-NEXT: addu $1, $2, $25261; MIPS32-NEXT: lw $1, %got(h)($1)262; MIPS32-NEXT: lh $1, 0($1)263; MIPS32-NEXT: fill.h $w0, $1264; MIPS32-NEXT: fexupr.w $w0, $w0265; MIPS32-NEXT: fexupr.d $w0, $w0266; MIPS32-NEXT: copy_s.w $1, $w0[0]267; MIPS32-NEXT: mtc1 $1, $f1268; MIPS32-NEXT: copy_s.w $1, $w0[1]269; MIPS32-NEXT: mthc1 $1, $f1270; MIPS32-NEXT: trunc.w.d $f0, $f1271; MIPS32-NEXT: jr $ra272; MIPS32-NEXT: mfc1 $2, $f0273;274; MIPS64-N32-LABEL: ffptoui:275; MIPS64-N32: # %bb.0: # %entry276; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui)))277; MIPS64-N32-NEXT: addu $1, $1, $25278; 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, $1282; MIPS64-N32-NEXT: fexupr.w $w0, $w0283; MIPS64-N32-NEXT: fexupr.d $w0, $w0284; MIPS64-N32-NEXT: copy_s.d $1, $w0[0]285; MIPS64-N32-NEXT: dmtc1 $1, $f0286; MIPS64-N32-NEXT: trunc.w.d $f0, $f0287; MIPS64-N32-NEXT: jr $ra288; MIPS64-N32-NEXT: mfc1 $2, $f0289;290; MIPS64-N64-LABEL: ffptoui:291; MIPS64-N64: # %bb.0: # %entry292; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui)))293; MIPS64-N64-NEXT: daddu $1, $1, $25294; 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, $1298; MIPS64-N64-NEXT: fexupr.w $w0, $w0299; MIPS64-N64-NEXT: fexupr.d $w0, $w0300; MIPS64-N64-NEXT: copy_s.d $1, $w0[0]301; MIPS64-N64-NEXT: dmtc1 $1, $f0302; MIPS64-N64-NEXT: trunc.w.d $f0, $f0303; MIPS64-N64-NEXT: jr $ra304; MIPS64-N64-NEXT: mfc1 $2, $f0305entry:306 %0 = load half, ptr @h, align 2307 %1 = fptoui half %0 to i32308 ret i32 %1309}310 311define i32 @ffptosi() {312; MIPS32-LABEL: ffptosi:313; MIPS32: # %bb.0: # %entry314; MIPS32-NEXT: lui $2, %hi(_gp_disp)315; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)316; MIPS32-NEXT: addu $1, $2, $25317; MIPS32-NEXT: lw $1, %got(h)($1)318; MIPS32-NEXT: lh $1, 0($1)319; MIPS32-NEXT: fill.h $w0, $1320; MIPS32-NEXT: fexupr.w $w0, $w0321; MIPS32-NEXT: fexupr.d $w0, $w0322; MIPS32-NEXT: copy_s.w $1, $w0[0]323; MIPS32-NEXT: mtc1 $1, $f1324; MIPS32-NEXT: copy_s.w $1, $w0[1]325; MIPS32-NEXT: mthc1 $1, $f1326; MIPS32-NEXT: trunc.w.d $f0, $f1327; MIPS32-NEXT: jr $ra328; MIPS32-NEXT: mfc1 $2, $f0329;330; MIPS64-N32-LABEL: ffptosi:331; MIPS64-N32: # %bb.0: # %entry332; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi)))333; MIPS64-N32-NEXT: addu $1, $1, $25334; 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, $1338; MIPS64-N32-NEXT: fexupr.w $w0, $w0339; MIPS64-N32-NEXT: fexupr.d $w0, $w0340; MIPS64-N32-NEXT: copy_s.d $1, $w0[0]341; MIPS64-N32-NEXT: dmtc1 $1, $f0342; MIPS64-N32-NEXT: trunc.w.d $f0, $f0343; MIPS64-N32-NEXT: jr $ra344; MIPS64-N32-NEXT: mfc1 $2, $f0345;346; MIPS64-N64-LABEL: ffptosi:347; MIPS64-N64: # %bb.0: # %entry348; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi)))349; MIPS64-N64-NEXT: daddu $1, $1, $25350; 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, $1354; MIPS64-N64-NEXT: fexupr.w $w0, $w0355; MIPS64-N64-NEXT: fexupr.d $w0, $w0356; MIPS64-N64-NEXT: copy_s.d $1, $w0[0]357; MIPS64-N64-NEXT: dmtc1 $1, $f0358; MIPS64-N64-NEXT: trunc.w.d $f0, $f0359; MIPS64-N64-NEXT: jr $ra360; MIPS64-N64-NEXT: mfc1 $2, $f0361entry:362 %0 = load half, ptr @h, align 2363 %1 = fptosi half %0 to i32364 ret i32 %1365 366 367 368 369}370 371define void @uitofp(i32 %a) {372; MIPS32-LABEL: uitofp:373; MIPS32: # %bb.0: # %entry374; MIPS32-NEXT: lui $2, %hi(_gp_disp)375; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)376; MIPS32-NEXT: addiu $sp, $sp, -8377; MIPS32-NEXT: .cfi_def_cfa_offset 8378; MIPS32-NEXT: addu $1, $2, $25379; MIPS32-NEXT: lui $2, 17200380; 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, $f0386; MIPS32-NEXT: mfc1 $2, $f0387; MIPS32-NEXT: fill.w $w1, $2388; MIPS32-NEXT: mfhc1 $2, $f0389; MIPS32-NEXT: insert.w $w1[1], $2390; MIPS32-NEXT: insert.w $w1[3], $2391; MIPS32-NEXT: fexdo.w $w0, $w1, $w1392; MIPS32-NEXT: fexdo.h $w0, $w0, $w0393; 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 $ra397; MIPS32-NEXT: addiu $sp, $sp, 8398;399; MIPS64R5-N32-LABEL: uitofp:400; MIPS64R5-N32: # %bb.0: # %entry401; MIPS64R5-N32-NEXT: addiu $sp, $sp, -16402; MIPS64R5-N32-NEXT: .cfi_def_cfa_offset 16403; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))404; MIPS64R5-N32-NEXT: addu $1, $1, $25405; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(uitofp)))406; MIPS64R5-N32-NEXT: lui $2, 17200407; MIPS64R5-N32-NEXT: sw $2, 12($sp)408; MIPS64R5-N32-NEXT: sll $2, $4, 0409; MIPS64R5-N32-NEXT: sw $2, 8($sp)410; MIPS64R5-N32-NEXT: lw $2, %got_page(.LCPI5_0)($1)411; MIPS64R5-N32-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)412; MIPS64R5-N32-NEXT: ldc1 $f1, 8($sp)413; MIPS64R5-N32-NEXT: sub.d $f0, $f1, $f0414; MIPS64R5-N32-NEXT: dmfc1 $2, $f0415; MIPS64R5-N32-NEXT: fill.d $w0, $2416; MIPS64R5-N32-NEXT: fexdo.w $w0, $w0, $w0417; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w0418; MIPS64R5-N32-NEXT: lw $1, %got_disp(h)($1)419; MIPS64R5-N32-NEXT: copy_u.h $2, $w0[0]420; MIPS64R5-N32-NEXT: sh $2, 0($1)421; MIPS64R5-N32-NEXT: jr $ra422; MIPS64R5-N32-NEXT: addiu $sp, $sp, 16423;424; MIPS64R5-N64-LABEL: uitofp:425; MIPS64R5-N64: # %bb.0: # %entry426; MIPS64R5-N64-NEXT: daddiu $sp, $sp, -16427; MIPS64R5-N64-NEXT: .cfi_def_cfa_offset 16428; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))429; MIPS64R5-N64-NEXT: daddu $1, $1, $25430; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(uitofp)))431; MIPS64R5-N64-NEXT: lui $2, 17200432; MIPS64R5-N64-NEXT: sw $2, 12($sp)433; MIPS64R5-N64-NEXT: sll $2, $4, 0434; MIPS64R5-N64-NEXT: sw $2, 8($sp)435; MIPS64R5-N64-NEXT: ld $2, %got_page(.LCPI5_0)($1)436; MIPS64R5-N64-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)437; MIPS64R5-N64-NEXT: ldc1 $f1, 8($sp)438; MIPS64R5-N64-NEXT: sub.d $f0, $f1, $f0439; MIPS64R5-N64-NEXT: dmfc1 $2, $f0440; MIPS64R5-N64-NEXT: fill.d $w0, $2441; MIPS64R5-N64-NEXT: fexdo.w $w0, $w0, $w0442; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w0443; MIPS64R5-N64-NEXT: ld $1, %got_disp(h)($1)444; MIPS64R5-N64-NEXT: copy_u.h $2, $w0[0]445; MIPS64R5-N64-NEXT: sh $2, 0($1)446; MIPS64R5-N64-NEXT: jr $ra447; MIPS64R5-N64-NEXT: daddiu $sp, $sp, 16448;449; MIPSR6-N32-LABEL: uitofp:450; MIPSR6-N32: # %bb.0: # %entry451; MIPSR6-N32-NEXT: addiu $sp, $sp, -16452; MIPSR6-N32-NEXT: .cfi_def_cfa_offset 16453; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))454; MIPSR6-N32-NEXT: addu $1, $1, $25455; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(uitofp)))456; MIPSR6-N32-NEXT: lui $2, 17200457; MIPSR6-N32-NEXT: sw $2, 12($sp)458; MIPSR6-N32-NEXT: sw $4, 8($sp)459; MIPSR6-N32-NEXT: lw $2, %got_page(.LCPI5_0)($1)460; MIPSR6-N32-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)461; MIPSR6-N32-NEXT: ldc1 $f1, 8($sp)462; MIPSR6-N32-NEXT: sub.d $f0, $f1, $f0463; MIPSR6-N32-NEXT: dmfc1 $2, $f0464; MIPSR6-N32-NEXT: fill.d $w0, $2465; MIPSR6-N32-NEXT: fexdo.w $w0, $w0, $w0466; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w0467; MIPSR6-N32-NEXT: lw $1, %got_disp(h)($1)468; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0]469; MIPSR6-N32-NEXT: sh $2, 0($1)470; MIPSR6-N32-NEXT: jr $ra471; MIPSR6-N32-NEXT: addiu $sp, $sp, 16472;473; MIPSR6-N64-LABEL: uitofp:474; MIPSR6-N64: # %bb.0: # %entry475; MIPSR6-N64-NEXT: daddiu $sp, $sp, -16476; MIPSR6-N64-NEXT: .cfi_def_cfa_offset 16477; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))478; MIPSR6-N64-NEXT: daddu $1, $1, $25479; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(uitofp)))480; MIPSR6-N64-NEXT: lui $2, 17200481; MIPSR6-N64-NEXT: sw $2, 12($sp)482; MIPSR6-N64-NEXT: sw $4, 8($sp)483; MIPSR6-N64-NEXT: ld $2, %got_page(.LCPI5_0)($1)484; MIPSR6-N64-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)485; MIPSR6-N64-NEXT: ldc1 $f1, 8($sp)486; MIPSR6-N64-NEXT: sub.d $f0, $f1, $f0487; MIPSR6-N64-NEXT: dmfc1 $2, $f0488; MIPSR6-N64-NEXT: fill.d $w0, $2489; MIPSR6-N64-NEXT: fexdo.w $w0, $w0, $w0490; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w0491; MIPSR6-N64-NEXT: ld $1, %got_disp(h)($1)492; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0]493; MIPSR6-N64-NEXT: sh $2, 0($1)494; MIPSR6-N64-NEXT: jr $ra495; MIPSR6-N64-NEXT: daddiu $sp, $sp, 16496entry:497 498 499 500 501 502 503 504 505 506 %0 = uitofp i32 %a to half507 store half %0, ptr @h, align 2508 ret void509}510 511 512; Check that f16 is expanded to f32 and relevant transfer ops occur.513; We don't check f16 -> f64 expansion occurs, as we expand f16 to f32.514 515define void @fadd() {516; MIPS32-LABEL: fadd:517; MIPS32: # %bb.0: # %entry518; MIPS32-NEXT: lui $2, %hi(_gp_disp)519; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)520; MIPS32-NEXT: addu $1, $2, $25521; MIPS32-NEXT: lw $1, %got(g)($1)522; MIPS32-NEXT: lh $2, 0($1)523; MIPS32-NEXT: fill.h $w0, $2524; MIPS32-NEXT: fexupr.w $w0, $w0525; MIPS32-NEXT: copy_s.w $2, $w0[0]526; MIPS32-NEXT: mtc1 $2, $f0527; MIPS32-NEXT: add.s $f0, $f0, $f0528; MIPS32-NEXT: mfc1 $2, $f0529; MIPS32-NEXT: fill.w $w0, $2530; MIPS32-NEXT: fexdo.h $w0, $w0, $w0531; MIPS32-NEXT: copy_u.h $2, $w0[0]532; MIPS32-NEXT: jr $ra533; MIPS32-NEXT: sh $2, 0($1)534;535; MIPS64-N32-LABEL: fadd:536; MIPS64-N32: # %bb.0: # %entry537; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd)))538; MIPS64-N32-NEXT: addu $1, $1, $25539; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fadd)))540; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)541; MIPS64-N32-NEXT: lh $2, 0($1)542; MIPS64-N32-NEXT: fill.h $w0, $2543; MIPS64-N32-NEXT: fexupr.w $w0, $w0544; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]545; MIPS64-N32-NEXT: mtc1 $2, $f0546; MIPS64-N32-NEXT: add.s $f0, $f0, $f0547; MIPS64-N32-NEXT: mfc1 $2, $f0548; MIPS64-N32-NEXT: fill.w $w0, $2549; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0550; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]551; MIPS64-N32-NEXT: jr $ra552; MIPS64-N32-NEXT: sh $2, 0($1)553;554; MIPS64-N64-LABEL: fadd:555; MIPS64-N64: # %bb.0: # %entry556; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd)))557; MIPS64-N64-NEXT: daddu $1, $1, $25558; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fadd)))559; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)560; MIPS64-N64-NEXT: lh $2, 0($1)561; MIPS64-N64-NEXT: fill.h $w0, $2562; MIPS64-N64-NEXT: fexupr.w $w0, $w0563; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]564; MIPS64-N64-NEXT: mtc1 $2, $f0565; MIPS64-N64-NEXT: add.s $f0, $f0, $f0566; MIPS64-N64-NEXT: mfc1 $2, $f0567; MIPS64-N64-NEXT: fill.w $w0, $2568; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0569; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]570; MIPS64-N64-NEXT: jr $ra571; MIPS64-N64-NEXT: sh $2, 0($1)572entry:573 %0 = load i16, ptr @g, align 2574 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)575 576 577 %2 = load i16, ptr @g, align 2578 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)579 %add = fadd float %1, %3580 581 582 %4 = call i16 @llvm.convert.to.fp16.f32(float %add)583 584 store i16 %4, ptr @g, align 2585 ret void586}587 588; Function Attrs: nounwind readnone589declare float @llvm.convert.from.fp16.f32(i16)590 591; Function Attrs: nounwind readnone592declare i16 @llvm.convert.to.fp16.f32(float)593 594; Function Attrs: nounwind595define void @fsub() {596; MIPS32-LABEL: fsub:597; MIPS32: # %bb.0: # %entry598; MIPS32-NEXT: lui $2, %hi(_gp_disp)599; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)600; MIPS32-NEXT: addu $1, $2, $25601; MIPS32-NEXT: lw $1, %got(g)($1)602; MIPS32-NEXT: lh $2, 0($1)603; MIPS32-NEXT: fill.h $w0, $2604; MIPS32-NEXT: fexupr.w $w0, $w0605; MIPS32-NEXT: copy_s.w $2, $w0[0]606; MIPS32-NEXT: mtc1 $2, $f0607; MIPS32-NEXT: sub.s $f0, $f0, $f0608; MIPS32-NEXT: mfc1 $2, $f0609; MIPS32-NEXT: fill.w $w0, $2610; MIPS32-NEXT: fexdo.h $w0, $w0, $w0611; MIPS32-NEXT: copy_u.h $2, $w0[0]612; MIPS32-NEXT: jr $ra613; MIPS32-NEXT: sh $2, 0($1)614;615; MIPS64-N32-LABEL: fsub:616; MIPS64-N32: # %bb.0: # %entry617; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsub)))618; MIPS64-N32-NEXT: addu $1, $1, $25619; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsub)))620; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)621; MIPS64-N32-NEXT: lh $2, 0($1)622; MIPS64-N32-NEXT: fill.h $w0, $2623; MIPS64-N32-NEXT: fexupr.w $w0, $w0624; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]625; MIPS64-N32-NEXT: mtc1 $2, $f0626; MIPS64-N32-NEXT: sub.s $f0, $f0, $f0627; MIPS64-N32-NEXT: mfc1 $2, $f0628; MIPS64-N32-NEXT: fill.w $w0, $2629; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0630; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]631; MIPS64-N32-NEXT: jr $ra632; MIPS64-N32-NEXT: sh $2, 0($1)633;634; MIPS64-N64-LABEL: fsub:635; MIPS64-N64: # %bb.0: # %entry636; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsub)))637; MIPS64-N64-NEXT: daddu $1, $1, $25638; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsub)))639; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)640; MIPS64-N64-NEXT: lh $2, 0($1)641; MIPS64-N64-NEXT: fill.h $w0, $2642; MIPS64-N64-NEXT: fexupr.w $w0, $w0643; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]644; MIPS64-N64-NEXT: mtc1 $2, $f0645; MIPS64-N64-NEXT: sub.s $f0, $f0, $f0646; MIPS64-N64-NEXT: mfc1 $2, $f0647; MIPS64-N64-NEXT: fill.w $w0, $2648; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0649; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]650; MIPS64-N64-NEXT: jr $ra651; MIPS64-N64-NEXT: sh $2, 0($1)652entry:653 %0 = load i16, ptr @g, align 2654 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)655 656 657 %2 = load i16, ptr @g, align 2658 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)659 %sub = fsub float %1, %3660 661 662 %4 = call i16 @llvm.convert.to.fp16.f32(float %sub)663 664 665 store i16 %4, ptr @g, align 2666 ret void667}668 669define void @fmult() {670; MIPS32-LABEL: fmult:671; MIPS32: # %bb.0: # %entry672; MIPS32-NEXT: lui $2, %hi(_gp_disp)673; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)674; MIPS32-NEXT: addu $1, $2, $25675; MIPS32-NEXT: lw $1, %got(g)($1)676; MIPS32-NEXT: lh $2, 0($1)677; MIPS32-NEXT: fill.h $w0, $2678; MIPS32-NEXT: fexupr.w $w0, $w0679; MIPS32-NEXT: copy_s.w $2, $w0[0]680; MIPS32-NEXT: mtc1 $2, $f0681; MIPS32-NEXT: mul.s $f0, $f0, $f0682; MIPS32-NEXT: mfc1 $2, $f0683; MIPS32-NEXT: fill.w $w0, $2684; MIPS32-NEXT: fexdo.h $w0, $w0, $w0685; MIPS32-NEXT: copy_u.h $2, $w0[0]686; MIPS32-NEXT: jr $ra687; MIPS32-NEXT: sh $2, 0($1)688;689; MIPS64-N32-LABEL: fmult:690; MIPS64-N32: # %bb.0: # %entry691; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmult)))692; MIPS64-N32-NEXT: addu $1, $1, $25693; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fmult)))694; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)695; MIPS64-N32-NEXT: lh $2, 0($1)696; MIPS64-N32-NEXT: fill.h $w0, $2697; MIPS64-N32-NEXT: fexupr.w $w0, $w0698; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]699; MIPS64-N32-NEXT: mtc1 $2, $f0700; MIPS64-N32-NEXT: mul.s $f0, $f0, $f0701; MIPS64-N32-NEXT: mfc1 $2, $f0702; MIPS64-N32-NEXT: fill.w $w0, $2703; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0704; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]705; MIPS64-N32-NEXT: jr $ra706; MIPS64-N32-NEXT: sh $2, 0($1)707;708; MIPS64-N64-LABEL: fmult:709; MIPS64-N64: # %bb.0: # %entry710; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmult)))711; MIPS64-N64-NEXT: daddu $1, $1, $25712; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fmult)))713; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)714; MIPS64-N64-NEXT: lh $2, 0($1)715; MIPS64-N64-NEXT: fill.h $w0, $2716; MIPS64-N64-NEXT: fexupr.w $w0, $w0717; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]718; MIPS64-N64-NEXT: mtc1 $2, $f0719; MIPS64-N64-NEXT: mul.s $f0, $f0, $f0720; MIPS64-N64-NEXT: mfc1 $2, $f0721; MIPS64-N64-NEXT: fill.w $w0, $2722; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0723; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]724; MIPS64-N64-NEXT: jr $ra725; MIPS64-N64-NEXT: sh $2, 0($1)726entry:727 %0 = load i16, ptr @g, align 2728 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)729 730 731 %2 = load i16, ptr @g, align 2732 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)733 %mul = fmul float %1, %3734 735 736 %4 = call i16 @llvm.convert.to.fp16.f32(float %mul)737 738 739 store i16 %4, ptr @g, align 2740 741 ret void742}743 744define void @fdiv() {745; MIPS32-LABEL: fdiv:746; MIPS32: # %bb.0: # %entry747; MIPS32-NEXT: lui $2, %hi(_gp_disp)748; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)749; MIPS32-NEXT: addu $1, $2, $25750; MIPS32-NEXT: lw $1, %got(g)($1)751; MIPS32-NEXT: lh $2, 0($1)752; MIPS32-NEXT: fill.h $w0, $2753; MIPS32-NEXT: fexupr.w $w0, $w0754; MIPS32-NEXT: copy_s.w $2, $w0[0]755; MIPS32-NEXT: mtc1 $2, $f0756; MIPS32-NEXT: div.s $f0, $f0, $f0757; MIPS32-NEXT: mfc1 $2, $f0758; MIPS32-NEXT: fill.w $w0, $2759; MIPS32-NEXT: fexdo.h $w0, $w0, $w0760; MIPS32-NEXT: copy_u.h $2, $w0[0]761; MIPS32-NEXT: jr $ra762; MIPS32-NEXT: sh $2, 0($1)763;764; MIPS64-N32-LABEL: fdiv:765; MIPS64-N32: # %bb.0: # %entry766; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv)))767; MIPS64-N32-NEXT: addu $1, $1, $25768; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fdiv)))769; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)770; MIPS64-N32-NEXT: lh $2, 0($1)771; MIPS64-N32-NEXT: fill.h $w0, $2772; MIPS64-N32-NEXT: fexupr.w $w0, $w0773; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]774; MIPS64-N32-NEXT: mtc1 $2, $f0775; MIPS64-N32-NEXT: div.s $f0, $f0, $f0776; MIPS64-N32-NEXT: mfc1 $2, $f0777; MIPS64-N32-NEXT: fill.w $w0, $2778; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0779; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]780; MIPS64-N32-NEXT: jr $ra781; MIPS64-N32-NEXT: sh $2, 0($1)782;783; MIPS64-N64-LABEL: fdiv:784; MIPS64-N64: # %bb.0: # %entry785; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv)))786; MIPS64-N64-NEXT: daddu $1, $1, $25787; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fdiv)))788; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)789; MIPS64-N64-NEXT: lh $2, 0($1)790; MIPS64-N64-NEXT: fill.h $w0, $2791; MIPS64-N64-NEXT: fexupr.w $w0, $w0792; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]793; MIPS64-N64-NEXT: mtc1 $2, $f0794; MIPS64-N64-NEXT: div.s $f0, $f0, $f0795; MIPS64-N64-NEXT: mfc1 $2, $f0796; MIPS64-N64-NEXT: fill.w $w0, $2797; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0798; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]799; MIPS64-N64-NEXT: jr $ra800; MIPS64-N64-NEXT: sh $2, 0($1)801entry:802 803 %0 = load i16, ptr @g, align 2804 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)805 806 807 %2 = load i16, ptr @g, align 2808 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)809 %div = fdiv float %1, %3810 811 812 %4 = call i16 @llvm.convert.to.fp16.f32(float %div)813 814 store i16 %4, ptr @g, align 2815 ret void816}817 818define void @frem() {819; MIPS32-LABEL: frem:820; MIPS32: # %bb.0: # %entry821; MIPS32-NEXT: lui $2, %hi(_gp_disp)822; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)823; MIPS32-NEXT: addiu $sp, $sp, -24824; MIPS32-NEXT: .cfi_def_cfa_offset 24825; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill826; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill827; MIPS32-NEXT: .cfi_offset 31, -4828; MIPS32-NEXT: .cfi_offset 16, -8829; MIPS32-NEXT: addu $gp, $2, $25830; MIPS32-NEXT: lw $16, %got(g)($gp)831; MIPS32-NEXT: lh $1, 0($16)832; MIPS32-NEXT: fill.h $w0, $1833; MIPS32-NEXT: fexupr.w $w0, $w0834; MIPS32-NEXT: copy_s.w $1, $w0[0]835; MIPS32-NEXT: mtc1 $1, $f12836; MIPS32-NEXT: lw $25, %call16(fmodf)($gp)837; MIPS32-NEXT: jalr $25838; MIPS32-NEXT: mov.s $f14, $f12839; MIPS32-NEXT: mfc1 $1, $f0840; MIPS32-NEXT: fill.w $w0, $1841; MIPS32-NEXT: fexdo.h $w0, $w0, $w0842; MIPS32-NEXT: copy_u.h $1, $w0[0]843; MIPS32-NEXT: sh $1, 0($16)844; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload845; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload846; MIPS32-NEXT: jr $ra847; MIPS32-NEXT: addiu $sp, $sp, 24848;849; MIPS64-N32-LABEL: frem:850; MIPS64-N32: # %bb.0: # %entry851; MIPS64-N32-NEXT: addiu $sp, $sp, -32852; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32853; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill854; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill855; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill856; MIPS64-N32-NEXT: .cfi_offset 31, -8857; MIPS64-N32-NEXT: .cfi_offset 28, -16858; MIPS64-N32-NEXT: .cfi_offset 16, -24859; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frem)))860; MIPS64-N32-NEXT: addu $1, $1, $25861; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frem)))862; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)863; MIPS64-N32-NEXT: lh $1, 0($16)864; MIPS64-N32-NEXT: fill.h $w0, $1865; MIPS64-N32-NEXT: fexupr.w $w0, $w0866; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]867; MIPS64-N32-NEXT: mtc1 $1, $f12868; MIPS64-N32-NEXT: lw $25, %call16(fmodf)($gp)869; MIPS64-N32-NEXT: jalr $25870; MIPS64-N32-NEXT: mov.s $f13, $f12871; MIPS64-N32-NEXT: mfc1 $1, $f0872; MIPS64-N32-NEXT: fill.w $w0, $1873; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0874; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]875; MIPS64-N32-NEXT: sh $1, 0($16)876; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload877; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload878; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload879; MIPS64-N32-NEXT: jr $ra880; MIPS64-N32-NEXT: addiu $sp, $sp, 32881;882; MIPS64-N64-LABEL: frem:883; MIPS64-N64: # %bb.0: # %entry884; MIPS64-N64-NEXT: daddiu $sp, $sp, -32885; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32886; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill887; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill888; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill889; MIPS64-N64-NEXT: .cfi_offset 31, -8890; MIPS64-N64-NEXT: .cfi_offset 28, -16891; MIPS64-N64-NEXT: .cfi_offset 16, -24892; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frem)))893; MIPS64-N64-NEXT: daddu $1, $1, $25894; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frem)))895; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)896; MIPS64-N64-NEXT: lh $1, 0($16)897; MIPS64-N64-NEXT: fill.h $w0, $1898; MIPS64-N64-NEXT: fexupr.w $w0, $w0899; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]900; MIPS64-N64-NEXT: mtc1 $1, $f12901; MIPS64-N64-NEXT: ld $25, %call16(fmodf)($gp)902; MIPS64-N64-NEXT: jalr $25903; MIPS64-N64-NEXT: mov.s $f13, $f12904; MIPS64-N64-NEXT: mfc1 $1, $f0905; MIPS64-N64-NEXT: fill.w $w0, $1906; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0907; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]908; MIPS64-N64-NEXT: sh $1, 0($16)909; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload910; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload911; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload912; MIPS64-N64-NEXT: jr $ra913; MIPS64-N64-NEXT: daddiu $sp, $sp, 32914entry:915 %0 = load i16, ptr @g, align 2916 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)917 918 919 %2 = load i16, ptr @g, align 2920 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)921 %rem = frem float %1, %3922 923 924 %4 = call i16 @llvm.convert.to.fp16.f32(float %rem)925 926 927 store i16 %4, ptr @g, align 2928 929 ret void930}931 932@i1 = external global i16, align 1933 934define void @fcmp() {935; MIPS32-O32-LABEL: fcmp:936; MIPS32-O32: # %bb.0: # %entry937; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)938; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)939; MIPS32-O32-NEXT: addu $1, $2, $25940; MIPS32-O32-NEXT: lw $2, %got(g)($1)941; MIPS32-O32-NEXT: lh $2, 0($2)942; MIPS32-O32-NEXT: fill.h $w0, $2943; MIPS32-O32-NEXT: fexupr.w $w0, $w0944; MIPS32-O32-NEXT: copy_s.w $2, $w0[0]945; MIPS32-O32-NEXT: mtc1 $2, $f0946; MIPS32-O32-NEXT: addiu $2, $zero, 1947; MIPS32-O32-NEXT: c.un.s $f0, $f0948; MIPS32-O32-NEXT: movt $2, $zero, $fcc0949; MIPS32-O32-NEXT: lw $1, %got(i1)($1)950; MIPS32-O32-NEXT: jr $ra951; MIPS32-O32-NEXT: sh $2, 0($1)952;953; MIPS64R5-N32-LABEL: fcmp:954; MIPS64R5-N32: # %bb.0: # %entry955; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))956; MIPS64R5-N32-NEXT: addu $1, $1, $25957; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))958; MIPS64R5-N32-NEXT: lw $2, %got_disp(g)($1)959; MIPS64R5-N32-NEXT: lh $2, 0($2)960; MIPS64R5-N32-NEXT: fill.h $w0, $2961; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0962; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0]963; MIPS64R5-N32-NEXT: mtc1 $2, $f0964; MIPS64R5-N32-NEXT: addiu $2, $zero, 1965; MIPS64R5-N32-NEXT: c.un.s $f0, $f0966; MIPS64R5-N32-NEXT: movt $2, $zero, $fcc0967; MIPS64R5-N32-NEXT: lw $1, %got_disp(i1)($1)968; MIPS64R5-N32-NEXT: jr $ra969; MIPS64R5-N32-NEXT: sh $2, 0($1)970;971; MIPS64R5-N64-LABEL: fcmp:972; MIPS64R5-N64: # %bb.0: # %entry973; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))974; MIPS64R5-N64-NEXT: daddu $1, $1, $25975; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))976; MIPS64R5-N64-NEXT: ld $2, %got_disp(g)($1)977; MIPS64R5-N64-NEXT: lh $2, 0($2)978; MIPS64R5-N64-NEXT: fill.h $w0, $2979; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0980; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0]981; MIPS64R5-N64-NEXT: mtc1 $2, $f0982; MIPS64R5-N64-NEXT: addiu $2, $zero, 1983; MIPS64R5-N64-NEXT: c.un.s $f0, $f0984; MIPS64R5-N64-NEXT: movt $2, $zero, $fcc0985; MIPS64R5-N64-NEXT: ld $1, %got_disp(i1)($1)986; MIPS64R5-N64-NEXT: jr $ra987; MIPS64R5-N64-NEXT: sh $2, 0($1)988;989; MIPSR6-O32-LABEL: fcmp:990; MIPSR6-O32: # %bb.0: # %entry991; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)992; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)993; MIPSR6-O32-NEXT: addu $1, $2, $25994; MIPSR6-O32-NEXT: lw $2, %got(g)($1)995; MIPSR6-O32-NEXT: lh $2, 0($2)996; MIPSR6-O32-NEXT: fill.h $w0, $2997; MIPSR6-O32-NEXT: fexupr.w $w0, $w0998; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]999; MIPSR6-O32-NEXT: mtc1 $2, $f01000; MIPSR6-O32-NEXT: cmp.un.s $f0, $f0, $f01001; MIPSR6-O32-NEXT: mfc1 $2, $f01002; MIPSR6-O32-NEXT: not $2, $21003; MIPSR6-O32-NEXT: andi $2, $2, 11004; MIPSR6-O32-NEXT: lw $1, %got(i1)($1)1005; MIPSR6-O32-NEXT: jr $ra1006; MIPSR6-O32-NEXT: sh $2, 0($1)1007;1008; MIPSR6-N32-LABEL: fcmp:1009; MIPSR6-N32: # %bb.0: # %entry1010; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))1011; MIPSR6-N32-NEXT: addu $1, $1, $251012; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))1013; MIPSR6-N32-NEXT: lw $2, %got_disp(g)($1)1014; MIPSR6-N32-NEXT: lh $2, 0($2)1015; MIPSR6-N32-NEXT: fill.h $w0, $21016; MIPSR6-N32-NEXT: fexupr.w $w0, $w01017; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]1018; MIPSR6-N32-NEXT: mtc1 $2, $f01019; MIPSR6-N32-NEXT: cmp.un.s $f0, $f0, $f01020; MIPSR6-N32-NEXT: mfc1 $2, $f01021; MIPSR6-N32-NEXT: not $2, $21022; MIPSR6-N32-NEXT: andi $2, $2, 11023; MIPSR6-N32-NEXT: lw $1, %got_disp(i1)($1)1024; MIPSR6-N32-NEXT: jr $ra1025; MIPSR6-N32-NEXT: sh $2, 0($1)1026;1027; MIPSR6-N64-LABEL: fcmp:1028; MIPSR6-N64: # %bb.0: # %entry1029; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))1030; MIPSR6-N64-NEXT: daddu $1, $1, $251031; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))1032; MIPSR6-N64-NEXT: ld $2, %got_disp(g)($1)1033; MIPSR6-N64-NEXT: lh $2, 0($2)1034; MIPSR6-N64-NEXT: fill.h $w0, $21035; MIPSR6-N64-NEXT: fexupr.w $w0, $w01036; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]1037; MIPSR6-N64-NEXT: mtc1 $2, $f01038; MIPSR6-N64-NEXT: cmp.un.s $f0, $f0, $f01039; MIPSR6-N64-NEXT: mfc1 $2, $f01040; MIPSR6-N64-NEXT: not $2, $21041; MIPSR6-N64-NEXT: andi $2, $2, 11042; MIPSR6-N64-NEXT: ld $1, %got_disp(i1)($1)1043; MIPSR6-N64-NEXT: jr $ra1044; MIPSR6-N64-NEXT: sh $2, 0($1)1045entry:1046 %0 = load i16, ptr @g, align 21047 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1048 1049 %2 = load i16, ptr @g, align 21050 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)1051 %fcmp = fcmp oeq float %1, %31052 1053 1054 %4 = zext i1 %fcmp to i161055 store i16 %4, ptr @i1, align 21056 1057 ret void1058}1059 1060declare float @llvm.powi.f32.i32(float, i32)1061 1062define void @fpowi() {1063; MIPS32-LABEL: fpowi:1064; MIPS32: # %bb.0: # %entry1065; MIPS32-NEXT: lui $2, %hi(_gp_disp)1066; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1067; MIPS32-NEXT: addu $1, $2, $251068; MIPS32-NEXT: lw $1, %got(g)($1)1069; MIPS32-NEXT: lh $2, 0($1)1070; MIPS32-NEXT: fill.h $w0, $21071; MIPS32-NEXT: fexupr.w $w0, $w01072; MIPS32-NEXT: copy_s.w $2, $w0[0]1073; MIPS32-NEXT: mtc1 $2, $f01074; MIPS32-NEXT: mul.s $f0, $f0, $f01075; MIPS32-NEXT: mfc1 $2, $f01076; MIPS32-NEXT: fill.w $w0, $21077; MIPS32-NEXT: fexdo.h $w0, $w0, $w01078; MIPS32-NEXT: copy_u.h $2, $w0[0]1079; MIPS32-NEXT: jr $ra1080; MIPS32-NEXT: sh $2, 0($1)1081;1082; MIPS64-N32-LABEL: fpowi:1083; MIPS64-N32: # %bb.0: # %entry1084; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi)))1085; MIPS64-N32-NEXT: addu $1, $1, $251086; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fpowi)))1087; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)1088; MIPS64-N32-NEXT: lh $2, 0($1)1089; MIPS64-N32-NEXT: fill.h $w0, $21090; MIPS64-N32-NEXT: fexupr.w $w0, $w01091; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]1092; MIPS64-N32-NEXT: mtc1 $2, $f01093; MIPS64-N32-NEXT: mul.s $f0, $f0, $f01094; MIPS64-N32-NEXT: mfc1 $2, $f01095; MIPS64-N32-NEXT: fill.w $w0, $21096; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01097; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]1098; MIPS64-N32-NEXT: jr $ra1099; MIPS64-N32-NEXT: sh $2, 0($1)1100;1101; MIPS64-N64-LABEL: fpowi:1102; MIPS64-N64: # %bb.0: # %entry1103; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi)))1104; MIPS64-N64-NEXT: daddu $1, $1, $251105; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fpowi)))1106; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)1107; MIPS64-N64-NEXT: lh $2, 0($1)1108; MIPS64-N64-NEXT: fill.h $w0, $21109; MIPS64-N64-NEXT: fexupr.w $w0, $w01110; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]1111; MIPS64-N64-NEXT: mtc1 $2, $f01112; MIPS64-N64-NEXT: mul.s $f0, $f0, $f01113; MIPS64-N64-NEXT: mfc1 $2, $f01114; MIPS64-N64-NEXT: fill.w $w0, $21115; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01116; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]1117; MIPS64-N64-NEXT: jr $ra1118; MIPS64-N64-NEXT: sh $2, 0($1)1119entry:1120 %0 = load i16, ptr @g, align 21121 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1122 1123 1124 %powi = call float @llvm.powi.f32.i32(float %1, i32 2)1125 1126 1127 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)1128 1129 1130 store i16 %2, ptr @g, align 21131 ret void1132}1133 1134define void @fpowi_var(i32 %var) {1135; MIPS32-LABEL: fpowi_var:1136; MIPS32: # %bb.0: # %entry1137; MIPS32-NEXT: lui $2, %hi(_gp_disp)1138; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1139; MIPS32-NEXT: addiu $sp, $sp, -241140; MIPS32-NEXT: .cfi_def_cfa_offset 241141; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1142; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1143; MIPS32-NEXT: .cfi_offset 31, -41144; MIPS32-NEXT: .cfi_offset 16, -81145; MIPS32-NEXT: addu $gp, $2, $251146; MIPS32-NEXT: lw $16, %got(g)($gp)1147; MIPS32-NEXT: lh $1, 0($16)1148; MIPS32-NEXT: fill.h $w0, $11149; MIPS32-NEXT: fexupr.w $w0, $w01150; MIPS32-NEXT: copy_s.w $1, $w0[0]1151; MIPS32-NEXT: mtc1 $1, $f121152; MIPS32-NEXT: lw $25, %call16(__powisf2)($gp)1153; MIPS32-NEXT: jalr $251154; MIPS32-NEXT: move $5, $41155; MIPS32-NEXT: mfc1 $1, $f01156; MIPS32-NEXT: fill.w $w0, $11157; MIPS32-NEXT: fexdo.h $w0, $w0, $w01158; MIPS32-NEXT: copy_u.h $1, $w0[0]1159; MIPS32-NEXT: sh $1, 0($16)1160; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1161; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1162; MIPS32-NEXT: jr $ra1163; MIPS32-NEXT: addiu $sp, $sp, 241164;1165; MIPS64-N32-LABEL: fpowi_var:1166; MIPS64-N32: # %bb.0: # %entry1167; MIPS64-N32-NEXT: addiu $sp, $sp, -321168; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321169; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1170; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1171; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1172; MIPS64-N32-NEXT: .cfi_offset 31, -81173; MIPS64-N32-NEXT: .cfi_offset 28, -161174; MIPS64-N32-NEXT: .cfi_offset 16, -241175; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var)))1176; MIPS64-N32-NEXT: addu $1, $1, $251177; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))1178; MIPS64-N32-NEXT: sll $5, $4, 01179; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1180; MIPS64-N32-NEXT: lh $1, 0($16)1181; MIPS64-N32-NEXT: fill.h $w0, $11182; MIPS64-N32-NEXT: fexupr.w $w0, $w01183; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1184; MIPS64-N32-NEXT: lw $25, %call16(__powisf2)($gp)1185; MIPS64-N32-NEXT: jalr $251186; MIPS64-N32-NEXT: mtc1 $1, $f121187; MIPS64-N32-NEXT: mfc1 $1, $f01188; MIPS64-N32-NEXT: fill.w $w0, $11189; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01190; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1191; MIPS64-N32-NEXT: sh $1, 0($16)1192; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1193; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1194; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1195; MIPS64-N32-NEXT: jr $ra1196; MIPS64-N32-NEXT: addiu $sp, $sp, 321197;1198; MIPS64-N64-LABEL: fpowi_var:1199; MIPS64-N64: # %bb.0: # %entry1200; MIPS64-N64-NEXT: daddiu $sp, $sp, -321201; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321202; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1203; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1204; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1205; MIPS64-N64-NEXT: .cfi_offset 31, -81206; MIPS64-N64-NEXT: .cfi_offset 28, -161207; MIPS64-N64-NEXT: .cfi_offset 16, -241208; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var)))1209; MIPS64-N64-NEXT: daddu $1, $1, $251210; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))1211; MIPS64-N64-NEXT: sll $5, $4, 01212; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1213; MIPS64-N64-NEXT: lh $1, 0($16)1214; MIPS64-N64-NEXT: fill.h $w0, $11215; MIPS64-N64-NEXT: fexupr.w $w0, $w01216; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1217; MIPS64-N64-NEXT: ld $25, %call16(__powisf2)($gp)1218; MIPS64-N64-NEXT: jalr $251219; MIPS64-N64-NEXT: mtc1 $1, $f121220; MIPS64-N64-NEXT: mfc1 $1, $f01221; MIPS64-N64-NEXT: fill.w $w0, $11222; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01223; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1224; MIPS64-N64-NEXT: sh $1, 0($16)1225; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1226; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1227; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1228; MIPS64-N64-NEXT: jr $ra1229; MIPS64-N64-NEXT: daddiu $sp, $sp, 321230entry:1231 %0 = load i16, ptr @g, align 21232 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1233 1234 1235 %powi = call float @llvm.powi.f32.i32(float %1, i32 %var)1236 1237 1238 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)1239 1240 1241 store i16 %2, ptr @g, align 21242 ret void1243}1244 1245declare float @llvm.pow.f32(float %Val, float %power)1246 1247define void @fpow(float %var) {1248; MIPS32-LABEL: fpow:1249; MIPS32: # %bb.0: # %entry1250; MIPS32-NEXT: lui $2, %hi(_gp_disp)1251; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1252; MIPS32-NEXT: addiu $sp, $sp, -241253; MIPS32-NEXT: .cfi_def_cfa_offset 241254; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1255; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1256; MIPS32-NEXT: .cfi_offset 31, -41257; MIPS32-NEXT: .cfi_offset 16, -81258; MIPS32-NEXT: addu $gp, $2, $251259; MIPS32-NEXT: mov.s $f14, $f121260; MIPS32-NEXT: lw $16, %got(g)($gp)1261; MIPS32-NEXT: lh $1, 0($16)1262; MIPS32-NEXT: fill.h $w0, $11263; MIPS32-NEXT: fexupr.w $w0, $w01264; MIPS32-NEXT: copy_s.w $1, $w0[0]1265; MIPS32-NEXT: lw $25, %call16(powf)($gp)1266; MIPS32-NEXT: jalr $251267; MIPS32-NEXT: mtc1 $1, $f121268; MIPS32-NEXT: mfc1 $1, $f01269; MIPS32-NEXT: fill.w $w0, $11270; MIPS32-NEXT: fexdo.h $w0, $w0, $w01271; MIPS32-NEXT: copy_u.h $1, $w0[0]1272; MIPS32-NEXT: sh $1, 0($16)1273; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1274; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1275; MIPS32-NEXT: jr $ra1276; MIPS32-NEXT: addiu $sp, $sp, 241277;1278; MIPS64-N32-LABEL: fpow:1279; MIPS64-N32: # %bb.0: # %entry1280; MIPS64-N32-NEXT: addiu $sp, $sp, -321281; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321282; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1283; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1284; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1285; MIPS64-N32-NEXT: .cfi_offset 31, -81286; MIPS64-N32-NEXT: .cfi_offset 28, -161287; MIPS64-N32-NEXT: .cfi_offset 16, -241288; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpow)))1289; MIPS64-N32-NEXT: addu $1, $1, $251290; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpow)))1291; MIPS64-N32-NEXT: mov.s $f13, $f121292; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1293; MIPS64-N32-NEXT: lh $1, 0($16)1294; MIPS64-N32-NEXT: fill.h $w0, $11295; MIPS64-N32-NEXT: fexupr.w $w0, $w01296; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1297; MIPS64-N32-NEXT: lw $25, %call16(powf)($gp)1298; MIPS64-N32-NEXT: jalr $251299; MIPS64-N32-NEXT: mtc1 $1, $f121300; MIPS64-N32-NEXT: mfc1 $1, $f01301; MIPS64-N32-NEXT: fill.w $w0, $11302; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01303; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1304; MIPS64-N32-NEXT: sh $1, 0($16)1305; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1306; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1307; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1308; MIPS64-N32-NEXT: jr $ra1309; MIPS64-N32-NEXT: addiu $sp, $sp, 321310;1311; MIPS64-N64-LABEL: fpow:1312; MIPS64-N64: # %bb.0: # %entry1313; MIPS64-N64-NEXT: daddiu $sp, $sp, -321314; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321315; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1316; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1317; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1318; MIPS64-N64-NEXT: .cfi_offset 31, -81319; MIPS64-N64-NEXT: .cfi_offset 28, -161320; MIPS64-N64-NEXT: .cfi_offset 16, -241321; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpow)))1322; MIPS64-N64-NEXT: daddu $1, $1, $251323; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpow)))1324; MIPS64-N64-NEXT: mov.s $f13, $f121325; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1326; MIPS64-N64-NEXT: lh $1, 0($16)1327; MIPS64-N64-NEXT: fill.h $w0, $11328; MIPS64-N64-NEXT: fexupr.w $w0, $w01329; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1330; MIPS64-N64-NEXT: ld $25, %call16(powf)($gp)1331; MIPS64-N64-NEXT: jalr $251332; MIPS64-N64-NEXT: mtc1 $1, $f121333; MIPS64-N64-NEXT: mfc1 $1, $f01334; MIPS64-N64-NEXT: fill.w $w0, $11335; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01336; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1337; MIPS64-N64-NEXT: sh $1, 0($16)1338; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1339; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1340; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1341; MIPS64-N64-NEXT: jr $ra1342; MIPS64-N64-NEXT: daddiu $sp, $sp, 321343entry:1344 %0 = load i16, ptr @g, align 21345 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1346 1347 1348 %powi = call float @llvm.pow.f32(float %1, float %var)1349 1350 1351 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)1352 1353 1354 store i16 %2, ptr @g, align 21355 ret void1356}1357 1358declare float @llvm.log2.f32(float %Val)1359 1360define void @flog2() {1361; MIPS32-LABEL: flog2:1362; MIPS32: # %bb.0: # %entry1363; MIPS32-NEXT: lui $2, %hi(_gp_disp)1364; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1365; MIPS32-NEXT: addiu $sp, $sp, -241366; MIPS32-NEXT: .cfi_def_cfa_offset 241367; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1368; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1369; MIPS32-NEXT: .cfi_offset 31, -41370; MIPS32-NEXT: .cfi_offset 16, -81371; MIPS32-NEXT: addu $gp, $2, $251372; MIPS32-NEXT: lw $16, %got(g)($gp)1373; MIPS32-NEXT: lh $1, 0($16)1374; MIPS32-NEXT: fill.h $w0, $11375; MIPS32-NEXT: fexupr.w $w0, $w01376; MIPS32-NEXT: copy_s.w $1, $w0[0]1377; MIPS32-NEXT: lw $25, %call16(log2f)($gp)1378; MIPS32-NEXT: jalr $251379; MIPS32-NEXT: mtc1 $1, $f121380; MIPS32-NEXT: mfc1 $1, $f01381; MIPS32-NEXT: fill.w $w0, $11382; MIPS32-NEXT: fexdo.h $w0, $w0, $w01383; MIPS32-NEXT: copy_u.h $1, $w0[0]1384; MIPS32-NEXT: sh $1, 0($16)1385; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1386; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1387; MIPS32-NEXT: jr $ra1388; MIPS32-NEXT: addiu $sp, $sp, 241389;1390; MIPS64-N32-LABEL: flog2:1391; MIPS64-N32: # %bb.0: # %entry1392; MIPS64-N32-NEXT: addiu $sp, $sp, -321393; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321394; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1395; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1396; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1397; MIPS64-N32-NEXT: .cfi_offset 31, -81398; MIPS64-N32-NEXT: .cfi_offset 28, -161399; MIPS64-N32-NEXT: .cfi_offset 16, -241400; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog2)))1401; MIPS64-N32-NEXT: addu $1, $1, $251402; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog2)))1403; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1404; MIPS64-N32-NEXT: lh $1, 0($16)1405; MIPS64-N32-NEXT: fill.h $w0, $11406; MIPS64-N32-NEXT: fexupr.w $w0, $w01407; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1408; MIPS64-N32-NEXT: lw $25, %call16(log2f)($gp)1409; MIPS64-N32-NEXT: jalr $251410; MIPS64-N32-NEXT: mtc1 $1, $f121411; MIPS64-N32-NEXT: mfc1 $1, $f01412; MIPS64-N32-NEXT: fill.w $w0, $11413; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01414; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1415; MIPS64-N32-NEXT: sh $1, 0($16)1416; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1417; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1418; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1419; MIPS64-N32-NEXT: jr $ra1420; MIPS64-N32-NEXT: addiu $sp, $sp, 321421;1422; MIPS64-N64-LABEL: flog2:1423; MIPS64-N64: # %bb.0: # %entry1424; MIPS64-N64-NEXT: daddiu $sp, $sp, -321425; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321426; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1427; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1428; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1429; MIPS64-N64-NEXT: .cfi_offset 31, -81430; MIPS64-N64-NEXT: .cfi_offset 28, -161431; MIPS64-N64-NEXT: .cfi_offset 16, -241432; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog2)))1433; MIPS64-N64-NEXT: daddu $1, $1, $251434; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog2)))1435; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1436; MIPS64-N64-NEXT: lh $1, 0($16)1437; MIPS64-N64-NEXT: fill.h $w0, $11438; MIPS64-N64-NEXT: fexupr.w $w0, $w01439; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1440; MIPS64-N64-NEXT: ld $25, %call16(log2f)($gp)1441; MIPS64-N64-NEXT: jalr $251442; MIPS64-N64-NEXT: mtc1 $1, $f121443; MIPS64-N64-NEXT: mfc1 $1, $f01444; MIPS64-N64-NEXT: fill.w $w0, $11445; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01446; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1447; MIPS64-N64-NEXT: sh $1, 0($16)1448; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1449; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1450; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1451; MIPS64-N64-NEXT: jr $ra1452; MIPS64-N64-NEXT: daddiu $sp, $sp, 321453entry:1454 %0 = load i16, ptr @g, align 21455 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1456 1457 1458 %log2 = call float @llvm.log2.f32(float %1)1459 %2 = call i16 @llvm.convert.to.fp16.f32(float %log2)1460 1461 1462 store i16 %2, ptr @g, align 21463 1464 ret void1465}1466 1467declare float @llvm.log10.f32(float %Val)1468 1469define void @flog10() {1470; MIPS32-LABEL: flog10:1471; MIPS32: # %bb.0: # %entry1472; MIPS32-NEXT: lui $2, %hi(_gp_disp)1473; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1474; MIPS32-NEXT: addiu $sp, $sp, -241475; MIPS32-NEXT: .cfi_def_cfa_offset 241476; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1477; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1478; MIPS32-NEXT: .cfi_offset 31, -41479; MIPS32-NEXT: .cfi_offset 16, -81480; MIPS32-NEXT: addu $gp, $2, $251481; MIPS32-NEXT: lw $16, %got(g)($gp)1482; MIPS32-NEXT: lh $1, 0($16)1483; MIPS32-NEXT: fill.h $w0, $11484; MIPS32-NEXT: fexupr.w $w0, $w01485; MIPS32-NEXT: copy_s.w $1, $w0[0]1486; MIPS32-NEXT: lw $25, %call16(log10f)($gp)1487; MIPS32-NEXT: jalr $251488; MIPS32-NEXT: mtc1 $1, $f121489; MIPS32-NEXT: mfc1 $1, $f01490; MIPS32-NEXT: fill.w $w0, $11491; MIPS32-NEXT: fexdo.h $w0, $w0, $w01492; MIPS32-NEXT: copy_u.h $1, $w0[0]1493; MIPS32-NEXT: sh $1, 0($16)1494; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1495; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1496; MIPS32-NEXT: jr $ra1497; MIPS32-NEXT: addiu $sp, $sp, 241498;1499; MIPS64-N32-LABEL: flog10:1500; MIPS64-N32: # %bb.0: # %entry1501; MIPS64-N32-NEXT: addiu $sp, $sp, -321502; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321503; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1504; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1505; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1506; MIPS64-N32-NEXT: .cfi_offset 31, -81507; MIPS64-N32-NEXT: .cfi_offset 28, -161508; MIPS64-N32-NEXT: .cfi_offset 16, -241509; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog10)))1510; MIPS64-N32-NEXT: addu $1, $1, $251511; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog10)))1512; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1513; MIPS64-N32-NEXT: lh $1, 0($16)1514; MIPS64-N32-NEXT: fill.h $w0, $11515; MIPS64-N32-NEXT: fexupr.w $w0, $w01516; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1517; MIPS64-N32-NEXT: lw $25, %call16(log10f)($gp)1518; MIPS64-N32-NEXT: jalr $251519; MIPS64-N32-NEXT: mtc1 $1, $f121520; MIPS64-N32-NEXT: mfc1 $1, $f01521; MIPS64-N32-NEXT: fill.w $w0, $11522; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01523; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1524; MIPS64-N32-NEXT: sh $1, 0($16)1525; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1526; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1527; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1528; MIPS64-N32-NEXT: jr $ra1529; MIPS64-N32-NEXT: addiu $sp, $sp, 321530;1531; MIPS64-N64-LABEL: flog10:1532; MIPS64-N64: # %bb.0: # %entry1533; MIPS64-N64-NEXT: daddiu $sp, $sp, -321534; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321535; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1536; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1537; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1538; MIPS64-N64-NEXT: .cfi_offset 31, -81539; MIPS64-N64-NEXT: .cfi_offset 28, -161540; MIPS64-N64-NEXT: .cfi_offset 16, -241541; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog10)))1542; MIPS64-N64-NEXT: daddu $1, $1, $251543; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog10)))1544; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1545; MIPS64-N64-NEXT: lh $1, 0($16)1546; MIPS64-N64-NEXT: fill.h $w0, $11547; MIPS64-N64-NEXT: fexupr.w $w0, $w01548; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1549; MIPS64-N64-NEXT: ld $25, %call16(log10f)($gp)1550; MIPS64-N64-NEXT: jalr $251551; MIPS64-N64-NEXT: mtc1 $1, $f121552; MIPS64-N64-NEXT: mfc1 $1, $f01553; MIPS64-N64-NEXT: fill.w $w0, $11554; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01555; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1556; MIPS64-N64-NEXT: sh $1, 0($16)1557; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1558; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1559; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1560; MIPS64-N64-NEXT: jr $ra1561; MIPS64-N64-NEXT: daddiu $sp, $sp, 321562entry:1563 %0 = load i16, ptr @g, align 21564 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1565 1566 1567 %log10 = call float @llvm.log10.f32(float %1)1568 %2 = call i16 @llvm.convert.to.fp16.f32(float %log10)1569 1570 1571 store i16 %2, ptr @g, align 21572 1573 ret void1574}1575 1576declare float @llvm.sqrt.f32(float %Val)1577 1578define void @fsqrt() {1579; MIPS32-LABEL: fsqrt:1580; MIPS32: # %bb.0: # %entry1581; MIPS32-NEXT: lui $2, %hi(_gp_disp)1582; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1583; MIPS32-NEXT: addu $1, $2, $251584; MIPS32-NEXT: lw $1, %got(g)($1)1585; MIPS32-NEXT: lh $2, 0($1)1586; MIPS32-NEXT: fill.h $w0, $21587; MIPS32-NEXT: fexupr.w $w0, $w01588; MIPS32-NEXT: copy_s.w $2, $w0[0]1589; MIPS32-NEXT: mtc1 $2, $f01590; MIPS32-NEXT: sqrt.s $f0, $f01591; MIPS32-NEXT: mfc1 $2, $f01592; MIPS32-NEXT: fill.w $w0, $21593; MIPS32-NEXT: fexdo.h $w0, $w0, $w01594; MIPS32-NEXT: copy_u.h $2, $w0[0]1595; MIPS32-NEXT: jr $ra1596; MIPS32-NEXT: sh $2, 0($1)1597;1598; MIPS64-N32-LABEL: fsqrt:1599; MIPS64-N32: # %bb.0: # %entry1600; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt)))1601; MIPS64-N32-NEXT: addu $1, $1, $251602; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))1603; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)1604; MIPS64-N32-NEXT: lh $2, 0($1)1605; MIPS64-N32-NEXT: fill.h $w0, $21606; MIPS64-N32-NEXT: fexupr.w $w0, $w01607; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]1608; MIPS64-N32-NEXT: mtc1 $2, $f01609; MIPS64-N32-NEXT: sqrt.s $f0, $f01610; MIPS64-N32-NEXT: mfc1 $2, $f01611; MIPS64-N32-NEXT: fill.w $w0, $21612; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01613; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]1614; MIPS64-N32-NEXT: jr $ra1615; MIPS64-N32-NEXT: sh $2, 0($1)1616;1617; MIPS64-N64-LABEL: fsqrt:1618; MIPS64-N64: # %bb.0: # %entry1619; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt)))1620; MIPS64-N64-NEXT: daddu $1, $1, $251621; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))1622; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)1623; MIPS64-N64-NEXT: lh $2, 0($1)1624; MIPS64-N64-NEXT: fill.h $w0, $21625; MIPS64-N64-NEXT: fexupr.w $w0, $w01626; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]1627; MIPS64-N64-NEXT: mtc1 $2, $f01628; MIPS64-N64-NEXT: sqrt.s $f0, $f01629; MIPS64-N64-NEXT: mfc1 $2, $f01630; MIPS64-N64-NEXT: fill.w $w0, $21631; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01632; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]1633; MIPS64-N64-NEXT: jr $ra1634; MIPS64-N64-NEXT: sh $2, 0($1)1635entry:1636 %0 = load i16, ptr @g, align 21637 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1638 1639 1640 %sqrt = call float @llvm.sqrt.f32(float %1)1641 %2 = call i16 @llvm.convert.to.fp16.f32(float %sqrt)1642 1643 1644 store i16 %2, ptr @g, align 21645 1646 ret void1647}1648 1649declare float @llvm.sin.f32(float %Val)1650 1651define void @fsin() {1652; MIPS32-LABEL: fsin:1653; MIPS32: # %bb.0: # %entry1654; MIPS32-NEXT: lui $2, %hi(_gp_disp)1655; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1656; MIPS32-NEXT: addiu $sp, $sp, -241657; MIPS32-NEXT: .cfi_def_cfa_offset 241658; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1659; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1660; MIPS32-NEXT: .cfi_offset 31, -41661; MIPS32-NEXT: .cfi_offset 16, -81662; MIPS32-NEXT: addu $gp, $2, $251663; MIPS32-NEXT: lw $16, %got(g)($gp)1664; MIPS32-NEXT: lh $1, 0($16)1665; MIPS32-NEXT: fill.h $w0, $11666; MIPS32-NEXT: fexupr.w $w0, $w01667; MIPS32-NEXT: copy_s.w $1, $w0[0]1668; MIPS32-NEXT: lw $25, %call16(sinf)($gp)1669; MIPS32-NEXT: jalr $251670; MIPS32-NEXT: mtc1 $1, $f121671; MIPS32-NEXT: mfc1 $1, $f01672; MIPS32-NEXT: fill.w $w0, $11673; MIPS32-NEXT: fexdo.h $w0, $w0, $w01674; MIPS32-NEXT: copy_u.h $1, $w0[0]1675; MIPS32-NEXT: sh $1, 0($16)1676; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1677; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1678; MIPS32-NEXT: jr $ra1679; MIPS32-NEXT: addiu $sp, $sp, 241680;1681; MIPS64-N32-LABEL: fsin:1682; MIPS64-N32: # %bb.0: # %entry1683; MIPS64-N32-NEXT: addiu $sp, $sp, -321684; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321685; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1686; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1687; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1688; MIPS64-N32-NEXT: .cfi_offset 31, -81689; MIPS64-N32-NEXT: .cfi_offset 28, -161690; MIPS64-N32-NEXT: .cfi_offset 16, -241691; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsin)))1692; MIPS64-N32-NEXT: addu $1, $1, $251693; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fsin)))1694; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1695; MIPS64-N32-NEXT: lh $1, 0($16)1696; MIPS64-N32-NEXT: fill.h $w0, $11697; MIPS64-N32-NEXT: fexupr.w $w0, $w01698; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1699; MIPS64-N32-NEXT: lw $25, %call16(sinf)($gp)1700; MIPS64-N32-NEXT: jalr $251701; MIPS64-N32-NEXT: mtc1 $1, $f121702; MIPS64-N32-NEXT: mfc1 $1, $f01703; MIPS64-N32-NEXT: fill.w $w0, $11704; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01705; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1706; MIPS64-N32-NEXT: sh $1, 0($16)1707; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1708; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1709; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1710; MIPS64-N32-NEXT: jr $ra1711; MIPS64-N32-NEXT: addiu $sp, $sp, 321712;1713; MIPS64-N64-LABEL: fsin:1714; MIPS64-N64: # %bb.0: # %entry1715; MIPS64-N64-NEXT: daddiu $sp, $sp, -321716; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321717; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1718; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1719; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1720; MIPS64-N64-NEXT: .cfi_offset 31, -81721; MIPS64-N64-NEXT: .cfi_offset 28, -161722; MIPS64-N64-NEXT: .cfi_offset 16, -241723; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsin)))1724; MIPS64-N64-NEXT: daddu $1, $1, $251725; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fsin)))1726; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1727; MIPS64-N64-NEXT: lh $1, 0($16)1728; MIPS64-N64-NEXT: fill.h $w0, $11729; MIPS64-N64-NEXT: fexupr.w $w0, $w01730; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1731; MIPS64-N64-NEXT: ld $25, %call16(sinf)($gp)1732; MIPS64-N64-NEXT: jalr $251733; MIPS64-N64-NEXT: mtc1 $1, $f121734; MIPS64-N64-NEXT: mfc1 $1, $f01735; MIPS64-N64-NEXT: fill.w $w0, $11736; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01737; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1738; MIPS64-N64-NEXT: sh $1, 0($16)1739; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1740; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1741; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1742; MIPS64-N64-NEXT: jr $ra1743; MIPS64-N64-NEXT: daddiu $sp, $sp, 321744entry:1745 %0 = load i16, ptr @g, align 21746 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1747 1748 1749 %sin = call float @llvm.sin.f32(float %1)1750 %2 = call i16 @llvm.convert.to.fp16.f32(float %sin)1751 1752 1753 store i16 %2, ptr @g, align 21754 1755 ret void1756}1757 1758declare float @llvm.cos.f32(float %Val)1759 1760define void @fcos() {1761; MIPS32-LABEL: fcos:1762; MIPS32: # %bb.0: # %entry1763; MIPS32-NEXT: lui $2, %hi(_gp_disp)1764; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1765; MIPS32-NEXT: addiu $sp, $sp, -241766; MIPS32-NEXT: .cfi_def_cfa_offset 241767; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1768; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1769; MIPS32-NEXT: .cfi_offset 31, -41770; MIPS32-NEXT: .cfi_offset 16, -81771; MIPS32-NEXT: addu $gp, $2, $251772; MIPS32-NEXT: lw $16, %got(g)($gp)1773; MIPS32-NEXT: lh $1, 0($16)1774; MIPS32-NEXT: fill.h $w0, $11775; MIPS32-NEXT: fexupr.w $w0, $w01776; MIPS32-NEXT: copy_s.w $1, $w0[0]1777; MIPS32-NEXT: lw $25, %call16(cosf)($gp)1778; MIPS32-NEXT: jalr $251779; MIPS32-NEXT: mtc1 $1, $f121780; MIPS32-NEXT: mfc1 $1, $f01781; MIPS32-NEXT: fill.w $w0, $11782; MIPS32-NEXT: fexdo.h $w0, $w0, $w01783; MIPS32-NEXT: copy_u.h $1, $w0[0]1784; MIPS32-NEXT: sh $1, 0($16)1785; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1786; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1787; MIPS32-NEXT: jr $ra1788; MIPS32-NEXT: addiu $sp, $sp, 241789;1790; MIPS64-N32-LABEL: fcos:1791; MIPS64-N32: # %bb.0: # %entry1792; MIPS64-N32-NEXT: addiu $sp, $sp, -321793; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321794; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1795; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1796; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1797; MIPS64-N32-NEXT: .cfi_offset 31, -81798; MIPS64-N32-NEXT: .cfi_offset 28, -161799; MIPS64-N32-NEXT: .cfi_offset 16, -241800; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcos)))1801; MIPS64-N32-NEXT: addu $1, $1, $251802; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fcos)))1803; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1804; MIPS64-N32-NEXT: lh $1, 0($16)1805; MIPS64-N32-NEXT: fill.h $w0, $11806; MIPS64-N32-NEXT: fexupr.w $w0, $w01807; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1808; MIPS64-N32-NEXT: lw $25, %call16(cosf)($gp)1809; MIPS64-N32-NEXT: jalr $251810; MIPS64-N32-NEXT: mtc1 $1, $f121811; MIPS64-N32-NEXT: mfc1 $1, $f01812; MIPS64-N32-NEXT: fill.w $w0, $11813; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01814; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1815; MIPS64-N32-NEXT: sh $1, 0($16)1816; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1817; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1818; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1819; MIPS64-N32-NEXT: jr $ra1820; MIPS64-N32-NEXT: addiu $sp, $sp, 321821;1822; MIPS64-N64-LABEL: fcos:1823; MIPS64-N64: # %bb.0: # %entry1824; MIPS64-N64-NEXT: daddiu $sp, $sp, -321825; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321826; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1827; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1828; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1829; MIPS64-N64-NEXT: .cfi_offset 31, -81830; MIPS64-N64-NEXT: .cfi_offset 28, -161831; MIPS64-N64-NEXT: .cfi_offset 16, -241832; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcos)))1833; MIPS64-N64-NEXT: daddu $1, $1, $251834; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fcos)))1835; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1836; MIPS64-N64-NEXT: lh $1, 0($16)1837; MIPS64-N64-NEXT: fill.h $w0, $11838; MIPS64-N64-NEXT: fexupr.w $w0, $w01839; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1840; MIPS64-N64-NEXT: ld $25, %call16(cosf)($gp)1841; MIPS64-N64-NEXT: jalr $251842; MIPS64-N64-NEXT: mtc1 $1, $f121843; MIPS64-N64-NEXT: mfc1 $1, $f01844; MIPS64-N64-NEXT: fill.w $w0, $11845; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01846; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1847; MIPS64-N64-NEXT: sh $1, 0($16)1848; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1849; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1850; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1851; MIPS64-N64-NEXT: jr $ra1852; MIPS64-N64-NEXT: daddiu $sp, $sp, 321853entry:1854 %0 = load i16, ptr @g, align 21855 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1856 1857 1858 %cos = call float @llvm.cos.f32(float %1)1859 %2 = call i16 @llvm.convert.to.fp16.f32(float %cos)1860 1861 1862 store i16 %2, ptr @g, align 21863 1864 ret void1865}1866 1867declare float @llvm.exp.f32(float %Val)1868 1869define void @fexp() {1870; MIPS32-LABEL: fexp:1871; MIPS32: # %bb.0: # %entry1872; MIPS32-NEXT: lui $2, %hi(_gp_disp)1873; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1874; MIPS32-NEXT: addiu $sp, $sp, -241875; MIPS32-NEXT: .cfi_def_cfa_offset 241876; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1877; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1878; MIPS32-NEXT: .cfi_offset 31, -41879; MIPS32-NEXT: .cfi_offset 16, -81880; MIPS32-NEXT: addu $gp, $2, $251881; MIPS32-NEXT: lw $16, %got(g)($gp)1882; MIPS32-NEXT: lh $1, 0($16)1883; MIPS32-NEXT: fill.h $w0, $11884; MIPS32-NEXT: fexupr.w $w0, $w01885; MIPS32-NEXT: copy_s.w $1, $w0[0]1886; MIPS32-NEXT: lw $25, %call16(expf)($gp)1887; MIPS32-NEXT: jalr $251888; MIPS32-NEXT: mtc1 $1, $f121889; MIPS32-NEXT: mfc1 $1, $f01890; MIPS32-NEXT: fill.w $w0, $11891; MIPS32-NEXT: fexdo.h $w0, $w0, $w01892; MIPS32-NEXT: copy_u.h $1, $w0[0]1893; MIPS32-NEXT: sh $1, 0($16)1894; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload1895; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload1896; MIPS32-NEXT: jr $ra1897; MIPS32-NEXT: addiu $sp, $sp, 241898;1899; MIPS64-N32-LABEL: fexp:1900; MIPS64-N32: # %bb.0: # %entry1901; MIPS64-N32-NEXT: addiu $sp, $sp, -321902; MIPS64-N32-NEXT: .cfi_def_cfa_offset 321903; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1904; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1905; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1906; MIPS64-N32-NEXT: .cfi_offset 31, -81907; MIPS64-N32-NEXT: .cfi_offset 28, -161908; MIPS64-N32-NEXT: .cfi_offset 16, -241909; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp)))1910; MIPS64-N32-NEXT: addu $1, $1, $251911; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp)))1912; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)1913; MIPS64-N32-NEXT: lh $1, 0($16)1914; MIPS64-N32-NEXT: fill.h $w0, $11915; MIPS64-N32-NEXT: fexupr.w $w0, $w01916; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]1917; MIPS64-N32-NEXT: lw $25, %call16(expf)($gp)1918; MIPS64-N32-NEXT: jalr $251919; MIPS64-N32-NEXT: mtc1 $1, $f121920; MIPS64-N32-NEXT: mfc1 $1, $f01921; MIPS64-N32-NEXT: fill.w $w0, $11922; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w01923; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]1924; MIPS64-N32-NEXT: sh $1, 0($16)1925; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1926; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1927; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1928; MIPS64-N32-NEXT: jr $ra1929; MIPS64-N32-NEXT: addiu $sp, $sp, 321930;1931; MIPS64-N64-LABEL: fexp:1932; MIPS64-N64: # %bb.0: # %entry1933; MIPS64-N64-NEXT: daddiu $sp, $sp, -321934; MIPS64-N64-NEXT: .cfi_def_cfa_offset 321935; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill1936; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill1937; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill1938; MIPS64-N64-NEXT: .cfi_offset 31, -81939; MIPS64-N64-NEXT: .cfi_offset 28, -161940; MIPS64-N64-NEXT: .cfi_offset 16, -241941; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp)))1942; MIPS64-N64-NEXT: daddu $1, $1, $251943; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp)))1944; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)1945; MIPS64-N64-NEXT: lh $1, 0($16)1946; MIPS64-N64-NEXT: fill.h $w0, $11947; MIPS64-N64-NEXT: fexupr.w $w0, $w01948; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]1949; MIPS64-N64-NEXT: ld $25, %call16(expf)($gp)1950; MIPS64-N64-NEXT: jalr $251951; MIPS64-N64-NEXT: mtc1 $1, $f121952; MIPS64-N64-NEXT: mfc1 $1, $f01953; MIPS64-N64-NEXT: fill.w $w0, $11954; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w01955; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]1956; MIPS64-N64-NEXT: sh $1, 0($16)1957; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload1958; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload1959; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload1960; MIPS64-N64-NEXT: jr $ra1961; MIPS64-N64-NEXT: daddiu $sp, $sp, 321962entry:1963 %0 = load i16, ptr @g, align 21964 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)1965 1966 %exp = call float @llvm.exp.f32(float %1)1967 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp)1968 1969 1970 store i16 %2, ptr @g, align 21971 1972 ret void1973}1974 1975declare float @llvm.exp2.f32(float %Val)1976 1977define void @fexp2() {1978; MIPS32-LABEL: fexp2:1979; MIPS32: # %bb.0: # %entry1980; MIPS32-NEXT: lui $2, %hi(_gp_disp)1981; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)1982; MIPS32-NEXT: addiu $sp, $sp, -241983; MIPS32-NEXT: .cfi_def_cfa_offset 241984; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill1985; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill1986; MIPS32-NEXT: .cfi_offset 31, -41987; MIPS32-NEXT: .cfi_offset 16, -81988; MIPS32-NEXT: addu $gp, $2, $251989; MIPS32-NEXT: lw $16, %got(g)($gp)1990; MIPS32-NEXT: lh $1, 0($16)1991; MIPS32-NEXT: fill.h $w0, $11992; MIPS32-NEXT: fexupr.w $w0, $w01993; MIPS32-NEXT: copy_s.w $1, $w0[0]1994; MIPS32-NEXT: lw $25, %call16(exp2f)($gp)1995; MIPS32-NEXT: jalr $251996; MIPS32-NEXT: mtc1 $1, $f121997; MIPS32-NEXT: mfc1 $1, $f01998; MIPS32-NEXT: fill.w $w0, $11999; MIPS32-NEXT: fexdo.h $w0, $w0, $w02000; MIPS32-NEXT: copy_u.h $1, $w0[0]2001; MIPS32-NEXT: sh $1, 0($16)2002; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2003; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2004; MIPS32-NEXT: jr $ra2005; MIPS32-NEXT: addiu $sp, $sp, 242006;2007; MIPS64-N32-LABEL: fexp2:2008; MIPS64-N32: # %bb.0: # %entry2009; MIPS64-N32-NEXT: addiu $sp, $sp, -322010; MIPS64-N32-NEXT: .cfi_def_cfa_offset 322011; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2012; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2013; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2014; MIPS64-N32-NEXT: .cfi_offset 31, -82015; MIPS64-N32-NEXT: .cfi_offset 28, -162016; MIPS64-N32-NEXT: .cfi_offset 16, -242017; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2)))2018; MIPS64-N32-NEXT: addu $1, $1, $252019; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))2020; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)2021; MIPS64-N32-NEXT: lh $1, 0($16)2022; MIPS64-N32-NEXT: fill.h $w0, $12023; MIPS64-N32-NEXT: fexupr.w $w0, $w02024; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]2025; MIPS64-N32-NEXT: lw $25, %call16(exp2f)($gp)2026; MIPS64-N32-NEXT: jalr $252027; MIPS64-N32-NEXT: mtc1 $1, $f122028; MIPS64-N32-NEXT: mfc1 $1, $f02029; MIPS64-N32-NEXT: fill.w $w0, $12030; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02031; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]2032; MIPS64-N32-NEXT: sh $1, 0($16)2033; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2034; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2035; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2036; MIPS64-N32-NEXT: jr $ra2037; MIPS64-N32-NEXT: addiu $sp, $sp, 322038;2039; MIPS64-N64-LABEL: fexp2:2040; MIPS64-N64: # %bb.0: # %entry2041; MIPS64-N64-NEXT: daddiu $sp, $sp, -322042; MIPS64-N64-NEXT: .cfi_def_cfa_offset 322043; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2044; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2045; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2046; MIPS64-N64-NEXT: .cfi_offset 31, -82047; MIPS64-N64-NEXT: .cfi_offset 28, -162048; MIPS64-N64-NEXT: .cfi_offset 16, -242049; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2)))2050; MIPS64-N64-NEXT: daddu $1, $1, $252051; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))2052; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)2053; MIPS64-N64-NEXT: lh $1, 0($16)2054; MIPS64-N64-NEXT: fill.h $w0, $12055; MIPS64-N64-NEXT: fexupr.w $w0, $w02056; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]2057; MIPS64-N64-NEXT: ld $25, %call16(exp2f)($gp)2058; MIPS64-N64-NEXT: jalr $252059; MIPS64-N64-NEXT: mtc1 $1, $f122060; MIPS64-N64-NEXT: mfc1 $1, $f02061; MIPS64-N64-NEXT: fill.w $w0, $12062; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w02063; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]2064; MIPS64-N64-NEXT: sh $1, 0($16)2065; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2066; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2067; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2068; MIPS64-N64-NEXT: jr $ra2069; MIPS64-N64-NEXT: daddiu $sp, $sp, 322070entry:2071 %0 = load i16, ptr @g, align 22072 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2073 2074 2075 %exp2 = call float @llvm.exp2.f32(float %1)2076 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp2)2077 2078 2079 store i16 %2, ptr @g, align 22080 2081 ret void2082}2083 2084declare float @llvm.fma.f32(float, float, float)2085 2086define void @ffma(float %b, float %c) {2087; MIPS32-LABEL: ffma:2088; MIPS32: # %bb.0: # %entry2089; MIPS32-NEXT: lui $2, %hi(_gp_disp)2090; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)2091; MIPS32-NEXT: addiu $sp, $sp, -242092; MIPS32-NEXT: .cfi_def_cfa_offset 242093; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill2094; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill2095; MIPS32-NEXT: .cfi_offset 31, -42096; MIPS32-NEXT: .cfi_offset 16, -82097; MIPS32-NEXT: addu $gp, $2, $252098; MIPS32-NEXT: mov.s $f0, $f122099; MIPS32-NEXT: mfc1 $6, $f142100; MIPS32-NEXT: lw $16, %got(g)($gp)2101; MIPS32-NEXT: lh $1, 0($16)2102; MIPS32-NEXT: fill.h $w1, $12103; MIPS32-NEXT: fexupr.w $w1, $w12104; MIPS32-NEXT: copy_s.w $1, $w1[0]2105; MIPS32-NEXT: mtc1 $1, $f122106; MIPS32-NEXT: lw $25, %call16(fmaf)($gp)2107; MIPS32-NEXT: jalr $252108; MIPS32-NEXT: mov.s $f14, $f02109; MIPS32-NEXT: mfc1 $1, $f02110; MIPS32-NEXT: fill.w $w0, $12111; MIPS32-NEXT: fexdo.h $w0, $w0, $w02112; MIPS32-NEXT: copy_u.h $1, $w0[0]2113; MIPS32-NEXT: sh $1, 0($16)2114; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2115; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2116; MIPS32-NEXT: jr $ra2117; MIPS32-NEXT: addiu $sp, $sp, 242118;2119; MIPS64-N32-LABEL: ffma:2120; MIPS64-N32: # %bb.0: # %entry2121; MIPS64-N32-NEXT: addiu $sp, $sp, -322122; MIPS64-N32-NEXT: .cfi_def_cfa_offset 322123; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2124; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2125; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2126; MIPS64-N32-NEXT: .cfi_offset 31, -82127; MIPS64-N32-NEXT: .cfi_offset 28, -162128; MIPS64-N32-NEXT: .cfi_offset 16, -242129; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffma)))2130; MIPS64-N32-NEXT: addu $1, $1, $252131; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffma)))2132; MIPS64-N32-NEXT: mov.s $f14, $f132133; MIPS64-N32-NEXT: mov.s $f13, $f122134; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)2135; MIPS64-N32-NEXT: lh $1, 0($16)2136; MIPS64-N32-NEXT: fill.h $w0, $12137; MIPS64-N32-NEXT: fexupr.w $w0, $w02138; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]2139; MIPS64-N32-NEXT: lw $25, %call16(fmaf)($gp)2140; MIPS64-N32-NEXT: jalr $252141; MIPS64-N32-NEXT: mtc1 $1, $f122142; MIPS64-N32-NEXT: mfc1 $1, $f02143; MIPS64-N32-NEXT: fill.w $w0, $12144; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02145; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]2146; MIPS64-N32-NEXT: sh $1, 0($16)2147; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2148; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2149; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2150; MIPS64-N32-NEXT: jr $ra2151; MIPS64-N32-NEXT: addiu $sp, $sp, 322152;2153; MIPS64-N64-LABEL: ffma:2154; MIPS64-N64: # %bb.0: # %entry2155; MIPS64-N64-NEXT: daddiu $sp, $sp, -322156; MIPS64-N64-NEXT: .cfi_def_cfa_offset 322157; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2158; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2159; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2160; MIPS64-N64-NEXT: .cfi_offset 31, -82161; MIPS64-N64-NEXT: .cfi_offset 28, -162162; MIPS64-N64-NEXT: .cfi_offset 16, -242163; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffma)))2164; MIPS64-N64-NEXT: daddu $1, $1, $252165; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffma)))2166; MIPS64-N64-NEXT: mov.s $f14, $f132167; MIPS64-N64-NEXT: mov.s $f13, $f122168; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)2169; MIPS64-N64-NEXT: lh $1, 0($16)2170; MIPS64-N64-NEXT: fill.h $w0, $12171; MIPS64-N64-NEXT: fexupr.w $w0, $w02172; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]2173; MIPS64-N64-NEXT: ld $25, %call16(fmaf)($gp)2174; MIPS64-N64-NEXT: jalr $252175; MIPS64-N64-NEXT: mtc1 $1, $f122176; MIPS64-N64-NEXT: mfc1 $1, $f02177; MIPS64-N64-NEXT: fill.w $w0, $12178; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w02179; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]2180; MIPS64-N64-NEXT: sh $1, 0($16)2181; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2182; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2183; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2184; MIPS64-N64-NEXT: jr $ra2185; MIPS64-N64-NEXT: daddiu $sp, $sp, 322186entry:2187 %0 = load i16, ptr @g, align 22188 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2189 2190 2191 %fma = call float @llvm.fma.f32(float %1, float %b, float %c)2192 %2 = call i16 @llvm.convert.to.fp16.f32(float %fma)2193 2194 2195 store i16 %2, ptr @g, align 22196 2197 ret void2198}2199 2200; FIXME: For MIPSR6, this should produced the maddf.s instruction. MIPSR5 cannot2201; fuse the operation such that the intermediate result is not rounded.2202 2203declare float @llvm.fmuladd.f32(float, float, float)2204 2205define void @ffmuladd(float %b, float %c) {2206; MIPS32-O32-LABEL: ffmuladd:2207; MIPS32-O32: # %bb.0: # %entry2208; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)2209; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2210; MIPS32-O32-NEXT: addu $1, $2, $252211; MIPS32-O32-NEXT: lw $1, %got(g)($1)2212; MIPS32-O32-NEXT: lh $2, 0($1)2213; MIPS32-O32-NEXT: fill.h $w0, $22214; MIPS32-O32-NEXT: fexupr.w $w0, $w02215; MIPS32-O32-NEXT: copy_s.w $2, $w0[0]2216; MIPS32-O32-NEXT: mtc1 $2, $f02217; MIPS32-O32-NEXT: madd.s $f0, $f14, $f0, $f122218; MIPS32-O32-NEXT: mfc1 $2, $f02219; MIPS32-O32-NEXT: fill.w $w0, $22220; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w02221; MIPS32-O32-NEXT: copy_u.h $2, $w0[0]2222; MIPS32-O32-NEXT: jr $ra2223; MIPS32-O32-NEXT: sh $2, 0($1)2224;2225; MIPS64R5-N32-LABEL: ffmuladd:2226; MIPS64R5-N32: # %bb.0: # %entry2227; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))2228; MIPS64R5-N32-NEXT: addu $1, $1, $252229; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))2230; MIPS64R5-N32-NEXT: lw $1, %got_disp(g)($1)2231; MIPS64R5-N32-NEXT: lh $2, 0($1)2232; MIPS64R5-N32-NEXT: fill.h $w0, $22233; MIPS64R5-N32-NEXT: fexupr.w $w0, $w02234; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0]2235; MIPS64R5-N32-NEXT: mtc1 $2, $f02236; MIPS64R5-N32-NEXT: madd.s $f0, $f13, $f0, $f122237; MIPS64R5-N32-NEXT: mfc1 $2, $f02238; MIPS64R5-N32-NEXT: fill.w $w0, $22239; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w02240; MIPS64R5-N32-NEXT: copy_u.h $2, $w0[0]2241; MIPS64R5-N32-NEXT: jr $ra2242; MIPS64R5-N32-NEXT: sh $2, 0($1)2243;2244; MIPS64R5-N64-LABEL: ffmuladd:2245; MIPS64R5-N64: # %bb.0: # %entry2246; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))2247; MIPS64R5-N64-NEXT: daddu $1, $1, $252248; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))2249; MIPS64R5-N64-NEXT: ld $1, %got_disp(g)($1)2250; MIPS64R5-N64-NEXT: lh $2, 0($1)2251; MIPS64R5-N64-NEXT: fill.h $w0, $22252; MIPS64R5-N64-NEXT: fexupr.w $w0, $w02253; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0]2254; MIPS64R5-N64-NEXT: mtc1 $2, $f02255; MIPS64R5-N64-NEXT: madd.s $f0, $f13, $f0, $f122256; MIPS64R5-N64-NEXT: mfc1 $2, $f02257; MIPS64R5-N64-NEXT: fill.w $w0, $22258; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w02259; MIPS64R5-N64-NEXT: copy_u.h $2, $w0[0]2260; MIPS64R5-N64-NEXT: jr $ra2261; MIPS64R5-N64-NEXT: sh $2, 0($1)2262;2263; MIPSR6-O32-LABEL: ffmuladd:2264; MIPSR6-O32: # %bb.0: # %entry2265; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)2266; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2267; MIPSR6-O32-NEXT: addu $1, $2, $252268; MIPSR6-O32-NEXT: lw $1, %got(g)($1)2269; MIPSR6-O32-NEXT: lh $2, 0($1)2270; MIPSR6-O32-NEXT: fill.h $w0, $22271; MIPSR6-O32-NEXT: fexupr.w $w0, $w02272; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]2273; MIPSR6-O32-NEXT: mtc1 $2, $f02274; MIPSR6-O32-NEXT: mul.s $f0, $f0, $f122275; MIPSR6-O32-NEXT: add.s $f0, $f0, $f142276; MIPSR6-O32-NEXT: mfc1 $2, $f02277; MIPSR6-O32-NEXT: fill.w $w0, $22278; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w02279; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0]2280; MIPSR6-O32-NEXT: jr $ra2281; MIPSR6-O32-NEXT: sh $2, 0($1)2282;2283; MIPSR6-N32-LABEL: ffmuladd:2284; MIPSR6-N32: # %bb.0: # %entry2285; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))2286; MIPSR6-N32-NEXT: addu $1, $1, $252287; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))2288; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1)2289; MIPSR6-N32-NEXT: lh $2, 0($1)2290; MIPSR6-N32-NEXT: fill.h $w0, $22291; MIPSR6-N32-NEXT: fexupr.w $w0, $w02292; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]2293; MIPSR6-N32-NEXT: mtc1 $2, $f02294; MIPSR6-N32-NEXT: mul.s $f0, $f0, $f122295; MIPSR6-N32-NEXT: add.s $f0, $f0, $f132296; MIPSR6-N32-NEXT: mfc1 $2, $f02297; MIPSR6-N32-NEXT: fill.w $w0, $22298; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w02299; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0]2300; MIPSR6-N32-NEXT: jr $ra2301; MIPSR6-N32-NEXT: sh $2, 0($1)2302;2303; MIPSR6-N64-LABEL: ffmuladd:2304; MIPSR6-N64: # %bb.0: # %entry2305; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))2306; MIPSR6-N64-NEXT: daddu $1, $1, $252307; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))2308; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1)2309; MIPSR6-N64-NEXT: lh $2, 0($1)2310; MIPSR6-N64-NEXT: fill.h $w0, $22311; MIPSR6-N64-NEXT: fexupr.w $w0, $w02312; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]2313; MIPSR6-N64-NEXT: mtc1 $2, $f02314; MIPSR6-N64-NEXT: mul.s $f0, $f0, $f122315; MIPSR6-N64-NEXT: add.s $f0, $f0, $f132316; MIPSR6-N64-NEXT: mfc1 $2, $f02317; MIPSR6-N64-NEXT: fill.w $w0, $22318; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w02319; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0]2320; MIPSR6-N64-NEXT: jr $ra2321; MIPSR6-N64-NEXT: sh $2, 0($1)2322entry:2323 %0 = load i16, ptr @g, align 22324 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2325 2326; MIPS32-N32: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f122327; MIPS32-N64: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f122328 2329 %fmuladd = call float @llvm.fmuladd.f32(float %1, float %b, float %c)2330 %2 = call i16 @llvm.convert.to.fp16.f32(float %fmuladd)2331 2332 2333 store i16 %2, ptr @g, align 22334 2335 ret void2336}2337 2338declare float @llvm.fabs.f32(float %Val)2339 2340define void @ffabs() {2341; MIPS32-LABEL: ffabs:2342; MIPS32: # %bb.0: # %entry2343; MIPS32-NEXT: lui $2, %hi(_gp_disp)2344; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)2345; MIPS32-NEXT: addu $1, $2, $252346; MIPS32-NEXT: lw $1, %got(g)($1)2347; MIPS32-NEXT: lh $2, 0($1)2348; MIPS32-NEXT: fill.h $w0, $22349; MIPS32-NEXT: fexupr.w $w0, $w02350; MIPS32-NEXT: copy_s.w $2, $w0[0]2351; MIPS32-NEXT: mtc1 $2, $f02352; MIPS32-NEXT: abs.s $f0, $f02353; MIPS32-NEXT: mfc1 $2, $f02354; MIPS32-NEXT: fill.w $w0, $22355; MIPS32-NEXT: fexdo.h $w0, $w0, $w02356; MIPS32-NEXT: copy_u.h $2, $w0[0]2357; MIPS32-NEXT: jr $ra2358; MIPS32-NEXT: sh $2, 0($1)2359;2360; MIPS64-N32-LABEL: ffabs:2361; MIPS64-N32: # %bb.0: # %entry2362; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs)))2363; MIPS64-N32-NEXT: addu $1, $1, $252364; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffabs)))2365; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)2366; MIPS64-N32-NEXT: lh $2, 0($1)2367; MIPS64-N32-NEXT: fill.h $w0, $22368; MIPS64-N32-NEXT: fexupr.w $w0, $w02369; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]2370; MIPS64-N32-NEXT: mtc1 $2, $f02371; MIPS64-N32-NEXT: abs.s $f0, $f02372; MIPS64-N32-NEXT: mfc1 $2, $f02373; MIPS64-N32-NEXT: fill.w $w0, $22374; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02375; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]2376; MIPS64-N32-NEXT: jr $ra2377; MIPS64-N32-NEXT: sh $2, 0($1)2378;2379; MIPS64-N64-LABEL: ffabs:2380; MIPS64-N64: # %bb.0: # %entry2381; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs)))2382; MIPS64-N64-NEXT: daddu $1, $1, $252383; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffabs)))2384; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)2385; MIPS64-N64-NEXT: lh $2, 0($1)2386; MIPS64-N64-NEXT: fill.h $w0, $22387; MIPS64-N64-NEXT: fexupr.w $w0, $w02388; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]2389; MIPS64-N64-NEXT: mtc1 $2, $f02390; MIPS64-N64-NEXT: abs.s $f0, $f02391; MIPS64-N64-NEXT: mfc1 $2, $f02392; MIPS64-N64-NEXT: fill.w $w0, $22393; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w02394; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]2395; MIPS64-N64-NEXT: jr $ra2396; MIPS64-N64-NEXT: sh $2, 0($1)2397entry:2398 %0 = load i16, ptr @g, align 22399 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2400 2401 2402 %fabs = call float @llvm.fabs.f32(float %1)2403 %2 = call i16 @llvm.convert.to.fp16.f32(float %fabs)2404 2405 2406 store i16 %2, ptr @g, align 22407 2408 ret void2409}2410 2411declare float @llvm.minnum.f32(float %Val, float %b)2412 2413define void @fminnum(float %b) {2414; MIPS32-O32-LABEL: fminnum:2415; MIPS32-O32: # %bb.0: # %entry2416; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)2417; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2418; MIPS32-O32-NEXT: addiu $sp, $sp, -242419; MIPS32-O32-NEXT: .cfi_def_cfa_offset 242420; MIPS32-O32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill2421; MIPS32-O32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill2422; MIPS32-O32-NEXT: .cfi_offset 31, -42423; MIPS32-O32-NEXT: .cfi_offset 16, -82424; MIPS32-O32-NEXT: addu $gp, $2, $252425; MIPS32-O32-NEXT: mov.s $f14, $f122426; MIPS32-O32-NEXT: lw $16, %got(g)($gp)2427; MIPS32-O32-NEXT: lh $1, 0($16)2428; MIPS32-O32-NEXT: fill.h $w0, $12429; MIPS32-O32-NEXT: fexupr.w $w0, $w02430; MIPS32-O32-NEXT: copy_s.w $1, $w0[0]2431; MIPS32-O32-NEXT: lw $25, %call16(fminf)($gp)2432; MIPS32-O32-NEXT: jalr $252433; MIPS32-O32-NEXT: mtc1 $1, $f122434; MIPS32-O32-NEXT: mfc1 $1, $f02435; MIPS32-O32-NEXT: fill.w $w0, $12436; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w02437; MIPS32-O32-NEXT: copy_u.h $1, $w0[0]2438; MIPS32-O32-NEXT: sh $1, 0($16)2439; MIPS32-O32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2440; MIPS32-O32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2441; MIPS32-O32-NEXT: jr $ra2442; MIPS32-O32-NEXT: addiu $sp, $sp, 242443;2444; MIPS64R5-N32-LABEL: fminnum:2445; MIPS64R5-N32: # %bb.0: # %entry2446; MIPS64R5-N32-NEXT: addiu $sp, $sp, -322447; MIPS64R5-N32-NEXT: .cfi_def_cfa_offset 322448; MIPS64R5-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2449; MIPS64R5-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2450; MIPS64R5-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2451; MIPS64R5-N32-NEXT: .cfi_offset 31, -82452; MIPS64R5-N32-NEXT: .cfi_offset 28, -162453; MIPS64R5-N32-NEXT: .cfi_offset 16, -242454; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))2455; MIPS64R5-N32-NEXT: addu $1, $1, $252456; MIPS64R5-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))2457; MIPS64R5-N32-NEXT: mov.s $f13, $f122458; MIPS64R5-N32-NEXT: lw $16, %got_disp(g)($gp)2459; MIPS64R5-N32-NEXT: lh $1, 0($16)2460; MIPS64R5-N32-NEXT: fill.h $w0, $12461; MIPS64R5-N32-NEXT: fexupr.w $w0, $w02462; MIPS64R5-N32-NEXT: copy_s.w $1, $w0[0]2463; MIPS64R5-N32-NEXT: lw $25, %call16(fminf)($gp)2464; MIPS64R5-N32-NEXT: jalr $252465; MIPS64R5-N32-NEXT: mtc1 $1, $f122466; MIPS64R5-N32-NEXT: mfc1 $1, $f02467; MIPS64R5-N32-NEXT: fill.w $w0, $12468; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w02469; MIPS64R5-N32-NEXT: copy_u.h $1, $w0[0]2470; MIPS64R5-N32-NEXT: sh $1, 0($16)2471; MIPS64R5-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2472; MIPS64R5-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2473; MIPS64R5-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2474; MIPS64R5-N32-NEXT: jr $ra2475; MIPS64R5-N32-NEXT: addiu $sp, $sp, 322476;2477; MIPS64R5-N64-LABEL: fminnum:2478; MIPS64R5-N64: # %bb.0: # %entry2479; MIPS64R5-N64-NEXT: daddiu $sp, $sp, -322480; MIPS64R5-N64-NEXT: .cfi_def_cfa_offset 322481; MIPS64R5-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2482; MIPS64R5-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2483; MIPS64R5-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2484; MIPS64R5-N64-NEXT: .cfi_offset 31, -82485; MIPS64R5-N64-NEXT: .cfi_offset 28, -162486; MIPS64R5-N64-NEXT: .cfi_offset 16, -242487; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))2488; MIPS64R5-N64-NEXT: daddu $1, $1, $252489; MIPS64R5-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))2490; MIPS64R5-N64-NEXT: mov.s $f13, $f122491; MIPS64R5-N64-NEXT: ld $16, %got_disp(g)($gp)2492; MIPS64R5-N64-NEXT: lh $1, 0($16)2493; MIPS64R5-N64-NEXT: fill.h $w0, $12494; MIPS64R5-N64-NEXT: fexupr.w $w0, $w02495; MIPS64R5-N64-NEXT: copy_s.w $1, $w0[0]2496; MIPS64R5-N64-NEXT: ld $25, %call16(fminf)($gp)2497; MIPS64R5-N64-NEXT: jalr $252498; MIPS64R5-N64-NEXT: mtc1 $1, $f122499; MIPS64R5-N64-NEXT: mfc1 $1, $f02500; MIPS64R5-N64-NEXT: fill.w $w0, $12501; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w02502; MIPS64R5-N64-NEXT: copy_u.h $1, $w0[0]2503; MIPS64R5-N64-NEXT: sh $1, 0($16)2504; MIPS64R5-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2505; MIPS64R5-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2506; MIPS64R5-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2507; MIPS64R5-N64-NEXT: jr $ra2508; MIPS64R5-N64-NEXT: daddiu $sp, $sp, 322509;2510; MIPSR6-O32-LABEL: fminnum:2511; MIPSR6-O32: # %bb.0: # %entry2512; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)2513; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2514; MIPSR6-O32-NEXT: addu $1, $2, $252515; MIPSR6-O32-NEXT: lw $1, %got(g)($1)2516; MIPSR6-O32-NEXT: lh $2, 0($1)2517; MIPSR6-O32-NEXT: fill.h $w0, $22518; MIPSR6-O32-NEXT: fexupr.w $w0, $w02519; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]2520; MIPSR6-O32-NEXT: mtc1 $2, $f02521; MIPSR6-O32-NEXT: min.s $f0, $f0, $f122522; MIPSR6-O32-NEXT: mfc1 $2, $f02523; MIPSR6-O32-NEXT: fill.w $w0, $22524; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w02525; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0]2526; MIPSR6-O32-NEXT: jr $ra2527; MIPSR6-O32-NEXT: sh $2, 0($1)2528;2529; MIPSR6-N32-LABEL: fminnum:2530; MIPSR6-N32: # %bb.0: # %entry2531; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))2532; MIPSR6-N32-NEXT: addu $1, $1, $252533; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fminnum)))2534; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1)2535; MIPSR6-N32-NEXT: lh $2, 0($1)2536; MIPSR6-N32-NEXT: fill.h $w0, $22537; MIPSR6-N32-NEXT: fexupr.w $w0, $w02538; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]2539; MIPSR6-N32-NEXT: mtc1 $2, $f02540; MIPSR6-N32-NEXT: min.s $f0, $f0, $f122541; MIPSR6-N32-NEXT: mfc1 $2, $f02542; MIPSR6-N32-NEXT: fill.w $w0, $22543; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w02544; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0]2545; MIPSR6-N32-NEXT: jr $ra2546; MIPSR6-N32-NEXT: sh $2, 0($1)2547;2548; MIPSR6-N64-LABEL: fminnum:2549; MIPSR6-N64: # %bb.0: # %entry2550; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))2551; MIPSR6-N64-NEXT: daddu $1, $1, $252552; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fminnum)))2553; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1)2554; MIPSR6-N64-NEXT: lh $2, 0($1)2555; MIPSR6-N64-NEXT: fill.h $w0, $22556; MIPSR6-N64-NEXT: fexupr.w $w0, $w02557; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]2558; MIPSR6-N64-NEXT: mtc1 $2, $f02559; MIPSR6-N64-NEXT: min.s $f0, $f0, $f122560; MIPSR6-N64-NEXT: mfc1 $2, $f02561; MIPSR6-N64-NEXT: fill.w $w0, $22562; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w02563; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0]2564; MIPSR6-N64-NEXT: jr $ra2565; MIPSR6-N64-NEXT: sh $2, 0($1)2566entry:2567 %0 = load i16, ptr @g, align 22568 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2569 2570 2571 %minnum = call float @llvm.minnum.f32(float %1, float %b)2572 %2 = call i16 @llvm.convert.to.fp16.f32(float %minnum)2573 2574 2575 store i16 %2, ptr @g, align 22576 2577 ret void2578}2579 2580declare float @llvm.maxnum.f32(float %Val, float %b)2581 2582define void @fmaxnum(float %b) {2583; MIPS32-O32-LABEL: fmaxnum:2584; MIPS32-O32: # %bb.0: # %entry2585; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)2586; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2587; MIPS32-O32-NEXT: addiu $sp, $sp, -242588; MIPS32-O32-NEXT: .cfi_def_cfa_offset 242589; MIPS32-O32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill2590; MIPS32-O32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill2591; MIPS32-O32-NEXT: .cfi_offset 31, -42592; MIPS32-O32-NEXT: .cfi_offset 16, -82593; MIPS32-O32-NEXT: addu $gp, $2, $252594; MIPS32-O32-NEXT: mov.s $f14, $f122595; MIPS32-O32-NEXT: lw $16, %got(g)($gp)2596; MIPS32-O32-NEXT: lh $1, 0($16)2597; MIPS32-O32-NEXT: fill.h $w0, $12598; MIPS32-O32-NEXT: fexupr.w $w0, $w02599; MIPS32-O32-NEXT: copy_s.w $1, $w0[0]2600; MIPS32-O32-NEXT: lw $25, %call16(fmaxf)($gp)2601; MIPS32-O32-NEXT: jalr $252602; MIPS32-O32-NEXT: mtc1 $1, $f122603; MIPS32-O32-NEXT: mfc1 $1, $f02604; MIPS32-O32-NEXT: fill.w $w0, $12605; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w02606; MIPS32-O32-NEXT: copy_u.h $1, $w0[0]2607; MIPS32-O32-NEXT: sh $1, 0($16)2608; MIPS32-O32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2609; MIPS32-O32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2610; MIPS32-O32-NEXT: jr $ra2611; MIPS32-O32-NEXT: addiu $sp, $sp, 242612;2613; MIPS64R5-N32-LABEL: fmaxnum:2614; MIPS64R5-N32: # %bb.0: # %entry2615; MIPS64R5-N32-NEXT: addiu $sp, $sp, -322616; MIPS64R5-N32-NEXT: .cfi_def_cfa_offset 322617; MIPS64R5-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2618; MIPS64R5-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2619; MIPS64R5-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2620; MIPS64R5-N32-NEXT: .cfi_offset 31, -82621; MIPS64R5-N32-NEXT: .cfi_offset 28, -162622; MIPS64R5-N32-NEXT: .cfi_offset 16, -242623; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))2624; MIPS64R5-N32-NEXT: addu $1, $1, $252625; MIPS64R5-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))2626; MIPS64R5-N32-NEXT: mov.s $f13, $f122627; MIPS64R5-N32-NEXT: lw $16, %got_disp(g)($gp)2628; MIPS64R5-N32-NEXT: lh $1, 0($16)2629; MIPS64R5-N32-NEXT: fill.h $w0, $12630; MIPS64R5-N32-NEXT: fexupr.w $w0, $w02631; MIPS64R5-N32-NEXT: copy_s.w $1, $w0[0]2632; MIPS64R5-N32-NEXT: lw $25, %call16(fmaxf)($gp)2633; MIPS64R5-N32-NEXT: jalr $252634; MIPS64R5-N32-NEXT: mtc1 $1, $f122635; MIPS64R5-N32-NEXT: mfc1 $1, $f02636; MIPS64R5-N32-NEXT: fill.w $w0, $12637; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w02638; MIPS64R5-N32-NEXT: copy_u.h $1, $w0[0]2639; MIPS64R5-N32-NEXT: sh $1, 0($16)2640; MIPS64R5-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2641; MIPS64R5-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2642; MIPS64R5-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2643; MIPS64R5-N32-NEXT: jr $ra2644; MIPS64R5-N32-NEXT: addiu $sp, $sp, 322645;2646; MIPS64R5-N64-LABEL: fmaxnum:2647; MIPS64R5-N64: # %bb.0: # %entry2648; MIPS64R5-N64-NEXT: daddiu $sp, $sp, -322649; MIPS64R5-N64-NEXT: .cfi_def_cfa_offset 322650; MIPS64R5-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2651; MIPS64R5-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2652; MIPS64R5-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2653; MIPS64R5-N64-NEXT: .cfi_offset 31, -82654; MIPS64R5-N64-NEXT: .cfi_offset 28, -162655; MIPS64R5-N64-NEXT: .cfi_offset 16, -242656; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))2657; MIPS64R5-N64-NEXT: daddu $1, $1, $252658; MIPS64R5-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))2659; MIPS64R5-N64-NEXT: mov.s $f13, $f122660; MIPS64R5-N64-NEXT: ld $16, %got_disp(g)($gp)2661; MIPS64R5-N64-NEXT: lh $1, 0($16)2662; MIPS64R5-N64-NEXT: fill.h $w0, $12663; MIPS64R5-N64-NEXT: fexupr.w $w0, $w02664; MIPS64R5-N64-NEXT: copy_s.w $1, $w0[0]2665; MIPS64R5-N64-NEXT: ld $25, %call16(fmaxf)($gp)2666; MIPS64R5-N64-NEXT: jalr $252667; MIPS64R5-N64-NEXT: mtc1 $1, $f122668; MIPS64R5-N64-NEXT: mfc1 $1, $f02669; MIPS64R5-N64-NEXT: fill.w $w0, $12670; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w02671; MIPS64R5-N64-NEXT: copy_u.h $1, $w0[0]2672; MIPS64R5-N64-NEXT: sh $1, 0($16)2673; MIPS64R5-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2674; MIPS64R5-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2675; MIPS64R5-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2676; MIPS64R5-N64-NEXT: jr $ra2677; MIPS64R5-N64-NEXT: daddiu $sp, $sp, 322678;2679; MIPSR6-O32-LABEL: fmaxnum:2680; MIPSR6-O32: # %bb.0: # %entry2681; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)2682; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)2683; MIPSR6-O32-NEXT: addu $1, $2, $252684; MIPSR6-O32-NEXT: lw $1, %got(g)($1)2685; MIPSR6-O32-NEXT: lh $2, 0($1)2686; MIPSR6-O32-NEXT: fill.h $w0, $22687; MIPSR6-O32-NEXT: fexupr.w $w0, $w02688; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]2689; MIPSR6-O32-NEXT: mtc1 $2, $f02690; MIPSR6-O32-NEXT: max.s $f0, $f0, $f122691; MIPSR6-O32-NEXT: mfc1 $2, $f02692; MIPSR6-O32-NEXT: fill.w $w0, $22693; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w02694; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0]2695; MIPSR6-O32-NEXT: jr $ra2696; MIPSR6-O32-NEXT: sh $2, 0($1)2697;2698; MIPSR6-N32-LABEL: fmaxnum:2699; MIPSR6-N32: # %bb.0: # %entry2700; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))2701; MIPSR6-N32-NEXT: addu $1, $1, $252702; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fmaxnum)))2703; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1)2704; MIPSR6-N32-NEXT: lh $2, 0($1)2705; MIPSR6-N32-NEXT: fill.h $w0, $22706; MIPSR6-N32-NEXT: fexupr.w $w0, $w02707; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]2708; MIPSR6-N32-NEXT: mtc1 $2, $f02709; MIPSR6-N32-NEXT: max.s $f0, $f0, $f122710; MIPSR6-N32-NEXT: mfc1 $2, $f02711; MIPSR6-N32-NEXT: fill.w $w0, $22712; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w02713; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0]2714; MIPSR6-N32-NEXT: jr $ra2715; MIPSR6-N32-NEXT: sh $2, 0($1)2716;2717; MIPSR6-N64-LABEL: fmaxnum:2718; MIPSR6-N64: # %bb.0: # %entry2719; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))2720; MIPSR6-N64-NEXT: daddu $1, $1, $252721; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fmaxnum)))2722; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1)2723; MIPSR6-N64-NEXT: lh $2, 0($1)2724; MIPSR6-N64-NEXT: fill.h $w0, $22725; MIPSR6-N64-NEXT: fexupr.w $w0, $w02726; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]2727; MIPSR6-N64-NEXT: mtc1 $2, $f02728; MIPSR6-N64-NEXT: max.s $f0, $f0, $f122729; MIPSR6-N64-NEXT: mfc1 $2, $f02730; MIPSR6-N64-NEXT: fill.w $w0, $22731; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w02732; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0]2733; MIPSR6-N64-NEXT: jr $ra2734; MIPSR6-N64-NEXT: sh $2, 0($1)2735entry:2736 %0 = load i16, ptr @g, align 22737 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2738 2739 2740 %maxnum = call float @llvm.maxnum.f32(float %1, float %b)2741 %2 = call i16 @llvm.convert.to.fp16.f32(float %maxnum)2742 2743 2744 store i16 %2, ptr @g, align 22745 2746 ret void2747}2748 2749; This expansion of fcopysign could be done without converting f16 to float.2750 2751declare float @llvm.copysign.f32(float %Val, float %b)2752 2753define void @fcopysign(float %b) {2754; MIPS32-LABEL: fcopysign:2755; MIPS32: # %bb.0: # %entry2756; MIPS32-NEXT: lui $2, %hi(_gp_disp)2757; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)2758; MIPS32-NEXT: addu $1, $2, $252759; MIPS32-NEXT: lw $1, %got(g)($1)2760; MIPS32-NEXT: lh $2, 0($1)2761; MIPS32-NEXT: fill.h $w0, $22762; MIPS32-NEXT: fexupr.w $w0, $w02763; MIPS32-NEXT: copy_s.w $2, $w0[0]2764; MIPS32-NEXT: mfc1 $3, $f122765; MIPS32-NEXT: ext $3, $3, 31, 12766; MIPS32-NEXT: ins $2, $3, 31, 12767; MIPS32-NEXT: fill.w $w0, $22768; MIPS32-NEXT: fexdo.h $w0, $w0, $w02769; MIPS32-NEXT: copy_u.h $2, $w0[0]2770; MIPS32-NEXT: jr $ra2771; MIPS32-NEXT: sh $2, 0($1)2772;2773; MIPS64-N32-LABEL: fcopysign:2774; MIPS64-N32: # %bb.0: # %entry2775; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign)))2776; MIPS64-N32-NEXT: addu $1, $1, $252777; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))2778; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)2779; MIPS64-N32-NEXT: lh $2, 0($1)2780; MIPS64-N32-NEXT: fill.h $w0, $22781; MIPS64-N32-NEXT: fexupr.w $w0, $w02782; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]2783; MIPS64-N32-NEXT: mfc1 $3, $f122784; MIPS64-N32-NEXT: ext $3, $3, 31, 12785; MIPS64-N32-NEXT: ins $2, $3, 31, 12786; MIPS64-N32-NEXT: fill.w $w0, $22787; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02788; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]2789; MIPS64-N32-NEXT: jr $ra2790; MIPS64-N32-NEXT: sh $2, 0($1)2791;2792; MIPS64-N64-LABEL: fcopysign:2793; MIPS64-N64: # %bb.0: # %entry2794; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign)))2795; MIPS64-N64-NEXT: daddu $1, $1, $252796; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))2797; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)2798; MIPS64-N64-NEXT: lh $2, 0($1)2799; MIPS64-N64-NEXT: fill.h $w0, $22800; MIPS64-N64-NEXT: fexupr.w $w0, $w02801; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]2802; MIPS64-N64-NEXT: mfc1 $3, $f122803; MIPS64-N64-NEXT: ext $3, $3, 31, 12804; MIPS64-N64-NEXT: ins $2, $3, 31, 12805; MIPS64-N64-NEXT: fill.w $w0, $22806; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w02807; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]2808; MIPS64-N64-NEXT: jr $ra2809; MIPS64-N64-NEXT: sh $2, 0($1)2810entry:2811 %0 = load i16, ptr @g, align 22812 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2813 2814 2815 %copysign = call float @llvm.copysign.f32(float %1, float %b)2816 %2 = call i16 @llvm.convert.to.fp16.f32(float %copysign)2817 2818 2819 store i16 %2, ptr @g, align 22820 2821 ret void2822}2823 2824declare float @llvm.floor.f32(float %Val)2825 2826define void @ffloor() {2827; MIPS32-LABEL: ffloor:2828; MIPS32: # %bb.0: # %entry2829; MIPS32-NEXT: lui $2, %hi(_gp_disp)2830; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)2831; MIPS32-NEXT: addiu $sp, $sp, -242832; MIPS32-NEXT: .cfi_def_cfa_offset 242833; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill2834; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill2835; MIPS32-NEXT: .cfi_offset 31, -42836; MIPS32-NEXT: .cfi_offset 16, -82837; MIPS32-NEXT: addu $gp, $2, $252838; MIPS32-NEXT: lw $16, %got(g)($gp)2839; MIPS32-NEXT: lh $1, 0($16)2840; MIPS32-NEXT: fill.h $w0, $12841; MIPS32-NEXT: fexupr.w $w0, $w02842; MIPS32-NEXT: copy_s.w $1, $w0[0]2843; MIPS32-NEXT: lw $25, %call16(floorf)($gp)2844; MIPS32-NEXT: jalr $252845; MIPS32-NEXT: mtc1 $1, $f122846; MIPS32-NEXT: mfc1 $1, $f02847; MIPS32-NEXT: fill.w $w0, $12848; MIPS32-NEXT: fexdo.h $w0, $w0, $w02849; MIPS32-NEXT: copy_u.h $1, $w0[0]2850; MIPS32-NEXT: sh $1, 0($16)2851; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2852; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2853; MIPS32-NEXT: jr $ra2854; MIPS32-NEXT: addiu $sp, $sp, 242855;2856; MIPS64-N32-LABEL: ffloor:2857; MIPS64-N32: # %bb.0: # %entry2858; MIPS64-N32-NEXT: addiu $sp, $sp, -322859; MIPS64-N32-NEXT: .cfi_def_cfa_offset 322860; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2861; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2862; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2863; MIPS64-N32-NEXT: .cfi_offset 31, -82864; MIPS64-N32-NEXT: .cfi_offset 28, -162865; MIPS64-N32-NEXT: .cfi_offset 16, -242866; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor)))2867; MIPS64-N32-NEXT: addu $1, $1, $252868; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))2869; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)2870; MIPS64-N32-NEXT: lh $1, 0($16)2871; MIPS64-N32-NEXT: fill.h $w0, $12872; MIPS64-N32-NEXT: fexupr.w $w0, $w02873; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]2874; MIPS64-N32-NEXT: lw $25, %call16(floorf)($gp)2875; MIPS64-N32-NEXT: jalr $252876; MIPS64-N32-NEXT: mtc1 $1, $f122877; MIPS64-N32-NEXT: mfc1 $1, $f02878; MIPS64-N32-NEXT: fill.w $w0, $12879; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02880; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]2881; MIPS64-N32-NEXT: sh $1, 0($16)2882; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2883; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2884; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2885; MIPS64-N32-NEXT: jr $ra2886; MIPS64-N32-NEXT: addiu $sp, $sp, 322887;2888; MIPS64-N64-LABEL: ffloor:2889; MIPS64-N64: # %bb.0: # %entry2890; MIPS64-N64-NEXT: daddiu $sp, $sp, -322891; MIPS64-N64-NEXT: .cfi_def_cfa_offset 322892; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2893; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2894; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2895; MIPS64-N64-NEXT: .cfi_offset 31, -82896; MIPS64-N64-NEXT: .cfi_offset 28, -162897; MIPS64-N64-NEXT: .cfi_offset 16, -242898; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor)))2899; MIPS64-N64-NEXT: daddu $1, $1, $252900; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))2901; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)2902; MIPS64-N64-NEXT: lh $1, 0($16)2903; MIPS64-N64-NEXT: fill.h $w0, $12904; MIPS64-N64-NEXT: fexupr.w $w0, $w02905; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]2906; MIPS64-N64-NEXT: ld $25, %call16(floorf)($gp)2907; MIPS64-N64-NEXT: jalr $252908; MIPS64-N64-NEXT: mtc1 $1, $f122909; MIPS64-N64-NEXT: mfc1 $1, $f02910; MIPS64-N64-NEXT: fill.w $w0, $12911; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w02912; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]2913; MIPS64-N64-NEXT: sh $1, 0($16)2914; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2915; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2916; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2917; MIPS64-N64-NEXT: jr $ra2918; MIPS64-N64-NEXT: daddiu $sp, $sp, 322919entry:2920 %0 = load i16, ptr @g, align 22921 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)2922 2923 2924 %floor = call float @llvm.floor.f32(float %1)2925 %2 = call i16 @llvm.convert.to.fp16.f32(float %floor)2926 2927 2928 store i16 %2, ptr @g, align 22929 2930 ret void2931}2932 2933declare float @llvm.ceil.f32(float %Val)2934 2935define void @fceil() {2936; MIPS32-LABEL: fceil:2937; MIPS32: # %bb.0: # %entry2938; MIPS32-NEXT: lui $2, %hi(_gp_disp)2939; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)2940; MIPS32-NEXT: addiu $sp, $sp, -242941; MIPS32-NEXT: .cfi_def_cfa_offset 242942; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill2943; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill2944; MIPS32-NEXT: .cfi_offset 31, -42945; MIPS32-NEXT: .cfi_offset 16, -82946; MIPS32-NEXT: addu $gp, $2, $252947; MIPS32-NEXT: lw $16, %got(g)($gp)2948; MIPS32-NEXT: lh $1, 0($16)2949; MIPS32-NEXT: fill.h $w0, $12950; MIPS32-NEXT: fexupr.w $w0, $w02951; MIPS32-NEXT: copy_s.w $1, $w0[0]2952; MIPS32-NEXT: lw $25, %call16(ceilf)($gp)2953; MIPS32-NEXT: jalr $252954; MIPS32-NEXT: mtc1 $1, $f122955; MIPS32-NEXT: mfc1 $1, $f02956; MIPS32-NEXT: fill.w $w0, $12957; MIPS32-NEXT: fexdo.h $w0, $w0, $w02958; MIPS32-NEXT: copy_u.h $1, $w0[0]2959; MIPS32-NEXT: sh $1, 0($16)2960; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload2961; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload2962; MIPS32-NEXT: jr $ra2963; MIPS32-NEXT: addiu $sp, $sp, 242964;2965; MIPS64-N32-LABEL: fceil:2966; MIPS64-N32: # %bb.0: # %entry2967; MIPS64-N32-NEXT: addiu $sp, $sp, -322968; MIPS64-N32-NEXT: .cfi_def_cfa_offset 322969; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill2970; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill2971; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill2972; MIPS64-N32-NEXT: .cfi_offset 31, -82973; MIPS64-N32-NEXT: .cfi_offset 28, -162974; MIPS64-N32-NEXT: .cfi_offset 16, -242975; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fceil)))2976; MIPS64-N32-NEXT: addu $1, $1, $252977; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fceil)))2978; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)2979; MIPS64-N32-NEXT: lh $1, 0($16)2980; MIPS64-N32-NEXT: fill.h $w0, $12981; MIPS64-N32-NEXT: fexupr.w $w0, $w02982; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]2983; MIPS64-N32-NEXT: lw $25, %call16(ceilf)($gp)2984; MIPS64-N32-NEXT: jalr $252985; MIPS64-N32-NEXT: mtc1 $1, $f122986; MIPS64-N32-NEXT: mfc1 $1, $f02987; MIPS64-N32-NEXT: fill.w $w0, $12988; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w02989; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]2990; MIPS64-N32-NEXT: sh $1, 0($16)2991; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload2992; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload2993; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload2994; MIPS64-N32-NEXT: jr $ra2995; MIPS64-N32-NEXT: addiu $sp, $sp, 322996;2997; MIPS64-N64-LABEL: fceil:2998; MIPS64-N64: # %bb.0: # %entry2999; MIPS64-N64-NEXT: daddiu $sp, $sp, -323000; MIPS64-N64-NEXT: .cfi_def_cfa_offset 323001; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3002; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3003; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3004; MIPS64-N64-NEXT: .cfi_offset 31, -83005; MIPS64-N64-NEXT: .cfi_offset 28, -163006; MIPS64-N64-NEXT: .cfi_offset 16, -243007; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fceil)))3008; MIPS64-N64-NEXT: daddu $1, $1, $253009; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fceil)))3010; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)3011; MIPS64-N64-NEXT: lh $1, 0($16)3012; MIPS64-N64-NEXT: fill.h $w0, $13013; MIPS64-N64-NEXT: fexupr.w $w0, $w03014; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]3015; MIPS64-N64-NEXT: ld $25, %call16(ceilf)($gp)3016; MIPS64-N64-NEXT: jalr $253017; MIPS64-N64-NEXT: mtc1 $1, $f123018; MIPS64-N64-NEXT: mfc1 $1, $f03019; MIPS64-N64-NEXT: fill.w $w0, $13020; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w03021; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]3022; MIPS64-N64-NEXT: sh $1, 0($16)3023; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3024; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3025; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3026; MIPS64-N64-NEXT: jr $ra3027; MIPS64-N64-NEXT: daddiu $sp, $sp, 323028entry:3029 %0 = load i16, ptr @g, align 23030 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)3031 3032 3033 %ceil = call float @llvm.ceil.f32(float %1)3034 %2 = call i16 @llvm.convert.to.fp16.f32(float %ceil)3035 3036 3037 store i16 %2, ptr @g, align 23038 3039 ret void3040}3041 3042declare float @llvm.trunc.f32(float %Val)3043 3044define void @ftrunc() {3045; MIPS32-LABEL: ftrunc:3046; MIPS32: # %bb.0: # %entry3047; MIPS32-NEXT: lui $2, %hi(_gp_disp)3048; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)3049; MIPS32-NEXT: addiu $sp, $sp, -243050; MIPS32-NEXT: .cfi_def_cfa_offset 243051; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill3052; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill3053; MIPS32-NEXT: .cfi_offset 31, -43054; MIPS32-NEXT: .cfi_offset 16, -83055; MIPS32-NEXT: addu $gp, $2, $253056; MIPS32-NEXT: lw $16, %got(g)($gp)3057; MIPS32-NEXT: lh $1, 0($16)3058; MIPS32-NEXT: fill.h $w0, $13059; MIPS32-NEXT: fexupr.w $w0, $w03060; MIPS32-NEXT: copy_s.w $1, $w0[0]3061; MIPS32-NEXT: lw $25, %call16(truncf)($gp)3062; MIPS32-NEXT: jalr $253063; MIPS32-NEXT: mtc1 $1, $f123064; MIPS32-NEXT: mfc1 $1, $f03065; MIPS32-NEXT: fill.w $w0, $13066; MIPS32-NEXT: fexdo.h $w0, $w0, $w03067; MIPS32-NEXT: copy_u.h $1, $w0[0]3068; MIPS32-NEXT: sh $1, 0($16)3069; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload3070; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload3071; MIPS32-NEXT: jr $ra3072; MIPS32-NEXT: addiu $sp, $sp, 243073;3074; MIPS64-N32-LABEL: ftrunc:3075; MIPS64-N32: # %bb.0: # %entry3076; MIPS64-N32-NEXT: addiu $sp, $sp, -323077; MIPS64-N32-NEXT: .cfi_def_cfa_offset 323078; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3079; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3080; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3081; MIPS64-N32-NEXT: .cfi_offset 31, -83082; MIPS64-N32-NEXT: .cfi_offset 28, -163083; MIPS64-N32-NEXT: .cfi_offset 16, -243084; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc)))3085; MIPS64-N32-NEXT: addu $1, $1, $253086; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))3087; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)3088; MIPS64-N32-NEXT: lh $1, 0($16)3089; MIPS64-N32-NEXT: fill.h $w0, $13090; MIPS64-N32-NEXT: fexupr.w $w0, $w03091; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]3092; MIPS64-N32-NEXT: lw $25, %call16(truncf)($gp)3093; MIPS64-N32-NEXT: jalr $253094; MIPS64-N32-NEXT: mtc1 $1, $f123095; MIPS64-N32-NEXT: mfc1 $1, $f03096; MIPS64-N32-NEXT: fill.w $w0, $13097; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w03098; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]3099; MIPS64-N32-NEXT: sh $1, 0($16)3100; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3101; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3102; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3103; MIPS64-N32-NEXT: jr $ra3104; MIPS64-N32-NEXT: addiu $sp, $sp, 323105;3106; MIPS64-N64-LABEL: ftrunc:3107; MIPS64-N64: # %bb.0: # %entry3108; MIPS64-N64-NEXT: daddiu $sp, $sp, -323109; MIPS64-N64-NEXT: .cfi_def_cfa_offset 323110; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3111; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3112; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3113; MIPS64-N64-NEXT: .cfi_offset 31, -83114; MIPS64-N64-NEXT: .cfi_offset 28, -163115; MIPS64-N64-NEXT: .cfi_offset 16, -243116; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc)))3117; MIPS64-N64-NEXT: daddu $1, $1, $253118; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))3119; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)3120; MIPS64-N64-NEXT: lh $1, 0($16)3121; MIPS64-N64-NEXT: fill.h $w0, $13122; MIPS64-N64-NEXT: fexupr.w $w0, $w03123; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]3124; MIPS64-N64-NEXT: ld $25, %call16(truncf)($gp)3125; MIPS64-N64-NEXT: jalr $253126; MIPS64-N64-NEXT: mtc1 $1, $f123127; MIPS64-N64-NEXT: mfc1 $1, $f03128; MIPS64-N64-NEXT: fill.w $w0, $13129; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w03130; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]3131; MIPS64-N64-NEXT: sh $1, 0($16)3132; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3133; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3134; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3135; MIPS64-N64-NEXT: jr $ra3136; MIPS64-N64-NEXT: daddiu $sp, $sp, 323137entry:3138 %0 = load i16, ptr @g, align 23139 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)3140 3141 3142 %trunc = call float @llvm.trunc.f32(float %1)3143 %2 = call i16 @llvm.convert.to.fp16.f32(float %trunc)3144 3145 3146 store i16 %2, ptr @g, align 23147 3148 ret void3149}3150 3151declare float @llvm.rint.f32(float %Val)3152 3153define void @frint() {3154; MIPS32-LABEL: frint:3155; MIPS32: # %bb.0: # %entry3156; MIPS32-NEXT: lui $2, %hi(_gp_disp)3157; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)3158; MIPS32-NEXT: addiu $sp, $sp, -243159; MIPS32-NEXT: .cfi_def_cfa_offset 243160; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill3161; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill3162; MIPS32-NEXT: .cfi_offset 31, -43163; MIPS32-NEXT: .cfi_offset 16, -83164; MIPS32-NEXT: addu $gp, $2, $253165; MIPS32-NEXT: lw $16, %got(g)($gp)3166; MIPS32-NEXT: lh $1, 0($16)3167; MIPS32-NEXT: fill.h $w0, $13168; MIPS32-NEXT: fexupr.w $w0, $w03169; MIPS32-NEXT: copy_s.w $1, $w0[0]3170; MIPS32-NEXT: lw $25, %call16(rintf)($gp)3171; MIPS32-NEXT: jalr $253172; MIPS32-NEXT: mtc1 $1, $f123173; MIPS32-NEXT: mfc1 $1, $f03174; MIPS32-NEXT: fill.w $w0, $13175; MIPS32-NEXT: fexdo.h $w0, $w0, $w03176; MIPS32-NEXT: copy_u.h $1, $w0[0]3177; MIPS32-NEXT: sh $1, 0($16)3178; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload3179; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload3180; MIPS32-NEXT: jr $ra3181; MIPS32-NEXT: addiu $sp, $sp, 243182;3183; MIPS64-N32-LABEL: frint:3184; MIPS64-N32: # %bb.0: # %entry3185; MIPS64-N32-NEXT: addiu $sp, $sp, -323186; MIPS64-N32-NEXT: .cfi_def_cfa_offset 323187; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3188; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3189; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3190; MIPS64-N32-NEXT: .cfi_offset 31, -83191; MIPS64-N32-NEXT: .cfi_offset 28, -163192; MIPS64-N32-NEXT: .cfi_offset 16, -243193; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frint)))3194; MIPS64-N32-NEXT: addu $1, $1, $253195; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frint)))3196; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)3197; MIPS64-N32-NEXT: lh $1, 0($16)3198; MIPS64-N32-NEXT: fill.h $w0, $13199; MIPS64-N32-NEXT: fexupr.w $w0, $w03200; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]3201; MIPS64-N32-NEXT: lw $25, %call16(rintf)($gp)3202; MIPS64-N32-NEXT: jalr $253203; MIPS64-N32-NEXT: mtc1 $1, $f123204; MIPS64-N32-NEXT: mfc1 $1, $f03205; MIPS64-N32-NEXT: fill.w $w0, $13206; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w03207; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]3208; MIPS64-N32-NEXT: sh $1, 0($16)3209; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3210; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3211; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3212; MIPS64-N32-NEXT: jr $ra3213; MIPS64-N32-NEXT: addiu $sp, $sp, 323214;3215; MIPS64-N64-LABEL: frint:3216; MIPS64-N64: # %bb.0: # %entry3217; MIPS64-N64-NEXT: daddiu $sp, $sp, -323218; MIPS64-N64-NEXT: .cfi_def_cfa_offset 323219; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3220; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3221; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3222; MIPS64-N64-NEXT: .cfi_offset 31, -83223; MIPS64-N64-NEXT: .cfi_offset 28, -163224; MIPS64-N64-NEXT: .cfi_offset 16, -243225; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frint)))3226; MIPS64-N64-NEXT: daddu $1, $1, $253227; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frint)))3228; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)3229; MIPS64-N64-NEXT: lh $1, 0($16)3230; MIPS64-N64-NEXT: fill.h $w0, $13231; MIPS64-N64-NEXT: fexupr.w $w0, $w03232; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]3233; MIPS64-N64-NEXT: ld $25, %call16(rintf)($gp)3234; MIPS64-N64-NEXT: jalr $253235; MIPS64-N64-NEXT: mtc1 $1, $f123236; MIPS64-N64-NEXT: mfc1 $1, $f03237; MIPS64-N64-NEXT: fill.w $w0, $13238; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w03239; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]3240; MIPS64-N64-NEXT: sh $1, 0($16)3241; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3242; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3243; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3244; MIPS64-N64-NEXT: jr $ra3245; MIPS64-N64-NEXT: daddiu $sp, $sp, 323246entry:3247 %0 = load i16, ptr @g, align 23248 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)3249 3250 %rint = call float @llvm.rint.f32(float %1)3251 %2 = call i16 @llvm.convert.to.fp16.f32(float %rint)3252 3253 store i16 %2, ptr @g, align 23254 3255 ret void3256}3257 3258declare float @llvm.nearbyint.f32(float %Val)3259 3260define void @fnearbyint() {3261; MIPS32-LABEL: fnearbyint:3262; MIPS32: # %bb.0: # %entry3263; MIPS32-NEXT: lui $2, %hi(_gp_disp)3264; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)3265; MIPS32-NEXT: addiu $sp, $sp, -243266; MIPS32-NEXT: .cfi_def_cfa_offset 243267; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill3268; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill3269; MIPS32-NEXT: .cfi_offset 31, -43270; MIPS32-NEXT: .cfi_offset 16, -83271; MIPS32-NEXT: addu $gp, $2, $253272; MIPS32-NEXT: lw $16, %got(g)($gp)3273; MIPS32-NEXT: lh $1, 0($16)3274; MIPS32-NEXT: fill.h $w0, $13275; MIPS32-NEXT: fexupr.w $w0, $w03276; MIPS32-NEXT: copy_s.w $1, $w0[0]3277; MIPS32-NEXT: lw $25, %call16(nearbyintf)($gp)3278; MIPS32-NEXT: jalr $253279; MIPS32-NEXT: mtc1 $1, $f123280; MIPS32-NEXT: mfc1 $1, $f03281; MIPS32-NEXT: fill.w $w0, $13282; MIPS32-NEXT: fexdo.h $w0, $w0, $w03283; MIPS32-NEXT: copy_u.h $1, $w0[0]3284; MIPS32-NEXT: sh $1, 0($16)3285; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload3286; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload3287; MIPS32-NEXT: jr $ra3288; MIPS32-NEXT: addiu $sp, $sp, 243289;3290; MIPS64-N32-LABEL: fnearbyint:3291; MIPS64-N32: # %bb.0: # %entry3292; MIPS64-N32-NEXT: addiu $sp, $sp, -323293; MIPS64-N32-NEXT: .cfi_def_cfa_offset 323294; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3295; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3296; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3297; MIPS64-N32-NEXT: .cfi_offset 31, -83298; MIPS64-N32-NEXT: .cfi_offset 28, -163299; MIPS64-N32-NEXT: .cfi_offset 16, -243300; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint)))3301; MIPS64-N32-NEXT: addu $1, $1, $253302; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))3303; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)3304; MIPS64-N32-NEXT: lh $1, 0($16)3305; MIPS64-N32-NEXT: fill.h $w0, $13306; MIPS64-N32-NEXT: fexupr.w $w0, $w03307; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]3308; MIPS64-N32-NEXT: lw $25, %call16(nearbyintf)($gp)3309; MIPS64-N32-NEXT: jalr $253310; MIPS64-N32-NEXT: mtc1 $1, $f123311; MIPS64-N32-NEXT: mfc1 $1, $f03312; MIPS64-N32-NEXT: fill.w $w0, $13313; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w03314; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]3315; MIPS64-N32-NEXT: sh $1, 0($16)3316; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3317; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3318; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3319; MIPS64-N32-NEXT: jr $ra3320; MIPS64-N32-NEXT: addiu $sp, $sp, 323321;3322; MIPS64-N64-LABEL: fnearbyint:3323; MIPS64-N64: # %bb.0: # %entry3324; MIPS64-N64-NEXT: daddiu $sp, $sp, -323325; MIPS64-N64-NEXT: .cfi_def_cfa_offset 323326; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3327; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3328; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3329; MIPS64-N64-NEXT: .cfi_offset 31, -83330; MIPS64-N64-NEXT: .cfi_offset 28, -163331; MIPS64-N64-NEXT: .cfi_offset 16, -243332; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint)))3333; MIPS64-N64-NEXT: daddu $1, $1, $253334; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))3335; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)3336; MIPS64-N64-NEXT: lh $1, 0($16)3337; MIPS64-N64-NEXT: fill.h $w0, $13338; MIPS64-N64-NEXT: fexupr.w $w0, $w03339; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]3340; MIPS64-N64-NEXT: ld $25, %call16(nearbyintf)($gp)3341; MIPS64-N64-NEXT: jalr $253342; MIPS64-N64-NEXT: mtc1 $1, $f123343; MIPS64-N64-NEXT: mfc1 $1, $f03344; MIPS64-N64-NEXT: fill.w $w0, $13345; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w03346; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]3347; MIPS64-N64-NEXT: sh $1, 0($16)3348; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3349; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3350; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3351; MIPS64-N64-NEXT: jr $ra3352; MIPS64-N64-NEXT: daddiu $sp, $sp, 323353entry:3354 %0 = load i16, ptr @g, align 23355 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)3356 3357 3358 %nearbyint = call float @llvm.nearbyint.f32(float %1)3359 %2 = call i16 @llvm.convert.to.fp16.f32(float %nearbyint)3360 3361 3362 store i16 %2, ptr @g, align 23363 3364 ret void3365}3366 3367declare float @llvm.round.f32(float %Val)3368 3369define void @fround() {3370; MIPS32-LABEL: fround:3371; MIPS32: # %bb.0: # %entry3372; MIPS32-NEXT: lui $2, %hi(_gp_disp)3373; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)3374; MIPS32-NEXT: addiu $sp, $sp, -243375; MIPS32-NEXT: .cfi_def_cfa_offset 243376; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill3377; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill3378; MIPS32-NEXT: .cfi_offset 31, -43379; MIPS32-NEXT: .cfi_offset 16, -83380; MIPS32-NEXT: addu $gp, $2, $253381; MIPS32-NEXT: lw $16, %got(g)($gp)3382; MIPS32-NEXT: lh $1, 0($16)3383; MIPS32-NEXT: fill.h $w0, $13384; MIPS32-NEXT: fexupr.w $w0, $w03385; MIPS32-NEXT: copy_s.w $1, $w0[0]3386; MIPS32-NEXT: lw $25, %call16(roundf)($gp)3387; MIPS32-NEXT: jalr $253388; MIPS32-NEXT: mtc1 $1, $f123389; MIPS32-NEXT: mfc1 $1, $f03390; MIPS32-NEXT: fill.w $w0, $13391; MIPS32-NEXT: fexdo.h $w0, $w0, $w03392; MIPS32-NEXT: copy_u.h $1, $w0[0]3393; MIPS32-NEXT: sh $1, 0($16)3394; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload3395; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload3396; MIPS32-NEXT: jr $ra3397; MIPS32-NEXT: addiu $sp, $sp, 243398;3399; MIPS64-N32-LABEL: fround:3400; MIPS64-N32: # %bb.0: # %entry3401; MIPS64-N32-NEXT: addiu $sp, $sp, -323402; MIPS64-N32-NEXT: .cfi_def_cfa_offset 323403; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3404; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3405; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3406; MIPS64-N32-NEXT: .cfi_offset 31, -83407; MIPS64-N32-NEXT: .cfi_offset 28, -163408; MIPS64-N32-NEXT: .cfi_offset 16, -243409; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fround)))3410; MIPS64-N32-NEXT: addu $1, $1, $253411; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fround)))3412; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)3413; MIPS64-N32-NEXT: lh $1, 0($16)3414; MIPS64-N32-NEXT: fill.h $w0, $13415; MIPS64-N32-NEXT: fexupr.w $w0, $w03416; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]3417; MIPS64-N32-NEXT: lw $25, %call16(roundf)($gp)3418; MIPS64-N32-NEXT: jalr $253419; MIPS64-N32-NEXT: mtc1 $1, $f123420; MIPS64-N32-NEXT: mfc1 $1, $f03421; MIPS64-N32-NEXT: fill.w $w0, $13422; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w03423; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]3424; MIPS64-N32-NEXT: sh $1, 0($16)3425; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3426; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3427; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3428; MIPS64-N32-NEXT: jr $ra3429; MIPS64-N32-NEXT: addiu $sp, $sp, 323430;3431; MIPS64-N64-LABEL: fround:3432; MIPS64-N64: # %bb.0: # %entry3433; MIPS64-N64-NEXT: daddiu $sp, $sp, -323434; MIPS64-N64-NEXT: .cfi_def_cfa_offset 323435; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill3436; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill3437; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill3438; MIPS64-N64-NEXT: .cfi_offset 31, -83439; MIPS64-N64-NEXT: .cfi_offset 28, -163440; MIPS64-N64-NEXT: .cfi_offset 16, -243441; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fround)))3442; MIPS64-N64-NEXT: daddu $1, $1, $253443; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fround)))3444; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)3445; MIPS64-N64-NEXT: lh $1, 0($16)3446; MIPS64-N64-NEXT: fill.h $w0, $13447; MIPS64-N64-NEXT: fexupr.w $w0, $w03448; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]3449; MIPS64-N64-NEXT: ld $25, %call16(roundf)($gp)3450; MIPS64-N64-NEXT: jalr $253451; MIPS64-N64-NEXT: mtc1 $1, $f123452; MIPS64-N64-NEXT: mfc1 $1, $f03453; MIPS64-N64-NEXT: fill.w $w0, $13454; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w03455; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]3456; MIPS64-N64-NEXT: sh $1, 0($16)3457; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload3458; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload3459; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload3460; MIPS64-N64-NEXT: jr $ra3461; MIPS64-N64-NEXT: daddiu $sp, $sp, 323462entry:3463 %0 = load i16, ptr @g, align 23464 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)3465 3466 3467 %round = call float @llvm.round.f32(float %1)3468 %2 = call i16 @llvm.convert.to.fp16.f32(float %round)3469 3470 3471 store i16 %2, ptr @g, align 23472 3473 ret void3474}3475