Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
e9823b4c
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e9823b4c
编写于
7月 26, 2017
作者:
R
Richard Henderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
tcg/sparc: Use constant pool for movi
Signed-off-by:
N
Richard Henderson
<
rth@twiddle.net
>
上级
ab20bdc1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
58 addition
and
21 deletion
+58
-21
tcg/sparc/tcg-target.h
tcg/sparc/tcg-target.h
+2
-0
tcg/sparc/tcg-target.inc.c
tcg/sparc/tcg-target.inc.c
+56
-21
未找到文件。
tcg/sparc/tcg-target.h
浏览文件 @
e9823b4c
...
...
@@ -175,4 +175,6 @@ static inline void flush_icache_range(uintptr_t start, uintptr_t stop)
void
tb_target_set_jmp_target
(
uintptr_t
,
uintptr_t
,
uintptr_t
);
#define TCG_TARGET_NEED_POOL_LABELS
#endif
tcg/sparc/tcg-target.inc.c
浏览文件 @
e9823b4c
...
...
@@ -22,6 +22,8 @@
* THE SOFTWARE.
*/
#include "tcg-pool.inc.c"
#ifdef CONFIG_DEBUG_TCG
static
const
char
*
const
tcg_target_reg_names
[
TCG_TARGET_NB_REGS
]
=
{
"%g0"
,
...
...
@@ -292,33 +294,46 @@ static inline int check_fit_i32(int32_t val, unsigned int bits)
static
void
patch_reloc
(
tcg_insn_unit
*
code_ptr
,
int
type
,
intptr_t
value
,
intptr_t
addend
)
{
uint32_t
insn
;
uint32_t
insn
=
*
code_ptr
;
intptr_t
pcrel
;
tcg_debug_assert
(
addend
==
0
)
;
value
=
tcg_ptr_byte_diff
((
tcg_insn_unit
*
)
value
,
code_ptr
);
value
+=
addend
;
pcrel
=
tcg_ptr_byte_diff
((
tcg_insn_unit
*
)
value
,
code_ptr
);
switch
(
type
)
{
case
R_SPARC_WDISP16
:
if
(
!
check_fit_ptr
(
value
>>
2
,
16
))
{
tcg_abort
();
}
insn
=
*
code_ptr
;
assert
(
check_fit_ptr
(
pcrel
>>
2
,
16
));
insn
&=
~
INSN_OFF16
(
-
1
);
insn
|=
INSN_OFF16
(
value
);
*
code_ptr
=
insn
;
insn
|=
INSN_OFF16
(
pcrel
);
break
;
case
R_SPARC_WDISP19
:
if
(
!
check_fit_ptr
(
value
>>
2
,
19
))
{
tcg_abort
();
}
insn
=
*
code_ptr
;
assert
(
check_fit_ptr
(
pcrel
>>
2
,
19
));
insn
&=
~
INSN_OFF19
(
-
1
);
insn
|=
INSN_OFF19
(
value
);
*
code_ptr
=
insn
;
insn
|=
INSN_OFF19
(
pcrel
);
break
;
case
R_SPARC_13
:
/* Note that we're abusing this reloc type for our own needs. */
if
(
!
check_fit_ptr
(
value
,
13
))
{
int
adj
=
(
value
>
0
?
0xff8
:
-
0x1000
);
value
-=
adj
;
assert
(
check_fit_ptr
(
value
,
13
));
*
code_ptr
++
=
(
ARITH_ADD
|
INSN_RD
(
TCG_REG_T2
)
|
INSN_RS1
(
TCG_REG_TB
)
|
INSN_IMM13
(
adj
));
insn
^=
INSN_RS1
(
TCG_REG_TB
)
^
INSN_RS1
(
TCG_REG_T2
);
}
insn
&=
~
INSN_IMM13
(
-
1
);
insn
|=
INSN_IMM13
(
value
);
break
;
case
R_SPARC_32
:
/* Note that we're abusing this reloc type for our own needs. */
code_ptr
[
0
]
=
deposit32
(
code_ptr
[
0
],
0
,
22
,
value
>>
10
);
code_ptr
[
1
]
=
deposit32
(
code_ptr
[
1
],
0
,
10
,
value
);
return
;
default:
tcg_abort
();
g_assert_not_reached
();
}
*
code_ptr
=
insn
;
}
/* parse target specific constraints */
...
...
@@ -474,12 +489,24 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
return
;
}
if
(
USE_REG_TB
&&
!
in_prologue
)
{
intptr_t
diff
=
arg
-
(
uintptr_t
)
s
->
code_gen_ptr
;
if
(
check_fit_ptr
(
diff
,
13
))
{
tcg_out_arithi
(
s
,
ret
,
TCG_REG_TB
,
diff
,
ARITH_ADD
);
return
;
if
(
!
in_prologue
)
{
if
(
USE_REG_TB
)
{
intptr_t
diff
=
arg
-
(
uintptr_t
)
s
->
code_gen_ptr
;
if
(
check_fit_ptr
(
diff
,
13
))
{
tcg_out_arithi
(
s
,
ret
,
TCG_REG_TB
,
diff
,
ARITH_ADD
);
}
else
{
new_pool_label
(
s
,
arg
,
R_SPARC_13
,
s
->
code_ptr
,
-
(
intptr_t
)
s
->
code_gen_ptr
);
tcg_out32
(
s
,
LDX
|
INSN_RD
(
ret
)
|
INSN_RS1
(
TCG_REG_TB
));
/* May be used to extend the 13-bit range in patch_reloc. */
tcg_out32
(
s
,
NOP
);
}
}
else
{
new_pool_label
(
s
,
arg
,
R_SPARC_32
,
s
->
code_ptr
,
0
);
tcg_out_sethi
(
s
,
ret
,
0
);
tcg_out32
(
s
,
LDX
|
INSN_RD
(
ret
)
|
INSN_RS1
(
ret
)
|
INSN_IMM13
(
0
));
}
return
;
}
/* A 64-bit constant decomposed into 2 32-bit pieces. */
...
...
@@ -1058,6 +1085,14 @@ static void tcg_target_qemu_prologue(TCGContext *s)
#endif
}
static
void
tcg_out_nop_fill
(
tcg_insn_unit
*
p
,
int
count
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
++
i
)
{
p
[
i
]
=
NOP
;
}
}
#if defined(CONFIG_SOFTMMU)
/* Perform the TLB load and compare.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录