小编apr*_*lev的帖子

GCC为数组元素的重复XOR生成冗余代码

GCC让我很难为以下源代码生成最佳程序集:

memset(X, 0, 16);
for (int i= 0; i < 16; ++i) {
    X[0] ^= table[i][Y[i]].asQWord;
}
Run Code Online (Sandbox Code Playgroud)

X作为一个uint64_t[2]数组,并且
Y是一个unsigned char[16]数组,并且
table是一个双维数组union qword_t:

union qword_t {
    uint8_t asBytes[8];
    uint64_t asQWord;
};

const union qword_t table[16][256] = /* ... */;
Run Code Online (Sandbox Code Playgroud)

使用选项时,-m64 -Ofast -mno-sse它会展开循环,每个xor和赋值会产生3条指令(因此发出的指令总数为3*16 = 48):

movzx  r9d, byte ptr [Y + i]                   ; extracting byte
xor    rax, qword ptr [table + r9*8 + SHIFT]   ; xoring, SHIFT = i …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc compiler-optimization

20
推荐指数
2
解决办法
2118
查看次数

标签 统计

assembly ×1

c ×1

compiler-optimization ×1

gcc ×1