From 20f052c83c380b8b3700b7aca93017178a692d78 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 19 Mar 2024 21:07:46 +1100 Subject: [PATCH] cmd/internal/obj/riscv: check immediate for rotation instructions Ensure that the immediate for a RORI or RORIW instruction are within range, adding test coverage. Also use a consistent "immediate out of range" error for both rotations and shifts. Change-Id: Id687d7c6e028786f607e9519bbb64dab62b6cf3d Reviewed-on: https://go-review.googlesource.com/c/go/+/572735 Reviewed-by: M Zhuo Run-TryBot: Joel Sing Reviewed-by: Dmitri Shuralyov TryBot-Result: Gopher Robot Reviewed-by: Than McIntosh LUCI-TryBot-Result: Go LUCI --- .../asm/internal/asm/testdata/riscv64error.s | 28 +++++++++++-------- src/cmd/internal/obj/riscv/obj.go | 18 ++++++++++-- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/riscv64error.s b/src/cmd/asm/internal/asm/testdata/riscv64error.s index 2dc9db3fb1..0b0184aaa7 100644 --- a/src/cmd/asm/internal/asm/testdata/riscv64error.s +++ b/src/cmd/asm/internal/asm/testdata/riscv64error.s @@ -26,18 +26,22 @@ TEXT errors(SB),$0 MOVD F0, F1, F2 // ERROR "illegal MOV instruction" MOV X10, X11, X12 // ERROR "illegal MOV instruction" MOVW X10, X11, X12 // ERROR "illegal MOV instruction" - SLLI $64, X5, X6 // ERROR "shift amount out of range 0 to 63" - SRLI $64, X5, X6 // ERROR "shift amount out of range 0 to 63" - SRAI $64, X5, X6 // ERROR "shift amount out of range 0 to 63" - SLLI $-1, X5, X6 // ERROR "shift amount out of range 0 to 63" - SRLI $-1, X5, X6 // ERROR "shift amount out of range 0 to 63" - SRAI $-1, X5, X6 // ERROR "shift amount out of range 0 to 63" - SLLIW $32, X5, X6 // ERROR "shift amount out of range 0 to 31" - SRLIW $32, X5, X6 // ERROR "shift amount out of range 0 to 31" - SRAIW $32, X5, X6 // ERROR "shift amount out of range 0 to 31" - SLLIW $-1, X5, X6 // ERROR "shift amount out of range 0 to 31" - SRLIW $-1, X5, X6 // ERROR "shift amount out of range 0 to 31" - SRAIW $-1, X5, X6 // ERROR "shift amount out of range 0 to 31" + RORI $64, X5, X6 // ERROR "immediate out of range 0 to 63" + SLLI $64, X5, X6 // ERROR "immediate out of range 0 to 63" + SRLI $64, X5, X6 // ERROR "immediate out of range 0 to 63" + SRAI $64, X5, X6 // ERROR "immediate out of range 0 to 63" + RORI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" + SLLI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" + SRLI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" + SRAI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" + RORIW $32, X5, X6 // ERROR "immediate out of range 0 to 31" + SLLIW $32, X5, X6 // ERROR "immediate out of range 0 to 31" + SRLIW $32, X5, X6 // ERROR "immediate out of range 0 to 31" + SRAIW $32, X5, X6 // ERROR "immediate out of range 0 to 31" + RORIW $-1, X5, X6 // ERROR "immediate out of range 0 to 31" + SLLIW $-1, X5, X6 // ERROR "immediate out of range 0 to 31" + SRLIW $-1, X5, X6 // ERROR "immediate out of range 0 to 31" + SRAIW $-1, X5, X6 // ERROR "immediate out of range 0 to 31" SD X5, 4294967296(X6) // ERROR "constant 4294967296 too large" SRLI $1, X5, F1 // ERROR "expected integer register in rd position but got non-integer register F1" SRLI $1, F1, X5 // ERROR "expected integer register in rs1 position but got non-integer register F1" diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 9f24f746f6..2055f4836e 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -2505,17 +2505,29 @@ func instructionsForProg(p *obj.Prog) []*instruction { ins.as = AFSGNJND ins.rs1 = uint32(p.From.Reg) - case AROL, AROLW, AROR, ARORW, ARORI, ARORIW: + case AROL, AROLW, AROR, ARORW: + inss = instructionsForRotate(p, ins) + + case ARORI: + if ins.imm < 0 || ins.imm > 63 { + p.Ctxt.Diag("%v: immediate out of range 0 to 63", p) + } + inss = instructionsForRotate(p, ins) + + case ARORIW: + if ins.imm < 0 || ins.imm > 31 { + p.Ctxt.Diag("%v: immediate out of range 0 to 31", p) + } inss = instructionsForRotate(p, ins) case ASLLI, ASRLI, ASRAI: if ins.imm < 0 || ins.imm > 63 { - p.Ctxt.Diag("%v: shift amount out of range 0 to 63", p) + p.Ctxt.Diag("%v: immediate out of range 0 to 63", p) } case ASLLIW, ASRLIW, ASRAIW: if ins.imm < 0 || ins.imm > 31 { - p.Ctxt.Diag("%v: shift amount out of range 0 to 31", p) + p.Ctxt.Diag("%v: immediate out of range 0 to 31", p) } case ACLZ, ACLZW, ACTZ, ACTZW, ACPOP, ACPOPW, ASEXTB, ASEXTH, AZEXTH: -- 2.48.1