lestes::backend_v2::workers::pi_cond_jmp_rewriter Class Reference

Performs conditional jump rewriting. More...

#include <pi_cond_jmp_rewriter.g.hh>

Inheritance diagram for lestes::backend_v2::workers::pi_cond_jmp_rewriter:

lestes::backend_v2::workers::worker_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

void process ()
 Rewrites conditional jumps.
ptr< ::lestes::backend_v2::structs::func_dataget_result ()
 Returns data of the currently processed function with rewritten jumps.
virtual ptr< reflection_listreflection_get () const
 for purposes of dumping
virtual ptr< field_list_listfield_values_get () const
 for purposes of dumping

Static Public Member Functions

static ptr< pi_cond_jmp_rewritercreate (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 First generated factory method for class pi_cond_jmp_rewriter.

Protected Member Functions

 pi_cond_jmp_rewriter (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 Generated constructor for class pi_cond_jmp_rewriter.
virtual void gc_mark ()
 Marking routine for class pi_cond_jmp_rewriter.

Static Private Attributes

static ptr< reflection_listreflection = reflection

Detailed Description

Performs conditional jump rewriting.

A sequence like this (that are generated by the front-end):

cmp_res = cmp(a,b) boolean_res = set_boolean_if_greater(cmp_res) jump_if_false(label)

rewrites to:

cmp_res = cmp(a,b) jump_if_not_greater(cmp_res)

The result contains one less instruction and a target architecture likely supports instruction jump_if_not_greater.

Definition at line 48 of file pi_cond_jmp_rewriter.g.hh.


Constructor & Destructor Documentation

lestes::backend_v2::workers::pi_cond_jmp_rewriter::pi_cond_jmp_rewriter ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [protected]

Generated constructor for class pi_cond_jmp_rewriter.

Generated constructor for class pi_cond_jmp_rewriter.

Author:
lsg

Definition at line 36 of file pi_cond_jmp_rewriter.g.cc.

Referenced by create().

00037         : worker_base(a__worker_base__data)
00038 {}


Member Function Documentation

void lestes::backend_v2::workers::pi_cond_jmp_rewriter::process (  )  [virtual]

Rewrites conditional jumps.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 20 of file pi_cond_jmp_rewriter.cc.

References lestes::backend_v2::workers::worker_base::data_get().

00020                                    {
00021 
00022         ptr<visitor_pi_pi2id> pi_id_getter = visitor_pi_pi2id::create();
00023         
00024         ptr<pi_list__type> body = data_get()->pi_body_get();
00025         
00026         for(pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) {
00027                 
00028                 if ( visitor_pi_pi2id::PI_BF!= (visitor_pi_pi2id::kind_type)(*it)->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00029                         continue;
00030                 }
00031                 
00032                 ptr<pi_bf> bf = (*it).dncast<pi_bf>();
00033                 ptr<pi_pi> setter_generic = bf->condition_get()->origin_get();
00034                 
00035                 ptr<pi_preg> out_cmp_res = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->conditional_preg_type_get());
00036                                                                         
00037                 ptr<pi_cb_single_label_target> out_jmp = NULL;
00038                 ptr<pi_tdtpi> setter = NULL;
00039                 
00040                 switch (setter_generic->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00041                         case visitor_pi_pi2id::PI_SBG: {                
00042                                 setter = setter_generic.dncast<pi_tdtpi>();
00043                                 
00044                                 out_jmp = pi_bng::create(
00045                                         bf->psp_get(),
00046                                         bf->nsp_get(),
00047                                         bf->level_get(),
00048                                         out_cmp_res,
00049                                         bf->destination_get()); 
00050                         } break;
00051                         
00052                         case visitor_pi_pi2id::PI_SBL: {                
00053                                 setter = setter_generic.dncast<pi_tdtpi>();
00054                                 
00055                                 out_jmp = pi_bnl::create(
00056                                         bf->psp_get(),
00057                                         bf->nsp_get(),
00058                                         bf->level_get(),
00059                                         out_cmp_res,
00060                                         bf->destination_get()); 
00061                         } break;
00062                         
00063                         case visitor_pi_pi2id::PI_SBE: {                
00064                                 setter = setter_generic.dncast<pi_tdtpi>();
00065                                 
00066                                 out_jmp = pi_bne::create(
00067                                         bf->psp_get(),
00068                                         bf->nsp_get(),
00069                                         bf->level_get(),
00070                                         out_cmp_res,
00071                                         bf->destination_get()); 
00072                         } break;
00073                         
00074                         case visitor_pi_pi2id::PI_SBNG: {               
00075                                 setter = setter_generic.dncast<pi_tdtpi>();
00076                                 
00077                                 out_jmp = pi_bg::create(
00078                                         bf->psp_get(),
00079                                         bf->nsp_get(),
00080                                         bf->level_get(),
00081                                         out_cmp_res,
00082                                         bf->destination_get()); 
00083                         } break;
00084                         
00085                         case visitor_pi_pi2id::PI_SBNL: {               
00086                                 setter = setter_generic.dncast<pi_tdtpi>();
00087                                 
00088                                 out_jmp = pi_bl::create(
00089                                         bf->psp_get(),
00090                                         bf->nsp_get(),
00091                                         bf->level_get(),
00092                                         out_cmp_res,
00093                                         bf->destination_get()); 
00094                         } break;
00095                         
00096                         case visitor_pi_pi2id::PI_SBNE: {               
00097                                 setter = setter_generic.dncast<pi_tdtpi>();
00098                                 
00099                                 out_jmp = pi_be::create(
00100                                         bf->psp_get(),
00101                                         bf->nsp_get(),
00102                                         bf->level_get(),
00103                                         out_cmp_res,
00104                                         bf->destination_get()); 
00105                         } break;
00106                         
00107                 }
00108                 
00109                 if ( !out_jmp ) {
00110                         continue;
00111                 }
00112                 
00113                 ptr<pi_cmp> out_cmp = pi_cmp::create(
00114                                                                 setter->psp_get(),
00115                                                                 setter->nsp_get(),
00116                                                                 setter->level_get(),
00117                                                                 setter->left_get(),
00118                                                                 setter->right_get(),
00119                                                                 out_cmp_res,
00120                                                                 out_cmp_res->type_get(),
00121                                                                 setter->type2_get());
00122                                                                 
00123                 out_cmp_res->origin_set(out_cmp);
00124                 
00125                 pi_list__type::iterator it_replace = ::std::find(body->begin(),body->end(),setter);
00126                 
00127                 *it_replace = out_cmp;
00128                 *it = out_jmp;
00129         }
00130 }

ptr< func_data > lestes::backend_v2::workers::pi_cond_jmp_rewriter::get_result (  )  [virtual]

Returns data of the currently processed function with rewritten jumps.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 135 of file pi_cond_jmp_rewriter.cc.

References lestes::backend_v2::workers::worker_base::data_get().

00135                                                 {
00136         return data_get();
00137 }

ptr< pi_cond_jmp_rewriter > lestes::backend_v2::workers::pi_cond_jmp_rewriter::create ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [static]

First generated factory method for class pi_cond_jmp_rewriter.

This factory method for class pi_cond_jmp_rewriter takes values of all fields as arguments.

Author:
lsg

Definition at line 27 of file pi_cond_jmp_rewriter.g.cc.

References pi_cond_jmp_rewriter().

00028 {
00029         return ptr< pi_cond_jmp_rewriter > ( new pi_cond_jmp_rewriter(a__worker_base__data) );
00030 }

ptr< object::reflection_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::reflection_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 40 of file pi_cond_jmp_rewriter.g.cc.

References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().

00041 {
00042         if (!reflection) {
00043                 typedef class_reflection::field_metadata md;
00044                 typedef class_reflection::field_metadata_list mdlist;
00045                 ptr<mdlist> mdl = mdlist::create();
00046                 reflection = reflection_list::create( worker_base::reflection_get() );
00047                 reflection->push_back( class_reflection::create( "pi_cond_jmp_rewriter", mdl ) );
00048         }
00049         return reflection;
00050 }

ptr< object::field_list_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::field_values_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 52 of file pi_cond_jmp_rewriter.g.cc.

References lestes::backend_v2::workers::worker_base::field_values_get().

00053 {
00054         ptr < field_list_list > result = worker_base::field_values_get();
00055         return result;
00056 }

void lestes::backend_v2::workers::pi_cond_jmp_rewriter::gc_mark ( void   )  [protected, virtual]

Marking routine for class pi_cond_jmp_rewriter.

Marking routine is used for garbage collection.

Author:
lsg

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 63 of file pi_cond_jmp_rewriter.g.cc.

References lestes::backend_v2::workers::worker_base::gc_mark().

00064 {
00065         worker_base::gc_mark();
00066 }


Member Data Documentation

ptr< object::reflection_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::reflection = reflection [static, private]

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 75 of file pi_cond_jmp_rewriter.g.hh.

Referenced by reflection_get().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:24:11 2007 for lestes by doxygen 1.5.1-20070107