linux 是否有方法在eBPF中执行带符号除法?

a11xaf1n  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(136)

我尝试在eBPF中执行有符号除法,但是llvm抛出了不支持的错误。有没有办法在eBPF中以任何其他方式(直接/间接)执行有符号除法?

2guxujil

2guxujil1#

eBPF的指令集中没有带符号除法指令。
不过,你还是可以解决这个问题。带符号除法无非是保留两边的异或运算。也就是说,如果其中一方为负,则输出为负,但用负数除负数得到的结果为正。
This是我得出的结果:


# include <stdio.h>

# include <stdint.h>

# include <stdbool.h>

int32_t sdiv(int32_t a, int32_t b) {
    bool aneg = a < 0;
    bool bneg = b < 0;
    // get the absolute positive value of both
    uint32_t adiv = aneg ? -a : a;
    uint32_t bdiv = bneg ? -b : b;
    // Do udiv
    uint32_t out = adiv / bdiv;
    // Make output negative if one or the other is negative, not both
    return aneg != bneg ? -out : out;
}

int main()
{
    printf("%d\n", sdiv(100, 5));
    printf("%d\n", sdiv(-100, 5));
    printf("%d\n", sdiv(100, -5));
    printf("%d\n", sdiv(-100, -5));

    return 0;
}

我相信有更好的方法来做到这一点,但这似乎是工作。

相关问题