OSDN Git Service

* doc/tm.texi (defmac SMALL_REGISTER_CLASSES): Remove.
[pf3gnuchains/gcc-fork.git] / libffi / src / sh / sysv.S
index d0a5ae2..5be7516 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2002, 2003, 2004 Kaz Kojima
+   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
    
    SuperH Foreign Function Interface 
 
    The above copyright notice and this permission notice shall be included
    in all copies or substantial portions of the Software.
 
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
    ----------------------------------------------------------------------- */
 
 #define LIBFFI_ASM     
@@ -117,12 +118,6 @@ L_pass_d:
        bt      1f
        add     #1,r3
 1:
-       mov     r15,r0
-       and     #7,r0
-       tst     r0,r0
-       bt      2f
-       add     #4,r15
-2:
        mov     #12,r0
        cmp/hs  r0,r3
        bt/s    3f
@@ -407,6 +402,9 @@ L_pop_d:
         mov.l  @r15+,r7
 
 L_pass_i:
+       cmp/eq  #FFI_TYPE_INT,r0
+       bf      L_call_it
+
        mov     #8,r0
        cmp/hs  r0,r2
        bt/s    2f
@@ -498,39 +496,42 @@ L_epilogue:
 
 ENTRY(ffi_closure_SYSV)
 .LFB2:
-       mov.l   r14,@-r15
+       mov.l   r7,@-r15
 .LCFI7:
+       mov.l   r6,@-r15
+.LCFI8:
+       mov.l   r5,@-r15
+.LCFI9:
+       mov.l   r4,@-r15
+.LCFIA:
+       mov.l   r14,@-r15
+.LCFIB:
        sts.l   pr,@-r15
 
        /* Stack layout:        
-          ...
-          32 bytes (floating register parameters, SH-4 only)
+          xx bytes (on stack parameters)
           16 bytes (register parameters)
+           4 bytes (saved frame pointer)
+           4 bytes (saved return address)
+          32 bytes (floating register parameters, SH-4 only)
            8 bytes (result)
            4 bytes (pad)
            4 bytes (5th arg)
           <- new stack pointer
        */
-.LCFI8:
+.LCFIC:
 #if defined(__SH4__)
-       add     #-64,r15
+       add     #-48,r15
 #else
-       add     #-32,r15
+       add     #-16,r15
 #endif
-.LCFI9:
+.LCFID:
        mov     r15,r14
-.LCFIA:
-       mov     r14,r1
-       add     #32,r1
-       mov.l   r7,@-r1
-       mov.l   r6,@-r1
-       mov.l   r5,@-r1
-       mov.l   r4,@-r1
-       mov     r1,r6
+.LCFIE:
 
 #if defined(__SH4__)
        mov     r14,r1
-       add     #64,r1
+       add     #48,r1
 #ifdef __LITTLE_ENDIAN__
        fmov.s  fr10,@-r1
        fmov.s  fr11,@-r1
@@ -551,6 +552,11 @@ ENTRY(ffi_closure_SYSV)
        fmov.s  fr4,@-r1
 #endif
        mov     r1,r7
+       mov     r14,r6
+       add     #56,r6
+#else
+       mov     r14,r6
+       add     #24,r6
 #endif
 
        bt/s    10f
@@ -684,17 +690,22 @@ L_case_uh:
 
 L_case_v:
 #if defined(__SH4__)
-       add     #64,r15
+       add     #48,r15
 #else
-       add     #32,r15
+       add     #16,r15
 #endif
        lds.l   @r15+,pr
+       mov.l   @r15+,r14
        rts
-        mov.l  @r15+,r14
+        add    #16,r15
 .LFE2:
 .ffi_closure_SYSV_end:
         .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
 
+#if defined __ELF__ && defined __linux__
+       .section        .note.GNU-stack,"",@progbits
+#endif
+
        .section        ".eh_frame","aw",@progbits
 __FRAME_BEGIN__:
        .4byte  .LECIE1-.LSCIE1 /* Length of Common Information Entry */
@@ -794,21 +805,45 @@ __FRAME_BEGIN__:
        .byte   0x4     /* DW_CFA_advance_loc4 */
        .4byte  .LCFI8-.LCFI7
        .byte   0xe     /* DW_CFA_def_cfa_offset */
-       .byte   0x8     /* uleb128 0x8 */
+       .byte   0x8     /* uleb128 0x4 */
        .byte   0x4     /* DW_CFA_advance_loc4 */
        .4byte  .LCFI9-.LCFI8
        .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0xc     /* uleb128 0x4 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .4byte  .LCFIA-.LCFI9
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x10    /* uleb128 0x4 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .4byte  .LCFIB-.LCFIA
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x14    /* uleb128 0x4 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .4byte  .LCFIC-.LCFIB
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x18    /* uleb128 0x4 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .4byte  .LCFID-.LCFIC
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
 #if defined(__SH4__)
-       .byte   8+64    /* uleb128 8+64 */
+       .byte   24+48   /* uleb128 24+48 */
 #else
-       .byte   8+32    /* uleb128 8+32 */
+       .byte   24+16   /* uleb128 24+16 */
 #endif
        .byte   0x91    /* DW_CFA_offset, column 0x11 */
-        .byte  0x2
-        .byte  0x8e    /* DW_CFA_offset, column 0xe */
-        .byte  0x1
+       .byte   0x6     /* uleb128 0x6 */
+       .byte   0x8e    /* DW_CFA_offset, column 0xe */
+       .byte   0x5     /* uleb128 0x5 */
+       .byte   0x84    /* DW_CFA_offset, column 0x4 */
+       .byte   0x4     /* uleb128 0x4 */
+       .byte   0x85    /* DW_CFA_offset, column 0x5 */
+       .byte   0x3     /* uleb128 0x3 */
+       .byte   0x86    /* DW_CFA_offset, column 0x6 */
+       .byte   0x2     /* uleb128 0x2 */
+       .byte   0x87    /* DW_CFA_offset, column 0x7 */
+       .byte   0x1     /* uleb128 0x1 */
        .byte   0x4     /* DW_CFA_advance_loc4 */
-       .4byte  .LCFIA-.LCFI9
+       .4byte  .LCFIE-.LCFID
        .byte   0xd     /* DW_CFA_def_cfa_register */
        .byte   0xe     /* uleb128 0xe */
        .align  2