Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
77bfc7c0
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看板
提交
77bfc7c0
编写于
7月 31, 2017
作者:
R
Richard Henderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
tcg/ppc: Look for shifted constants
Signed-off-by:
N
Richard Henderson
<
rth@twiddle.net
>
上级
5964fca8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
48 addition
and
10 deletion
+48
-10
tcg/ppc/tcg-target.inc.c
tcg/ppc/tcg-target.inc.c
+48
-10
未找到文件。
tcg/ppc/tcg-target.inc.c
浏览文件 @
77bfc7c0
...
...
@@ -593,11 +593,26 @@ static inline void tcg_out_shri64(TCGContext *s, TCGReg dst, TCGReg src, int c)
tcg_out_rld
(
s
,
RLDICL
,
dst
,
src
,
64
-
c
,
c
);
}
/* Emit a move into ret of arg, if it can be done in one insn. */
static
bool
tcg_out_movi_one
(
TCGContext
*
s
,
TCGReg
ret
,
tcg_target_long
arg
)
{
if
(
arg
==
(
int16_t
)
arg
)
{
tcg_out32
(
s
,
ADDI
|
TAI
(
ret
,
0
,
arg
));
return
true
;
}
if
(
arg
==
(
int32_t
)
arg
&&
(
arg
&
0xffff
)
==
0
)
{
tcg_out32
(
s
,
ADDIS
|
TAI
(
ret
,
0
,
arg
>>
16
));
return
true
;
}
return
false
;
}
static
void
tcg_out_movi_int
(
TCGContext
*
s
,
TCGType
type
,
TCGReg
ret
,
tcg_target_long
arg
,
bool
in_prologue
)
{
intptr_t
tb_diff
;
int32_t
high
;
tcg_target_long
tmp
;
int
shift
;
tcg_debug_assert
(
TCG_TARGET_REG_BITS
==
64
||
type
==
TCG_TYPE_I32
);
...
...
@@ -606,8 +621,7 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
}
/* Load 16-bit immediates with one insn. */
if
(
arg
==
(
int16_t
)
arg
)
{
tcg_out32
(
s
,
ADDI
|
TAI
(
ret
,
0
,
arg
));
if
(
tcg_out_movi_one
(
s
,
ret
,
arg
))
{
return
;
}
...
...
@@ -618,12 +632,11 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
return
;
}
/* Load 32-bit immediates with two insns. */
/* Load 32-bit immediates with two insns. Note that we've already
eliminated bare ADDIS, so we know both insns are required. */
if
(
TCG_TARGET_REG_BITS
==
32
||
arg
==
(
int32_t
)
arg
)
{
tcg_out32
(
s
,
ADDIS
|
TAI
(
ret
,
0
,
arg
>>
16
));
if
(
arg
&
0xffff
)
{
tcg_out32
(
s
,
ORI
|
SAI
(
ret
,
ret
,
arg
));
}
tcg_out32
(
s
,
ORI
|
SAI
(
ret
,
ret
,
arg
));
return
;
}
if
(
arg
==
(
uint32_t
)
arg
&&
!
(
arg
&
0x8000
))
{
...
...
@@ -632,15 +645,40 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
return
;
}
/* Load masked 16-bit value. */
if
(
arg
>
0
&&
(
arg
&
0x8000
))
{
tmp
=
arg
|
0x7fff
;
if
((
tmp
&
(
tmp
+
1
))
==
0
)
{
int
mb
=
clz64
(
tmp
+
1
)
+
1
;
tcg_out32
(
s
,
ADDI
|
TAI
(
ret
,
0
,
arg
));
tcg_out_rld
(
s
,
RLDICL
,
ret
,
ret
,
0
,
mb
);
return
;
}
}
/* Load common masks with 2 insns. */
shift
=
ctz64
(
arg
);
tmp
=
arg
>>
shift
;
if
(
tmp
==
(
int16_t
)
tmp
)
{
tcg_out32
(
s
,
ADDI
|
TAI
(
ret
,
0
,
tmp
));
tcg_out_shli64
(
s
,
ret
,
ret
,
shift
);
return
;
}
shift
=
clz64
(
arg
);
if
(
tcg_out_movi_one
(
s
,
ret
,
arg
<<
shift
))
{
tcg_out_shri64
(
s
,
ret
,
ret
,
shift
);
return
;
}
/* Load addresses within 2GB of TB with 2 (or rarely 3) insns. */
if
(
!
in_prologue
&&
USE_REG_TB
&&
tb_diff
==
(
int32_t
)
tb_diff
)
{
tcg_out_mem_long
(
s
,
ADDI
,
ADD
,
ret
,
TCG_REG_TB
,
tb_diff
);
return
;
}
high
=
arg
>>
31
>>
1
;
tcg_out_movi
(
s
,
TCG_TYPE_I32
,
ret
,
high
);
if
(
high
)
{
tmp
=
arg
>>
31
>>
1
;
tcg_out_movi
(
s
,
TCG_TYPE_I32
,
ret
,
tmp
);
if
(
tmp
)
{
tcg_out_shli64
(
s
,
ret
,
ret
,
32
);
}
if
(
arg
&
0xffff0000
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录