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

Unified Diff: src/trusted/validator_mips/model.h

Issue 9979025: [MIPS] Adding validator for MIPS architecture. (Closed) Base URL: http://src.chromium.org/native_client/trunk/src/native_client/
Patch Set: Rebased patch, conflict resolved. Created 8 years, 7 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
« no previous file with comments | « src/trusted/validator_mips/mips32.table ('k') | src/trusted/validator_mips/model-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/trusted/validator_mips/model.h
diff --git a/src/trusted/validator_mips/model.h b/src/trusted/validator_mips/model.h
new file mode 100644
index 0000000000000000000000000000000000000000..2d0ab249b37d32155e2ea7b638d6fff31e98f324
--- /dev/null
+++ b/src/trusted/validator_mips/model.h
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2012 The Native Client Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can
+ * be found in the LICENSE file.
+ * Copyright 2012, Google Inc.
+ */
+
+#ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
+#define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
+
+/*
+ * Models instructions and decode results.
+ *
+ * TODO(petarj): This file and the classes have been based on the same named
+ * module within validator_arm folder. The code has been reduced and changed
+ * slightly to accommodate some style issues. There still may be room for
+ * improvement as we have not investigated performance impact of this classes.
+ * Thus, this should be done later and the code should be revisited.
+ */
+
+#include <stdint.h>
+
+namespace nacl_mips_dec {
+
+/*
+ * A value class that names a single register. We could use a typedef for this,
+ * but it introduces some ambiguity problems because of the implicit conversion
+ * to/from int.
+ *
+ * May be implicitly converted to a single-entry RegisterList (see below).
+ */
+class Register {
+ public:
+ explicit inline Register(uint32_t);
+
+ /*
+ * Produces the bitmask used to represent this register.
+ */
+ inline uint32_t Bitmask() const;
+
+ inline bool Equals(const Register &) const;
+
+ private:
+ uint32_t _number;
+};
+
+const Register kRegisterNone(0);
+
+// Registers with special meaning in our model:
+const Register kRegisterStack(29);
+const Register kRegisterJumpMask(14); // $t6 = holds mask for jr.
+const Register kRegisterLoadStoreMask(15); // $t7 = holds mask for load/store.
+const Register kRegisterTls(24); // $t8 = holds tls index.
+
+const Register kRegisterZero(0);
+
+/*
+ * A collection of Registers. Used to describe the side effects of operations.
+ *
+ * Note that this is technically a set, not a list -- but RegisterSet is a
+ * well-known term that means something else.
+ */
+class RegisterList {
+ public:
+ /*
+ * Produces a RegisterList that contains the registers specified in the
+ * given bitmask. To indicate rN, the bitmask must include (1 << N).
+ */
+ explicit inline RegisterList(uint32_t bitmask);
+
+ /*
+ * Produces a RegisterList containing a single register.
+ *
+ * Note that this is an implicit constructor. This is okay in this case
+ * because
+ * - It converts between two types that we control,
+ * - It converts at most one step (no implicit conversions to Register),
+ * - It inlines to a single machine instruction,
+ * - The readability gain in inst_classes.cc is large.
+ */
+ inline RegisterList(const Register r);
+
+ /*
+ * Checks whether this list contains the given register.
+ */
+ inline bool operator[](const Register) const;
+
+ // Checks whether this list contains all the registers in the operand.
+ inline bool ContainsAll(RegisterList) const;
+
+ // Checks whether this list contains any of the registers in the operand.
+ inline bool ContainsAny(RegisterList) const;
+
+ inline const RegisterList operator&(const RegisterList) const;
+
+ private:
+ uint32_t _bits;
+};
+
+/*
+ * A list containing every possible register, even some we don't define.
+ * Used exclusively as a bogus scary return value for forbidden instructions.
+ */
+static const RegisterList kRegisterListEverything = RegisterList(-1);
+
+static uint32_t const kReservedRegsBitmask = kRegisterTls.Bitmask()
+ + kRegisterJumpMask.Bitmask()
+ + kRegisterLoadStoreMask.Bitmask();
+static RegisterList const kRegListReserved = RegisterList(kReservedRegsBitmask);
+
+/*
+ * A 32-bit Mips instruction of unspecified type.
+ *
+ * This class is designed for efficiency:
+ * - Its public methods for bitfield extraction are short and inline.
+ * - It has no vtable, so on 32-bit platforms it's exactly the size of the
+ * instruction it models.
+ */
+class Instruction {
+ public:
+ explicit inline Instruction(uint32_t bits);
+
+ /*
+ * Extracts a range of contiguous bits, right-justifies it, and returns it.
+ * Note that the range follows hardware convention, with the high bit first.
+ */
+ inline uint32_t Bits(int hi, int lo) const;
+
+ /*
+ * A convenience method that's exactly equivalent to
+ * Register(instruction.bits(hi, lo))
+ *
+ * This sequence is quite common in inst_classes.cc.
+ */
+ inline const Register Reg(int hi, int lo) const;
+
+ /*
+ * Extracts a single bit (0 - 31).
+ */
+ inline bool Bit(int index) const;
+
+ /*
+ * Returns an integer equivalent of this instruction, masked by the given
+ * mask. Used during decoding to test bitfields.
+ */
+ inline uint32_t operator&(uint32_t) const;
+
+ private:
+ uint32_t _bits;
+};
+
+uint32_t const kInstrSize = 4;
+uint32_t const kInstrAlign = 0xFFFFFFFC;
+uint32_t const kBundleAlign = 0xFFFFFFF0;
+
+} // namespace
+
+// Definitions for our inlined functions.
+#include "native_client/src/trusted/validator_mips/model-inl.h"
+
+#endif // NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
« no previous file with comments | « src/trusted/validator_mips/mips32.table ('k') | src/trusted/validator_mips/model-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698