github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/src/sh64/sysv.S (about)

     1  /* -----------------------------------------------------------------------
     2     sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
     3     
     4     SuperH SHmedia Foreign Function Interface 
     5  
     6     Permission is hereby granted, free of charge, to any person obtaining
     7     a copy of this software and associated documentation files (the
     8     ``Software''), to deal in the Software without restriction, including
     9     without limitation the rights to use, copy, modify, merge, publish,
    10     distribute, sublicense, and/or sell copies of the Software, and to
    11     permit persons to whom the Software is furnished to do so, subject to
    12     the following conditions:
    13  
    14     The above copyright notice and this permission notice shall be included
    15     in all copies or substantial portions of the Software.
    16  
    17   
    18     THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
    19     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    20     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    21     NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    22     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    23     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    24     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    25     DEALINGS IN THE SOFTWARE.
    26     ----------------------------------------------------------------------- */
    27  
    28  #define LIBFFI_ASM	
    29  #include <fficonfig.h>
    30  #include <ffi.h>
    31  #ifdef HAVE_MACHINE_ASM_H
    32  #include <machine/asm.h>
    33  #else
    34  /* XXX these lose for some platforms, I'm sure. */
    35  #define CNAME(x) x
    36  #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
    37  #endif
    38  
    39  #ifdef __LITTLE_ENDIAN__
    40  #define OFS_FLT	0
    41  #else
    42  #define OFS_FLT	4
    43  #endif
    44  
    45  	.section	.text..SHmedia32,"ax"
    46  
    47  	# r2:	ffi_prep_args
    48  	# r3:	&ecif
    49  	# r4:	bytes
    50  	# r5:	flags
    51  	# r6:	flags2
    52  	# r7:	rvalue
    53  	# r8:	fn
    54  
    55  	# This assumes we are using gas.
    56  	.align	5
    57  ENTRY(ffi_call_SYSV)
    58  	# Save registers
    59  .LFB1:
    60  	addi.l	r15, -48, r15
    61  .LCFI0:
    62  	st.q	r15, 40, r32
    63  	st.q	r15, 32, r31
    64  	st.q	r15, 24, r30
    65  	st.q	r15, 16, r29
    66  	st.q	r15, 8, r28
    67  	st.l	r15, 4, r18
    68  	st.l	r15, 0, r14
    69  .LCFI1:
    70  	add.l	r15, r63, r14
    71  .LCFI2:
    72  #	add	r4, r63, r28
    73  	add	r5, r63, r29
    74  	add	r6, r63, r30
    75  	add	r7, r63, r31
    76  	add	r8, r63, r32
    77  
    78  	addi	r4, (64 + 7), r4
    79  	andi	r4, ~7, r4
    80  	sub.l	r15, r4, r15
    81  
    82  	ptabs/l	r2, tr0
    83  	add	r15, r63, r2
    84  	blink	tr0, r18
    85  
    86  	addi	r15, 64, r22
    87  	movi	0, r0
    88  	movi	0, r1
    89  	movi	-1, r23
    90  
    91  	pt/l	1f, tr1
    92  	bnei/l	r29, FFI_TYPE_STRUCT, tr1
    93  	ld.l	r15, 0, r19
    94  	addi	r15, 8, r15
    95  	addi	r0, 1, r0
    96  1:
    97  
    98  .L_pass:
    99  	andi	r30, 3, r20
   100  	shlri	r30, 2, r30
   101  
   102  	pt/l	.L_call_it, tr0
   103  	pt/l	.L_pass_i, tr1
   104  	pt/l	.L_pass_f, tr2
   105  
   106  	beqi/l	r20, FFI_TYPE_VOID, tr0
   107  	beqi/l	r20, FFI_TYPE_INT, tr1
   108  	beqi/l	r20, FFI_TYPE_FLOAT, tr2
   109  
   110  .L_pass_d:
   111  	addi	r0, 1, r0
   112  	pt/l	3f, tr0
   113  	movi	12, r20
   114  	bge/l	r1, r20, tr0
   115  
   116  	pt/l	.L_pop_d, tr1
   117  	pt/l	2f, tr0
   118  	blink	tr1, r63
   119  2:
   120  	addi.l	r15, 8, r15
   121  3:
   122  	pt/l	.L_pass, tr0
   123  	addi	r1, 2, r1
   124  	blink	tr0, r63
   125  
   126  .L_pop_d:
   127  	pt/l	.L_pop_d_tbl, tr1
   128  	gettr	tr1, r20
   129  	shlli	r1, 2, r21
   130  	add	r20, r21, r20
   131  	ptabs/l	r20, tr1
   132  	blink	tr1, r63
   133  
   134  .L_pop_d_tbl:
   135  	fld.d	r15, 0, dr0
   136  	blink	tr0, r63
   137  	fld.d	r15, 0, dr2
   138  	blink	tr0, r63
   139  	fld.d	r15, 0, dr4
   140  	blink	tr0, r63
   141  	fld.d	r15, 0, dr6
   142  	blink	tr0, r63
   143  	fld.d	r15, 0, dr8
   144  	blink	tr0, r63
   145  	fld.d	r15, 0, dr10
   146  	blink	tr0, r63
   147  
   148  .L_pass_f:
   149  	addi	r0, 1, r0
   150  	pt/l	3f, tr0
   151  	movi	12, r20
   152  	bge/l	r1, r20, tr0
   153  
   154  	pt/l	.L_pop_f, tr1
   155  	pt/l	2f, tr0
   156  	blink	tr1, r63
   157  2:
   158  	addi.l	r15, 8, r15
   159  3:
   160  	pt/l	.L_pass, tr0
   161  	blink	tr0, r63
   162  
   163  .L_pop_f:
   164  	pt/l	.L_pop_f_tbl, tr1
   165  	pt/l	5f, tr2
   166  	gettr	tr1, r20
   167  	bge/l	r23, r63, tr2
   168  	add	r1, r63, r23 
   169  	shlli	r1, 3, r21
   170  	addi	r1, 2, r1
   171  	add	r20, r21, r20
   172  	ptabs/l	r20, tr1
   173  	blink	tr1, r63
   174  5:
   175  	addi	r23, 1, r21
   176  	movi	-1, r23
   177  	shlli	r21, 3, r21
   178  	add	r20, r21, r20
   179  	ptabs/l	r20, tr1
   180  	blink	tr1, r63
   181  
   182  .L_pop_f_tbl:
   183  	fld.s	r15, OFS_FLT, fr0
   184  	blink	tr0, r63
   185  	fld.s	r15, OFS_FLT, fr1
   186  	blink	tr0, r63
   187  	fld.s	r15, OFS_FLT, fr2
   188  	blink	tr0, r63
   189  	fld.s	r15, OFS_FLT, fr3
   190  	blink	tr0, r63
   191  	fld.s	r15, OFS_FLT, fr4
   192  	blink	tr0, r63
   193  	fld.s	r15, OFS_FLT, fr5
   194  	blink	tr0, r63
   195  	fld.s	r15, OFS_FLT, fr6
   196  	blink	tr0, r63
   197  	fld.s	r15, OFS_FLT, fr7
   198  	blink	tr0, r63
   199  	fld.s	r15, OFS_FLT, fr8
   200  	blink	tr0, r63
   201  	fld.s	r15, OFS_FLT, fr9
   202  	blink	tr0, r63
   203  	fld.s	r15, OFS_FLT, fr10
   204  	blink	tr0, r63
   205  	fld.s	r15, OFS_FLT, fr11
   206  	blink	tr0, r63
   207  
   208  .L_pass_i:
   209  	pt/l	3f, tr0
   210  	movi	8, r20
   211  	bge/l	r0, r20, tr0
   212  
   213  	pt/l	.L_pop_i, tr1
   214  	pt/l	2f, tr0
   215  	blink	tr1, r63
   216  2:
   217  	addi.l	r15, 8, r15
   218  3:
   219  	pt/l	.L_pass, tr0
   220  	addi	r0, 1, r0
   221  	blink	tr0, r63
   222  
   223  .L_pop_i:
   224  	pt/l	.L_pop_i_tbl, tr1
   225  	gettr	tr1, r20
   226  	shlli	r0, 3, r21
   227  	add	r20, r21, r20
   228  	ptabs/l	r20, tr1
   229  	blink	tr1, r63
   230  
   231  .L_pop_i_tbl:
   232  	ld.q	r15, 0, r2
   233  	blink	tr0, r63
   234  	ld.q	r15, 0, r3
   235  	blink	tr0, r63
   236  	ld.q	r15, 0, r4
   237  	blink	tr0, r63
   238  	ld.q	r15, 0, r5
   239  	blink	tr0, r63
   240  	ld.q	r15, 0, r6
   241  	blink	tr0, r63
   242  	ld.q	r15, 0, r7
   243  	blink	tr0, r63
   244  	ld.q	r15, 0, r8
   245  	blink	tr0, r63
   246  	ld.q	r15, 0, r9
   247  	blink	tr0, r63
   248  
   249  .L_call_it:
   250  	# call function
   251  	pt/l	1f, tr1
   252  	bnei/l	r29, FFI_TYPE_STRUCT, tr1
   253  	add	r19, r63, r2
   254  1:
   255  	add	r22, r63, r15
   256  	ptabs/l	r32, tr0
   257  	blink	tr0, r18
   258  
   259  	pt/l	.L_ret_i, tr0
   260  	pt/l	.L_ret_ll, tr1
   261  	pt/l	.L_ret_d, tr2
   262  	pt/l	.L_ret_f, tr3
   263  	pt/l	.L_epilogue, tr4
   264  
   265  	beqi/l	r29, FFI_TYPE_INT, tr0
   266  	beqi/l	r29, FFI_TYPE_UINT32, tr0
   267  	beqi/l	r29, FFI_TYPE_SINT64, tr1
   268  	beqi/l	r29, FFI_TYPE_UINT64, tr1
   269  	beqi/l	r29, FFI_TYPE_DOUBLE, tr2
   270  	beqi/l	r29, FFI_TYPE_FLOAT, tr3
   271  
   272  	pt/l	.L_ret_q, tr0
   273  	pt/l	.L_ret_h, tr1
   274  
   275  	beqi/l	r29, FFI_TYPE_UINT8, tr0
   276  	beqi/l	r29, FFI_TYPE_UINT16, tr1
   277  	blink	tr4, r63
   278  
   279  .L_ret_d:
   280  	fst.d	r31, 0, dr0
   281  	blink	tr4, r63
   282  
   283  .L_ret_ll:
   284  	st.q	r31, 0, r2
   285  	blink	tr4, r63
   286  
   287  .L_ret_f:
   288  	fst.s	r31, OFS_FLT, fr0
   289  	blink	tr4, r63
   290  
   291  .L_ret_q:
   292  	st.b	r31, 0, r2
   293  	blink	tr4, r63
   294  
   295  .L_ret_h:
   296  	st.w	r31, 0, r2
   297  	blink	tr4, r63
   298  
   299  .L_ret_i:
   300  	st.l	r31, 0, r2
   301  	# Fall
   302  
   303  .L_epilogue:
   304  	# Remove the space we pushed for the args
   305  	add	r14, r63, r15
   306  
   307  	ld.l	r15, 0, r14
   308  	ld.l	r15, 4, r18
   309  	ld.q	r15, 8, r28
   310  	ld.q	r15, 16, r29
   311  	ld.q	r15, 24, r30
   312  	ld.q	r15, 32, r31
   313  	ld.q	r15, 40, r32
   314  	addi.l	r15, 48, r15
   315  	ptabs	r18, tr0
   316  	blink	tr0, r63
   317  
   318  .LFE1:
   319  .ffi_call_SYSV_end:
   320  	.size	 CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
   321  
   322  	.align	5
   323  ENTRY(ffi_closure_SYSV)
   324  .LFB2:
   325  	addi.l	r15, -136, r15
   326  .LCFI3:
   327  	st.l	r15, 12, r18
   328  	st.l	r15, 8, r14
   329  	st.l	r15, 4, r12
   330  .LCFI4:
   331  	add	r15, r63, r14
   332  .LCFI5:
   333  	/* Stack layout:	
   334  	   ...
   335  	   64 bytes (register parameters)
   336  	   48 bytes (floating register parameters)
   337  	    8 bytes (result)
   338  	    4 bytes (r18)
   339  	    4 bytes (r14)
   340  	    4 bytes (r12)
   341  	    4 bytes (for align)
   342  	   <- new stack pointer
   343  	*/
   344  	fst.d	r14, 24, dr0
   345  	fst.d	r14, 32, dr2
   346  	fst.d	r14, 40, dr4
   347  	fst.d	r14, 48, dr6
   348  	fst.d	r14, 56, dr8
   349  	fst.d	r14, 64, dr10
   350  	st.q	r14, 72, r2
   351  	st.q	r14, 80, r3
   352  	st.q	r14, 88, r4
   353  	st.q	r14, 96, r5
   354  	st.q	r14, 104, r6
   355  	st.q	r14, 112, r7
   356  	st.q	r14, 120, r8
   357  	st.q	r14, 128, r9
   358  
   359  	add	r1, r63, r2
   360  	addi	r14, 16, r3
   361  	addi	r14, 72, r4
   362  	addi	r14, 24, r5
   363  	addi	r14, 136, r6
   364  #ifdef PIC
   365  	movi	(((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12
   366          shori	((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12
   367  .LPCS0:	ptrel/u r12, tr0
   368  	movi	((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1
   369  	gettr	tr0, r12
   370  	ldx.l	r1, r12, r1
   371  	ptabs	r1, tr0
   372  #else
   373  	pt/l	ffi_closure_helper_SYSV, tr0
   374  #endif
   375  	blink	tr0, r18
   376  
   377  	shlli	r2, 1, r1
   378          movi    (((datalabel .L_table) >> 16) & 65535), r2
   379          shori   ((datalabel .L_table) & 65535), r2
   380          ldx.w   r2, r1, r1
   381          add     r1, r2, r1
   382  	pt/l	.L_case_v, tr1
   383          ptabs   r1, tr0
   384          blink   tr0, r63
   385  
   386          .align 2
   387  .L_table:
   388  	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_VOID */
   389  	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_INT */
   390  	.word	.L_case_f - datalabel .L_table	/* FFI_TYPE_FLOAT */
   391  	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_DOUBLE */
   392  	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_LONGDOUBLE */
   393  	.word	.L_case_uq - datalabel .L_table	/* FFI_TYPE_UINT8 */
   394  	.word	.L_case_q - datalabel .L_table	/* FFI_TYPE_SINT8 */
   395  	.word	.L_case_uh - datalabel .L_table	/* FFI_TYPE_UINT16 */
   396  	.word	.L_case_h - datalabel .L_table	/* FFI_TYPE_SINT16 */
   397  	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_UINT32 */
   398  	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_SINT32 */
   399  	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_UINT64 */
   400  	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_SINT64 */
   401  	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_STRUCT */
   402  	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_POINTER */
   403  
   404          .align 2
   405  .L_case_d:
   406  	fld.d	r14, 16, dr0
   407  	blink	tr1, r63
   408  .L_case_f:
   409  	fld.s	r14, 16, fr0
   410  	blink	tr1, r63
   411  .L_case_ll:
   412  	ld.q	r14, 16, r2
   413  	blink	tr1, r63
   414  .L_case_i:
   415  	ld.l	r14, 16, r2
   416  	blink	tr1, r63
   417  .L_case_q:
   418  	ld.b	r14, 16, r2
   419  	blink	tr1, r63
   420  .L_case_uq:
   421  	ld.ub	r14, 16, r2
   422  	blink	tr1, r63
   423  .L_case_h:
   424  	ld.w	r14, 16, r2
   425  	blink	tr1, r63
   426  .L_case_uh:
   427  	ld.uw	r14, 16, r2
   428  	blink	tr1, r63
   429  .L_case_v:
   430  	add.l	r14, r63, r15
   431  	ld.l	r15, 4, r12
   432  	ld.l	r15, 8, r14
   433  	ld.l	r15, 12, r18
   434  	addi.l	r15, 136, r15
   435  	ptabs	r18, tr0
   436  	blink	tr0, r63
   437  
   438  .LFE2:
   439  .ffi_closure_SYSV_end:
   440  	.size	 CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
   441  
   442  #if defined __ELF__ && defined __linux__
   443  	.section	.note.GNU-stack,"",@progbits
   444  #endif
   445  
   446  	.section	".eh_frame","aw",@progbits
   447  __FRAME_BEGIN__:
   448  	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
   449  .LSCIE1:
   450  	.4byte	0x0	/* CIE Identifier Tag */
   451  	.byte	0x1	/* CIE Version */
   452  #ifdef PIC
   453  	.ascii "zR\0"	/* CIE Augmentation */
   454  #else
   455  	.byte	0x0	/* CIE Augmentation */
   456  #endif
   457  	.uleb128 0x1	/* CIE Code Alignment Factor */
   458  	.sleb128 -4	/* CIE Data Alignment Factor */
   459  	.byte	0x12	/* CIE RA Column */
   460  #ifdef PIC
   461  	.uleb128 0x1	/* Augmentation size */
   462  	.byte	0x10	/* FDE Encoding (pcrel) */
   463  #endif
   464  	.byte	0xc	/* DW_CFA_def_cfa */
   465  	.uleb128 0xf
   466  	.uleb128 0x0
   467  	.align	2
   468  .LECIE1:
   469  .LSFDE1:
   470  	.4byte	datalabel .LEFDE1-datalabel .LASFDE1	/* FDE Length */
   471  .LASFDE1:
   472  	.4byte	datalabel .LASFDE1-datalabel __FRAME_BEGIN__
   473  #ifdef PIC
   474  	.4byte	.LFB1-.	/* FDE initial location */
   475  #else
   476  	.4byte	.LFB1	/* FDE initial location */
   477  #endif
   478  	.4byte	datalabel .LFE1-datalabel .LFB1	/* FDE address range */
   479  #ifdef PIC
   480  	.uleb128 0x0	/* Augmentation size */
   481  #endif
   482  	.byte	0x4	/* DW_CFA_advance_loc4 */
   483  	.4byte	datalabel .LCFI0-datalabel .LFB1
   484  	.byte	0xe	/* DW_CFA_def_cfa_offset */
   485  	.uleb128 0x30
   486  	.byte	0x4	/* DW_CFA_advance_loc4 */
   487  	.4byte	datalabel .LCFI1-datalabel .LCFI0
   488  	.byte   0x8e	/* DW_CFA_offset, column 0xe */
   489  	.uleb128 0xc
   490  	.byte   0x92	/* DW_CFA_offset, column 0x12 */
   491  	.uleb128 0xb
   492  	.byte   0x9c	/* DW_CFA_offset, column 0x1c */
   493  	.uleb128 0xa
   494  	.byte   0x9d	/* DW_CFA_offset, column 0x1d */
   495  	.uleb128 0x8
   496  	.byte   0x9e	/* DW_CFA_offset, column 0x1e */
   497  	.uleb128 0x6
   498  	.byte   0x9f	/* DW_CFA_offset, column 0x1f */
   499  	.uleb128 0x4
   500  	.byte   0xa0	/* DW_CFA_offset, column 0x20 */
   501  	.uleb128 0x2
   502  	.byte	0x4	/* DW_CFA_advance_loc4 */
   503  	.4byte	datalabel .LCFI2-datalabel .LCFI1
   504  	.byte	0xd	/* DW_CFA_def_cfa_register */
   505  	.uleb128 0xe
   506  	.align	2
   507  .LEFDE1:
   508  
   509  .LSFDE3:
   510  	.4byte	datalabel .LEFDE3-datalabel .LASFDE3	/* FDE Length */
   511  .LASFDE3:
   512  	.4byte	datalabel .LASFDE3-datalabel __FRAME_BEGIN__
   513  #ifdef PIC
   514  	.4byte	.LFB2-.	/* FDE initial location */
   515  #else
   516  	.4byte	.LFB2	/* FDE initial location */
   517  #endif
   518  	.4byte	datalabel .LFE2-datalabel .LFB2	/* FDE address range */
   519  #ifdef PIC
   520  	.uleb128 0x0	/* Augmentation size */
   521  #endif
   522  	.byte	0x4	/* DW_CFA_advance_loc4 */
   523  	.4byte	datalabel .LCFI3-datalabel .LFB2
   524  	.byte	0xe	/* DW_CFA_def_cfa_offset */
   525  	.uleb128 0x88
   526  	.byte	0x4	/* DW_CFA_advance_loc4 */
   527  	.4byte	datalabel .LCFI4-datalabel .LCFI3
   528  	.byte   0x8c	/* DW_CFA_offset, column 0xc */
   529  	.uleb128 0x21
   530  	.byte   0x8e	/* DW_CFA_offset, column 0xe */
   531  	.uleb128 0x20
   532  	.byte   0x92	/* DW_CFA_offset, column 0x12 */
   533  	.uleb128 0x1f
   534  	.byte	0x4	/* DW_CFA_advance_loc4 */
   535  	.4byte	datalabel .LCFI5-datalabel .LCFI4
   536  	.byte	0xd	/* DW_CFA_def_cfa_register */
   537  	.uleb128 0xe
   538  	.align	2
   539  .LEFDE3: