Commit 2708da0d authored by Vladimir Stefanovic's avatar Vladimir Stefanovic Committed by Brad Fitzpatrick

runtime/cgo, math: don't use FP instructions for soft-float mips{,le}

Updates #18162

Change-Id: I591fcf71a02678a99a56a6487da9689d3c9b1bb6
Reviewed-on: https://go-review.googlesource.com/37955
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
parent ac987df8
...@@ -8,7 +8,11 @@ ...@@ -8,7 +8,11 @@
// func Sqrt(x float64) float64 // func Sqrt(x float64) float64
TEXT ·Sqrt(SB),NOSPLIT,$0 TEXT ·Sqrt(SB),NOSPLIT,$0
#ifdef GOMIPS_softfloat
JMP ·sqrt(SB)
#else
MOVD x+0(FP), F0 MOVD x+0(FP), F0
SQRTD F0, F0 SQRTD F0, F0
MOVD F0, ret+8(FP) MOVD F0, ret+8(FP)
#endif
RET RET
...@@ -20,7 +20,11 @@ TEXT crosscall2(SB),NOSPLIT,$-4 ...@@ -20,7 +20,11 @@ TEXT crosscall2(SB),NOSPLIT,$-4
// Space for 9 caller-saved GPR + LR + 6 caller-saved FPR. // Space for 9 caller-saved GPR + LR + 6 caller-saved FPR.
// O32 ABI allows us to smash 16 bytes argument area of caller frame. // O32 ABI allows us to smash 16 bytes argument area of caller frame.
#ifndef GOMIPS_softfloat
SUBU $(4*14+8*6-16), R29 SUBU $(4*14+8*6-16), R29
#else
SUBU $(4*14-16), R29 // For soft-float, no FPR.
#endif
MOVW R5, (4*1)(R29) MOVW R5, (4*1)(R29)
MOVW R6, (4*2)(R29) MOVW R6, (4*2)(R29)
MOVW R7, (4*3)(R29) MOVW R7, (4*3)(R29)
...@@ -34,14 +38,14 @@ TEXT crosscall2(SB),NOSPLIT,$-4 ...@@ -34,14 +38,14 @@ TEXT crosscall2(SB),NOSPLIT,$-4
MOVW R23, (4*11)(R29) MOVW R23, (4*11)(R29)
MOVW g, (4*12)(R29) MOVW g, (4*12)(R29)
MOVW R31, (4*13)(R29) MOVW R31, (4*13)(R29)
#ifndef GOMIPS_softfloat
MOVD F20, (4*14)(R29) MOVD F20, (4*14)(R29)
MOVD F22, (4*14+8*1)(R29) MOVD F22, (4*14+8*1)(R29)
MOVD F24, (4*14+8*2)(R29) MOVD F24, (4*14+8*2)(R29)
MOVD F26, (4*14+8*3)(R29) MOVD F26, (4*14+8*3)(R29)
MOVD F28, (4*14+8*4)(R29) MOVD F28, (4*14+8*4)(R29)
MOVD F30, (4*14+8*5)(R29) MOVD F30, (4*14+8*5)(R29)
#endif
JAL runtime·load_g(SB) JAL runtime·load_g(SB)
JAL (R4) JAL (R4)
...@@ -55,7 +59,7 @@ TEXT crosscall2(SB),NOSPLIT,$-4 ...@@ -55,7 +59,7 @@ TEXT crosscall2(SB),NOSPLIT,$-4
MOVW (4*11)(R29), R23 MOVW (4*11)(R29), R23
MOVW (4*12)(R29), g MOVW (4*12)(R29), g
MOVW (4*13)(R29), R31 MOVW (4*13)(R29), R31
#ifndef GOMIPS_softfloat
MOVD (4*14)(R29), F20 MOVD (4*14)(R29), F20
MOVD (4*14+8*1)(R29), F22 MOVD (4*14+8*1)(R29), F22
MOVD (4*14+8*2)(R29), F24 MOVD (4*14+8*2)(R29), F24
...@@ -64,4 +68,7 @@ TEXT crosscall2(SB),NOSPLIT,$-4 ...@@ -64,4 +68,7 @@ TEXT crosscall2(SB),NOSPLIT,$-4
MOVD (4*14+8*5)(R29), F30 MOVD (4*14+8*5)(R29), F30
ADDU $(4*14+8*6-16), R29 ADDU $(4*14+8*6-16), R29
#else
ADDU $(4*14-16), R29
#endif
RET RET
...@@ -14,8 +14,11 @@ ...@@ -14,8 +14,11 @@
.globl crosscall1 .globl crosscall1
.set noat .set noat
crosscall1: crosscall1:
#ifndef __mips_soft_float
addiu $29, $29, -88 addiu $29, $29, -88
#else
addiu $29, $29, -40 // For soft-float, no need to make room for FP registers
#endif
sw $31, 0($29) sw $31, 0($29)
sw $16, 4($29) sw $16, 4($29)
sw $17, 8($29) sw $17, 8($29)
...@@ -27,14 +30,14 @@ crosscall1: ...@@ -27,14 +30,14 @@ crosscall1:
sw $23, 32($29) sw $23, 32($29)
sw $30, 36($29) sw $30, 36($29)
#ifndef __mips_soft_float
sdc1 $f20, 40($29) sdc1 $f20, 40($29)
sdc1 $f22, 48($29) sdc1 $f22, 48($29)
sdc1 $f24, 56($29) sdc1 $f24, 56($29)
sdc1 $f26, 64($29) sdc1 $f26, 64($29)
sdc1 $f28, 72($29) sdc1 $f28, 72($29)
sdc1 $f30, 80($29) sdc1 $f30, 80($29)
#endif
move $20, $4 // save R4 move $20, $4 // save R4
move $4, $6 move $4, $6
jalr $5 // call setg_gcc jalr $5 // call setg_gcc
...@@ -49,16 +52,20 @@ crosscall1: ...@@ -49,16 +52,20 @@ crosscall1:
lw $22, 28($29) lw $22, 28($29)
lw $23, 32($29) lw $23, 32($29)
lw $30, 36($29) lw $30, 36($29)
#ifndef __mips_soft_float
ldc1 $f20, 40($29) ldc1 $f20, 40($29)
ldc1 $f22, 48($29) ldc1 $f22, 48($29)
ldc1 $f24, 56($29) ldc1 $f24, 56($29)
ldc1 $f26, 64($29) ldc1 $f26, 64($29)
ldc1 $f28, 72($29) ldc1 $f28, 72($29)
ldc1 $f30, 80($29) ldc1 $f30, 80($29)
#endif
lw $31, 0($29) lw $31, 0($29)
#ifndef __mips_soft_float
addiu $29, $29, 88 addiu $29, $29, 88
#else
addiu $29, $29, 40
#endif
jr $31 jr $31
.set at .set at
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment