Improved POD documentation of perl modules
[nasm/perl-rewrite.git] / perl / lib / Nasm / insns.pm
blob7a2f242b241c70eb2db6427d5e005e58dfffb4f2
1 =head1 NAME
3 Nasm::insns
5 =head1 DESCRIPTION
7 Loads info from insns.dat
9 =head1 Subroutines
11 =cut
13 package Nasm::insns;
14 use strict;
15 use warnings;
17 use base 'Exporter';
19 require Nasm::insns::Operands;
20 require Nasm::insns::Flags;
22 # Opcode prefixes which need their own opcode tables
23 # LONGER PREFIXES FIRST!
24 our @disasm_prefixes = qw(0F24 0F25 0F38 0F3A 0F7A 0FA6 0FA7 0F);
26 # This should match MAX_OPERANDS from nasm.h
27 our $MAX_OPERANDS = 5;
29 # Add VEX prefixes
30 our @vexlist;
31 for( my $m = 0; $m < 32; $m++ ){
32 for( my $lp = 0; $lp < 8; $lp++ ){
33 push(@vexlist, sprintf("VEX%02X%01X", $m, $lp));
36 @disasm_prefixes = (@vexlist, @disasm_prefixes);
38 our @bytecode_count = (0) x 256;
40 =head2 new
42 creates a new insns object
44 =cut
45 sub new{
46 my($class,$filename) = @_;
48 my $self = bless {}, $class;
50 if($filename){
51 $self->ProcessFile($filename);
54 return $self;
57 =head2 ProcessFile
59 Reads the file
61 =cut
62 sub ProcessFile{
63 my( $self, $filename ) = @_;
64 open( my $file, '<', $filename ) || die "unable to open $filename";
66 $self->{filename} = $filename;
68 my $line_number = 0;
69 while( my $line = <$file> ){
70 $line_number++;
71 chomp $line;
73 # /^\s*(?:;\#)(.*)$/ # special lines
74 next if $line =~ /^\s*(?:;|$)/ ; # comments or blank lines
76 $self->_ProcessLine($line,$line_number);
80 sub _ProcessLine{
81 my( $self, $line, $line_number ) = @_;
83 unless( $line =~ m{
84 ^\s*+
85 (\S+)\s++
86 (\S+)\s++
88 \[.*?\] |
89 \S+
90 )\s++
91 (\S++)\s*+
93 }x){
94 die;
97 my($name,$operands,$code_string,$flags) = ($1,$2,$3,$4);
99 my $op_obj = Nasm::insns::Operands->new($operands);
100 my $flag_obj = Nasm::insns::Flags->new($flags);
102 my $ref = $self->{ops}{$name.':'.$op_obj->string} = {
103 operands => $op_obj,
104 flags => $flag_obj,
105 codestring => $code_string