Skip to content

Commit f5bdbf3

Browse files
committed
cmd/internal/obj/riscv: simplify rewriteMOV
Rewrite and simplify the rewriteMOV function in preparation for eliminating it entirely. Improve some error messages in the process. Change-Id: Id9a77be5174d46cc23651930c2e9068ee6555690 Reviewed-on: https://go-review.googlesource.com/c/go/+/344458 Trust: Joel Sing <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Run-TryBot: Cherry Mui <[email protected]> TryBot-Result: Go Bot <[email protected]>
1 parent bab79dd commit f5bdbf3

File tree

2 files changed

+30
-48
lines changed

2 files changed

+30
-48
lines changed

src/cmd/asm/internal/asm/testdata/riscv64error.s

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
// license that can be found in the LICENSE file.
44

55
TEXT errors(SB),$0
6-
MOV $errors(SB), (X5) // ERROR "unsupported addr MOV"
7-
MOV $8(SP), (X5) // ERROR "unsupported addr MOV"
8-
MOVB $8(SP), X5 // ERROR "unsupported addr MOV"
9-
MOVH $8(SP), X5 // ERROR "unsupported addr MOV"
10-
MOVW $8(SP), X5 // ERROR "unsupported addr MOV"
11-
MOVF $8(SP), X5 // ERROR "unsupported addr MOV"
6+
MOV $errors(SB), (X5) // ERROR "address load must target register"
7+
MOV $8(SP), (X5) // ERROR "address load must target register"
8+
MOVB $8(SP), X5 // ERROR "unsupported address load"
9+
MOVH $8(SP), X5 // ERROR "unsupported address load"
10+
MOVW $8(SP), X5 // ERROR "unsupported address load"
11+
MOVF $8(SP), X5 // ERROR "unsupported address load"
1212
MOV $1234, 0(SP) // ERROR "constant load must target register"
1313
MOV $1234, 8(SP) // ERROR "constant load must target register"
1414
MOV $0, 0(SP) // ERROR "constant load must target register"

src/cmd/internal/obj/riscv/obj.go

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -226,70 +226,52 @@ func rewriteMOV(ctxt *obj.Link, newprog obj.ProgAlloc, p *obj.Prog) {
226226
panic(fmt.Sprintf("%+v is not a MOV pseudo-instruction", p.As))
227227
}
228228

229-
switch p.From.Type {
230-
case obj.TYPE_MEM:
231-
switch p.From.Name {
232-
case obj.NAME_AUTO, obj.NAME_PARAM, obj.NAME_NONE:
233-
if p.To.Type != obj.TYPE_REG {
234-
ctxt.Diag("unsupported load for %v", p)
235-
}
229+
switch {
230+
case p.From.Type == obj.TYPE_REG && p.To.Type == obj.TYPE_REG:
236231

232+
case p.From.Type == obj.TYPE_MEM && p.To.Type == obj.TYPE_REG:
233+
switch p.From.Name {
234+
case obj.NAME_AUTO, obj.NAME_NONE, obj.NAME_PARAM:
237235
case obj.NAME_EXTERN, obj.NAME_STATIC:
238236
p.Mark |= NEED_PCREL_ITYPE_RELOC
239-
240237
default:
241238
ctxt.Diag("unsupported name %d for %v", p.From.Name, p)
242239
}
243240

244-
case obj.TYPE_REG:
245-
switch p.To.Type {
246-
case obj.TYPE_REG:
247-
switch p.As {
248-
case AMOV, AMOVB, AMOVH, AMOVW, AMOVBU, AMOVHU, AMOVWU, AMOVF, AMOVD:
249-
default:
250-
ctxt.Diag("unsupported register-register move at %v", p)
251-
}
252-
253-
case obj.TYPE_MEM:
254-
switch p.As {
255-
case AMOVBU, AMOVHU, AMOVWU:
256-
ctxt.Diag("unsupported unsigned store at %v", p)
257-
return
258-
}
259-
switch p.To.Name {
260-
case obj.NAME_AUTO, obj.NAME_PARAM, obj.NAME_NONE:
261-
262-
case obj.NAME_EXTERN, obj.NAME_STATIC:
263-
p.Mark |= NEED_PCREL_STYPE_RELOC
264-
265-
default:
266-
ctxt.Diag("unsupported name %d for %v", p.From.Name, p)
267-
}
268-
241+
case p.From.Type == obj.TYPE_REG && p.To.Type == obj.TYPE_MEM:
242+
switch p.As {
243+
case AMOVBU, AMOVHU, AMOVWU:
244+
ctxt.Diag("unsupported unsigned store at %v", p)
245+
}
246+
switch p.To.Name {
247+
case obj.NAME_AUTO, obj.NAME_NONE, obj.NAME_PARAM:
248+
case obj.NAME_EXTERN, obj.NAME_STATIC:
249+
p.Mark |= NEED_PCREL_STYPE_RELOC
269250
default:
270-
ctxt.Diag("unsupported MOV at %v", p)
251+
ctxt.Diag("unsupported name %d for %v", p.From.Name, p)
271252
}
272253

273-
case obj.TYPE_CONST:
254+
case p.From.Type == obj.TYPE_CONST:
274255
if p.As != AMOV {
275256
ctxt.Diag("%v: unsupported constant load", p)
276257
}
277258
if p.To.Type != obj.TYPE_REG {
278259
ctxt.Diag("%v: constant load must target register", p)
279260
}
280261

281-
case obj.TYPE_ADDR:
282-
if p.To.Type != obj.TYPE_REG || p.As != AMOV {
283-
ctxt.Diag("unsupported addr MOV at %v", p)
262+
case p.From.Type == obj.TYPE_ADDR:
263+
if p.As != AMOV {
264+
ctxt.Diag("%v: unsupported address load", p)
265+
}
266+
if p.To.Type != obj.TYPE_REG {
267+
ctxt.Diag("%v: address load must target register", p)
284268
}
285269
switch p.From.Name {
286-
case obj.NAME_AUTO, obj.NAME_PARAM, obj.NAME_NONE:
287-
270+
case obj.NAME_AUTO, obj.NAME_NONE, obj.NAME_PARAM:
288271
case obj.NAME_EXTERN, obj.NAME_STATIC:
289272
p.Mark |= NEED_PCREL_ITYPE_RELOC
290-
291273
default:
292-
ctxt.Diag("bad addr MOV from name %v at %v", p.From.Name, p)
274+
ctxt.Diag("unsupported name %d for %v", p.From.Name, p)
293275
}
294276

295277
default:

0 commit comments

Comments
 (0)