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

Unified Diff: src/IceOperand.cpp

Issue 353553004: Add support for vector types and vector constants. (Closed) Base URL: https://gerrit.chromium.org/gerrit/p/native_client/pnacl-subzero.git@master
Patch Set: Created 6 years, 6 months 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/IceOperand.cpp
diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp
index 02e85c76854df1ade16f3f62de2a317209822e19..7f69648a17fded7ce27b7ff0023955b5c98cb2b7 100644
--- a/src/IceOperand.cpp
+++ b/src/IceOperand.cpp
@@ -237,6 +237,82 @@ void ConstantRelocatable::dump(GlobalContext *Ctx) const {
Str << "+" << Offset;
}
+namespace {
+
+// Read an item of type T and return it. Advance the buffer pointer
+// by the size of T.
+template <typename T> T convertAndAdvance(const char *&Src) {
+ T Dest;
+ std::memcpy(&Dest, Src, sizeof(T));
+ Src += sizeof(T);
+ return Dest;
+}
+
+// Convert a vector to a list of strings.
+StringList getVectorRepr(const Vect128 &Vector, const Type Ty) {
+ StringList Repr;
+ const char *Window = Vector.data();
+
+ Type ElementType = typeElementType(Ty);
+ size_t NumElements = typeNumElements(Ty);
+
+ assert(Vector.size() == 16);
jvoung (off chromium) 2014/06/26 00:45:41 I think there are places in other files where you
wala 2014/06/26 17:32:42 That's a good idea. I will add it to IceDefs.h. T
+ assert(typeElementType(Ty) != IceType_i1);
+
+ for (unsigned I = 0; I < NumElements; ++I) {
+ IceString Result;
+ llvm::raw_string_ostream OS(Result);
+ switch (ElementType) {
+ default:
+ llvm_unreachable("Unknown element type");
+ break;
+ case IceType_i8:
+ OS << (unsigned)convertAndAdvance<uint8_t>(Window);
+ break;
+ case IceType_i16:
+ OS << convertAndAdvance<uint16_t>(Window);
+ break;
+ case IceType_i32:
+ OS << convertAndAdvance<uint32_t>(Window);
+ break;
+ case IceType_f32:
+ OS << convertAndAdvance<float>(Window);
+ break;
+ }
+ Repr.push_back(OS.str());
+ }
+
+ assert(Window == Vector.data() + 16);
+ return Repr;
+}
+}
+
+template <> void ConstantVector::dump(GlobalContext *Ctx) const {
+ Ostream &Str = Ctx->getStrDump();
+ Type Ty = getType();
+ StringList Elements = getVectorRepr(Value, Ty);
+ Str << "<";
+ for (StringList::const_iterator I = Elements.begin(), E = Elements.end();
+ I != E;) {
+ Str << typeElementType(Ty) << " " << *I;
+ ++I;
+ Str << (I != E ? ", " : "");
+ }
+ Str << ">";
+}
+
+template <> void ConstantBitVector::dump(GlobalContext *Ctx) const {
+ Ostream &Str = Ctx->getStrDump();
+ unsigned NumElements = typeNumElements(getType());
+ Str << "<";
+ for (unsigned I = 0; I != NumElements;) {
+ Str << "i1 " << (Value[I] ? "1" : "0");
+ ++I;
+ Str << (I != NumElements ? ", " : "");
+ }
+ Str << ">";
+}
+
void LiveRange::dump(Ostream &Str) const {
Str << "(weight=" << Weight << ") ";
for (RangeType::const_iterator I = Range.begin(), E = Range.end(); I != E;

Powered by Google App Engine
This is Rietveld 408576698