Skip to content

Commit a6ecdf2

Browse files
committed
cmd/internal/obj/riscv: improve register MOVB/MOVH/MOVBU/MOVHU for rva22u64
When GORISCV64 enables rva22u64, use SEXTB for MOVB, SEXTH for MOVH, ZEXTH for MOVHU and ADDUW for MOVWU. These are single instruction alternatives to the two instruction shift sequences that are needed otherwise. Change-Id: Iea5e394f57e238ae8771400a87287c1ee507d44c Reviewed-on: https://go-review.googlesource.com/c/go/+/572736 Reviewed-by: David Chase <[email protected]> Run-TryBot: Joel Sing <[email protected]> Reviewed-by: Mark Ryan <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: M Zhuo <[email protected]>
1 parent ac0b2f9 commit a6ecdf2

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -462,12 +462,12 @@ start:
462462
MOVW X5, (X6) // 23205300
463463
MOVW X5, 4(X6) // 23225300
464464

465-
MOVB X5, X6 // 1393820313538343
466-
MOVH X5, X6 // 1393020313530343
465+
MOVB X5, X6 // 1393820313538343 or 13934260
466+
MOVH X5, X6 // 1393020313530343 or 13935260
467467
MOVW X5, X6 // 1b830200
468468
MOVBU X5, X6 // 13f3f20f
469-
MOVHU X5, X6 // 1393020313530303
470-
MOVWU X5, X6 // 1393020213530302
469+
MOVHU X5, X6 // 1393020313530303 or 3bc30208
470+
MOVWU X5, X6 // 1393020213530302 or 3b830208
471471

472472
MOVF 4(X5), F0 // 07a04200
473473
MOVF F0, 4(X5) // 27a20200

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

+33-16
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"cmd/internal/sys"
2727
"fmt"
2828
"internal/abi"
29+
"internal/buildcfg"
2930
"log"
3031
"math/bits"
3132
"strings"
@@ -2157,25 +2158,41 @@ func instructionsForMOV(p *obj.Prog) []*instruction {
21572158
case AMOVD: // MOVD Ra, Rb -> FSGNJD Ra, Ra, Rb
21582159
ins.as, ins.rs1 = AFSGNJD, uint32(p.From.Reg)
21592160
case AMOVB, AMOVH:
2160-
// Use SLLI/SRAI to extend.
2161-
ins.as, ins.rs1, ins.rs2 = ASLLI, uint32(p.From.Reg), obj.REG_NONE
2162-
if p.As == AMOVB {
2163-
ins.imm = 56
2164-
} else if p.As == AMOVH {
2165-
ins.imm = 48
2161+
if buildcfg.GORISCV64 >= 22 {
2162+
// Use SEXTB or SEXTH to extend.
2163+
ins.as, ins.rs1, ins.rs2 = ASEXTB, uint32(p.From.Reg), obj.REG_NONE
2164+
if p.As == AMOVH {
2165+
ins.as = ASEXTH
2166+
}
2167+
} else {
2168+
// Use SLLI/SRAI sequence to extend.
2169+
ins.as, ins.rs1, ins.rs2 = ASLLI, uint32(p.From.Reg), obj.REG_NONE
2170+
if p.As == AMOVB {
2171+
ins.imm = 56
2172+
} else if p.As == AMOVH {
2173+
ins.imm = 48
2174+
}
2175+
ins2 := &instruction{as: ASRAI, rd: ins.rd, rs1: ins.rd, imm: ins.imm}
2176+
inss = append(inss, ins2)
21662177
}
2167-
ins2 := &instruction{as: ASRAI, rd: ins.rd, rs1: ins.rd, imm: ins.imm}
2168-
inss = append(inss, ins2)
21692178
case AMOVHU, AMOVWU:
2170-
// Use SLLI/SRLI to extend.
2171-
ins.as, ins.rs1, ins.rs2 = ASLLI, uint32(p.From.Reg), obj.REG_NONE
2172-
if p.As == AMOVHU {
2173-
ins.imm = 48
2174-
} else if p.As == AMOVWU {
2175-
ins.imm = 32
2179+
if buildcfg.GORISCV64 >= 22 {
2180+
// Use ZEXTH or ADDUW to extend.
2181+
ins.as, ins.rs1, ins.rs2, ins.imm = AZEXTH, uint32(p.From.Reg), obj.REG_NONE, 0
2182+
if p.As == AMOVWU {
2183+
ins.as, ins.rs2 = AADDUW, REG_ZERO
2184+
}
2185+
} else {
2186+
// Use SLLI/SRLI sequence to extend.
2187+
ins.as, ins.rs1, ins.rs2 = ASLLI, uint32(p.From.Reg), obj.REG_NONE
2188+
if p.As == AMOVHU {
2189+
ins.imm = 48
2190+
} else if p.As == AMOVWU {
2191+
ins.imm = 32
2192+
}
2193+
ins2 := &instruction{as: ASRLI, rd: ins.rd, rs1: ins.rd, imm: ins.imm}
2194+
inss = append(inss, ins2)
21762195
}
2177-
ins2 := &instruction{as: ASRLI, rd: ins.rd, rs1: ins.rd, imm: ins.imm}
2178-
inss = append(inss, ins2)
21792196
}
21802197

21812198
case p.From.Type == obj.TYPE_MEM && p.To.Type == obj.TYPE_REG:

0 commit comments

Comments
 (0)