我尝试在 C 代码中为 MIC(英特尔至强融核)制作内联汇编。我对 jknzd 指令有疑问。
这是我的代码片段:
float *A = (float*)_mm_malloc(N * sizeof(float), 64);
int32_t* Indx = (int32_t*)_mm_malloc(N * sizeof(int32_t), 64);
__m512i idx = __cdecl _mm512_load_epi32(&Indx[i]);
asm (
"kxnor %%k1, %%k1\n\t"
"1:" "vgatherpf0dps (%0, %1, 4){{%%k1}}\n\t"
"jknzd 1b, %%k1"
:
:"r"(A),"x"(idx)
:"%r8d", "%k1"
);
编译器是 icc-13.0.1,选项:-mmic -lrt -O3。当我尝试编译时,我收到以下消息:
/tmp/icc1XDD1vas_.s:汇编程序消息:/tmp/icc1XDD1vas_.s:237:错误:无效字符“{”开始操作数 1
{rz-sae}' /tmp/icc1XDD1vas_.s:250: Error: invalid char '{' beginning operand 1
{rn-sae}”/tmp/icc1XDD1vas_.s:254:错误:无效字符“{ '开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:260: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:263:错误:无效字符'{'开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:264: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:360:错误:无效字符'{ '开始操作数 1{rz-sae}' /tmp/icc1XDD1vas_.s:373: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:375:错误:无效字符'{'开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:378: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:383:错误:无效字符'{ '开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:385: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:398:错误:无效字符'{'开始操作数 1{rz-sae}' /tmp/icc1XDD1vas_.s:402: Error: invalid char '{' beginning operand 1
{rn-sae}'/tmp/icc1XDD1vas_.s:415:错误:无效字符'{ ' 开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:417: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:421:错误:无效字符“{”开始操作数 1{rn-sae}' /tmp/icc1XDD1vas_.s:422: Error: invalid char '{' beginning operand 1
{rn-sae}'
如果有一个简单的跳转,比如“jmp 1b”就可以了。我究竟做错了什么?