Chromium Code Reviews| Index: src/IceInstARM32.cpp |
| diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
| index add4df02ab00f7390af048b1778f5c9bee54faf5..375132bc35e831ba4f4ad11ca03c4538d7c5c6f6 100644 |
| --- a/src/IceInstARM32.cpp |
| +++ b/src/IceInstARM32.cpp |
| @@ -377,6 +377,13 @@ InstARM32Umull::InstARM32Umull(Cfg *Func, Variable *DestLo, Variable *DestHi, |
| addSource(Src1); |
| } |
| +InstARM32Vcvt::InstARM32Vcvt(Cfg *Func, Variable *Dest, Variable *Src, |
| + VcvtVariant Variant, CondARM32::Cond Predicate) |
| + : InstARM32Pred(Func, InstARM32::Vcvt, 1, Dest, Predicate), |
| + Variant(Variant) { |
| + addSource(Src); |
| +} |
| + |
| // ======================== Dump routines ======================== // |
| // Two-addr ops |
| @@ -909,6 +916,63 @@ void InstARM32Umull::dump(const Cfg *Func) const { |
| dumpSources(Func); |
| } |
| +namespace { |
| +const char *vcvtVariantSuffix(const InstARM32Vcvt::VcvtVariant Variant) { |
| + switch (Variant) { |
| + case InstARM32Vcvt::S2si: |
| + return ".s32.f32"; |
| + case InstARM32Vcvt::S2ui: |
| + return ".u32.f32"; |
| + case InstARM32Vcvt::Si2s: |
| + return ".f32.s32"; |
| + case InstARM32Vcvt::Ui2s: |
| + return ".f32.u32"; |
| + case InstARM32Vcvt::D2si: |
| + return ".s32.f64"; |
| + case InstARM32Vcvt::D2ui: |
| + return ".u32.f64"; |
| + case InstARM32Vcvt::Si2d: |
| + return ".f64.s32"; |
| + case InstARM32Vcvt::Ui2d: |
| + return ".f64.u32"; |
| + case InstARM32Vcvt::S2d: |
| + return ".f64.f32"; |
| + case InstARM32Vcvt::D2s: |
| + return ".f32.f64"; |
| + } |
| + llvm::report_fatal_error("Invalid VcvtVariant enum."); |
| +} |
| +} // end of anonymous namespace |
|
ascull
2015/09/10 16:44:09
Why an anonymous namespace function rather than a
John
2015/09/11 12:16:48
The choice of one versus the other is more of a pe
|
| + |
| +void InstARM32Vcvt::emit(const Cfg *Func) const { |
| + if (!BuildDefs::dump()) |
| + return; |
| + Ostream &Str = Func->getContext()->getStrEmit(); |
| + assert(getSrcSize() == 1); |
| + assert(getDest()->hasReg()); |
| + Str << "\t" |
| + << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << "\t"; |
| + getDest()->emit(Func); |
| + Str << ", "; |
| + getSrc(0)->emit(Func); |
| +} |
| + |
| +void InstARM32Vcvt::emitIAS(const Cfg *Func) const { |
| + assert(getSrcSize() == 1); |
| + (void)Func; |
| + llvm_unreachable("Not yet implemented"); |
| +} |
| + |
| +void InstARM32Vcvt::dump(const Cfg *Func) const { |
| + if (!BuildDefs::dump()) |
| + return; |
| + Ostream &Str = Func->getContext()->getStrDump(); |
| + dumpDest(Func); |
| + Str << " = " |
| + << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << " "; |
| + dumpSources(Func); |
| +} |
| + |
| void OperandARM32Mem::emit(const Cfg *Func) const { |
| if (!BuildDefs::dump()) |
| return; |