Quelle formsopt.hpp
Sprache: C
/*
* Copyright ( c ) 1998 , 2022 , Oracle and / or its affiliates . All rights reserved .
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
* published by the Free Software Foundation .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
*
* /
# ifndef SHARE_ADLC_FORMSOPT_HPP
# define SHARE_ADLC_FORMSOPT_HPP
/ / FORMSOPT . HPP - ADL Parser Target Specific Optimization Forms Classes
/ / Class List
class Form ;
class InstructForm ;
class OperandForm ;
class OpClassForm ;
class AttributeForm ;
class RegisterForm ;
class PipelineForm ;
class SourceForm ;
class EncodeForm ;
class Component ;
class Constraint ;
class Predicate ;
class MatchRule ;
class Attribute ;
class Effect ;
class ExpandRule ;
class RewriteRule ;
class ConstructRule ;
class FormatRule ;
class EncClass ;
class Interface ;
class RegInterface ;
class ConstInterface ;
class MemInterface ;
class CondInterface ;
class Opcode ;
class InsEncode ;
class RegDef ;
class RegClass ;
class CodeSnippetRegClass ;
class ConditionalRegClass ;
class AllocClass ;
class ResourceForm ;
class PipeClassForm ;
class PipeClassOperandForm ;
class PipeClassResourceForm ;
class Peephole ;
class PeepPredicate ;
class PeepMatch ;
class PeepProcedure ;
class PeepConstraint ;
class PeepReplace ;
class MatchList ;
class ArchDesc ;
/ / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Register Allocation = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RegisterForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class RegisterForm : public Form {
private :
AllocClass * _ current_ac ; / / State used by iter_RegDefs ( )
public :
/ / Public Data
NameList _ rdefs ; / / List of register definition names
Dict _ regDef ; / / map register name to RegDef *
NameList _ rclasses ; / / List of register class names
Dict _ regClass ; / / map register class name to RegClass *
NameList _ aclasses ; / / List of allocation class names
Dict _ allocClass ; / / Dictionary of allocation classes
static int _ reg_ctr ; / / Register counter
static int RegMask_Size ( ) ; / / Compute RegMask size
/ / Public Methods
RegisterForm ( ) ;
~ RegisterForm ( ) ;
void addRegDef ( char * regName , char * callingConv , char * c_conv ,
char * idealtype , char * encoding , char * concreteName ) ;
template < typename T > T * addRegClass ( const char * className ) ;
AllocClass * addAllocClass ( char * allocName ) ;
void addSpillRegClass ( ) ;
void addDynamicRegClass ( ) ;
/ / Provide iteration over all register definitions
/ / in the order used by the register allocator
void reset_RegDefs ( ) ;
RegDef * iter_RegDefs ( ) ;
RegDef * getRegDef ( const char * regName ) ;
RegClass * getRegClass ( const char * className ) ;
/ / Return register mask , compressed chunk and register #
uint reg_mask ( char * register_class ) ;
/ / Check that register classes are compatible with chunks
bool verify ( ) ;
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RegDef - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class RegDef : public Form {
public :
/ / Public Data
const char * _ regname ; / / ADLC ( Opto ) Register name
const char * _ callconv ; / / Calling convention
const char * _ c_conv ; / / Native calling convention , ' C '
const char * _ idealtype ; / / Ideal Type for register save / restore
const char * _ concrete ; / / concrete register name
private :
const char * _ register_encode ; / / The register encoding
/ / The chunk and register mask bits define info for register allocation
uint32 _ register_num ; / / Which register am I
public :
/ / Public Methods
RegDef ( char * regname , char * callconv , char * c_conv ,
char * idealtype , char * encoding , char * concrete ) ;
~ RegDef ( ) ; / / Destructor
/ / Interface to define / redefine the register number
void set_register_num ( uint32 new_register_num ) ;
/ / Bit pattern used for generating machine code
const char * register_encode ( ) const ;
/ / Register number used in machine - independent code
uint32 register_num ( ) const ;
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RegClass - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Generic register class . This register class is the internal representation
/ / for the following . ad file format :
/ /
/ / reg_class ptr ( RAX , RBX , . . . ) ;
/ /
/ / where ptr is the name of the register class , RAX and RBX are registers .
/ /
/ / This register class allows registers to be spilled onto the stack . Spilling
/ / is allowed is field _ stack_or_reg is true .
class RegClass : public Form {
public :
/ / Public Data
const char * _ classid ; / / Name of class
NameList _ regDefs ; / / List of registers in class
Dict _ regDef ; / / Dictionary of registers in class
protected :
bool _ stack_or_reg ; / / Allowed on any stack slot
public :
/ / Public Methods
RegClass ( const char * classid ) ; / / Constructor
virtual ~ RegClass ( ) ;
void addReg ( RegDef * regDef ) ; / / Add a register to this class
uint size ( ) const ; / / Number of registers in class
int regs_in_word ( int wordnum , bool stack_also ) ;
const RegDef * get_RegDef ( const char * regDef_name ) const ;
/ / Returns the lowest numbered register in the mask .
const RegDef * find_first_elem ( ) ;
/ / Iteration support
void reset ( ) ; / / Reset the following two iterators
RegDef * RegDef_iter ( ) ; / / which move jointly ,
const char * rd_name_iter ( ) ; / / invoking either advances both .
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
virtual bool has_stack_version ( ) {
return _ stack_or_reg ;
}
virtual void set_stack_version ( bool flag ) {
_ stack_or_reg = flag ;
}
virtual void declare_register_masks ( FILE * fp ) ;
virtual void build_register_masks ( FILE * fp ) ;
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CodeSnippetRegClass - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Register class that has an user - defined C + + code snippet attached to it
/ / to determine at runtime which register class to use . This register class is
/ / the internal representation for the following . ad file format :
/ /
/ / reg_class actual_dflt_reg % {
/ / if ( VM_Version : : has_vfp3_32 ( ) ) {
/ / return DFLT_REG_mask ( ) ;
/ / } else {
/ / return DFLT_LOW_REG_mask ( ) ;
/ / }
/ / % }
/ /
/ / where DFLT_REG_mask ( ) and DFLT_LOW_REG_mask ( ) are the internal names of the
/ / masks of register classes dflt_reg and dflt_low_reg .
/ /
/ / The attached code snippet can select also between more than two register classes .
/ / This register class can be , however , used only if the register class is not
/ / cisc - spillable ( i . e . , the registers of this class are not allowed on the stack ,
/ / which is equivalent with _ stack_or_reg being false ) .
class CodeSnippetRegClass : public RegClass {
protected :
char * _ code_snippet ;
public :
CodeSnippetRegClass ( const char * classid ) ; / / Constructor
~ CodeSnippetRegClass ( ) ;
void set_code_snippet ( char * code ) {
_ code_snippet = code ;
}
char * code_snippet ( ) {
return _ code_snippet ;
}
void declare_register_masks ( FILE * fp ) ;
void build_register_masks ( FILE * fp ) {
/ / We do not need to generate register masks because we select at runtime
/ / between register masks generated for other register classes .
return ;
}
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ConditionalRegClass - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Register class that has two register classes and a runtime condition attached
/ / to it . The condition is evaluated at runtime and either one of the register
/ / attached register classes is selected . This register class is the internal
/ / representation for the following . ad format :
/ /
/ / reg_class_dynamic actual_dflt_reg ( dflt_reg , low_reg ,
/ / % { VM_Version : : has_vfp3_32 ( ) } %
/ / ) ;
/ /
/ / This example is equivalent to the example used with the CodeSnippetRegClass
/ / register class . A ConditionalRegClass works also if a register class is cisc - spillable
/ / ( i . e . , _ stack_or_reg is true ) , but if can select only between two register classes .
class ConditionalRegClass : public RegClass {
protected :
/ / reference to condition code
char * _ condition_code ; / / C + + condition code to dynamically determine which register class to use .
/ / Example syntax ( equivalent to previous example ) :
/ /
/ / reg_class actual_dflt_reg ( dflt_reg , low_reg ,
/ / % { VM_Version : : has_vfp3_32 ( ) } %
/ / ) ;
/ / reference to conditional register classes
RegClass * _ rclasses [ 2 ] ; / / 0 is the register class selected if the condition code returns true
/ / 1 is the register class selected if the condition code returns false
public :
ConditionalRegClass ( const char * classid ) ; / / Constructor
~ ConditionalRegClass ( ) ;
virtual void set_stack_version ( bool flag ) {
RegClass : : set_stack_version ( flag ) ;
assert ( ( _ rclasses [ 0 ] ! = NULL ) , " Register class NULL for condition code = = true " ) ;
assert ( ( _ rclasses [ 1 ] ! = NULL ) , " Register class NULL for condition code = = false " ) ;
_ rclasses [ 0 ] - > set_stack_version ( flag ) ;
_ rclasses [ 1 ] - > set_stack_version ( flag ) ;
}
void declare_register_masks ( FILE * fp ) ;
void build_register_masks ( FILE * fp ) {
/ / We do not need to generate register masks because we select at runtime
/ / between register masks generated for other register classes .
return ;
}
void set_rclass_at_index ( int index , RegClass * rclass ) {
assert ( ( 0 < = index & & index < 2 ) , " Condition code can select only between two register classes " ) ;
_ rclasses [ index ] = rclass ;
}
void set_condition_code ( char * code ) {
_ condition_code = code ;
}
char * condition_code ( ) {
return _ condition_code ;
}
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AllocClass - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class AllocClass : public Form {
private :
public :
/ / Public Data
char * _ classid ; / / Name of class
NameList _ regDefs ; / / List of registers in class
Dict _ regDef ; / / Dictionary of registers in class
/ / Public Methods
AllocClass ( char * classid ) ; / / Constructor
void addReg ( RegDef * regDef ) ; / / Add a register to this class
uint size ( ) { return _ regDef . Size ( ) ; } / / Number of registers in class
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Frame Handling = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FrameForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class FrameForm : public Form {
private :
public :
/ / Public Data
char * _ sync_stack_slots ;
char * _ inline_cache_reg ;
char * _ interpreter_frame_pointer_reg ;
char * _ cisc_spilling_operand_name ;
char * _ frame_pointer ;
char * _ c_frame_pointer ;
char * _ alignment ;
bool _ return_addr_loc ;
bool _ c_return_addr_loc ;
char * _ return_addr ;
char * _ c_return_addr ;
char * _ varargs_C_out_slots_killed ;
char * _ return_value ;
char * _ c_return_value ;
/ / Public Methods
FrameForm ( ) ;
~ FrameForm ( ) ;
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Scheduling = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PipelineForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class PipelineForm : public Form {
private :
public :
/ / Public Data
NameList _ reslist ; / / List of pipeline resources
FormDict _ resdict ; / / Resource Name - > ResourceForm mapping
int _ rescount ; / / Number of resources ( ignores OR cases )
int _ maxcycleused ; / / Largest cycle used relative to beginning of instruction
NameList _ stages ; / / List of pipeline stages on architecture
int _ stagecnt ; / / Number of stages listed
NameList _ classlist ; / / List of pipeline classes
FormDict _ classdict ; / / Class Name - > PipeClassForm mapping
int _ classcnt ; / / Number of classes
NameList _ noplist ; / / List of NOP instructions
int _ nopcnt ; / / Number of nop instructions
bool _ variableSizeInstrs ; / / Indicates if this architecture has variable sized instructions
bool _ branchHasDelaySlot ; / / Indicates that branches have delay slot instructions
int _ maxInstrsPerBundle ; / / Indicates the maximum number of instructions for ILP
int _ maxBundlesPerCycle ; / / Indicates the maximum number of bundles for ILP
int _ instrUnitSize ; / / The minimum instruction unit size , in bytes
int _ bundleUnitSize ; / / The bundle unit size , in bytes
int _ instrFetchUnitSize ; / / The size of the I - fetch unit , in bytes [ must be power of 2 ]
int _ instrFetchUnits ; / / The number of I - fetch units processed per cycle
/ / Public Methods
PipelineForm ( ) ;
~ PipelineForm ( ) ;
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ResourceForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class ResourceForm : public Form {
public :
unsigned mask ( ) const { return _ resmask ; } ;
private :
/ / Public Data
unsigned _ resmask ; / / Resource Mask ( OR of resource specifier bits )
public :
/ / Virtual Methods
virtual ResourceForm * is_resource ( ) const ;
/ / Public Methods
ResourceForm ( unsigned resmask ) ; / / Constructor
~ ResourceForm ( ) ; / / Destructor
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PipeClassOperandForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class PipeClassOperandForm : public Form {
private :
public :
/ / Public Data
const char * _ stage ; / / Name of Stage
unsigned _ iswrite ; / / Read or Write
unsigned _ more_instrs ; / / Additional Instructions
/ / Public Methods
PipeClassOperandForm ( const char * stage , unsigned iswrite , unsigned more_instrs )
: _ stage ( stage )
, _ iswrite ( iswrite )
, _ more_instrs ( more_instrs )
{ } ;
~ PipeClassOperandForm ( ) { } ; / / Destructor
bool isWrite ( ) const { return _ iswrite ! = 0 ; }
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PipeClassResourceForm - - - - - - - - - - - - - - - - - - - - - - - - - -
class PipeClassResourceForm : public Form {
private :
public :
/ / Public Data
const char * _ resource ; / / Resource
const char * _ stage ; / / Stage the resource is used in
int _ cycles ; / / Number of cycles the resource is used
/ / Public Methods
PipeClassResourceForm ( const char * resource , const char * stage , int cycles )
/ / Constructor
: _ resource ( resource )
, _ stage ( stage )
, _ cycles ( cycles )
{ } ;
~ PipeClassResourceForm ( ) { } ; / / Destructor
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PipeClassForm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class PipeClassForm : public Form {
private :
public :
/ / Public Data
const char * _ ident ; / / Name of class
int _ num ; / / Used in name of MachNode subclass
NameList _ parameters ; / / Locally defined names
FormDict _ localNames ; / / Table of operands & their types
FormDict _ localUsage ; / / Table of operand usage
FormList _ resUsage ; / / List of resource usage
NameList _ instructs ; / / List of instructions and machine nodes that use this pipeline class
bool _ has_fixed_latency ; / / Always takes this number of cycles
int _ fixed_latency ; / / Always takes this number of cycles
int _ instruction_count ; / / Number of instructions in first bundle
bool _ has_multiple_bundles ; / / Indicates if 1 or multiple bundles
bool _ has_branch_delay_slot ; / / Has branch delay slot as last instruction
bool _ force_serialization ; / / This node serializes relative to surrounding nodes
bool _ may_have_no_code ; / / This node may generate no code based on register allocation
/ / Virtual Methods
virtual PipeClassForm * is_pipeclass ( ) const ;
/ / Public Methods
PipeClassForm ( const char * id , int num ) ;
/ / Constructor
~ PipeClassForm ( ) ; / / Destructor
bool hasFixedLatency ( ) { return _ has_fixed_latency ; }
int fixedLatency ( ) { return _ fixed_latency ; }
void setFixedLatency ( int fixed_latency ) { _ has_fixed_latency = 1 ; _ fixed_latency = fixed_latency ; }
void setInstructionCount ( int i ) { _ instruction_count = i ; }
void setMultipleBundles ( bool b ) { _ has_multiple_bundles = b ; }
void setBranchDelay ( bool s ) { _ has_branch_delay_slot = s ; }
void setForceSerialization ( bool s ) { _ force_serialization = s ; }
void setMayHaveNoCode ( bool s ) { _ may_have_no_code = s ; }
int InstructionCount ( ) const { return _ instruction_count ; }
bool hasMultipleBundles ( ) const { return _ has_multiple_bundles ; }
bool hasBranchDelay ( ) const { return _ has_branch_delay_slot ; }
bool forceSerialization ( ) const { return _ force_serialization ; }
bool mayHaveNoCode ( ) const { return _ may_have_no_code ; }
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
/ / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Peephole Optimization = = = = = = = = = = = = = = = = = = = = = = = = = =
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Peephole - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class Peephole : public Form {
private :
static int _ peephole_counter ; / / Incremented by each peephole rule parsed
int _ peephole_number ; / / Remember my order in architecture description
PeepPredicate * _ predicate ; / / Predicate to apply peep rule
PeepMatch * _ match ; / / Instruction pattern to match
PeepProcedure * _ procedure ; / / The detailed procedure to perform the rule
PeepConstraint * _ constraint ; / / List of additional constraints
PeepReplace * _ replace ; / / Instruction pattern to substitute in
Peephole * _ next ;
public :
/ / Public Methods
Peephole ( ) ;
~ Peephole ( ) ;
/ / Append a peephole rule with the same root instruction
void append_peephole ( Peephole * next_peephole ) ;
/ / Store the components of this peephole rule
void add_predicate ( PeepPredicate * only_one_predicate ) ;
void add_match ( PeepMatch * only_one_match ) ;
void add_procedure ( PeepProcedure * only_one_procedure ) ;
void append_constraint ( PeepConstraint * next_constraint ) ;
void add_replace ( PeepReplace * only_one_replacement ) ;
/ / Access the components of this peephole rule
int peephole_number ( ) { return _ peephole_number ; }
PeepPredicate * predicate ( ) { return _ predicate ; }
PeepMatch * match ( ) { return _ match ; }
PeepProcedure * procedure ( ) { return _ procedure ; }
PeepConstraint * constraints ( ) { return _ constraint ; }
PeepReplace * replacement ( ) { return _ replace ; }
Peephole * next ( ) { return _ next ; }
void dump ( ) ; / / Debug printer
void output ( FILE * fp ) ; / / Write info to output files
} ;
class PeepPredicate : public Form {
private :
const char * _ rule ;
public :
/ / Public Methods
PeepPredicate ( const char * rule ) ;
~ PeepPredicate ( ) ;
const char * rule ( ) const ;
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
class PeepMatch : public Form {
private :
char * _ rule ;
/ / NameList _ depth ; / / Depth of this instruction
NameList _ parent ;
NameList _ position ;
NameList _ instrs ; / / List of instructions in match rule
NameList _ input ; / / input position in parent ' s instruction
int _ max_position ;
public :
/ / Public Methods
PeepMatch ( char * rule ) ;
~ PeepMatch ( ) ;
/ / Insert info into the match - rule
void add_instruction ( int parent , int position , const char * name , int input ) ;
/ / Access info about instructions in the peep - match rule
int max_position ( ) ;
const char * instruction_name ( int position ) ;
/ / Iterate through all info on matched instructions
void reset ( ) ;
void next_instruction ( int & parent , int & position , const char * & name , int &span>input ) ;
/ / ' true ' if current position in iteration is a placeholder , not matched .
bool is_placeholder ( ) ;
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
class PeepProcedure : public Form {
private :
const char * _ name ;
public :
/ / Public Methods
PeepProcedure ( const char * name ) ;
~ PeepProcedure ( ) ;
const char * name ( ) const ;
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
class PeepConstraint : public Form {
private :
PeepConstraint * _ next ; / / Additional constraints ANDed together
public :
const int _ left_inst ;
const char * _ left_op ;
const char * _ relation ;
const int _ right_inst ;
const char * _ right_op ;
public :
/ / Public Methods
PeepConstraint ( int left_inst , char * left_op , char * relation ,
int right_inst , char * right_op ) ;
~ PeepConstraint ( ) ;
/ / Check if constraints use instruction at position
bool constrains_instruction ( int position ) ;
/ / Add another constraint
void append ( PeepConstraint * next_peep_constraint ) ;
/ / Access the next constraint in the list
PeepConstraint * next ( ) ;
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
class PeepReplace : public Form {
private :
char * _ rule ;
NameList _ instruction ;
NameList _ operand_inst_num ;
NameList _ operand_op_name ;
public :
/ / Public Methods
PeepReplace ( char * rule ) ;
~ PeepReplace ( ) ;
/ / Add contents of peepreplace
void add_instruction ( char * root ) ;
void add_operand ( int inst_num , char * inst_operand ) ;
/ / Access contents of peepreplace
void reset ( ) ;
void next_instruction ( const char * & root ) ;
void next_operand ( int & inst_num , const char * & inst_operand ) ;
/ / Utilities
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
class PeepChild : public Form {
public :
const int _ inst_num ; / / Number of instruction ( - 1 if only named )
const char * _ inst_op ; / / Instruction ' s operand , NULL if number = = - 1
const char * _ inst_name ; / / Name of the instruction
public :
PeepChild ( char * inst_name )
: _ inst_num ( - 1 ) , _ inst_op ( NULL ) , _ inst_name ( inst_name ) { } ;
PeepChild ( int inst_num , char * inst_op , char * inst_name )
: _ inst_num ( inst_num ) , _ inst_op ( inst_op ) , _ inst_name ( inst_name ) { } ;
~ PeepChild ( ) ;
bool use_leaf_operand ( ) { return _ inst_num ! = - 1 ; } ;
bool generate_an_instruction ( ) { return _ inst_num = = - 1 ; }
void dump ( ) ;
void output ( FILE * fp ) ;
} ;
# endif / / SHARE_ADLC_FORMSOPT_HPP
Messung V0.5 in Prozent C=90 H=95 G=92
¤ Dauer der Verarbeitung: 0.28 Sekunden
(vorverarbeitet am 2026-09-11)
¤
*© Formatika GbR, Deutschland
2026-08-25
Neuigkeiten
Aktuelles
Motto des Tages
Open Source Software
Jenseits des Üblichen ....
Besucherstatistik
Statistik
#Sources=1019547
#Domains=890699