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