style: fix missing spaces in control statements
[gem5.git] / src / arch / x86 / insts / static_inst.cc
index 183700fa9a9bd73a16ce829c2d5a92d0ac0c98a7..709e0a610cb9dcebdb2d8491afa717cbd13405c0 100644 (file)
@@ -1,44 +1,27 @@
 /*
  * Copyright (c) 2007 The Hewlett-Packard Development Company
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
- * Redistribution and use of this software in source and binary forms,
- * with or without modification, are permitted provided that the
- * following conditions are met:
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
  *
- * The software must be used only for Non-Commercial Use which means any
- * use which is NOT directed to receiving any direct monetary
- * compensation for, or commercial advantage from such use.  Illustrative
- * examples of non-commercial use are academic research, personal study,
- * teaching, education and corporate research & development.
- * Illustrative examples of commercial use are distributing products for
- * commercial advantage and providing services using the software for
- * commercial advantage.
- *
- * If you wish to use this software or functionality therein that may be
- * covered by patents for commercial use, please contact:
- *     Director of Intellectual Property Licensing
- *     Office of Strategy and Technology
- *     Hewlett-Packard Company
- *     1501 Page Mill Road
- *     Palo Alto, California  94304
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.  Redistributions
- * in binary form must reproduce the above copyright notice, this list of
- * conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.  Neither the name of
- * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
  * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.  No right of
- * sublicense is granted herewith.  Derivatives of the software and
- * output created using the software may be prepared, but only for
- * Non-Commercial Uses.  Derivatives of the software may be shared with
- * others provided: (i) the others agree to abide by the list of
- * conditions herein which includes the Non-Commercial Use restrictions;
- * and (ii) such Derivatives of the software include the above copyright
- * notice to acknowledge the contribution from this software where
- * applicable, this list of conditions and the disclaimer below.
+ * this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  */
 
 #include "arch/x86/insts/static_inst.hh"
-#include "arch/x86/segmentregs.hh"
+#include "arch/x86/regs/segment.hh"
+#include "cpu/reg_class.hh"
 
 namespace X86ISA
 {
     void X86StaticInst::printMnemonic(std::ostream &os,
             const char * mnemonic) const
     {
-        ccprintf(os, "\t%s   ", mnemonic);
+        ccprintf(os, "  %s   ", mnemonic);
     }
 
     void X86StaticInst::printMnemonic(std::ostream &os,
             const char * instMnemonic, const char * mnemonic) const
     {
-        ccprintf(os, "\t%s : %s   ", instMnemonic, mnemonic);
+        ccprintf(os, "  %s : %s   ", instMnemonic, mnemonic);
     }
 
     void X86StaticInst::printSegment(std::ostream &os, int segment) const
@@ -94,8 +78,26 @@ namespace X86ISA
           case SEGMENT_REG_GS:
             ccprintf(os, "GS");
             break;
-          case SEGMENT_REG_INT:
-            ccprintf(os, "INT");
+          case SEGMENT_REG_HS:
+            ccprintf(os, "HS");
+            break;
+          case SEGMENT_REG_TSL:
+            ccprintf(os, "TSL");
+            break;
+          case SEGMENT_REG_TSG:
+            ccprintf(os, "TSG");
+            break;
+          case SEGMENT_REG_LS:
+            ccprintf(os, "LS");
+            break;
+          case SEGMENT_REG_MS:
+            ccprintf(os, "MS");
+            break;
+          case SYS_SEGMENT_REG_TR:
+            ccprintf(os, "TR");
+            break;
+          case SYS_SEGMENT_REG_IDTR:
+            ccprintf(os, "IDTR");
             break;
           default:
             panic("Unrecognized segment %d\n", segment);
@@ -105,14 +107,14 @@ namespace X86ISA
     void
     X86StaticInst::printSrcReg(std::ostream &os, int reg, int size) const
     {
-        if(_numSrcRegs > reg)
+        if (_numSrcRegs > reg)
             printReg(os, _srcRegIdx[reg], size);
     }
 
     void
     X86StaticInst::printDestReg(std::ostream &os, int reg, int size) const
     {
-        if(_numDestRegs > reg)
+        if (_numDestRegs > reg)
             printReg(os, _destRegIdx[reg], size);
     }
 
@@ -129,20 +131,20 @@ namespace X86ISA
         static const char * microFormats[9] =
             {"", "t%db", "t%dw", "", "t%dd", "", "", "", "t%d"};
 
-        if (reg < FP_Base_DepTag) {
+        RegIndex rel_reg;
+
+        switch (regIdxToClass(reg, &rel_reg)) {
+          case IntRegClass: {
             const char * suffix = "";
-            bool fold = reg & (1 << 6);
-            reg &= ~(1 << 6);
+            bool fold = rel_reg & IntFoldBit;
+            rel_reg &= ~IntFoldBit;
 
-            if(fold)
-            {
+            if (fold)
                 suffix = "h";
-                reg -= 4;
-            }
-            else if(reg < 8 && size == 1)
+            else if (rel_reg < 8 && size == 1)
                 suffix = "l";
 
-            switch (reg) {
+            switch (rel_reg) {
               case INTREG_RAX:
                 ccprintf(os, abcdFormats[size], "a");
                 break;
@@ -192,34 +194,82 @@ namespace X86ISA
                 ccprintf(os, longFormats[size], "15");
                 break;
               default:
-                ccprintf(os, microFormats[size], reg - NUM_INTREGS);
+                ccprintf(os, microFormats[size], rel_reg - NUM_INTREGS);
             }
             ccprintf(os, suffix);
-        } else if (reg < Ctrl_Base_DepTag) {
-            int fpindex = reg - FP_Base_DepTag;
-            if(fpindex < NumMMXRegs) {
-                ccprintf(os, "%%mmx%d", reg - FP_Base_DepTag);
+            break;
+          }
+
+          case FloatRegClass: {
+            if (rel_reg < NumMMXRegs) {
+                ccprintf(os, "%%mmx%d", rel_reg);
                 return;
             }
-            fpindex -= NumMMXRegs;
-            if(fpindex < NumXMMRegs * 2) {
-                ccprintf(os, "%%xmm%d_%s", fpindex / 2,
-                        (fpindex % 2) ? "high": "low");
+            rel_reg -= NumMMXRegs;
+            if (rel_reg < NumXMMRegs * 2) {
+                ccprintf(os, "%%xmm%d_%s", rel_reg / 2,
+                        (rel_reg % 2) ? "high": "low");
                 return;
             }
-            fpindex -= NumXMMRegs * 2;
-            if(fpindex < NumMicroFpRegs) {
-                ccprintf(os, "%%ufp%d", fpindex);
+            rel_reg -= NumXMMRegs * 2;
+            if (rel_reg < NumMicroFpRegs) {
+                ccprintf(os, "%%ufp%d", rel_reg);
                 return;
             }
-            fpindex -= NumMicroFpRegs;
-            ccprintf(os, "%%st(%d)", fpindex);
-        } else {
-            switch (reg - Ctrl_Base_DepTag) {
+            rel_reg -= NumMicroFpRegs;
+            ccprintf(os, "%%st(%d)", rel_reg);
+            break;
+          }
+
+          case CCRegClass:
+            ccprintf(os, "%%cc%d", rel_reg);
+            break;
+
+          case MiscRegClass:
+            switch (rel_reg) {
               default:
-                ccprintf(os, "%%ctrl%d", reg - Ctrl_Base_DepTag);
+                ccprintf(os, "%%ctrl%d", rel_reg);
             }
+            break;
+        }
+    }
+
+    void X86StaticInst::printMem(std::ostream &os, uint8_t segment,
+            uint8_t scale, RegIndex index, RegIndex base,
+            uint64_t disp, uint8_t addressSize, bool rip) const
+    {
+        bool someAddr = false;
+        printSegment(os, segment);
+        os << ":[";
+        if (rip) {
+            os << "rip";
+            someAddr = true;
+        } else {
+            if (scale != 0 && index != ZeroReg)
+            {
+                if (scale != 1)
+                    ccprintf(os, "%d*", scale);
+                printReg(os, index, addressSize);
+                someAddr = true;
+            }
+            if (base != ZeroReg)
+            {
+                if (someAddr)
+                    os << " + ";
+                printReg(os, base, addressSize);
+                someAddr = true;
+            }
+        }
+        if (disp != 0)
+        {
+            if (someAddr)
+                os << " + ";
+            ccprintf(os, "%#x", disp);
+            someAddr = true;
         }
+        if (!someAddr)
+            os << "0";
+        os << "]";
     }
 
     std::string X86StaticInst::generateDisassembly(Addr pc,