#!/usr/bin/awk -f
#-----------------------------------------------------------------------------#
# Copyright (C) 1994-1995 The University of Melbourne. 
# This file may only be copied under the terms of the GNU General
# Public Licence - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#
BEGIN	{
		numregs=37;

		regno["succip"] = 0;
		regno["r1"] = 1;
		regno["r2"] = 2;
		regno["r3"] = 3;
		regno["r4"] = 4;
		regno["r5"] = 5;
		regno["r6"] = 6;
		regno["r7"] = 7;
		regno["r8"] = 8;
		regno["r9"] = 9;
		regno["r10"] = 10;
		regno["r11"] = 11;
		regno["r12"] = 12;
		regno["r13"] = 13;
		regno["r14"] = 14;
		regno["r15"] = 15;
		regno["r16"] = 16;
		regno["r17"] = 17;
		regno["r18"] = 18;
		regno["r19"] = 19;
		regno["r20"] = 20;
		regno["r21"] = 21;
		regno["r22"] = 22;
		regno["r23"] = 23;
		regno["r24"] = 24;
		regno["r25"] = 25;
		regno["r26"] = 26;
		regno["r27"] = 27;
		regno["r28"] = 28;
		regno["r29"] = 29;
		regno["r30"] = 30;
		regno["r31"] = 31;
		regno["r32"] = 32;
		regno["hp"]     = 33;
		regno["sp"]     = 34;
		regno["maxfr"]  = 35;
		regno["curfr"]  = 36;

		name[0]  = "succip";
		name[33] = "hp";
		name[34] = "sp";
		name[35] = "maxfr";
		name[36] = "curfr";

		cast[0] = "Code *";
		cast[33] = "Word *";
		cast[34] = "Word *";
		cast[35] = "Word *";
		cast[36] = "Word *";

		counter[0]  = "SI_RN";
		counter[33] = "HP_RN";
		counter[34] = "SP_RN";
		counter[35] = "MF_RN";
		counter[36] = "CF_RN";

		for (i = 0; i < numregs; i++)
			user[i] = "";

		for (i = 0; i < numregs; i++)
			backer[i] = "";
	}
	{
		absregno = regno[$1];
		if (absregno == "") {
			printf "unknown register %s\n", $1;
			exit;
		}

		for (i = 0; i < numregs; i++)
		{
			if (user[i] == "")
			{
				user[i] = absregno;
				backer[absregno] = i;
				break;
			}
		}

		if (backer[absregno] == "")
		{
			printf "no backer for %s\n", $1;
			exit;
		}
	}
END	{
		printf "/* this code automatically generated, do not edit */\n";
		printf "/* #defines for the normal use of the registers */\n";
		for (i = 0; i < numregs; i++)
		{
			if (backer[i] == "")
			{
				printf "no backer for r%d\n", i;
				exit;
			}

			if (cast[i] == "")
				printf \
		"#define r%d\t count_usage(%d, mr%d)\n", \
					i, i, backer[i];
			else
				printf \
		"#define %s\t LVALUE_CAST(%s, count_usage(%s, mr%d))\n", \
				name[i], cast[i], counter[i], backer[i];
		}

		printf "/* The body of the virtual register map */\n";
		printf "#define VIRTUAL_REG_MAP_BODY\t{\\\n";
		printf "\t0,\\\n";
		for (i = 0; i < numregs; i++)
		{
			if (backer[i] == "")
			{
				printf "no backer for r%d\n", i;
				exit;
			}

			if (cast[i] == "")
				printf "\t%d,\\\n", backer[i];
		}
		printf "}\n";
	}
