• Skip to main content
  • Select language
  • Skip to search
MDN Web Docs
  • Technologies
    • HTML
    • CSS
    • JavaScript
    • Graphics
    • HTTP
    • APIs / DOM
    • WebExtensions
    • MathML
  • References & Guides
    • Learn web development
    • Tutorials
    • References
    • Developer Guides
    • Accessibility
    • Game development
    • ...more docs
Archive of obsolete content
  1. MDN
  2. Archive of obsolete content
  3. Archived Mozilla and build documentation
  4. Nanojit
  5. LIR

LIR

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, Feb 29, 2016, 11:29:16 AM

  1. .htaccess ( hypertext access )
  2. <input> archive
  3. Add-ons
    1. Add-ons
    2. Firefox addons developer guide
    3. Interaction between privileged and non-privileged pages
    4. Tabbed browser
    5. bookmarks.export()
    6. bookmarks.import()
  4. Adding preferences to an extension
  5. An Interview With Douglas Bowman of Wired News
  6. Apps
    1. Apps
    2. App Development API Reference
    3. Designing Open Web Apps
    4. Graphics and UX
    5. Open web app architecture
    6. Tools and frameworks
    7. Validating web apps with the App Validator
  7. Archived Mozilla and build documentation
    1. Archived Mozilla and build documentation
    2. ActiveX Control for Hosting Netscape Plug-ins in IE
    3. Archived SpiderMonkey docs
    4. Autodial for Windows NT
    5. Automated testing tips and tricks
    6. Automatic Mozilla Configurator
    7. Automatically Handle Failed Asserts in Debug Builds
    8. BlackConnect
    9. Blackwood
    10. Bonsai
    11. Bookmark Keywords
    12. Building TransforMiiX standalone
    13. Chromeless
    14. Creating a Firefox sidebar extension
    15. Creating a Microsummary
    16. Creating a Mozilla Extension
    17. Creating a Release Tag
    18. Creating a Skin for Firefox/Getting Started
    19. Creating a Skin for Mozilla
    20. Creating a Skin for SeaMonkey 2.x
    21. Creating a hybrid CD
    22. Creating regular expressions for a microsummary generator
    23. DTrace
    24. Dehydra
    25. Developing New Mozilla Features
    26. Devmo 1.0 Launch Roadmap
    27. Download Manager improvements in Firefox 3
    28. Download Manager preferences
    29. Drag and Drop
    30. Embedding FAQ
    31. Embedding Mozilla in a Java Application using JavaXPCOM
    32. Error Console
    33. Exception logging in JavaScript
    34. Existing Content
    35. Extension Frequently Asked Questions
    36. Fighting Junk Mail with Netscape 7.1
    37. Firefox Sync
    38. Force RTL
    39. GRE
    40. Gecko Coding Help Wanted
    41. HTTP Class Overview
    42. Hacking wiki
    43. Help Viewer
    44. Helper Apps (and a bit of Save As)
    45. Hidden prefs
    46. How to Write and Land Nanojit Patches
    47. Introducing the Audio API extension
    48. Java in Firefox Extensions
    49. JavaScript crypto
    50. Jetpack
    51. Litmus tests
    52. Makefile.mozextension.2
    53. Microsummary topics
    54. Migrate apps from Internet Explorer to Mozilla
    55. Monitoring downloads
    56. Mozilla Application Framework
    57. Mozilla Crypto FAQ
    58. Mozilla Modules and Module Ownership
    59. Mozprocess
    60. Mozprofile
    61. Mozrunner
    62. Nanojit
    63. New Skin Notes
    64. Persona
    65. Plug-n-Hack
    66. Plugin Architecture
    67. Porting NSPR to Unix Platforms
    68. Priority Content
    69. Prism
    70. Proxy UI
    71. Remote XUL
    72. SXSW 2007 presentations
    73. Space Manager Detailed Design
    74. Space Manager High Level Design
    75. Standalone XPCOM
    76. Stress testing
    77. Structure of an installable bundle
    78. Supporting private browsing mode
    79. Table Cellmap
    80. Table Cellmap - Border Collapse
    81. Table Layout Regression Tests
    82. Table Layout Strategy
    83. Tamarin
    84. The Download Manager schema
    85. The life of an HTML HTTP request
    86. The new nsString class implementation (1999)
    87. TraceVis
    88. Treehydra
    89. URIScheme
    90. URIs and URLs
    91. Using Monotone With Mozilla CVS
    92. Using SVK With Mozilla CVS
    93. Using addresses of stack variables with NSPR threads on win16
    94. Venkman
    95. Video presentations
    96. Why Embed Gecko
    97. XML in Mozilla
    98. XPInstall
    99. XPJS Components Proposal
    100. XRE
    101. XTech 2005 Presentations
    102. XTech 2006 Presentations
    103. XUL Explorer
    104. XULRunner
    105. ant script to assemble an extension
    106. calICalendarView
    107. calICalendarViewController
    108. calIFileType
    109. xbDesignMode.js
  8. Archived open Web documentation
    1. Archived open Web documentation
    2. Browser Detection and Cross Browser Support
    3. Browser Feature Detection
    4. Displaying notifications (deprecated)
    5. E4X
    6. E4X Tutorial
    7. LiveConnect
    8. MSX Emulator (jsMSX)
    9. Old Proxy API
    10. Properly Using CSS and JavaScript in XHTML Documents
    11. Reference
    12. Scope Cheatsheet
    13. Server-Side JavaScript
    14. Sharp variables in JavaScript
    15. Standards-Compliant Authoring Tools
    16. Using JavaScript Generators in Firefox
    17. Window.importDialog()
    18. Writing JavaScript for XHTML
    19. XForms
    20. background-size
    21. forEach
  9. B2G OS
    1. B2G OS
    2. Automated Testing of B2G OS
    3. B2G OS APIs
    4. B2G OS add-ons
    5. B2G OS architecture
    6. B2G OS build prerequisites
    7. B2G OS phone guide
    8. Building B2G OS
    9. Building and installing B2G OS
    10. Building the B2G OS Simulator
    11. Choosing how to run Gaia or B2G
    12. Customization with the .userconfig file
    13. Debugging on Firefox OS
    14. Developer Mode
    15. Developing Firefox OS
    16. Firefox OS Simulator
    17. Firefox OS apps
    18. Firefox OS board guide
    19. Firefox OS developer release notes
    20. Firefox OS security
    21. Firefox OS usage tips
    22. Gaia
    23. Installing B2G OS on a mobile device
    24. Introduction to Firefox OS
    25. Mulet
    26. Open web apps quickstart
    27. Pandaboard
    28. PasscodeHelper Internals
    29. Porting B2G OS
    30. Preparing for your first B2G build
    31. Resources
    32. Running tests on Firefox OS: A guide for developers
    33. The B2G OS platform
    34. Troubleshooting B2G OS
    35. Using the App Manager
    36. Using the B2G emulators
    37. Web Bluetooth API (Firefox OS)
    38. Web Telephony API
    39. Web applications
  10. Beginner tutorials
    1. Beginner tutorials
    2. Creating reusable content with CSS and XBL
    3. Underscores in class and ID Names
    4. XML data
    5. XUL user interfaces
  11. Case Sensitivity in class and id Names
  12. Creating a dynamic status bar extension
  13. Creating a status bar extension
  14. Gecko Compatibility Handbook
  15. Getting the page URL in NPAPI plugin
  16. Index
  17. Inner-browsing extending the browser navigation paradigm
  18. Install.js
  19. JXON
  20. List of Former Mozilla-Based Applications
  21. List of Mozilla-Based Applications
  22. Localizing an extension
  23. MDN
    1. MDN
    2. Content kits
  24. MDN "meta-documentation" archive
    1. MDN "meta-documentation" archive
    2. Article page layout guide
    3. Blog posts to integrate into documentation
    4. Current events
    5. Custom CSS classes for MDN
    6. Design Document
    7. DevEdge
    8. Developer documentation process
    9. Disambiguation
    10. Documentation Wishlist
    11. Documentation planning and tracking
    12. Editing MDN pages
    13. Examples
    14. Existing Content/DOM in Mozilla
    15. External Redirects
    16. Finding the right place to document bugs
    17. Getting started as a new MDN contributor
    18. Landing page layout guide
    19. MDN content on WebPlatform.org
    20. MDN page layout guide
    21. MDN subproject list
    22. Needs Redirect
    23. Page types
    24. RecRoom documentation plan
    25. Remove in-content iframes
    26. Team status board
    27. Trello
    28. Using the Mozilla Developer Center
    29. Welcome to the Mozilla Developer Network
    30. Writing chrome code documentation plan
    31. Writing content
  25. MMgc
  26. Makefile - .mk files
  27. Marketplace
    1. Marketplace
    2. API
    3. Monetization
    4. Options
    5. Publishing
  28. Mozilla release FAQ
  29. Newsgroup summaries
    1. Newsgroup summaries
    2. Format
    3. Mozilla.dev.apps.firefox-2006-09-29
    4. Mozilla.dev.apps.firefox-2006-10-06
    5. mozilla-dev-accessibility
    6. mozilla-dev-apps-calendar
    7. mozilla-dev-apps-firefox
    8. mozilla-dev-apps-thunderbird
    9. mozilla-dev-builds
    10. mozilla-dev-embedding
    11. mozilla-dev-extensions
    12. mozilla-dev-i18n
    13. mozilla-dev-l10n
    14. mozilla-dev-planning
    15. mozilla-dev-platform
    16. mozilla-dev-quality
    17. mozilla-dev-security
    18. mozilla-dev-tech-js-engine
    19. mozilla-dev-tech-layout
    20. mozilla-dev-tech-xpcom
    21. mozilla-dev-tech-xul
    22. mozilla.dev.apps.calendar
    23. mozilla.dev.tech.js-engine
  30. Obsolete: XPCOM-based scripting for NPAPI plugins
  31. Plugins
    1. Plugins
    2. Adobe Flash
    3. External resources for plugin creation
    4. Logging Multi-Process Plugins
    5. Monitoring plugins
    6. Multi-process plugin architecture
    7. NPAPI plugin developer guide
    8. NPAPI plugin reference
    9. Samples and Test Cases
    10. Shipping a plugin as a Toolkit bundle
    11. Supporting private browsing in plugins
    12. The First Install Problem
    13. Writing a plugin for Mac OS X
    14. XEmbed Extension for Mozilla Plugins
  32. SAX
  33. Security
    1. Security
    2. Digital Signatures
    3. Encryption and Decryption
    4. Introduction to Public-Key Cryptography
    5. Introduction to SSL
    6. NSPR Release Engineering Guide
    7. SSL and TLS
  34. Solaris 10 Build Prerequisites
  35. Sunbird Theme Tutorial
  36. Table Reflow Internals
  37. Tamarin Tracing Build Documentation
  38. The Basics of Web Services
  39. Themes
    1. Themes
    2. Building a Theme
    3. Common Firefox theme issues and solutions
    4. Creating a Skin for Firefox
    5. Making sure your theme works with RTL locales
    6. Theme changes in Firefox 2
    7. Theme changes in Firefox 3
    8. Theme changes in Firefox 3.5
    9. Theme changes in Firefox 4
  40. Updating an extension to support multiple Mozilla applications
  41. Using IO Timeout And Interrupt On NT
  42. Using SSH to connect to CVS
  43. Using workers in extensions
  44. WebVR
    1. WebVR
    2. WebVR environment setup
  45. XQuery
  46. XUL Booster
  47. XUL Parser in Python