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

Unified Diff: src/IceInstX86BaseImpl.h

Issue 1543573002: Subzero. X8664. Fixes filetype=asm. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Moar refactoring. Enables xtests. Fixes xtest. 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
Index: src/IceInstX86BaseImpl.h
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h
index a1425622604242b587b824208abc5a88f769202f..c2cd1d22e5615702265c33836515564ef135a796 100644
--- a/src/IceInstX86BaseImpl.h
+++ b/src/IceInstX86BaseImpl.h
@@ -2129,10 +2129,6 @@ template <class Machine> void InstX86Lea<Machine>::emit(const Cfg *Func) const {
this->getDest()->emit(Func);
}
-inline bool isIntegerConstant(const Operand *Op) {
- return llvm::isa<ConstantInteger32>(Op) || llvm::isa<ConstantInteger64>(Op);
-}
-
template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -2142,9 +2138,10 @@ template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const {
Type SrcTy = Src->getType();
Type DestTy = this->getDest()->getType();
if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 &&
- isIntegerConstant(Src)) {
+ llvm::isa<ConstantInteger64>(Src)) {
Str << "\t"
- "movabs\t";
+ "movabs"
+ "\t";
} else {
Str << "\t"
"mov" << (!isScalarFloatingType(DestTy)
@@ -2214,19 +2211,14 @@ void InstX86Mov<Machine>::emitIAS(const Cfg *Func) const {
assert(isScalarIntegerType(DestTy));
// Widen DestTy for truncation (see above note). We should only do this
// when both Src and Dest are integer types.
- if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 &&
- isIntegerConstant(Src)) {
- uint64_t Value = -1;
+ if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64) {
if (const auto *C64 = llvm::dyn_cast<ConstantInteger64>(Src)) {
- Value = C64->getValue();
- } else {
- Value = llvm::cast<ConstantInteger32>(Src)->getValue();
+ Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>()
+ ->movabs(InstX86Base<Machine>::Traits::getEncodedGPR(
+ Dest->getRegNum()),
+ C64->getValue());
+ return;
}
- Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>()
- ->movabs(
- InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()),
- Value);
- return;
}
if (isScalarIntegerType(SrcTy)) {
SrcTy = DestTy;
@@ -2412,6 +2404,33 @@ void InstX86Movsx<Machine>::emitIAS(const Cfg *Func) const {
}
template <class Machine>
+void InstX86Movzx<Machine>::emit(const Cfg *Func) const {
+ if (!BuildDefs::dump())
+ return;
+ if (InstX86Base<Machine>::Traits::Is64Bit) {
+ // There's no movzx %eXX, %rXX. To zero extend 32- to 64-bits, we emit a
+ // mov %eXX, %eXX. The processor will still do a movzx[bw]q.
+ assert(this->getSrcSize() == 1);
+ const Operand *Src = this->getSrc(0);
+ const Variable *Dest = this->Dest;
+ if (Src->getType() == IceType_i32 && Dest->getType() == IceType_i64) {
+ Ostream &Str = Func->getContext()->getStrEmit();
+ Str << "\t"
+ "mov"
+ "\t";
+ Src->emit(Func);
+ Str << ", ";
+ Dest->asType(IceType_i32, InstX86Base<Machine>::Traits::getGprForType(
+ IceType_i32, Dest->getRegNum()))
+ ->emit(Func);
+ Str << " /* movzx */";
+ return;
+ }
+ }
+ InstX86BaseUnaryopGPR<Machine, InstX86Base<Machine>::Movzx>::emit(Func);
+}
+
+template <class Machine>
void InstX86Movzx<Machine>::emitIAS(const Cfg *Func) const {
assert(this->getSrcSize() == 1);
const Variable *Dest = this->getDest();

Powered by Google App Engine
This is Rietveld 408576698