Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
12163534
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
12163534
编写于
5月 30, 2021
作者:
S
Scott McMurray
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement the raw_eq intrinsic in codegen_cranelift
上级
b63b2f1e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
45 addition
and
0 deletion
+45
-0
compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
+39
-0
compiler/rustc_codegen_cranelift/src/value_and_place.rs
compiler/rustc_codegen_cranelift/src/value_and_place.rs
+6
-0
未找到文件。
compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
浏览文件 @
12163534
...
...
@@ -1115,6 +1115,45 @@ fn swap(bcx: &mut FunctionBuilder<'_>, v: Value) -> Value {
);
ret
.write_cvalue
(
fx
,
CValue
::
by_val
(
res
,
ret
.layout
()));
};
raw_eq
,
<
T
>
(
v
lhs_ref
,
v
rhs_ref
)
{
fn
type_by_size
(
size
:
Size
)
->
Option
<
Type
>
{
Some
(
match
size
.bits
()
{
8
=>
types
::
I8
,
16
=>
types
::
I16
,
32
=>
types
::
I32
,
64
=>
types
::
I64
,
128
=>
types
::
I128
,
_
=>
return
None
,
})
}
let
size
=
fx
.layout_of
(
T
)
.layout.size
;
let
is_eq_value
=
if
size
==
Size
::
ZERO
{
// No bytes means they're trivially equal
fx
.bcx
.ins
()
.bconst
(
types
::
B1
,
true
)
}
else
if
let
Some
(
clty
)
=
type_by_size
(
size
)
{
// Can't use `trusted` for these loads; they could be unaligned.
let
mut
flags
=
MemFlags
::
new
();
flags
.set_notrap
();
let
lhs_val
=
fx
.bcx
.ins
()
.load
(
clty
,
flags
,
lhs_ref
,
0
);
let
rhs_val
=
fx
.bcx
.ins
()
.load
(
clty
,
flags
,
rhs_ref
,
0
);
fx
.bcx
.ins
()
.icmp
(
IntCC
::
Equal
,
lhs_val
,
rhs_val
)
}
else
{
// Just call `memcmp` (like slices do in core) when the
// size is too large or it's not a power-of-two.
let
ptr_ty
=
pointer_ty
(
fx
.tcx
);
let
signed_bytes
=
i64
::
try_from
(
size
.bytes
())
.unwrap
();
let
bytes_val
=
fx
.bcx
.ins
()
.iconst
(
ptr_ty
,
signed_bytes
);
let
params
=
vec!
[
AbiParam
::
new
(
ptr_ty
);
3
];
let
returns
=
vec!
[
AbiParam
::
new
(
types
::
I32
)];
let
args
=
&
[
lhs_ref
,
rhs_ref
,
bytes_val
];
let
cmp
=
fx
.lib_call
(
"memcmp"
,
params
,
returns
,
args
)[
0
];
fx
.bcx
.ins
()
.icmp_imm
(
IntCC
::
Equal
,
cmp
,
0
)
};
ret
.write_cvalue
(
fx
,
CValue
::
by_val
(
is_eq_value
,
ret
.layout
()));
};
}
if
let
Some
((
_
,
dest
))
=
destination
{
...
...
compiler/rustc_codegen_cranelift/src/value_and_place.rs
浏览文件 @
12163534
...
...
@@ -437,6 +437,12 @@ fn transmute_value<'tcx>(
|
(
types
::
F32
,
types
::
I32
)
|
(
types
::
I64
,
types
::
F64
)
|
(
types
::
F64
,
types
::
I64
)
=>
fx
.bcx
.ins
()
.bitcast
(
dst_ty
,
data
),
// Widen an abstract SSA boolean to something that can be stored in memory
(
types
::
B1
,
types
::
I8
|
types
::
I16
|
types
::
I32
|
types
::
I64
|
types
::
I128
)
=>
{
fx
.bcx
.ins
()
.bint
(
dst_ty
,
data
)
}
_
if
src_ty
.is_vector
()
&&
dst_ty
.is_vector
()
=>
{
fx
.bcx
.ins
()
.raw_bitcast
(
dst_ty
,
data
)
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录