选项 -fuaddsub-overflow-match-all和-fif-conversion-gimple
说明
Arm 相关指令合并优化,实现低位乘法算法的识别,并以高效的高位乘法指令输出。
使用方法
使用-fuaddsub-overflow-match-all和-fif-conversion-gimple选项使能优化。
注:此优化需要-O2及以上优化等级以及-ftree-fold-phiopt选项共同使用。
注:此优化和-fmerge-mull功能类似,但能优化更全面的场景,例如8位数乘8位数、16位数乘16位数等等。
结果
测试用例如下:
#include <stdint.h> typedef unsigned __int128 uint128_t; uint128_t mul128_perm (uint64_t a, uint64_t b) { uint64_t a_lo = a & 0xFFFFFFFF; uint64_t b_lo = b & 0xFFFFFFFF; uint64_t a_hi = a >> 32; uint64_t b_hi = b >> 32; uint64_t lolo = a_lo * b_lo; uint64_t lohi = a_lo * b_hi; uint64_t hilo = a_hi * b_lo; uint64_t hihi = a_hi * b_hi; uint64_t middle = hilo + lohi; uint64_t middle_hi = middle >> 32; uint64_t middle_lo = middle << 32; uint64_t res_lo = lolo + middle_lo; uint64_t res_hi = hihi + middle_hi; res_hi = res_lo < middle_lo ? res_hi + 1 : res_hi; res_hi = middle < hilo ? res_hi + 0x100000000 : res_hi; uint128_t res = ((uint128_t) res_hi) << 64; res += res_lo; return res; }
测试命令:
gcc -O2 -ftree-fold-phiopt -fif-conversion-gimple -fuaddsub-overflow-match-all -S test.c -o test.s
图1 选项未打开

图2 选项已经打开

相比选项未打开时,选项打开后,生成的汇编代码指令使用umulh和mul做了64位乘法的优化计算。
父主题: 静态编译优化