| // asmcheck | |
| // Copyright 2026 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package codegen | |
| // This file contains codegen tests for scaled index addressing | |
| // with non-power-of-two slice strides (issue #80639). | |
| //go:noinline | |
| func idx3(p []uint32, x int) uint32 { | |
| // arm64: `MOVWU\s*\(R[0-9]+\)\(R[0-9]+<<2\)` | |
| // amd64: `MOVL\s*\([A-Z0-9]+\)\([A-Z0-9]+\*4\)` | |
| return p[3*x] | |
| } | |
| //go:noinline | |
| func idx7(p []uint32, x int) uint32 { | |
| // arm64: `MOVWU\s*\(R[0-9]+\)\(R[0-9]+<<2\)` -`SUB\s*R[0-9]+<<2` | |
| // amd64: `MOVL\s*\([A-Z0-9]+\)\([A-Z0-9]+\*4\)` | |
| return p[7*x] | |
| } | |
| //go:noinline | |
| func idx11(p []uint32, x int) uint32 { | |
| // arm64: `MOVWU\s*\(R[0-9]+\)\(R[0-9]+<<2\)` | |
| // amd64: `MOVL\s*\([A-Z0-9]+\)\([A-Z0-9]+\*4\)` | |
| return p[11*x] | |
| } | |
| //go:noinline | |
| func idx5_64(p []uint64, x int) uint64 { | |
| // arm64: `MOVD\s*\(R[0-9]+\)\(R[0-9]+<<3\)` | |
| // amd64: `MOVQ\s*\([A-Z0-9]+\)\([A-Z0-9]+\*8\)` | |
| return p[5*x] | |
| } | |
| //go:noinline | |
| func idx7_16(p []uint16, x int) uint16 { | |
| // arm64: `MOVHU\s*\(R[0-9]+\)\(R[0-9]+<<1\)` -`SUB\s*R[0-9]+<<1` | |
| // amd64: `MOVW(L|Q)?ZX\s*\([A-Z0-9]+\)\([A-Z0-9]+\*2\)` | |
| return p[7*x] | |
| } | |
| //go:noinline | |
| func store7(p []uint32, x int, v uint32) { | |
| // arm64: `MOVW\s*R[0-9]+,\s*\(R[0-9]+\)\(R[0-9]+<<2\)` -`SUB\s*R[0-9]+<<2` | |
| // amd64: `MOVL\s*[A-Z0-9]+,\s*\([A-Z0-9]+\)\([A-Z0-9]+\*4\)` | |
| p[7*x] = v | |
| } | |
| //go:noinline | |
| func cse7(p []uint32, x int) uint32 { | |
| // arm64: `MOVWU\s*\(R[0-9]+\)\(R[0-9]+<<2\)` -`SUB\s*R[0-9]+<<2` | |
| // amd64: `MOVL\s*\([A-Z0-9]+\)\([A-Z0-9]+\*4\)` | |
| return p[7*x] + p[7*x+1] | |
| } | |
| //go:noinline | |
| func genMath(x int) int { | |
| // amd64: `IMUL3?Q\s*[$]28` -`SHLQ\s*[$]2` | |
| // arm64: `SUB\s*R[0-9]+<<2` `LSL\s*[$]5` -`LSL\s*[$]2` | |
| // riscv64: `(MUL|MADD)` -`SLLI\s*.*,\s*2` | |
| return 4 * (7 * x) | |
| } | |