]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/riscv: check immediate for rotation instructions
authorJoel Sing <joel@sing.id.au>
Tue, 19 Mar 2024 10:07:46 +0000 (21:07 +1100)
committerJoel Sing <joel@sing.id.au>
Sun, 7 Apr 2024 03:32:27 +0000 (03:32 +0000)
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 <mengzhuo1203@gmail.com>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/asm/internal/asm/testdata/riscv64error.s
src/cmd/internal/obj/riscv/obj.go

index 2dc9db3fb1f6be9542a7a52c583fe9e18a593501..0b0184aaa7e1ed0ec998158337a7b907e804195f 100644 (file)
@@ -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"
index 9f24f746f69f592210cc2a9aaad5d94e9e06657b..2055f4836ee66a9ed39a415df2ed9b90833a87b3 100644 (file)
@@ -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: