1
2
3
4
5 package asmgen
6
7 var ArchS390X = &Arch{
8 Name: "s390x",
9 WordBits: 64,
10 WordBytes: 8,
11 CarrySafeLoop: true,
12
13 regs: []string{
14
15
16
17
18
19
20
21
22 "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9",
23 "R10", "R11", "R12",
24 },
25 reg0: "R0",
26 regTmp: "R10",
27 setup: s390xSetup,
28 maxColumns: 2,
29 op3: s390xOp3,
30 hint: s390xHint,
31
32
33
34
35 mov: "MOVD",
36 adds: "ADDC",
37 adcs: "ADDE",
38 subs: "SUBC",
39 sbcs: "SUBE",
40 mulWideF: s390MulWide,
41 lsh: "SLD",
42 rsh: "SRD",
43 and: "AND",
44 or: "OR",
45 xor: "XOR",
46 neg: "NEG",
47 lea: "LAY",
48
49 jmpZero: "CMPBEQ %s, $0, %s",
50 jmpNonZero: "CMPBNE %s, $0, %s",
51 }
52
53 func s390xSetup(f *Func) {
54 a := f.Asm
55 if f.Name == "addVV" || f.Name == "subVV" {
56
57
58
59
60 a.Printf("\tMOVB ·hasVX(SB), R1\n")
61 a.Printf("\tCMPBEQ R1, $0, novec\n")
62 a.Printf("\tJMP ·%svec(SB)\n", f.Name)
63 a.Printf("novec:\n")
64 }
65 a.Printf("\tMOVD $0, R0\n")
66 }
67
68 func s390xOp3(name string) bool {
69 if name == "AND" {
70 return false
71 }
72 return true
73 }
74
75 func s390xHint(_ *Asm, h Hint) string {
76 switch h {
77 case HintMulSrc:
78 return "R11"
79 case HintMulHi:
80 return "R10"
81 }
82 return ""
83 }
84
85 func s390MulWide(a *Asm, src1, src2, dstlo, dsthi Reg) {
86 if src1.name != "R11" && src2.name != "R11" {
87 a.Fatalf("mulWide src1 or src2 must be R11")
88 }
89 if dstlo.name != "R11" {
90 a.Fatalf("mulWide dstlo must be R11")
91 }
92 if dsthi.name != "R10" {
93 a.Fatalf("mulWide dsthi must be R10")
94 }
95 src := src1
96 if src.name == "R11" {
97 src = src2
98 }
99 a.Printf("\tMLGR %s, R10\n", src)
100 }
101
View as plain text