Rebase.
[official-gcc.git] / libgo / go / reflect / makefunc_amd64.S
blob88302eee1b22641c018577fbc6febc9a282decd3
1 # Copyright 2013 The Go Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style
3 # license that can be found in the LICENSE file.
5 # MakeFunc amd64 assembly code.
7 #include "config.h"
9         .global reflect.makeFuncStub
11 #ifdef __ELF__
12         .type   reflect.makeFuncStub,@function
13 #endif
15 reflect.makeFuncStub:
16 .LFB1:
18         # Store all the parameter registers in a struct that looks
19         # like:
20         # struct {
21         #   rax uint64          // 0x0
22         #   rdi uint64          // 0x8
23         #   rsi uint64          // 0x10
24         #   rdx uint64          // 0x18
25         #   rcx uint64          // 0x20
26         #   r8 uint64           // 0x28
27         #   r9 uint64           // 0x30
28         #   rsp uint64          // 0x38 Pointer to arguments on stack.
29         #   xmm0 [2]uint64      // 0x40
30         #   xmm1 [2]uint64      // 0x50
31         #   xmm2 [2]uint64      // 0x60
32         #   xmm3 [2]uint64      // 0x70
33         #   xmm4 [2]uint64      // 0x80
34         #   xmm5 [2]uint64      // 0x90
35         #   xmm6 [2]uint64      // 0xa0
36         #   xmm7 [2]uint64      // 0xb0
37         # };
39         pushq   %rbp
40 .LCFI0:
41         movq    %rsp, %rbp
42 .LCFI1:
44         subq    $0xc0, %rsp             # Space for struct on stack.
46         movq    %rax, 0x0(%rsp)
47         movq    %rdi, 0x8(%rsp)
48         movq    %rsi, 0x10(%rsp)
49         movq    %rdx, 0x18(%rsp)
50         movq    %rcx, 0x20(%rsp)
51         movq    %r8, 0x28(%rsp)
52         movq    %r9, 0x30(%rsp)
53         leaq    16(%rbp), %rax
54         movq    %rax, 0x38(%rsp)
55         movdqa  %xmm0, 0x40(%rsp)
56         movdqa  %xmm1, 0x50(%rsp)
57         movdqa  %xmm2, 0x60(%rsp)
58         movdqa  %xmm3, 0x70(%rsp)
59         movdqa  %xmm4, 0x80(%rsp)
60         movdqa  %xmm5, 0x90(%rsp)
61         movdqa  %xmm6, 0xa0(%rsp)
62         movdqa  %xmm7, 0xb0(%rsp)
64         /* For MakeFunc functions that call recover.  */
65         movq    8(%rbp), %rdi
66 #ifdef __PIC__
67         call    __go_makefunc_can_recover@PLT
68 #else
69         call    __go_makefunc_can_recover
70 #endif
72         # Get function type.
73 #ifdef __PIC__
74         call    __go_get_closure@PLT
75 #else
76         call    __go_get_closure
77 #endif
78         movq    %rax, %rsi
80         movq    %rsp, %rdi
82 #ifdef __PIC__
83         call    reflect.MakeFuncStubGo@PLT
84 #else
85         call    reflect.MakeFuncStubGo
86 #endif
88         /* MakeFunc functions can no longer call recover.  */
89 #ifdef __PIC__
90         call __go_makefunc_returning@PLT
91 #else
92         call __go_makefunc_returning
93 #endif
95         # The structure will be updated with any return values.  Load
96         # all possible return registers before returning to the caller.
98         movq    0x0(%rsp), %rax
99         movq    0x18(%rsp), %rdx
100         movq    0x8(%rsp), %rdi
101         movq    0x10(%rsp), %rsi
102         movdqa  0x40(%rsp), %xmm0
103         movdqa  0x50(%rsp), %xmm1
105         # long double values are returned on the floating point stack,
106         # but we don't worry about that since Go doesn't have a long
107         # double type.
109         leave
110 .LCFI2:
112         ret
113 .LFE1:
115 #ifdef __ELF__
116         .size   reflect.makeFuncStub, . - reflect.makeFuncStub
117 #endif
119 #ifdef __ELF__
120 #ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
121         .section        .eh_frame,"a",@unwind
122 #else
123         .section        .eh_frame,"a",@progbits
124 #endif
125 .Lframe1:
126         .long   .LECIE1-.LSCIE1 /* Length of Common Information Entry */
127 .LSCIE1:
128         .long   0x0             /* CIE Identifier Tag */
129         .byte   0x1             /* CIE Version */
130         .ascii "zR\0"           /* CIE Augmentation */
131         .uleb128 1              /* CIE Code Alignment Factor */
132         .sleb128 -8             /* CIE Data Alignment Factor */
133         .byte   0x10            /* CIE RA Column */
134         .uleb128 1              /* Augmentation size */
135         .byte   0x1b            /* FDE Encoding (pcrel sdata4) */
136         .byte   0xc             /* DW_CFA_def_cfa, %rsp offset 8 */
137         .uleb128 7
138         .uleb128 8
139         .byte   0x80+16         /* DW_CFA_offset, %rip offset 1*-8 */
140         .uleb128 1
141         .align 8
142 .LECIE1:
143 .LSFDE1:
144         .long   .LEFDE1-.LASFDE1        /* FDE Length */
145 .LASFDE1:
146         .long   .LASFDE1-.Lframe1       /* FDE CIE offset */
147 #if HAVE_AS_X86_PCREL
148         .long   .LFB1-.                 /* FDE initial location */
149 #else
150         .long   .LFB1@rel
151 #endif
152         .long   .LFE1-.LFB1             /* FDE address range */
153         .uleb128 0x0                    /* Augmentation size */
154         .byte   0x4                     /* DW_CFA_advance_loc4 */
155         .long   .LCFI0-.LFB1
156         .byte   0xe                     /* DW_CFA_def_cfa_offset */
157         .uleb128 16
158         .byte   0x86                    /* DW_CFA_offset, column 0x6 */
159         .uleb128 2
160         .byte   0x4                     /* DW_CFA_advance_loc4 */
161         .long   .LCFI1-.LCFI0
162         .byte   0xd                     /* DW_CFA_def_cfa_register */
163         .uleb128 6
164         .byte   0x2                     /* DW_CFA_advance_loc1 */
165         .byte   .LCFI2-.LCFI1
166         .byte   0xc                     /* DW_CFA_def_cfa */
167         .uleb128 7
168         .uleb128 8
169         .align 8
170 .LEFDE1:
171 #endif /* __ELF__ */
173 #if defined(__ELF__) && defined(__linux__)
174         .section        .note.GNU-stack,"",@progbits
175         .section        .note.GNU-split-stack,"",@progbits
176         .section        .note.GNU-no-split-stack,"",@progbits
177 #endif