Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

In Nanojit, LIR is the source language for compilation to machine code. LIR stands for low-level 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 sign-extend to an int

18

lds2i

integer

 

load short and sign-extend to an int

19

lduc2ui

integer

 

load unsigned char and zero-extend to an unsigned int

20

ldus2ui

integer

 

load unsigned short and zero-extend 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 never-taken 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 less-than

55

gti

integer

 

signed int greater-than

56

lei

integer

 

signed int less-than-or-equal

57

gei

integer

 

signed int greater-than-or-equal

58

ltui

integer

 

unsigned int less-than

59

gtui

integer

 

unsigned int greater-than

60

leui

integer

 

unsigned int less-than-or-equal

61

geui

integer

 

unsigned int greater-than-or-equal

62

not in use

 

 

 

63

eqq

integer

64 bit

quad equality

64

ltq

integer

64 bit

signed quad less-than

65

gtq

integer

64 bit

signed quad greater-than

66

leq

integer

64 bit

signed quad less-than-or-equal

67

geq

integer

64 bit

signed quad greater-than-or-equal

68

ltuq

integer

64 bit

unsigned quad less-than

69

gtuq

integer

64 bit

unsigned quad greater-than

70

leuq

integer

64 bit

unsigned quad less-than-or-equal

71

geuq

integer

64 bit

unsigned quad greater-than-or-equal

72

not in use

 

 

 

Arithmetic

73

eqd

integer

 

double equality

74

ltd

integer

 

double less-than

75

gtd

integer

 

double greater-than

76

led

integer

 

double less-than-or-equal

77

ged

integer

 

double greater-than-or-equal

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

 

bitwise-NOT int

85

andi

integer

 

bitwise-AND int

86

ori

integer

 

bitwise-OR int

87

xori

integer

 

bitwise-XOR 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

bitwise-AND quad

94

orq

quad

64 bit

bitwise-OR quad

95

xorq

quad

64 bit

bitwise-XOR 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 place-holder opcode, ie. the back-ends 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

sign-extend int to quad

109

ui2uq

quad

64 bit

zero-extend 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 32-bit 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 32-bit integer registers.  The result is always used as the second operand of a LIR_ii2d.

Document Tags and Contributors

 Contributors to this page: teoli, vivek.gangadharan, nnethercote, paritosh1010, Jorend, Edwsmith
 Last updated by: teoli,