【发布时间】:2010-09-23 06:21:56
【问题描述】:
我有一些代码基本上需要在汇编语句中使用一个小表达式,其中表达式像 i*4 一样微不足道,但 GCC 在编译时似乎没有意识到这一点(尝试没有 -O 标志,和-O3)。对于第三种用法,“i”和“n”约束在以下 sn-p 中均不起作用。
#include <stdint.h>
#include <stdlib.h>
#define SHIFT(h, l, c) __asm__ volatile ( \
"shld %2, %1, %0\n\t" \
"sal %2, %1\n\t" \
: "+r"(h), "+r"(l) : "i"(c))
void main(void) {
uint64_t a, b;
SHIFT(a, b, 1); /* 1 */
SHIFT(a, b, 2*4); /* 2 */
size_t i;
for(i=0; i<24; i++) {
SHIFT(a, b, (i*4)); /* 3 */
}
}
给出这个错误:
temp.c:15: warning: asm operand 2 probably doesn’t match constraints
temp.c:15: error: impossible constraint in ‘asm’
我也试过
"shld $" #c ", %1...
但这有其自身的问题,因为字符串化时括号仍然存在。我的意图是整个循环展开,但 -funroll-all-loops 似乎在过程中发生得不够早,导致 i*4 成为常数。有任何想法吗?替代方案非常丑陋,但如果有一种方法可以在宏中自动执行此操作,那总比没有好:
SHIFT(a, b, 1);
SHIFT(a, b, 2);
...
SHIFT(a, b, 24);
【问题讨论】:
标签: gcc assembly compiler-errors inline-assembly