Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
9d708854
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
9 个月 前同步成功
通知
1183
Star
3914
Fork
526
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
XiangShan
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
9d708854
编写于
8月 28, 2023
作者:
S
sinsanction
提交者:
huxuan0307
8月 30, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Backend, Fusion: support instruction fusion case 'lui + addiw'
上级
4e4415fb
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
27 addition
and
3 deletion
+27
-3
src/main/scala/xiangshan/backend/decode/FusionDecoder.scala
src/main/scala/xiangshan/backend/decode/FusionDecoder.scala
+21
-1
src/main/scala/xiangshan/backend/fu/Alu.scala
src/main/scala/xiangshan/backend/fu/Alu.scala
+5
-2
src/main/scala/xiangshan/package.scala
src/main/scala/xiangshan/package.scala
+1
-0
未找到文件。
src/main/scala/xiangshan/backend/decode/FusionDecoder.scala
浏览文件 @
9d708854
...
@@ -486,6 +486,25 @@ class FusedLui32(pair: Seq[Valid[UInt]])(implicit p: Parameters)
...
@@ -486,6 +486,25 @@ class FusedLui32(pair: Seq[Valid[UInt]])(implicit p: Parameters)
XSDebug
(
isValid
,
p
"[fusedLui32] ${Hexadecimal(imm.get)} instr0=${Hexadecimal(instr(0))} instr1=${Hexadecimal(instr(1))}\n"
)
XSDebug
(
isValid
,
p
"[fusedLui32] ${Hexadecimal(imm.get)} instr0=${Hexadecimal(instr(0))} instr1=${Hexadecimal(instr(1))}\n"
)
}
}
// Case: get 32 bits imm (in word format)
// Source: `lui r1, 0xffffa`` + `addiw r1, r1, 1`
// Target: `lui32 r1, 0xffffa001` (customized internal opcode)
class
FusedLui32w
(
pair
:
Seq
[
Valid
[
UInt
]])(
implicit
p
:
Parameters
)
extends
BaseFusionCase
(
pair
)
{
def
inst1Cond
=
instr
(
0
)
===
Instructions
.
LUI
def
inst2Cond
=
instr
(
1
)
===
Instructions
.
ADDIW
def
isValid
:
Bool
=
inst1Cond
&&
inst2Cond
&&
withSameDest
&&
destToRs1
override
def
fuOpType
:
Option
[
UInt
=>
UInt
]
=
Some
((
_:
UInt
)
=>
ALUOpType
.
lui32addw
)
override
def
selImm
:
Option
[
UInt
]
=
Some
(
SelImm
.
IMM_LUI32
)
override
def
imm
:
Option
[
UInt
]
=
Some
(
Cat
(
instr
(
0
)(
31
,
12
),
instr
(
1
)(
31
,
20
)))
def
fusionName
:
String
=
"lui_addiw"
XSDebug
(
isValid
,
p
"[fusedLui32w] ${Hexadecimal(imm.get)} instr0=${Hexadecimal(instr(0))} instr1=${Hexadecimal(instr(1))}\n"
)
}
class
FusionDecodeInfo
extends
Bundle
{
class
FusionDecodeInfo
extends
Bundle
{
val
rs2FromRs1
=
Output
(
Bool
())
val
rs2FromRs1
=
Output
(
Bool
())
val
rs2FromRs2
=
Output
(
Bool
())
val
rs2FromRs2
=
Output
(
Bool
())
...
@@ -567,7 +586,8 @@ class FusionDecoder(implicit p: Parameters) extends XSModule {
...
@@ -567,7 +586,8 @@ class FusionDecoder(implicit p: Parameters) extends XSModule {
new
FusedAddwsexth
(
pair
),
new
FusedAddwsexth
(
pair
),
new
FusedLogiclsb
(
pair
),
new
FusedLogiclsb
(
pair
),
new
FusedLogicZexth
(
pair
),
new
FusedLogicZexth
(
pair
),
new
FusedLui32
(
pair
)
new
FusedLui32
(
pair
),
new
FusedLui32w
(
pair
)
)
)
val
fire
=
io
.
in
(
i
).
valid
&&
io
.
inReady
(
i
)
val
fire
=
io
.
in
(
i
).
valid
&&
io
.
inReady
(
i
)
val
instrPairValid
=
RegEnable
(
VecInit
(
pair
.
map
(
_
.
valid
)).
asUInt
.
andR
,
false
.
B
,
io
.
inReady
(
i
))
val
instrPairValid
=
RegEnable
(
VecInit
(
pair
.
map
(
_
.
valid
)).
asUInt
.
andR
,
false
.
B
,
io
.
inReady
(
i
))
...
...
src/main/scala/xiangshan/backend/fu/Alu.scala
浏览文件 @
9d708854
...
@@ -158,7 +158,7 @@ class WordResultSelect(implicit p: Parameters) extends XSModule {
...
@@ -158,7 +158,7 @@ class WordResultSelect(implicit p: Parameters) extends XSModule {
val
wordRes
=
Output
(
UInt
(
XLEN
.
W
))
val
wordRes
=
Output
(
UInt
(
XLEN
.
W
))
})
})
val
addsubRes
=
Mux
(!
io
.
func
(
2
)
&&
io
.
func
(
1
),
io
.
subw
,
io
.
addw
)
val
addsubRes
=
Mux
(!
io
.
func
(
2
)
&&
io
.
func
(
1
)
&&
!
io
.
func
(
0
)
,
io
.
subw
,
io
.
addw
)
val
shiftRes
=
Mux
(
io
.
func
(
2
),
Mux
(
io
.
func
(
0
),
io
.
rorw
,
io
.
rolw
),
val
shiftRes
=
Mux
(
io
.
func
(
2
),
Mux
(
io
.
func
(
0
),
io
.
rorw
,
io
.
rolw
),
Mux
(
io
.
func
(
1
),
io
.
sraw
,
Mux
(
io
.
func
(
0
),
io
.
srlw
,
io
.
sllw
)))
Mux
(
io
.
func
(
1
),
io
.
sraw
,
Mux
(
io
.
func
(
0
),
io
.
srlw
,
io
.
sllw
)))
val
wordRes
=
Mux
(
io
.
func
(
3
),
shiftRes
,
addsubRes
)
val
wordRes
=
Mux
(
io
.
func
(
3
),
shiftRes
,
addsubRes
)
...
@@ -219,7 +219,7 @@ class AluDataModule(implicit p: Parameters) extends XSModule {
...
@@ -219,7 +219,7 @@ class AluDataModule(implicit p: Parameters) extends XSModule {
// addw
// addw
val
addModule
=
Module
(
new
AddModule
)
val
addModule
=
Module
(
new
AddModule
)
addModule
.
io
.
srcw
:=
Mux
(!
func
(
2
)
&&
func
(
0
),
ZeroExt
(
src1
(
0
),
XLEN
),
src1
(
31
,
0
))
addModule
.
io
.
srcw
:=
Mux
(!
func
(
2
)
&&
func
(
0
),
Mux
(
func
(
1
),
SignExt
(
src2
(
11
,
0
),
XLEN
),
ZeroExt
(
src1
(
0
),
XLEN
)
),
src1
(
31
,
0
))
val
addwResultAll
=
VecInit
(
Seq
(
val
addwResultAll
=
VecInit
(
Seq
(
ZeroExt
(
addModule
.
io
.
addw
(
0
),
XLEN
),
ZeroExt
(
addModule
.
io
.
addw
(
0
),
XLEN
),
ZeroExt
(
addModule
.
io
.
addw
(
7
,
0
),
XLEN
),
ZeroExt
(
addModule
.
io
.
addw
(
7
,
0
),
XLEN
),
...
@@ -358,4 +358,7 @@ class AluDataModule(implicit p: Parameters) extends XSModule {
...
@@ -358,4 +358,7 @@ class AluDataModule(implicit p: Parameters) extends XSModule {
XSDebug
(
func
===
ALUOpType
.
lui32add
,
p
"[alu] func lui32: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n"
)
XSDebug
(
func
===
ALUOpType
.
lui32add
,
p
"[alu] func lui32: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n"
)
XSDebug
(
func
===
ALUOpType
.
lui32add
,
p
"[alu] func lui32: add_src1=${Hexadecimal(addModule.io.src(0))} add_src2=${Hexadecimal(addModule.io.src(1))} addres=${Hexadecimal(add)}\n"
)
XSDebug
(
func
===
ALUOpType
.
lui32add
,
p
"[alu] func lui32: add_src1=${Hexadecimal(addModule.io.src(0))} add_src2=${Hexadecimal(addModule.io.src(1))} addres=${Hexadecimal(add)}\n"
)
XSDebug
(
func
===
ALUOpType
.
lui32addw
,
p
"[alu] func lui32w: src1=${Hexadecimal(src1)} src2=${Hexadecimal(src2)} alures=${Hexadecimal(aluRes)}\n"
)
XSDebug
(
func
===
ALUOpType
.
lui32addw
,
p
"[alu] func lui32w: add_src1=${Hexadecimal(addModule.io.srcw)} add_src2=${Hexadecimal(addModule.io.src(1)(31,0))} addres=${Hexadecimal(addw)}\n"
)
}
}
src/main/scala/xiangshan/package.scala
浏览文件 @
9d708854
...
@@ -188,6 +188,7 @@ package object xiangshan {
...
@@ -188,6 +188,7 @@ package object xiangshan {
def
addw
=
"b001_0000"
.
U
// addw: SEXT((src1 + src2)[31:0])
def
addw
=
"b001_0000"
.
U
// addw: SEXT((src1 + src2)[31:0])
def
oddaddw
=
"b001_0001"
.
U
// oddaddw: SEXT((src1[0] + src2)[31:0])
def
oddaddw
=
"b001_0001"
.
U
// oddaddw: SEXT((src1[0] + src2)[31:0])
def
subw
=
"b001_0010"
.
U
// subw: SEXT((src1 - src2)[31:0])
def
subw
=
"b001_0010"
.
U
// subw: SEXT((src1 - src2)[31:0])
def
lui32addw
=
"b001_0011"
.
U
// lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64)
def
addwbit
=
"b001_0100"
.
U
// addwbit: (src1 + src2)[0]
def
addwbit
=
"b001_0100"
.
U
// addwbit: (src1 + src2)[0]
def
addwbyte
=
"b001_0101"
.
U
// addwbyte: (src1 + src2)[7:0]
def
addwbyte
=
"b001_0101"
.
U
// addwbyte: (src1 + src2)[7:0]
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录