mktbl.awk (2173B)
1 2 BEGIN { 3 nvar=0 4 printf "#include <scc/mach.h>\n"\ 5 "#include <scc/scc.h>\n"\ 6 "#include \"../../as.h\"\n"\ 7 "#include \"../" family "/proc.h\"\n" 8 9 rules = "target/" family "/opers.dat" 10 while (getline < rules > 0) { 11 regex[++nregs] = $1 12 value[nregs] = $2 13 } 14 close(rules) 15 } 16 {sub(/#.*/,"")} 17 18 $7 !~ cpu {next} 19 20 /^$/ {next} 21 22 { 23 if (op[$1] == 0) { 24 op[$1] = 1 25 opstart[$1] = nvar 26 opnames[nop++] = $1 27 } 28 opcount[$1]++ 29 opargs[nvar] = $3 30 opsize[nvar] = $4 31 opbytes[nvar] = ($5 == "none") ? "" : $5 32 opformat[nvar++] = $6 33 formats[$6] = 1 34 } 35 36 END { 37 for (i in formats) 38 printf "Format %s;\n", i 39 40 print "struct ins instab[] = {" 41 for (i = 0; i < nop; i++) { 42 n = opnames[i] 43 start = opstart[n] 44 end = start + opcount[n] 45 printf "\t{.str = \"%s\", .begin = %d, .end = %d},\n", 46 n, start, end 47 } 48 printf "};\n\n" 49 50 for (i = 0; i < nop; i++) 51 print opnames[i] | "./lexh" 52 close("./lexh") 53 54 print "struct op optab[] = {" 55 for (i = 0; i < nvar; i++) { 56 printf "\t/* %d */\n", i 57 printf "\t{\n" \ 58 "\t\t.size = %d,\n"\ 59 "\t\t.format = %s,\n", 60 opsize[i], opformat[i] 61 62 if (opbytes[i] != "") 63 printf "\t\t.bytes = (unsigned char [%d]) {%s},\n", 64 opsize[i], 65 opbytes[i] 66 67 a = str2args(opargs[i]) 68 if (a != "") 69 printf "\t\t.args = (unsigned char []) {%s}\n", a 70 71 print "\t}," 72 } 73 print "};" 74 } 75 76 function str2args(s, args, i, j, out, n, found) 77 { 78 n = split(s, args, /,/) 79 if (n == 0 || args[1] == "none") 80 return "" 81 for (i = 1; i <= n; i++) { 82 a = args[i] 83 found = 0 84 85 if (a ~ /\?$/) 86 out = out "AOPT ," 87 else if (a ~ /\+$/) 88 out = out "AREP ," 89 90 for (j = 1; j <= nregs; j++) { 91 if (match(a, "^" regex[j])) { 92 out = out value[j] 93 found = 1 94 break 95 } 96 } 97 98 if (!found) { 99 print FILENAME ":" NR ":" \ 100 $0 ":wrong arg in opcode list", a > "/dev/stderr" 101 exit 1 102 } 103 104 a = substr(a, RLENGTH+1) 105 sub(/\?$/, "", a) 106 sub(/\+$/, "", a) 107 if (a != "") { 108 print FILENAME ":" NR ":" \ 109 $0 ": trailing chars: ", a > "/dev/stderr" 110 exit 1 111 } 112 out = out "," 113 } 114 out = out "0" 115 116 return out 117 }