Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
5bf67a92
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看板
提交
5bf67a92
编写于
7月 25, 2017
作者:
R
Richard Henderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
tcg/s390: Use constant pool for xori
Signed-off-by:
N
Richard Henderson
<
rth@twiddle.net
>
上级
4046d9ca
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
37 deletion
+40
-37
tcg/s390/tcg-target.inc.c
tcg/s390/tcg-target.inc.c
+40
-37
未找到文件。
tcg/s390/tcg-target.inc.c
浏览文件 @
5bf67a92
...
...
@@ -39,11 +39,9 @@
#define TCG_CT_CONST_S16 0x100
#define TCG_CT_CONST_S32 0x200
#define TCG_CT_CONST_NN16 0x400
#define TCG_CT_CONST_NN32 0x800
#define TCG_CT_CONST_U31 0x1000
#define TCG_CT_CONST_S33 0x2000
#define TCG_CT_CONST_ZERO 0x4000
#define TCG_CT_CONST_U31 0x400
#define TCG_CT_CONST_S33 0x800
#define TCG_CT_CONST_ZERO 0x1000
/* Several places within the instruction set 0 means "no register"
rather than TCG_REG_R0. */
...
...
@@ -234,6 +232,7 @@ typedef enum S390Opcode {
RXY_STRVG
=
0xe32f
,
RXY_STRVH
=
0xe33f
,
RXY_STY
=
0xe350
,
RXY_XG
=
0xe382
,
RX_A
=
0x5a
,
RX_C
=
0x59
,
...
...
@@ -424,12 +423,6 @@ static const char *target_parse_constraint(TCGArgConstraint *ct,
case
'J'
:
ct
->
ct
|=
TCG_CT_CONST_S32
;
break
;
case
'N'
:
ct
->
ct
|=
TCG_CT_CONST_NN16
;
break
;
case
'M'
:
ct
->
ct
|=
TCG_CT_CONST_NN32
;
break
;
case
'C'
:
/* ??? We have no insight here into whether the comparison is
signed or unsigned. The COMPARE IMMEDIATE insn uses a 32-bit
...
...
@@ -474,10 +467,6 @@ static int tcg_target_const_match(tcg_target_long val, TCGType type,
return
val
==
(
int32_t
)
val
;
}
else
if
(
ct
&
TCG_CT_CONST_S33
)
{
return
val
>=
-
0xffffffffll
&&
val
<=
0xffffffffll
;
}
else
if
(
ct
&
TCG_CT_CONST_NN16
)
{
return
!
(
val
<
0
&&
val
==
(
int16_t
)
val
);
}
else
if
(
ct
&
TCG_CT_CONST_NN32
)
{
return
!
(
val
<
0
&&
val
==
(
int32_t
)
val
);
}
else
if
(
ct
&
TCG_CT_CONST_U31
)
{
return
val
>=
0
&&
val
<=
0x7fffffff
;
}
else
if
(
ct
&
TCG_CT_CONST_ZERO
)
{
...
...
@@ -1062,14 +1051,40 @@ static void tgen_ori(TCGContext *s, TCGType type, TCGReg dest, uint64_t val)
}
}
static
void
tgen
64_xori
(
TCGContext
*
s
,
TCGReg
dest
,
tcg_target_ulong
val
)
static
void
tgen
_xori
(
TCGContext
*
s
,
TCGType
type
,
TCGReg
dest
,
uint64_t
val
)
{
/* Perform the xor by parts. */
if
(
val
&
0xffffffff
)
{
tcg_out_insn
(
s
,
RIL
,
XILF
,
dest
,
val
);
/* Try all 48-bit insns that can perform it in one go. */
if
(
s390_facilities
&
FACILITY_EXT_IMM
)
{
if
((
val
&
0xffffffff00000000ull
)
==
0
)
{
tcg_out_insn
(
s
,
RIL
,
XILF
,
dest
,
val
);
return
;
}
if
((
val
&
0x00000000ffffffffull
)
==
0
)
{
tcg_out_insn
(
s
,
RIL
,
XIHF
,
dest
,
val
>>
32
);
return
;
}
}
if
(
val
>
0xffffffff
)
{
tcg_out_insn
(
s
,
RIL
,
XIHF
,
dest
,
val
>>
31
>>
1
);
/* Use the constant pool if USE_REG_TB, but not for small constants. */
if
(
maybe_out_small_movi
(
s
,
type
,
TCG_TMP0
,
val
))
{
if
(
type
==
TCG_TYPE_I32
)
{
tcg_out_insn
(
s
,
RR
,
XR
,
dest
,
TCG_TMP0
);
}
else
{
tcg_out_insn
(
s
,
RRE
,
XGR
,
dest
,
TCG_TMP0
);
}
}
else
if
(
USE_REG_TB
)
{
tcg_out_insn
(
s
,
RXY
,
XG
,
dest
,
TCG_REG_TB
,
TCG_REG_NONE
,
0
);
new_pool_label
(
s
,
val
,
R_390_20
,
s
->
code_ptr
-
2
,
-
(
intptr_t
)
s
->
code_gen_ptr
);
}
else
{
/* Perform the xor by parts. */
tcg_debug_assert
(
s390_facilities
&
FACILITY_EXT_IMM
);
if
(
val
&
0xffffffff
)
{
tcg_out_insn
(
s
,
RIL
,
XILF
,
dest
,
val
);
}
if
(
val
>
0xffffffff
)
{
tcg_out_insn
(
s
,
RIL
,
XIHF
,
dest
,
val
>>
32
);
}
}
}
...
...
@@ -1889,7 +1904,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
a0
=
args
[
0
],
a1
=
args
[
1
],
a2
=
(
uint32_t
)
args
[
2
];
if
(
const_args
[
2
])
{
tcg_out_mov
(
s
,
TCG_TYPE_I32
,
a0
,
a1
);
tgen
64_xori
(
s
,
a0
,
a2
);
tgen
_xori
(
s
,
TCG_TYPE_I32
,
a0
,
a2
);
}
else
if
(
a0
==
a1
)
{
tcg_out_insn
(
s
,
RR
,
XR
,
args
[
0
],
args
[
2
]);
}
else
{
...
...
@@ -2121,7 +2136,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
a0
=
args
[
0
],
a1
=
args
[
1
],
a2
=
args
[
2
];
if
(
const_args
[
2
])
{
tcg_out_mov
(
s
,
TCG_TYPE_I64
,
a0
,
a1
);
tgen
64_xori
(
s
,
a0
,
a2
);
tgen
_xori
(
s
,
TCG_TYPE_I64
,
a0
,
a2
);
}
else
if
(
a0
==
a1
)
{
tcg_out_insn
(
s
,
RRE
,
XGR
,
a0
,
a2
);
}
else
{
...
...
@@ -2313,12 +2328,9 @@ static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode op)
static
const
TCGTargetOpDef
r_rC
=
{
.
args_ct_str
=
{
"r"
,
"rC"
}
};
static
const
TCGTargetOpDef
r_rZ
=
{
.
args_ct_str
=
{
"r"
,
"rZ"
}
};
static
const
TCGTargetOpDef
r_r_ri
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"ri"
}
};
static
const
TCGTargetOpDef
r_r_rM
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"rM"
}
};
static
const
TCGTargetOpDef
r_0_r
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"r"
}
};
static
const
TCGTargetOpDef
r_0_ri
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"ri"
}
};
static
const
TCGTargetOpDef
r_0_rI
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"rI"
}
};
static
const
TCGTargetOpDef
r_0_rJ
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"rJ"
}
};
static
const
TCGTargetOpDef
r_0_rM
=
{
.
args_ct_str
=
{
"r"
,
"0"
,
"rM"
}
};
static
const
TCGTargetOpDef
a2_r
=
{
.
args_ct_str
=
{
"r"
,
"r"
,
"0"
,
"1"
,
"r"
,
"r"
}
};
static
const
TCGTargetOpDef
a2_ri
...
...
@@ -2360,6 +2372,8 @@ static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode op)
case
INDEX_op_and_i64
:
case
INDEX_op_or_i32
:
case
INDEX_op_or_i64
:
case
INDEX_op_xor_i32
:
case
INDEX_op_xor_i64
:
return
(
s390_facilities
&
FACILITY_DISTINCT_OPS
?
&
r_r_ri
:
&
r_0_ri
);
case
INDEX_op_mul_i32
:
...
...
@@ -2370,17 +2384,6 @@ static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode op)
case
INDEX_op_mul_i64
:
return
(
s390_facilities
&
FACILITY_GEN_INST_EXT
?
&
r_0_rJ
:
&
r_0_rI
);
case
INDEX_op_xor_i32
:
/* Without EXT_IMM, no immediates are supported. Otherwise,
rejecting certain negative ranges leads to smaller code. */
return
(
s390_facilities
&
FACILITY_EXT_IMM
?
(
s390_facilities
&
FACILITY_DISTINCT_OPS
?
&
r_r_ri
:
&
r_0_ri
)
:
&
r_0_r
);
case
INDEX_op_xor_i64
:
return
(
s390_facilities
&
FACILITY_EXT_IMM
?
(
s390_facilities
&
FACILITY_DISTINCT_OPS
?
&
r_r_rM
:
&
r_0_rM
)
:
&
r_0_r
);
case
INDEX_op_shl_i32
:
case
INDEX_op_shr_i32
:
case
INDEX_op_sar_i32
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录