2011-08-25 9 views
6

मैं पैरामीटर एन के आधार पर xmm रजिस्टर के लिए विभिन्न movdqu निर्देश युक्त कोड उत्पन्न करने के लिए एक गैस मैक्रो लिखना चाहता हूं।एक गैस मैक्रो में स्वचालित रूप से xmm रजिस्टर नाम जेनरेट करें?

.macro xxmov n, p1 
      .if (\n == 1) 
      xor %eax, %eax 
      .endif 
      .if (\n - 1) 
      xxmov (\n - 1), \p1 
      .endif 
      movdqu ((\n - 1)*0x10)(\p1), %xmm0 
    .endm 

    xxmov 14, %rsi 

एक बार संकलित, disassembled कोड,

0000000000000000 <.text>: 
    0:    31 c0     xor %eax,%eax 
    2:    f3 0f 6f 06    movdqu (%rsi),%xmm0 
    6:    f3 0f 6f 46 10   movdqu 0x10(%rsi),%xmm0 
    b:    f3 0f 6f 46 20   movdqu 0x20(%rsi),%xmm0 
    10:    f3 0f 6f 46 30   movdqu 0x30(%rsi),%xmm0 
    15:    f3 0f 6f 46 40   movdqu 0x40(%rsi),%xmm0 
    1a:    f3 0f 6f 46 50   movdqu 0x50(%rsi),%xmm0 
    1f:    f3 0f 6f 46 60   movdqu 0x60(%rsi),%xmm0 
    24:    f3 0f 6f 46 70   movdqu 0x70(%rsi),%xmm0 
    29:    f3 0f 6f 86 80 00 00 movdqu 0x80(%rsi),%xmm0 
    30:    00 
    31:    f3 0f 6f 86 90 00 00 movdqu 0x90(%rsi),%xmm0 
    38:    00 
    39:    f3 0f 6f 86 a0 00 00 movdqu 0xa0(%rsi),%xmm0 
    40:    00 
    41:    f3 0f 6f 86 b0 00 00 movdqu 0xb0(%rsi),%xmm0 
    48:    00 
    49:    f3 0f 6f 86 c0 00 00 movdqu 0xc0(%rsi),%xmm0 
    50:    00 
    51:    f3 0f 6f 86 d0 00 00 movdqu 0xd0(%rsi),%xmm0 
    58:    00 

हालांकि है, जब मैं के साथ ऊपर xxmov मैक्रो में% XMM \ n% xmm0 बदल दिया, मैं त्रुटि संकलन कर ली,

$ gcc -c mac.s 
mac.s: Assembler messages: 
mac.s:17: Error: bad register name `%xmm(((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((14 - 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((14 - 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((14 - 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((14 - 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((14 - 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(14 - 1)' 

तो, वैसे भी मैं अपने मैक्रो को xmm रजिस्टर नाम (% xmm0 से% xmm_ {n-1}) में हेरफेर कर सकता हूं? मैंने http://sourceware.org/binutils/docs/as/Macro.html#Macro में उल्लिखित \ @ (% xmm \ @) का प्रयास किया है। हालांकि, यह बहुत अच्छा काम नहीं करता है क्योंकि मैं इस मैक्रो एकाधिक समय का उपयोग करना चाहता हूं, जबकि \ @ एकान्त रूप से बढ़ रहा है ..

उत्तर

2

गिनने के बजाय आप एक चर को गिनने के बजाय कैसे रखते हैं? इस तरह:

.macro xxmov n, p1, cnt=0 
    .if (\cnt == 0) 
     xor %eax, %eax 
    .endif 
    .if (\cnt != \n) 
     movdqu \@*0x10(\p1), %xmm\@ 
     xxmov \n, \p1, (\cnt + 1) 
    .endif 
.endm 

    xxmov 14, %rsi 

कौन उत्पन्न करता है:

0000000000000000 <.text>: 
    0: 31 c0      xor %eax,%eax 
    2: f3 0f 6f 06     movdqu (%rsi),%xmm0 
    6: f3 0f 6f 4e 10    movdqu 0x10(%rsi),%xmm1 
    b: f3 0f 6f 56 20    movdqu 0x20(%rsi),%xmm2 
    10: f3 0f 6f 5e 30    movdqu 0x30(%rsi),%xmm3 
    15: f3 0f 6f 66 40    movdqu 0x40(%rsi),%xmm4 
    1a: f3 0f 6f 6e 50    movdqu 0x50(%rsi),%xmm5 
    1f: f3 0f 6f 76 60    movdqu 0x60(%rsi),%xmm6 
    24: f3 0f 6f 7e 70    movdqu 0x70(%rsi),%xmm7 
    29: f3 44 0f 6f 86 80 00 00 00 movdqu 0x80(%rsi),%xmm8 
    32: f3 44 0f 6f 8e 90 00 00 00 movdqu 0x90(%rsi),%xmm9 
    3b: f3 44 0f 6f 96 a0 00 00 00 movdqu 0xa0(%rsi),%xmm10 
    44: f3 44 0f 6f 9e b0 00 00 00 movdqu 0xb0(%rsi),%xmm11 
    4d: f3 44 0f 6f a6 c0 00 00 00 movdqu 0xc0(%rsi),%xmm12 
    56: f3 44 0f 6f ae d0 00 00 00 movdqu 0xd0(%rsi),%xmm13 

अद्यतन: ओह, यह केवल फ़ाइल में पहली मैक्रो के उपयोग के लिए काम करता है। आप एक ही फाइल में यह एक बार से अधिक उपयोग करने की आवश्यकता है, यह .altmacro वाक्य रचना तरह से उपयोग कर रहा है जाने के लिए की तरह लग रहा है (यह .noaltmacro के साथ फिर से बंद किया जा सकता):

.altmacro 
.macro xxmov n, p 
    .if (\n == 1) 
     xor %eax, %eax 
    .endif 
    .if (\n > 1) 
     xxmov %(\n - 1), \p 
    .endif 
    movdqu (\n - 1)*0x10 (%\p) , %xmm\n 
.endm 
    xxmov 4, rsi 
    xxmov 14, rsi 
+0

हां, .altmacro यहाँ मदद करता है । धन्यवाद। – 0xa5a5

संबंधित मुद्दे