Classes | Namespaces | Defines | Typedefs | Enumerations | Functions

Assembler.h File Reference

Classes

class  nanojit::AR
class  nanojit::AR::Iter
class  nanojit::Noise
class  nanojit::LabelState
class  nanojit::LabelStateMap
class  nanojit::Assembler
 Information about the activation record for the method is built up as we generate machine code. More...

Namespaces

namespace  nanojit

Defines

#define STACK_GRANULARITY   sizeof(void *)
 Some notes on this Assembler (Emitter).
#define AVMPLUS_ALIGN16(type)   type __attribute__ ((aligned (16)))
#define SWAP(t, a, b)   do { t tmp = a; a = b; b = tmp; } while (0)

Typedefs

typedef SeqBuilder< NIns * > nanojit::NInsList
typedef HashMap< NIns *, LIns * > nanojit::NInsMap
typedef HashMap< SideExit
*, RegAlloc * > 
nanojit::RegAllocMap
 map tracking the register allocation state at each bailout point (represented by SideExit*) in a trace fragment.

Enumerations

enum  nanojit::AssmError { nanojit::None = 0, nanojit::StackFull, nanojit::UnknownBranch, nanojit::BranchTooFar }

Functions

int32_t nanojit::arDisp (LIns *ins)
int32_t nanojit::deprecated_disp (LIns *ins)

Define Documentation

#define AVMPLUS_ALIGN16 (   type  )     type __attribute__ ((aligned (16)))
#define STACK_GRANULARITY   sizeof(void *)

Some notes on this Assembler (Emitter).

The class RegAlloc is essentially the register allocator from MIR

The Assembler class parses the LIR instructions starting at any point and converts them to machine code. It does the translation using expression trees which are simply LIR instructions in the stream that have side-effects. Any other instruction in the stream is simply ignored. This approach is interesting in that dead code elimination occurs for 'free', strength reduction occurs fairly naturally, along with some other optimizations.

A negative is that we require state as we 'push' and 'pop' nodes along the tree. Also, this is most easily performed using recursion which may not be desirable in the mobile environment.

#define SWAP (   t,
  a,
  b 
)    do { t tmp = a; a = b; b = tmp; } while (0)