.global fmod
fmod:
vcmp.f64 d1, #0
vmrs APSR_nzcv,FPSCR
beq NaN
vabs.f64 d2, d1
vabs.f64 d3, d0
find_largest_n:
vcmp.f64 d3, d2
vmrs APSR_nzcv,FPSCR
blt finish
vsub.f64 d3, d3, d2
b find_largest_n
finish:
vcmp.f64 d0, #0 @check the sign of the original dividend
vmrs APSR_nzcv,FPSCR
bge check_divisor
vneg.f64 d3, d3 @ Negate d3 if the dividend is negativ
check_divisor:
vcmp.f64 d1, #0 @check the sign o f the original divisor
vmrs APSR_nzcv,FPSCR
bge persist
vneg.f64 d3, d3 @ negate again if the original divisor ws negative
persist:
vmov r0, r1, d3
bx lr
NaN: @for non-numbers
@ Assuming the NaN constant is at label nan_constant
ldr r0, =nan_constant
ldrd r0, r1, [r0]
bx lr
.section .data
nan_constant:
.quad 0x7ff8000000000000 @constant NaN for double precision
1条答案
按热度按时间0dxa2lsx1#
我很久没碰ARM了,但据我所知,没有
fprem
。你可以使用vcvt
。阅读了这个 neon docs,我看到利用NEON指令是可能的。在this部分,您可以找到有关FP寄存器的文档。
This文档将帮助您使用
vcvt
下面是如何使用
vcvt
实现的。字符串
感谢Peter Cordes指出原始答案不足以处理较大的输入。因此,我试图实现一个全面的答案为ARM与双精度输入。在这个答案中,我们还涵盖了一些边缘情况,如符号和NAN。
我试图得到两个设计,其中第一双精度浮点数和第二;单精度浮点数。
以下代码将涵盖双精度输入(Double)。对于32位系统,您可以将
d
寄存器与s
交换。实现或多或少会是这样的。我用更大的输入进行了测试,得到了足够的结果。对于
nan_constant
,可以使用0x7fc00000
型