Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
83b00736
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,发现更多精彩内容 >>
提交
83b00736
编写于
8月 23, 2012
作者:
R
Richard Henderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
target-s390: Convert FP MULTIPLY
Signed-off-by:
N
Richard Henderson
<
rth@twiddle.net
>
上级
f08a5c31
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
86 addition
and
76 deletion
+86
-76
target-s390x/fpu_helper.c
target-s390x/fpu_helper.c
+39
-48
target-s390x/helper.h
target-s390x/helper.h
+5
-5
target-s390x/insn-data.def
target-s390x/insn-data.def
+9
-0
target-s390x/translate.c
target-s390x/translate.c
+33
-23
未找到文件。
target-s390x/fpu_helper.c
浏览文件 @
83b00736
...
...
@@ -266,27 +266,50 @@ uint64_t HELPER(dxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
return
RET128
(
ret
);
}
/*
64-bit FP multiplication RR
*/
void
HELPER
(
mdbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32
_t
f2
)
/*
32-bit FP multiplication
*/
uint64_t
HELPER
(
meeb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64
_t
f2
)
{
env
->
fregs
[
f1
].
d
=
float64_mul
(
env
->
fregs
[
f1
].
d
,
env
->
fregs
[
f2
].
d
,
&
env
->
fpu_status
);
float32
ret
=
float32_mul
(
f1
,
f2
,
&
env
->
fpu_status
);
handle_exceptions
(
env
,
GETPC
());
return
ret
;
}
/*
128-bit FP multiplication RR
*/
void
HELPER
(
mxbr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32
_t
f2
)
/*
64-bit FP multiplication
*/
uint64_t
HELPER
(
mdb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64
_t
f2
)
{
CPU_QuadU
v1
;
CPU_QuadU
v2
;
CPU_QuadU
res
;
float64
ret
=
float64_mul
(
f1
,
f2
,
&
env
->
fpu_status
);
handle_exceptions
(
env
,
GETPC
());
return
ret
;
}
v1
.
ll
.
upper
=
env
->
fregs
[
f1
].
ll
;
v1
.
ll
.
lower
=
env
->
fregs
[
f1
+
2
].
ll
;
v2
.
ll
.
upper
=
env
->
fregs
[
f2
].
ll
;
v2
.
ll
.
lower
=
env
->
fregs
[
f2
+
2
].
ll
;
res
.
q
=
float128_mul
(
v1
.
q
,
v2
.
q
,
&
env
->
fpu_status
);
env
->
fregs
[
f1
].
ll
=
res
.
ll
.
upper
;
env
->
fregs
[
f1
+
2
].
ll
=
res
.
ll
.
lower
;
/* 64/32-bit FP multiplication */
uint64_t
HELPER
(
mdeb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64_t
f2
)
{
float64
ret
=
float32_to_float64
(
f2
,
&
env
->
fpu_status
);
ret
=
float64_mul
(
f1
,
ret
,
&
env
->
fpu_status
);
handle_exceptions
(
env
,
GETPC
());
return
ret
;
}
/* 128-bit FP multiplication */
uint64_t
HELPER
(
mxb
)(
CPUS390XState
*
env
,
uint64_t
ah
,
uint64_t
al
,
uint64_t
bh
,
uint64_t
bl
)
{
float128
ret
=
float128_mul
(
make_float128
(
ah
,
al
),
make_float128
(
bh
,
bl
),
&
env
->
fpu_status
);
handle_exceptions
(
env
,
GETPC
());
return
RET128
(
ret
);
}
/* 128/64-bit FP multiplication */
uint64_t
HELPER
(
mxdb
)(
CPUS390XState
*
env
,
uint64_t
ah
,
uint64_t
al
,
uint64_t
f2
)
{
float128
ret
=
float64_to_float128
(
f2
,
&
env
->
fpu_status
);
ret
=
float128_mul
(
make_float128
(
ah
,
al
),
ret
,
&
env
->
fpu_status
);
handle_exceptions
(
env
,
GETPC
());
return
RET128
(
ret
);
}
/* convert 32-bit float to 64-bit float */
...
...
@@ -402,18 +425,6 @@ uint32_t HELPER(lcxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2)
return
set_cc_nz_f128
(
x1
.
q
);
}
/* 32-bit FP multiplication RM */
void
HELPER
(
meeb
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
val
)
{
float32
v1
=
env
->
fregs
[
f1
].
l
.
upper
;
CPU_FloatU
v2
;
v2
.
l
=
val
;
HELPER_LOG
(
"%s: multiplying 0x%d from f%d and 0x%d
\n
"
,
__func__
,
v1
,
f1
,
v2
.
f
);
env
->
fregs
[
f1
].
l
.
upper
=
float32_mul
(
v1
,
v2
.
f
,
&
env
->
fpu_status
);
}
/* 32-bit FP compare */
uint32_t
HELPER
(
ceb
)(
CPUS390XState
*
env
,
uint64_t
f1
,
uint64_t
f2
)
{
...
...
@@ -441,18 +452,6 @@ uint32_t HELPER(cxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
return
float_comp_to_cc
(
env
,
cmp
);
}
/* 64-bit FP multiplication RM */
void
HELPER
(
mdb
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint64_t
a2
)
{
float64
v1
=
env
->
fregs
[
f1
].
d
;
CPU_DoubleU
v2
;
v2
.
ll
=
cpu_ldq_data
(
env
,
a2
);
HELPER_LOG
(
"%s: multiplying 0x%lx from f%d and 0x%ld
\n
"
,
__func__
,
v1
,
f1
,
v2
.
d
);
env
->
fregs
[
f1
].
d
=
float64_mul
(
v1
,
v2
.
d
,
&
env
->
fpu_status
);
}
static
void
set_round_mode
(
CPUS390XState
*
env
,
int
m3
)
{
switch
(
m3
)
{
...
...
@@ -582,14 +581,6 @@ void HELPER(lzxr)(CPUS390XState *env, uint32_t f1)
env
->
fregs
[
f1
+
1
].
ll
=
x
.
ll
.
lower
;
}
/* 32-bit FP multiplication RR */
void
HELPER
(
meebr
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint32_t
f2
)
{
env
->
fregs
[
f1
].
l
.
upper
=
float32_mul
(
env
->
fregs
[
f1
].
l
.
upper
,
env
->
fregs
[
f2
].
l
.
upper
,
&
env
->
fpu_status
);
}
/* 64-bit FP multiply and add RM */
void
HELPER
(
madb
)(
CPUS390XState
*
env
,
uint32_t
f1
,
uint64_t
a2
,
uint32_t
f3
)
{
...
...
target-s390x/helper.h
浏览文件 @
83b00736
...
...
@@ -45,8 +45,11 @@ DEF_HELPER_5(sxb, i64, env, i64, i64, i64, i64)
DEF_HELPER_3
(
deb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_3
(
ddb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_5
(
dxb
,
i64
,
env
,
i64
,
i64
,
i64
,
i64
)
DEF_HELPER_3
(
mdbr
,
void
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
mxbr
,
void
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
meeb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_3
(
mdeb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_3
(
mdb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_5
(
mxb
,
i64
,
env
,
i64
,
i64
,
i64
,
i64
)
DEF_HELPER_4
(
mxdb
,
i64
,
env
,
i64
,
i64
,
i64
)
DEF_HELPER_2
(
ldeb
,
i64
,
env
,
i64
)
DEF_HELPER_3
(
ldxb
,
i64
,
env
,
i64
,
i64
)
DEF_HELPER_2
(
lxdb
,
i64
,
env
,
i64
)
...
...
@@ -59,8 +62,6 @@ 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_3
(
meeb
,
void
,
env
,
i32
,
i32
)
DEF_HELPER_3
(
mdb
,
void
,
env
,
i32
,
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_5
(
cxb
,
TCG_CALL_NO_WG_SE
,
i32
,
env
,
i64
,
i64
,
i64
,
i64
)
...
...
@@ -73,7 +74,6 @@ DEF_HELPER_2(lzxr, void, env, i32)
DEF_HELPER_4
(
cfebr
,
i32
,
env
,
i32
,
i32
,
i32
)
DEF_HELPER_4
(
cfdbr
,
i32
,
env
,
i32
,
i32
,
i32
)
DEF_HELPER_4
(
cfxbr
,
i32
,
env
,
i32
,
i32
,
i32
)
DEF_HELPER_3
(
meebr
,
void
,
env
,
i32
,
i32
)
DEF_HELPER_4
(
madb
,
void
,
env
,
i32
,
i64
,
i32
)
DEF_HELPER_4
(
maebr
,
void
,
env
,
i32
,
i32
,
i32
)
DEF_HELPER_4
(
madbr
,
void
,
env
,
i32
,
i32
,
i32
)
...
...
target-s390x/insn-data.def
浏览文件 @
83b00736
...
...
@@ -359,6 +359,15 @@
C(0x1c00, MR, RR_a, Z, r1p1_32s, r2_32s, new, r1_D32, mul, 0)
C(0x5c00, M, RX_a, Z, r1p1_32s, m2_32s, new, r1_D32, mul, 0)
C(0xe35c, MFY, RXY_a, GIE, r1p1_32s, m2_32s, new, r1_D32, mul, 0)
C(0xb317, MEEBR, RRE, Z, e1, e2, new, e1, meeb, 0)
C(0xb31c, MDBR, RRE, Z, f1_o, f2_o, f1, 0, mdb, 0)
C(0xb34c, MXBR, RRE, Z, 0, x2_o, x1, 0, mxb, 0)
C(0xb30c, MDEBR, RRE, Z, f1_o, e2, f1, 0, mdeb, 0)
C(0xb307, MXDBR, RRE, Z, 0, f2_o, x1, 0, mxdb, 0)
C(0xed17, MEEB, RXE, Z, e1, m2_32u, new, e1, meeb, 0)
C(0xed1c, MDB, RXE, Z, f1_o, m2_64, f1, 0, mdb, 0)
C(0xed0c, MDEB, RXE, Z, f1_o, m2_32u, f1, 0, mdeb, 0)
C(0xed07, MXDB, RXE, Z, 0, m2_64, x1, 0, mxdb, 0)
/* MULTIPLY HALFWORD */
C(0x4c00, MH, RX_a, Z, r1_o, m2_16s, new, r1_32, mul, 0)
C(0xe37c, MHY, RXY_a, GIE, r1_o, m2_16s, new, r1_32, mul, 0)
...
...
target-s390x/translate.c
浏览文件 @
83b00736
...
...
@@ -991,7 +991,7 @@ static void disas_ed(CPUS390XState *env, DisasContext *s, int op, int r1,
int
x2
,
int
b2
,
int
d2
,
int
r1b
)
{
TCGv_i32
tmp_r1
,
tmp32
;
TCGv_i64
addr
,
tmp
;
TCGv_i64
addr
;
addr
=
get_address
(
s
,
x2
,
b2
,
d2
);
tmp_r1
=
tcg_const_i32
(
r1
);
switch
(
op
)
{
...
...
@@ -1010,19 +1010,6 @@ static void disas_ed(CPUS390XState *env, DisasContext *s, int op, int r1,
gen_helper_tcxb
(
cc_op
,
cpu_env
,
tmp_r1
,
addr
);
set_cc_static
(
s
);
break
;
case
0x17
:
/* MEEB R1,D2(X2,B2) [RXE] */
tmp
=
tcg_temp_new_i64
();
tmp32
=
tcg_temp_new_i32
();
tcg_gen_qemu_ld32u
(
tmp
,
addr
,
get_mem_index
(
s
));
tcg_gen_trunc_i64_i32
(
tmp32
,
tmp
);
gen_helper_meeb
(
cpu_env
,
tmp_r1
,
tmp32
);
tcg_temp_free_i64
(
tmp
);
tcg_temp_free_i32
(
tmp32
);
break
;
case
0x1c
:
/* MDB R1,D2(X2,B2) [RXE] */
potential_page_fault
(
s
);
gen_helper_mdb
(
cpu_env
,
tmp_r1
,
addr
);
break
;
case
0x1e
:
/* MADB R1,R3,D2(X2,B2) [RXF] */
/* for RXF insns, r1 is R3 and r1b is R1 */
tmp32
=
tcg_const_i32
(
r1b
);
...
...
@@ -1452,12 +1439,6 @@ static void disas_b3(CPUS390XState *env, DisasContext *s, int op, int m3,
case
0x15
:
/* SQBDR R1,R2 [RRE] */
FP_HELPER
(
sqdbr
);
break
;
case
0x17
:
/* MEEBR R1,R2 [RRE] */
FP_HELPER
(
meebr
);
break
;
case
0x1c
:
/* MDBR R1,R2 [RRE] */
FP_HELPER
(
mdbr
);
break
;
case
0xe
:
/* MAEBR R1,R3,R2 [RRF] */
case
0x1e
:
/* MADBR R1,R3,R2 [RRF] */
case
0x1f
:
/* MSDBR R1,R3,R2 [RRF] */
...
...
@@ -1488,9 +1469,6 @@ static void disas_b3(CPUS390XState *env, DisasContext *s, int op, int m3,
case
0x43
:
/* LCXBR R1,R2 [RRE] */
FP_HELPER_CC
(
lcxbr
);
break
;
case
0x4c
:
/* MXBR R1,R2 [RRE] */
FP_HELPER
(
mxbr
);
break
;
case
0x65
:
/* LXR R1,R2 [RRE] */
tmp
=
load_freg
(
r2
);
store_freg
(
r1
,
tmp
);
...
...
@@ -2827,6 +2805,38 @@ static ExitStatus op_mul128(DisasContext *s, DisasOps *o)
return
NO_EXIT
;
}
static
ExitStatus
op_meeb
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_meeb
(
o
->
out
,
cpu_env
,
o
->
in1
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_mdeb
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_mdeb
(
o
->
out
,
cpu_env
,
o
->
in1
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_mdb
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_mdb
(
o
->
out
,
cpu_env
,
o
->
in1
,
o
->
in2
);
return
NO_EXIT
;
}
static
ExitStatus
op_mxb
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_mxb
(
o
->
out
,
cpu_env
,
o
->
out
,
o
->
out2
,
o
->
in1
,
o
->
in2
);
return_low128
(
o
->
out2
);
return
NO_EXIT
;
}
static
ExitStatus
op_mxdb
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_mxdb
(
o
->
out
,
cpu_env
,
o
->
out
,
o
->
out2
,
o
->
in2
);
return_low128
(
o
->
out2
);
return
NO_EXIT
;
}
static
ExitStatus
op_nabs
(
DisasContext
*
s
,
DisasOps
*
o
)
{
gen_helper_nabs_i64
(
o
->
out
,
o
->
in2
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录