@@ -26,6 +26,7 @@ import (
26
26
"cmd/internal/sys"
27
27
"fmt"
28
28
"internal/abi"
29
+ "internal/buildcfg"
29
30
"log"
30
31
"math/bits"
31
32
"strings"
@@ -2157,25 +2158,41 @@ func instructionsForMOV(p *obj.Prog) []*instruction {
2157
2158
case AMOVD : // MOVD Ra, Rb -> FSGNJD Ra, Ra, Rb
2158
2159
ins .as , ins .rs1 = AFSGNJD , uint32 (p .From .Reg )
2159
2160
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 )
2166
2177
}
2167
- ins2 := & instruction {as : ASRAI , rd : ins .rd , rs1 : ins .rd , imm : ins .imm }
2168
- inss = append (inss , ins2 )
2169
2178
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 )
2176
2195
}
2177
- ins2 := & instruction {as : ASRLI , rd : ins .rd , rs1 : ins .rd , imm : ins .imm }
2178
- inss = append (inss , ins2 )
2179
2196
}
2180
2197
2181
2198
case p .From .Type == obj .TYPE_MEM && p .To .Type == obj .TYPE_REG :
0 commit comments