, . #if:
__m128d buffer[100];
int main( void )
{
register __m128d val;
asm( "movq %[src], %%r13" :
:
[src] "r" (buffer) );
asm( "pcmpeqd %[src], %[dst]" :
[dst] "=x" (val) :
[src] "x" (val) );
asm( "movdqa %[src], (%%r13)" : :
[src] "x" (val) );
asm( "movdqa %[src], 16(%%r13)" : :
[src] "x" (val) );
}
r13, . . asm ( "r13" ) , asm, . , asms. , , .
, asm, , . gcc . :
__m128d buffer[100];
int main( void )
{
register __m128d val;
asm("# val: %0" : "=x" (val));
asm( "pcmpeqd %[sval], %[dval]\n\t"
"movdqa %[dval], %[buffer]\n\t"
"movdqa %[dval], %[buffer1]" :
[dval] "=x" (val), [buffer] "=m" (buffer[0]), [buffer1] "=m" (buffer[1]) :
[sval] "x" (val) );
}
#else:
__m128d buffer[100];
int main( void )
{
register __m128d val;
asm( "pcmpeqd %[src], %[dst]" :
[dst] "=x" (val) :
[src] "x" (val) );
asm( "movdqa %[src], %[dst]" :
[dst] "=X" (buffer) :
[src] "x" (val) );
asm( "movdqa %[src], %[dst]" :
[dst] "=X" (buffer+1) :
[src] "x" (val) );
}
:
__m128d buffer[100];
int main( void )
{
register __m128d val;
asm("# val: %0" : "=x" (val));
asm( "pcmpeqd %[sval], %[dval]\n\t"
"movdqa %[dval], (%[sbuffer])\n\t"
"movdqa %[dval], 16(%[sbuffer])" :
[dval] "=x" (val), [buffer] "=m" (buffer), [buffer1] "=m" (buffer[1]) :
[sval] "x" (val), [sbuffer] "r" (buffer));
}
.
- asm val . val , . .
- asm asm, gcc .
- sbuffer, buffer buffer1, buffer1? sbuffer . "buffer" "buffer1" , gcc, . "" clobber , . ( gcc docs re extended asm):
{ "m" (({struct {char x [10];} * p = (void *) ptr; * p;}))}.
gcc, 10 , ptr. , , , . , asm ( ), gcc.
? , , asm (from -Os):
pcmpeqd %xmm0, %xmm0
movdqa %xmm0, (%rax)
movdqa %xmm0, 16(%rax)
, , r13, , , , , . , , rax, , , ? ! , :
__m128d buffer[100];
int main( void )
{
register __m128d val;
for (int x=0; x < 10; x++)
{
asm("# val: %0" : "=x" (val));
asm( "pcmpeqd %[src], %[dst]\n\t"
"movdqa %[src], (%[sbuffer])\n\t"
"movdqa %[src], 16(%[sbuffer])" :
[dst] "=x" (val), [buffer] "=m" (buffer), [buffer1] "=m" (buffer[1]) :
[src] "x" (val), [sbuffer] "r" (buffer));
printf("%d\n", val);
}
}
Asm , printf (, ). ASM ? :
.L2:
leaq .LC0(%rip), %rcx
movq %rdi, %rdx
pcmpeqd %xmm6, %xmm0
movdqa %xmm6, (%rbx)
movdqa %xmm6, 16(%rbx)
movapd %xmm0, 32(%rsp)
call printf
subl $1, %esi
jne .L2
, rax rbx. ? , . c, , (ABI). , , , ( ), , , (.. ). wikipedia. , rbx ( x86-64).
, asm, , , rbx ( ). Gcc , - muck rbx, , . , , rbx, , , , , /.
"" - , , (. Global Reg Vars - ffixed-reg), , . x86 - . , - .
:
- . , "" , , . Gcc () , .
- gcc , asm, ( ). .
, (, , ). , , , .