In Nanojit, LIR is the source language for compilation to machine code. LIR stands for lowlevel intermediate representation. It is a typed assembly language.
The LIR instruction set is best learnt by reading nanojit/LIRopcode.tbl. Code for manipulating LIR is in nanojit/LIR.h.
Nanojit LIR instruction cheat sheet.Also in pdf format see attachment.
Category  OP Code  Code Name  Return Type  Featured  Description 
Miscellaneous  0  start  void 
 start of a fragment 
1  regfence  void 
 A register fence causes no code to be generated, but it affects register allocation so that no registers are live when it is reached.  
2  skip  void 
 links code chunks.  
3  parami  integer  32 bit  load an int parameter (register or stack location).  
4  paramq  quad  64 bit  load a quad parameter (register or stack location).  
5  allocp  pointer 
 allocate stack space (result is an address)  
6  reti  void 
 return an int  
7  retq  void  64 bit  return a quad  
8  retd  void 
 return a double  
9  livei  void 
 extend live range of an int  
10  liveq  void  64 bit  extend live range of a quad  
11  lived  void 
 extend live range of a double  
12  file  void 
 source filename for debug symbols  
13  line  void 
 source line number for debug symbols  
14  comment  void 
 a comment shown, on its own line, in LIR dumps  
15  not in use 


 
Load  16  not in use 



17  ldc2i  integer 
 load char and signextend to an int  
18  lds2i  integer 
 load short and signextend to an int  
19  lduc2ui  integer 
 load unsigned char and zeroextend to an unsigned int  
20  ldus2ui  integer 
 load unsigned short and zeroextend to an unsigned int  
21  ldi  integer 
 load int  
22  ldq  quad  64 bit  load quad  
23  ldd  double 
 load double  
24  ldf2d  double 
 load float and extend to a double  
Store  25  sti2c  void 
 store int truncated to char 
26  sti2s  void 
 store int truncated to short  
27  sti  void 
 store int  
28  stq  void  64 bit  store quad  
29  std  void 
 store double  
30  std2f  void 
 store double as a float (losing precision)  
31  not in use 


 
Call  32  not in use 



33  callv  void 
 call subroutine that returns void  
34  calli  integer 
 call subroutine that returns an int  
35  callq  quad  64 bit  call subroutine that returns a quad  
36  calld  double 
 call subroutine that returns a double  
Branch  37  j  void 
 jump always 
38  jt  void 
 jump if true  
39  jf  void 
 jump if false  
40  jtbl  void 
 jump to address in table  
41  label  void 
 a jump target (no machine code is emitted for this)  
42  not in use 


 
Guards  43  x  void 
 exit always 
44  xt  void 
 exit if true  
45  xf  void 
 exit if false  
46  xtbl  void 
 exit via indirect jump  
47  xbarrier  void 
 A LIR_xbarrier cause no code to be generated, but it acts like a nevertaken guard in that it inhibits certain optimisations, such as dead stack store elimination.  
48  not in use 


 
Immediate  49  immi 

 int immediate 
50  immq 
 64 bit  quad immediate  
51  immd 

 double immediate  
52  not in use 


 
Comparisons  53  eqi  integer 
 int equality 
54  lti  integer 
 signed int lessthan  
55  gti  integer 
 signed int greaterthan  
56  lei  integer 
 signed int lessthanorequal  
57  gei  integer 
 signed int greaterthanorequal  
58  ltui  integer 
 unsigned int lessthan  
59  gtui  integer 
 unsigned int greaterthan  
60  leui  integer 
 unsigned int lessthanorequal  
61  geui  integer 
 unsigned int greaterthanorequal  
62  not in use 


 
63  eqq  integer  64 bit  quad equality  
64  ltq  integer  64 bit  signed quad lessthan  
65  gtq  integer  64 bit  signed quad greaterthan  
66  leq  integer  64 bit  signed quad lessthanorequal  
67  geq  integer  64 bit  signed quad greaterthanorequal  
68  ltuq  integer  64 bit  unsigned quad lessthan  
69  gtuq  integer  64 bit  unsigned quad greaterthan  
70  leuq  integer  64 bit  unsigned quad lessthanorequal  
71  geuq  integer  64 bit  unsigned quad greaterthanorequal  
72  not in use 


 
Arithmetic  73  eqd  integer 
 double equality 
74  ltd  integer 
 double lessthan  
75  gtd  integer 
 double greaterthan  
76  led  integer 
 double lessthanorequal  
77  ged  integer 
 double greaterthanorequal  
78  negi  integer 
 negate int  
79  addi  integer 
 add int  
80  subi  integer 
 subtract int  
81  muli  integer 
 multiply int  
82  divi  integer  i386/64  divide int  
83  modi  integer 
 modulo int  LIR_modi is a hack. It's only used on i386/X64. The operand is the result of a LIR_divi because on i386/X64 div and mod results are computed by the same instruction.  
84  noti  integer 
 bitwiseNOT int  
85  andi  integer 
 bitwiseAND int  
86  ori  integer 
 bitwiseOR int  
87  xori  integer 
 bitwiseXOR int  
88  lshi  integer 
 left shift int  
89  rshi  integer 
 right shift int (>>)  
90  rshui  integer 
 right shift unsigned int (>>>)  
91  addq  quad  64 bit  add quad  
92  subq  quad  64 bit  subtract quad  
93  andq  quad  64 bit  bitwiseAND quad  
94  orq  quad  64 bit  bitwiseOR quad  
95  xorq  quad  64 bit  bitwiseXOR quad  
96  lshq  quad  64 bit  left shift quad,2nd operand is an int  
97  rshq  quad  64 bit  right shift quad, 2nd operand is an int  
98  rshuq  quad  64 bit  right shift unsigned quad; 2nd operand is an int  
99  negd  double 
 negate double  
100  addd  double 
 add double  
101  subd  double 
 subtract double  
102  muld  double 
 multiply double  
103  divd  double 
 divide double  
104  modd  double 
 modulo double LIR_modd is just a placeholder opcode, ie. the backends cannot generate code for it.It's used in TraceMonkey briefly but is always demoted to a LIR_modl or converted to a function call before Nanojit has to do anything serious with it.  
105  cmovi  integer 
 conditional move int  
106  cmovq  quad  64 bit  conditional move quad  
107  cmovd  double 
 conditional move double  
Conversions  108  i2q  quad  64 bit  signextend int to quad 
109  ui2uq  quad  64 bit  zeroextend unsigned int to unsigned quad  
110  q2i  integer  64 bit  truncate quad to int (removes the high 32 bits)  
111  i2d  double 
 convert int to double  
112  ui2d  double 
 convert unsigned int to double  
113  d2i  integer 
 convert double to int (no exceptions raised)  
114  dasq  quad  64 bit  interpret the bits of a double as a quad  
115  qasd  double  64 bit  interpret the bits of a quad as a double  
Overflow arithmetic  116  addxovi  integer 
 add int and exit on overflow 
117  subxovi  integer 
 subtract int and exit on overflow  
118  mulxovi  integer 
 multiply int and exit on overflow  
119  addjovi  integer 
 add int and branch on overflow  
120  subjovi  integer 
 subtract int and branch on overflow  
121  muljovi  integer 
 multiply int and branch on overflow  
122  addjovq  quad  64 bit  add quad and branch on overflow  
123  subjovq  quad  64 bit  subtract quad and branch on overflow  
SoftFloat  124  dlo2i  integer  SoftFloat  get the low 32 bits of a double as an int 
125  dhi2i  integer  SoftFloat  get the high 32 bits of a double as an int  
126  ii2d  double  SoftFloat  join two ints (1st arg is low bits, 2nd is high)  
 127  hcalli  integer 
 LIR_hcalli is a hack that's only used on 32bit platforms that use SoftFloat. Its operand is always a LIR_calli, but one that specifies a function that returns a double. It indicates that the double result is returned via two 32bit integer registers. The result is always used as the second operand of a LIR_ii2d. 