Skip to content

Commit bd88540

Browse files
committed
runtime: save and restore all fcc registers in async preempt on loong64
Currently, all Op implementations on loong64 use fcc0 by default, so only fcc0 is saved in CL 475577. However, fcc1-fcc7 may also be used by users when writing assembly code, such as in CL 693878. Change-Id: Idb60d8101a0f7d602dfcbbb39bd5da9f2c475bfd Reviewed-on: https://go-review.googlesource.com/c/go/+/696875 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: David Chase <[email protected]> Reviewed-by: sophie zhao <[email protected]> Reviewed-by: Meidan Li <[email protected]> Reviewed-by: Carlos Amedee <[email protected]>
1 parent 119546e commit bd88540

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

src/runtime/mkpreempt.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -610,10 +610,30 @@ func genLoong64(g *gen) {
610610
l.add(movf, reg, regsize)
611611
}
612612

613-
// save/restore FCC0
613+
// Add condition flag register fcc0-fcc7
614+
sv := ""
615+
rs := ""
616+
last := 7
617+
for i := 0; i <= last; i++ {
618+
msb := 7 + (i * 8)
619+
lsb := 0 + (i * 8)
620+
621+
// MOVV FCCx, R4,
622+
// BSTRINSV $msb, R4, $lsb, R5
623+
sv += fmt.Sprintf("%s FCC%d, R4\n", mov, i)
624+
sv += fmt.Sprintf("BSTRINSV $%d, R4, $%d, R5\n", msb, lsb)
625+
626+
// BSTRPICKV $msb, R5, $lsb, R4
627+
// MOVV R4, FCCx
628+
rs += fmt.Sprintf("BSTRPICKV $%d, R5, $%d, R4\n", msb, lsb)
629+
rs += fmt.Sprintf("%s R4, FCC%d", mov, i)
630+
if i != last {
631+
rs += fmt.Sprintf("\n")
632+
}
633+
}
614634
l.addSpecial(
615-
mov+" FCC0, R4\n"+mov+" R4, %d(R3)",
616-
mov+" %d(R3), R4\n"+mov+" R4, FCC0",
635+
sv+mov+" R5, %d(R3)",
636+
mov+" %d(R3), R5\n"+rs,
617637
regsize)
618638

619639
// allocate frame, save PC of interrupted instruction (in LR)

src/runtime/preempt_loong64.s

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,40 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
6565
MOVD F30, 456(R3)
6666
MOVD F31, 464(R3)
6767
MOVV FCC0, R4
68-
MOVV R4, 472(R3)
68+
BSTRINSV $7, R4, $0, R5
69+
MOVV FCC1, R4
70+
BSTRINSV $15, R4, $8, R5
71+
MOVV FCC2, R4
72+
BSTRINSV $23, R4, $16, R5
73+
MOVV FCC3, R4
74+
BSTRINSV $31, R4, $24, R5
75+
MOVV FCC4, R4
76+
BSTRINSV $39, R4, $32, R5
77+
MOVV FCC5, R4
78+
BSTRINSV $47, R4, $40, R5
79+
MOVV FCC6, R4
80+
BSTRINSV $55, R4, $48, R5
81+
MOVV FCC7, R4
82+
BSTRINSV $63, R4, $56, R5
83+
MOVV R5, 472(R3)
6984
CALL ·asyncPreempt2(SB)
70-
MOVV 472(R3), R4
85+
MOVV 472(R3), R5
86+
BSTRPICKV $7, R5, $0, R4
7187
MOVV R4, FCC0
88+
BSTRPICKV $15, R5, $8, R4
89+
MOVV R4, FCC1
90+
BSTRPICKV $23, R5, $16, R4
91+
MOVV R4, FCC2
92+
BSTRPICKV $31, R5, $24, R4
93+
MOVV R4, FCC3
94+
BSTRPICKV $39, R5, $32, R4
95+
MOVV R4, FCC4
96+
BSTRPICKV $47, R5, $40, R4
97+
MOVV R4, FCC5
98+
BSTRPICKV $55, R5, $48, R4
99+
MOVV R4, FCC6
100+
BSTRPICKV $63, R5, $56, R4
101+
MOVV R4, FCC7
72102
MOVD 464(R3), F31
73103
MOVD 456(R3), F30
74104
MOVD 448(R3), F29

0 commit comments

Comments
 (0)