Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
a9e790b9
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
大约 1 年 前同步成功
通知
9
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a9e790b9
编写于
7月 26, 2010
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
perlasm/x86_64-xlate.pl: extend SSE>2 to ml64.
上级
02f358da
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
37 addition
and
30 deletion
+37
-30
crypto/perlasm/x86_64-xlate.pl
crypto/perlasm/x86_64-xlate.pl
+37
-30
未找到文件。
crypto/perlasm/x86_64-xlate.pl
浏览文件 @
a9e790b9
...
...
@@ -121,7 +121,7 @@ my %globals;
$self
->
{
sz
}
=
"
b
";
}
elsif
(
$self
->
{
op
}
=~
/call|jmp/
)
{
$self
->
{
sz
}
=
"";
}
elsif
(
$self
->
{
op
}
=~
/^p/
&&
$'
!~
/^(ush|op)/
)
{
# SSEn
}
elsif
(
$self
->
{
op
}
=~
/^p/
&&
$'
!~
/^(ush|op
|insrw
)/
)
{
# SSEn
$self
->
{
sz
}
=
"";
}
elsif
(
$self
->
{
op
}
=~
/([a-z]{3,})([qlwb])$/
)
{
$self
->
{
op
}
=
$
1
;
...
...
@@ -264,7 +264,7 @@ my %globals;
}
}
else
{
%szmap
=
(
b
=>
"
BYTE
$PTR
",
w
=>
"
WORD
$PTR
",
l
=>
"
DWORD
$PTR
",
q
=>
"
QWORD
$PTR
",
o
=>
"
OWORD
$PTR
"
);
q
=>
"
QWORD
$PTR
",
o
=>
"
OWORD
$PTR
"
,
x
=>
"
XMMWORD
$PTR
"
);
$self
->
{
label
}
=~
s/\./\$/g
;
$self
->
{
label
}
=~
s/(?<![\w\$\.])0x([0-9a-f]+)/0$1h/ig
;
...
...
@@ -634,62 +634,62 @@ sub rex {
}
}
# older gas
does
n't handle SSE>2 instructions
# older gas
and ml64 do
n'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]+)/
)
{
if
(
shift
=~
/\$([0-9]+),%xmm([0-9]+),(%\w+)/
)
{
my
@opcode
=
(
0x66
);
$imm
=
$
1
;
$src
=
$
2
;
$dst
=
$
3
;
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
)
;
@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]+)/
)
{
if
(
shift
=~
/\$([0-9]+),(%\w+),%xmm([0-9]+)/
)
{
my
@opcode
=
(
0x66
);
$imm
=
$
1
;
$dst
=
$
2
;
$src
=
$
2
;
$dst
=
$
3
;
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
)
;
@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]+)/
)
{
if
(
shift
=~
/%xmm([0-9]+),%xmm([0-9]+)/
)
{
my
@opcode
=
(
0x66
);
rex
(
\
@opcode
,
$
1
,
$
2
);
rex
(
\
@opcode
,
$
2
,
$
1
);
push
@opcode
,
0x0f
,
0x38
,
0x00
;
push
@opcode
,
0xc0
|
(
$
2
&
7
)
|
((
$
1
&
7
)
<<
3
);
# ModR/M
printf
"
\t
.byte
\t
%s
\n
",
join
('
,
',
@opcode
)
;
push
@opcode
,
0xc0
|
(
$
1
&
7
)
|
((
$
2
&
7
)
<<
3
);
# ModR/M
@opcode
;
}
else
{
printf
"
\t
pshufb
\t
%s
\n
",
join
('
,
',
@
_
);
(
);
}
}
if
(
$gas
)
;
};
if
(
$nasm
)
{
print
<<___;
default rel
%define XMMWORD
___
}
elsif
(
$masm
)
{
print
<<___;
...
...
@@ -706,14 +706,22 @@ while($line=<>) {
undef
$label
;
undef
$opcode
;
undef
$sz
;
undef
@args
;
if
(
$label
=
label
->
re
(
\
$line
))
{
print
$label
->
out
();
}
if
(
directive
->
re
(
\
$line
))
{
printf
"
%s
",
directive
->
out
();
}
elsif
(
$opcode
=
opcode
->
re
(
\
$line
))
{
ARGUMENT:
while
(
1
)
{
}
elsif
(
$opcode
=
opcode
->
re
(
\
$line
))
{
my
$asm
=
eval
("
\$
"
.
$opcode
->
mnemonic
());
undef
@bytes
;
if
((
ref
(
$asm
)
eq
'
CODE
')
&&
scalar
(
@bytes
=
&$asm
(
$line
)))
{
print
$gas
?"
.byte
\t
":"
DB
\t
",
join
('
,
',
@bytes
),"
\n
";
next
;
}
ARGUMENT:
while
(
1
)
{
my
$arg
;
if
(
$arg
=
register
->
re
(
\
$line
))
{
opcode
->
size
(
$arg
->
size
());
}
...
...
@@ -729,22 +737,21 @@ while($line=<>) {
$line
=~
s/^,\s*//
;
}
# ARGUMENT:
$sz
=
opcode
->
size
();
if
(
$#args
>=
0
)
{
my
$insn
;
my
$sz
=
opcode
->
size
();
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
);
}
printf
"
\t
%s
\t
%s
",
$insn
,
join
("
,
",
@args
);
}
else
{
$insn
=
$opcode
->
out
();
foreach
(
@args
)
{
my
$arg
=
$_
->
out
();
if
(
$arg
=~
/xmm/
)
{
$insn
.=
$sz
;
$sz
=
"
o
";
last
;
}
if
(
$arg
=~
/mm/
)
{
$insn
.=
$sz
;
$sz
=
"
q
";
last
;
}
# $insn.=$sz compensates for movq, pinsrw, ...
if
(
$arg
=~
/^xmm[0-9]+$/
)
{
$insn
.=
$sz
;
$sz
=
"
x
"
if
(
!
$sz
);
last
;
}
if
(
$arg
=~
/^mm[0-9]+$/
)
{
$insn
.=
$sz
;
$sz
=
"
q
"
if
(
!
$sz
);
last
;
}
}
@args
=
reverse
(
@args
);
undef
$sz
if
(
$nasm
&&
$opcode
->
mnemonic
()
eq
"
lea
");
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录