/* -----------------------------------------------------------------------
- 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
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
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
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
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
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 */
.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