Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
NEMU
提交
06a08679
N
NEMU
项目概览
OpenXiangShan
/
NEMU
11 个月 前同步成功
通知
7
Star
171
Fork
67
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
NEMU
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
06a08679
编写于
9月 15, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
riscv64,exec: pass wanshu
上级
b697c95f
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
61 addition
and
29 deletion
+61
-29
src/isa/riscv64/decode.c
src/isa/riscv64/decode.c
+45
-21
src/isa/riscv64/exec/all-instr.h
src/isa/riscv64/exec/all-instr.h
+1
-0
src/isa/riscv64/exec/control.c
src/isa/riscv64/exec/control.c
+5
-0
src/isa/riscv64/exec/exec.c
src/isa/riscv64/exec/exec.c
+4
-4
src/isa/riscv64/include/isa/decode.h
src/isa/riscv64/include/isa/decode.h
+6
-4
未找到文件。
src/isa/riscv64/decode.c
浏览文件 @
06a08679
...
...
@@ -95,14 +95,6 @@ make_DHelper(csr) {
#define creg2reg(creg) (creg + 8)
make_DHelper
(
CI
)
{
decode_op_r
(
id_src
,
decinfo
.
isa
.
instr
.
c_rd_rs1
,
true
);
sword_t
simm
=
(
decinfo
.
isa
.
instr
.
c_simm12
<<
5
)
|
decinfo
.
isa
.
instr
.
c_imm6_2
;
assert
(
simm
!=
0
);
decode_op_i
(
id_src2
,
simm
,
true
);
decode_op_r
(
id_dest
,
decinfo
.
isa
.
instr
.
c_rd_rs1
,
false
);
}
make_DHelper
(
CR
)
{
decode_op_r
(
id_src
,
creg2reg
(
decinfo
.
isa
.
instr
.
c_rd_rs1_
),
true
);
decode_op_r
(
id_src2
,
creg2reg
(
decinfo
.
isa
.
instr
.
c_rs2_
),
true
);
...
...
@@ -124,6 +116,22 @@ make_DHelper(CB) {
decode_op_r
(
id_src2
,
0
,
true
);
}
static
make_DHelper
(
CJ
)
{
sword_t
simm11
=
decinfo
.
isa
.
instr
.
c_simm12
;
uint32_t
imm10
=
(
decinfo
.
isa
.
instr
.
c_target
>>
6
)
&
0x1
;
uint32_t
imm9_8
=
(
decinfo
.
isa
.
instr
.
c_target
>>
7
)
&
0x3
;
uint32_t
imm7
=
(
decinfo
.
isa
.
instr
.
c_target
>>
4
)
&
0x1
;
uint32_t
imm6
=
(
decinfo
.
isa
.
instr
.
c_target
>>
5
)
&
0x1
;
uint32_t
imm5
=
(
decinfo
.
isa
.
instr
.
c_target
>>
0
)
&
0x1
;
uint32_t
imm4
=
(
decinfo
.
isa
.
instr
.
c_target
>>
9
)
&
0x1
;
uint32_t
imm3_1
=
(
decinfo
.
isa
.
instr
.
c_target
>>
1
)
&
0x7
;
sword_t
offset
=
(
simm11
<<
11
)
|
(
imm10
<<
10
)
|
(
imm9_8
<<
8
)
|
(
imm7
<<
7
)
|
(
imm6
<<
6
)
|
(
imm5
<<
5
)
|
(
imm4
<<
4
)
|
(
imm3_1
<<
1
);
decinfo
.
jmp_pc
=
cpu
.
pc
+
offset
;
decode_op_i
(
id_src
,
decinfo
.
jmp_pc
,
true
);
}
make_DHelper
(
C_SDSP
)
{
decode_op_r
(
id_src
,
2
,
true
);
uint32_t
imm8_6
=
(
decinfo
.
isa
.
instr
.
c_imm12_7
&
0x7
);
...
...
@@ -154,26 +162,37 @@ make_DHelper(C_LDSP) {
decinfo
.
width
=
8
;
}
make_DHelper
(
C_LI
)
{
decode_op_r
(
id_src
,
0
,
true
);
static
void
decode_C_xxx_imm_rd
(
bool
is_rs1_zero
)
{
decode_op_r
(
id_src
,
(
is_rs1_zero
?
0
:
decinfo
.
isa
.
instr
.
c_rd_rs1
)
,
true
);
sword_t
simm
=
(
decinfo
.
isa
.
instr
.
c_simm12
<<
5
)
|
decinfo
.
isa
.
instr
.
c_imm6_2
;
decode_op_i
(
id_src2
,
simm
,
true
);
decode_op_r
(
id_dest
,
decinfo
.
isa
.
instr
.
c_rd_rs1
,
false
);
}
make_DHelper
(
C_MV
)
{
decode_op_r
(
id_src
,
0
,
true
);
decode_op_r
(
id_src2
,
decinfo
.
isa
.
instr
.
c_rs2
,
true
);
decode_op_r
(
id_dest
,
decinfo
.
isa
.
instr
.
c_rd_rs1
,
false
);
assert
(
decinfo
.
isa
.
instr
.
c_rs2
!=
0
);
assert
(
decinfo
.
isa
.
instr
.
c_rd_rs1
!=
0
);
make_DHelper
(
C_0_imm_rd
)
{
decode_C_xxx_imm_rd
(
true
);
}
make_DHelper
(
C_10_100
)
{
decode_op_r
(
id_src
,
decinfo
.
isa
.
instr
.
c_rd_rs1
,
true
);
decode_op_r
(
id_src2
,
decinfo
.
isa
.
instr
.
c_rs2
,
true
);
decode_op_r
(
id_dest
,
0
,
false
);
// overwrite id_dest if necessary
make_DHelper
(
C_rs1_imm_rd
)
{
decode_C_xxx_imm_rd
(
false
);
}
static
void
decode_C_xxx_xxx_xxx
(
bool
is_rs1_zero
,
bool
is_rs2_zero
,
bool
is_rd_zero
)
{
decode_op_r
(
id_src
,
(
is_rs1_zero
?
0
:
decinfo
.
isa
.
instr
.
c_rd_rs1
),
true
);
decode_op_r
(
id_src2
,
(
is_rs2_zero
?
0
:
decinfo
.
isa
.
instr
.
c_rs2
),
true
);
decode_op_r
(
id_dest
,
(
is_rd_zero
?
0
:
decinfo
.
isa
.
instr
.
c_rd_rs1
),
false
);
}
make_DHelper
(
C_0_rs2_rd
)
{
decode_C_xxx_xxx_xxx
(
true
,
false
,
false
);
}
make_DHelper
(
C_rs1_rs2_0
)
{
decode_C_xxx_xxx_xxx
(
false
,
false
,
true
);
}
make_DHelper
(
C_rs1_rs2_rd
)
{
decode_C_xxx_xxx_xxx
(
false
,
false
,
false
);
}
make_DHelper
(
C_ADDI16SP
)
{
...
...
@@ -203,3 +222,8 @@ make_DHelper(C_LW) {
decinfo
.
width
=
4
;
}
make_DHelper
(
C_J
)
{
decode_CJ
(
pc
);
decode_op_r
(
id_dest
,
0
,
false
);
}
src/isa/riscv64/exec/all-instr.h
浏览文件 @
06a08679
...
...
@@ -21,6 +21,7 @@ make_EHelper(jal);
make_EHelper
(
jalr
);
make_EHelper
(
branch
);
make_EHelper
(
beq
);
make_EHelper
(
bne
);
make_EHelper
(
inv
);
make_EHelper
(
nemu_trap
);
...
...
src/isa/riscv64/exec/control.c
浏览文件 @
06a08679
...
...
@@ -45,3 +45,8 @@ make_EHelper(beq) {
rtl_jrelop
(
RELOP_EQ
,
&
id_src
->
val
,
&
id_src2
->
val
,
decinfo
.
jmp_pc
);
print_asm
(
"beq %s,%s,%s"
,
id_src
->
str
,
id_src2
->
str
,
id_dest
->
str
);
}
make_EHelper
(
bne
)
{
rtl_jrelop
(
RELOP_NE
,
&
id_src
->
val
,
&
id_src2
->
val
,
decinfo
.
jmp_pc
);
print_asm
(
"bne %s,%s,%s"
,
id_src
->
str
,
id_src2
->
str
,
id_dest
->
str
);
}
src/isa/riscv64/exec/exec.c
浏览文件 @
06a08679
...
...
@@ -75,7 +75,7 @@ static OpcodeEntry opcode_table [32] = {
static
make_EHelper
(
C_10_100
)
{
static
OpcodeEntry
table
[
8
]
=
{
EMPTY
,
EMPTY
,
EX
(
jalr
),
IDEX
(
C_MV
,
add
),
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
IDEX
(
C_rs1_rs2_0
,
jalr
),
IDEX
(
C_0_rs2_rd
,
add
),
EMPTY
,
EMPTY
,
EMPTY
,
IDEX
(
C_rs1_rs2_rd
,
add
)
,
};
uint32_t
cond_c_simm12_not0
=
(
decinfo
.
isa
.
instr
.
c_simm12
!=
0
);
uint32_t
cond_c_rd_rs1_not0
=
(
decinfo
.
isa
.
instr
.
c_rd_rs1
!=
0
);
...
...
@@ -98,7 +98,7 @@ static make_EHelper(C_01_100) {
case
3
:
{
decode_CR
(
pc
);
static
OpcodeEntry
table
[
8
]
=
{
EX
(
sub
),
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
E
MPTY
,
EMPTY
,
EMPTY
,
EX
(
sub
),
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
E
X
(
addw
)
,
EMPTY
,
EMPTY
,
};
uint32_t
idx2
=
(
decinfo
.
isa
.
instr
.
c_func6
>>
2
)
&
0x1
;
...
...
@@ -114,8 +114,8 @@ static make_EHelper(C_01_100) {
static
OpcodeEntry
rvc_table
[
3
][
8
]
=
{
{
EMPTY
,
EMPTY
,
IDEX
(
C_LW
,
lds
),
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
EMPTY
,
},
{
IDEX
(
C
I
,
add
),
EMPTY
,
IDEX
(
C_LI
,
add
),
EX
(
C_01_011
),
EX
(
C_01_100
),
EMPTY
,
IDEX
(
CB
,
beq
),
EMPTY
,
},
{
EMPTY
,
EMPTY
,
EMPTY
,
IDEX
(
C_LDSP
,
ld
),
IDEX
(
C_10_100
,
C_10_100
),
EMPTY
,
EMPTY
,
IDEX
(
C_SDSP
,
st
),
},
{
IDEX
(
C
_rs1_imm_rd
,
add
),
IDEX
(
C_rs1_imm_rd
,
addw
),
IDEX
(
C_0_imm_rd
,
add
),
EX
(
C_01_011
),
EX
(
C_01_100
),
IDEX
(
C_J
,
jal
),
IDEX
(
CB
,
beq
),
IDEX
(
CB
,
bne
)
,
},
{
EMPTY
,
EMPTY
,
EMPTY
,
IDEX
(
C_LDSP
,
ld
),
EX
(
C_10_100
),
EMPTY
,
EMPTY
,
IDEX
(
C_SDSP
,
st
),
},
};
void
isa_exec
(
vaddr_t
*
pc
)
{
...
...
src/isa/riscv64/include/isa/decode.h
浏览文件 @
06a08679
...
...
@@ -111,15 +111,17 @@ make_DHelper(ld);
make_DHelper
(
st
);
make_DHelper
(
csr
);
make_DHelper
(
CI
);
make_DHelper
(
CR
);
make_DHelper
(
CB
);
make_DHelper
(
C_SDSP
);
make_DHelper
(
C_LDSP
);
make_DHelper
(
C_MV
);
make_DHelper
(
C_LI
);
make_DHelper
(
C_10_100
);
make_DHelper
(
C_0_imm_rd
);
make_DHelper
(
C_rs1_imm_rd
);
make_DHelper
(
C_0_rs2_rd
);
make_DHelper
(
C_rs1_rs2_0
);
make_DHelper
(
C_rs1_rs2_rd
);
make_DHelper
(
C_ADDI16SP
);
make_DHelper
(
C_LW
);
make_DHelper
(
C_J
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录