Files
mercury/runtime/Arrangeregs
Fergus Henderson 04b720630b Update the copyright messages so that (a) they contain the correct years
and (b) they say "Copyright (C) ... _The_ University of Melbourne".
1997-07-27 15:09:59 +00:00

132 lines
2.7 KiB
Awk
Executable File

#!/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";
}