llvm/llvm/test/CodeGen/Mips/msa/f16-llvm-ir.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r5 -mattr=+abs2008 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS32,MIPS32-O32
; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS64-N32,MIPS64R5-N32
; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS64-N64,MIPS64R5-N64

; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r6 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS32,MIPSR6-O32
; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS64-N32,MIPSR6-N32
; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
; RUN:     --check-prefixes=MIPS64-N64,MIPSR6-N64


; Check the use of frame indexes in the msa pseudo f16 instructions.

@k = external global float

declare float @k2(ptr)

define void @f3(i16 %b) {
; MIPS32-LABEL: f3:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -32
; MIPS32-NEXT:    .cfi_def_cfa_offset 32
; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 24($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $16, $2, $25
; MIPS32-NEXT:    sh $4, 22($sp)
; MIPS32-NEXT:    addiu $4, $sp, 22
; MIPS32-NEXT:    lw $25, %call16(k2)($16)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    move $gp, $16
; MIPS32-NEXT:    lw $1, %got(k)($16)
; MIPS32-NEXT:    swc1 $f0, 0($1)
; MIPS32-NEXT:    lw $16, 24($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N32-LABEL: f3:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(f3)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(f3)))
; MIPS64-N32-NEXT:    sh $4, 14($sp)
; MIPS64-N32-NEXT:    lw $25, %call16(k2)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    addiu $4, $sp, 14
; MIPS64-N32-NEXT:    lw $1, %got_disp(k)($gp)
; MIPS64-N32-NEXT:    swc1 $f0, 0($1)
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: f3:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(f3)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(f3)))
; MIPS64-N64-NEXT:    sh $4, 14($sp)
; MIPS64-N64-NEXT:    ld $25, %call16(k2)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    daddiu $4, $sp, 14
; MIPS64-N64-NEXT:    ld $1, %got_disp(k)($gp)
; MIPS64-N64-NEXT:    swc1 $f0, 0($1)
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = alloca half
  %1 = bitcast i16 %b to half
  store half %1, ptr %0
  %2 = call float @k2(ptr %0)
  store float %2, ptr @k
  ret void
}

define void  @f(i16 %b) {
; MIPS32-LABEL: f:
; MIPS32:       # %bb.0:
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -8
; MIPS32-NEXT:    .cfi_def_cfa_offset 8
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    sh $4, 4($sp)
; MIPS32-NEXT:    lh $2, 4($sp)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    lw $1, %got(k)($1)
; MIPS32-NEXT:    swc1 $f0, 0($1)
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 8
;
; MIPS64-N32-LABEL: f:
; MIPS64-N32:       # %bb.0:
; MIPS64-N32-NEXT:    addiu $sp, $sp, -16
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 16
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(f)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(f)))
; MIPS64-N32-NEXT:    sh $4, 12($sp)
; MIPS64-N32-NEXT:    lh $2, 12($sp)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    lw $1, %got_disp(k)($1)
; MIPS64-N32-NEXT:    swc1 $f0, 0($1)
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 16
;
; MIPS64-N64-LABEL: f:
; MIPS64-N64:       # %bb.0:
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -16
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 16
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(f)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(f)))
; MIPS64-N64-NEXT:    sh $4, 12($sp)
; MIPS64-N64-NEXT:    lh $2, 12($sp)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    ld $1, %got_disp(k)($1)
; MIPS64-N64-NEXT:    swc1 $f0, 0($1)
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 16
  %1 = bitcast i16 %b to half
  %2 = fpext half %1 to float
  store float %2, ptr @k
  ret void
}

@g = external global i16, align 2
@h = external global half, align 2

; Check that fext f16 to double has a fexupr.w, fexupr.d sequence.
; Check that ftrunc double to f16 has fexdo.w, fexdo.h sequence.
; Check that MIPS64R5+ uses 64-bit floating point <-> 64-bit GPR transfers.

; We don't need to check if pre-MIPSR5 expansions occur, the MSA ASE requires
; MIPSR5. Additionally, fp64 mode / FR=1 is required to use MSA.

define void @fadd_f64() {
; MIPS32-LABEL: fadd_f64:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(h)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    fexupr.d $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f1
; MIPS32-NEXT:    copy_s.w $2, $w0[1]
; MIPS32-NEXT:    mthc1 $2, $f1
; MIPS32-NEXT:    add.d $f0, $f1, $f1
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w1, $2
; MIPS32-NEXT:    mfhc1 $2, $f0
; MIPS32-NEXT:    insert.w $w1[1], $2
; MIPS32-NEXT:    insert.w $w1[3], $2
; MIPS32-NEXT:    fexdo.w $w0, $w1, $w1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fadd_f64:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fadd_f64)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fadd_f64)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(h)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    fexupr.d $w0, $w0
; MIPS64-N32-NEXT:    copy_s.d $2, $w0[0]
; MIPS64-N32-NEXT:    dmtc1 $2, $f0
; MIPS64-N32-NEXT:    add.d $f0, $f0, $f0
; MIPS64-N32-NEXT:    dmfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.d $w0, $2
; MIPS64-N32-NEXT:    fexdo.w $w0, $w0, $w0
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fadd_f64:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fadd_f64)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fadd_f64)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(h)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    fexupr.d $w0, $w0
; MIPS64-N64-NEXT:    copy_s.d $2, $w0[0]
; MIPS64-N64-NEXT:    dmtc1 $2, $f0
; MIPS64-N64-NEXT:    add.d $f0, $f0, $f0
; MIPS64-N64-NEXT:    dmfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.d $w0, $2
; MIPS64-N64-NEXT:    fexdo.w $w0, $w0, $w0
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load half, ptr @h, align 2
  %1 = fpext half %0 to double
  %2 = load half, ptr @h, align 2
  %3 = fpext half %2 to double
  %add = fadd double %1, %3
  %4 = fptrunc double %add to half
   store half %4, ptr @h, align 2
  ret void
}

; Entire fp16 (unsigned) range fits into (signed) i32.
define i32 @ffptoui() {
; MIPS32-LABEL: ffptoui:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(h)($1)
; MIPS32-NEXT:    lh $1, 0($1)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    fexupr.d $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    mtc1 $1, $f1
; MIPS32-NEXT:    copy_s.w $1, $w0[1]
; MIPS32-NEXT:    mthc1 $1, $f1
; MIPS32-NEXT:    trunc.w.d $f0, $f1
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    mfc1 $2, $f0
;
; MIPS64-N32-LABEL: ffptoui:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffptoui)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(ffptoui)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(h)($1)
; MIPS64-N32-NEXT:    lh $1, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    fexupr.d $w0, $w0
; MIPS64-N32-NEXT:    copy_s.d $1, $w0[0]
; MIPS64-N32-NEXT:    dmtc1 $1, $f0
; MIPS64-N32-NEXT:    trunc.w.d $f0, $f0
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    mfc1 $2, $f0
;
; MIPS64-N64-LABEL: ffptoui:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffptoui)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(ffptoui)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(h)($1)
; MIPS64-N64-NEXT:    lh $1, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    fexupr.d $w0, $w0
; MIPS64-N64-NEXT:    copy_s.d $1, $w0[0]
; MIPS64-N64-NEXT:    dmtc1 $1, $f0
; MIPS64-N64-NEXT:    trunc.w.d $f0, $f0
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    mfc1 $2, $f0
entry:
  %0 = load half, ptr @h, align 2
  %1 = fptoui half %0 to i32
  ret i32 %1
}

define i32 @ffptosi() {
; MIPS32-LABEL: ffptosi:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(h)($1)
; MIPS32-NEXT:    lh $1, 0($1)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    fexupr.d $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    mtc1 $1, $f1
; MIPS32-NEXT:    copy_s.w $1, $w0[1]
; MIPS32-NEXT:    mthc1 $1, $f1
; MIPS32-NEXT:    trunc.w.d $f0, $f1
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    mfc1 $2, $f0
;
; MIPS64-N32-LABEL: ffptosi:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffptosi)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(ffptosi)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(h)($1)
; MIPS64-N32-NEXT:    lh $1, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    fexupr.d $w0, $w0
; MIPS64-N32-NEXT:    copy_s.d $1, $w0[0]
; MIPS64-N32-NEXT:    dmtc1 $1, $f0
; MIPS64-N32-NEXT:    trunc.w.d $f0, $f0
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    mfc1 $2, $f0
;
; MIPS64-N64-LABEL: ffptosi:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffptosi)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(ffptosi)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(h)($1)
; MIPS64-N64-NEXT:    lh $1, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    fexupr.d $w0, $w0
; MIPS64-N64-NEXT:    copy_s.d $1, $w0[0]
; MIPS64-N64-NEXT:    dmtc1 $1, $f0
; MIPS64-N64-NEXT:    trunc.w.d $f0, $f0
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    mfc1 $2, $f0
entry:
  %0 = load half, ptr @h, align 2
  %1 = fptosi half %0 to i32
  ret i32 %1




}

define void @uitofp(i32 %a) {
; MIPS32-LABEL: uitofp:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -8
; MIPS32-NEXT:    .cfi_def_cfa_offset 8
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lui $2, 17200
; MIPS32-NEXT:    sw $2, 4($sp)
; MIPS32-NEXT:    sw $4, 0($sp)
; MIPS32-NEXT:    lw $2, %got($CPI5_0)($1)
; MIPS32-NEXT:    ldc1 $f0, %lo($CPI5_0)($2)
; MIPS32-NEXT:    ldc1 $f1, 0($sp)
; MIPS32-NEXT:    sub.d $f0, $f1, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w1, $2
; MIPS32-NEXT:    mfhc1 $2, $f0
; MIPS32-NEXT:    insert.w $w1[1], $2
; MIPS32-NEXT:    insert.w $w1[3], $2
; MIPS32-NEXT:    fexdo.w $w0, $w1, $w1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    lw $1, %got(h)($1)
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    sh $2, 0($1)
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 8
;
; MIPS64-N32-LABEL: uitofp:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -16
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 16
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(uitofp)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(uitofp)))
; MIPS64-N32-NEXT:    lui $2, 17200
; MIPS64-N32-NEXT:    sw $2, 12($sp)
; MIPS64R5-N32-NEXT:    sll $2, $4, 0
; MIPS64R5-N32-NEXT:    sw $2, 8($sp)
; MIPSR6-N32-NEXT:    sw $4, 8($sp)
; MIPS64-N32-NEXT:    lw $2, %got_page(.LCPI5_0)($1)
; MIPS64-N32-NEXT:    ldc1 $f0, %got_ofst(.LCPI5_0)($2)
; MIPS64-N32-NEXT:    ldc1 $f1, 8($sp)
; MIPS64-N32-NEXT:    sub.d $f0, $f1, $f0
; MIPS64-N32-NEXT:    dmfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.d $w0, $2
; MIPS64-N32-NEXT:    fexdo.w $w0, $w0, $w0
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    lw $1, %got_disp(h)($1)
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    sh $2, 0($1)
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 16
;
; MIPS64-N64-LABEL: uitofp:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -16
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 16
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(uitofp)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(uitofp)))
; MIPS64-N64-NEXT:    lui $2, 17200
; MIPS64-N64-NEXT:    sw $2, 12($sp)
; MIPS64R5-N64-NEXT:    sll $2, $4, 0
; MIPS64R5-N64-NEXT:    sw $2, 8($sp)
; MIPSR6-N64-NEXT:    sw $4, 8($sp)
; MIPS64-N64-NEXT:    ld $2, %got_page(.LCPI5_0)($1)
; MIPS64-N64-NEXT:    ldc1 $f0, %got_ofst(.LCPI5_0)($2)
; MIPS64-N64-NEXT:    ldc1 $f1, 8($sp)
; MIPS64-N64-NEXT:    sub.d $f0, $f1, $f0
; MIPS64-N64-NEXT:    dmfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.d $w0, $2
; MIPS64-N64-NEXT:    fexdo.w $w0, $w0, $w0
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    ld $1, %got_disp(h)($1)
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    sh $2, 0($1)
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 16
entry:









  %0 = uitofp i32 %a to half
  store half %0, ptr @h, align 2
  ret void
}


; Check that f16 is expanded to f32 and relevant transfer ops occur.
; We don't check f16 -> f64 expansion occurs, as we expand f16 to f32.

define void @fadd() {
; MIPS32-LABEL: fadd:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    add.s $f0, $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fadd:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fadd)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fadd)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    add.s $f0, $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fadd:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fadd)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fadd)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    add.s $f0, $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %add = fadd float %1, %3


 %4 = call i16 @llvm.convert.to.fp16.f32(float %add)

   store i16 %4, ptr @g, align 2
  ret void
}

; Function Attrs: nounwind readnone
declare float @llvm.convert.from.fp16.f32(i16)

; Function Attrs: nounwind readnone
declare i16 @llvm.convert.to.fp16.f32(float)

; Function Attrs: nounwind
define void @fsub() {
; MIPS32-LABEL: fsub:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    sub.s $f0, $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fsub:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fsub)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fsub)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    sub.s $f0, $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fsub:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fsub)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fsub)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    sub.s $f0, $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %sub = fsub float %1, %3


  %4 = call i16 @llvm.convert.to.fp16.f32(float %sub)


  store i16 %4, ptr @g, align 2
  ret void
}

define void @fmult() {
; MIPS32-LABEL: fmult:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    mul.s $f0, $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fmult:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fmult)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fmult)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    mul.s $f0, $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fmult:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fmult)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fmult)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    mul.s $f0, $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %mul = fmul float %1, %3


  %4 = call i16 @llvm.convert.to.fp16.f32(float %mul)


  store i16 %4, ptr @g, align 2

  ret void
}

define void @fdiv() {
; MIPS32-LABEL: fdiv:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    div.s $f0, $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fdiv:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fdiv)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fdiv)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    div.s $f0, $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fdiv:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fdiv)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fdiv)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    div.s $f0, $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:

  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %div = fdiv float %1, %3


  %4 = call i16 @llvm.convert.to.fp16.f32(float %div)

  store i16 %4, ptr @g, align 2
  ret void
}

define void @frem() {
; MIPS32-LABEL: frem:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    lw $25, %call16(fmodf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mov.s $f14, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: frem:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(frem)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(frem)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    lw $25, %call16(fmodf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mov.s $f13, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: frem:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(frem)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(frem)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    ld $25, %call16(fmodf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mov.s $f13, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %rem = frem float %1, %3


  %4 = call i16 @llvm.convert.to.fp16.f32(float %rem)


  store i16 %4, ptr @g, align 2

  ret void
}

@i1 = external global i16, align 1

define void @fcmp() {
; MIPS32-O32-LABEL: fcmp:
; MIPS32-O32:       # %bb.0: # %entry
; MIPS32-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-O32-NEXT:    addu $1, $2, $25
; MIPS32-O32-NEXT:    lw $2, %got(g)($1)
; MIPS32-O32-NEXT:    lh $2, 0($2)
; MIPS32-O32-NEXT:    fill.h $w0, $2
; MIPS32-O32-NEXT:    fexupr.w $w0, $w0
; MIPS32-O32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-O32-NEXT:    mtc1 $2, $f0
; MIPS32-O32-NEXT:    addiu $2, $zero, 1
; MIPS32-O32-NEXT:    c.un.s $f0, $f0
; MIPS32-O32-NEXT:    movt $2, $zero, $fcc0
; MIPS32-O32-NEXT:    lw $1, %got(i1)($1)
; MIPS32-O32-NEXT:    jr $ra
; MIPS32-O32-NEXT:    sh $2, 0($1)
;
; MIPS64R5-N32-LABEL: fcmp:
; MIPS64R5-N32:       # %bb.0: # %entry
; MIPS64R5-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fcmp)))
; MIPS64R5-N32-NEXT:    addu $1, $1, $25
; MIPS64R5-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
; MIPS64R5-N32-NEXT:    lw $2, %got_disp(g)($1)
; MIPS64R5-N32-NEXT:    lh $2, 0($2)
; MIPS64R5-N32-NEXT:    fill.h $w0, $2
; MIPS64R5-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64R5-N32-NEXT:    mtc1 $2, $f0
; MIPS64R5-N32-NEXT:    addiu $2, $zero, 1
; MIPS64R5-N32-NEXT:    c.un.s $f0, $f0
; MIPS64R5-N32-NEXT:    movt $2, $zero, $fcc0
; MIPS64R5-N32-NEXT:    lw $1, %got_disp(i1)($1)
; MIPS64R5-N32-NEXT:    jr $ra
; MIPS64R5-N32-NEXT:    sh $2, 0($1)
;
; MIPS64R5-N64-LABEL: fcmp:
; MIPS64R5-N64:       # %bb.0: # %entry
; MIPS64R5-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fcmp)))
; MIPS64R5-N64-NEXT:    daddu $1, $1, $25
; MIPS64R5-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
; MIPS64R5-N64-NEXT:    ld $2, %got_disp(g)($1)
; MIPS64R5-N64-NEXT:    lh $2, 0($2)
; MIPS64R5-N64-NEXT:    fill.h $w0, $2
; MIPS64R5-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64R5-N64-NEXT:    mtc1 $2, $f0
; MIPS64R5-N64-NEXT:    addiu $2, $zero, 1
; MIPS64R5-N64-NEXT:    c.un.s $f0, $f0
; MIPS64R5-N64-NEXT:    movt $2, $zero, $fcc0
; MIPS64R5-N64-NEXT:    ld $1, %got_disp(i1)($1)
; MIPS64R5-N64-NEXT:    jr $ra
; MIPS64R5-N64-NEXT:    sh $2, 0($1)
;
; MIPSR6-O32-LABEL: fcmp:
; MIPSR6-O32:       # %bb.0: # %entry
; MIPSR6-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPSR6-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPSR6-O32-NEXT:    addu $1, $2, $25
; MIPSR6-O32-NEXT:    lw $2, %got(g)($1)
; MIPSR6-O32-NEXT:    lh $2, 0($2)
; MIPSR6-O32-NEXT:    fill.h $w0, $2
; MIPSR6-O32-NEXT:    fexupr.w $w0, $w0
; MIPSR6-O32-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-O32-NEXT:    mtc1 $2, $f0
; MIPSR6-O32-NEXT:    cmp.un.s $f0, $f0, $f0
; MIPSR6-O32-NEXT:    mfc1 $2, $f0
; MIPSR6-O32-NEXT:    not $2, $2
; MIPSR6-O32-NEXT:    andi $2, $2, 1
; MIPSR6-O32-NEXT:    lw $1, %got(i1)($1)
; MIPSR6-O32-NEXT:    jr $ra
; MIPSR6-O32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N32-LABEL: fcmp:
; MIPSR6-N32:       # %bb.0: # %entry
; MIPSR6-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fcmp)))
; MIPSR6-N32-NEXT:    addu $1, $1, $25
; MIPSR6-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
; MIPSR6-N32-NEXT:    lw $2, %got_disp(g)($1)
; MIPSR6-N32-NEXT:    lh $2, 0($2)
; MIPSR6-N32-NEXT:    fill.h $w0, $2
; MIPSR6-N32-NEXT:    fexupr.w $w0, $w0
; MIPSR6-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-N32-NEXT:    mtc1 $2, $f0
; MIPSR6-N32-NEXT:    cmp.un.s $f0, $f0, $f0
; MIPSR6-N32-NEXT:    mfc1 $2, $f0
; MIPSR6-N32-NEXT:    not $2, $2
; MIPSR6-N32-NEXT:    andi $2, $2, 1
; MIPSR6-N32-NEXT:    lw $1, %got_disp(i1)($1)
; MIPSR6-N32-NEXT:    jr $ra
; MIPSR6-N32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N64-LABEL: fcmp:
; MIPSR6-N64:       # %bb.0: # %entry
; MIPSR6-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fcmp)))
; MIPSR6-N64-NEXT:    daddu $1, $1, $25
; MIPSR6-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
; MIPSR6-N64-NEXT:    ld $2, %got_disp(g)($1)
; MIPSR6-N64-NEXT:    lh $2, 0($2)
; MIPSR6-N64-NEXT:    fill.h $w0, $2
; MIPSR6-N64-NEXT:    fexupr.w $w0, $w0
; MIPSR6-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-N64-NEXT:    mtc1 $2, $f0
; MIPSR6-N64-NEXT:    cmp.un.s $f0, $f0, $f0
; MIPSR6-N64-NEXT:    mfc1 $2, $f0
; MIPSR6-N64-NEXT:    not $2, $2
; MIPSR6-N64-NEXT:    andi $2, $2, 1
; MIPSR6-N64-NEXT:    ld $1, %got_disp(i1)($1)
; MIPSR6-N64-NEXT:    jr $ra
; MIPSR6-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)

  %2 = load i16, ptr @g, align 2
  %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
  %fcmp = fcmp oeq float %1, %3


  %4 = zext i1 %fcmp to i16
  store i16 %4, ptr @i1, align 2

  ret void
}

declare float @llvm.powi.f32.i32(float, i32)

define void @fpowi() {
; MIPS32-LABEL: fpowi:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    mul.s $f0, $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fpowi:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fpowi)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fpowi)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    mul.s $f0, $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fpowi:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fpowi)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fpowi)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    mul.s $f0, $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %powi = call float @llvm.powi.f32.i32(float %1, i32 2)


  %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)


  store i16 %2, ptr @g, align 2
  ret void
}

define void @fpowi_var(i32 %var) {
; MIPS32-LABEL: fpowi_var:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    lw $25, %call16(__powisf2)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    move $5, $4
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fpowi_var:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fpowi_var)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))
; MIPS64-N32-NEXT:    sll $5, $4, 0
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(__powisf2)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fpowi_var:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fpowi_var)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))
; MIPS64-N64-NEXT:    sll $5, $4, 0
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(__powisf2)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %powi = call float @llvm.powi.f32.i32(float %1, i32 %var)


  %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)


  store i16 %2, ptr @g, align 2
  ret void
}

declare float @llvm.pow.f32(float %Val, float %power)

define void @fpow(float %var) {
; MIPS32-LABEL: fpow:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    mov.s $f14, $f12
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(powf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fpow:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fpow)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fpow)))
; MIPS64-N32-NEXT:    mov.s $f13, $f12
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(powf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fpow:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fpow)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fpow)))
; MIPS64-N64-NEXT:    mov.s $f13, $f12
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(powf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %powi = call float @llvm.pow.f32(float %1, float %var)


  %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)


  store i16 %2, ptr @g, align 2
  ret void
}

declare float @llvm.log2.f32(float %Val)

define void @flog2() {
; MIPS32-LABEL: flog2:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(log2f)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: flog2:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(flog2)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(flog2)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(log2f)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: flog2:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(flog2)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(flog2)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(log2f)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %log2 = call float @llvm.log2.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %log2)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.log10.f32(float %Val)

define void @flog10() {
; MIPS32-LABEL: flog10:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(log10f)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: flog10:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(flog10)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(flog10)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(log10f)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: flog10:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(flog10)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(flog10)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(log10f)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %log10 = call float @llvm.log10.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %log10)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.sqrt.f32(float %Val)

define void @fsqrt() {
; MIPS32-LABEL: fsqrt:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    sqrt.s $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fsqrt:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fsqrt)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    sqrt.s $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fsqrt:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fsqrt)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    sqrt.s $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %sqrt = call float @llvm.sqrt.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %sqrt)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.sin.f32(float %Val)

define void @fsin() {
; MIPS32-LABEL: fsin:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(sinf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fsin:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fsin)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fsin)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(sinf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fsin:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fsin)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fsin)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(sinf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %sin = call float @llvm.sin.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %sin)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.cos.f32(float %Val)

define void @fcos() {
; MIPS32-LABEL: fcos:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(cosf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fcos:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fcos)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fcos)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(cosf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fcos:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fcos)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fcos)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(cosf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %cos = call float @llvm.cos.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %cos)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.exp.f32(float %Val)

define void @fexp() {
; MIPS32-LABEL: fexp:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(expf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fexp:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fexp)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fexp)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(expf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fexp:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fexp)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fexp)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(expf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)

  %exp = call float @llvm.exp.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %exp)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.exp2.f32(float %Val)

define void @fexp2() {
; MIPS32-LABEL: fexp2:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(exp2f)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fexp2:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fexp2)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(exp2f)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fexp2:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fexp2)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(exp2f)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %exp2 = call float @llvm.exp2.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %exp2)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.fma.f32(float, float, float)

define void @ffma(float %b, float %c) {
; MIPS32-LABEL: ffma:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    mov.s $f0, $f12
; MIPS32-NEXT:    mfc1 $6, $f14
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w1, $1
; MIPS32-NEXT:    fexupr.w $w1, $w1
; MIPS32-NEXT:    copy_s.w $1, $w1[0]
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    lw $25, %call16(fmaf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mov.s $f14, $f0
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: ffma:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffma)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(ffma)))
; MIPS64-N32-NEXT:    mov.s $f14, $f13
; MIPS64-N32-NEXT:    mov.s $f13, $f12
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(fmaf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: ffma:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffma)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(ffma)))
; MIPS64-N64-NEXT:    mov.s $f14, $f13
; MIPS64-N64-NEXT:    mov.s $f13, $f12
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(fmaf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %fma = call float @llvm.fma.f32(float %1, float %b, float %c)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %fma)


  store i16 %2, ptr @g, align 2

  ret void
}

; FIXME: For MIPSR6, this should produced the maddf.s instruction. MIPSR5 cannot
;        fuse the operation such that the intermediate result is not rounded.

declare float @llvm.fmuladd.f32(float, float, float)

define void @ffmuladd(float %b, float %c) {
; MIPS32-O32-LABEL: ffmuladd:
; MIPS32-O32:       # %bb.0: # %entry
; MIPS32-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-O32-NEXT:    addu $1, $2, $25
; MIPS32-O32-NEXT:    lw $1, %got(g)($1)
; MIPS32-O32-NEXT:    lh $2, 0($1)
; MIPS32-O32-NEXT:    fill.h $w0, $2
; MIPS32-O32-NEXT:    fexupr.w $w0, $w0
; MIPS32-O32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-O32-NEXT:    mtc1 $2, $f0
; MIPS32-O32-NEXT:    madd.s $f0, $f14, $f0, $f12
; MIPS32-O32-NEXT:    mfc1 $2, $f0
; MIPS32-O32-NEXT:    fill.w $w0, $2
; MIPS32-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-O32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-O32-NEXT:    jr $ra
; MIPS32-O32-NEXT:    sh $2, 0($1)
;
; MIPS64R5-N32-LABEL: ffmuladd:
; MIPS64R5-N32:       # %bb.0: # %entry
; MIPS64R5-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffmuladd)))
; MIPS64R5-N32-NEXT:    addu $1, $1, $25
; MIPS64R5-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
; MIPS64R5-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64R5-N32-NEXT:    lh $2, 0($1)
; MIPS64R5-N32-NEXT:    fill.h $w0, $2
; MIPS64R5-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64R5-N32-NEXT:    mtc1 $2, $f0
; MIPS64R5-N32-NEXT:    madd.s $f0, $f13, $f0, $f12
; MIPS64R5-N32-NEXT:    mfc1 $2, $f0
; MIPS64R5-N32-NEXT:    fill.w $w0, $2
; MIPS64R5-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64R5-N32-NEXT:    jr $ra
; MIPS64R5-N32-NEXT:    sh $2, 0($1)
;
; MIPS64R5-N64-LABEL: ffmuladd:
; MIPS64R5-N64:       # %bb.0: # %entry
; MIPS64R5-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffmuladd)))
; MIPS64R5-N64-NEXT:    daddu $1, $1, $25
; MIPS64R5-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
; MIPS64R5-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64R5-N64-NEXT:    lh $2, 0($1)
; MIPS64R5-N64-NEXT:    fill.h $w0, $2
; MIPS64R5-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64R5-N64-NEXT:    mtc1 $2, $f0
; MIPS64R5-N64-NEXT:    madd.s $f0, $f13, $f0, $f12
; MIPS64R5-N64-NEXT:    mfc1 $2, $f0
; MIPS64R5-N64-NEXT:    fill.w $w0, $2
; MIPS64R5-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64R5-N64-NEXT:    jr $ra
; MIPS64R5-N64-NEXT:    sh $2, 0($1)
;
; MIPSR6-O32-LABEL: ffmuladd:
; MIPSR6-O32:       # %bb.0: # %entry
; MIPSR6-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPSR6-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPSR6-O32-NEXT:    addu $1, $2, $25
; MIPSR6-O32-NEXT:    lw $1, %got(g)($1)
; MIPSR6-O32-NEXT:    lh $2, 0($1)
; MIPSR6-O32-NEXT:    fill.h $w0, $2
; MIPSR6-O32-NEXT:    fexupr.w $w0, $w0
; MIPSR6-O32-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-O32-NEXT:    mtc1 $2, $f0
; MIPSR6-O32-NEXT:    mul.s $f0, $f0, $f12
; MIPSR6-O32-NEXT:    add.s $f0, $f0, $f14
; MIPSR6-O32-NEXT:    mfc1 $2, $f0
; MIPSR6-O32-NEXT:    fill.w $w0, $2
; MIPSR6-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-O32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-O32-NEXT:    jr $ra
; MIPSR6-O32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N32-LABEL: ffmuladd:
; MIPSR6-N32:       # %bb.0: # %entry
; MIPSR6-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffmuladd)))
; MIPSR6-N32-NEXT:    addu $1, $1, $25
; MIPSR6-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
; MIPSR6-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPSR6-N32-NEXT:    lh $2, 0($1)
; MIPSR6-N32-NEXT:    fill.h $w0, $2
; MIPSR6-N32-NEXT:    fexupr.w $w0, $w0
; MIPSR6-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-N32-NEXT:    mtc1 $2, $f0
; MIPSR6-N32-NEXT:    mul.s $f0, $f0, $f12
; MIPSR6-N32-NEXT:    add.s $f0, $f0, $f13
; MIPSR6-N32-NEXT:    mfc1 $2, $f0
; MIPSR6-N32-NEXT:    fill.w $w0, $2
; MIPSR6-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N32-NEXT:    jr $ra
; MIPSR6-N32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N64-LABEL: ffmuladd:
; MIPSR6-N64:       # %bb.0: # %entry
; MIPSR6-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffmuladd)))
; MIPSR6-N64-NEXT:    daddu $1, $1, $25
; MIPSR6-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
; MIPSR6-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPSR6-N64-NEXT:    lh $2, 0($1)
; MIPSR6-N64-NEXT:    fill.h $w0, $2
; MIPSR6-N64-NEXT:    fexupr.w $w0, $w0
; MIPSR6-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPSR6-N64-NEXT:    mtc1 $2, $f0
; MIPSR6-N64-NEXT:    mul.s $f0, $f0, $f12
; MIPSR6-N64-NEXT:    add.s $f0, $f0, $f13
; MIPSR6-N64-NEXT:    mfc1 $2, $f0
; MIPSR6-N64-NEXT:    fill.w $w0, $2
; MIPSR6-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N64-NEXT:    jr $ra
; MIPSR6-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)

; MIPS32-N32:     madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12
; MIPS32-N64:     madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12

  %fmuladd = call float @llvm.fmuladd.f32(float %1, float %b, float %c)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %fmuladd)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.fabs.f32(float %Val)

define void @ffabs() {
; MIPS32-LABEL: ffabs:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mtc1 $2, $f0
; MIPS32-NEXT:    abs.s $f0, $f0
; MIPS32-NEXT:    mfc1 $2, $f0
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: ffabs:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffabs)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(ffabs)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mtc1 $2, $f0
; MIPS64-N32-NEXT:    abs.s $f0, $f0
; MIPS64-N32-NEXT:    mfc1 $2, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: ffabs:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffabs)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(ffabs)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mtc1 $2, $f0
; MIPS64-N64-NEXT:    abs.s $f0, $f0
; MIPS64-N64-NEXT:    mfc1 $2, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %fabs = call float @llvm.fabs.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %fabs)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.minnum.f32(float %Val, float %b)

define void @fminnum(float %b) {
; MIPS32-O32-LABEL: fminnum:
; MIPS32-O32:       # %bb.0: # %entry
; MIPS32-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-O32-NEXT:    addiu $sp, $sp, -24
; MIPS32-O32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-O32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-O32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-O32-NEXT:    .cfi_offset 31, -4
; MIPS32-O32-NEXT:    .cfi_offset 16, -8
; MIPS32-O32-NEXT:    addu $gp, $2, $25
; MIPS32-O32-NEXT:    mov.s $f14, $f12
; MIPS32-O32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-O32-NEXT:    lh $1, 0($16)
; MIPS32-O32-NEXT:    fill.h $w0, $1
; MIPS32-O32-NEXT:    fexupr.w $w0, $w0
; MIPS32-O32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-O32-NEXT:    lw $25, %call16(fminf)($gp)
; MIPS32-O32-NEXT:    jalr $25
; MIPS32-O32-NEXT:    mtc1 $1, $f12
; MIPS32-O32-NEXT:    mfc1 $1, $f0
; MIPS32-O32-NEXT:    fill.w $w0, $1
; MIPS32-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-O32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-O32-NEXT:    sh $1, 0($16)
; MIPS32-O32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-O32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-O32-NEXT:    jr $ra
; MIPS32-O32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64R5-N32-LABEL: fminnum:
; MIPS64R5-N32:       # %bb.0: # %entry
; MIPS64R5-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64R5-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64R5-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    .cfi_offset 31, -8
; MIPS64R5-N32-NEXT:    .cfi_offset 28, -16
; MIPS64R5-N32-NEXT:    .cfi_offset 16, -24
; MIPS64R5-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fminnum)))
; MIPS64R5-N32-NEXT:    addu $1, $1, $25
; MIPS64R5-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
; MIPS64R5-N32-NEXT:    mov.s $f13, $f12
; MIPS64R5-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64R5-N32-NEXT:    lh $1, 0($16)
; MIPS64R5-N32-NEXT:    fill.h $w0, $1
; MIPS64R5-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64R5-N32-NEXT:    lw $25, %call16(fminf)($gp)
; MIPS64R5-N32-NEXT:    jalr $25
; MIPS64R5-N32-NEXT:    mtc1 $1, $f12
; MIPS64R5-N32-NEXT:    mfc1 $1, $f0
; MIPS64R5-N32-NEXT:    fill.w $w0, $1
; MIPS64R5-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64R5-N32-NEXT:    sh $1, 0($16)
; MIPS64R5-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    jr $ra
; MIPS64R5-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64R5-N64-LABEL: fminnum:
; MIPS64R5-N64:       # %bb.0: # %entry
; MIPS64R5-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64R5-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64R5-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    .cfi_offset 31, -8
; MIPS64R5-N64-NEXT:    .cfi_offset 28, -16
; MIPS64R5-N64-NEXT:    .cfi_offset 16, -24
; MIPS64R5-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fminnum)))
; MIPS64R5-N64-NEXT:    daddu $1, $1, $25
; MIPS64R5-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
; MIPS64R5-N64-NEXT:    mov.s $f13, $f12
; MIPS64R5-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64R5-N64-NEXT:    lh $1, 0($16)
; MIPS64R5-N64-NEXT:    fill.h $w0, $1
; MIPS64R5-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64R5-N64-NEXT:    ld $25, %call16(fminf)($gp)
; MIPS64R5-N64-NEXT:    jalr $25
; MIPS64R5-N64-NEXT:    mtc1 $1, $f12
; MIPS64R5-N64-NEXT:    mfc1 $1, $f0
; MIPS64R5-N64-NEXT:    fill.w $w0, $1
; MIPS64R5-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64R5-N64-NEXT:    sh $1, 0($16)
; MIPS64R5-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    jr $ra
; MIPS64R5-N64-NEXT:    daddiu $sp, $sp, 32
;
; MIPSR6-O32-LABEL: fminnum:
; MIPSR6-O32:       # %bb.0: # %entry
; MIPSR6-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPSR6-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPSR6-O32-NEXT:    addu $1, $2, $25
; MIPSR6-O32-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-O32-NEXT:    lw $1, %got(g)($1)
; MIPSR6-O32-NEXT:    lh $2, 0($1)
; MIPSR6-O32-NEXT:    fill.h $w1, $2
; MIPSR6-O32-NEXT:    fexupr.w $w1, $w1
; MIPSR6-O32-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-O32-NEXT:    mtc1 $2, $f1
; MIPSR6-O32-NEXT:    min.s $f0, $f1, $f0
; MIPSR6-O32-NEXT:    mfc1 $2, $f0
; MIPSR6-O32-NEXT:    fill.w $w0, $2
; MIPSR6-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-O32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-O32-NEXT:    jr $ra
; MIPSR6-O32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N32-LABEL: fminnum:
; MIPSR6-N32:       # %bb.0: # %entry
; MIPSR6-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fminnum)))
; MIPSR6-N32-NEXT:    addu $1, $1, $25
; MIPSR6-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fminnum)))
; MIPSR6-N32-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPSR6-N32-NEXT:    lh $2, 0($1)
; MIPSR6-N32-NEXT:    fill.h $w1, $2
; MIPSR6-N32-NEXT:    fexupr.w $w1, $w1
; MIPSR6-N32-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-N32-NEXT:    mtc1 $2, $f1
; MIPSR6-N32-NEXT:    min.s $f0, $f1, $f0
; MIPSR6-N32-NEXT:    mfc1 $2, $f0
; MIPSR6-N32-NEXT:    fill.w $w0, $2
; MIPSR6-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N32-NEXT:    jr $ra
; MIPSR6-N32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N64-LABEL: fminnum:
; MIPSR6-N64:       # %bb.0: # %entry
; MIPSR6-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fminnum)))
; MIPSR6-N64-NEXT:    daddu $1, $1, $25
; MIPSR6-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fminnum)))
; MIPSR6-N64-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPSR6-N64-NEXT:    lh $2, 0($1)
; MIPSR6-N64-NEXT:    fill.h $w1, $2
; MIPSR6-N64-NEXT:    fexupr.w $w1, $w1
; MIPSR6-N64-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-N64-NEXT:    mtc1 $2, $f1
; MIPSR6-N64-NEXT:    min.s $f0, $f1, $f0
; MIPSR6-N64-NEXT:    mfc1 $2, $f0
; MIPSR6-N64-NEXT:    fill.w $w0, $2
; MIPSR6-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N64-NEXT:    jr $ra
; MIPSR6-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %minnum = call float @llvm.minnum.f32(float %1, float %b)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %minnum)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.maxnum.f32(float %Val, float %b)

define void @fmaxnum(float %b) {
; MIPS32-O32-LABEL: fmaxnum:
; MIPS32-O32:       # %bb.0: # %entry
; MIPS32-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-O32-NEXT:    addiu $sp, $sp, -24
; MIPS32-O32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-O32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-O32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-O32-NEXT:    .cfi_offset 31, -4
; MIPS32-O32-NEXT:    .cfi_offset 16, -8
; MIPS32-O32-NEXT:    addu $gp, $2, $25
; MIPS32-O32-NEXT:    mov.s $f14, $f12
; MIPS32-O32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-O32-NEXT:    lh $1, 0($16)
; MIPS32-O32-NEXT:    fill.h $w0, $1
; MIPS32-O32-NEXT:    fexupr.w $w0, $w0
; MIPS32-O32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-O32-NEXT:    lw $25, %call16(fmaxf)($gp)
; MIPS32-O32-NEXT:    jalr $25
; MIPS32-O32-NEXT:    mtc1 $1, $f12
; MIPS32-O32-NEXT:    mfc1 $1, $f0
; MIPS32-O32-NEXT:    fill.w $w0, $1
; MIPS32-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-O32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-O32-NEXT:    sh $1, 0($16)
; MIPS32-O32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-O32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-O32-NEXT:    jr $ra
; MIPS32-O32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64R5-N32-LABEL: fmaxnum:
; MIPS64R5-N32:       # %bb.0: # %entry
; MIPS64R5-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64R5-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64R5-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64R5-N32-NEXT:    .cfi_offset 31, -8
; MIPS64R5-N32-NEXT:    .cfi_offset 28, -16
; MIPS64R5-N32-NEXT:    .cfi_offset 16, -24
; MIPS64R5-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fmaxnum)))
; MIPS64R5-N32-NEXT:    addu $1, $1, $25
; MIPS64R5-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
; MIPS64R5-N32-NEXT:    mov.s $f13, $f12
; MIPS64R5-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64R5-N32-NEXT:    lh $1, 0($16)
; MIPS64R5-N32-NEXT:    fill.h $w0, $1
; MIPS64R5-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64R5-N32-NEXT:    lw $25, %call16(fmaxf)($gp)
; MIPS64R5-N32-NEXT:    jalr $25
; MIPS64R5-N32-NEXT:    mtc1 $1, $f12
; MIPS64R5-N32-NEXT:    mfc1 $1, $f0
; MIPS64R5-N32-NEXT:    fill.w $w0, $1
; MIPS64R5-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64R5-N32-NEXT:    sh $1, 0($16)
; MIPS64R5-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64R5-N32-NEXT:    jr $ra
; MIPS64R5-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64R5-N64-LABEL: fmaxnum:
; MIPS64R5-N64:       # %bb.0: # %entry
; MIPS64R5-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64R5-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64R5-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64R5-N64-NEXT:    .cfi_offset 31, -8
; MIPS64R5-N64-NEXT:    .cfi_offset 28, -16
; MIPS64R5-N64-NEXT:    .cfi_offset 16, -24
; MIPS64R5-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fmaxnum)))
; MIPS64R5-N64-NEXT:    daddu $1, $1, $25
; MIPS64R5-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
; MIPS64R5-N64-NEXT:    mov.s $f13, $f12
; MIPS64R5-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64R5-N64-NEXT:    lh $1, 0($16)
; MIPS64R5-N64-NEXT:    fill.h $w0, $1
; MIPS64R5-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64R5-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64R5-N64-NEXT:    ld $25, %call16(fmaxf)($gp)
; MIPS64R5-N64-NEXT:    jalr $25
; MIPS64R5-N64-NEXT:    mtc1 $1, $f12
; MIPS64R5-N64-NEXT:    mfc1 $1, $f0
; MIPS64R5-N64-NEXT:    fill.w $w0, $1
; MIPS64R5-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64R5-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64R5-N64-NEXT:    sh $1, 0($16)
; MIPS64R5-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64R5-N64-NEXT:    jr $ra
; MIPS64R5-N64-NEXT:    daddiu $sp, $sp, 32
;
; MIPSR6-O32-LABEL: fmaxnum:
; MIPSR6-O32:       # %bb.0: # %entry
; MIPSR6-O32-NEXT:    lui $2, %hi(_gp_disp)
; MIPSR6-O32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPSR6-O32-NEXT:    addu $1, $2, $25
; MIPSR6-O32-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-O32-NEXT:    lw $1, %got(g)($1)
; MIPSR6-O32-NEXT:    lh $2, 0($1)
; MIPSR6-O32-NEXT:    fill.h $w1, $2
; MIPSR6-O32-NEXT:    fexupr.w $w1, $w1
; MIPSR6-O32-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-O32-NEXT:    mtc1 $2, $f1
; MIPSR6-O32-NEXT:    max.s $f0, $f1, $f0
; MIPSR6-O32-NEXT:    mfc1 $2, $f0
; MIPSR6-O32-NEXT:    fill.w $w0, $2
; MIPSR6-O32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-O32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-O32-NEXT:    jr $ra
; MIPSR6-O32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N32-LABEL: fmaxnum:
; MIPSR6-N32:       # %bb.0: # %entry
; MIPSR6-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fmaxnum)))
; MIPSR6-N32-NEXT:    addu $1, $1, $25
; MIPSR6-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fmaxnum)))
; MIPSR6-N32-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPSR6-N32-NEXT:    lh $2, 0($1)
; MIPSR6-N32-NEXT:    fill.h $w1, $2
; MIPSR6-N32-NEXT:    fexupr.w $w1, $w1
; MIPSR6-N32-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-N32-NEXT:    mtc1 $2, $f1
; MIPSR6-N32-NEXT:    max.s $f0, $f1, $f0
; MIPSR6-N32-NEXT:    mfc1 $2, $f0
; MIPSR6-N32-NEXT:    fill.w $w0, $2
; MIPSR6-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N32-NEXT:    jr $ra
; MIPSR6-N32-NEXT:    sh $2, 0($1)
;
; MIPSR6-N64-LABEL: fmaxnum:
; MIPSR6-N64:       # %bb.0: # %entry
; MIPSR6-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fmaxnum)))
; MIPSR6-N64-NEXT:    daddu $1, $1, $25
; MIPSR6-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fmaxnum)))
; MIPSR6-N64-NEXT:    min.s $f0, $f12, $f12
; MIPSR6-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPSR6-N64-NEXT:    lh $2, 0($1)
; MIPSR6-N64-NEXT:    fill.h $w1, $2
; MIPSR6-N64-NEXT:    fexupr.w $w1, $w1
; MIPSR6-N64-NEXT:    copy_s.w $2, $w1[0]
; MIPSR6-N64-NEXT:    mtc1 $2, $f1
; MIPSR6-N64-NEXT:    max.s $f0, $f1, $f0
; MIPSR6-N64-NEXT:    mfc1 $2, $f0
; MIPSR6-N64-NEXT:    fill.w $w0, $2
; MIPSR6-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPSR6-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPSR6-N64-NEXT:    jr $ra
; MIPSR6-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %maxnum = call float @llvm.maxnum.f32(float %1, float %b)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %maxnum)


  store i16 %2, ptr @g, align 2

  ret void
}

; This expansion of fcopysign could be done without converting f16 to float.

declare float @llvm.copysign.f32(float %Val, float %b)

define void @fcopysign(float %b) {
; MIPS32-LABEL: fcopysign:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addu $1, $2, $25
; MIPS32-NEXT:    lw $1, %got(g)($1)
; MIPS32-NEXT:    lh $2, 0($1)
; MIPS32-NEXT:    fill.h $w0, $2
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $2, $w0[0]
; MIPS32-NEXT:    mfc1 $3, $f12
; MIPS32-NEXT:    ext $3, $3, 31, 1
; MIPS32-NEXT:    ins $2, $3, 31, 1
; MIPS32-NEXT:    fill.w $w0, $2
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $2, $w0[0]
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    sh $2, 0($1)
;
; MIPS64-N32-LABEL: fcopysign:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fcopysign)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))
; MIPS64-N32-NEXT:    lw $1, %got_disp(g)($1)
; MIPS64-N32-NEXT:    lh $2, 0($1)
; MIPS64-N32-NEXT:    fill.h $w0, $2
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N32-NEXT:    mfc1 $3, $f12
; MIPS64-N32-NEXT:    ext $3, $3, 31, 1
; MIPS64-N32-NEXT:    ins $2, $3, 31, 1
; MIPS64-N32-NEXT:    fill.w $w0, $2
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    sh $2, 0($1)
;
; MIPS64-N64-LABEL: fcopysign:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fcopysign)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))
; MIPS64-N64-NEXT:    ld $1, %got_disp(g)($1)
; MIPS64-N64-NEXT:    lh $2, 0($1)
; MIPS64-N64-NEXT:    fill.h $w0, $2
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $2, $w0[0]
; MIPS64-N64-NEXT:    mfc1 $3, $f12
; MIPS64-N64-NEXT:    ext $3, $3, 31, 1
; MIPS64-N64-NEXT:    ins $2, $3, 31, 1
; MIPS64-N64-NEXT:    fill.w $w0, $2
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $2, $w0[0]
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    sh $2, 0($1)
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %copysign = call float @llvm.copysign.f32(float %1, float %b)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %copysign)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.floor.f32(float %Val)

define void @ffloor() {
; MIPS32-LABEL: ffloor:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(floorf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: ffloor:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ffloor)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(floorf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: ffloor:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ffloor)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(floorf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %floor = call float @llvm.floor.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %floor)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.ceil.f32(float %Val)

define void @fceil() {
; MIPS32-LABEL: fceil:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(ceilf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fceil:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fceil)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fceil)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(ceilf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fceil:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fceil)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fceil)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(ceilf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %ceil = call float @llvm.ceil.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %ceil)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.trunc.f32(float %Val)

define void @ftrunc() {
; MIPS32-LABEL: ftrunc:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(truncf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: ftrunc:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(ftrunc)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(truncf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: ftrunc:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(ftrunc)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(truncf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %trunc = call float @llvm.trunc.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %trunc)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.rint.f32(float %Val)

define void @frint() {
; MIPS32-LABEL: frint:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(rintf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: frint:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(frint)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(frint)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(rintf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: frint:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(frint)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(frint)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(rintf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)

  %rint = call float @llvm.rint.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %rint)

  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.nearbyint.f32(float %Val)

define void @fnearbyint() {
; MIPS32-LABEL: fnearbyint:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(nearbyintf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fnearbyint:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fnearbyint)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(nearbyintf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fnearbyint:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fnearbyint)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(nearbyintf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %nearbyint = call float @llvm.nearbyint.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %nearbyint)


  store i16 %2, ptr @g, align 2

  ret void
}

declare float @llvm.round.f32(float %Val)

define void @fround() {
; MIPS32-LABEL: fround:
; MIPS32:       # %bb.0: # %entry
; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
; MIPS32-NEXT:    addiu $sp, $sp, -24
; MIPS32-NEXT:    .cfi_def_cfa_offset 24
; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
; MIPS32-NEXT:    .cfi_offset 31, -4
; MIPS32-NEXT:    .cfi_offset 16, -8
; MIPS32-NEXT:    addu $gp, $2, $25
; MIPS32-NEXT:    lw $16, %got(g)($gp)
; MIPS32-NEXT:    lh $1, 0($16)
; MIPS32-NEXT:    fill.h $w0, $1
; MIPS32-NEXT:    fexupr.w $w0, $w0
; MIPS32-NEXT:    copy_s.w $1, $w0[0]
; MIPS32-NEXT:    lw $25, %call16(roundf)($gp)
; MIPS32-NEXT:    jalr $25
; MIPS32-NEXT:    mtc1 $1, $f12
; MIPS32-NEXT:    mfc1 $1, $f0
; MIPS32-NEXT:    fill.w $w0, $1
; MIPS32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS32-NEXT:    copy_u.h $1, $w0[0]
; MIPS32-NEXT:    sh $1, 0($16)
; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
; MIPS32-NEXT:    jr $ra
; MIPS32-NEXT:    addiu $sp, $sp, 24
;
; MIPS64-N32-LABEL: fround:
; MIPS64-N32:       # %bb.0: # %entry
; MIPS64-N32-NEXT:    addiu $sp, $sp, -32
; MIPS64-N32-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N32-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N32-NEXT:    .cfi_offset 31, -8
; MIPS64-N32-NEXT:    .cfi_offset 28, -16
; MIPS64-N32-NEXT:    .cfi_offset 16, -24
; MIPS64-N32-NEXT:    lui $1, %hi(%neg(%gp_rel(fround)))
; MIPS64-N32-NEXT:    addu $1, $1, $25
; MIPS64-N32-NEXT:    addiu $gp, $1, %lo(%neg(%gp_rel(fround)))
; MIPS64-N32-NEXT:    lw $16, %got_disp(g)($gp)
; MIPS64-N32-NEXT:    lh $1, 0($16)
; MIPS64-N32-NEXT:    fill.h $w0, $1
; MIPS64-N32-NEXT:    fexupr.w $w0, $w0
; MIPS64-N32-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N32-NEXT:    lw $25, %call16(roundf)($gp)
; MIPS64-N32-NEXT:    jalr $25
; MIPS64-N32-NEXT:    mtc1 $1, $f12
; MIPS64-N32-NEXT:    mfc1 $1, $f0
; MIPS64-N32-NEXT:    fill.w $w0, $1
; MIPS64-N32-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N32-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N32-NEXT:    sh $1, 0($16)
; MIPS64-N32-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N32-NEXT:    jr $ra
; MIPS64-N32-NEXT:    addiu $sp, $sp, 32
;
; MIPS64-N64-LABEL: fround:
; MIPS64-N64:       # %bb.0: # %entry
; MIPS64-N64-NEXT:    daddiu $sp, $sp, -32
; MIPS64-N64-NEXT:    .cfi_def_cfa_offset 32
; MIPS64-N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $gp, 16($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
; MIPS64-N64-NEXT:    .cfi_offset 31, -8
; MIPS64-N64-NEXT:    .cfi_offset 28, -16
; MIPS64-N64-NEXT:    .cfi_offset 16, -24
; MIPS64-N64-NEXT:    lui $1, %hi(%neg(%gp_rel(fround)))
; MIPS64-N64-NEXT:    daddu $1, $1, $25
; MIPS64-N64-NEXT:    daddiu $gp, $1, %lo(%neg(%gp_rel(fround)))
; MIPS64-N64-NEXT:    ld $16, %got_disp(g)($gp)
; MIPS64-N64-NEXT:    lh $1, 0($16)
; MIPS64-N64-NEXT:    fill.h $w0, $1
; MIPS64-N64-NEXT:    fexupr.w $w0, $w0
; MIPS64-N64-NEXT:    copy_s.w $1, $w0[0]
; MIPS64-N64-NEXT:    ld $25, %call16(roundf)($gp)
; MIPS64-N64-NEXT:    jalr $25
; MIPS64-N64-NEXT:    mtc1 $1, $f12
; MIPS64-N64-NEXT:    mfc1 $1, $f0
; MIPS64-N64-NEXT:    fill.w $w0, $1
; MIPS64-N64-NEXT:    fexdo.h $w0, $w0, $w0
; MIPS64-N64-NEXT:    copy_u.h $1, $w0[0]
; MIPS64-N64-NEXT:    sh $1, 0($16)
; MIPS64-N64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $gp, 16($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
; MIPS64-N64-NEXT:    jr $ra
; MIPS64-N64-NEXT:    daddiu $sp, $sp, 32
entry:
  %0 = load i16, ptr @g, align 2
  %1 = call float @llvm.convert.from.fp16.f32(i16 %0)


  %round = call float @llvm.round.f32(float %1)
  %2 = call i16 @llvm.convert.to.fp16.f32(float %round)


  store i16 %2, ptr @g, align 2

  ret void
}