如何使用arm v7获取Q寄存器(int64x2_t)的绝对值?

如何使用arm v7获取Q寄存器(int64x2_t)的绝对值?,arm,neon,Arm,Neon,例如: int64x2_t a{1,-1}; 自动abs_val=vabsq_s64a//但这一内在特性仅适用于A64或A64体系结构。 谢谢 如果你正在做大量的64位操作,那么你真的应该对你的硬件三思而后行;ARMv7上有许多功能缺少64位版本,因此如果您可以升级到AArch64,您真的应该这样做。假设你没有这个选择 基本上,vabsq_s64对每条车道的作用如下: res[i]=a[i]

例如:

int64x2_t a{1,-1}; 自动abs_val=vabsq_s64a//但这一内在特性仅适用于A64或A64体系结构。
谢谢

如果你正在做大量的64位操作,那么你真的应该对你的硬件三思而后行;ARMv7上有许多功能缺少64位版本,因此如果您可以升级到AArch64,您真的应该这样做。假设你没有这个选择

基本上,vabsq_s64对每条车道的作用如下:

res[i]=a[i]<0-a[i]:a[i]; 您只需要使用其他内在函数就可以做到这一点

让我们先处理否定。霓虹灯有一个功能可以做到这一点,但它只有AArch64。但是,我们可以从0中减去a:vsubq_s64vdupq_n_s640,a

现在我们必须在否定值和原始值之间进行选择,原始值是。vbslq_s64的第一个参数是一个掩码,用于确定要获取每个位的值的其他参数中的哪一个。基本上,vbslq_s64a,b,c在逻辑上类似于a&b | ~a&c

为了使用vbslq_s64,我们首先需要一个掩码,当我们想要使用一个值时,该掩码在一个通道中包含所有零,当我们想要使用另一个值时,该掩码包含所有零。如果你在AArch64上,我会说用,但我们不是。偶数仅为AArch64,但这没关系,因为还有更好的方法……只要使用正确的算术移位,它将移位符号位1表示负数,0表示正数。您希望将符号位广播到每个通道中的每个位,因此对于64位值,它将是vshrq_n_s64a,63

当然,vbslq_s64将uint64x2_t作为第一个参数,但您拥有的是int64x2_t,因此您需要使用来转换

总而言之:

int64x2\u t我的vabsq\u s64int64x2\u t a{ 返回vbslq_s64 vreinterpretq_u64_s64vshrq_n_s64a,63, vsubq_s64vdupq_n_s640,a, A. }
如果你正在做大量的64位操作,你真的应该对你的硬件三思而后行;ARMv7上有许多功能缺少64位版本,因此如果您可以升级到AArch64,您真的应该这样做。假设你没有这个选择

基本上,vabsq_s64对每条车道的作用如下:

res[i]=a[i]<0-a[i]:a[i]; 您只需要使用其他内在函数就可以做到这一点

让我们先处理否定。霓虹灯有一个功能可以做到这一点,但它只有AArch64。但是,我们可以从0中减去a:vsubq_s64vdupq_n_s640,a

现在我们必须在否定值和原始值之间进行选择,原始值是。vbslq_s64的第一个参数是一个掩码,用于确定要获取每个位的值的其他参数中的哪一个。基本上,vbslq_s64a,b,c在逻辑上类似于a&b | ~a&c

为了使用vbslq_s64,我们首先需要一个掩码,当我们想要使用一个值时,该掩码在一个通道中包含所有零,当我们想要使用另一个值时,该掩码包含所有零。如果你在AArch64上,我会说用,但我们不是。偶数仅为AArch64,但这没关系,因为还有更好的方法……只要使用正确的算术移位,它将移位符号位1表示负数,0表示正数。您希望将符号位广播到每个通道中的每个位,因此对于64位值,它将是vshrq_n_s64a,63

当然,vbslq_s64将uint64x2_t作为第一个参数,但您拥有的是int64x2_t,因此您需要使用来转换

总而言之:

int64x2\u t我的vabsq\u s64int64x2\u t a{ 返回vbslq_s64 vreinterpretq_u64_s64vshrq_n_s64a,63, vsubq_s64vdupq_n_s640,a, A. }
绝对惊人!!!谢谢你,先生。我可以两次向AARC64了解该设备,但它需要与旧的armv7安卓设备兼容。我使用宏aarch64决定应该使用哪个版本的代码。绝对令人惊奇!!!谢谢你,先生。我可以两次向AARC64了解该设备,但它需要与旧的armv7安卓设备兼容。我使用宏aarch64决定应该使用哪个版本的代码。