forked from OSchip/llvm-project
3313 lines
119 KiB
LLVM
3313 lines
119 KiB
LLVM
; 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=ALL,MIPS32,MIPSR5,MIPS32-O32,MIPS32R5-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=ALL,MIPS64,MIPSR5,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=ALL,MIPS64,MIPSR5,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=ALL,MIPS32,MIPSR6,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=ALL,MIPS64,MIPSR6,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=ALL,MIPS64,MIPSR6,MIPS64-N64,MIPSR6-N64
|
|
|
|
|
|
; Check the use of frame indexes in the msa pseudo f16 instructions.
|
|
|
|
@k = external global float
|
|
|
|
declare float @k2(half *)
|
|
|
|
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, half * %0
|
|
%2 = call float @k2(half * %0)
|
|
store float %2, float * @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, float * @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, half * @h, align 2
|
|
%1 = fpext half %0 to double
|
|
%2 = load half, half * @h, align 2
|
|
%3 = fpext half %2 to double
|
|
%add = fadd double %1, %3
|
|
%4 = fptrunc double %add to half
|
|
store half %4, half * @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, half * @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, half * @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)
|
|
; MIPS64-N32-NEXT: sll $2, $4, 0
|
|
; MIPS64-N32-NEXT: sw $2, 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)
|
|
; MIPS64-N64-NEXT: sll $2, $4, 0
|
|
; MIPS64-N64-NEXT: sw $2, 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, half * @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%2 = load i16, i16* @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, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%2 = load i16, i16* @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, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%2 = load i16, i16* @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, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%2 = load i16, i16* @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, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%2 = load i16, i16* @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, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
%2 = load i16, i16* @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, i16* @i1, align 2
|
|
|
|
ret void
|
|
}
|
|
|
|
declare float @llvm.powi.f32(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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%powi = call float @llvm.powi.f32(float %1, i32 2)
|
|
|
|
|
|
%2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
|
|
|
|
|
|
store i16 %2, i16* @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, i16* @g, align 2
|
|
%1 = call float @llvm.convert.from.fp16.f32(i16 %0)
|
|
|
|
|
|
%powi = call float @llvm.powi.f32(float %1, i32 %var)
|
|
|
|
|
|
%2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
|
|
|
|
|
|
store i16 %2, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @g, align 2
|
|
|
|
ret void
|
|
}
|
|
|
|
declare float @llvm.minnum.f32(float %Val, float %b)
|
|
|
|
define void @fminnum(float %b) {
|
|
; MIPS32-LABEL: fminnum:
|
|
; 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(fminf)($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: fminnum:
|
|
; 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(fminnum)))
|
|
; MIPS64-N32-NEXT: addu $1, $1, $25
|
|
; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
|
|
; 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(fminf)($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: fminnum:
|
|
; 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(fminnum)))
|
|
; MIPS64-N64-NEXT: daddu $1, $1, $25
|
|
; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
|
|
; 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(fminf)($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, i16* @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, i16* @g, align 2
|
|
|
|
ret void
|
|
}
|
|
|
|
declare float @llvm.maxnum.f32(float %Val, float %b)
|
|
|
|
define void @fmaxnum(float %b) {
|
|
; MIPS32-LABEL: fmaxnum:
|
|
; 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(fmaxf)($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: fmaxnum:
|
|
; 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(fmaxnum)))
|
|
; MIPS64-N32-NEXT: addu $1, $1, $25
|
|
; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
|
|
; 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(fmaxf)($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: fmaxnum:
|
|
; 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(fmaxnum)))
|
|
; MIPS64-N64-NEXT: daddu $1, $1, $25
|
|
; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
|
|
; 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(fmaxf)($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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @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, i16* @g, align 2
|
|
|
|
ret void
|
|
}
|