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
97f460dc
Commit
97f460dc
authored
Jul 21, 2015
by
Andrew Scull
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename legalizeToVar to the more accurate legalizeToReg.
BUG= R=stichnot@chromium.org Review URL:
https://codereview.chromium.org/1245063003
.
parent
b7db1a52
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
93 additions
and
93 deletions
+93
-93
IceTargetLoweringARM32.cpp
src/IceTargetLoweringARM32.cpp
+47
-47
IceTargetLoweringARM32.h
src/IceTargetLoweringARM32.h
+1
-1
IceTargetLoweringX86Base.h
src/IceTargetLoweringX86Base.h
+1
-1
IceTargetLoweringX86BaseImpl.h
src/IceTargetLoweringX86BaseImpl.h
+44
-44
No files found.
src/IceTargetLoweringARM32.cpp
View file @
97f460dc
...
@@ -1027,7 +1027,7 @@ void TargetARM32::lowerAlloca(const InstAlloca *Inst) {
...
@@ -1027,7 +1027,7 @@ void TargetARM32::lowerAlloca(const InstAlloca *Inst) {
void
TargetARM32
::
div0Check
(
Type
Ty
,
Operand
*
SrcLo
,
Operand
*
SrcHi
)
{
void
TargetARM32
::
div0Check
(
Type
Ty
,
Operand
*
SrcLo
,
Operand
*
SrcHi
)
{
if
(
isGuaranteedNonzeroInt
(
SrcLo
)
||
isGuaranteedNonzeroInt
(
SrcHi
))
if
(
isGuaranteedNonzeroInt
(
SrcLo
)
||
isGuaranteedNonzeroInt
(
SrcHi
))
return
;
return
;
Variable
*
SrcLoReg
=
legalizeTo
Var
(
SrcLo
);
Variable
*
SrcLoReg
=
legalizeTo
Reg
(
SrcLo
);
switch
(
Ty
)
{
switch
(
Ty
)
{
default
:
default
:
llvm_unreachable
(
"Unexpected type"
);
llvm_unreachable
(
"Unexpected type"
);
...
@@ -1066,7 +1066,7 @@ void TargetARM32::lowerIDivRem(Variable *Dest, Variable *T, Variable *Src0R,
...
@@ -1066,7 +1066,7 @@ void TargetARM32::lowerIDivRem(Variable *Dest, Variable *T, Variable *Src0R,
DivInstr
DivFunc
,
const
char
*
DivHelperName
,
DivInstr
DivFunc
,
const
char
*
DivHelperName
,
bool
IsRemainder
)
{
bool
IsRemainder
)
{
div0Check
(
Dest
->
getType
(),
Src1
,
nullptr
);
div0Check
(
Dest
->
getType
(),
Src1
,
nullptr
);
Variable
*
Src1R
=
legalizeTo
Var
(
Src1
);
Variable
*
Src1R
=
legalizeTo
Reg
(
Src1
);
Variable
*
T0R
=
Src0R
;
Variable
*
T0R
=
Src0R
;
Variable
*
T1R
=
Src1R
;
Variable
*
T1R
=
Src1R
;
if
(
Dest
->
getType
()
!=
IceType_i32
)
{
if
(
Dest
->
getType
()
!=
IceType_i32
)
{
...
@@ -1163,8 +1163,8 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1163,8 +1163,8 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
}
}
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
Variable
*
Src0RLo
=
legalizeTo
Var
(
loOperand
(
Src0
));
Variable
*
Src0RLo
=
legalizeTo
Reg
(
loOperand
(
Src0
));
Variable
*
Src0RHi
=
legalizeTo
Var
(
hiOperand
(
Src0
));
Variable
*
Src0RHi
=
legalizeTo
Reg
(
hiOperand
(
Src0
));
Operand
*
Src1Lo
=
loOperand
(
Src1
);
Operand
*
Src1Lo
=
loOperand
(
Src1
);
Operand
*
Src1Hi
=
hiOperand
(
Src1
);
Operand
*
Src1Hi
=
hiOperand
(
Src1
);
Variable
*
T_Lo
=
makeReg
(
DestLo
->
getType
());
Variable
*
T_Lo
=
makeReg
(
DestLo
->
getType
());
...
@@ -1236,8 +1236,8 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1236,8 +1236,8 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
Variable
*
T_Acc
=
makeReg
(
IceType_i32
);
Variable
*
T_Acc
=
makeReg
(
IceType_i32
);
Variable
*
T_Acc1
=
makeReg
(
IceType_i32
);
Variable
*
T_Acc1
=
makeReg
(
IceType_i32
);
Variable
*
T_Hi1
=
makeReg
(
IceType_i32
);
Variable
*
T_Hi1
=
makeReg
(
IceType_i32
);
Variable
*
Src1RLo
=
legalizeTo
Var
(
Src1Lo
);
Variable
*
Src1RLo
=
legalizeTo
Reg
(
Src1Lo
);
Variable
*
Src1RHi
=
legalizeTo
Var
(
Src1Hi
);
Variable
*
Src1RHi
=
legalizeTo
Reg
(
Src1Hi
);
_mul
(
T_Acc
,
Src0RLo
,
Src1RHi
);
_mul
(
T_Acc
,
Src0RLo
,
Src1RHi
);
_mla
(
T_Acc1
,
Src1RLo
,
Src0RHi
,
T_Acc
);
_mla
(
T_Acc1
,
Src1RLo
,
Src0RHi
,
T_Acc
);
_umull
(
T_Lo
,
T_Hi1
,
Src0RLo
,
Src1RLo
);
_umull
(
T_Lo
,
T_Hi1
,
Src0RLo
,
Src1RLo
);
...
@@ -1264,7 +1264,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1264,7 +1264,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
// and saturate to the range 0-32, so the negative value will
// and saturate to the range 0-32, so the negative value will
// saturate to 32.
// saturate to 32.
Variable
*
T_Hi
=
makeReg
(
IceType_i32
);
Variable
*
T_Hi
=
makeReg
(
IceType_i32
);
Variable
*
Src1RLo
=
legalizeTo
Var
(
Src1Lo
);
Variable
*
Src1RLo
=
legalizeTo
Reg
(
Src1Lo
);
Constant
*
ThirtyTwo
=
Ctx
->
getConstantInt32
(
32
);
Constant
*
ThirtyTwo
=
Ctx
->
getConstantInt32
(
32
);
Variable
*
T_C1
=
makeReg
(
IceType_i32
);
Variable
*
T_C1
=
makeReg
(
IceType_i32
);
Variable
*
T_C2
=
makeReg
(
IceType_i32
);
Variable
*
T_C2
=
makeReg
(
IceType_i32
);
...
@@ -1303,7 +1303,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1303,7 +1303,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
// right shifts should also be arithmetic.
// right shifts should also be arithmetic.
bool
IsAshr
=
Inst
->
getOp
()
==
InstArithmetic
::
Ashr
;
bool
IsAshr
=
Inst
->
getOp
()
==
InstArithmetic
::
Ashr
;
Variable
*
T_Lo
=
makeReg
(
IceType_i32
);
Variable
*
T_Lo
=
makeReg
(
IceType_i32
);
Variable
*
Src1RLo
=
legalizeTo
Var
(
Src1Lo
);
Variable
*
Src1RLo
=
legalizeTo
Reg
(
Src1Lo
);
Constant
*
ThirtyTwo
=
Ctx
->
getConstantInt32
(
32
);
Constant
*
ThirtyTwo
=
Ctx
->
getConstantInt32
(
32
);
Variable
*
T_C1
=
makeReg
(
IceType_i32
);
Variable
*
T_C1
=
makeReg
(
IceType_i32
);
Variable
*
T_C2
=
makeReg
(
IceType_i32
);
Variable
*
T_C2
=
makeReg
(
IceType_i32
);
...
@@ -1353,7 +1353,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1353,7 +1353,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
return
;
return
;
}
}
// Dest->getType() is a non-i64 scalar.
// Dest->getType() is a non-i64 scalar.
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
// Handle div/rem separately. They require a non-legalized Src1 to inspect
// Handle div/rem separately. They require a non-legalized Src1 to inspect
// whether or not Src1 is a non-zero constant. Once legalized it is more
// whether or not Src1 is a non-zero constant. Once legalized it is more
...
@@ -1413,7 +1413,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1413,7 +1413,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
return
;
return
;
case
InstArithmetic
:
:
Mul
:
{
case
InstArithmetic
:
:
Mul
:
{
Variable
*
Src1R
=
legalizeTo
Var
(
Src1RF
);
Variable
*
Src1R
=
legalizeTo
Reg
(
Src1RF
);
_mul
(
T
,
Src0R
,
Src1R
);
_mul
(
T
,
Src0R
,
Src1R
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
return
;
return
;
...
@@ -1502,7 +1502,7 @@ void TargetARM32::lowerBr(const InstBr *Inst) {
...
@@ -1502,7 +1502,7 @@ void TargetARM32::lowerBr(const InstBr *Inst) {
Operand
*
Cond
=
Inst
->
getCondition
();
Operand
*
Cond
=
Inst
->
getCondition
();
// TODO(jvoung): Handle folding opportunities.
// TODO(jvoung): Handle folding opportunities.
Variable
*
Src0R
=
legalizeTo
Var
(
Cond
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Cond
);
Constant
*
Zero
=
Ctx
->
getConstantZero
(
IceType_i32
);
Constant
*
Zero
=
Ctx
->
getConstantZero
(
IceType_i32
);
_cmp
(
Src0R
,
Zero
);
_cmp
(
Src0R
,
Zero
);
_br
(
Inst
->
getTargetTrue
(),
Inst
->
getTargetFalse
(),
CondARM32
::
NE
);
_br
(
Inst
->
getTargetTrue
(),
Inst
->
getTargetFalse
(),
CondARM32
::
NE
);
...
@@ -1596,7 +1596,7 @@ void TargetARM32::lowerCall(const InstCall *Instr) {
...
@@ -1596,7 +1596,7 @@ void TargetARM32::lowerCall(const InstCall *Instr) {
// Copy arguments to be passed in registers to the appropriate registers.
// Copy arguments to be passed in registers to the appropriate registers.
for
(
auto
&
GPRArg
:
GPRArgs
)
{
for
(
auto
&
GPRArg
:
GPRArgs
)
{
Variable
*
Reg
=
legalizeTo
Var
(
GPRArg
.
first
,
GPRArg
.
second
);
Variable
*
Reg
=
legalizeTo
Reg
(
GPRArg
.
first
,
GPRArg
.
second
);
// Generate a FakeUse of register arguments so that they do not get
// Generate a FakeUse of register arguments so that they do not get
// dead code eliminated as a result of the FakeKill of scratch
// dead code eliminated as a result of the FakeKill of scratch
// registers after the call.
// registers after the call.
...
@@ -1722,11 +1722,11 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
...
@@ -1722,11 +1722,11 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
Operand
*
Src0RF
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Flex
);
Operand
*
Src0RF
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Flex
);
_mov
(
T_Lo
,
Src0RF
);
_mov
(
T_Lo
,
Src0RF
);
}
else
if
(
Src0
->
getType
()
==
IceType_i1
)
{
}
else
if
(
Src0
->
getType
()
==
IceType_i1
)
{
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
_lsl
(
T_Lo
,
Src0R
,
ShiftAmt
);
_lsl
(
T_Lo
,
Src0R
,
ShiftAmt
);
_asr
(
T_Lo
,
T_Lo
,
ShiftAmt
);
_asr
(
T_Lo
,
T_Lo
,
ShiftAmt
);
}
else
{
}
else
{
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
_sxt
(
T_Lo
,
Src0R
);
_sxt
(
T_Lo
,
Src0R
);
}
}
_mov
(
DestLo
,
T_Lo
);
_mov
(
DestLo
,
T_Lo
);
...
@@ -1744,7 +1744,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
...
@@ -1744,7 +1744,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
// lsl t1, src_reg, 31
// lsl t1, src_reg, 31
// asr t1, t1, 31
// asr t1, t1, 31
// dst = t1
// dst = t1
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
Constant
*
ShiftAmt
=
Ctx
->
getConstantInt32
(
31
);
Constant
*
ShiftAmt
=
Ctx
->
getConstantInt32
(
31
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_lsl
(
T
,
Src0R
,
ShiftAmt
);
_lsl
(
T
,
Src0R
,
ShiftAmt
);
...
@@ -1752,7 +1752,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
...
@@ -1752,7 +1752,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
}
else
{
}
else
{
// t1 = sxt src; dst = t1
// t1 = sxt src; dst = t1
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_sxt
(
T
,
Src0R
);
_sxt
(
T
,
Src0R
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
...
@@ -1774,7 +1774,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
...
@@ -1774,7 +1774,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
Operand
*
Src0RF
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Flex
);
Operand
*
Src0RF
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Flex
);
_mov
(
T_Lo
,
Src0RF
);
_mov
(
T_Lo
,
Src0RF
);
}
else
{
}
else
{
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
_uxt
(
T_Lo
,
Src0R
);
_uxt
(
T_Lo
,
Src0R
);
}
}
if
(
Src0
->
getType
()
==
IceType_i1
)
{
if
(
Src0
->
getType
()
==
IceType_i1
)
{
...
@@ -1798,7 +1798,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
...
@@ -1798,7 +1798,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
}
else
{
}
else
{
// t1 = uxt src; dst = t1
// t1 = uxt src; dst = t1
Variable
*
Src0R
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0R
=
legalizeTo
Reg
(
Src0
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_uxt
(
T
,
Src0R
);
_uxt
(
T
,
Src0R
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
...
@@ -1912,13 +1912,13 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
...
@@ -1912,13 +1912,13 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
Variable
*
Src0Lo
,
*
Src0Hi
;
Variable
*
Src0Lo
,
*
Src0Hi
;
Operand
*
Src1LoRF
,
*
Src1HiRF
;
Operand
*
Src1LoRF
,
*
Src1HiRF
;
if
(
TableIcmp64
[
Index
].
Swapped
)
{
if
(
TableIcmp64
[
Index
].
Swapped
)
{
Src0Lo
=
legalizeTo
Var
(
loOperand
(
Src1
));
Src0Lo
=
legalizeTo
Reg
(
loOperand
(
Src1
));
Src0Hi
=
legalizeTo
Var
(
hiOperand
(
Src1
));
Src0Hi
=
legalizeTo
Reg
(
hiOperand
(
Src1
));
Src1LoRF
=
legalize
(
loOperand
(
Src0
),
Legal_Reg
|
Legal_Flex
);
Src1LoRF
=
legalize
(
loOperand
(
Src0
),
Legal_Reg
|
Legal_Flex
);
Src1HiRF
=
legalize
(
hiOperand
(
Src0
),
Legal_Reg
|
Legal_Flex
);
Src1HiRF
=
legalize
(
hiOperand
(
Src0
),
Legal_Reg
|
Legal_Flex
);
}
else
{
}
else
{
Src0Lo
=
legalizeTo
Var
(
loOperand
(
Src0
));
Src0Lo
=
legalizeTo
Reg
(
loOperand
(
Src0
));
Src0Hi
=
legalizeTo
Var
(
hiOperand
(
Src0
));
Src0Hi
=
legalizeTo
Reg
(
hiOperand
(
Src0
));
Src1LoRF
=
legalize
(
loOperand
(
Src1
),
Legal_Reg
|
Legal_Flex
);
Src1LoRF
=
legalize
(
loOperand
(
Src1
),
Legal_Reg
|
Legal_Flex
);
Src1HiRF
=
legalize
(
hiOperand
(
Src1
),
Legal_Reg
|
Legal_Flex
);
Src1HiRF
=
legalize
(
hiOperand
(
Src1
),
Legal_Reg
|
Legal_Flex
);
}
}
...
@@ -1977,13 +1977,13 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
...
@@ -1977,13 +1977,13 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
if
(
ShiftAmt
)
{
if
(
ShiftAmt
)
{
ShiftConst
=
Ctx
->
getConstantInt32
(
ShiftAmt
);
ShiftConst
=
Ctx
->
getConstantInt32
(
ShiftAmt
);
Src0R
=
makeReg
(
IceType_i32
);
Src0R
=
makeReg
(
IceType_i32
);
_lsl
(
Src0R
,
legalizeTo
Var
(
Src0
),
ShiftConst
);
_lsl
(
Src0R
,
legalizeTo
Reg
(
Src0
),
ShiftConst
);
}
else
{
}
else
{
Src0R
=
legalizeTo
Var
(
Src0
);
Src0R
=
legalizeTo
Reg
(
Src0
);
}
}
_mov
(
T
,
Zero
);
_mov
(
T
,
Zero
);
if
(
ShiftAmt
)
{
if
(
ShiftAmt
)
{
Variable
*
Src1R
=
legalizeTo
Var
(
Src1
);
Variable
*
Src1R
=
legalizeTo
Reg
(
Src1
);
OperandARM32FlexReg
*
Src1RShifted
=
OperandARM32FlexReg
::
create
(
OperandARM32FlexReg
*
Src1RShifted
=
OperandARM32FlexReg
::
create
(
Func
,
IceType_i32
,
Src1R
,
OperandARM32
::
LSL
,
ShiftConst
);
Func
,
IceType_i32
,
Src1R
,
OperandARM32
::
LSL
,
ShiftConst
);
_cmp
(
Src0R
,
Src1RShifted
);
_cmp
(
Src0R
,
Src1RShifted
);
...
@@ -2037,8 +2037,8 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
...
@@ -2037,8 +2037,8 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
Type
Ty
=
Val
->
getType
();
Type
Ty
=
Val
->
getType
();
if
(
Ty
==
IceType_i64
)
{
if
(
Ty
==
IceType_i64
)
{
Val
=
legalizeUndef
(
Val
);
Val
=
legalizeUndef
(
Val
);
Variable
*
Val_Lo
=
legalizeTo
Var
(
loOperand
(
Val
));
Variable
*
Val_Lo
=
legalizeTo
Reg
(
loOperand
(
Val
));
Variable
*
Val_Hi
=
legalizeTo
Var
(
hiOperand
(
Val
));
Variable
*
Val_Hi
=
legalizeTo
Reg
(
hiOperand
(
Val
));
Variable
*
T_Lo
=
makeReg
(
IceType_i32
);
Variable
*
T_Lo
=
makeReg
(
IceType_i32
);
Variable
*
T_Hi
=
makeReg
(
IceType_i32
);
Variable
*
T_Hi
=
makeReg
(
IceType_i32
);
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
...
@@ -2049,7 +2049,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
...
@@ -2049,7 +2049,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
_mov
(
DestHi
,
T_Lo
);
_mov
(
DestHi
,
T_Lo
);
}
else
{
}
else
{
assert
(
Ty
==
IceType_i32
||
Ty
==
IceType_i16
);
assert
(
Ty
==
IceType_i32
||
Ty
==
IceType_i16
);
Variable
*
ValR
=
legalizeTo
Var
(
Val
);
Variable
*
ValR
=
legalizeTo
Reg
(
Val
);
Variable
*
T
=
makeReg
(
Ty
);
Variable
*
T
=
makeReg
(
Ty
);
_rev
(
T
,
ValR
);
_rev
(
T
,
ValR
);
if
(
Val
->
getType
()
==
IceType_i16
)
{
if
(
Val
->
getType
()
==
IceType_i16
)
{
...
@@ -2090,10 +2090,10 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
...
@@ -2090,10 +2090,10 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
Variable
*
ValHiR
=
nullptr
;
Variable
*
ValHiR
=
nullptr
;
if
(
Val
->
getType
()
==
IceType_i64
)
{
if
(
Val
->
getType
()
==
IceType_i64
)
{
Val
=
legalizeUndef
(
Val
);
Val
=
legalizeUndef
(
Val
);
ValLoR
=
legalizeTo
Var
(
loOperand
(
Val
));
ValLoR
=
legalizeTo
Reg
(
loOperand
(
Val
));
ValHiR
=
legalizeTo
Var
(
hiOperand
(
Val
));
ValHiR
=
legalizeTo
Reg
(
hiOperand
(
Val
));
}
else
{
}
else
{
ValLoR
=
legalizeTo
Var
(
Val
);
ValLoR
=
legalizeTo
Reg
(
Val
);
}
}
lowerCLZ
(
Instr
->
getDest
(),
ValLoR
,
ValHiR
);
lowerCLZ
(
Instr
->
getDest
(),
ValLoR
,
ValHiR
);
return
;
return
;
...
@@ -2105,8 +2105,8 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
...
@@ -2105,8 +2105,8 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
Variable
*
ValHiR
=
nullptr
;
Variable
*
ValHiR
=
nullptr
;
if
(
Val
->
getType
()
==
IceType_i64
)
{
if
(
Val
->
getType
()
==
IceType_i64
)
{
Val
=
legalizeUndef
(
Val
);
Val
=
legalizeUndef
(
Val
);
ValLoR
=
legalizeTo
Var
(
loOperand
(
Val
));
ValLoR
=
legalizeTo
Reg
(
loOperand
(
Val
));
ValHiR
=
legalizeTo
Var
(
hiOperand
(
Val
));
ValHiR
=
legalizeTo
Reg
(
hiOperand
(
Val
));
Variable
*
TLo
=
makeReg
(
IceType_i32
);
Variable
*
TLo
=
makeReg
(
IceType_i32
);
Variable
*
THi
=
makeReg
(
IceType_i32
);
Variable
*
THi
=
makeReg
(
IceType_i32
);
_rbit
(
TLo
,
ValLoR
);
_rbit
(
TLo
,
ValLoR
);
...
@@ -2114,7 +2114,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
...
@@ -2114,7 +2114,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
ValLoR
=
THi
;
ValLoR
=
THi
;
ValHiR
=
TLo
;
ValHiR
=
TLo
;
}
else
{
}
else
{
ValLoR
=
legalizeTo
Var
(
Val
);
ValLoR
=
legalizeTo
Reg
(
Val
);
Variable
*
T
=
makeReg
(
IceType_i32
);
Variable
*
T
=
makeReg
(
IceType_i32
);
_rbit
(
T
,
ValLoR
);
_rbit
(
T
,
ValLoR
);
ValLoR
=
T
;
ValLoR
=
T
;
...
@@ -2272,8 +2272,8 @@ void TargetARM32::lowerRet(const InstRet *Inst) {
...
@@ -2272,8 +2272,8 @@ void TargetARM32::lowerRet(const InstRet *Inst) {
Operand
*
Src0
=
Inst
->
getRetValue
();
Operand
*
Src0
=
Inst
->
getRetValue
();
if
(
Src0
->
getType
()
==
IceType_i64
)
{
if
(
Src0
->
getType
()
==
IceType_i64
)
{
Src0
=
legalizeUndef
(
Src0
);
Src0
=
legalizeUndef
(
Src0
);
Variable
*
R0
=
legalizeTo
Var
(
loOperand
(
Src0
),
RegARM32
::
Reg_r0
);
Variable
*
R0
=
legalizeTo
Reg
(
loOperand
(
Src0
),
RegARM32
::
Reg_r0
);
Variable
*
R1
=
legalizeTo
Var
(
hiOperand
(
Src0
),
RegARM32
::
Reg_r1
);
Variable
*
R1
=
legalizeTo
Reg
(
hiOperand
(
Src0
),
RegARM32
::
Reg_r1
);
Reg
=
R0
;
Reg
=
R0
;
Context
.
insert
(
InstFakeUse
::
create
(
Func
,
R1
));
Context
.
insert
(
InstFakeUse
::
create
(
Func
,
R1
));
}
else
if
(
isScalarFloatingType
(
Src0
->
getType
()))
{
}
else
if
(
isScalarFloatingType
(
Src0
->
getType
()))
{
...
@@ -2317,7 +2317,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
...
@@ -2317,7 +2317,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
}
}
// TODO(jvoung): handle folding opportunities.
// TODO(jvoung): handle folding opportunities.
// cmp cond, #0; mov t, SrcF; mov_cond t, SrcT; mov dest, t
// cmp cond, #0; mov t, SrcF; mov_cond t, SrcT; mov dest, t
Variable
*
CmpOpnd0
=
legalizeTo
Var
(
Condition
);
Variable
*
CmpOpnd0
=
legalizeTo
Reg
(
Condition
);
Operand
*
CmpOpnd1
=
Ctx
->
getConstantZero
(
IceType_i32
);
Operand
*
CmpOpnd1
=
Ctx
->
getConstantZero
(
IceType_i32
);
_cmp
(
CmpOpnd0
,
CmpOpnd1
);
_cmp
(
CmpOpnd0
,
CmpOpnd1
);
CondARM32
::
Cond
Cond
=
CondARM32
::
NE
;
CondARM32
::
Cond
Cond
=
CondARM32
::
NE
;
...
@@ -2358,14 +2358,14 @@ void TargetARM32::lowerStore(const InstStore *Inst) {
...
@@ -2358,14 +2358,14 @@ void TargetARM32::lowerStore(const InstStore *Inst) {
if
(
Ty
==
IceType_i64
)
{
if
(
Ty
==
IceType_i64
)
{
Value
=
legalizeUndef
(
Value
);
Value
=
legalizeUndef
(
Value
);
Variable
*
ValueHi
=
legalizeTo
Var
(
hiOperand
(
Value
));
Variable
*
ValueHi
=
legalizeTo
Reg
(
hiOperand
(
Value
));
Variable
*
ValueLo
=
legalizeTo
Var
(
loOperand
(
Value
));
Variable
*
ValueLo
=
legalizeTo
Reg
(
loOperand
(
Value
));
_str
(
ValueHi
,
llvm
::
cast
<
OperandARM32Mem
>
(
hiOperand
(
NewAddr
)));
_str
(
ValueHi
,
llvm
::
cast
<
OperandARM32Mem
>
(
hiOperand
(
NewAddr
)));
_str
(
ValueLo
,
llvm
::
cast
<
OperandARM32Mem
>
(
loOperand
(
NewAddr
)));
_str
(
ValueLo
,
llvm
::
cast
<
OperandARM32Mem
>
(
loOperand
(
NewAddr
)));
}
else
if
(
isVectorType
(
Ty
))
{
}
else
if
(
isVectorType
(
Ty
))
{
UnimplementedError
(
Func
->
getContext
()
->
getFlags
());
UnimplementedError
(
Func
->
getContext
()
->
getFlags
());
}
else
{
}
else
{
Variable
*
ValueR
=
legalizeTo
Var
(
Value
);
Variable
*
ValueR
=
legalizeTo
Reg
(
Value
);
_str
(
ValueR
,
NewAddr
);
_str
(
ValueR
,
NewAddr
);
}
}
}
}
...
@@ -2381,8 +2381,8 @@ void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
...
@@ -2381,8 +2381,8 @@ void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
SizeT
NumCases
=
Inst
->
getNumCases
();
SizeT
NumCases
=
Inst
->
getNumCases
();
if
(
Src0
->
getType
()
==
IceType_i64
)
{
if
(
Src0
->
getType
()
==
IceType_i64
)
{
Src0
=
legalizeUndef
(
Src0
);
Src0
=
legalizeUndef
(
Src0
);
Variable
*
Src0Lo
=
legalizeTo
Var
(
loOperand
(
Src0
));
Variable
*
Src0Lo
=
legalizeTo
Reg
(
loOperand
(
Src0
));
Variable
*
Src0Hi
=
legalizeTo
Var
(
hiOperand
(
Src0
));
Variable
*
Src0Hi
=
legalizeTo
Reg
(
hiOperand
(
Src0
));
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
Operand
*
ValueLo
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
));
Operand
*
ValueLo
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
));
Operand
*
ValueHi
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
)
>>
32
);
Operand
*
ValueHi
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
)
>>
32
);
...
@@ -2397,7 +2397,7 @@ void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
...
@@ -2397,7 +2397,7 @@ void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
}
}
// 32 bit integer
// 32 bit integer
Variable
*
Src0Var
=
legalizeTo
Var
(
Src0
);
Variable
*
Src0Var
=
legalizeTo
Reg
(
Src0
);
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
Operand
*
Value
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
));
Operand
*
Value
=
Ctx
->
getConstantInt32
(
Inst
->
getValue
(
I
));
Value
=
legalize
(
Value
,
Legal_Reg
|
Legal_Flex
);
Value
=
legalize
(
Value
,
Legal_Reg
|
Legal_Flex
);
...
@@ -2465,10 +2465,10 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed,
...
@@ -2465,10 +2465,10 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed,
Variable
*
RegBase
=
nullptr
;
Variable
*
RegBase
=
nullptr
;
Variable
*
RegIndex
=
nullptr
;
Variable
*
RegIndex
=
nullptr
;
if
(
Base
)
{
if
(
Base
)
{
RegBase
=
legalizeTo
Var
(
Base
);
RegBase
=
legalizeTo
Reg
(
Base
);
}
}
if
(
Index
)
{
if
(
Index
)
{
RegIndex
=
legalizeTo
Var
(
Index
);
RegIndex
=
legalizeTo
Reg
(
Index
);
}
}
// Create a new operand if there was a change.
// Create a new operand if there was a change.
if
(
Base
!=
RegBase
||
Index
!=
RegIndex
)
{
if
(
Base
!=
RegBase
||
Index
!=
RegIndex
)
{
...
@@ -2583,7 +2583,7 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed,
...
@@ -2583,7 +2583,7 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed,
}
}
/// Provide a trivial wrapper to legalize() for this common usage.
/// Provide a trivial wrapper to legalize() for this common usage.
Variable
*
TargetARM32
::
legalizeTo
Var
(
Operand
*
From
,
int32_t
RegNum
)
{
Variable
*
TargetARM32
::
legalizeTo
Reg
(
Operand
*
From
,
int32_t
RegNum
)
{
return
llvm
::
cast
<
Variable
>
(
legalize
(
From
,
Legal_Reg
,
RegNum
));
return
llvm
::
cast
<
Variable
>
(
legalize
(
From
,
Legal_Reg
,
RegNum
));
}
}
...
@@ -2620,7 +2620,7 @@ OperandARM32Mem *TargetARM32::formMemoryOperand(Operand *Operand, Type Ty) {
...
@@ -2620,7 +2620,7 @@ OperandARM32Mem *TargetARM32::formMemoryOperand(Operand *Operand, Type Ty) {
// If we didn't do address mode optimization, then we only
// If we didn't do address mode optimization, then we only
// have a base/offset to work with. ARM always requires a base
// have a base/offset to work with. ARM always requires a base
// register, so just use that to hold the operand.
// register, so just use that to hold the operand.
Variable
*
Base
=
legalizeTo
Var
(
Operand
);
Variable
*
Base
=
legalizeTo
Reg
(
Operand
);
return
OperandARM32Mem
::
create
(
return
OperandARM32Mem
::
create
(
Func
,
Ty
,
Base
,
Func
,
Ty
,
Base
,
llvm
::
cast
<
ConstantInteger32
>
(
Ctx
->
getConstantZero
(
IceType_i32
)));
llvm
::
cast
<
ConstantInteger32
>
(
Ctx
->
getConstantZero
(
IceType_i32
)));
...
...
src/IceTargetLoweringARM32.h
View file @
97f460dc
...
@@ -149,7 +149,7 @@ protected:
...
@@ -149,7 +149,7 @@ protected:
typedef
uint32_t
LegalMask
;
typedef
uint32_t
LegalMask
;
Operand
*
legalize
(
Operand
*
From
,
LegalMask
Allowed
=
Legal_All
,
Operand
*
legalize
(
Operand
*
From
,
LegalMask
Allowed
=
Legal_All
,
int32_t
RegNum
=
Variable
::
NoRegister
);
int32_t
RegNum
=
Variable
::
NoRegister
);
Variable
*
legalizeTo
Var
(
Operand
*
From
,
int32_t
RegNum
=
Variable
::
NoRegister
);
Variable
*
legalizeTo
Reg
(
Operand
*
From
,
int32_t
RegNum
=
Variable
::
NoRegister
);
OperandARM32Mem
*
formMemoryOperand
(
Operand
*
Ptr
,
Type
Ty
);
OperandARM32Mem
*
formMemoryOperand
(
Operand
*
Ptr
,
Type
Ty
);
Variable
*
makeReg
(
Type
Ty
,
int32_t
RegNum
=
Variable
::
NoRegister
);
Variable
*
makeReg
(
Type
Ty
,
int32_t
RegNum
=
Variable
::
NoRegister
);
...
...
src/IceTargetLoweringX86Base.h
View file @
97f460dc
...
@@ -246,7 +246,7 @@ protected:
...
@@ -246,7 +246,7 @@ protected:
typedef
uint32_t
LegalMask
;
typedef
uint32_t
LegalMask
;
Operand
*
legalize
(
Operand
*
From
,
LegalMask
Allowed
=
Legal_All
,
Operand
*
legalize
(
Operand
*
From
,
LegalMask
Allowed
=
Legal_All
,
int32_t
RegNum
=
Variable
::
NoRegister
);
int32_t
RegNum
=
Variable
::
NoRegister
);
Variable
*
legalizeTo
Var
(
Operand
*
From
,
int32_t
RegNum
=
Variable
::
NoRegister
);
Variable
*
legalizeTo
Reg
(
Operand
*
From
,
int32_t
RegNum
=
Variable
::
NoRegister
);
/// Legalize the first source operand for use in the cmp instruction.
/// Legalize the first source operand for use in the cmp instruction.
Operand
*
legalizeSrc0ForCmp
(
Operand
*
Src0
,
Operand
*
Src1
);
Operand
*
legalizeSrc0ForCmp
(
Operand
*
Src0
,
Operand
*
Src1
);
/// Turn a pointer operand into a memory operand that can be
/// Turn a pointer operand into a memory operand that can be
...
...
src/IceTargetLoweringX86BaseImpl.h
View file @
97f460dc
...
@@ -1650,7 +1650,7 @@ void TargetX86Base<Machine>::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1650,7 +1650,7 @@ void TargetX86Base<Machine>::lowerArithmetic(const InstArithmetic *Inst) {
// TODO: Trap on integer divide and integer modulo by zero.
// TODO: Trap on integer divide and integer modulo by zero.
// See: https://code.google.com/p/nativeclient/issues/detail?id=3899
// See: https://code.google.com/p/nativeclient/issues/detail?id=3899
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1
))
Src1
=
legalizeTo
Var
(
Src1
);
Src1
=
legalizeTo
Reg
(
Src1
);
switch
(
Inst
->
getOp
())
{
switch
(
Inst
->
getOp
())
{
case
InstArithmetic
:
:
_num
:
case
InstArithmetic
:
:
_num
:
llvm_unreachable
(
"Unknown arithmetic operator"
);
llvm_unreachable
(
"Unknown arithmetic operator"
);
...
@@ -1827,21 +1827,21 @@ void TargetX86Base<Machine>::lowerArithmetic(const InstArithmetic *Inst) {
...
@@ -1827,21 +1827,21 @@ void TargetX86Base<Machine>::lowerArithmetic(const InstArithmetic *Inst) {
case
InstArithmetic
:
:
Shl
:
case
InstArithmetic
:
:
Shl
:
_mov
(
T
,
Src0
);
_mov
(
T
,
Src0
);
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
Src1
=
legalizeTo
Var
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
Src1
=
legalizeTo
Reg
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
_shl
(
T
,
Src1
);
_shl
(
T
,
Src1
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
break
;
break
;
case
InstArithmetic
:
:
Lshr
:
case
InstArithmetic
:
:
Lshr
:
_mov
(
T
,
Src0
);
_mov
(
T
,
Src0
);
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
Src1
=
legalizeTo
Var
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
Src1
=
legalizeTo
Reg
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
_shr
(
T
,
Src1
);
_shr
(
T
,
Src1
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
break
;
break
;
case
InstArithmetic
:
:
Ashr
:
case
InstArithmetic
:
:
Ashr
:
_mov
(
T
,
Src0
);
_mov
(
T
,
Src0
);
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
if
(
!
llvm
::
isa
<
Constant
>
(
Src1
))
Src1
=
legalizeTo
Var
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
Src1
=
legalizeTo
Reg
(
Src1
,
Traits
::
RegisterSet
::
Reg_ecx
);
_sar
(
T
,
Src1
);
_sar
(
T
,
Src1
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
break
;
break
;
...
@@ -2186,7 +2186,7 @@ void TargetX86Base<Machine>::lowerCall(const InstCall *Instr) {
...
@@ -2186,7 +2186,7 @@ void TargetX86Base<Machine>::lowerCall(const InstCall *Instr) {
// before any stack adjustment is done.
// before any stack adjustment is done.
for
(
SizeT
i
=
0
,
NumXmmArgs
=
XmmArgs
.
size
();
i
<
NumXmmArgs
;
++
i
)
{
for
(
SizeT
i
=
0
,
NumXmmArgs
=
XmmArgs
.
size
();
i
<
NumXmmArgs
;
++
i
)
{
Variable
*
Reg
=
Variable
*
Reg
=
legalizeTo
Var
(
XmmArgs
[
i
],
Traits
::
RegisterSet
::
Reg_xmm0
+
i
);
legalizeTo
Reg
(
XmmArgs
[
i
],
Traits
::
RegisterSet
::
Reg_xmm0
+
i
);
// Generate a FakeUse of register arguments so that they do not get
// Generate a FakeUse of register arguments so that they do not get
// dead code eliminated as a result of the FakeKill of scratch
// dead code eliminated as a result of the FakeKill of scratch
// registers after the call.
// registers after the call.
...
@@ -2483,7 +2483,7 @@ void TargetX86Base<Machine>::lowerCast(const InstCast *Inst) {
...
@@ -2483,7 +2483,7 @@ void TargetX86Base<Machine>::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
);
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
Src0RM
=
legalizeTo
Var
(
Src0RM
);
Src0RM
=
legalizeTo
Reg
(
Src0RM
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_cvt
(
T
,
Src0RM
,
Traits
::
Insts
::
Cvt
::
Tps2dq
);
_cvt
(
T
,
Src0RM
,
Traits
::
Insts
::
Cvt
::
Tps2dq
);
_movp
(
Dest
,
T
);
_movp
(
Dest
,
T
);
...
@@ -2560,7 +2560,7 @@ void TargetX86Base<Machine>::lowerCast(const InstCast *Inst) {
...
@@ -2560,7 +2560,7 @@ void TargetX86Base<Machine>::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
);
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
Src0RM
=
legalizeTo
Var
(
Src0RM
);
Src0RM
=
legalizeTo
Reg
(
Src0RM
);
Variable
*
T
=
makeReg
(
Dest
->
getType
());
Variable
*
T
=
makeReg
(
Dest
->
getType
());
_cvt
(
T
,
Src0RM
,
Traits
::
Insts
::
Cvt
::
Dq2ps
);
_cvt
(
T
,
Src0RM
,
Traits
::
Insts
::
Cvt
::
Dq2ps
);
_movp
(
Dest
,
T
);
_movp
(
Dest
,
T
);
...
@@ -2775,7 +2775,7 @@ void TargetX86Base<Machine>::lowerCast(const InstCast *Inst) {
...
@@ -2775,7 +2775,7 @@ void TargetX86Base<Machine>::lowerCast(const InstCast *Inst) {
case
IceType_v16i8
:
case
IceType_v16i8
:
case
IceType_v4i32
:
case
IceType_v4i32
:
case
IceType_v4f32
:
{
case
IceType_v4f32
:
{
_movp
(
Dest
,
legalizeTo
Var
(
Src0
));
_movp
(
Dest
,
legalizeTo
Reg
(
Src0
));
}
break
;
}
break
;
}
}
break
;
break
;
...
@@ -2804,7 +2804,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
...
@@ -2804,7 +2804,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
if
(
CanUsePextr
&&
Ty
!=
IceType_v4f32
)
{
if
(
CanUsePextr
&&
Ty
!=
IceType_v4f32
)
{
// Use pextrb, pextrw, or pextrd.
// Use pextrb, pextrw, or pextrd.
Constant
*
Mask
=
Ctx
->
getConstantInt32
(
Index
);
Constant
*
Mask
=
Ctx
->
getConstantInt32
(
Index
);
Variable
*
SourceVectR
=
legalizeTo
Var
(
SourceVectNotLegalized
);
Variable
*
SourceVectR
=
legalizeTo
Reg
(
SourceVectNotLegalized
);
_pextr
(
ExtractedElementR
,
SourceVectR
,
Mask
);
_pextr
(
ExtractedElementR
,
SourceVectR
,
Mask
);
}
else
if
(
Ty
==
IceType_v4i32
||
Ty
==
IceType_v4f32
||
Ty
==
IceType_v4i1
)
{
}
else
if
(
Ty
==
IceType_v4i32
||
Ty
==
IceType_v4f32
||
Ty
==
IceType_v4i1
)
{
// Use pshufd and movd/movss.
// Use pshufd and movd/movss.
...
@@ -2816,7 +2816,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
...
@@ -2816,7 +2816,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
T
=
makeReg
(
Ty
);
T
=
makeReg
(
Ty
);
_pshufd
(
T
,
legalize
(
SourceVectNotLegalized
,
Legal_Reg
|
Legal_Mem
),
Mask
);
_pshufd
(
T
,
legalize
(
SourceVectNotLegalized
,
Legal_Reg
|
Legal_Mem
),
Mask
);
}
else
{
}
else
{
T
=
legalizeTo
Var
(
SourceVectNotLegalized
);
T
=
legalizeTo
Reg
(
SourceVectNotLegalized
);
}
}
if
(
InVectorElementTy
==
IceType_i32
)
{
if
(
InVectorElementTy
==
IceType_i32
)
{
...
@@ -2838,7 +2838,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
...
@@ -2838,7 +2838,7 @@ void TargetX86Base<Machine>::lowerExtractElement(
// support for legalizing to mem is implemented.
// support for legalizing to mem is implemented.
Variable
*
Slot
=
Func
->
template
makeVariable
(
Ty
);
Variable
*
Slot
=
Func
->
template
makeVariable
(
Ty
);
Slot
->
setWeight
(
RegWeight
::
Zero
);
Slot
->
setWeight
(
RegWeight
::
Zero
);
_movp
(
Slot
,
legalizeTo
Var
(
SourceVectNotLegalized
));
_movp
(
Slot
,
legalizeTo
Reg
(
SourceVectNotLegalized
));
// Compute the location of the element in memory.
// Compute the location of the element in memory.
unsigned
Offset
=
Index
*
typeWidthInBytes
(
InVectorElementTy
);
unsigned
Offset
=
Index
*
typeWidthInBytes
(
InVectorElementTy
);
...
@@ -2889,7 +2889,7 @@ void TargetX86Base<Machine>::lowerFcmp(const InstFcmp *Inst) {
...
@@ -2889,7 +2889,7 @@ void TargetX86Base<Machine>::lowerFcmp(const InstFcmp *Inst) {
Operand
*
Src0RM
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Mem
);
Operand
*
Src0RM
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Mem
);
Operand
*
Src1RM
=
legalize
(
Src1
,
Legal_Reg
|
Legal_Mem
);
Operand
*
Src1RM
=
legalize
(
Src1
,
Legal_Reg
|
Legal_Mem
);
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
Src1RM
=
legalizeTo
Var
(
Src1RM
);
Src1RM
=
legalizeTo
Reg
(
Src1RM
);
switch
(
Condition
)
{
switch
(
Condition
)
{
default
:
{
default
:
{
...
@@ -3038,13 +3038,13 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
...
@@ -3038,13 +3038,13 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
break
;
break
;
case
InstIcmp
:
:
Eq
:
{
case
InstIcmp
:
:
Eq
:
{
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
Src1RM
=
legalizeTo
Var
(
Src1RM
);
Src1RM
=
legalizeTo
Reg
(
Src1RM
);
_movp
(
T
,
Src0RM
);
_movp
(
T
,
Src0RM
);
_pcmpeq
(
T
,
Src1RM
);
_pcmpeq
(
T
,
Src1RM
);
}
break
;
}
break
;
case
InstIcmp
:
:
Ne
:
{
case
InstIcmp
:
:
Ne
:
{
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
Src1RM
=
legalizeTo
Var
(
Src1RM
);
Src1RM
=
legalizeTo
Reg
(
Src1RM
);
_movp
(
T
,
Src0RM
);
_movp
(
T
,
Src0RM
);
_pcmpeq
(
T
,
Src1RM
);
_pcmpeq
(
T
,
Src1RM
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
...
@@ -3053,7 +3053,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
...
@@ -3053,7 +3053,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
case
InstIcmp
:
:
Ugt
:
case
InstIcmp
:
:
Ugt
:
case
InstIcmp
:
:
Sgt
:
{
case
InstIcmp
:
:
Sgt
:
{
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
Src1RM
=
legalizeTo
Var
(
Src1RM
);
Src1RM
=
legalizeTo
Reg
(
Src1RM
);
_movp
(
T
,
Src0RM
);
_movp
(
T
,
Src0RM
);
_pcmpgt
(
T
,
Src1RM
);
_pcmpgt
(
T
,
Src1RM
);
}
break
;
}
break
;
...
@@ -3061,7 +3061,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
...
@@ -3061,7 +3061,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
case
InstIcmp
:
:
Sge
:
{
case
InstIcmp
:
:
Sge
:
{
// !(Src1RM > Src0RM)
// !(Src1RM > Src0RM)
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
Src0RM
=
legalizeTo
Var
(
Src0RM
);
Src0RM
=
legalizeTo
Reg
(
Src0RM
);
_movp
(
T
,
Src1RM
);
_movp
(
T
,
Src1RM
);
_pcmpgt
(
T
,
Src0RM
);
_pcmpgt
(
T
,
Src0RM
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
...
@@ -3070,7 +3070,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
...
@@ -3070,7 +3070,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
case
InstIcmp
:
:
Ult
:
case
InstIcmp
:
:
Ult
:
case
InstIcmp
:
:
Slt
:
{
case
InstIcmp
:
:
Slt
:
{
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src0RM
))
Src0RM
=
legalizeTo
Var
(
Src0RM
);
Src0RM
=
legalizeTo
Reg
(
Src0RM
);
_movp
(
T
,
Src1RM
);
_movp
(
T
,
Src1RM
);
_pcmpgt
(
T
,
Src0RM
);
_pcmpgt
(
T
,
Src0RM
);
}
break
;
}
break
;
...
@@ -3078,7 +3078,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
...
@@ -3078,7 +3078,7 @@ void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) {
case
InstIcmp
:
:
Sle
:
{
case
InstIcmp
:
:
Sle
:
{
// !(Src0RM > Src1RM)
// !(Src0RM > Src1RM)
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src1RM
))
Src1RM
=
legalizeTo
Var
(
Src1RM
);
Src1RM
=
legalizeTo
Reg
(
Src1RM
);
_movp
(
T
,
Src0RM
);
_movp
(
T
,
Src0RM
);
_pcmpgt
(
T
,
Src1RM
);
_pcmpgt
(
T
,
Src1RM
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
Variable
*
MinusOne
=
makeVectorOfMinusOnes
(
Ty
);
...
@@ -3173,7 +3173,7 @@ void TargetX86Base<Machine>::lowerInsertElement(const InstInsertElement *Inst) {
...
@@ -3173,7 +3173,7 @@ void TargetX86Base<Machine>::lowerInsertElement(const InstInsertElement *Inst) {
if
(
InVectorElementTy
==
IceType_f32
)
{
if
(
InVectorElementTy
==
IceType_f32
)
{
// ElementR will be in an XMM register since it is floating point.
// ElementR will be in an XMM register since it is floating point.
ElementR
=
legalizeTo
Var
(
ElementToInsertNotLegalized
);
ElementR
=
legalizeTo
Reg
(
ElementToInsertNotLegalized
);
}
else
{
}
else
{
// Copy an integer to an XMM register.
// Copy an integer to an XMM register.
Operand
*
T
=
legalize
(
ElementToInsertNotLegalized
,
Legal_Reg
|
Legal_Mem
);
Operand
*
T
=
legalize
(
ElementToInsertNotLegalized
,
Legal_Reg
|
Legal_Mem
);
...
@@ -3237,13 +3237,13 @@ void TargetX86Base<Machine>::lowerInsertElement(const InstInsertElement *Inst) {
...
@@ -3237,13 +3237,13 @@ void TargetX86Base<Machine>::lowerInsertElement(const InstInsertElement *Inst) {
// support for legalizing to mem is implemented.
// support for legalizing to mem is implemented.
Variable
*
Slot
=
Func
->
template
makeVariable
(
Ty
);
Variable
*
Slot
=
Func
->
template
makeVariable
(
Ty
);
Slot
->
setWeight
(
RegWeight
::
Zero
);
Slot
->
setWeight
(
RegWeight
::
Zero
);
_movp
(
Slot
,
legalizeTo
Var
(
SourceVectNotLegalized
));
_movp
(
Slot
,
legalizeTo
Reg
(
SourceVectNotLegalized
));
// Compute the location of the position to insert in memory.
// Compute the location of the position to insert in memory.
unsigned
Offset
=
Index
*
typeWidthInBytes
(
InVectorElementTy
);
unsigned
Offset
=
Index
*
typeWidthInBytes
(
InVectorElementTy
);
typename
Traits
::
X86OperandMem
*
Loc
=
typename
Traits
::
X86OperandMem
*
Loc
=
getMemoryOperandForStackSlot
(
InVectorElementTy
,
Slot
,
Offset
);
getMemoryOperandForStackSlot
(
InVectorElementTy
,
Slot
,
Offset
);
_store
(
legalizeTo
Var
(
ElementToInsertNotLegalized
),
Loc
);
_store
(
legalizeTo
Reg
(
ElementToInsertNotLegalized
),
Loc
);
Variable
*
T
=
makeReg
(
Ty
);
Variable
*
T
=
makeReg
(
Ty
);
_movp
(
T
,
Slot
);
_movp
(
T
,
Slot
);
...
@@ -3400,8 +3400,8 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
...
@@ -3400,8 +3400,8 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
// argument must be a register. Use rotate left for 16-bit bswap.
// argument must be a register. Use rotate left for 16-bit bswap.
if
(
Val
->
getType
()
==
IceType_i64
)
{
if
(
Val
->
getType
()
==
IceType_i64
)
{
Val
=
legalizeUndef
(
Val
);
Val
=
legalizeUndef
(
Val
);
Variable
*
T_Lo
=
legalizeTo
Var
(
loOperand
(
Val
));
Variable
*
T_Lo
=
legalizeTo
Reg
(
loOperand
(
Val
));
Variable
*
T_Hi
=
legalizeTo
Var
(
hiOperand
(
Val
));
Variable
*
T_Hi
=
legalizeTo
Reg
(
hiOperand
(
Val
));
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
_bswap
(
T_Lo
);
_bswap
(
T_Lo
);
...
@@ -3409,7 +3409,7 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
...
@@ -3409,7 +3409,7 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
_mov
(
DestLo
,
T_Hi
);
_mov
(
DestLo
,
T_Hi
);
_mov
(
DestHi
,
T_Lo
);
_mov
(
DestHi
,
T_Lo
);
}
else
if
(
Val
->
getType
()
==
IceType_i32
)
{
}
else
if
(
Val
->
getType
()
==
IceType_i32
)
{
Variable
*
T
=
legalizeTo
Var
(
Val
);
Variable
*
T
=
legalizeTo
Reg
(
Val
);
_bswap
(
T
);
_bswap
(
T
);
_mov
(
Dest
,
T
);
_mov
(
Dest
,
T
);
}
else
{
}
else
{
...
@@ -3487,9 +3487,9 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
...
@@ -3487,9 +3487,9 @@ void TargetX86Base<Machine>::lowerIntrinsicCall(
// Src is an f32 or f64, we need to make sure it's in a register.
// Src is an f32 or f64, we need to make sure it's in a register.
if
(
isVectorType
(
Ty
))
{
if
(
isVectorType
(
Ty
))
{
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src
))
if
(
llvm
::
isa
<
typename
Traits
::
X86OperandMem
>
(
Src
))
Src
=
legalizeTo
Var
(
Src
);
Src
=
legalizeTo
Reg
(
Src
);
}
else
{
}
else
{
Src
=
legalizeTo
Var
(
Src
);
Src
=
legalizeTo
Reg
(
Src
);
}
}
_pand
(
T
,
Src
);
_pand
(
T
,
Src
);
if
(
isVectorType
(
Ty
))
if
(
isVectorType
(
Ty
))
...
@@ -3619,7 +3619,7 @@ void TargetX86Base<Machine>::lowerAtomicCmpxchg(Variable *DestPrev,
...
@@ -3619,7 +3619,7 @@ void TargetX86Base<Machine>::lowerAtomicCmpxchg(Variable *DestPrev,
_mov
(
T_eax
,
Expected
);
_mov
(
T_eax
,
Expected
);
typename
Traits
::
X86OperandMem
*
Addr
=
typename
Traits
::
X86OperandMem
*
Addr
=
formMemoryOperand
(
Ptr
,
Expected
->
getType
());
formMemoryOperand
(
Ptr
,
Expected
->
getType
());
Variable
*
DesiredReg
=
legalizeTo
Var
(
Desired
);
Variable
*
DesiredReg
=
legalizeTo
Reg
(
Desired
);
const
bool
Locked
=
true
;
const
bool
Locked
=
true
;
_cmpxchg
(
Addr
,
T_eax
,
DesiredReg
,
Locked
);
_cmpxchg
(
Addr
,
T_eax
,
DesiredReg
,
Locked
);
_mov
(
DestPrev
,
T_eax
);
_mov
(
DestPrev
,
T_eax
);
...
@@ -3961,7 +3961,7 @@ void TargetX86Base<Machine>::lowerCountZeros(bool Cttz, Type Ty, Variable *Dest,
...
@@ -3961,7 +3961,7 @@ void TargetX86Base<Machine>::lowerCountZeros(bool Cttz, Type Ty, Variable *Dest,
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestLo
=
llvm
::
cast
<
Variable
>
(
loOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
Variable
*
DestHi
=
llvm
::
cast
<
Variable
>
(
hiOperand
(
Dest
));
// Will be using "test" on this, so we need a registerized variable.
// Will be using "test" on this, so we need a registerized variable.
Variable
*
SecondVar
=
legalizeTo
Var
(
SecondVal
);
Variable
*
SecondVar
=
legalizeTo
Reg
(
SecondVal
);
Variable
*
T_Dest2
=
makeReg
(
IceType_i32
);
Variable
*
T_Dest2
=
makeReg
(
IceType_i32
);
if
(
Cttz
)
{
if
(
Cttz
)
{
_bsf
(
T_Dest2
,
SecondVar
);
_bsf
(
T_Dest2
,
SecondVar
);
...
@@ -4273,15 +4273,15 @@ void TargetX86Base<Machine>::lowerRet(const InstRet *Inst) {
...
@@ -4273,15 +4273,15 @@ void TargetX86Base<Machine>::lowerRet(const InstRet *Inst) {
Operand
*
Src0
=
legalize
(
Inst
->
getRetValue
());
Operand
*
Src0
=
legalize
(
Inst
->
getRetValue
());
if
(
Src0
->
getType
()
==
IceType_i64
)
{
if
(
Src0
->
getType
()
==
IceType_i64
)
{
Variable
*
eax
=
Variable
*
eax
=
legalizeTo
Var
(
loOperand
(
Src0
),
Traits
::
RegisterSet
::
Reg_eax
);
legalizeTo
Reg
(
loOperand
(
Src0
),
Traits
::
RegisterSet
::
Reg_eax
);
Variable
*
edx
=
Variable
*
edx
=
legalizeTo
Var
(
hiOperand
(
Src0
),
Traits
::
RegisterSet
::
Reg_edx
);
legalizeTo
Reg
(
hiOperand
(
Src0
),
Traits
::
RegisterSet
::
Reg_edx
);
Reg
=
eax
;
Reg
=
eax
;
Context
.
insert
(
InstFakeUse
::
create
(
Func
,
edx
));
Context
.
insert
(
InstFakeUse
::
create
(
Func
,
edx
));
}
else
if
(
isScalarFloatingType
(
Src0
->
getType
()))
{
}
else
if
(
isScalarFloatingType
(
Src0
->
getType
()))
{
_fld
(
Src0
);
_fld
(
Src0
);
}
else
if
(
isVectorType
(
Src0
->
getType
()))
{
}
else
if
(
isVectorType
(
Src0
->
getType
()))
{
Reg
=
legalizeTo
Var
(
Src0
,
Traits
::
RegisterSet
::
Reg_xmm0
);
Reg
=
legalizeTo
Reg
(
Src0
,
Traits
::
RegisterSet
::
Reg_xmm0
);
}
else
{
}
else
{
_mov
(
Reg
,
Src0
,
Traits
::
RegisterSet
::
Reg_eax
);
_mov
(
Reg
,
Src0
,
Traits
::
RegisterSet
::
Reg_eax
);
}
}
...
@@ -4461,7 +4461,7 @@ void TargetX86Base<Machine>::lowerStore(const InstStore *Inst) {
...
@@ -4461,7 +4461,7 @@ void TargetX86Base<Machine>::lowerStore(const InstStore *Inst) {
_store
(
ValueLo
,
_store
(
ValueLo
,
llvm
::
cast
<
typename
Traits
::
X86OperandMem
>
(
loOperand
(
NewAddr
)));
llvm
::
cast
<
typename
Traits
::
X86OperandMem
>
(
loOperand
(
NewAddr
)));
}
else
if
(
isVectorType
(
Ty
))
{
}
else
if
(
isVectorType
(
Ty
))
{
_storep
(
legalizeTo
Var
(
Value
),
NewAddr
);
_storep
(
legalizeTo
Reg
(
Value
),
NewAddr
);
}
else
{
}
else
{
Value
=
legalize
(
Value
,
Legal_Reg
|
Legal_Imm
);
Value
=
legalize
(
Value
,
Legal_Reg
|
Legal_Imm
);
_store
(
Value
,
NewAddr
);
_store
(
Value
,
NewAddr
);
...
@@ -4542,7 +4542,7 @@ void TargetX86Base<Machine>::lowerCaseCluster(const CaseCluster &Case,
...
@@ -4542,7 +4542,7 @@ void TargetX86Base<Machine>::lowerCaseCluster(const CaseCluster &Case,
Index
=
makeReg
(
getPointerType
());
Index
=
makeReg
(
getPointerType
());
_movzx
(
Index
,
RangeIndex
);
_movzx
(
Index
,
RangeIndex
);
}
else
{
}
else
{
Index
=
legalizeTo
Var
(
RangeIndex
);
Index
=
legalizeTo
Reg
(
RangeIndex
);
}
}
constexpr
RelocOffsetT
RelocOffset
=
0
;
constexpr
RelocOffsetT
RelocOffset
=
0
;
...
@@ -4553,7 +4553,7 @@ void TargetX86Base<Machine>::lowerCaseCluster(const CaseCluster &Case,
...
@@ -4553,7 +4553,7 @@ void TargetX86Base<Machine>::lowerCaseCluster(const CaseCluster &Case,
uint16_t
Shift
=
typeWidthInBytesLog2
(
getPointerType
());
uint16_t
Shift
=
typeWidthInBytesLog2
(
getPointerType
());
// TODO(ascull): remove need for legalize by allowing null base in memop
// TODO(ascull): remove need for legalize by allowing null base in memop
auto
*
MemTarget
=
Traits
::
X86OperandMem
::
create
(
auto
*
MemTarget
=
Traits
::
X86OperandMem
::
create
(
Func
,
getPointerType
(),
legalizeTo
Var
(
Base
),
Offset
,
Index
,
Shift
);
Func
,
getPointerType
(),
legalizeTo
Reg
(
Base
),
Offset
,
Index
,
Shift
);
Variable
*
Target
=
nullptr
;
Variable
*
Target
=
nullptr
;
_mov
(
Target
,
MemTarget
);
_mov
(
Target
,
MemTarget
);
_jmp
(
Target
);
_jmp
(
Target
);
...
@@ -4597,8 +4597,8 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
...
@@ -4597,8 +4597,8 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
Operand
*
Src0Lo
=
loOperand
(
Src0
);
Operand
*
Src0Lo
=
loOperand
(
Src0
);
Operand
*
Src0Hi
=
hiOperand
(
Src0
);
Operand
*
Src0Hi
=
hiOperand
(
Src0
);
if
(
NumCases
>=
2
)
{
if
(
NumCases
>=
2
)
{
Src0Lo
=
legalizeTo
Var
(
Src0Lo
);
Src0Lo
=
legalizeTo
Reg
(
Src0Lo
);
Src0Hi
=
legalizeTo
Var
(
Src0Hi
);
Src0Hi
=
legalizeTo
Reg
(
Src0Hi
);
}
else
{
}
else
{
Src0Lo
=
legalize
(
Src0Lo
,
Legal_Reg
|
Legal_Mem
);
Src0Lo
=
legalize
(
Src0Lo
,
Legal_Reg
|
Legal_Mem
);
Src0Hi
=
legalize
(
Src0Hi
,
Legal_Reg
|
Legal_Mem
);
Src0Hi
=
legalize
(
Src0Hi
,
Legal_Reg
|
Legal_Mem
);
...
@@ -4620,7 +4620,7 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
...
@@ -4620,7 +4620,7 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
// OK, we'll be slightly less naive by forcing Src into a physical
// OK, we'll be slightly less naive by forcing Src into a physical
// register if there are 2 or more uses.
// register if there are 2 or more uses.
if
(
NumCases
>=
2
)
if
(
NumCases
>=
2
)
Src0
=
legalizeTo
Var
(
Src0
);
Src0
=
legalizeTo
Reg
(
Src0
);
else
else
Src0
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Mem
);
Src0
=
legalize
(
Src0
,
Legal_Reg
|
Legal_Mem
);
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
for
(
SizeT
I
=
0
;
I
<
NumCases
;
++
I
)
{
...
@@ -4649,8 +4649,8 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
...
@@ -4649,8 +4649,8 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
// This might be handled by a higher level lowering of switches.
// This might be handled by a higher level lowering of switches.
SizeT
NumCases
=
Inst
->
getNumCases
();
SizeT
NumCases
=
Inst
->
getNumCases
();
if
(
NumCases
>=
2
)
{
if
(
NumCases
>=
2
)
{
Src0Lo
=
legalizeTo
Var
(
Src0Lo
);
Src0Lo
=
legalizeTo
Reg
(
Src0Lo
);
Src0Hi
=
legalizeTo
Var
(
Src0Hi
);
Src0Hi
=
legalizeTo
Reg
(
Src0Hi
);
}
else
{
}
else
{
Src0Lo
=
legalize
(
Src0Lo
,
Legal_Reg
|
Legal_Mem
);
Src0Lo
=
legalize
(
Src0Lo
,
Legal_Reg
|
Legal_Mem
);
Src0Hi
=
legalize
(
Src0Hi
,
Legal_Reg
|
Legal_Mem
);
Src0Hi
=
legalize
(
Src0Hi
,
Legal_Reg
|
Legal_Mem
);
...
@@ -4690,7 +4690,7 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
...
@@ -4690,7 +4690,7 @@ void TargetX86Base<Machine>::lowerSwitch(const InstSwitch *Inst) {
}
}
// Going to be using multiple times so get it in a register early
// Going to be using multiple times so get it in a register early
Variable
*
Comparison
=
legalizeTo
Var
(
Src0
);
Variable
*
Comparison
=
legalizeTo
Reg
(
Src0
);
// A span is over the clusters
// A span is over the clusters
struct
SearchSpan
{
struct
SearchSpan
{
...
@@ -4800,7 +4800,7 @@ void TargetX86Base<Machine>::eliminateNextVectorSextInstruction(
...
@@ -4800,7 +4800,7 @@ void TargetX86Base<Machine>::eliminateNextVectorSextInstruction(
if
(
NextCast
->
getCastKind
()
==
InstCast
::
Sext
&&
if
(
NextCast
->
getCastKind
()
==
InstCast
::
Sext
&&
NextCast
->
getSrc
(
0
)
==
SignExtendedResult
)
{
NextCast
->
getSrc
(
0
)
==
SignExtendedResult
)
{
NextCast
->
setDeleted
();
NextCast
->
setDeleted
();
_movp
(
NextCast
->
getDest
(),
legalizeTo
Var
(
SignExtendedResult
));
_movp
(
NextCast
->
getDest
(),
legalizeTo
Reg
(
SignExtendedResult
));
// Skip over the instruction.
// Skip over the instruction.
Context
.
advanceNext
();
Context
.
advanceNext
();
}
}
...
@@ -5198,10 +5198,10 @@ Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed,
...
@@ -5198,10 +5198,10 @@ Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed,
Variable
*
RegBase
=
nullptr
;
Variable
*
RegBase
=
nullptr
;
Variable
*
RegIndex
=
nullptr
;
Variable
*
RegIndex
=
nullptr
;
if
(
Base
)
{
if
(
Base
)
{
RegBase
=
legalizeTo
Var
(
Base
);
RegBase
=
legalizeTo
Reg
(
Base
);
}
}
if
(
Index
)
{
if
(
Index
)
{
RegIndex
=
legalizeTo
Var
(
Index
);
RegIndex
=
legalizeTo
Reg
(
Index
);
}
}
if
(
Base
!=
RegBase
||
Index
!=
RegIndex
)
{
if
(
Base
!=
RegBase
||
Index
!=
RegIndex
)
{
Mem
=
Traits
::
X86OperandMem
::
create
(
Func
,
Ty
,
RegBase
,
Mem
->
getOffset
(),
Mem
=
Traits
::
X86OperandMem
::
create
(
Func
,
Ty
,
RegBase
,
Mem
->
getOffset
(),
...
@@ -5280,7 +5280,7 @@ Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed,
...
@@ -5280,7 +5280,7 @@ Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed,
/// Provide a trivial wrapper to legalize() for this common usage.
/// Provide a trivial wrapper to legalize() for this common usage.
template
<
class
Machine
>
template
<
class
Machine
>
Variable
*
TargetX86Base
<
Machine
>::
legalizeTo
Var
(
Operand
*
From
,
int32_t
RegNum
)
{
Variable
*
TargetX86Base
<
Machine
>::
legalizeTo
Reg
(
Operand
*
From
,
int32_t
RegNum
)
{
return
llvm
::
cast
<
Variable
>
(
legalize
(
From
,
Legal_Reg
,
RegNum
));
return
llvm
::
cast
<
Variable
>
(
legalize
(
From
,
Legal_Reg
,
RegNum
));
}
}
...
...
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