@@ -11,8 +11,8 @@ func addressingModes(f *Func) {
11
11
default :
12
12
// Most architectures can't do this.
13
13
return
14
- case "amd64" :
15
- // TODO: 386, s390x?
14
+ case "amd64" , "386" :
15
+ // TODO: s390x?
16
16
}
17
17
18
18
var tmp []* Value
@@ -21,7 +21,17 @@ func addressingModes(f *Func) {
21
21
if ! combineFirst [v .Op ] {
22
22
continue
23
23
}
24
- p := v .Args [0 ]
24
+ // All matched operations have the pointer in arg[0].
25
+ // All results have the pointer in arg[0] and the index in arg[1].
26
+ // *Except* for operations which update a register,
27
+ // which are marked with resultInArg0. Those have
28
+ // the pointer in arg[1], and the corresponding result op
29
+ // has the pointer in arg[1] and the index in arg[2].
30
+ ptrIndex := 0
31
+ if opcodeTable [v .Op ].resultInArg0 {
32
+ ptrIndex = 1
33
+ }
34
+ p := v .Args [ptrIndex ]
25
35
c , ok := combine [[2 ]Op {v .Op , p .Op }]
26
36
if ! ok {
27
37
continue
@@ -71,10 +81,11 @@ func addressingModes(f *Func) {
71
81
f .Fatalf ("unknown aux combining for %s and %s\n " , v .Op , p .Op )
72
82
}
73
83
// Combine the operations.
74
- tmp = append (tmp [:0 ], v .Args [1 :]... )
84
+ tmp = append (tmp [:0 ], v .Args [:ptrIndex ]... )
85
+ tmp = append (tmp , p .Args ... )
86
+ tmp = append (tmp , v .Args [ptrIndex + 1 :]... )
75
87
v .resetArgs ()
76
88
v .Op = c
77
- v .AddArgs (p .Args ... )
78
89
v .AddArgs (tmp ... )
79
90
}
80
91
}
@@ -97,6 +108,7 @@ func init() {
97
108
// x.Args[0].Args + x.Args[1:]
98
109
// Additionally, the Aux/AuxInt from x.Args[0] is merged into x.
99
110
var combine = map [[2 ]Op ]Op {
111
+ // amd64
100
112
[2 ]Op {OpAMD64MOVBload , OpAMD64ADDQ }: OpAMD64MOVBloadidx1 ,
101
113
[2 ]Op {OpAMD64MOVWload , OpAMD64ADDQ }: OpAMD64MOVWloadidx1 ,
102
114
[2 ]Op {OpAMD64MOVLload , OpAMD64ADDQ }: OpAMD64MOVLloadidx1 ,
@@ -150,5 +162,64 @@ var combine = map[[2]Op]Op{
150
162
[2 ]Op {OpAMD64MOVQstoreconst , OpAMD64LEAQ1 }: OpAMD64MOVQstoreconstidx1 ,
151
163
[2 ]Op {OpAMD64MOVQstoreconst , OpAMD64LEAQ8 }: OpAMD64MOVQstoreconstidx8 ,
152
164
153
- // TODO: 386
165
+ // 386
166
+ [2 ]Op {Op386MOVBload , Op386ADDL }: Op386MOVBloadidx1 ,
167
+ [2 ]Op {Op386MOVWload , Op386ADDL }: Op386MOVWloadidx1 ,
168
+ [2 ]Op {Op386MOVLload , Op386ADDL }: Op386MOVLloadidx1 ,
169
+ [2 ]Op {Op386MOVSSload , Op386ADDL }: Op386MOVSSloadidx1 ,
170
+ [2 ]Op {Op386MOVSDload , Op386ADDL }: Op386MOVSDloadidx1 ,
171
+
172
+ [2 ]Op {Op386MOVBstore , Op386ADDL }: Op386MOVBstoreidx1 ,
173
+ [2 ]Op {Op386MOVWstore , Op386ADDL }: Op386MOVWstoreidx1 ,
174
+ [2 ]Op {Op386MOVLstore , Op386ADDL }: Op386MOVLstoreidx1 ,
175
+ [2 ]Op {Op386MOVSSstore , Op386ADDL }: Op386MOVSSstoreidx1 ,
176
+ [2 ]Op {Op386MOVSDstore , Op386ADDL }: Op386MOVSDstoreidx1 ,
177
+
178
+ [2 ]Op {Op386MOVBstoreconst , Op386ADDL }: Op386MOVBstoreconstidx1 ,
179
+ [2 ]Op {Op386MOVWstoreconst , Op386ADDL }: Op386MOVWstoreconstidx1 ,
180
+ [2 ]Op {Op386MOVLstoreconst , Op386ADDL }: Op386MOVLstoreconstidx1 ,
181
+
182
+ [2 ]Op {Op386MOVBload , Op386LEAL1 }: Op386MOVBloadidx1 ,
183
+ [2 ]Op {Op386MOVWload , Op386LEAL1 }: Op386MOVWloadidx1 ,
184
+ [2 ]Op {Op386MOVWload , Op386LEAL2 }: Op386MOVWloadidx2 ,
185
+ [2 ]Op {Op386MOVLload , Op386LEAL1 }: Op386MOVLloadidx1 ,
186
+ [2 ]Op {Op386MOVLload , Op386LEAL4 }: Op386MOVLloadidx4 ,
187
+ [2 ]Op {Op386MOVSSload , Op386LEAL1 }: Op386MOVSSloadidx1 ,
188
+ [2 ]Op {Op386MOVSSload , Op386LEAL4 }: Op386MOVSSloadidx4 ,
189
+ [2 ]Op {Op386MOVSDload , Op386LEAL1 }: Op386MOVSDloadidx1 ,
190
+ [2 ]Op {Op386MOVSDload , Op386LEAL8 }: Op386MOVSDloadidx8 ,
191
+
192
+ [2 ]Op {Op386MOVBstore , Op386LEAL1 }: Op386MOVBstoreidx1 ,
193
+ [2 ]Op {Op386MOVWstore , Op386LEAL1 }: Op386MOVWstoreidx1 ,
194
+ [2 ]Op {Op386MOVWstore , Op386LEAL2 }: Op386MOVWstoreidx2 ,
195
+ [2 ]Op {Op386MOVLstore , Op386LEAL1 }: Op386MOVLstoreidx1 ,
196
+ [2 ]Op {Op386MOVLstore , Op386LEAL4 }: Op386MOVLstoreidx4 ,
197
+ [2 ]Op {Op386MOVSSstore , Op386LEAL1 }: Op386MOVSSstoreidx1 ,
198
+ [2 ]Op {Op386MOVSSstore , Op386LEAL4 }: Op386MOVSSstoreidx4 ,
199
+ [2 ]Op {Op386MOVSDstore , Op386LEAL1 }: Op386MOVSDstoreidx1 ,
200
+ [2 ]Op {Op386MOVSDstore , Op386LEAL8 }: Op386MOVSDstoreidx8 ,
201
+
202
+ [2 ]Op {Op386MOVBstoreconst , Op386LEAL1 }: Op386MOVBstoreconstidx1 ,
203
+ [2 ]Op {Op386MOVWstoreconst , Op386LEAL1 }: Op386MOVWstoreconstidx1 ,
204
+ [2 ]Op {Op386MOVWstoreconst , Op386LEAL2 }: Op386MOVWstoreconstidx2 ,
205
+ [2 ]Op {Op386MOVLstoreconst , Op386LEAL1 }: Op386MOVLstoreconstidx1 ,
206
+ [2 ]Op {Op386MOVLstoreconst , Op386LEAL4 }: Op386MOVLstoreconstidx4 ,
207
+
208
+ [2 ]Op {Op386ADDLload , Op386LEAL4 }: Op386ADDLloadidx4 ,
209
+ [2 ]Op {Op386SUBLload , Op386LEAL4 }: Op386SUBLloadidx4 ,
210
+ [2 ]Op {Op386MULLload , Op386LEAL4 }: Op386MULLloadidx4 ,
211
+ [2 ]Op {Op386ANDLload , Op386LEAL4 }: Op386ANDLloadidx4 ,
212
+ [2 ]Op {Op386ORLload , Op386LEAL4 }: Op386ORLloadidx4 ,
213
+ [2 ]Op {Op386XORLload , Op386LEAL4 }: Op386XORLloadidx4 ,
214
+
215
+ [2 ]Op {Op386ADDLmodify , Op386LEAL4 }: Op386ADDLmodifyidx4 ,
216
+ [2 ]Op {Op386SUBLmodify , Op386LEAL4 }: Op386SUBLmodifyidx4 ,
217
+ [2 ]Op {Op386ANDLmodify , Op386LEAL4 }: Op386ANDLmodifyidx4 ,
218
+ [2 ]Op {Op386ORLmodify , Op386LEAL4 }: Op386ORLmodifyidx4 ,
219
+ [2 ]Op {Op386XORLmodify , Op386LEAL4 }: Op386XORLmodifyidx4 ,
220
+
221
+ [2 ]Op {Op386ADDLconstmodify , Op386LEAL4 }: Op386ADDLconstmodifyidx4 ,
222
+ [2 ]Op {Op386ANDLconstmodify , Op386LEAL4 }: Op386ANDLconstmodifyidx4 ,
223
+ [2 ]Op {Op386ORLconstmodify , Op386LEAL4 }: Op386ORLconstmodifyidx4 ,
224
+ [2 ]Op {Op386XORLconstmodify , Op386LEAL4 }: Op386XORLconstmodifyidx4 ,
154
225
}
0 commit comments