Added POD tests and a Perl::Critic test
[nasm/perl-rewrite.git] / perl / lib / Nasm / insns.pm
blob3d0fe652bd4b788a0b00543a51ff401eeea07846
1 =head1 NAME
3 Nasm::insns
5 =cut
7 package Nasm::insns;
8 use strict;
9 use warnings;
11 use base 'Exporter';
13 require Nasm::insns::Operands;
14 require Nasm::insns::Flags;
16 # Opcode prefixes which need their own opcode tables
17 # LONGER PREFIXES FIRST!
18 our @disasm_prefixes = qw(0F24 0F25 0F38 0F3A 0F7A 0FA6 0FA7 0F);
20 # This should match MAX_OPERANDS from nasm.h
21 our $MAX_OPERANDS = 5;
23 # Add VEX prefixes
24 our @vexlist;
25 for( my $m = 0; $m < 32; $m++ ){
26 for( my $lp = 0; $lp < 8; $lp++ ){
27 push(@vexlist, sprintf("VEX%02X%01X", $m, $lp));
30 @disasm_prefixes = (@vexlist, @disasm_prefixes);
32 our @bytecode_count = (0) x 256;
34 sub new{
35 my($class,$filename) = @_;
37 my $self = bless {}, $class;
39 if($filename){
40 $self->ProcessFile($filename);
43 return $self;
46 sub ProcessFile{
47 my( $self, $filename ) = @_;
48 open( my $file, '<', $filename ) || die "unable to open $filename";
50 $self->{filename} = $filename;
52 my $line_number = 0;
53 while( my $line = <$file> ){
54 $line_number++;
55 chomp $line;
57 # /^\s*(?:;\#)(.*)$/ # special lines
58 next if $line =~ /^\s*(?:;|$)/ ; # comments or blank lines
60 $self->ProcessLine($line,$line_number);
64 sub ProcessLine{
65 my( $self, $line, $line_number ) = @_;
67 unless( $line =~ m{
68 ^\s*+
69 (\S+)\s++
70 (\S+)\s++
72 \[.*?\] |
73 \S+
74 )\s++
75 (\S++)\s*+
77 }x){
78 die;
81 my($name,$operands,$code_string,$flags) = ($1,$2,$3,$4);
83 my $op_obj = Nasm::insns::Operands->new($operands);
84 my $flag_obj = Nasm::insns::Flags->new($flags);
86 my $ref = $self->{ops}{$name.':'.$op_obj->string} = {
87 operands => $op_obj,
88 flags => $flag_obj,
89 codestring => $code_string