Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
f785e455
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f785e455
编写于
1月 31, 2018
作者:
B
Bucky Kittinger
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
oops
上级
117cddc8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
68 addition
and
41 deletion
+68
-41
libraries/chain/wasm_interface.cpp
libraries/chain/wasm_interface.cpp
+68
-41
未找到文件。
libraries/chain/wasm_interface.cpp
浏览文件 @
f785e455
...
@@ -867,14 +867,11 @@ class compiler_builtins : public context_aware_api {
...
@@ -867,14 +867,11 @@ class compiler_builtins : public context_aware_api {
}
}
void
__ashrti3
(
__int128
&
ret
,
uint64_t
low
,
uint64_t
high
,
uint32_t
shift
)
{
void
__ashrti3
(
__int128
&
ret
,
uint64_t
low
,
uint64_t
high
,
uint32_t
shift
)
{
uint64_t
mask
=
1
;
// retain the signedness
mask
<<=
SHIFT_WIDTH
;
ret
=
high
;
uint64_t
sign_bit
=
high
&
mask
;
ret
<<=
64
;
fc
::
uint128_t
i
(
high
,
low
);
ret
|=
low
;
i
>>=
shift
;
ret
>>=
shift
;
std
::
cout
<<
"SIGN "
<<
((
:
wi
>>
64
|
sign_bit
)
<<
" "
<<
i
<<
"
\n
"
;
fc
::
uint128_t
r
(
i
.
high_bits
()
|
sign_bit
,
i
.
low_bits
());
ret
=
(
unsigned
__int128
)
r
;
}
}
void
__lshlti3
(
__int128
&
ret
,
uint64_t
low
,
uint64_t
high
,
uint32_t
shift
)
{
void
__lshlti3
(
__int128
&
ret
,
uint64_t
low
,
uint64_t
high
,
uint32_t
shift
)
{
...
@@ -890,55 +887,82 @@ class compiler_builtins : public context_aware_api {
...
@@ -890,55 +887,82 @@ class compiler_builtins : public context_aware_api {
}
}
void
__divti3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
void
__divti3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
// grab the sign bits;
__int128
lhs
=
ha
;
bool
sa
=
(
ha
>>
SHIFT_WIDTH
);
__int128
rhs
=
hb
;
bool
sb
=
(
hb
>>
SHIFT_WIDTH
);
fc
::
uint128_t
a
(
ha
,
la
)
;
lhs
<<=
64
;
fc
::
uint128_t
b
(
hb
,
lb
)
;
lhs
|=
la
;
FC_ASSERT
(
b
!=
0
,
"divide by zero"
);
rhs
<<=
64
;
rhs
|=
lb
;
// negate if needed
FC_ASSERT
(
rhs
!=
0
,
"divide by zero"
);
a
=
sa
?
(
~
a
+
1
)
:
a
;
b
=
sb
?
(
~
b
+
1
)
:
b
;
// get the sign of the result
sa
^=
sb
;
a
/=
b
;
lhs
/=
rhs
;
// negate back if needed
ret
=
lhs
;
a
=
sa
?
~
a
+
1
:
a
;
ret
=
(
unsigned
__int128
)
a
;
}
}
void
__multi3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
void
__udivti3
(
unsigned
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
// grab the sign bits;
unsigned
__int128
lhs
=
ha
;
bool
sa
=
(
ha
>>
SHIFT_WIDTH
);
unsigned
__int128
rhs
=
hb
;
bool
sb
=
(
hb
>>
SHIFT_WIDTH
);
lhs
<<=
64
;
lhs
|=
la
;
rhs
<<=
64
;
rhs
|=
lb
;
fc
::
uint128_t
a
(
ha
,
la
);
FC_ASSERT
(
rhs
!=
0
,
"divide by zero"
);
fc
::
uint128_t
b
(
hb
,
lb
);
// negate if needed
a
=
sa
?
(
~
a
+
1
)
:
a
;
b
=
sb
?
(
~
b
+
1
)
:
b
;
// get the sign of the result
lhs
/=
rhs
;
sa
^=
sb
;
ret
=
lhs
;
}
void
__multi3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
__int128
lhs
=
ha
;
__int128
rhs
=
hb
;
a
*=
b
;
lhs
<<=
64
;
lhs
|=
la
;
// negate back if needed
rhs
<<=
64
;
a
=
sa
?
~
a
+
1
:
a
;
rhs
|=
lb
;
ret
=
(
unsigned
__int128
)
a
;
lhs
*=
rhs
;
ret
=
lhs
;
}
}
void
__modti3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
void
__modti3
(
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
__int128
lhs
=
ha
;
__int128
rhs
=
hb
;
lhs
<<=
64
;
lhs
|=
la
;
rhs
<<=
64
;
rhs
|=
lb
;
FC_ASSERT
(
rhs
!=
0
,
"divide by zero"
);
lhs
%=
rhs
;
ret
=
lhs
;
}
void
__umodti3
(
unsigned
__int128
&
ret
,
uint64_t
la
,
uint64_t
ha
,
uint64_t
lb
,
uint64_t
hb
)
{
unsigned
__int128
lhs
=
ha
;
unsigned
__int128
rhs
=
hb
;
lhs
<<=
64
;
lhs
|=
la
;
rhs
<<=
64
;
rhs
|=
lb
;
FC_ASSERT
(
rhs
!=
0
,
"divide by zero"
);
lhs
%=
rhs
;
ret
=
lhs
;
}
}
static
constexpr
uint32_t
SHIFT_WIDTH
=
(
sizeof
(
uint64_t
)
*
8
)
-
1
;
static
constexpr
uint32_t
SHIFT_WIDTH
=
(
sizeof
(
uint64_t
)
*
8
)
-
1
;
...
@@ -1054,6 +1078,9 @@ REGISTER_INTRINSICS(compiler_builtins,
...
@@ -1054,6 +1078,9 @@ REGISTER_INTRINSICS(compiler_builtins,
(
__lshlti3
,
void
(
int
,
int64_t
,
int64_t
,
int
)
)
(
__lshlti3
,
void
(
int
,
int64_t
,
int64_t
,
int
)
)
(
__lshrti3
,
void
(
int
,
int64_t
,
int64_t
,
int
)
)
(
__lshrti3
,
void
(
int
,
int64_t
,
int64_t
,
int
)
)
(
__divti3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__divti3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__udivti3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__modti3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__umodti3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__multi3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
(
__multi3
,
void
(
int
,
int64_t
,
int64_t
,
int64_t
,
int64_t
)
)
);
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录