Your Search Results

    LIR

    この記事はまだ日本語に翻訳されていません。MDN の翻訳はボランティアによって行われています。是非 MDN に登録し、私たちの力になって下さい。

    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: vivek.gangadharan, paritosh1010, Edwsmith, Jorend, nnethercote
    最終更新者: vivek.gangadharan,