55 lines
761 B
ArmAsm
55 lines
761 B
ArmAsm
.file "frnd.s"
|
|
.section .text
|
|
.proc _frnd#
|
|
.align 32
|
|
.global _frnd#
|
|
.align 32
|
|
|
|
_frnd:
|
|
|
|
// CONVERT BEGINS HERE WITH ARGUMENT IN f8
|
|
{ .mmi
|
|
// save the old fpsr in r2
|
|
mov r2=ar40;;
|
|
mov r3=r2
|
|
nop.i 0
|
|
} { .mlx
|
|
nop.m 0
|
|
movl r8=0x02000;;
|
|
} { .mmi
|
|
// clear sf0.V bit in r3
|
|
andcm r3=r3,r8;;
|
|
// set traps.PDV
|
|
or r3=0x23,r3
|
|
nop.i 0;;
|
|
} { .mib
|
|
mov ar40=r3
|
|
nop.i 0
|
|
nop.b 0;;
|
|
} { .mfi
|
|
nop.m 0
|
|
fcvt.fx.s0 f7=f8
|
|
nop.i 0;;
|
|
} { .mmi
|
|
mov r3=ar40;;
|
|
nop.m 0
|
|
// examine the sf0.V bit (p6 = 1 if sf0.V set)
|
|
tbit.z p6,p7=r3,0x0d;;
|
|
} { .mfb
|
|
nop.m 0
|
|
(p6) fcvt.xf f8=f7
|
|
nop.b 0;;
|
|
}
|
|
// CONVERT ENDS HERE WITH RESULT IN f8
|
|
done:
|
|
{ .mmb
|
|
mov ar40=r2
|
|
// store result
|
|
nop.m 0
|
|
// return
|
|
br.ret.sptk b0;;
|
|
}
|
|
|
|
.endp _frnd
|
|
|