mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-09 10:52:24 +00:00
132 lines
2.7 KiB
Awk
Executable File
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";
|
|
}
|