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
6da7ae2b
Commit
6da7ae2b
authored
Dec 17, 2015
by
David Sehr
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add template parameter for suffix to BinopXmm
BUG= R=jpp@chromium.org, stichnot@chromium.org Review URL:
https://codereview.chromium.org/1530423002
.
parent
7de24350
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
198 additions
and
419 deletions
+198
-419
IceInstX86Base.h
src/IceInstX86Base.h
+188
-119
IceInstX86BaseImpl.h
src/IceInstX86BaseImpl.h
+10
-300
No files found.
src/IceInstX86Base.h
View file @
6da7ae2b
...
@@ -149,6 +149,8 @@ public:
...
@@ -149,6 +149,8 @@ public:
IacaEnd
IacaEnd
};
};
enum
SseSuffix
{
None
,
Packed
,
Scalar
,
Integral
};
static
const
char
*
getWidthString
(
Type
Ty
);
static
const
char
*
getWidthString
(
Type
Ty
);
static
const
char
*
getFldString
(
Type
Ty
);
static
const
char
*
getFldString
(
Type
Ty
);
static
typename
Traits
::
Cond
::
BrCond
static
typename
Traits
::
Cond
::
BrCond
...
@@ -156,8 +158,8 @@ public:
...
@@ -156,8 +158,8 @@ public:
void
dump
(
const
Cfg
*
Func
)
const
override
;
void
dump
(
const
Cfg
*
Func
)
const
override
;
// Shared emit routines for common forms of instructions.
// Shared emit routines for common forms of instructions.
static
void
emitTwoAddress
(
const
char
*
Opcode
,
const
Inst
*
Inst
,
void
emitTwoAddress
(
const
Cfg
*
Func
,
const
char
*
Opcode
,
const
Cfg
*
Func
)
;
const
char
*
Suffix
=
""
)
const
;
static
void
static
void
emitIASGPRShift
(
const
Cfg
*
Func
,
Type
Ty
,
const
Variable
*
Var
,
emitIASGPRShift
(
const
Cfg
*
Func
,
Type
Ty
,
const
Variable
*
Var
,
...
@@ -628,7 +630,7 @@ public:
...
@@ -628,7 +630,7 @@ public:
void
emit
(
const
Cfg
*
Func
)
const
override
{
void
emit
(
const
Cfg
*
Func
)
const
override
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
this
->
emitTwoAddress
(
Opcode
,
this
,
Func
);
this
->
emitTwoAddress
(
Func
,
Opcode
);
}
}
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
Type
Ty
=
this
->
getDest
()
->
getType
();
Type
Ty
=
this
->
getDest
()
->
getType
();
...
@@ -671,7 +673,7 @@ public:
...
@@ -671,7 +673,7 @@ public:
void
emit
(
const
Cfg
*
Func
)
const
override
{
void
emit
(
const
Cfg
*
Func
)
const
override
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
this
->
emitTwoAddress
(
Opcode
,
this
,
Func
);
this
->
emitTwoAddress
(
Func
,
Opcode
);
}
}
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
Type
Ty
=
this
->
getDest
()
->
getType
();
Type
Ty
=
this
->
getDest
()
->
getType
();
...
@@ -715,7 +717,7 @@ public:
...
@@ -715,7 +717,7 @@ public:
void
emit
(
const
Cfg
*
Func
)
const
override
{
void
emit
(
const
Cfg
*
Func
)
const
override
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
this
->
emitTwoAddress
(
Opcode
,
this
,
Func
);
this
->
emitTwoAddress
(
Func
,
Opcode
);
}
}
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
Type
Ty
=
this
->
getSrc
(
0
)
->
getType
();
Type
Ty
=
this
->
getSrc
(
0
)
->
getType
();
...
@@ -749,20 +751,43 @@ protected:
...
@@ -749,20 +751,43 @@ protected:
};
};
template
<
class
Machine
,
typename
InstX86Base
<
Machine
>::
InstKindX86
K
,
template
<
class
Machine
,
typename
InstX86Base
<
Machine
>::
InstKindX86
K
,
bool
NeedsElementType
>
bool
NeedsElementType
,
typename
InstX86Base
<
Machine
>::
SseSuffix
Suffix
>
class
InstX86BaseBinopXmm
:
public
InstX86Base
<
Machine
>
{
class
InstX86BaseBinopXmm
:
public
InstX86Base
<
Machine
>
{
InstX86BaseBinopXmm
()
=
delete
;
InstX86BaseBinopXmm
()
=
delete
;
InstX86BaseBinopXmm
(
const
InstX86BaseBinopXmm
&
)
=
delete
;
InstX86BaseBinopXmm
(
const
InstX86BaseBinopXmm
&
)
=
delete
;
InstX86BaseBinopXmm
&
operator
=
(
const
InstX86BaseBinopXmm
&
)
=
delete
;
InstX86BaseBinopXmm
&
operator
=
(
const
InstX86BaseBinopXmm
&
)
=
delete
;
public
:
public
:
using
Base
=
InstX86BaseBinopXmm
<
Machine
,
K
,
NeedsElementType
>
;
using
Base
=
InstX86BaseBinopXmm
<
Machine
,
K
,
NeedsElementType
,
Suffix
>
;
void
emit
(
const
Cfg
*
Func
)
const
override
{
void
emit
(
const
Cfg
*
Func
)
const
override
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
this
->
validateVectorAddrMode
();
this
->
validateVectorAddrMode
();
this
->
emitTwoAddress
(
Opcode
,
this
,
Func
);
switch
(
Suffix
)
{
case
InstX86Base
<
Machine
>
:
:
SseSuffix
::
None
:
this
->
emitTwoAddress
(
Func
,
Opcode
);
break
;
case
InstX86Base
<
Machine
>
:
:
SseSuffix
::
Packed
:
{
const
Type
DestTy
=
this
->
getDest
()
->
getType
();
this
->
emitTwoAddress
(
Func
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
DestTy
].
PdPsString
);
}
break
;
case
InstX86Base
<
Machine
>
:
:
SseSuffix
::
Scalar
:
{
const
Type
DestTy
=
this
->
getDest
()
->
getType
();
this
->
emitTwoAddress
(
Func
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
DestTy
].
SdSsString
);
}
break
;
case
InstX86Base
<
Machine
>
:
:
SseSuffix
::
Integral
:
{
const
Type
DestTy
=
this
->
getDest
()
->
getType
();
this
->
emitTwoAddress
(
Func
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
DestTy
].
PackString
);
}
break
;
}
}
}
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
this
->
validateVectorAddrMode
();
this
->
validateVectorAddrMode
();
...
@@ -818,7 +843,11 @@ public:
...
@@ -818,7 +843,11 @@ public:
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
this
->
validateVectorAddrMode
();
this
->
validateVectorAddrMode
();
this
->
emitTwoAddress
(
Opcode
,
this
,
Func
);
// Shift operations are always integral, and hence always need a suffix.
const
Type
DestTy
=
this
->
getDest
()
->
getType
();
this
->
emitTwoAddress
(
Func
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
DestTy
].
PackString
);
}
}
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
void
emitIAS
(
const
Cfg
*
Func
)
const
override
{
this
->
validateVectorAddrMode
();
this
->
validateVectorAddrMode
();
...
@@ -1254,7 +1283,8 @@ private:
...
@@ -1254,7 +1283,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Addps
class
InstX86Addps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Addps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Addps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Addps
>
())
return
new
(
Func
->
allocate
<
InstX86Addps
>
())
...
@@ -1263,8 +1293,9 @@ public:
...
@@ -1263,8 +1293,9 @@ public:
private
:
private
:
InstX86Addps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Addps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1303,34 +1334,34 @@ private:
...
@@ -1303,34 +1334,34 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Addss
class
InstX86Addss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addss
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addss
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Addss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Addss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Addss
>
())
return
new
(
Func
->
allocate
<
InstX86Addss
>
())
InstX86Addss
(
Func
,
Dest
,
Source
);
InstX86Addss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Addss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Addss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addss
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Addss
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Padd
class
InstX86Padd
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Padd
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Padd
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
{
public
:
public
:
static
InstX86Padd
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Padd
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Padd
>
())
InstX86Padd
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Padd
>
())
InstX86Padd
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Padd
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Padd
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Padd
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Padd
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
(
Func
,
Dest
,
Source
)
{}
Func
,
Dest
,
Source
)
{}
};
};
...
@@ -1370,7 +1401,8 @@ private:
...
@@ -1370,7 +1401,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Subps
class
InstX86Subps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Subps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Subps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Subps
>
())
return
new
(
Func
->
allocate
<
InstX86Subps
>
())
...
@@ -1379,25 +1411,26 @@ public:
...
@@ -1379,25 +1411,26 @@ public:
private
:
private
:
InstX86Subps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Subps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Subss
class
InstX86Subss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subss
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subss
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Subss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Subss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Subss
>
())
return
new
(
Func
->
allocate
<
InstX86Subss
>
())
InstX86Subss
(
Func
,
Dest
,
Source
);
InstX86Subss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Subss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Subss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subss
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Subss
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1436,17 +1469,17 @@ private:
...
@@ -1436,17 +1469,17 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Psub
class
InstX86Psub
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Psub
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Psub
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
{
public
:
public
:
static
InstX86Psub
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Psub
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Psub
>
())
InstX86Psub
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Psub
>
())
InstX86Psub
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Psub
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Psub
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Psub
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Psub
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
(
Func
,
Dest
,
Source
)
{}
Func
,
Dest
,
Source
)
{}
};
};
...
@@ -1466,36 +1499,36 @@ private:
...
@@ -1466,36 +1499,36 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Andnps
class
InstX86Andnps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andnps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andnps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Andnps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Andnps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Andnps
>
())
return
new
(
Func
->
allocate
<
InstX86Andnps
>
())
InstX86Andnps
(
Func
,
Dest
,
Source
);
InstX86Andnps
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Andnps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Andnps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andnps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andnps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Andps
class
InstX86Andps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Andps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Andps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Andps
>
())
return
new
(
Func
->
allocate
<
InstX86Andps
>
())
InstX86Andps
(
Func
,
Dest
,
Source
);
InstX86Andps
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Andps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Andps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Andps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1520,7 +1553,8 @@ private:
...
@@ -1520,7 +1553,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pand
class
InstX86Pand
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pand
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pand
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
{
public
:
public
:
static
InstX86Pand
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pand
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Pand
>
())
InstX86Pand
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Pand
>
())
InstX86Pand
(
Func
,
Dest
,
Source
);
...
@@ -1528,13 +1562,15 @@ public:
...
@@ -1528,13 +1562,15 @@ public:
private
:
private
:
InstX86Pand
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pand
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pand
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pand
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pandn
class
InstX86Pandn
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pandn
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pandn
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
{
public
:
public
:
static
InstX86Pandn
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pandn
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Pandn
>
())
return
new
(
Func
->
allocate
<
InstX86Pandn
>
())
...
@@ -1543,42 +1579,43 @@ public:
...
@@ -1543,42 +1579,43 @@ public:
private
:
private
:
InstX86Pandn
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pandn
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pandn
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pandn
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Maxss
class
InstX86Maxss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Maxss
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Maxss
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Maxss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Maxss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Maxss
>
())
return
new
(
Func
->
allocate
<
InstX86Maxss
>
())
InstX86Maxss
(
Func
,
Dest
,
Source
);
InstX86Maxss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Maxss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Maxss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Maxss
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Maxss
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Minss
class
InstX86Minss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Minss
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Minss
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Minss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Minss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Minss
>
())
return
new
(
Func
->
allocate
<
InstX86Minss
>
())
InstX86Minss
(
Func
,
Dest
,
Source
);
InstX86Minss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Minss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Minss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Minss
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Minss
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1597,18 +1634,18 @@ private:
...
@@ -1597,18 +1634,18 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Orps
class
InstX86Orps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Orps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Orps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Orps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Orps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Orps
>
())
InstX86Orps
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Orps
>
())
InstX86Orps
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Orps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Orps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Orps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Orps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1633,7 +1670,8 @@ private:
...
@@ -1633,7 +1670,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Por
class
InstX86Por
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Por
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Por
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
{
public
:
public
:
static
InstX86Por
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Por
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Por
>
())
InstX86Por
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Por
>
())
InstX86Por
(
Func
,
Dest
,
Source
);
...
@@ -1641,8 +1679,9 @@ public:
...
@@ -1641,8 +1679,9 @@ public:
private
:
private
:
InstX86Por
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Por
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Por
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Por
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1661,19 +1700,19 @@ private:
...
@@ -1661,19 +1700,19 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Xorps
class
InstX86Xorps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Xorps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Xorps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Xorps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Xorps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Xorps
>
())
return
new
(
Func
->
allocate
<
InstX86Xorps
>
())
InstX86Xorps
(
Func
,
Dest
,
Source
);
InstX86Xorps
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Xorps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Xorps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Xorps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Xorps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1698,7 +1737,8 @@ private:
...
@@ -1698,7 +1737,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pxor
class
InstX86Pxor
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pxor
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pxor
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
{
public
:
public
:
static
InstX86Pxor
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pxor
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Pxor
>
())
InstX86Pxor
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Pxor
>
())
InstX86Pxor
(
Func
,
Dest
,
Source
);
...
@@ -1706,8 +1746,9 @@ public:
...
@@ -1706,8 +1746,9 @@ public:
private
:
private
:
InstX86Pxor
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pxor
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pxor
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pxor
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1748,7 +1789,8 @@ private:
...
@@ -1748,7 +1789,8 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Mulps
class
InstX86Mulps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Mulps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Mulps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Mulps
>
())
return
new
(
Func
->
allocate
<
InstX86Mulps
>
())
...
@@ -1757,66 +1799,78 @@ public:
...
@@ -1757,66 +1799,78 @@ public:
private
:
private
:
InstX86Mulps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Mulps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Mulss
class
InstX86Mulss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulss
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulss
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Mulss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Mulss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Mulss
>
())
return
new
(
Func
->
allocate
<
InstX86Mulss
>
())
InstX86Mulss
(
Func
,
Dest
,
Source
);
InstX86Mulss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Mulss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Mulss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulss
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Mulss
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pmull
class
InstX86Pmull
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmull
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmull
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
{
public
:
public
:
static
InstX86Pmull
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pmull
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
bool
TypesAreValid
=
Dest
->
getType
()
==
IceType_v4i32
||
Dest
->
getType
()
==
IceType_v8i16
;
auto
*
Target
=
InstX86Base
<
Machine
>::
getTarget
(
Func
);
bool
InstructionSetIsValid
=
Dest
->
getType
()
==
IceType_v8i16
||
Target
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
;
(
void
)
TypesAreValid
;
(
void
)
InstructionSetIsValid
;
assert
(
TypesAreValid
);
assert
(
InstructionSetIsValid
);
return
new
(
Func
->
allocate
<
InstX86Pmull
>
())
return
new
(
Func
->
allocate
<
InstX86Pmull
>
())
InstX86Pmull
(
Func
,
Dest
,
Source
);
InstX86Pmull
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
void
emitIAS
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Pmull
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pmull
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmull
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmull
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
(
Func
,
Dest
,
Source
)
{}
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pmuludq
class
InstX86Pmuludq
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmuludq
,
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmuludq
,
false
,
fals
e
>
{
InstX86Base
<
Machine
>::
SseSuffix
::
Non
e
>
{
public
:
public
:
static
InstX86Pmuludq
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pmuludq
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
assert
(
Dest
->
getType
()
==
IceType_v4i32
&&
Source
->
getType
()
==
IceType_v4i32
);
return
new
(
Func
->
allocate
<
InstX86Pmuludq
>
())
return
new
(
Func
->
allocate
<
InstX86Pmuludq
>
())
InstX86Pmuludq
(
Func
,
Dest
,
Source
);
InstX86Pmuludq
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Pmuludq
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pmuludq
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmuludq
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pmuludq
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Divps
class
InstX86Divps
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divps
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divps
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
{
public
:
public
:
static
InstX86Divps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Divps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Divps
>
())
return
new
(
Func
->
allocate
<
InstX86Divps
>
())
...
@@ -1825,25 +1879,26 @@ public:
...
@@ -1825,25 +1879,26 @@ public:
private
:
private
:
InstX86Divps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Divps
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divps
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divps
,
true
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Packed
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Divss
class
InstX86Divss
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divss
,
false
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divss
,
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
{
public
:
public
:
static
InstX86Divss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Divss
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Divss
>
())
return
new
(
Func
->
allocate
<
InstX86Divss
>
())
InstX86Divss
(
Func
,
Dest
,
Source
);
InstX86Divss
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Divss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Divss
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divss
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Divss
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
Scalar
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -1879,11 +1934,12 @@ class InstX86Psll
...
@@ -1879,11 +1934,12 @@ class InstX86Psll
:
public
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psll
>
{
:
public
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psll
>
{
public
:
public
:
static
InstX86Psll
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Psll
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
assert
(
Dest
->
getType
()
==
IceType_v8i16
||
Dest
->
getType
()
==
IceType_v8i1
||
Dest
->
getType
()
==
IceType_v4i32
||
Dest
->
getType
()
==
IceType_v4i1
);
return
new
(
Func
->
allocate
<
InstX86Psll
>
())
InstX86Psll
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Psll
>
())
InstX86Psll
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Psll
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Psll
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psll
>
(
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psll
>
(
...
@@ -1899,8 +1955,6 @@ public:
...
@@ -1899,8 +1955,6 @@ public:
return
new
(
Func
->
allocate
<
InstX86Psrl
>
())
InstX86Psrl
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Psrl
>
())
InstX86Psrl
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Psrl
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Psrl
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psrl
,
true
>
(
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psrl
,
true
>
(
...
@@ -1940,11 +1994,12 @@ class InstX86Psra
...
@@ -1940,11 +1994,12 @@ class InstX86Psra
:
public
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psra
>
{
:
public
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psra
>
{
public
:
public
:
static
InstX86Psra
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Psra
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
assert
(
Dest
->
getType
()
==
IceType_v8i16
||
Dest
->
getType
()
==
IceType_v8i1
||
Dest
->
getType
()
==
IceType_v4i32
||
Dest
->
getType
()
==
IceType_v4i1
);
return
new
(
Func
->
allocate
<
InstX86Psra
>
())
InstX86Psra
(
Func
,
Dest
,
Source
);
return
new
(
Func
->
allocate
<
InstX86Psra
>
())
InstX86Psra
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Psra
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Psra
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psra
>
(
:
InstX86BaseBinopXmmShift
<
Machine
,
InstX86Base
<
Machine
>::
Psra
>
(
...
@@ -1953,35 +2008,35 @@ private:
...
@@ -1953,35 +2008,35 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pcmpeq
class
InstX86Pcmpeq
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpeq
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpeq
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
{
public
:
public
:
static
InstX86Pcmpeq
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pcmpeq
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Pcmpeq
>
())
return
new
(
Func
->
allocate
<
InstX86Pcmpeq
>
())
InstX86Pcmpeq
(
Func
,
Dest
,
Source
);
InstX86Pcmpeq
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Pcmpeq
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pcmpeq
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpeq
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpeq
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
(
Func
,
Dest
,
Source
)
{}
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86Pcmpgt
class
InstX86Pcmpgt
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpgt
,
true
>
{
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpgt
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
{
public
:
public
:
static
InstX86Pcmpgt
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86Pcmpgt
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86Pcmpgt
>
())
return
new
(
Func
->
allocate
<
InstX86Pcmpgt
>
())
InstX86Pcmpgt
(
Func
,
Dest
,
Source
);
InstX86Pcmpgt
(
Func
,
Dest
,
Source
);
}
}
void
emit
(
const
Cfg
*
Func
)
const
override
;
private
:
private
:
InstX86Pcmpgt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86Pcmpgt
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpgt
,
true
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
Pcmpgt
,
true
,
InstX86Base
<
Machine
>::
SseSuffix
::
Integral
>
(
Func
,
Dest
,
Source
)
{}
Func
,
Dest
,
Source
)
{}
};
};
...
@@ -1994,7 +2049,7 @@ private:
...
@@ -1994,7 +2049,7 @@ private:
template
<
class
Machine
>
template
<
class
Machine
>
class
InstX86MovssRegs
class
InstX86MovssRegs
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
MovssRegs
,
:
public
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
MovssRegs
,
false
>
{
false
,
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
{
public
:
public
:
static
InstX86MovssRegs
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
static
InstX86MovssRegs
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
{
return
new
(
Func
->
allocate
<
InstX86MovssRegs
>
())
return
new
(
Func
->
allocate
<
InstX86MovssRegs
>
())
...
@@ -2005,8 +2060,9 @@ public:
...
@@ -2005,8 +2060,9 @@ public:
private
:
private
:
InstX86MovssRegs
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
InstX86MovssRegs
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source
)
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
MovssRegs
,
false
>
(
:
InstX86BaseBinopXmm
<
Machine
,
InstX86Base
<
Machine
>::
MovssRegs
,
false
,
Func
,
Dest
,
Source
)
{}
InstX86Base
<
Machine
>::
SseSuffix
::
None
>
(
Func
,
Dest
,
Source
)
{}
};
};
template
<
class
Machine
>
template
<
class
Machine
>
...
@@ -2071,6 +2127,11 @@ class InstX86Pinsr
...
@@ -2071,6 +2127,11 @@ class InstX86Pinsr
public
:
public
:
static
InstX86Pinsr
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
static
InstX86Pinsr
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
Operand
*
Source2
)
{
Operand
*
Source2
)
{
// pinsrb and pinsrd are SSE4.1 instructions.
assert
(
Dest
->
getType
()
==
IceType_v8i16
||
Dest
->
getType
()
==
IceType_v8i1
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
return
new
(
Func
->
allocate
<
InstX86Pinsr
>
())
return
new
(
Func
->
allocate
<
InstX86Pinsr
>
())
InstX86Pinsr
(
Func
,
Dest
,
Source1
,
Source2
);
InstX86Pinsr
(
Func
,
Dest
,
Source1
,
Source2
);
}
}
...
@@ -2108,6 +2169,8 @@ class InstX86Blendvps
...
@@ -2108,6 +2169,8 @@ class InstX86Blendvps
public
:
public
:
static
InstX86Blendvps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
static
InstX86Blendvps
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
Operand
*
Source2
)
{
Operand
*
Source2
)
{
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
return
new
(
Func
->
allocate
<
InstX86Blendvps
>
())
return
new
(
Func
->
allocate
<
InstX86Blendvps
>
())
InstX86Blendvps
(
Func
,
Dest
,
Source1
,
Source2
);
InstX86Blendvps
(
Func
,
Dest
,
Source1
,
Source2
);
}
}
...
@@ -2127,6 +2190,8 @@ class InstX86Pblendvb
...
@@ -2127,6 +2190,8 @@ class InstX86Pblendvb
public
:
public
:
static
InstX86Pblendvb
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
static
InstX86Pblendvb
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source1
,
Operand
*
Source2
)
{
Operand
*
Source2
)
{
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
return
new
(
Func
->
allocate
<
InstX86Pblendvb
>
())
return
new
(
Func
->
allocate
<
InstX86Pblendvb
>
())
InstX86Pblendvb
(
Func
,
Dest
,
Source1
,
Source2
);
InstX86Pblendvb
(
Func
,
Dest
,
Source1
,
Source2
);
}
}
...
@@ -2146,6 +2211,10 @@ class InstX86Pextr
...
@@ -2146,6 +2211,10 @@ class InstX86Pextr
public
:
public
:
static
InstX86Pextr
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source0
,
static
InstX86Pextr
*
create
(
Cfg
*
Func
,
Variable
*
Dest
,
Operand
*
Source0
,
Operand
*
Source1
)
{
Operand
*
Source1
)
{
assert
(
Source0
->
getType
()
==
IceType_v8i16
||
Source0
->
getType
()
==
IceType_v8i1
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
return
new
(
Func
->
allocate
<
InstX86Pextr
>
())
return
new
(
Func
->
allocate
<
InstX86Pextr
>
())
InstX86Pextr
(
Func
,
Dest
,
Source0
,
Source1
);
InstX86Pextr
(
Func
,
Dest
,
Source0
,
Source1
);
}
}
...
...
src/IceInstX86BaseImpl.h
View file @
6da7ae2b
...
@@ -622,19 +622,19 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const {
...
@@ -622,19 +622,19 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const {
// The this->Opcode parameter needs to be char* and not IceString because of
// The this->Opcode parameter needs to be char* and not IceString because of
// template issues.
// template issues.
template
<
class
Machine
>
template
<
class
Machine
>
void
InstX86Base
<
Machine
>::
emitTwoAddress
(
const
char
*
Opcode
,
const
Inst
*
Inst
,
void
InstX86Base
<
Machine
>::
emitTwoAddress
(
const
Cfg
*
Func
,
const
char
*
Opcode
,
const
Cfg
*
Func
)
{
const
char
*
Suffix
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
assert
(
Inst
->
getSrcSize
()
==
2
);
assert
(
getSrcSize
()
==
2
);
Operand
*
Dest
=
Inst
->
getDest
();
Operand
*
Dest
=
getDest
();
if
(
Dest
==
nullptr
)
if
(
Dest
==
nullptr
)
Dest
=
Inst
->
getSrc
(
0
);
Dest
=
getSrc
(
0
);
assert
(
Dest
==
Inst
->
getSrc
(
0
));
assert
(
Dest
==
getSrc
(
0
));
Operand
*
Src1
=
Inst
->
getSrc
(
1
);
Operand
*
Src1
=
getSrc
(
1
);
Str
<<
"
\t
"
<<
Opcode
<<
InstX86Base
<
Machine
>::
getWidthString
(
Dest
->
getType
())
Str
<<
"
\t
"
<<
Opcode
<<
Suffix
<<
"
\t
"
;
<<
InstX86Base
<
Machine
>::
getWidthString
(
Dest
->
getType
())
<<
"
\t
"
;
Src1
->
emit
(
Func
);
Src1
->
emit
(
Func
);
Str
<<
", "
;
Str
<<
", "
;
Dest
->
emit
(
Func
);
Dest
->
emit
(
Func
);
...
@@ -1008,205 +1008,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const {
...
@@ -1008,205 +1008,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const {
this
->
getDest
()
->
emit
(
Func
);
this
->
getDest
()
->
emit
(
Func
);
}
}
template
<
class
Machine
>
void
InstX86Addss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"add%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Padd
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"padd%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Pmull
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
bool
TypesAreValid
=
this
->
getDest
()
->
getType
()
==
IceType_v4i32
||
this
->
getDest
()
->
getType
()
==
IceType_v8i16
;
auto
*
Target
=
InstX86Base
<
Machine
>::
getTarget
(
Func
);
bool
InstructionSetIsValid
=
this
->
getDest
()
->
getType
()
==
IceType_v8i16
||
Target
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
;
(
void
)
TypesAreValid
;
(
void
)
InstructionSetIsValid
;
assert
(
TypesAreValid
);
assert
(
InstructionSetIsValid
);
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"pmull%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Pmull
<
Machine
>::
emitIAS
(
const
Cfg
*
Func
)
const
{
Type
Ty
=
this
->
getDest
()
->
getType
();
bool
TypesAreValid
=
Ty
==
IceType_v4i32
||
Ty
==
IceType_v8i16
;
auto
*
Target
=
InstX86Base
<
Machine
>::
getTarget
(
Func
);
bool
InstructionSetIsValid
=
Ty
==
IceType_v8i16
||
Target
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
;
(
void
)
TypesAreValid
;
(
void
)
InstructionSetIsValid
;
assert
(
TypesAreValid
);
assert
(
InstructionSetIsValid
);
assert
(
this
->
getSrcSize
()
==
2
);
Type
ElementTy
=
typeElementType
(
Ty
);
emitIASRegOpTyXMM
<
Machine
>
(
Func
,
ElementTy
,
this
->
getDest
(),
this
->
getSrc
(
1
),
this
->
Emitter
);
}
template
<
class
Machine
>
void
InstX86Subss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"sub%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Psub
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"psub%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Mulss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"mul%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Andnps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PdPsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Andps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PdPsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Maxss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Minss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Orps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PdPsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Xorps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"%s%s"
,
this
->
Opcode
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PdPsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Pmuludq
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
assert
(
this
->
getSrc
(
0
)
->
getType
()
==
IceType_v4i32
&&
this
->
getSrc
(
1
)
->
getType
()
==
IceType_v4i32
);
this
->
emitTwoAddress
(
this
->
Opcode
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Divss
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"div%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
SdSsString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Div
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
template
<
class
Machine
>
void
InstX86Div
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
...
@@ -1283,15 +1084,11 @@ template <class Machine>
...
@@ -1283,15 +1084,11 @@ template <class Machine>
void
InstX86Blendvps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
void
InstX86Blendvps
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
emitVariableBlendInst
<
Machine
>
(
this
->
Opcode
,
this
,
Func
);
emitVariableBlendInst
<
Machine
>
(
this
->
Opcode
,
this
,
Func
);
}
}
template
<
class
Machine
>
template
<
class
Machine
>
void
InstX86Blendvps
<
Machine
>::
emitIAS
(
const
Cfg
*
Func
)
const
{
void
InstX86Blendvps
<
Machine
>::
emitIAS
(
const
Cfg
*
Func
)
const
{
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
static
const
typename
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
XmmEmitterRegOp
static
const
typename
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
XmmEmitterRegOp
Emitter
=
{
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
blendvps
,
Emitter
=
{
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
blendvps
,
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
blendvps
};
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
blendvps
};
...
@@ -1302,15 +1099,11 @@ template <class Machine>
...
@@ -1302,15 +1099,11 @@ template <class Machine>
void
InstX86Pblendvb
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
void
InstX86Pblendvb
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
emitVariableBlendInst
<
Machine
>
(
this
->
Opcode
,
this
,
Func
);
emitVariableBlendInst
<
Machine
>
(
this
->
Opcode
,
this
,
Func
);
}
}
template
<
class
Machine
>
template
<
class
Machine
>
void
InstX86Pblendvb
<
Machine
>::
emitIAS
(
const
Cfg
*
Func
)
const
{
void
InstX86Pblendvb
<
Machine
>::
emitIAS
(
const
Cfg
*
Func
)
const
{
assert
(
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
static
const
typename
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
XmmEmitterRegOp
static
const
typename
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
XmmEmitterRegOp
Emitter
=
{
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
pblendvb
,
Emitter
=
{
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
pblendvb
,
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
pblendvb
};
&
InstX86Base
<
Machine
>::
Traits
::
Assembler
::
pblendvb
};
...
@@ -1342,7 +1135,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const {
...
@@ -1342,7 +1135,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const {
Str
<<
", "
;
Str
<<
", "
;
Dest
->
emit
(
Func
);
Dest
->
emit
(
Func
);
}
else
{
}
else
{
this
->
emitTwoAddress
(
"imul"
,
this
,
Func
);
this
->
emitTwoAddress
(
Func
,
this
->
Opcode
);
}
}
}
}
...
@@ -2791,40 +2584,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const {
...
@@ -2791,40 +2584,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const {
}
}
template
<
class
Machine
>
template
<
class
Machine
>
void
InstX86Pcmpeq
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"pcmpeq%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Pcmpgt
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"pcmpgt%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Pextr
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
void
InstX86Pextr
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
assert
(
this
->
getSrcSize
()
==
2
);
assert
(
this
->
getSrcSize
()
==
2
);
// pextrb and pextrd are SSE4.1 instructions.
// pextrb and pextrd are SSE4.1 instructions.
assert
(
this
->
getSrc
(
0
)
->
getType
()
==
IceType_v8i16
||
this
->
getSrc
(
0
)
->
getType
()
==
IceType_v8i1
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
Str
<<
"
\t
"
<<
this
->
Opcode
Str
<<
"
\t
"
<<
this
->
Opcode
<<
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getSrc
(
0
)
<<
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getSrc
(
0
)
->
getType
()]
->
getType
()]
...
@@ -2848,9 +2613,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
...
@@ -2848,9 +2613,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
const
Variable
*
Dest
=
this
->
getDest
();
const
Variable
*
Dest
=
this
->
getDest
();
Type
DispatchTy
=
InstX86Base
<
Machine
>::
Traits
::
getInVectorElementType
(
Type
DispatchTy
=
InstX86Base
<
Machine
>::
Traits
::
getInVectorElementType
(
this
->
getSrc
(
0
)
->
getType
());
this
->
getSrc
(
0
)
->
getType
());
assert
(
DispatchTy
==
IceType_i16
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
// pextrw must take a register dest. There is an SSE4.1 version that takes a
// pextrw must take a register dest. There is an SSE4.1 version that takes a
// memory dest, but we aren't using it. For uniformity, just restrict them
// memory dest, but we aren't using it. For uniformity, just restrict them
// all to have a register dest for now.
// all to have a register dest for now.
...
@@ -2876,11 +2638,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
...
@@ -2876,11 +2638,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
return
;
return
;
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
Ostream
&
Str
=
Func
->
getContext
()
->
getStrEmit
();
assert
(
this
->
getSrcSize
()
==
3
);
assert
(
this
->
getSrcSize
()
==
3
);
// pinsrb and pinsrd are SSE4.1 instructions.
assert
(
this
->
getDest
()
->
getType
()
==
IceType_v8i16
||
this
->
getDest
()
->
getType
()
==
IceType_v8i1
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
Str
<<
"
\t
"
<<
this
->
Opcode
Str
<<
"
\t
"
<<
this
->
Opcode
<<
InstX86Base
<
<<
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
...
@@ -2912,9 +2669,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
...
@@ -2912,9 +2669,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
// pinsrb and pinsrd are SSE4.1 instructions.
// pinsrb and pinsrd are SSE4.1 instructions.
const
Operand
*
Src0
=
this
->
getSrc
(
1
);
const
Operand
*
Src0
=
this
->
getSrc
(
1
);
Type
DispatchTy
=
Src0
->
getType
();
Type
DispatchTy
=
Src0
->
getType
();
assert
(
DispatchTy
==
IceType_i16
||
InstX86Base
<
Machine
>::
getTarget
(
Func
)
->
getInstructionSet
()
>=
InstX86Base
<
Machine
>::
Traits
::
SSE4_1
);
// If src1 is a register, it should always be r32 (this should fall out from
// If src1 is a register, it should always be r32 (this should fall out from
// the encodings for ByteRegs overlapping the encodings for r32), but we have
// the encodings for ByteRegs overlapping the encodings for r32), but we have
// to make sure the register allocator didn't choose an 8-bit high register
// to make sure the register allocator didn't choose an 8-bit high register
...
@@ -3049,50 +2803,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const {
...
@@ -3049,50 +2803,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const {
this
->
dumpSources
(
Func
);
this
->
dumpSources
(
Func
);
}
}
template
<
class
Machine
>
void
InstX86Psll
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
assert
(
this
->
getDest
()
->
getType
()
==
IceType_v8i16
||
this
->
getDest
()
->
getType
()
==
IceType_v8i1
||
this
->
getDest
()
->
getType
()
==
IceType_v4i32
||
this
->
getDest
()
->
getType
()
==
IceType_v4i1
);
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"psll%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Psra
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
assert
(
this
->
getDest
()
->
getType
()
==
IceType_v8i16
||
this
->
getDest
()
->
getType
()
==
IceType_v8i1
||
this
->
getDest
()
->
getType
()
==
IceType_v4i32
||
this
->
getDest
()
->
getType
()
==
IceType_v4i1
);
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"psra%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Psrl
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
return
;
char
buf
[
30
];
snprintf
(
buf
,
llvm
::
array_lengthof
(
buf
),
"psrl%s"
,
InstX86Base
<
Machine
>::
Traits
::
TypeAttributes
[
this
->
getDest
()
->
getType
()]
.
PackString
);
this
->
emitTwoAddress
(
buf
,
this
,
Func
);
}
template
<
class
Machine
>
void
InstX86Ret
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
template
<
class
Machine
>
void
InstX86Ret
<
Machine
>::
emit
(
const
Cfg
*
Func
)
const
{
if
(
!
BuildDefs
::
dump
())
if
(
!
BuildDefs
::
dump
())
return
;
return
;
...
...
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