---
title: 选项 -fuaddsub-overflow-match-all,-fif-conversion-gimple
description: "Arm 相关指令合并优化，实现低位乘法算法的识别，并以高效的高位乘法指令输出。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0040.html
sourcePath: /source/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0040.html
indexId: e932ed04e60a8108fb4548060635e04d830e71234d27042fe25a93ae9cb240ed71
---
# 选项 -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位乘法计算。
