Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
07ff2c44
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
07ff2c44
编写于
9月 08, 2011
作者:
A
Anthony Liguori
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/master' into staging
上级
573da34a
82786041
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
43 addition
and
29 deletion
+43
-29
target-i386/translate.c
target-i386/translate.c
+43
-29
未找到文件。
target-i386/translate.c
浏览文件 @
07ff2c44
...
...
@@ -1406,70 +1406,84 @@ static void gen_shift_rm_T1(DisasContext *s, int ot, int op1,
{
target_ulong
mask
;
int
shift_label
;
TCGv
t0
,
t1
;
TCGv
t0
,
t1
,
t2
;
if
(
ot
==
OT_QUAD
)
if
(
ot
==
OT_QUAD
)
{
mask
=
0x3f
;
else
}
else
{
mask
=
0x1f
;
}
/* load */
if
(
op1
==
OR_TMP0
)
if
(
op1
==
OR_TMP0
)
{
gen_op_ld_T0_A0
(
ot
+
s
->
mem_index
);
else
}
else
{
gen_op_mov_TN_reg
(
ot
,
0
,
op1
);
}
tcg_gen_andi_tl
(
cpu_T
[
1
],
cpu_T
[
1
],
mask
);
t0
=
tcg_temp_local_new
();
t1
=
tcg_temp_local_new
();
t2
=
tcg_temp_local_new
();
tcg_gen_a
ddi_tl
(
cpu_tmp5
,
cpu_T
[
1
],
-
1
);
tcg_gen_a
ndi_tl
(
t2
,
cpu_T
[
1
],
mask
);
if
(
is_right
)
{
if
(
is_arith
)
{
gen_exts
(
ot
,
cpu_T
[
0
]);
tcg_gen_
sar_tl
(
cpu_T3
,
cpu_T
[
0
],
cpu_tmp5
);
tcg_gen_sar_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
cpu_T
[
1
]
);
tcg_gen_
mov_tl
(
t0
,
cpu_T
[
0
]
);
tcg_gen_sar_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
t2
);
}
else
{
gen_extu
(
ot
,
cpu_T
[
0
]);
tcg_gen_
shr_tl
(
cpu_T3
,
cpu_T
[
0
],
cpu_tmp5
);
tcg_gen_shr_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
cpu_T
[
1
]
);
tcg_gen_
mov_tl
(
t0
,
cpu_T
[
0
]
);
tcg_gen_shr_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
t2
);
}
}
else
{
tcg_gen_
shl_tl
(
cpu_T3
,
cpu_T
[
0
],
cpu_tmp5
);
tcg_gen_shl_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
cpu_T
[
1
]
);
tcg_gen_
mov_tl
(
t0
,
cpu_T
[
0
]
);
tcg_gen_shl_tl
(
cpu_T
[
0
],
cpu_T
[
0
],
t2
);
}
/* store */
if
(
op1
==
OR_TMP0
)
if
(
op1
==
OR_TMP0
)
{
gen_op_st_T0_A0
(
ot
+
s
->
mem_index
);
else
}
else
{
gen_op_mov_reg_T0
(
ot
,
op1
);
}
/* update eflags if non zero shift */
if
(
s
->
cc_op
!=
CC_OP_DYNAMIC
)
if
(
s
->
cc_op
!=
CC_OP_DYNAMIC
)
{
gen_op_set_cc_op
(
s
->
cc_op
);
}
/* XXX: inefficient */
t0
=
tcg_temp_local_new
();
t1
=
tcg_temp_local_new
();
tcg_gen_mov_tl
(
t0
,
cpu_T
[
0
]);
tcg_gen_mov_tl
(
t1
,
cpu_T3
);
tcg_gen_mov_tl
(
t1
,
cpu_T
[
0
]);
shift_label
=
gen_new_label
();
tcg_gen_brcondi_tl
(
TCG_COND_EQ
,
cpu_T
[
1
]
,
0
,
shift_label
);
tcg_gen_brcondi_tl
(
TCG_COND_EQ
,
t2
,
0
,
shift_label
);
tcg_gen_mov_tl
(
cpu_cc_src
,
t1
);
tcg_gen_mov_tl
(
cpu_cc_dst
,
t0
);
if
(
is_right
)
tcg_gen_addi_tl
(
t2
,
t2
,
-
1
);
tcg_gen_mov_tl
(
cpu_cc_dst
,
t1
);
if
(
is_right
)
{
if
(
is_arith
)
{
tcg_gen_sar_tl
(
cpu_cc_src
,
t0
,
t2
);
}
else
{
tcg_gen_shr_tl
(
cpu_cc_src
,
t0
,
t2
);
}
}
else
{
tcg_gen_shl_tl
(
cpu_cc_src
,
t0
,
t2
);
}
if
(
is_right
)
{
tcg_gen_movi_i32
(
cpu_cc_op
,
CC_OP_SARB
+
ot
);
else
}
else
{
tcg_gen_movi_i32
(
cpu_cc_op
,
CC_OP_SHLB
+
ot
);
}
gen_set_label
(
shift_label
);
s
->
cc_op
=
CC_OP_DYNAMIC
;
/* cannot predict flags after */
tcg_temp_free
(
t0
);
tcg_temp_free
(
t1
);
tcg_temp_free
(
t2
);
}
static
void
gen_shift_rm_im
(
DisasContext
*
s
,
int
ot
,
int
op1
,
int
op2
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录