Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

378 lines
12 KiB

#!/usr/local/bin/perl5
##
## Copyright (c) 2000, Intel Corporation
## All rights reserved.
##
## WARRANTY DISCLAIMER
##
## THESE MATERIALS ARE PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
## OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
## NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THESE
## MATERIALS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
##
## Intel Corporation is the author of the Materials, and requests that all
## problem reports or change requests be submitted to it directly at
## http://developer.intel.com/opensource.
##
require "EM_perl.h";
require "hard_coded_fields_h.perl";
$GenDir = shift(@ARGV);
$EmdbDir = shift(@ARGV);
################################################
# CONSTANTS
################################################
$Inst_id_cln = 0;
$Trole_cln = 10;
$Oper_first_cln = 11;
$Format_cln = 9;
$Flag_cln = 23;
$Dec_flag_cln = 25;
$Cpu_flag = 26;
################################################
# VARIABLES
################################################
$func_no=0;
################################################################
### build data structures for hard-coded predicates and fields #
################################################################
&add_hard_coded_fields(\@Hard_coded_predicates_basic, \%Format_hc_pred_inst_pattern, \%format_hc_pred_inst_fields);
&add_hard_coded_fields(\@Hard_coded_predicates_merced, \%Format_hc_pred_inst_pattern, \%format_hc_pred_inst_fields);
&add_hard_coded_fields(\@Hard_coded_fields_basic, \%Format_hc_fld_inst_pattern, \%format_hc_fld_inst_fields);
&add_hard_coded_fields(\@Hard_coded_fields_merced, \%Format_hc_fld_inst_pattern, \%format_hc_fld_inst_fields);
################################################
# dec_emdb.h->decfn_emdb.h
################################################
if (open(EMDB_H,"$GenDir/deccpu_emdb.h")!=1)
{
die "\nBuilder error - can't open deccpu_emdb.h\n";
};
if (open(NEW_EMDB_H,">$GenDir/decfn_emdb.h")!=1)
{
die "\nBuilder error - can't open decfn_emdb.h\n";
};
while (<EMDB_H>)
{
if (/format/)
{
print NEW_EMDB_H "\tDecErr *format_function;\n";
}
elsif (!(/Operand_t/ || /template_role/ || /Flags_t/ || /dec_flags/))
{
print NEW_EMDB_H $_;
}
}
close(EMDB_H);
close(NEW_EMDB_H);
################################################
# read extended EMDB.c
################################################
if (open(EMDB_C,"$GenDir/deccpu_emdb.c")!=1)
{
die "\nBuilder error - can't open deccpu_emdb.c\n";
};
if (open(NEW_EMDB_C,">$GenDir/decfn_emdb.c")!=1)
{
die "\nBuilder error - can't open decfn_emdb.c\n";
};
if (open(OP_INFO,">$GenDir/dec_frmt.txt")!=1)
{
die "\nBuilder error - can't open dec_frmt.txt\n";
};
&Types_to_strings;
LINE:
while(<EMDB_C>)
{
if (!/{(.*)}/ || /version/)
{
s/deccpu_emdb\.h/decfn_emdb\.h/;
print NEW_EMDB_C $_;
next LINE;
}
else
{
$line = $1;
$line =~ s/\{//g;
$line =~ s/\}//g;
@columns = split(/,/,$line);
$inst_id = $columns[$Inst_id_cln];
$format = $columns[$Format_cln];
$flags = $columns[$Flag_cln];
$is_long = hex($flags) & $EM_FLAG_TWO_SLOT; ### indicates that the instruction is LONG (movl)
$dec_flags = $columns[$Dec_flag_cln];
$flags = sprintf("0x%x",($dec_flags<<$EMDB_MAX_FLAG)|hex($flags));
$func_name = "format_decode_".$format;
$func_name =~ s/EM_FORMAT//;
$cpu_flag = $columns[$Cpu_flag];
$op_types_str = "\{ ";
for($op_no=0; $op_no<$MAX_OPERAND; $op_no++)
{
$op_role[$op_no] = $columns[$Oper_first_cln+$op_no*2];
$op_type[$op_no] = $columns[$Oper_first_cln+$op_no*2+1];
if (!$Str{$op_type[$op_no]} && ($op_type[$op_no] ne EM_OPTYPE_NONE))
{
print "WARNING! ".$op_type[$op_no]." is not covered\n";
}
$func_name .= $Str{$op_type[$op_no]};
if ($is_long && ($op_type[$op_no] eq "EM_OPTYPE_UIMM"))
{
$op_types_str .= $Str{$op_role[$op_no]}.$op_type[$op_no]."64"." ";
}
elsif ($is_long && ($op_type[$op_no] eq "EM_OPTYPE_SSHIFT_REL"))
{
$op_types_str .= $Str{$op_role[$op_no]}.$op_type[$op_no]."64"." ";
}
else
{
$op_types_str .= $Str{$op_role[$op_no]}.$op_type[$op_no]." ";
}
}
$op_types_str .= "\}";
$func_name =~ s/@/_/g;
$func_name .= "_NP" if (!(hex($flags) & $EM_FLAG_PRED)); ### non-predicatable instr
$hc_fields = "";
&find_hard_coded_fields(\$func_name, \%Format_hc_pred_inst_pattern, \%format_hc_pred_inst_fields, "HCPRED", \$hc_fields);
&find_hard_coded_fields(\$func_name, \%Format_hc_fld_inst_pattern, \%format_hc_fld_inst_fields, "HCFLD", \$hc_fields);
$hc_fields_out{$func_name} = $hc_fields;
s/EM_FORMAT_\w+/$func_name/;
###print only inst_id, extensions, format_function and mem_size
($out1, $out2, $out3) = $_ =~ /(^\s*{EM_\S+,{\S+},format_decode_\S+,)EM_TROLE_\S+,{\S+},0x\S+,(\d+),\d+(,\S+\},?$)/;
print NEW_EMDB_C "$out1$out2$out3\n";
if (!$all_functions{$func_name})
{
$all_functions{$func_name} = $func_no+1; ### assign numbers starting from 1 (first TRUE value)
$Format_oper_types{$func_name} = $op_types_str;
$Format_Flags{$func_name,0} = $flags;
$Func_array[$func_no] = $func_name;
$func_no++;
$output_str{$func_name} = $format.":".$func_name.":".$op_types_str;
}
else
{
$match=0;
$ntype=0;
while(($Format_Flags{$func_name,$ntype}) && ($match==0))
{
if ($flags eq $Format_Flags{$func_name,$ntype})
{
$match=1;
}
$ntype++;
}
if ($match==0)
{
$Format_Flags{$func_name,$ntype} = $flags;
}
}
}
}
if (open(FUNC_H,">$GenDir/func.h")!=1)
{
die "\nBuilder error - can't open func.h\n";
};
for ($i=0;$i<$func_no;$i++)
{
$func_name = $Func_array[$i];
print OP_INFO $output_str{$func_name}."\{ ";
$ntype=0;
while($Format_Flags{$func_name,$ntype})
{
print OP_INFO $Format_Flags{$func_name,$ntype}." ";
$ntype++;
}
print OP_INFO "\}";
print OP_INFO ":\{".$hc_fields_out{$func_name}." \}\n";
print FUNC_H "extern DecErr ".$func_name.";\n";
}
sub Types_to_strings
{
$Str{EM_OPROLE_NONE} = "NONE@";
$Str{EM_OPROLE_DST} = "DST@";
$Str{EM_OPROLE_SRC} = "SRC@";
$Str{EM_OPTYPE_IREG} = "\@Ir";
$Str{EM_OPTYPE_IREG_NUM} = "\@Irn";
$Str{EM_OPTYPE_IREG_R0_3} = "\@Ir03";
$Str{EM_OPTYPE_IREG_R0} = "\@Ir0";
$Str{EM_OPTYPE_IREG_R1_127} = "\@Ir1_127";
$Str{EM_OPTYPE_FREG} = "\@Fr";
$Str{EM_OPTYPE_FREG_F2_127} = "\@Fr2_127";
$Str{EM_OPTYPE_FREG_NUM} = "\@Frn";
$Str{EM_OPTYPE_BR} = "\@Br";
$Str{EM_OPTYPE_IP} = "\@Ip";
$Str{EM_OPTYPE_PREG} = "\@Pr";
$Str{EM_OPTYPE_APP_REG} = "\@Ar";
$Str{EM_OPTYPE_CR} = "\@Cr";
$Str{EM_OPTYPE_CR_GRP_HIGH} = "\@Crgh";
$Str{EM_OPTYPE_CR_GRP_LOW} = "\@Cglr";
$Str{EM_OPTYPE_SIMM} = "\@Simm";
$Str{EM_OPTYPE_SDEC} = "\@Sdec";
$Str{EM_OPTYPE_UIMM} = "\@Uimm";
$Str{EM_OPTYPE_ONE} = "\@Nc1";
$Str{EM_OPTYPE_EIGHT} = "\@Nc8";
$Str{EM_OPTYPE_SIXTEEN} = "\@Nc16";
$Str{EM_OPTYPE_PREG_INV} = "\@Prinv";
$Str{EM_OPTYPE_MEM} = "\@Mem";
$Str{EM_OPTYPE_BR_NUM} ="\@Brn";
$Str{EM_OPTYPE_BR_VEC} ="\@Brv";
$Str{EM_OPTYPE_FCLASS} = "\@Fcl";
$Str{EM_OPTYPE_SREL} = "\@Srl";
$Str{EM_OPTYPE_SSHIFT_REL} = "\@Sshrl";
$Str{EM_OPTYPE_COUNT_1234} = "\@C14";
$Str{EM_OPTYPE_COUNT_123} = "\@C13";
$Str{EM_OPTYPE_COUNT_PACK} = "\@Cp";
$Str{EM_OPTYPE_CCOUNT} = "\@Cc";
$Str{EM_OPTYPE_PREGS_ALL} = "\@Prall";
$Str{EM_OPTYPE_PREGS_ROT} = "\@Prrot";
$Str{EM_OPTYPE_LEN} = "\@Len";
$Str{EM_OPTYPE_CPOS} = "\@Cpos";
$Str{EM_OPTYPE_APP_REG_GRP_HIGH} = "\@Argh";
$Str{EM_OPTYPE_APP_REG_GRP_LOW} = "\@Argl";
$Str{EM_OPTYPE_MUX1} = "\@Mux1";
$Str{EM_OPTYPE_MUX2} = "\@Mux2";
$Str{EM_OPTYPE_ALLOC_IOL} = "\@Ali";
$Str{EM_OPTYPE_ALLOC_ROT} = "\@Alr";
$Str{EM_OPTYPE_CR_IFS} = "\@Cri";
$Str{EM_OPTYPE_APP_CCV} ="\@Ar";
$Str{EM_OPTYPE_APP_PFS} ="\@Ar";
$Str{EM_OPTYPE_SEMAPHORE_INC} = "\@Sem";
$Str{EM_OPTYPE_PSR_L} = "\@Psrl";
$Str{EM_OPTYPE_PSR_UM} = "\@Psrum";
$Str{EM_OPTYPE_PSR} = "\@Psr";
$Str{EM_OPTYPE_DBR} ="\@Rfdbr";
$Str{EM_OPTYPE_IBR} ="\@Rfibr";
$Str{EM_OPTYPE_PKR} ="\@Rfpkr";
$Str{EM_OPTYPE_PMC} ="\@Rfpmc";
$Str{EM_OPTYPE_PMD} ="\@Rfpmd";
$Str{EM_OPTYPE_DTR} ="\@Rfdtr";
$Str{EM_OPTYPE_ITR} ="\@Rfitr";
$Str{EM_OPTYPE_RR} ="\@Rfrr";
$Str{EM_OPTYPE_MSR} ="\@Rfmsr";
$Str{EM_OPTYPE_CPUID} ="\@Rfcpuid";
$Str{EM_OPTYPE_CR_MINUS_IFS} ="\@Crmi";
$Str{EM_OPTYPE_CMP_UIMM} = "\@CUimm";
$Str{EM_OPTYPE_CMP_UIMM_DEC} = "\@CUimmd";
$Str{EM_OPTYPE_CMP4_UIMM} = "\@C4Uimm";
$Str{EM_OPTYPE_CMP4_UIMM_DEC} = "\@C4Uimmd";
$Str{EM_OPTYPE_UDEC} = "\@Udec";
$Str{EM_OPTYPE_USHIFT_16} = "\@Ush16";
$Str{EM_OPTYPE_SSHIFT_16} = "\@Ssh16";
$Str{EM_OPTYPE_SSHIFT_1} = "\@Ssh1";
$Str{EM_OPTYPE_TAG} = "\@Tag";
}
sub add_hard_coded_fields
{
local ($Hard_coded_fields, $Format_hard_coded_inst_pattern, $Format_hard_coded_inst_fields) = @_;
for ($i=0; $i<=$#$Hard_coded_fields; $i++)
{
$hard_coded_line = $$Hard_coded_fields[$i];
$hard_coded_line =~ s/\s+//g;
($format, $hc_pattern, $fields) = $hard_coded_line =~ /^(\S+),\/(\S+)\/,\{(.*)\}$/;
@hc_fields = split(/\|/, $fields);
### find number of format lines already met for this format
for ($frmt_line_no=0; $$Format_hard_coded_inst_pattern{$format,$frmt_line_no}; $frmt_line_no++)
{
}
### assign instructions pattern for this format line
$$Format_hard_coded_inst_pattern{$format,$frmt_line_no} = $hc_pattern;
### assign instructions hard-coded fields for this format line
for ($field_no=0; $field_no<=$#hc_fields; $field_no++)
{
$$Format_hard_coded_inst_fields{$format, $frmt_line_no, $field_no} = $hc_fields[$field_no];
}
}
}
sub find_hard_coded_fields
{
local ($func_name, $Format_hard_coded_inst_pattern, $Format_hard_coded_inst_fields, $fld_name, $hc_fields) = @_;
local($format) = $format;
$format =~ s/EM_FORMAT_//;
$found_line = 0;
for ($frmt_line_no=0; $$Format_hard_coded_inst_pattern{$format, $frmt_line_no}; $frmt_line_no++)
{
if ($inst_id =~ /$$Format_hard_coded_inst_pattern{$format,$frmt_line_no}/)
{
die "Error: more then one hard-coded format line correspond to $inst_id\n" if ($found_line);
$found_line = 1;
die "Error: Hard-coded predicate for predicatable instruction $inst_id\n"
if (($fld_name =~ /PRED/) && (hex($flags) & $EM_FLAG_PRED) && ($format !~ /B4/));
$$func_name .= "_".$fld_name;
for ($fld_no=0; $$Format_hard_coded_inst_fields{$format, $frmt_line_no, $fld_no}; $fld_no++)
{
$hc_field = $$Format_hard_coded_inst_fields{$format, $frmt_line_no, $fld_no};
($pos, $val) = split(/,/, $hc_field);
$pos_out = $pos;
$pos_out =~ s/:/_/;
$$func_name .= "__".$pos_out."_".$val;
$pos_out = $pos;
$pos_out =~ s/:/-/;
$$hc_fields .= " $pos_out,$val";
}
}
}
}