鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

选项 -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位乘法的优化计算。