Skip to content

Commit 740b0eb

Browse files
XiaodongLoonggopherbot
authored andcommitted
runtime: implement asyncPreempt for linux/loong64
Contributors to the loong64 port are: Weining Lu <[email protected]> Lei Wang <[email protected]> Lingqin Gong <[email protected]> Xiaolin Zhao <[email protected]> Meidan Li <[email protected]> Xiaojuan Zhai <[email protected]> Qiyuan Pu <[email protected]> Guoqi Chen <[email protected]> This port has been updated to Go 1.15.6: https://github.com/loongson/go Updates #46229 Change-Id: I7a64e38b15a99816bd74262c02f62dad021cc166 Reviewed-on: https://go-review.googlesource.com/c/go/+/368078 Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: David Chase <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent c087121 commit 740b0eb

File tree

2 files changed

+170
-0
lines changed

2 files changed

+170
-0
lines changed

src/runtime/mkpreempt.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ var arches = map[string]func(){
8080
"amd64": genAMD64,
8181
"arm": genARM,
8282
"arm64": genARM64,
83+
"loong64": genLoong64,
8384
"mips64x": func() { genMIPS(true) },
8485
"mipsx": func() { genMIPS(false) },
8586
"ppc64x": genPPC64,
@@ -451,6 +452,46 @@ func genMIPS(_64bit bool) {
451452
p("JMP (R23)")
452453
}
453454

455+
func genLoong64() {
456+
mov := "MOVV"
457+
movf := "MOVD"
458+
add := "ADDV"
459+
sub := "SUBV"
460+
r31 := "RSB"
461+
regsize := 8
462+
463+
// Add integer registers r4-r21 r23-r29 r31
464+
// R0 (zero), R30 (REGTMP), R2 (tp), R3 (SP), R22 (g), R1 (LR) are special,
465+
var l = layout{sp: "R3", stack: regsize} // add slot to save PC of interrupted instruction (in LR)
466+
for i := 4; i <= 29; i++ {
467+
if i == 22 {
468+
continue // R3 is REGSP R22 is g
469+
}
470+
reg := fmt.Sprintf("R%d", i)
471+
l.add(mov, reg, regsize)
472+
}
473+
l.add(mov, r31, regsize)
474+
475+
// Add floating point registers F0-F31.
476+
for i := 0; i <= 31; i++ {
477+
reg := fmt.Sprintf("F%d", i)
478+
l.add(movf, reg, regsize)
479+
}
480+
481+
// allocate frame, save PC of interrupted instruction (in LR)
482+
p(mov+" R1, -%d(R3)", l.stack)
483+
p(sub+" $%d, R3", l.stack)
484+
485+
l.save()
486+
p("CALL ·asyncPreempt2(SB)")
487+
l.restore()
488+
489+
p(mov+" %d(R3), R1", l.stack) // sigctxt.pushCall has pushed LR (at interrupt) on stack, restore it
490+
p(mov + " (R3), R30") // load PC to REGTMP
491+
p(add+" $%d, R3", l.stack+regsize) // pop frame (including the space pushed by sigctxt.pushCall)
492+
p("JMP (R30)")
493+
}
494+
454495
func genPPC64() {
455496
// Add integer registers R3-R29
456497
// R0 (zero), R1 (SP), R30 (g) are special and not saved here.

src/runtime/preempt_loong64.s

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Code generated by mkpreempt.go; DO NOT EDIT.
2+
3+
#include "go_asm.h"
4+
#include "textflag.h"
5+
6+
TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
7+
MOVV R1, -472(R3)
8+
SUBV $472, R3
9+
MOVV R4, 8(R3)
10+
MOVV R5, 16(R3)
11+
MOVV R6, 24(R3)
12+
MOVV R7, 32(R3)
13+
MOVV R8, 40(R3)
14+
MOVV R9, 48(R3)
15+
MOVV R10, 56(R3)
16+
MOVV R11, 64(R3)
17+
MOVV R12, 72(R3)
18+
MOVV R13, 80(R3)
19+
MOVV R14, 88(R3)
20+
MOVV R15, 96(R3)
21+
MOVV R16, 104(R3)
22+
MOVV R17, 112(R3)
23+
MOVV R18, 120(R3)
24+
MOVV R19, 128(R3)
25+
MOVV R20, 136(R3)
26+
MOVV R21, 144(R3)
27+
MOVV R23, 152(R3)
28+
MOVV R24, 160(R3)
29+
MOVV R25, 168(R3)
30+
MOVV R26, 176(R3)
31+
MOVV R27, 184(R3)
32+
MOVV R28, 192(R3)
33+
MOVV R29, 200(R3)
34+
MOVV RSB, 208(R3)
35+
MOVD F0, 216(R3)
36+
MOVD F1, 224(R3)
37+
MOVD F2, 232(R3)
38+
MOVD F3, 240(R3)
39+
MOVD F4, 248(R3)
40+
MOVD F5, 256(R3)
41+
MOVD F6, 264(R3)
42+
MOVD F7, 272(R3)
43+
MOVD F8, 280(R3)
44+
MOVD F9, 288(R3)
45+
MOVD F10, 296(R3)
46+
MOVD F11, 304(R3)
47+
MOVD F12, 312(R3)
48+
MOVD F13, 320(R3)
49+
MOVD F14, 328(R3)
50+
MOVD F15, 336(R3)
51+
MOVD F16, 344(R3)
52+
MOVD F17, 352(R3)
53+
MOVD F18, 360(R3)
54+
MOVD F19, 368(R3)
55+
MOVD F20, 376(R3)
56+
MOVD F21, 384(R3)
57+
MOVD F22, 392(R3)
58+
MOVD F23, 400(R3)
59+
MOVD F24, 408(R3)
60+
MOVD F25, 416(R3)
61+
MOVD F26, 424(R3)
62+
MOVD F27, 432(R3)
63+
MOVD F28, 440(R3)
64+
MOVD F29, 448(R3)
65+
MOVD F30, 456(R3)
66+
MOVD F31, 464(R3)
67+
CALL ·asyncPreempt2(SB)
68+
MOVD 464(R3), F31
69+
MOVD 456(R3), F30
70+
MOVD 448(R3), F29
71+
MOVD 440(R3), F28
72+
MOVD 432(R3), F27
73+
MOVD 424(R3), F26
74+
MOVD 416(R3), F25
75+
MOVD 408(R3), F24
76+
MOVD 400(R3), F23
77+
MOVD 392(R3), F22
78+
MOVD 384(R3), F21
79+
MOVD 376(R3), F20
80+
MOVD 368(R3), F19
81+
MOVD 360(R3), F18
82+
MOVD 352(R3), F17
83+
MOVD 344(R3), F16
84+
MOVD 336(R3), F15
85+
MOVD 328(R3), F14
86+
MOVD 320(R3), F13
87+
MOVD 312(R3), F12
88+
MOVD 304(R3), F11
89+
MOVD 296(R3), F10
90+
MOVD 288(R3), F9
91+
MOVD 280(R3), F8
92+
MOVD 272(R3), F7
93+
MOVD 264(R3), F6
94+
MOVD 256(R3), F5
95+
MOVD 248(R3), F4
96+
MOVD 240(R3), F3
97+
MOVD 232(R3), F2
98+
MOVD 224(R3), F1
99+
MOVD 216(R3), F0
100+
MOVV 208(R3), RSB
101+
MOVV 200(R3), R29
102+
MOVV 192(R3), R28
103+
MOVV 184(R3), R27
104+
MOVV 176(R3), R26
105+
MOVV 168(R3), R25
106+
MOVV 160(R3), R24
107+
MOVV 152(R3), R23
108+
MOVV 144(R3), R21
109+
MOVV 136(R3), R20
110+
MOVV 128(R3), R19
111+
MOVV 120(R3), R18
112+
MOVV 112(R3), R17
113+
MOVV 104(R3), R16
114+
MOVV 96(R3), R15
115+
MOVV 88(R3), R14
116+
MOVV 80(R3), R13
117+
MOVV 72(R3), R12
118+
MOVV 64(R3), R11
119+
MOVV 56(R3), R10
120+
MOVV 48(R3), R9
121+
MOVV 40(R3), R8
122+
MOVV 32(R3), R7
123+
MOVV 24(R3), R6
124+
MOVV 16(R3), R5
125+
MOVV 8(R3), R4
126+
MOVV 472(R3), R1
127+
MOVV (R3), R30
128+
ADDV $480, R3
129+
JMP (R30)

0 commit comments

Comments
 (0)