mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile,cmd/internal/obj/riscv: move g register on riscv64
The original riscv64 port used the thread pointer (TP aka X4) register for the g pointer, however this register is also used when TLS support is required, resulting in a conflict (for example, when a signal is received we have no way of readily knowing if X4 contains a pointer to the TCB or a pointer to a g). In order to support cgo, free up the X4 register by moving g to X27. This unfortunately means that the X4 register is unused in non-cgo mode, however the alternative is to not support cgo on this platform. Update #36641 Change-Id: Idcaf3e8ccbe42972a1b8943aeefde7149d9c960a Reviewed-on: https://go-review.googlesource.com/c/go/+/263477 Trust: Joel Sing <joel@sing.id.au> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
214136b741
commit
6f45b39e4d
4 changed files with 219 additions and 218 deletions
|
|
@ -24,10 +24,11 @@ import (
|
||||||
// L = 64 bit int, used when the opcode starts with F
|
// L = 64 bit int, used when the opcode starts with F
|
||||||
|
|
||||||
const (
|
const (
|
||||||
riscv64REG_G = 4
|
riscv64REG_G = 27
|
||||||
riscv64REG_CTXT = 20
|
riscv64REG_CTXT = 20
|
||||||
riscv64REG_LR = 1
|
riscv64REG_LR = 1
|
||||||
riscv64REG_SP = 2
|
riscv64REG_SP = 2
|
||||||
|
riscv64REG_TP = 4
|
||||||
riscv64REG_TMP = 31
|
riscv64REG_TMP = 31
|
||||||
riscv64REG_ZERO = 0
|
riscv64REG_ZERO = 0
|
||||||
)
|
)
|
||||||
|
|
@ -78,8 +79,8 @@ func init() {
|
||||||
|
|
||||||
// Add general purpose registers to gpMask.
|
// Add general purpose registers to gpMask.
|
||||||
switch r {
|
switch r {
|
||||||
// ZERO, and TMP are not in any gp mask.
|
// ZERO, TP and TMP are not in any gp mask.
|
||||||
case riscv64REG_ZERO, riscv64REG_TMP:
|
case riscv64REG_ZERO, riscv64REG_TP, riscv64REG_TMP:
|
||||||
case riscv64REG_G:
|
case riscv64REG_G:
|
||||||
gpgMask |= mask
|
gpgMask |= mask
|
||||||
gpspsbgMask |= mask
|
gpspsbgMask |= mask
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -109,7 +109,7 @@ const (
|
||||||
REG_RA = REG_X1 // aka REG_LR
|
REG_RA = REG_X1 // aka REG_LR
|
||||||
REG_SP = REG_X2
|
REG_SP = REG_X2
|
||||||
REG_GP = REG_X3 // aka REG_SB
|
REG_GP = REG_X3 // aka REG_SB
|
||||||
REG_TP = REG_X4 // aka REG_G
|
REG_TP = REG_X4
|
||||||
REG_T0 = REG_X5
|
REG_T0 = REG_X5
|
||||||
REG_T1 = REG_X6
|
REG_T1 = REG_X6
|
||||||
REG_T2 = REG_X7
|
REG_T2 = REG_X7
|
||||||
|
|
@ -132,14 +132,14 @@ const (
|
||||||
REG_S8 = REG_X24
|
REG_S8 = REG_X24
|
||||||
REG_S9 = REG_X25
|
REG_S9 = REG_X25
|
||||||
REG_S10 = REG_X26
|
REG_S10 = REG_X26
|
||||||
REG_S11 = REG_X27
|
REG_S11 = REG_X27 // aka REG_G
|
||||||
REG_T3 = REG_X28
|
REG_T3 = REG_X28
|
||||||
REG_T4 = REG_X29
|
REG_T4 = REG_X29
|
||||||
REG_T5 = REG_X30
|
REG_T5 = REG_X30
|
||||||
REG_T6 = REG_X31 // aka REG_TMP
|
REG_T6 = REG_X31 // aka REG_TMP
|
||||||
|
|
||||||
// Go runtime register names.
|
// Go runtime register names.
|
||||||
REG_G = REG_TP // G pointer.
|
REG_G = REG_S11 // G pointer.
|
||||||
REG_CTXT = REG_S4 // Context for closures.
|
REG_CTXT = REG_S4 // Context for closures.
|
||||||
REG_LR = REG_RA // Link register.
|
REG_LR = REG_RA // Link register.
|
||||||
REG_TMP = REG_T6 // Reserved for assembler use.
|
REG_TMP = REG_T6 // Reserved for assembler use.
|
||||||
|
|
|
||||||
|
|
@ -519,12 +519,12 @@ flush:
|
||||||
MOV T1, 16(X2) // Also second argument to wbBufFlush
|
MOV T1, 16(X2) // Also second argument to wbBufFlush
|
||||||
|
|
||||||
// TODO: Optimise
|
// TODO: Optimise
|
||||||
// R3 is g.
|
// X5 already saved (T0)
|
||||||
// R4 already saved (T0)
|
// X6 already saved (T1)
|
||||||
// R5 already saved (T1)
|
// X10 already saved (A0)
|
||||||
// R9 already saved (A0)
|
// X11 already saved (A1)
|
||||||
// R10 already saved (A1)
|
// X27 is g.
|
||||||
// R30 is tmp register.
|
// X31 is tmp register.
|
||||||
MOV X0, 24(X2)
|
MOV X0, 24(X2)
|
||||||
MOV X1, 32(X2)
|
MOV X1, 32(X2)
|
||||||
MOV X2, 40(X2)
|
MOV X2, 40(X2)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue