让GCC使用携带逻辑以进行任意精确算术,而无需内联装配?[英] Get GCC To Use Carry Logic For Arbitrary Precision Arithmetic Without Inline Assembly?

本文是小编为大家收集整理的关于让GCC使用携带逻辑以进行任意精确算术,而无需内联装配?的处理方法,想解了让GCC使用携带逻辑以进行任意精确算术,而无需内联装配?的问题怎么解决?让GCC使用携带逻辑以进行任意精确算术,而无需内联装配?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

使用任意精确算术(例如512位整数)时,是否有任何方法可以获取GCC使用ADC和类似说明而无需使用内联汇编?

第一次浏览GMP的Sourcecode表明,它们只是为每个受支持的平台都具有汇编实现.

这是我编写的测试代码,它添加了命令行中的两个128位编号并打印结果. (灵感来自Mini-GMP的add_n):

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
    uint32_t a[4];
    uint32_t b[4];
    uint32_t c[4];
    uint32_t carry = 0;

    for (int i = 0; i < 4; ++i)
    {
        a[i] = strtoul (argv[i+1], NULL, 16);
        b[i] = strtoul (argv[i+5], NULL, 16);
    }

    for (int i = 0; i < 4; ++i)
    {
        uint32_t aa = a[i];
        uint32_t bb = b[i];
        uint32_t r = aa + carry;
        carry = (r < carry);
        r += bb;
        carry += (r < bb);
        c[i] = r;
    }

    printf ("%08X%08X%08X%08X + %08X%08X%08X%08X =\n", a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0]);
    printf ("%08X%08X%08X%08X\n", c[3], c[2], c[1], c[0]);

    return 0;
}

GCC -O3 -std=c99不产生任何adc指令,如objdump检查.我的GCC版本是i686-pc-mingw32-gcc (GCC) 4.5.2.

推荐答案

gcc will 如果如果,它可以看到它需要:
例如,在32位计算机上添加两个uint64_t值时,这必须导致一个32位ADD加一个32位ADC.但是,除了那些被迫使用该携带的编译器的情况外,可能无法说服它与汇编器这样做.因此,使用可用的最大整数类型可以使GCC有效地让它知道该值的单个"组件"属于一起.

,可能是有益的.

对于简单的添加,计算进位的另一种方法可能是查看操作数中的相关位,例如:

uint32_t aa,bb,rr;
bool msbA, msbB, msbR, carry;
// ...

rr = aa+bb;

msbA = aa >= (1<<31); // equivalent: (aa & (1<<31)) != 0;
msbB = bb >= (1<<31);
msbR = rr >= (1<<31);


carry = (msbA && msbB) || ( !msbR && ( msbA || msbB) );

本文地址:https://www.itbaoku.cn/post/359319.html