Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
5d7fd045
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,发现更多精彩内容 >>
提交
5d7fd045
编写于
9月 05, 2012
作者:
R
Richard Henderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
target-s390: Convert FP LOAD COMPLIMENT, NEGATIVE, POSITIVE
Signed-off-by:
N
Richard Henderson
<
rth@twiddle.net
>
上级
31aa97d1
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
66 addition
and
97 deletion
+66
-97
target-s390x/fpu_helper.c
target-s390x/fpu_helper.c
+0
-65
target-s390x/helper.h
target-s390x/helper.h
+0
-6
target-s390x/insn-data.def
target-s390x/insn-data.def
+9
-0
target-s390x/translate.c
target-s390x/translate.c
+57
-26
未找到文件。
target-s390x/fpu_helper.c
浏览文件 @
5d7fd045
...
@@ -360,71 +360,6 @@ uint64_t HELPER(lexb)(CPUS390XState *env, uint64_t ah, uint64_t al)
...
@@ -360,71 +360,6 @@ uint64_t HELPER(lexb)(CPUS390XState *env, uint64_t ah, uint64_t al)
return
ret
;
return
ret
;
}
}
/* absolute value of 32-bit float */
uint32_t
HELPER
(
lpebr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
float32
v1
;
float32
v2
=
env
->
fregs
[
f2
].
d
;
v1
=
float32_abs
(
v2
);
env
->
fregs
[
f1
].
d
=
v1
;
return
set_cc_nz_f32
(
v1
);
}
/* absolute value of 64-bit float */
uint32_t
HELPER
(
lpdbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
float64
v1
;
float64
v2
=
env
->
fregs
[
f2
].
d
;
v1
=
float64_abs
(
v2
);
env
->
fregs
[
f1
].
d
=
v1
;
return
set_cc_nz_f64
(
v1
);
}
/* absolute value of 128-bit float */
uint32_t
HELPER
(
lpxbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
CPU_QuadU
v1
;
CPU_QuadU
v2
;
v2
.
ll
.
upper
=
env
->
fregs
[
f2
].
ll
;
v2
.
ll
.
lower
=
env
->
fregs
[
f2
+
2
].
ll
;
v1
.
q
=
float128_abs
(
v2
.
q
);
env
->
fregs
[
f1
].
ll
=
v1
.
ll
.
upper
;
env
->
fregs
[
f1
+
2
].
ll
=
v1
.
ll
.
lower
;
return
set_cc_nz_f128
(
v1
.
q
);
}
/* load complement of 32-bit float */
uint32_t
HELPER
(
lcebr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
env
->
fregs
[
f1
].
l
.
upper
=
float32_chs
(
env
->
fregs
[
f2
].
l
.
upper
);
return
set_cc_nz_f32
(
env
->
fregs
[
f1
].
l
.
upper
);
}
/* load complement of 64-bit float */
uint32_t
HELPER
(
lcdbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
env
->
fregs
[
f1
].
d
=
float64_chs
(
env
->
fregs
[
f2
].
d
);
return
set_cc_nz_f64
(
env
->
fregs
[
f1
].
d
);
}
/* load complement of 128-bit float */
uint32_t
HELPER
(
lcxbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
CPU_QuadU
x1
,
x2
;
x2
.
ll
.
upper
=
env
->
fregs
[
f2
].
ll
;
x2
.
ll
.
lower
=
env
->
fregs
[
f2
+
2
].
ll
;
x1
.
q
=
float128_chs
(
x2
.
q
);
env
->
fregs
[
f1
].
ll
=
x1
.
ll
.
upper
;
env
->
fregs
[
f1
+
2
].
ll
=
x1
.
ll
.
lower
;
return
set_cc_nz_f128
(
x1
.
q
);
}
/* 32-bit FP compare */
/* 32-bit FP compare */
uint32_t
HELPER
(
ceb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64_t
f2
)
uint32_t
HELPER
(
ceb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64_t
f2
)
{
{
...
...
target-s390x/helper.h
浏览文件 @
5d7fd045
...
@@ -56,12 +56,6 @@ DEF_HELPER_2(lxdb, i64, env, i64)
...
@@ -56,12 +56,6 @@ DEF_HELPER_2(lxdb, i64, env, i64)
DEF_HELPER_2
(
lxeb
,
i64
,
env
,
i64
)
DEF_HELPER_2
(
lxeb
,
i64
,
env
,
i64
)
DEF_HELPER_2
(
ledb
,
i64
,
env
,
i64
)
DEF_HELPER_2
(
ledb
,
i64
,
env
,
i64
)
DEF_HELPER_3
(
lexb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_3
(
lexb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_3
(
lpebr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
lpdbr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
lpxbr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
lcebr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
lcdbr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
lcxbr
,
i32
,
env
,
i32
,
i32
)
DEF_HELPER_FLAGS_3
(
ceb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
)
DEF_HELPER_FLAGS_3
(
ceb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
)
DEF_HELPER_FLAGS_3
(
cdb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
)
DEF_HELPER_FLAGS_3
(
cdb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
)
DEF_HELPER_FLAGS_5
(
cxb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
,
i64
,
i64
)
DEF_HELPER_FLAGS_5
(
cxb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
,
i64
,
i64
)
...
...
target-s390x/insn-data.def
浏览文件 @
5d7fd045
...
@@ -266,6 +266,9 @@
...
@@ -266,6 +266,9 @@
C(0x1300, LCR, RR_a, Z, 0, r2, new, r1_32, neg, neg32)
C(0x1300, LCR, RR_a, Z, 0, r2, new, r1_32, neg, neg32)
C(0xb903, LCGR, RRE, Z, 0, r2, r1, 0, neg, neg64)
C(0xb903, LCGR, RRE, Z, 0, r2, r1, 0, neg, neg64)
C(0xb913, LCGFR, RRE, Z, 0, r2_32s, r1, 0, neg, neg64)
C(0xb913, LCGFR, RRE, Z, 0, r2_32s, r1, 0, neg, neg64)
C(0xb303, LCEBR, RRE, Z, 0, e2, new, e1, negf32, f32)
C(0xb313, LCDBR, RRE, Z, 0, f2_o, f1, 0, negf64, f64)
C(0xb343, LCXBR, RRE, Z, 0, x2_o, x1, 0, negf128, f128)
/* LOAD HALFWORD */
/* LOAD HALFWORD */
C(0xb927, LHR, RRE, EI, 0, r2_16s, 0, r1_32, mov2, 0)
C(0xb927, LHR, RRE, EI, 0, r2_16s, 0, r1_32, mov2, 0)
C(0xb907, LGHR, RRE, EI, 0, r2_16s, 0, r1, mov2, 0)
C(0xb907, LGHR, RRE, EI, 0, r2_16s, 0, r1, mov2, 0)
...
@@ -310,10 +313,16 @@
...
@@ -310,10 +313,16 @@
C(0x1100, LNR, RR_a, Z, 0, r2_32s, new, r1_32, nabs, nabs32)
C(0x1100, LNR, RR_a, Z, 0, r2_32s, new, r1_32, nabs, nabs32)
C(0xb901, LNGR, RRE, Z, 0, r2, r1, 0, nabs, nabs64)
C(0xb901, LNGR, RRE, Z, 0, r2, r1, 0, nabs, nabs64)
C(0xb911, LNGFR, RRE, Z, 0, r2_32s, r1, 0, nabs, nabs64)
C(0xb911, LNGFR, RRE, Z, 0, r2_32s, r1, 0, nabs, nabs64)
C(0xb301, LNEBR, RRE, Z, 0, e2, new, e1, nabsf32, f32)
C(0xb311, LNDBR, RRE, Z, 0, f2_o, f1, 0, nabsf64, f64)
C(0xb341, LNXBR, RRE, Z, 0, x2_o, x1, 0, nabsf128, f128)
/* LOAD POSITIVE */
/* LOAD POSITIVE */
C(0x1000, LPR, RR_a, Z, 0, r2_32s, new, r1_32, abs, abs32)
C(0x1000, LPR, RR_a, Z, 0, r2_32s, new, r1_32, abs, abs32)
C(0xb900, LPGR, RRE, Z, 0, r2, r1, 0, abs, abs64)
C(0xb900, LPGR, RRE, Z, 0, r2, r1, 0, abs, abs64)
C(0xb910, LPGFR, RRE, Z, 0, r2_32s, r1, 0, abs, abs64)
C(0xb910, LPGFR, RRE, Z, 0, r2_32s, r1, 0, abs, abs64)
C(0xb300, LPEBR, RRE, Z, 0, e2, new, e1, absf32, f32)
C(0xb310, LPDBR, RRE, Z, 0, f2_o, f1, 0, absf64, f64)
C(0xb340, LPXBR, RRE, Z, 0, x2_o, x1, 0, absf128, f128)
/* LOAD REVERSED */
/* LOAD REVERSED */
C(0xb91f, LRVR, RRE, Z, 0, r2_32u, new, r1_32, rev32, 0)
C(0xb91f, LRVR, RRE, Z, 0, r2_32u, new, r1_32, rev32, 0)
C(0xb90f, LRVGR, RRE, Z, 0, r2_o, r1, 0, rev64, 0)
C(0xb90f, LRVGR, RRE, Z, 0, r2_o, r1, 0, rev64, 0)
...
...
target-s390x/translate.c
浏览文件 @
5d7fd045
...
@@ -1385,35 +1385,9 @@ static void disas_b3(CPUS390XState *env, DisasContext *s, int op, int m3,
...
@@ -1385,35 +1385,9 @@ static void disas_b3(CPUS390XState *env, DisasContext *s, int op, int m3,
tcg_temp_free_i32(tmp32_2);
tcg_temp_free_i32(tmp32_2);
switch
(
op
)
{
switch
(
op
)
{
case
0x0
:
/* LPEBR R1,R2 [RRE] */
FP_HELPER_CC
(
lpebr
);
break
;
case
0x3
:
/* LCEBR R1,R2 [RRE] */
FP_HELPER_CC
(
lcebr
);
break
;
case
0x10
:
/* LPDBR R1,R2 [RRE] */
FP_HELPER_CC
(
lpdbr
);
break
;
case
0x13
:
/* LCDBR R1,R2 [RRE] */
FP_HELPER_CC
(
lcdbr
);
break
;
case
0x15
:
/* SQBDR R1,R2 [RRE] */
case
0x15
:
/* SQBDR R1,R2 [RRE] */
FP_HELPER
(
sqdbr
);
FP_HELPER
(
sqdbr
);
break
;
break
;
case
0x40
:
/* LPXBR R1,R2 [RRE] */
FP_HELPER_CC
(
lpxbr
);
break
;
case
0x43
:
/* LCXBR R1,R2 [RRE] */
FP_HELPER_CC
(
lcxbr
);
break
;
case
0x65
:
/* LXR R1,R2 [RRE] */
tmp
=
load_freg
(
r2
);
store_freg
(
r1
,
tmp
);
tcg_temp_free_i64
(
tmp
);
tmp
=
load_freg
(
r2
+
2
);
store_freg
(
r1
+
2
,
tmp
);
tcg_temp_free_i64
(
tmp
);
break
;
case
0x74
:
/* LZER R1 [RRE] */
case
0x74
:
/* LZER R1 [RRE] */
tmp32_1
=
tcg_const_i32
(
r1
);
tmp32_1
=
tcg_const_i32
(
r1
);
gen_helper_lzer
(
cpu_env
,
tmp32_1
);
gen_helper_lzer
(
cpu_env
,
tmp32_1
);
...
@@ -1997,6 +1971,25 @@ static ExitStatus op_abs(DisasContext *s, DisasOps *o)
...
@@ -1997,6 +1971,25 @@ static ExitStatus op_abs(DisasContext *s, DisasOps *o)
return
NO_EXIT
;
return
NO_EXIT
;
}
}
static
ExitStatus
op_absf32
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_andi_i64
(
o
->
out
,
o
->
in2
,
0x7fffffffull
);
return
NO_EXIT
;
}
static
ExitStatus
op_absf64
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_andi_i64
(
o
->
out
,
o
->
in2
,
0x7fffffffffffffffull
);
return
NO_EXIT
;
}
static
ExitStatus
op_absf128
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_andi_i64
(
o
->
out
,
o
->
in1
,
0x7fffffffffffffffull
);
tcg_gen_mov_i64
(
o
->
out2
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_add
(
DisasContext
*
s
,
DisasOps
*
o
)
static
ExitStatus
op_add
(
DisasContext
*
s
,
DisasOps
*
o
)
{
{
tcg_gen_add_i64
(
o
->
out
,
o
->
in1
,
o
->
in2
);
tcg_gen_add_i64
(
o
->
out
,
o
->
in1
,
o
->
in2
);
...
@@ -2799,6 +2792,25 @@ static ExitStatus op_nabs(DisasContext *s, DisasOps *o)
...
@@ -2799,6 +2792,25 @@ static ExitStatus op_nabs(DisasContext *s, DisasOps *o)
return
NO_EXIT
;
return
NO_EXIT
;
}
}
static
ExitStatus
op_nabsf32
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_ori_i64
(
o
->
out
,
o
->
in2
,
0x80000000ull
);
return
NO_EXIT
;
}
static
ExitStatus
op_nabsf64
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_ori_i64
(
o
->
out
,
o
->
in2
,
0x8000000000000000ull
);
return
NO_EXIT
;
}
static
ExitStatus
op_nabsf128
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_ori_i64
(
o
->
out
,
o
->
in1
,
0x8000000000000000ull
);
tcg_gen_mov_i64
(
o
->
out2
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_nc
(
DisasContext
*
s
,
DisasOps
*
o
)
static
ExitStatus
op_nc
(
DisasContext
*
s
,
DisasOps
*
o
)
{
{
TCGv_i32
l
=
tcg_const_i32
(
get_field
(
s
->
fields
,
l1
));
TCGv_i32
l
=
tcg_const_i32
(
get_field
(
s
->
fields
,
l1
));
...
@@ -2815,6 +2827,25 @@ static ExitStatus op_neg(DisasContext *s, DisasOps *o)
...
@@ -2815,6 +2827,25 @@ static ExitStatus op_neg(DisasContext *s, DisasOps *o)
return
NO_EXIT
;
return
NO_EXIT
;
}
}
static
ExitStatus
op_negf32
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_xori_i64
(
o
->
out
,
o
->
in2
,
0x80000000ull
);
return
NO_EXIT
;
}
static
ExitStatus
op_negf64
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_xori_i64
(
o
->
out
,
o
->
in2
,
0x8000000000000000ull
);
return
NO_EXIT
;
}
static
ExitStatus
op_negf128
(
DisasContext
*
s
,
DisasOps
*
o
)
{
tcg_gen_xori_i64
(
o
->
out
,
o
->
in1
,
0x8000000000000000ull
);
tcg_gen_mov_i64
(
o
->
out2
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_oc
(
DisasContext
*
s
,
DisasOps
*
o
)
static
ExitStatus
op_oc
(
DisasContext
*
s
,
DisasOps
*
o
)
{
{
TCGv_i32
l
=
tcg_const_i32
(
get_field
(
s
->
fields
,
l1
));
TCGv_i32
l
=
tcg_const_i32
(
get_field
(
s
->
fields
,
l1
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录