mirror of
git://git.openwrt.org/openwrt/openwrt.git
synced 2024-12-12 01:44:54 +00:00
d7382cc0e4
Every minor version bump of a major version will result in a huge patch diff because of the moving of all the patches from version e.g. 11.2.0 to 11.3.0. This commit only use the major version for the patch folders to differentiate between the different gcc versions. This will significantly improve the reviewing of the smaller version bump patches and help to see what really changed in a minor version bump. Signed-off-by: Nick Hainke <vincent@systemli.org>
169 lines
4.2 KiB
Diff
169 lines
4.2 KiB
Diff
From c0c62fa4256f805389f16ebfc4a60cf789129b50 Mon Sep 17 00:00:00 2001
|
|
From: BangLang Huang <banglang.huang@foxmail.com>
|
|
Date: Wed, 9 Nov 2016 10:36:49 +0800
|
|
Subject: [PATCH] libffi: fix MIPS softfloat build issue
|
|
|
|
Backported from github.com/libffi/libffi#272
|
|
|
|
Signed-off-by: BangLang Huang <banglang.huang@foxmail.com>
|
|
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
|
|
---
|
|
libffi/src/mips/n32.S | 17 +++++++++++++++++
|
|
libffi/src/mips/o32.S | 17 +++++++++++++++++
|
|
2 files changed, 34 insertions(+)
|
|
|
|
--- a/libffi/src/mips/n32.S
|
|
+++ b/libffi/src/mips/n32.S
|
|
@@ -107,6 +107,16 @@ loadregs:
|
|
|
|
REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6.
|
|
|
|
+#ifdef __mips_soft_float
|
|
+ REG_L a0, 0*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a1, 1*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a2, 2*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a3, 3*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a4, 4*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a5, 5*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a6, 6*FFI_SIZEOF_ARG(t9)
|
|
+ REG_L a7, 7*FFI_SIZEOF_ARG(t9)
|
|
+#else
|
|
and t4, t6, ((1<<FFI_FLAG_BITS)-1)
|
|
REG_L a0, 0*FFI_SIZEOF_ARG(t9)
|
|
beqz t4, arg1_next
|
|
@@ -193,6 +203,7 @@ arg7_next:
|
|
arg8_doublep:
|
|
l.d $f19, 7*FFI_SIZEOF_ARG(t9)
|
|
arg8_next:
|
|
+#endif
|
|
|
|
callit:
|
|
# Load the function pointer
|
|
@@ -214,6 +225,7 @@ retint:
|
|
b epilogue
|
|
|
|
retfloat:
|
|
+#ifndef __mips_soft_float
|
|
bne t6, FFI_TYPE_FLOAT, retdouble
|
|
jal t9
|
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
|
@@ -272,6 +284,7 @@ retstruct_f_d:
|
|
s.s $f0, 0(t4)
|
|
s.d $f2, 8(t4)
|
|
b epilogue
|
|
+#endif
|
|
|
|
retstruct_d_soft:
|
|
bne t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
|
|
@@ -429,6 +442,7 @@ ffi_closure_N32:
|
|
REG_S a6, A6_OFF2($sp)
|
|
REG_S a7, A7_OFF2($sp)
|
|
|
|
+#ifndef __mips_soft_float
|
|
# Store all possible float/double registers.
|
|
s.d $f12, F12_OFF2($sp)
|
|
s.d $f13, F13_OFF2($sp)
|
|
@@ -438,6 +452,7 @@ ffi_closure_N32:
|
|
s.d $f17, F17_OFF2($sp)
|
|
s.d $f18, F18_OFF2($sp)
|
|
s.d $f19, F19_OFF2($sp)
|
|
+#endif
|
|
|
|
# Call ffi_closure_mips_inner_N32 to do the real work.
|
|
LA t9, ffi_closure_mips_inner_N32
|
|
@@ -458,6 +473,7 @@ cls_retint:
|
|
b cls_epilogue
|
|
|
|
cls_retfloat:
|
|
+#ifndef __mips_soft_float
|
|
bne v0, FFI_TYPE_FLOAT, cls_retdouble
|
|
l.s $f0, V0_OFF2($sp)
|
|
b cls_epilogue
|
|
@@ -500,6 +516,7 @@ cls_retstruct_f_d:
|
|
l.s $f0, V0_OFF2($sp)
|
|
l.d $f2, V1_OFF2($sp)
|
|
b cls_epilogue
|
|
+#endif
|
|
|
|
cls_retstruct_small2:
|
|
REG_L v0, V0_OFF2($sp)
|
|
--- a/libffi/src/mips/o32.S
|
|
+++ b/libffi/src/mips/o32.S
|
|
@@ -82,13 +82,16 @@ sixteen:
|
|
|
|
ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args
|
|
|
|
+#ifndef __mips_soft_float
|
|
bnez t0, pass_d # make it quick for int
|
|
+#endif
|
|
REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the
|
|
REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs.
|
|
REG_L a2, 2*FFI_SIZEOF_ARG($sp)
|
|
REG_L a3, 3*FFI_SIZEOF_ARG($sp)
|
|
b call_it
|
|
|
|
+#ifndef __mips_soft_float
|
|
pass_d:
|
|
bne t0, FFI_ARGS_D, pass_f
|
|
l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args
|
|
@@ -130,6 +133,7 @@ pass_f_d:
|
|
# bne t0, FFI_ARGS_F_D, call_it
|
|
l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args
|
|
l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float
|
|
+#endif
|
|
|
|
call_it:
|
|
# Load the function pointer
|
|
@@ -158,14 +162,23 @@ retfloat:
|
|
bne t2, FFI_TYPE_FLOAT, retdouble
|
|
jalr t9
|
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
|
+#ifndef __mips_soft_float
|
|
s.s $f0, 0(t0)
|
|
+#else
|
|
+ REG_S v0, 0(t0)
|
|
+#endif
|
|
b epilogue
|
|
|
|
retdouble:
|
|
bne t2, FFI_TYPE_DOUBLE, noretval
|
|
jalr t9
|
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
|
+#ifndef __mips_soft_float
|
|
s.d $f0, 0(t0)
|
|
+#else
|
|
+ REG_S v1, 4(t0)
|
|
+ REG_S v0, 0(t0)
|
|
+#endif
|
|
b epilogue
|
|
|
|
noretval:
|
|
@@ -261,9 +274,11 @@ $LCFI7:
|
|
li $13, 1 # FFI_O32
|
|
bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT
|
|
|
|
+#ifndef __mips_soft_float
|
|
# Store all possible float/double registers.
|
|
s.d $f12, FA_0_0_OFF2($fp)
|
|
s.d $f14, FA_1_0_OFF2($fp)
|
|
+#endif
|
|
1:
|
|
# Call ffi_closure_mips_inner_O32 to do the work.
|
|
la t9, ffi_closure_mips_inner_O32
|
|
@@ -281,6 +296,7 @@ $LCFI7:
|
|
li $13, 1 # FFI_O32
|
|
bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT
|
|
|
|
+#ifndef __mips_soft_float
|
|
li $9, FFI_TYPE_FLOAT
|
|
l.s $f0, V0_OFF2($fp)
|
|
beq $8, $9, closure_done
|
|
@@ -288,6 +304,7 @@ $LCFI7:
|
|
li $9, FFI_TYPE_DOUBLE
|
|
l.d $f0, V0_OFF2($fp)
|
|
beq $8, $9, closure_done
|
|
+#endif
|
|
1:
|
|
REG_L $3, V1_OFF2($fp)
|
|
REG_L $2, V0_OFF2($fp)
|