Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: src/IceInstX86BaseImpl.h

Issue 1530423002: Add template parameter for suffix to BinopXmm (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Merge some more inst types. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/IceInstX86Base.h ('K') | « src/IceInstX86Base.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceInstX86BaseImpl.h
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h
index c94356014e57d6c011cb0830ac6f08ab504e330e..52f9373a5cb9d3ce649610157c14a0781d340b49 100644
--- a/src/IceInstX86BaseImpl.h
+++ b/src/IceInstX86BaseImpl.h
@@ -622,19 +622,21 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const {
// The this->Opcode parameter needs to be char* and not IceString because of
// template issues.
template <class Machine>
-void InstX86Base<Machine>::emitTwoAddress(const char *Opcode, const Inst *Inst,
- const Cfg *Func) {
+void InstX86Base<Machine>::emitTwoAddress(const Cfg *Func, const char *Opcode,
+ const char *Suffix) const {
if (!BuildDefs::dump())
return;
Ostream &Str = Func->getContext()->getStrEmit();
- assert(Inst->getSrcSize() == 2);
- Operand *Dest = Inst->getDest();
+ assert(getSrcSize() == 2);
+ Operand *Dest = getDest();
if (Dest == nullptr)
- Dest = Inst->getSrc(0);
- assert(Dest == Inst->getSrc(0));
- Operand *Src1 = Inst->getSrc(1);
- Str << "\t" << Opcode << InstX86Base<Machine>::getWidthString(Dest->getType())
- << "\t";
+ Dest = getSrc(0);
+ assert(Dest == getSrc(0));
+ Operand *Src1 = getSrc(1);
+ Str << "\t" << Opcode;
+ if (Suffix != nullptr)
+ Str << Suffix;
+ Str << InstX86Base<Machine>::getWidthString(Dest->getType()) << "\t";
Src1->emit(Func);
Str << ", ";
Dest->emit(Func);
@@ -1008,205 +1010,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const {
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 {
if (!BuildDefs::dump())
return;
@@ -1283,15 +1086,11 @@ template <class Machine>
void InstX86Blendvps<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
- InstX86Base<Machine>::Traits::SSE4_1);
emitVariableBlendInst<Machine>(this->Opcode, this, Func);
}
template <class Machine>
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
Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
&InstX86Base<Machine>::Traits::Assembler::blendvps};
@@ -1302,15 +1101,11 @@ template <class Machine>
void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
- InstX86Base<Machine>::Traits::SSE4_1);
emitVariableBlendInst<Machine>(this->Opcode, this, Func);
}
template <class Machine>
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
Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
&InstX86Base<Machine>::Traits::Assembler::pblendvb};
@@ -1342,7 +1137,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const {
Str << ", ";
Dest->emit(Func);
} else {
- this->emitTwoAddress("imul", this, Func);
+ this->emitTwoAddress(Func, this->Opcode);
}
}
@@ -2791,40 +2586,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const {
}
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 {
if (!BuildDefs::dump())
return;
Ostream &Str = Func->getContext()->getStrEmit();
assert(this->getSrcSize() == 2);
// 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
<< InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
->getType()]
@@ -2848,9 +2615,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
const Variable *Dest = this->getDest();
Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
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
// memory dest, but we aren't using it. For uniformity, just restrict them
// all to have a register dest for now.
@@ -2876,11 +2640,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
return;
Ostream &Str = Func->getContext()->getStrEmit();
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
<< InstX86Base<
Machine>::Traits::TypeAttributes[this->getDest()->getType()]
@@ -2912,9 +2671,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
// pinsrb and pinsrd are SSE4.1 instructions.
const Operand *Src0 = this->getSrc(1);
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
// 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
@@ -3049,50 +2805,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const {
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 {
if (!BuildDefs::dump())
return;
« src/IceInstX86Base.h ('K') | « src/IceInstX86Base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698