Initial revision
[imager.git] / regops.perl
CommitLineData
02d1d628
AMH
1#!perl -w
2use strict;
3use Data::Dumper;
4my $in = shift or die "No input name";
5my $out = shift or die "No output name";
6open(IN, $in) or die "Cannot open input $in: $!";
7open(OUT, "> $out") or die "Cannot create $out: $!";
8print OUT <<'EOS';
9# AUTOMATICALLY GENERATED BY regops.perl
10package Imager::Regops;
11use strict;
12require Exporter;
13use vars qw(@ISA @EXPORT @EXPORT_OK %Attr $MaxOperands $PackCode);
14@ISA = qw(Exporter);
15@EXPORT_OK = qw(%Attr $MaxOperands $PackCode);
16
17EOS
18my @ops;
19my %attr;
20my $opcode = 0;
21my $max_opr = 0;
22my $reg_pack;
23while (<IN>) {
24 if (/^\s*rbc_(\w+)/) {
25 my $op = $1;
26 push(@ops, uc "RBC_$op");
27 # each line has a comment with the registers used - find the maximum
28 # I could probably do this as one line, but let's not
29 my @parms = /\b([rp][a-z])\b/g;
30 $max_opr = @parms if @parms > $max_opr;
31 my $types = join("", map {substr($_,0,1)} @parms);
32 my ($result) = /->\s*([rp])/;
33 $attr{$op} = { parms=>scalar @parms,
34 types=>$types,
35 func=>/\w+\(/?1:0,
36 opcode=>$opcode,
37 result=>$result
38 };
39 print OUT "use constant RBC_\U$op\E => $opcode;\n";
40 ++$opcode;
41 }
42 if (/^\#define RM_WORD_PACK \"(.)\"/) {
43 $reg_pack = $1;
44 }
45}
46print OUT "\n\@EXPORT = qw(@ops);\n\n";
47print OUT Data::Dumper->Dump([\%attr],["*Attr"]);
48print OUT "\$MaxOperands = $max_opr;\n";
49print OUT qq/\$PackCode = "$reg_pack";\n/;
50print OUT <<'EOS';
511;
52
53__END__
54
55=head1 NAME
56
57Imager::Regops - generated information about the register based VM
58
59=head1 SYNOPSIS
60
61 use Imager::Regops;
62 $Imager::Regops::Attr{$opname}->{opcode} # opcode for given operator
63 $Imager::Regops::Attr{$opname}->{parms} # number of parameters
64 $Imager::Regops::Attr{$opname}->{types} # types of parameters
65 $Imager::Regops::Attr{$opname}->{func} # operator is a function
66 $Imager::Regops::Attr{$opname}->{result} # r for numeric, p for pixel result
67 $Imager::Regops::MaxOperands; # maximum number of operands
68
69=head1 DESCRIPTION
70
71This module is generated automatically from regmach.h so we don't need to
72maintain the same information in at least one extra place.
73
74At least that's the idea.
75
76=head1 AUTHOR
77
78Tony Cook, tony@develop-help.com
79
80=head1 SEE ALSO
81
82perl(1), Imager(3), http://www.eecs.umich.edu/~addi/perl/Imager/
83
84=cut
85
86EOS
87close(OUT) or die "Cannot close $out: $!";
88close IN;