Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
fead2539
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
接近 2 年 前同步成功
通知
12
Star
18
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fead2539
编写于
4月 10, 2010
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
perlasm/x86*: add support to SSE>2 and pclmulqdq. x86_64-xlate.pl provides
correct solution to problem addressed in committ #19244.
上级
9a649f3b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
103 addition
and
5 deletion
+103
-5
crypto/perlasm/x86_64-xlate.pl
crypto/perlasm/x86_64-xlate.pl
+76
-5
crypto/perlasm/x86asm.pl
crypto/perlasm/x86asm.pl
+27
-0
未找到文件。
crypto/perlasm/x86_64-xlate.pl
浏览文件 @
fead2539
...
...
@@ -115,7 +115,9 @@ my %globals;
$self
->
{
op
}
=
$
1
;
$self
->
{
sz
}
=
"
b
";
}
elsif
(
$self
->
{
op
}
=~
/call|jmp/
)
{
$self
->
{
sz
}
=
""
$self
->
{
sz
}
=
"";
}
elsif
(
$self
->
{
op
}
=~
/^p/
&&
$'
!~
/^(ush|op)/
)
{
# SSEn
$self
->
{
sz
}
=
"";
}
elsif
(
$self
->
{
op
}
=~
/([a-z]{3,})([qlwb])$/
)
{
$self
->
{
op
}
=
$
1
;
$self
->
{
sz
}
=
$
2
;
...
...
@@ -574,11 +576,11 @@ my %globals;
/\.align/
&&
do
{
$self
->
{
value
}
=
"
ALIGN
\t
"
.
$line
;
last
;
};
/\.(value|long|rva|quad)/
&&
do
{
my
$sz
=
substr
(
$
1
,
0
,
1
);
my
@arr
=
split
(
'
,
'
,
$line
);
my
@arr
=
split
(
/,\s*/
,
$line
);
my
$last
=
pop
(
@arr
);
my
$conv
=
sub
{
my
$var
=
shift
;
$var
=~
s/^(0b[0-1]+)/oct($1)/
eig
;
$var
=~
s/0x([0-9a-f]+)/0$1h/ig
if
(
$masm
);
$var
=~
s/
^
0x([0-9a-f]+)/0$1h/ig
if
(
$masm
);
if
(
$sz
eq
"
D
"
&&
(
$current_segment
=~
/.[px]data/
||
$dir
eq
"
.rva
"))
{
$var
=~
s/([_a-z\$\@][_a-z0-9\$\@]*)/$nasm?"$1 wrt ..imagebase":"imagerel $1"/
egi
;
}
$var
;
...
...
@@ -590,7 +592,7 @@ my %globals;
$self
->
{
value
}
.=
&$conv
(
$last
);
last
;
};
/\.byte/
&&
do
{
my
@str
=
split
(
"
,
"
,
$line
);
/\.byte/
&&
do
{
my
@str
=
split
(
/,\s*/
,
$line
);
map
(
s/(0b[0-1]+)/oct($1)/
eig
,
@str
);
map
(
s/0x([0-9a-f]+)/0$1h/ig
,
@str
)
if
(
$masm
);
while
(
$#str
>
15
)
{
...
...
@@ -614,6 +616,71 @@ my %globals;
}
}
sub
rex
{
local
*opcode
=
shift
;
my
(
$dst
,
$src
)
=
@_
;
if
(
$dst
>=
8
||
$src
>=
8
)
{
$rex
=
0x40
;
$rex
|=
0x04
if
(
$dst
>=
8
);
$rex
|=
0x01
if
(
$src
>=
8
);
push
@opcode
,
$rex
;
}
}
# older gas doesn't handle SSE>2 instructions
my
%regrm
=
(
"
%eax
"
=>
0
,
"
%ecx
"
=>
1
,
"
%edx
"
=>
2
,
"
%ebx
"
=>
3
,
"
%esp
"
=>
4
,
"
%ebp
"
=>
5
,
"
%esi
"
=>
6
,
"
%edi
"
=>
7
);
my
$pextrd
=
sub
{
my
(
$imm
,
$src
,
$dst
)
=
@_
;
if
("
$imm
:
$src
"
=~
/\$([0-9]+):%xmm([0-9]+)/
)
{
my
@opcode
=
(
0x66
);
$imm
=
$
1
;
$src
=
$
2
;
if
(
$dst
=~
/%r([0-9]+)d/
)
{
$dst
=
$
1
;
}
elsif
(
$dst
=~
/%e/
)
{
$dst
=
$regrm
{
$dst
};
}
rex
(
\
@opcode
,
$src
,
$dst
);
push
@opcode
,
0x0f
,
0x3a
,
0x16
;
push
@opcode
,
0xc0
|
((
$src
&
7
)
<<
3
)
|
(
$dst
&
7
);
# ModR/M
push
@opcode
,
$imm
;
printf
"
\t
.byte
\t
%s
\n
",
join
('
,
',
@opcode
);
}
else
{
printf
"
\t
pextrd
\t
%s
\n
",
join
('
,
',
@
_
);
}
}
if
(
$gas
);
my
$pinsrd
=
sub
{
my
(
$imm
,
$src
,
$dst
)
=
@_
;
if
("
$imm
:
$dst
"
=~
/\$([0-9]+):%xmm([0-9]+)/
)
{
my
@opcode
=
(
0x66
);
$imm
=
$
1
;
$dst
=
$
2
;
if
(
$src
=~
/%r([0-9]+)d/
)
{
$src
=
$
1
;
}
elsif
(
$src
=~
/%e/
)
{
$src
=
$regrm
{
$src
};
}
rex
(
\
@opcode
,
$dst
,
$src
);
push
@opcode
,
0x0f
,
0x3a
,
0x22
;
push
@opcode
,
0xc0
|
((
$dst
&
7
)
<<
3
)
|
(
$src
&
7
);
# ModR/M
push
@opcode
,
$imm
;
printf
"
\t
.byte
\t
%s
\n
",
join
('
,
',
@opcode
);
}
else
{
printf
"
\t
pinsrd
\t
%s
\n
",
join
('
,
',
@
_
);
}
}
if
(
$gas
);
my
$pshufb
=
sub
{
my
(
$src
,
$dst
)
=
@_
;
if
("
$dst
:
$src
"
=~
/%xmm([0-9]+):%xmm([0-9]+)/
)
{
my
@opcode
=
(
0x66
);
rex
(
\
@opcode
,
$
1
,
$
2
);
push
@opcode
,
0x0f
,
0x38
,
0x00
;
push
@opcode
,
0xc0
|
(
$
2
&
7
)
|
((
$
1
&
7
)
<<
3
);
# ModR/M
printf
"
\t
.byte
\t
%s
\n
",
join
('
,
',
@opcode
);
}
else
{
printf
"
\t
pshufb
\t
%s
\n
",
join
('
,
',
@
_
);
}
}
if
(
$gas
);
if
(
$nasm
)
{
print
<<___;
default rel
...
...
@@ -662,13 +729,17 @@ while($line=<>) {
my
$insn
;
if
(
$gas
)
{
$insn
=
$opcode
->
out
(
$#args
>=
1
?
$args
[
$#args
]
->
size
():
$sz
);
@args
=
map
(
$_
->
out
(
$sz
),
@args
);
my
$asm
=
eval
("
\$
$insn
");
if
(
ref
(
$asm
)
eq
'
CODE
')
{
&$asm
(
@args
);
}
else
{
printf
"
\t
%s
\t
%s
",
$insn
,
join
("
,
",
@args
);
}
}
else
{
$insn
=
$opcode
->
out
();
$insn
.=
$sz
if
(
map
(
$_
->
out
()
=~
/xmm|mmx/
,
@args
));
@args
=
reverse
(
@args
);
undef
$sz
if
(
$nasm
&&
$opcode
->
mnemonic
()
eq
"
lea
");
printf
"
\t
%s
\t
%s
",
$insn
,
join
("
,
",
map
(
$_
->
out
(
$sz
),
@args
));
}
printf
"
\t
%s
\t
%s
",
$insn
,
join
("
,
",
map
(
$_
->
out
(
$sz
),
@args
));
}
else
{
printf
"
\t
%s
",
$opcode
->
out
();
}
...
...
crypto/perlasm/x86asm.pl
浏览文件 @
fead2539
...
...
@@ -80,6 +80,27 @@ sub ::movq
{
&::
generic
("
movq
",
@
_
);
}
}
# SSE>2 instructions
my
%regrm
=
(
"
eax
"
=>
0
,
"
ecx
"
=>
1
,
"
edx
"
=>
2
,
"
ebx
"
=>
3
,
"
esp
"
=>
4
,
"
ebp
"
=>
5
,
"
esi
"
=>
6
,
"
edi
"
=>
7
);
sub
::
pextrd
{
my
(
$dst
,
$src
,
$imm
)
=
@_
;
if
("
$dst
:
$src
"
=~
/(e[a-dsd][ixp]):xmm([0-7])/
)
{
&data_byte
(
0x66
,
0x0f
,
0x3a
,
0x16
,
0xc0
|
(
$
2
<<
3
)
|
$regrm
{
$
1
},
$imm
);
}
}
sub
::
pinsrd
{
my
(
$dst
,
$src
,
$imm
)
=
@_
;
if
("
$dst
:
$src
"
=~
/xmm([0-7]):(e[a-dsd][ixp])/
)
{
&data_byte
(
0x66
,
0x0f
,
0x3a
,
0x22
,
0xc0
|
(
$
1
<<
3
)
|
$regrm
{
$
2
},
$imm
);
}
}
sub
::
pshufb
{
my
(
$dst
,
$src
)
=
@_
;
if
("
$dst
:
$src
"
=~
/xmm([0-7]):xmm([0-7])/
)
{
&data_byte
(
0x66
,
0x0f
,
0x38
,
0x00
,
0xc0
|
(
$
1
<<
3
)
|
$
2
);
}
}
# AESNI extenstion
sub
::
aeskeygenassist
{
my
(
$dst
,
$src
,
$imm
)
=
@_
;
...
...
@@ -97,6 +118,12 @@ sub ::aesenclast { ::aescommon(0xdd,@_); }
sub
::aesdec {
::
aescommon
(
0xde
,
@
_
);
}
sub
::aesdeclast {
::
aescommon
(
0xdf
,
@
_
);
}
sub
::
pclmulqdq
{
my
(
$dst
,
$src
,
$imm
)
=
@_
;
if
("
$dst
:
$src
"
=~
/xmm([0-7]):xmm([0-7])/
)
{
&data_byte
(
0x66
,
0x0f
,
0x3a
,
0x44
,
0xc0
|
(
$
1
<<
3
)
|
$
2
,
$imm
);
}
}
# label management
$lbdecor
=
"
L
";
# local label decoration, set by package
$label
=
"
000
";
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录