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.
 
 
 
 
 
 

269 lines
7.4 KiB

#!/usr/local/bin/perl5 -w
##
## 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";
$GenDir = shift(@ARGV);
$EmdbDir = shift(@ARGV);
################################################
# CONSTANTS
################################################
#decoder operand flags
$DECODER_OPER_2ND_ROLE_SRC_BIT = 0x00000001; # Oper second role: src
$DECODER_OPER_2ND_ROLE_DST_BIT = 0x00000002; # Oper second role: dest
$DECODER_OPER_NOT_TRUE_SRC_BIT = 0x00000004; # Oper value is ignored
$DECODER_OPER_IMP_ENCODED_BIT = 0x00000008; # Oper is imp encoded
$DECODER_OPER_IMM_IREG_BIT = 0x00000040; # Operand type is IREG_NUM
$DECODER_OPER_IMM_FREG_BIT = 0x00000080; # Operand type is FREG_NUM
#instructin flags
$EM_FLAG_SPECULATION = $EMDB_LAST_FLAG << 1;
$EM_FLAG_POSTINCREMENT = $EMDB_LAST_FLAG << 2;
$EM_FLAG_FALSE_PRED_EXEC = $EMDB_LAST_FLAG << 3;
$EM_BR_HINT_FLAG = $EMDB_LAST_FLAG << 4;
$EM_BR_FLAG = $EMDB_LAST_FLAG << 5;
$EM_ADV_LOAD_FLAG = $EMDB_LAST_FLAG << 6;
$EM_CONTROL_TRANSFER_FLAG = $EMDB_LAST_FLAG << 7;
$dst_op_num = 2;
$src_op_num = 5;
$op_role[$MAX_OPERAND] = "EM_OPROLE_NONE"; #dummy values, since the number of
$op_type[$MAX_OPERAND] = "EM_OPTYPE_NONE"; #decoder operands is greater by 1 than
$op_flags[$MAX_OPERAND] = 0; # the number of emdb operands
################################################
# open output "C" file
################################################
if (open(DEC_PRIV_TAB,">$GenDir/dec_static.c")!=1)
{
die "\nBuilder error - can't open dec_static.c\n";
};
################################################
# read DECODER EMDB information
################################################
if (open(EMDB_DEC_INFO,"$GenDir/dec1_emdb.c")!=1)
{
die "\nBuilder error - can't open dec1_emdb.c\n";
};
while(<EMDB_DEC_INFO>)
{
if (/^\s*\{\"\S+\"/) #"
{
$work_line = $_;
($mnemonic,$_2nd_role,$trole,$op[0],$op[1],$op[2],$op[3],$op[4],$op[5],$modifiers,$inst_flags,$specul_flag,$false_pred_flag,$imp_ops, $br_hint_flag, $br_flag, $adv_load_flag, $control_transfer_flag) = $work_line =~ /^\s*{(\S+),(.),(EM_TROLE\S+),{(EM_OPROLE\S+)},{(EM_OPROLE\S+)},{(EM_OPROLE\S+)},{(EM_OPROLE\S+)},{(EM_OPROLE\S+)},{(EM_OPROLE\S+)},{(\S+)},(0x\S+),(.),(.),({\(EM_Decoder_imp_oper_t\)EM_DECODER_IMP_OPERAND.+}),(.),(.),(.),(.)},?$/;
for($i=0; $i<$MAX_OPERAND; $i++)
{
($op_role[$i],$op_type[$i],$op_flags[$i])=split(/,/,$op[$i],3);
$op_flags[$i] = 0;
}
&Check_src_dst_flag();
&Set_op_flags();
&Set_inst_flags();
&Output_inst_info();
}
else
{
if (/\#include/ || /version/)
{
next;
}
if (/^dec1_EMDB_info_t/)
{
print DEC_PRIV_TAB "#include \"decem.h\"\n";
print DEC_PRIV_TAB "#include \"EM_hints.h\"\n\n\n";
s/^dec1_EMDB_info_t/const EM_Decoder_static_info_t/;
}
s/ EMDB INSTRUCTION / DECODER STATIC /g;
s/dec1_EMDB_/em_decoder_static_/;
print DEC_PRIV_TAB $_;
}
}
close(DEC_PRIV_TAB);
close(EMDB_DEC_INFO);
sub Set_inst_flags
{
$inst_flags = hex($inst_flags);
if ($specul_flag == 1)
{
$inst_flags = $inst_flags | $EM_FLAG_SPECULATION;
}
if ($false_pred_flag == 1)
{
$inst_flags = $inst_flags | $EM_FLAG_FALSE_PRED_EXEC;
}
if ($_2nd_role != 0)
{
$inst_flags = $inst_flags | $EM_FLAG_POSTINCREMENT;
}
if ($br_hint_flag == 1)
{
$inst_flags = $inst_flags | $EM_BR_HINT_FLAG;
}
if ($br_flag == 1)
{
$inst_flags = $inst_flags | $EM_BR_FLAG;
}
if ($adv_load_flag == 1)
{
$inst_flags = $inst_flags | $EM_ADV_LOAD_FLAG;
}
if ($control_transfer_flag == 1)
{
$inst_flags = $inst_flags | $EM_CONTROL_TRANSFER_FLAG;
}
}
sub Set_op_flags
{
for($i=0; $i<$MAX_OPERAND; $i++)
{
if ($op_type[$i] eq "EM_OPTYPE_IREG_NUM")
{
$op_flags[$i] |= $DECODER_OPER_IMM_IREG_BIT;
}
elsif ($op_type[$i] eq "EM_OPTYPE_FREG_NUM")
{
$op_flags[$i] |= $DECODER_OPER_IMM_FREG_BIT;
}
}
}
sub Check_src_dst_flag
{
if ($_2nd_role == 2) ###2nd role - source
{
if ($op_role[0] ne "EM_OPROLE_DST")
{
print "WARNING ! NO destination operand in $mnemonic\n";
}
$op_role[0] .= "_SRC";
$op_flags[0] |= $DECODER_OPER_2ND_ROLE_SRC_BIT;
}
elsif ($_2nd_role == 1) ###2nd role - destination
{
for($i=0; $op_role[$i] ne "EM_OPROLE_SRC" && $i<$MAX_OPERAND; $i++)
{
}
$op_role[$i] .= "_DST"; ###find first source operand
$op_flags[$i] |= $DECODER_OPER_2ND_ROLE_DST_BIT;
if ($i >= $MAX_OPERAND)
{
print "WARNING ! NO source operand in instruction\n";
}
}
}
sub Output_inst_info
{
if ($mnemonic ne "\"ILLEGAL_OP\"")
{
printf DEC_PRIV_TAB ",\n";
}
###print mnemonic and template role
printf(DEC_PRIV_TAB "{$mnemonic,$trole,{");
###print dst operands
for($i=0; $i<$dst_op_num && ($op_role[$i] ne "EM_OPROLE_SRC" &&
$op_role[$i] ne "EM_OPROLE_SRC_DST");)
{
printf(DEC_PRIV_TAB "{$op_role[$i],$op_type[$i],$op_flags[$i]}");
if (++$i != $dst_op_num)
{
print DEC_PRIV_TAB ",";
}
}
for($j=$i; $j<$dst_op_num;)
{
printf(DEC_PRIV_TAB "{EM_OPROLE_NONE,EM_OPTYPE_NONE,0}");
if (++$j != $dst_op_num)
{
print DEC_PRIV_TAB ",";
}
}
print DEC_PRIV_TAB "},{";
###print src operands
for($j=0; $j<$src_op_num; $i++)
{
printf(DEC_PRIV_TAB "{$op_role[$i],$op_type[$i],$op_flags[$i]}");
if (++$j != $src_op_num)
{
print DEC_PRIV_TAB ",";
}
}
print DEC_PRIV_TAB "},";
###print implicit operands, modifiers and instruction flags
printf(DEC_PRIV_TAB "$imp_ops,{$modifiers},0x%x}\n",$inst_flags);
}