blob: 5a8ceda4d3d56e7ee0917ad3553680474721be2e [file] [log] [blame]
#! /usr/bin/perl
# Copyright (C) 2009 Vegard Nossum
#
# This file is released under the GPL version 2. Please refer to the file
# LICENSE for details.
#
# Usage:
#
# First get the relevant pages from the manuals:
#
# wget -O fe-mnemonics.html http://java.sun.com/docs/books/jvms/first_edition/html/Mnemonics.doc.html
# wget -O se-mnemonics.html http://java.sun.com/docs/books/jvms/second_edition/html/Mnemonics.doc.html
#
# Run html2text on these and pipe it to this script:
# (html2text fe-mnemonics.html; html2text se-mnemonics.html) | perl scripts/gen-opcodes.pl > opcodes.h
#
use strict;
use warnings;
my %opc;
for (<>) {
next unless m/(\d+) \((0x[A-Za-z0-9]+)\) (\w+)/;
my $mnemonic = uc $3;
my $value = $1;
my $hex_value = oct $2;
if (exists $opc{$mnemonic} && $opc{$mnemonic} != $hex_value) {
printf STDERR "%s defined twice: %d and %d\n",
$mnemonic, $opc{$mnemonic}, $hex_value;
}
$opc{$mnemonic} = $hex_value;
}
print "#ifndef __VM_OPCODES_H\n";
print "#define __VM_OPCODES_H\n";
print "\n";
print "/* Note: This file was generated automatically. DO NOT EDIT! */\n";
print "\n";
my $fmt = "#define OPC_%s";
my $maxpos = 0;
for my $mnemonic (keys %opc) {
my $pos = length sprintf $fmt, $mnemonic;
$maxpos = $pos if $pos > $maxpos;
}
# round upwards to the nearest tab-stop
$maxpos = 8 + ($maxpos & ~7);
for my $mnemonic (sort { $opc{$a} <=> $opc{$b} } keys %opc) {
my $pos = length sprintf $fmt, $mnemonic;
$pos = 8 + ($pos & ~7);
printf $fmt, $mnemonic;
for (my $i = 0; $i < 1 + ($maxpos - $pos) / 8; ++$i) {
print "\t";
}
printf "0x%02x\n", $opc{$mnemonic};
}
print "\n";
print "#endif\n";