C inline asm中的PCLMULQDQ指令

时间:2014-01-08 00:34:23

标签: c assembly intel inline-assembly instructions

我想在我的C代码中使用Intel的PCLMULQDQ指令和内联汇编来乘以两个多项式,这两个多项式是GF(2 ^ n)中的元素。编译器是GCC 4.8.1。 多项式存储在uint32_t(6个字段大)的数组中。

我已经检查了网络如何正确使用PCLMULQDQ指令或CLMUL指令集,但没有找到任何好的文档。

我真的很感激C中的一个简单例子,以及如何将两个简单多项式与指令相乘。有人知道怎么做吗?

除了有任何先决条件(有能力的处理器除外),如包含库,编译器选项等。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方案。因此,记录:

void f2m_intel_mult(
  uint32_t t, // length of arrays A and B
  uint32_t *A,
  uint32_t *B,
  uint32_t *C
)
{
    memset(C, 0, 2*t*sizeof(uint32_t));
    uint32_t offset = 0;
    union{ uint64_t val; struct{uint32_t low; uint32_t high;} halfs;} prod;

    uint32_t i;
    uint32_t j;
    for(i=0; i<t; i++){
        for(j=0; j<t; j++){

            prod.halfs.low = A[i];
            prod.halfs.high = 0;
            asm ("pclmulqdq %2, %1, %0;"
            : "+x"(prod.val)
            : "x"(B[j]), "i"(offset)
            );

            C[i+j] = C[i+j] ^ prod.halfs.low;
            C[i+j+1] = C[i+j+1] ^ prod.halfs.high;
        }
    }
}

我认为可以为pclmulqdq使用64位寄存器,但我无法找到如何使用内联汇编程序。有人知道吗?
尽管如此,内在函数也可以做同样的事情。 (如果你想要代码只是问。)
此外,如果您知道阵列的大小t,可以使用Karatsuba进一步优化计算。