Rust 在计算前导/尾随1/0的效率上有什么不同吗?

Rust 在计算前导/尾随1/0的效率上有什么不同吗?,rust,arm,bit-manipulation,x86-64,varint,Rust,Arm,Bit Manipulation,X86 64,Varint,我正在设计一个带前缀的可变长度整数 Rust有计算前导和尾随的1和0的方法: 这些方法在x86_64、arm32和arm64上的效率有什么不同吗 e、 g.如果计算尾随零的速度比尾随零快,在本例中,我将使用XX0111而不是XX1000作为以下三个字节的长度编码字节。在所有三个ISA:x86*、ARM、AArch64上计算尾随零的速度比尾随零快。它们都提供零计数指令,如x86查找最低设置位或x86 BMI1跟踪零计数。计算运行时变量中的前导/尾随数需要对输入求反 ARM/AArch64提供前导零

我正在设计一个带前缀的可变长度整数

Rust有计算前导和尾随的1和0的方法:

这些方法在x86_64、arm32和arm64上的效率有什么不同吗


e、 g.如果计算尾随零的速度比尾随零快,在本例中,我将使用XX0111而不是XX1000作为以下三个字节的长度编码字节。

在所有三个ISA:x86*、ARM、AArch64上计算尾随零的速度比尾随零快。它们都提供零计数指令,如x86查找最低设置位或x86 BMI1跟踪零计数。计算运行时变量中的前导/尾随数需要对输入求反

ARM/AArch64提供前导零计数,但尾随零的最佳选项是rbit/clz到位反转,因为ARMv6t2或ARMv7。在此之前,编译器必须用x&-x分隔最低的集合位,计算其中的前导零,并取31 clzx&-x


在x86上,使用BMI1计算前导零的效率最高。没有它,bsr可以为您提供最高设置位的位置,因此编译器需要31个bsrx来实现clz。在AMD CPU上,bsf/bsr比tzcnt/lzcnt的速度要慢得多,因此如果可能的话,最好使用-march=native或其他与Rust等效的语言进行编译。

在所有3个ISA:x86*、ARM、AArch64上计算尾随零比尾随零快。它们都提供零计数指令,如x86查找最低设置位或x86 BMI1跟踪零计数。计算运行时变量中的前导/尾随数需要对输入求反

ARM/AArch64提供前导零计数,但尾随零的最佳选项是rbit/clz到位反转,因为ARMv6t2或ARMv7。在此之前,编译器必须用x&-x分隔最低的集合位,计算其中的前导零,并取31 clzx&-x


在x86上,使用BMI1计算前导零的效率最高。没有它,bsr可以为您提供最高设置位的位置,因此编译器需要31个bsrx来实现clz。在AMD CPU上,bsf/bsr比tzcnt/lzcnt的速度要慢得多,因此如果可能的话,最好使用-march=native或其他与Rust等效的语言进行编译。

在x86_64、arm32和arm64上?那么支持哪些指令集呢?最好也是最简单的方法就是编写一个小程序,并在这些体系结构上检查生成的程序集。请试一试。还记得x86_64、arm32和arm64上的?那么支持哪些指令集呢?最好也是最简单的方法就是编写一个小程序,并在这些体系结构上检查生成的程序集。请试一试。还记得吗。谢谢,我以前没见过戈德博尔特。rbit可从armv7@Jake'Alquimista'LEE:MyGodbolt链接显示GCC使用带-march=armv6t2的rbit。哦,但显然不是普通的ARMv6。谢谢,我以前没见过godbolt。rbit可从armv7@Jake'Alquimista'LEE:MyGodbolt链接显示GCC使用带-march=armv6t2的rbit。哦,但显然不是普通的ARMv6。