Skip to content

Commit d000963

Browse files
committed
cmd/internal/obj/riscv: reject invalid vadc/vsbc encodings
The RISC-V Instruction Set Manual Volume states that "for vadc and vsbc, the instruction encoding is reserved if the destination vector register is v0". The assembler currently allows instructions like VADCVVM V1, V2, V0, V0 to be assembled. It's not clear what the behaviour of such instructions will be on target hardware so it's best to disallow them. For reference, binutils (2.44-3.fc42) allows the instruction vadc.vvm v0, v4, v8, v0 to be assembled and the instruction actually executes on a Banana PI F3 without crashing. However, clang (20.1.2) refuses to assemble the instruction, producing the following error. error: the destination vector register group cannot be V0 vadc.vvm v0, v4, v8, v0 ^ Change-Id: Ia913cbd864ae8dbcf9227f69b963c93a99481cff Reviewed-on: https://go-review.googlesource.com/c/go/+/669315 Reviewed-by: Carlos Amedee <carlos@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Joel Sing <joel@sing.id.au>
1 parent 5a1f47a commit d000963

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,17 +623,27 @@ start:
623623
VADCVXM X11, V2, V0, V3 // d7c12540
624624
VADCVIM $15, V2, V0, V3 // d7b12740
625625
VMADCVVM V1, V2, V0, V3 // d7812044
626+
VMADCVVM V1, V2, V0, V0 // 57802044
626627
VMADCVXM X11, V2, V0, V3 // d7c12544
628+
VMADCVXM X11, V2, V0, V0 // 57c02544
627629
VMADCVIM $15, V2, V0, V3 // d7b12744
630+
VMADCVIM $15, V2, V0, V0 // 57b02744
628631
VMADCVV V1, V2, V3 // d7812046
632+
VMADCVV V1, V2, V0 // 57802046
629633
VMADCVX X11, V2, V3 // d7c12546
634+
VMADCVX X11, V2, V0 // 57c02546
630635
VMADCVI $15, V2, V3 // d7b12746
636+
VMADCVI $15, V2, V0 // 57b02746
631637
VSBCVVM V1, V2, V0, V3 // d7812048
632638
VSBCVXM X11, V2, V0, V3 // d7c12548
633639
VMSBCVVM V1, V2, V0, V3 // d781204c
640+
VMSBCVVM V1, V2, V0, V0 // 5780204c
634641
VMSBCVXM X11, V2, V0, V3 // d7c1254c
642+
VMSBCVXM X11, V2, V0, V0 // 57c0254c
635643
VMSBCVV V1, V2, V3 // d781204e
644+
VMSBCVV V1, V2, V0 // 5780204e
636645
VMSBCVX X11, V2, V3 // d7c1254e
646+
VMSBCVX X11, V2, V0 // 57c0254e
637647

638648
// 31.11.5: Vector Bitwise Logical Instructions
639649
VANDVV V1, V2, V3 // d7812026

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,13 @@ TEXT errors(SB),$0
9595
VSEXTVF8 V2, V3, V4 // ERROR "invalid vector mask register"
9696
VADCVVM V1, V2, V4, V3 // ERROR "invalid vector mask register"
9797
VADCVVM V1, V2, V3 // ERROR "invalid vector mask register"
98+
VADCVVM V1, V2, V0, V0 // ERROR "invalid destination register V0"
9899
VADCVXM X10, V2, V4, V3 // ERROR "invalid vector mask register"
99100
VADCVXM X10, V2, V3 // ERROR "invalid vector mask register"
101+
VADCVXM X10, V2, V0, V0 // ERROR "invalid destination register V0"
100102
VADCVIM $15, V2, V1, V3 // ERROR "invalid vector mask register"
101103
VADCVIM $15, V2, V3 // ERROR "invalid vector mask register"
104+
VADCVIM $15, V2, V0, V0 // ERROR "invalid destination register V0"
102105
VMADCVVM V1, V2, V4, V3 // ERROR "invalid vector mask register"
103106
VMADCVVM V1, V2, V3 // ERROR "invalid vector mask register"
104107
VMADCVXM X10, V2, V4, V3 // ERROR "invalid vector mask register"
@@ -107,8 +110,10 @@ TEXT errors(SB),$0
107110
VMADCVIM $15, V2, V3 // ERROR "invalid vector mask register"
108111
VSBCVVM V1, V2, V4, V3 // ERROR "invalid vector mask register"
109112
VSBCVVM V1, V2, V3 // ERROR "invalid vector mask register"
113+
VSBCVVM V1, V2, V0, V0 // ERROR "invalid destination register V0"
110114
VSBCVXM X10, V2, V4, V3 // ERROR "invalid vector mask register"
111115
VSBCVXM X10, V2, V3 // ERROR "invalid vector mask register"
116+
VSBCVXM X10, V2, V0, V0 // ERROR "invalid destination register V0"
112117
VMSBCVVM V1, V2, V4, V3 // ERROR "invalid vector mask register"
113118
VMSBCVVM V1, V2, V3 // ERROR "invalid vector mask register"
114119
VMSBCVXM X10, V2, V4, V3 // ERROR "invalid vector mask register"

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3773,8 +3773,13 @@ func instructionsForProg(p *obj.Prog) []*instruction {
37733773
ins.funct7 |= 1 // unmasked
37743774
ins.rd, ins.rs1, ins.rs2 = uint32(p.To.Reg), uint32(p.From.Reg), REG_V0
37753775

3776-
case AVADCVVM, AVADCVXM, AVMADCVVM, AVMADCVXM, AVSBCVVM, AVSBCVXM, AVMSBCVVM, AVMSBCVXM, AVADCVIM, AVMADCVIM,
3777-
AVMERGEVVM, AVMERGEVXM, AVMERGEVIM, AVFMERGEVFM:
3776+
case AVADCVIM, AVADCVVM, AVADCVXM, AVSBCVVM, AVSBCVXM:
3777+
if ins.rd == REG_V0 {
3778+
p.Ctxt.Diag("%v: invalid destination register V0", p)
3779+
}
3780+
fallthrough
3781+
3782+
case AVMADCVVM, AVMADCVXM, AVMSBCVVM, AVMSBCVXM, AVMADCVIM, AVMERGEVVM, AVMERGEVXM, AVMERGEVIM, AVFMERGEVFM:
37783783
if ins.rs3 != REG_V0 {
37793784
p.Ctxt.Diag("%v: invalid vector mask register", p)
37803785
}

0 commit comments

Comments
 (0)