lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

100-fix_mips_softfloat.patch (4436B)


      1 From bfeac1b2d18b12c1c3c64a41a09c90f93d0ed4ca Mon Sep 17 00:00:00 2001
      2 From: Yousong Zhou <yszhou4tech@gmail.com>
      3 Date: Mon, 15 Aug 2016 15:00:13 +0800
      4 Subject: [PATCH] mips: fix MIPS softfloat build issue
      5 
      6 The patch for o32.S is taken from OpenWrt packages repo 3a7a4bf "libffi:
      7 fix MIPS softfloat build issue with current binutils"
      8 
      9 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
     10 Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
     11 ---
     12  src/mips/n32.S | 17 +++++++++++++++++
     13  src/mips/o32.S | 17 +++++++++++++++++
     14  2 files changed, 34 insertions(+)
     15 
     16 diff --git a/src/mips/n32.S b/src/mips/n32.S
     17 index c6985d3..8f25994 100644
     18 --- a/src/mips/n32.S
     19 +++ b/src/mips/n32.S
     20 @@ -107,6 +107,16 @@ loadregs:
     21  
     22  	REG_L	t6, 3*FFI_SIZEOF_ARG($fp)  # load the flags word into t6.
     23  
     24 +#ifdef __mips_soft_float
     25 +	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
     26 +	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
     27 +	REG_L	a2, 2*FFI_SIZEOF_ARG(t9)
     28 +	REG_L	a3, 3*FFI_SIZEOF_ARG(t9)
     29 +	REG_L	a4, 4*FFI_SIZEOF_ARG(t9)
     30 +	REG_L	a5, 5*FFI_SIZEOF_ARG(t9)
     31 +	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
     32 +	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
     33 +#else
     34  	and	t4, t6, ((1<<FFI_FLAG_BITS)-1)
     35  	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
     36  	beqz	t4, arg1_next
     37 @@ -193,6 +203,7 @@ arg7_next:
     38  arg8_doublep:	
     39   	l.d	$f19, 7*FFI_SIZEOF_ARG(t9)	
     40  arg8_next:	
     41 +#endif
     42  
     43  callit:		
     44  	# Load the function pointer
     45 @@ -214,6 +225,7 @@ retint:
     46  	b	epilogue
     47  
     48  retfloat:
     49 +#ifndef __mips_soft_float
     50  	bne     t6, FFI_TYPE_FLOAT, retdouble
     51  	jal	t9
     52  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
     53 @@ -272,6 +284,7 @@ retstruct_f_d:
     54  	s.s	$f0, 0(t4)
     55  	s.d	$f2, 8(t4)
     56  	b	epilogue
     57 +#endif
     58  
     59  retstruct_d_soft:
     60  	bne	t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
     61 @@ -429,6 +442,7 @@ ffi_closure_N32:
     62  	REG_S	a6, A6_OFF2($sp)
     63  	REG_S	a7, A7_OFF2($sp)
     64  
     65 +#ifndef __mips_soft_float
     66  	# Store all possible float/double registers.
     67  	s.d	$f12, F12_OFF2($sp)
     68  	s.d	$f13, F13_OFF2($sp)
     69 @@ -438,6 +452,7 @@ ffi_closure_N32:
     70  	s.d	$f17, F17_OFF2($sp)
     71  	s.d	$f18, F18_OFF2($sp)
     72  	s.d	$f19, F19_OFF2($sp)
     73 +#endif
     74  
     75  	# Call ffi_closure_mips_inner_N32 to do the real work.
     76  	LA	t9, ffi_closure_mips_inner_N32
     77 @@ -458,6 +473,7 @@ cls_retint:
     78  	b	cls_epilogue
     79  
     80  cls_retfloat:
     81 +#ifndef __mips_soft_float
     82  	bne     v0, FFI_TYPE_FLOAT, cls_retdouble
     83  	l.s	$f0, V0_OFF2($sp)
     84  	b	cls_epilogue
     85 @@ -500,6 +516,7 @@ cls_retstruct_f_d:
     86  	l.s	$f0, V0_OFF2($sp)
     87  	l.d	$f2, V1_OFF2($sp)
     88  	b	cls_epilogue
     89 +#endif
     90  	
     91  cls_retstruct_small2:	
     92  	REG_L	v0, V0_OFF2($sp)
     93 diff --git a/src/mips/o32.S b/src/mips/o32.S
     94 index eb27981..429dd0a 100644
     95 --- a/src/mips/o32.S
     96 +++ b/src/mips/o32.S
     97 @@ -82,13 +82,16 @@ sixteen:
     98  		
     99  	ADDU	$sp, 4 * FFI_SIZEOF_ARG		# adjust $sp to new args
    100  
    101 +#ifndef __mips_soft_float
    102  	bnez	t0, pass_d			# make it quick for int
    103 +#endif
    104  	REG_L	a0, 0*FFI_SIZEOF_ARG($sp)	# just go ahead and load the
    105  	REG_L	a1, 1*FFI_SIZEOF_ARG($sp)	# four regs.
    106  	REG_L	a2, 2*FFI_SIZEOF_ARG($sp)
    107  	REG_L	a3, 3*FFI_SIZEOF_ARG($sp)
    108  	b	call_it
    109  
    110 +#ifndef __mips_soft_float
    111  pass_d:
    112  	bne	t0, FFI_ARGS_D, pass_f
    113  	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
    114 @@ -130,6 +133,7 @@ pass_f_d:
    115   #	bne	t0, FFI_ARGS_F_D, call_it
    116  	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
    117  	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
    118 +#endif
    119  
    120  call_it:	
    121  	# Load the function pointer
    122 @@ -158,14 +162,23 @@ retfloat:
    123  	bne     t2, FFI_TYPE_FLOAT, retdouble
    124  	jalr	t9
    125  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
    126 +#ifndef __mips_soft_float
    127  	s.s	$f0, 0(t0)
    128 +#else
    129 +	REG_S	v0, 0(t0)
    130 +#endif
    131  	b	epilogue
    132  
    133  retdouble:	
    134  	bne	t2, FFI_TYPE_DOUBLE, noretval
    135  	jalr	t9
    136  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
    137 +#ifndef __mips_soft_float
    138  	s.d	$f0, 0(t0)
    139 +#else
    140 +	REG_S	v1, 4(t0)
    141 +	REG_S	v0, 0(t0)
    142 +#endif
    143  	b	epilogue
    144  	
    145  noretval:	
    146 @@ -261,9 +274,11 @@ $LCFI7:
    147  	li	$13, 1		# FFI_O32
    148  	bne	$16, $13, 1f	# Skip fp save if FFI_O32_SOFT_FLOAT
    149  	
    150 +#ifndef __mips_soft_float
    151  	# Store all possible float/double registers.
    152  	s.d	$f12, FA_0_0_OFF2($fp)
    153  	s.d	$f14, FA_1_0_OFF2($fp)
    154 +#endif
    155  1:	
    156  	# Call ffi_closure_mips_inner_O32 to do the work.
    157  	la	t9, ffi_closure_mips_inner_O32
    158 @@ -281,6 +296,7 @@ $LCFI7:
    159  	li	$13, 1		# FFI_O32
    160  	bne	$16, $13, 1f	# Skip fp restore if FFI_O32_SOFT_FLOAT
    161  
    162 +#ifndef __mips_soft_float
    163  	li	$9, FFI_TYPE_FLOAT
    164  	l.s	$f0, V0_OFF2($fp)
    165  	beq	$8, $9, closure_done
    166 @@ -288,6 +304,7 @@ $LCFI7:
    167  	li	$9, FFI_TYPE_DOUBLE
    168  	l.d	$f0, V0_OFF2($fp)
    169  	beq	$8, $9, closure_done
    170 +#endif
    171  1:	
    172  	REG_L	$3, V1_OFF2($fp)
    173  	REG_L	$2, V0_OFF2($fp)
    174 -- 
    175 2.6.4
    176