Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
swiftshader
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
swiftshader
Commits
699bf02c
Commit
699bf02c
authored
Oct 08, 2014
by
Jan Voung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
emitIAS for cvtt?.*2.*
BUG=none R=stichnot@chromium.org Review URL:
https://codereview.chromium.org/640603002
parent
2a063e2b
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
170 additions
and
78 deletions
+170
-78
IceInstX8632.cpp
src/IceInstX8632.cpp
+92
-4
IceInstX8632.h
src/IceInstX8632.h
+7
-4
IceTargetLoweringX8632.cpp
src/IceTargetLoweringX8632.cpp
+7
-7
IceTargetLoweringX8632.h
src/IceTargetLoweringX8632.h
+2
-7
assembler_ia32.cpp
src/assembler_ia32.cpp
+43
-45
assembler_ia32.h
src/assembler_ia32.h
+19
-11
No files found.
src/IceInstX8632.cpp
View file @
699bf02c
...
@@ -230,8 +230,8 @@ InstX8632Cmpxchg8b::InstX8632Cmpxchg8b(Cfg *Func, OperandX8632Mem *Addr,
...
@@ -230,8 +230,8 @@ InstX8632Cmpxchg8b::InstX8632Cmpxchg8b(Cfg *Func, OperandX8632Mem *Addr,
}
}
InstX8632Cvt
::
InstX8632Cvt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
InstX8632Cvt
::
InstX8632Cvt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
bool
Trunc
)
CvtVariant
Variant
)
:
InstX8632
(
Func
,
InstX8632
::
Cvt
,
1
,
Dest
),
Trunc
(
Trunc
)
{
:
InstX8632
(
Func
,
InstX8632
::
Cvt
,
1
,
Dest
),
Variant
(
Variant
)
{
addSource
(
Source
);
addSource
(
Source
);
}
}
...
@@ -647,6 +647,35 @@ void emitIASRegOpTyXMM(const Cfg *Func, Type Ty, const Variable *Var,
...
@@ -647,6 +647,35 @@ void emitIASRegOpTyXMM(const Cfg *Func, Type Ty, const Variable *Var,
emitIASBytes
(
Str
,
Asm
,
StartPosition
);
emitIASBytes
(
Str
,
Asm
,
StartPosition
);
}
}
template
<
typename
DReg_t
,
typename
SReg_t
,
DReg_t
(
*
destEnc
)(
int32_t
),
SReg_t
(
*
srcEnc
)(
int32_t
)
>
void
emitIASCastRegOp
(
const
Cfg
*
Func
,
Type
DispatchTy
,
const
Variable
*
Dest
,
const
Operand
*
Src
,
const
x86
::
AssemblerX86
::
CastEmitterRegOp
<
DReg_t
,
SReg_t
>
Emitter
)
{
x86
::
AssemblerX86
*
Asm
=
Func
->
getAssembler
<
x86
::
AssemblerX86
>
();
intptr_t
StartPosition
=
Asm
->
GetPosition
();
assert
(
Dest
->
hasReg
());
DReg_t
DestReg
=
destEnc
(
Dest
->
getRegNum
());
if
(
const
Variable
*
SrcVar
=
llvm
::
dyn_cast
<
Variable
>
(
Src
))
{
if
(
SrcVar
->
hasReg
())
{
SReg_t
SrcReg
=
srcEnc
(
SrcVar
->
getRegNum
());
(
Asm
->*
(
Emitter
.
RegReg
))(
DispatchTy
,
DestReg
,
SrcReg
);
}
else
{
x86
::
Address
SrcStackAddr
=
static_cast
<
TargetX8632
*>
(
Func
->
getTarget
())
->
stackVarToAsmOperand
(
SrcVar
);
(
Asm
->*
(
Emitter
.
RegAddr
))(
DispatchTy
,
DestReg
,
SrcStackAddr
);
}
}
else
if
(
const
OperandX8632Mem
*
Mem
=
llvm
::
dyn_cast
<
OperandX8632Mem
>
(
Src
))
{
x86
::
Address
SrcAddr
=
Mem
->
toAsmAddress
(
Asm
);
(
Asm
->*
(
Emitter
.
RegAddr
))(
DispatchTy
,
DestReg
,
SrcAddr
);
}
else
{
llvm_unreachable
(
"Unexpected operand type"
);
}
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
emitIASBytes
(
Str
,
Asm
,
StartPosition
);
}
void
emitIASMovlikeXMM
(
const
Cfg
*
Func
,
const
Variable
*
Dest
,
void
emitIASMovlikeXMM
(
const
Cfg
*
Func
,
const
Variable
*
Dest
,
const
Operand
*
Src
,
const
Operand
*
Src
,
const
x86
::
AssemblerX86
::
XmmEmitterMovOps
Emitter
)
{
const
x86
::
AssemblerX86
::
XmmEmitterMovOps
Emitter
)
{
...
@@ -1407,7 +1436,7 @@ void InstX8632Cvt::emit(const Cfg *Func) const {
...
@@ -1407,7 +1436,7 @@ void InstX8632Cvt::emit(const Cfg *Func) const {
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
assert
(
getSrcSize
()
==
1
);
assert
(
getSrcSize
()
==
1
);
Str
<<
"
\t
cvt"
;
Str
<<
"
\t
cvt"
;
if
(
Trunc
)
if
(
isTruncating
()
)
Str
<<
"t"
;
Str
<<
"t"
;
Str
<<
TypeX8632Attributes
[
getSrc
(
0
)
->
getType
()].
CvtString
<<
"2"
Str
<<
TypeX8632Attributes
[
getSrc
(
0
)
->
getType
()].
CvtString
<<
"2"
<<
TypeX8632Attributes
[
getDest
()
->
getType
()].
CvtString
<<
"
\t
"
;
<<
TypeX8632Attributes
[
getDest
()
->
getType
()].
CvtString
<<
"
\t
"
;
...
@@ -1417,11 +1446,70 @@ void InstX8632Cvt::emit(const Cfg *Func) const {
...
@@ -1417,11 +1446,70 @@ void InstX8632Cvt::emit(const Cfg *Func) const {
Str
<<
"
\n
"
;
Str
<<
"
\n
"
;
}
}
void
InstX8632Cvt
::
emitIAS
(
const
Cfg
*
Func
)
const
{
assert
(
getSrcSize
()
==
1
);
const
Variable
*
Dest
=
getDest
();
const
Operand
*
Src
=
getSrc
(
0
);
Type
DestTy
=
Dest
->
getType
();
Type
SrcTy
=
Src
->
getType
();
switch
(
Variant
)
{
case
Si2ss
:
{
assert
(
isScalarIntegerType
(
SrcTy
));
assert
(
typeWidthInBytes
(
SrcTy
)
<=
4
);
assert
(
isScalarFloatingType
(
DestTy
));
static
const
x86
::
AssemblerX86
::
CastEmitterRegOp
<
RegX8632
::
XmmRegister
,
RegX8632
::
GPRRegister
>
Emitter
=
{
&
x86
::
AssemblerX86
::
cvtsi2ss
,
&
x86
::
AssemblerX86
::
cvtsi2ss
};
emitIASCastRegOp
<
RegX8632
::
XmmRegister
,
RegX8632
::
GPRRegister
,
RegX8632
::
getEncodedXmm
,
RegX8632
::
getEncodedGPR
>
(
Func
,
DestTy
,
Dest
,
Src
,
Emitter
);
return
;
}
case
Tss2si
:
{
assert
(
isScalarFloatingType
(
SrcTy
));
assert
(
isScalarIntegerType
(
DestTy
));
assert
(
typeWidthInBytes
(
DestTy
)
<=
4
);
static
const
x86
::
AssemblerX86
::
CastEmitterRegOp
<
RegX8632
::
GPRRegister
,
RegX8632
::
XmmRegister
>
Emitter
=
{
&
x86
::
AssemblerX86
::
cvttss2si
,
&
x86
::
AssemblerX86
::
cvttss2si
};
emitIASCastRegOp
<
RegX8632
::
GPRRegister
,
RegX8632
::
XmmRegister
,
RegX8632
::
getEncodedGPR
,
RegX8632
::
getEncodedXmm
>
(
Func
,
SrcTy
,
Dest
,
Src
,
Emitter
);
return
;
}
case
Float2float
:
{
assert
(
isScalarFloatingType
(
SrcTy
));
assert
(
isScalarFloatingType
(
DestTy
));
assert
(
DestTy
!=
SrcTy
);
static
const
x86
::
AssemblerX86
::
XmmEmitterRegOp
Emitter
=
{
&
x86
::
AssemblerX86
::
cvtfloat2float
,
&
x86
::
AssemblerX86
::
cvtfloat2float
};
emitIASRegOpTyXMM
(
Func
,
SrcTy
,
Dest
,
Src
,
Emitter
);
return
;
}
case
Dq2ps
:
{
assert
(
isVectorIntegerType
(
SrcTy
));
assert
(
isVectorFloatingType
(
DestTy
));
static
const
x86
::
AssemblerX86
::
XmmEmitterRegOp
Emitter
=
{
&
x86
::
AssemblerX86
::
cvtdq2ps
,
&
x86
::
AssemblerX86
::
cvtdq2ps
};
emitIASRegOpTyXMM
(
Func
,
DestTy
,
Dest
,
Src
,
Emitter
);
return
;
}
case
Tps2dq
:
{
assert
(
isVectorFloatingType
(
SrcTy
));
assert
(
isVectorIntegerType
(
DestTy
));
static
const
x86
::
AssemblerX86
::
XmmEmitterRegOp
Emitter
=
{
&
x86
::
AssemblerX86
::
cvttps2dq
,
&
x86
::
AssemblerX86
::
cvttps2dq
};
emitIASRegOpTyXMM
(
Func
,
DestTy
,
Dest
,
Src
,
Emitter
);
return
;
}
}
}
void
InstX8632Cvt
::
dump
(
const
Cfg
*
Func
)
const
{
void
InstX8632Cvt
::
dump
(
const
Cfg
*
Func
)
const
{
Ostream
&
Str
=
Func
->
getContext
()
->
getStrDump
();
Ostream
&
Str
=
Func
->
getContext
()
->
getStrDump
();
dumpDest
(
Func
);
dumpDest
(
Func
);
Str
<<
" = cvt"
;
Str
<<
" = cvt"
;
if
(
Trunc
)
if
(
isTruncating
()
)
Str
<<
"t"
;
Str
<<
"t"
;
Str
<<
TypeX8632Attributes
[
getSrc
(
0
)
->
getType
()].
CvtString
<<
"2"
Str
<<
TypeX8632Attributes
[
getSrc
(
0
)
->
getType
()].
CvtString
<<
"2"
<<
TypeX8632Attributes
[
getDest
()
->
getType
()].
CvtString
<<
" "
;
<<
TypeX8632Attributes
[
getDest
()
->
getType
()].
CvtString
<<
" "
;
...
...
src/IceInstX8632.h
View file @
699bf02c
...
@@ -1109,18 +1109,21 @@ private:
...
@@ -1109,18 +1109,21 @@ private:
// operand needs to be done separately.
// operand needs to be done separately.
class
InstX8632Cvt
:
public
InstX8632
{
class
InstX8632Cvt
:
public
InstX8632
{
public
:
public
:
enum
CvtVariant
{
Si2ss
,
Tss2si
,
Float2float
,
Dq2ps
,
Tps2dq
};
static
InstX8632Cvt
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
static
InstX8632Cvt
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
bool
Trunc
)
{
CvtVariant
Variant
)
{
return
new
(
Func
->
allocate
<
InstX8632Cvt
>
())
return
new
(
Func
->
allocate
<
InstX8632Cvt
>
())
InstX8632Cvt
(
Func
,
Dest
,
Source
,
Trunc
);
InstX8632Cvt
(
Func
,
Dest
,
Source
,
Variant
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
void
emit
(
const
Cfg
*
Func
)
const
override
;
void
emitIAS
(
const
Cfg
*
Func
)
const
override
;
void
dump
(
const
Cfg
*
Func
)
const
override
;
void
dump
(
const
Cfg
*
Func
)
const
override
;
static
bool
classof
(
const
Inst
*
Inst
)
{
return
isClassof
(
Inst
,
Cvt
);
}
static
bool
classof
(
const
Inst
*
Inst
)
{
return
isClassof
(
Inst
,
Cvt
);
}
bool
isTruncating
()
const
{
return
Variant
==
Tss2si
||
Variant
==
Tps2dq
;
}
private
:
private
:
bool
Trunc
;
CvtVariant
Variant
;
InstX8632Cvt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
bool
Trunc
);
InstX8632Cvt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
,
CvtVariant
Variant
);
InstX8632Cvt
(
const
InstX8632Cvt
&
)
=
delete
;
InstX8632Cvt
(
const
InstX8632Cvt
&
)
=
delete
;
InstX8632Cvt
&
operator
=
(
const
InstX8632Cvt
&
)
=
delete
;
InstX8632Cvt
&
operator
=
(
const
InstX8632Cvt
&
)
=
delete
;
~
InstX8632Cvt
()
override
{}
~
InstX8632Cvt
()
override
{}
...
...
src/IceTargetLoweringX8632.cpp
View file @
699bf02c
...
@@ -2058,7 +2058,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2058,7 +2058,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
// t1 = cvt Src0RM; Dest = t1
// t1 = cvt Src0RM; Dest = t1
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_cvt
(
T
,
Src0RM
);
_cvt
(
T
,
Src0RM
,
InstX8632Cvt
::
Float2float
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
break
;
break
;
}
}
...
@@ -2068,7 +2068,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2068,7 +2068,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_v4f32
);
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_v4f32
);
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_cvt
t
(
T
,
Src0RM
);
_cvt
(
T
,
Src0RM
,
InstX8632Cvt
::
Tps2dq
);
_movp
(
Dest
,
T
);
_movp
(
Dest
,
T
);
}
else
if
(
Dest
->
getType
()
==
IceType_i64
)
{
}
else
if
(
Dest
->
getType
()
==
IceType_i64
)
{
// Use a helper for converting floating-point values to 64-bit
// Use a helper for converting floating-point values to 64-bit
...
@@ -2091,7 +2091,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2091,7 +2091,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
// t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
// t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
Variable
*
T_1
=
makeReg
(
IceType_i32
);
Variable
*
T_1
=
makeReg
(
IceType_i32
);
Variable
*
T_2
=
makeReg
(
Dest
->
getType
());
Variable
*
T_2
=
makeReg
(
Dest
->
getType
());
_cvt
t
(
T_1
,
Src0RM
);
_cvt
(
T_1
,
Src0RM
,
InstX8632Cvt
::
Tss2si
);
_mov
(
T_2
,
T_1
);
// T_1 and T_2 may have different integer types
_mov
(
T_2
,
T_1
);
// T_1 and T_2 may have different integer types
if
(
Dest
->
getType
()
==
IceType_i1
)
if
(
Dest
->
getType
()
==
IceType_i1
)
_and
(
T_2
,
Ctx
->
getConstantInt32
(
IceType_i1
,
1
));
_and
(
T_2
,
Ctx
->
getConstantInt32
(
IceType_i1
,
1
));
...
@@ -2127,7 +2127,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2127,7 +2127,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
// t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
// t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
Variable
*
T_1
=
makeReg
(
IceType_i32
);
Variable
*
T_1
=
makeReg
(
IceType_i32
);
Variable
*
T_2
=
makeReg
(
Dest
->
getType
());
Variable
*
T_2
=
makeReg
(
Dest
->
getType
());
_cvt
t
(
T_1
,
Src0RM
);
_cvt
(
T_1
,
Src0RM
,
InstX8632Cvt
::
Tss2si
);
_mov
(
T_2
,
T_1
);
// T_1 and T_2 may have different integer types
_mov
(
T_2
,
T_1
);
// T_1 and T_2 may have different integer types
if
(
Dest
->
getType
()
==
IceType_i1
)
if
(
Dest
->
getType
()
==
IceType_i1
)
_and
(
T_2
,
Ctx
->
getConstantInt32
(
IceType_i1
,
1
));
_and
(
T_2
,
Ctx
->
getConstantInt32
(
IceType_i1
,
1
));
...
@@ -2140,7 +2140,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2140,7 +2140,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_v4i32
);
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_v4i32
);
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
Operand
*
Src0RM
=
legalize
(
Inst
->
getSrc
(
0
),
Legal_Reg
|
Legal_Mem
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_cvt
(
T
,
Src0RM
);
_cvt
(
T
,
Src0RM
,
InstX8632Cvt
::
Dq2ps
);
_movp
(
Dest
,
T
);
_movp
(
Dest
,
T
);
}
else
if
(
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_i64
)
{
}
else
if
(
Inst
->
getSrc
(
0
)
->
getType
()
==
IceType_i64
)
{
// Use a helper for x86-32.
// Use a helper for x86-32.
...
@@ -2163,7 +2163,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2163,7 +2163,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
_mov
(
T_1
,
Src0RM
);
_mov
(
T_1
,
Src0RM
);
else
else
_movsx
(
T_1
,
Src0RM
);
_movsx
(
T_1
,
Src0RM
);
_cvt
(
T_2
,
T_1
);
_cvt
(
T_2
,
T_1
,
InstX8632Cvt
::
Si2ss
);
_mov
(
Dest
,
T_2
);
_mov
(
Dest
,
T_2
);
}
}
break
;
break
;
...
@@ -2202,7 +2202,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
...
@@ -2202,7 +2202,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
_mov
(
T_1
,
Src0RM
);
_mov
(
T_1
,
Src0RM
);
else
else
_movzx
(
T_1
,
Src0RM
);
_movzx
(
T_1
,
Src0RM
);
_cvt
(
T_2
,
T_1
);
_cvt
(
T_2
,
T_1
,
InstX8632Cvt
::
Si2ss
);
_mov
(
Dest
,
T_2
);
_mov
(
Dest
,
T_2
);
}
}
break
;
break
;
...
...
src/IceTargetLoweringX8632.h
View file @
699bf02c
...
@@ -256,13 +256,8 @@ protected:
...
@@ -256,13 +256,8 @@ protected:
Context
.
insert
(
InstFakeDef
::
create
(
Func
,
Edx
));
Context
.
insert
(
InstFakeDef
::
create
(
Func
,
Edx
));
Context
.
insert
(
InstFakeDef
::
create
(
Func
,
Eax
));
Context
.
insert
(
InstFakeDef
::
create
(
Func
,
Eax
));
}
}
void
_cvt
(
Variable
*
Dest
,
Operand
*
Src0
)
{
void
_cvt
(
Variable
*
Dest
,
Operand
*
Src0
,
InstX8632Cvt
::
CvtVariant
Variant
)
{
const
bool
Trunc
=
false
;
Context
.
insert
(
InstX8632Cvt
::
create
(
Func
,
Dest
,
Src0
,
Variant
));
Context
.
insert
(
InstX8632Cvt
::
create
(
Func
,
Dest
,
Src0
,
Trunc
));
}
void
_cvtt
(
Variable
*
Dest
,
Operand
*
Src0
)
{
const
bool
Trunc
=
true
;
Context
.
insert
(
InstX8632Cvt
::
create
(
Func
,
Dest
,
Src0
,
Trunc
));
}
}
void
_div
(
Variable
*
Dest
,
Operand
*
Src0
,
Operand
*
Src1
)
{
void
_div
(
Variable
*
Dest
,
Operand
*
Src0
,
Operand
*
Src1
)
{
Context
.
insert
(
InstX8632Div
::
create
(
Func
,
Dest
,
Src0
,
Src1
));
Context
.
insert
(
InstX8632Div
::
create
(
Func
,
Dest
,
Src0
,
Src1
));
...
...
src/assembler_ia32.cpp
View file @
699bf02c
...
@@ -948,21 +948,6 @@ void AssemblerX86::sqrtpd(XmmRegister dst) {
...
@@ -948,21 +948,6 @@ void AssemblerX86::sqrtpd(XmmRegister dst) {
EmitXmmRegisterOperand
(
dst
,
dst
);
EmitXmmRegisterOperand
(
dst
,
dst
);
}
}
void
AssemblerX86
::
cvtps2pd
(
XmmRegister
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x5A
);
EmitXmmRegisterOperand
(
dst
,
src
);
}
void
AssemblerX86
::
cvtpd2ps
(
XmmRegister
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0x66
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x5A
);
EmitXmmRegisterOperand
(
dst
,
src
);
}
void
AssemblerX86
::
shufpd
(
XmmRegister
dst
,
XmmRegister
src
,
void
AssemblerX86
::
shufpd
(
XmmRegister
dst
,
XmmRegister
src
,
const
Immediate
&
imm
)
{
const
Immediate
&
imm
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
...
@@ -974,78 +959,91 @@ void AssemblerX86::shufpd(XmmRegister dst, XmmRegister src,
...
@@ -974,78 +959,91 @@ void AssemblerX86::shufpd(XmmRegister dst, XmmRegister src,
EmitUint8
(
imm
.
value
());
EmitUint8
(
imm
.
value
());
}
}
void
AssemblerX86
::
cvtsi2ss
(
XmmRegister
dst
,
GPRRegister
src
)
{
void
AssemblerX86
::
cvtdq2ps
(
Type
/* Ignore */
,
XmmRegister
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF3
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x
2A
);
EmitUint8
(
0x
5B
);
Emit
Operand
(
dst
,
Operand
(
src
)
);
Emit
XmmRegisterOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvtsi2sd
(
XmmRegister
dst
,
GPRRegister
src
)
{
void
AssemblerX86
::
cvtdq2ps
(
Type
/* Ignore */
,
XmmRegister
dst
,
const
Address
&
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x
2A
);
EmitUint8
(
0x
5B
);
EmitOperand
(
dst
,
Operand
(
src
)
);
EmitOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvtss2si
(
GPRRegister
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvttps2dq
(
Type
/* Ignore */
,
XmmRegister
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF3
);
EmitUint8
(
0xF3
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x
2D
);
EmitUint8
(
0x
5B
);
EmitXmmRegisterOperand
(
dst
,
src
);
EmitXmmRegisterOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvtss2sd
(
XmmRegister
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvttps2dq
(
Type
/* Ignore */
,
XmmRegister
dst
,
const
Address
&
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF3
);
EmitUint8
(
0xF3
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x5
A
);
EmitUint8
(
0x5
B
);
Emit
XmmRegister
Operand
(
dst
,
src
);
EmitOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvts
d2si
(
GPRRegister
dst
,
Xmm
Register
src
)
{
void
AssemblerX86
::
cvts
i2ss
(
Type
DestTy
,
XmmRegister
dst
,
GPR
Register
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF2
);
EmitUint8
(
isFloat32Asserting32Or64
(
DestTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x2
D
);
EmitUint8
(
0x2
A
);
Emit
Xmm
RegisterOperand
(
dst
,
src
);
EmitRegisterOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvt
tss2si
(
GPRRegister
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvt
si2ss
(
Type
DestTy
,
XmmRegister
dst
,
const
Address
&
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF3
);
EmitUint8
(
isFloat32Asserting32Or64
(
DestTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x2
C
);
EmitUint8
(
0x2
A
);
Emit
XmmRegister
Operand
(
dst
,
src
);
EmitOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvttsd2si
(
GPRRegister
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvtfloat2float
(
Type
SrcTy
,
XmmRegister
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF2
);
// ss2sd or sd2ss
EmitUint8
(
isFloat32Asserting32Or64
(
SrcTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x
2C
);
EmitUint8
(
0x
5A
);
EmitXmmRegisterOperand
(
dst
,
src
);
EmitXmmRegisterOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvtsd2ss
(
XmmRegister
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvtfloat2float
(
Type
SrcTy
,
XmmRegister
dst
,
const
Address
&
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF2
);
EmitUint8
(
isFloat32Asserting32Or64
(
SrcTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x5A
);
EmitUint8
(
0x5A
);
Emit
XmmRegister
Operand
(
dst
,
src
);
EmitOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvt
dq2pd
(
Xmm
Register
dst
,
XmmRegister
src
)
{
void
AssemblerX86
::
cvt
tss2si
(
Type
SrcTy
,
GPR
Register
dst
,
XmmRegister
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
0xF3
);
EmitUint8
(
isFloat32Asserting32Or64
(
SrcTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x
E6
);
EmitUint8
(
0x
2C
);
EmitXmmRegisterOperand
(
dst
,
src
);
EmitXmmRegisterOperand
(
dst
,
src
);
}
}
void
AssemblerX86
::
cvttss2si
(
Type
SrcTy
,
GPRRegister
dst
,
const
Address
&
src
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
EmitUint8
(
isFloat32Asserting32Or64
(
SrcTy
)
?
0xF3
:
0xF2
);
EmitUint8
(
0x0F
);
EmitUint8
(
0x2C
);
EmitOperand
(
dst
,
src
);
}
void
AssemblerX86
::
ucomiss
(
Type
Ty
,
XmmRegister
a
,
XmmRegister
b
)
{
void
AssemblerX86
::
ucomiss
(
Type
Ty
,
XmmRegister
a
,
XmmRegister
b
)
{
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
AssemblerBuffer
::
EnsureCapacity
ensured
(
&
buffer_
);
if
(
Ty
==
IceType_f64
)
if
(
Ty
==
IceType_f64
)
...
...
src/assembler_ia32.h
View file @
699bf02c
...
@@ -397,6 +397,15 @@ public:
...
@@ -397,6 +397,15 @@ public:
TypedEmitXmmImm
XmmImm
;
TypedEmitXmmImm
XmmImm
;
};
};
// Cross Xmm/GPR cast instructions.
template
<
typename
DReg_t
,
typename
SReg_t
>
struct
CastEmitterRegOp
{
typedef
void
(
AssemblerX86
::*
TypedEmitRegs
)(
Type
,
DReg_t
,
SReg_t
);
typedef
void
(
AssemblerX86
::*
TypedEmitAddr
)(
Type
,
DReg_t
,
const
Address
&
);
TypedEmitRegs
RegReg
;
TypedEmitAddr
RegAddr
;
};
/*
/*
* Emit Machine Instructions.
* Emit Machine Instructions.
*/
*/
...
@@ -537,23 +546,22 @@ public:
...
@@ -537,23 +546,22 @@ public:
void
minpd
(
XmmRegister
dst
,
XmmRegister
src
);
void
minpd
(
XmmRegister
dst
,
XmmRegister
src
);
void
maxpd
(
XmmRegister
dst
,
XmmRegister
src
);
void
maxpd
(
XmmRegister
dst
,
XmmRegister
src
);
void
sqrtpd
(
XmmRegister
dst
);
void
sqrtpd
(
XmmRegister
dst
);
void
cvtps2pd
(
XmmRegister
dst
,
XmmRegister
src
);
void
cvtpd2ps
(
XmmRegister
dst
,
XmmRegister
src
);
void
shufpd
(
XmmRegister
dst
,
XmmRegister
src
,
const
Immediate
&
mask
);
void
shufpd
(
XmmRegister
dst
,
XmmRegister
src
,
const
Immediate
&
mask
);
void
cvt
si2ss
(
XmmRegister
dst
,
GPR
Register
src
);
void
cvt
dq2ps
(
Type
,
XmmRegister
dst
,
Xmm
Register
src
);
void
cvt
si2sd
(
XmmRegister
dst
,
GPRRegister
src
);
void
cvt
dq2ps
(
Type
,
XmmRegister
dst
,
const
Address
&
src
);
void
cvt
ss2si
(
GPR
Register
dst
,
XmmRegister
src
);
void
cvt
tps2dq
(
Type
,
Xmm
Register
dst
,
XmmRegister
src
);
void
cvt
ss2sd
(
XmmRegister
dst
,
XmmRegister
src
);
void
cvt
tps2dq
(
Type
,
XmmRegister
dst
,
const
Address
&
src
);
void
cvts
d2si
(
GPRRegister
dst
,
Xmm
Register
src
);
void
cvts
i2ss
(
Type
DestTy
,
XmmRegister
dst
,
GPR
Register
src
);
void
cvts
d2ss
(
XmmRegister
dst
,
XmmRegister
src
);
void
cvts
i2ss
(
Type
DestTy
,
XmmRegister
dst
,
const
Address
&
src
);
void
cvt
tss2si
(
GPR
Register
dst
,
XmmRegister
src
);
void
cvt
float2float
(
Type
SrcTy
,
Xmm
Register
dst
,
XmmRegister
src
);
void
cvt
tsd2si
(
GPRRegister
dst
,
XmmRegister
src
);
void
cvt
float2float
(
Type
SrcTy
,
XmmRegister
dst
,
const
Address
&
src
);
void
cvtdq2pd
(
XmmRegister
dst
,
XmmRegister
src
);
void
cvttss2si
(
Type
SrcTy
,
GPRRegister
dst
,
XmmRegister
src
);
void
cvttss2si
(
Type
SrcTy
,
GPRRegister
dst
,
const
Address
&
src
);
void
ucomiss
(
Type
Ty
,
XmmRegister
a
,
XmmRegister
b
);
void
ucomiss
(
Type
Ty
,
XmmRegister
a
,
XmmRegister
b
);
void
ucomiss
(
Type
Ty
,
XmmRegister
a
,
const
Address
&
b
);
void
ucomiss
(
Type
Ty
,
XmmRegister
a
,
const
Address
&
b
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment