이 부스 매크로는 powerpc 아치에서 컴파일하려고 할 때 경고를 발생시킵니다. 매크로가 호출되는 각 라인에서 인라인 어셈블리의 "matching constraint"는 무엇을 의미합니까?
#define INNERMUL asm(\
" mullw 16,%3,%4 \n\t" \
" mulhwu 17,%3,%4 \n\t" \
" addc 16,16,%0 \n\t" \
" addze 17,17 \n\t" \
" lwz 18,%1 \n\t" \
" addc 16,16,18 \n\t" \
" addze %0,17 \n\t" \
" stw 16,%1 \n\t" \
:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm;
#define PROPCARRY \
asm(\
" lwz 16,%1 \n\t" \
" addc 16,16,%0 \n\t" \
" stw 16,%1 \n\t" \
" xor %0,%0,%0 \n\t" \
" addze %0,%0 \n\t" \
:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc");
, 나는 컴파일러에 의해이 경고를 얻을 :
../../src/math/mont.c:650: warning: matching constraint does not allow a register
모든 일이 뜻하고, 어떤 방법으로 코드에 영향을 미치는 것을 말해 줄 수 있을까? 그리고 저는 정말로 어셈블러에 익숙하지 않았기 때문에 아마도 어떤 사람이 나를 도울 수 있었을 것입니다. 특별히 나의 경우에 경고를 일으키는 것이 무엇입니까?
내 시스템은 32 비트 내가 사용 gcc4.8.2에 FreeBSD의입니다
편집 :
다음문제없이 실행되고 x86에서 컴파일 해당 x86_64에 코드입니다 :
은#define INNERMUL \
asm(\
"movq %5,%%rax \n\t" \
"mulq %4 \n\t" \
"addq %1,%%rax \n\t" \
"adcq $0,%%rdx \n\t" \
"addq %%rax,%0 \n\t" \
"adcq $0,%%rdx \n\t" \
"movq %%rdx,%1 \n\t" \
:"=g"(_c[LO]), "=r"(cy) \
:"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \
: "%rax", "%rdx", "%cc")
#define PROPCARRY \
asm(\
"addq %1,%0 \n\t" \
"setb %%al \n\t" \
"movzbq %%al,%1 \n\t" \
:"=g"(_c[LO]), "=r"(cy) \
:"0"(_c[LO]), "1"(cy) \
: "%rax", "%cc")
아마도 powerpc의 코드 동작이 무엇인지 분명하게 알 수 있습니다.
PowerPC를 모르겠지만 인수 0을 레지스터로 요청하고 있습니다. '% 0'을 오퍼랜드로 사용하는 모든 연산을 레지스터 피연산자가 허용합니까? –
@KerrekSB이 경우에는 C 경고가 아닌 어셈블러 오류가 발생합니다. C 컴파일러는 asm이 의미가 있는지 확인하지 않습니다. –
제가 x86 어셈블리를 많이했기 때문에''% rax "'와'"% cc "'는 유효한 clobber 식별자가 아니므로 컴파일러는이를 무시할 것입니다. 올바른 방법은' "rax", "cc"' –