/*
 Copyright (C) Intel Corp.  2006.  All Rights Reserved.
 Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
 develop this 3D driver.

 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
 "Software"), to deal in the Software without restriction, including
 without limitation the rights to use, copy, modify, merge, publish,
 distribute, sublicense, and/or sell copies of the Software, and to
 permit persons to whom the Software is furnished to do so, subject to
 the following conditions:

 The above copyright notice and this permission notice (including the
 next paragraph) shall be included in all copies or substantial
 portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 **********************************************************************/
 /*
  * Authors:
  *   Keith Whitwell <keith@tungstengraphics.com>
  */

#include "brw_eu.h"

void brw_print_reg( struct brw_reg hwreg )
{
   static const char *file[] = {
      "arf",
      "grf",
      "msg",
      "imm"
   };

   static const char *type[] = {
      "ud",
      "d",
      "uw",
      "w",
      "ub",
      "vf",
      "hf",
      "f"
   };

   printf("%s%s",
	  hwreg.abs ? "abs/" : "",
	  hwreg.negate ? "-" : "");

   if (hwreg.file == BRW_GENERAL_REGISTER_FILE &&
       hwreg.nr % 2 == 0 &&
       hwreg.subnr == 0 &&
       hwreg.vstride == BRW_VERTICAL_STRIDE_8 &&
       hwreg.width == BRW_WIDTH_8 &&
       hwreg.hstride == BRW_HORIZONTAL_STRIDE_1 &&
       hwreg.type == BRW_REGISTER_TYPE_F) {
      /* vector register */
      printf("vec%d", hwreg.nr);
   }
   else if (hwreg.file == BRW_GENERAL_REGISTER_FILE &&
	    hwreg.vstride == BRW_VERTICAL_STRIDE_0 &&
	    hwreg.width == BRW_WIDTH_1 &&
	    hwreg.hstride == BRW_HORIZONTAL_STRIDE_0 &&
	    hwreg.type == BRW_REGISTER_TYPE_F) {
      /* "scalar" register */
      printf("scl%d.%d", hwreg.nr, hwreg.subnr / 4);
   }
   else if (hwreg.file == BRW_IMMEDIATE_VALUE) {
      printf("imm %f", hwreg.dw1.f);
   }
   else {
      printf("%s%d.%d<%d;%d,%d>:%s",
		   file[hwreg.file],
		   hwreg.nr,
		   hwreg.subnr / type_sz(hwreg.type),
		   hwreg.vstride ? (1<<(hwreg.vstride-1)) : 0,
		   1<<hwreg.width,
		   hwreg.hstride ? (1<<(hwreg.hstride-1)) : 0,
		   type[hwreg.type]);
   }
}



