122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /* Copyright (C) 2008 The Android Open Source Project
222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Licensed under the Apache License, Version 2.0 (the "License");
422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * you may not use this file except in compliance with the License.
522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * You may obtain a copy of the License at
622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * http://www.apache.org/licenses/LICENSE-2.0
822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Unless required by applicable law or agreed to in writing, software
1022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * distributed under the License is distributed on an "AS IS" BASIS,
1122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * See the License for the specific language governing permissions and
1322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * limitations under the License.
1422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
1522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
1622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
1722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * File: header.S
1822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
1922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
2022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
2122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * IA32 calling convention and general notes:
2222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
2322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * EAX, ECX, EDX - general purpose scratch registers (caller-saved);
2422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
2522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * The stack (%esp) - used to pass arguments to functions
2622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
2722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * EAX - holds the first 4 bytes of a return
2822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * EDX - holds the second 4 bytes of a return
2922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
3022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * EBX, ESI, EDI, EBP - are callee saved
3122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
3222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * CS, DS, SS - are segment registers
3322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * ES, FS, GS - are segment registers. We will try to avoid using these registers
3422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
3522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * The stack is "full descending". Only the arguments that do not fit    * in the first two arg registers are placed on the stack.
3622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "%esp" points to the first stacked argument (i.e. the 3rd arg).
3722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
3822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
3922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
4022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Mterp and IA32 notes
4122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
4222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * mem          nick      purpose
4322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * (%ebp)       rGLUE     InterpState base pointer (A.K.A. MterpGlue Pointer)
4422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * %esi         rPC       interpreted program counter, used for fetching
4522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *                        instructions
4622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * %ebx         rINST     first 16-bit code unit of current instruction
4722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * %edi         rFP       interpreted frame pointer, used for accessing
4822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *                        locals and args
4922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
5022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
5122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
5222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Includes
5322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
5422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
5522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#include "../common/asm-constants.h"
5622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
5722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
5822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Reserved registers
5922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
6022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
6122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rGLUE  (%ebp)
6222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINST   %ebx
6322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTbl  %bl
6422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTbh  %bh
6522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTw  %bx
6622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rPC     %esi
6722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rFP     %edi
6822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
6922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
7022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Temporary register used when finishing an opcode
7122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
7222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
7322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rFinish %edx
7422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
7522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
7622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Stack locations used for temporary data. For convenience.
7722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
7822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
7922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg0    4(%ebp)
8022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg1    8(%ebp)
8122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg2   12(%ebp)
8222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg3   16(%ebp)
8322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
8422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
8522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Save the PC and FP to the glue struct
8622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
8722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
8822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      SAVE_PC_FP_TO_GLUE _reg
8922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        rGLUE, \_reg
9022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        rPC, offGlue_pc(\_reg)
9122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        rFP, offGlue_fp(\_reg)
9222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
9322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
9422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
9522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Restore the PC and FP from the glue struct
9622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
9722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
9822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      LOAD_PC_FP_FROM_GLUE
9922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        rGLUE, rFP
10022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        offGlue_pc(rFP), rPC
10122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        offGlue_fp(rFP), rFP
10222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
10322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
10422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
10522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "Export" the PC to the stack frame, f/b/o future exception objects. This must
10622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * be done *before* something calls dvmThrowException.
10722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
10822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
10922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
11022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
11122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * It's okay to do this more than once.
11222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
11322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
11422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      EXPORT_PC
11522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
11622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
11722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
11822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
11922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Given a frame pointer, find the stack save area.
12022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * In C this is "((StackSaveArea*)(_fp) -1)".
12122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
12222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
12322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      SAVEAREA_FROM_FP  _reg
12422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    lea         -sizeofStackSaveArea(rFP), \_reg
12522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
12622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
12722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
12822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Get the 32-bit value from a dalvik register.
12922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
13022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
13122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      GET_VREG _vreg
13222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        (rFP,\_vreg, 4), \_vreg
13322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
13422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
13522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
13622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Set the 32-bit value from a dalvik register.
13722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
13822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
13922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      SET_VREG _reg _vreg
14022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movl        \_reg, (rFP,\_vreg, 4)
14122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
14222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
14322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
14422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the next instruction from rPC into rINST. Does not advance rPC.
14522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
14622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
14722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_INST
14822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzwl      (rPC), rINST
14922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
15022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
15122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
15222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the next instruction from the specified offset. Advances rPC
15322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * to point to the next instruction. "_count" is in 16-bit code units.
15422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    *
15522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This must come AFTER anything that can throw an exception, or the
15622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * exception catch may miss. (This also implies that it must come after
15722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * EXPORT_PC())
15822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
15922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
16022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_ADVANCE_INST _count
16122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    add         $$(\_count*2), rPC
16222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzwl      (rPC), rINST
16322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
16422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
16522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
16622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the next instruction from an offset specified by _reg. Updates
16722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * rPC to point to the next instruction. "_reg" must specify the distance
16822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * in bytes, *not* 16-bit code units, and may be a signed value.
16922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
17022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
17122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_ADVANCE_INST_RB _reg
17222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        \_reg, rPC
17322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzwl      (rPC), rINST
17422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
17522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
17622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
17722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch a half-word code unit from an offset past the current PC. The
17822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" value is in 16-bit code units. Does not advance rPC.
17922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * For example, given instruction of format: AA|op BBBB, it
18022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * fetches BBBB.
18122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
18222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
18322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH _count _reg
18422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzwl      (\_count*2)(rPC), \_reg
18522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
18622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
18722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
18822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch a half-word code unit from an offset past the current PC. The
18922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" value is in 16-bit code units. Does not advance rPC.
19022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This variant treats the value as signed.
19122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
19222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
19322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCHs _count _reg
19422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movswl      (\_count*2)(rPC), \_reg
19522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
19622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
19722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
19822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the first byte from an offset past the current PC. The
19922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" value is in 16-bit code units. Does not advance rPC.
20022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * For example, given instruction of format: AA|op CC|BB, it
20122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * fetches BB.
20222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
20322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
20422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_BB _count _reg
20522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2)(rPC), \_reg
20622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
20722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
20822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    /*
20922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the second byte from an offset past the current PC. The
21022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" value is in 16-bit code units. Does not advance rPC.
21122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * For example, given instruction of format: AA|op CC|BB, it
21222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * fetches CC.
21322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
21422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
21522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_CC _count _reg
21622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2 + 1)(rPC), \_reg
21722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
21822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
21922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
22022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch the second byte from an offset past the current PC. The
22122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" value is in 16-bit code units. Does not advance rPC.
22222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This variant treats the value as signed.
22322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
22422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
22522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_CCs _count _reg
22622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movsbl      (\_count*2 + 1)(rPC), \_reg
22722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
22822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
22922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
23022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
23122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Fetch one byte from an offset past the current PC.  Pass in the same
23222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * "_count" as you would for FETCH, and an additional 0/1 indicating which
23322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * byte of the halfword you want (lo/hi).
23422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
23522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
23622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FETCH_B _reg  _count  _byte
23722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2+\_byte)(rPC), \_reg
23822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
23922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
24022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
24122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Put the instruction's opcode field into the specified register.
24222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
24322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
24422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      GET_INST_OPCODE _reg
24522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      rINSTbl, \_reg
24622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
24722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
24822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
24922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Begin executing the opcode in _reg.
25022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
25122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
25222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      GOTO_OPCODE _reg
25322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    shl         $$${handler_size_bits}, \_reg
25422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        $$dvmAsmInstructionStart,\_reg
25522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *\_reg
25622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
25722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
25822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
25922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
26022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
26122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Macros pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
26222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * by using a jump table. _rFinish should must be the same register for
26322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * both macros.
26422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
26522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
26622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FFETCH _rFinish
26722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (rPC), \_rFinish
26822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
26922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
27022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FGETOP_JMPa _rFinish
27122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(rPC), rINST
27222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
27322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
27422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
27522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
27622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
27722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * by using a jump table. _rFinish and _count should must be the same register for
27822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * both macros.
27922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
28022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
28122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FFETCH_ADV _count _rFinish
28222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2)(rPC), \_rFinish
28322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
28422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
28522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FGETOP_JMP _count _rFinish
28622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2 + 1)(rPC), rINST
28722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        $$(\_count*2), rPC
28822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
28922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
29022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
29122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
29222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
29322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * by using a jump table. _rFinish and _reg should must be the same register for
29422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * both macros.
29522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
29622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
29722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FFETCH_ADV_RB _reg _rFinish
29822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_reg, rPC), \_rFinish
29922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
30022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
30122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FGETOP_RB_JMP _reg _rFinish
30222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(\_reg, rPC), rINST
30322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        \_reg, rPC
30422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
30522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
30622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
30722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
30822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_INST, GET_INST_OPCODE using
30922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * a jump table. This macro should be called before FINISH_JMP where
31022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * rFinish should be the same register containing the opcode value.
31122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This is an attempt to split up FINISH in order to reduce or remove
31222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * potential stalls due to the wait for rFINISH.
31322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
31422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
31522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_FETCH _rFinish
31622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (rPC), \_rFinish
31722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(rPC), rINST
31822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
31922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
32022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
32122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
32222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE using
32322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * a jump table. This macro should be called before FINISH_JMP where
32422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * rFinish should be the same register containing the opcode value.
32522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This is an attempt to split up FINISH in order to reduce or remove
32622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * potential stalls due to the wait for rFINISH.
32722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
32822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
32922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_FETCH_ADVANCE _count _rFinish
33022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2)(rPC), \_rFinish
33122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2 + 1)(rPC), rINST
33222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        $$(\_count*2), rPC
33322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
33422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
33522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
33622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE using
33722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * a jump table. This macro should be called before FINISH_JMP where
33822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * rFinish should be the same register containing the opcode value.
33922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * This is an attempt to split up FINISH in order to reduce or remove
34022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * potential stalls due to the wait for rFINISH.
34122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
34222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
34322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_FETCH_ADVANCE_RB _reg _rFinish
34422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_reg, rPC), \_rFinish
34522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(\_reg, rPC), rINST
34622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        \_reg, rPC
34722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
34822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
34922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
35022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up GOTO_OPCODE using a jump table. This macro should
35122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * be called after a FINISH_FETCH* instruction where rFinish should be the
35222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * same register containing the opcode value. This is an attempt to split up
35322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * FINISH in order to reduce or remove potential stalls due to the wait for rFINISH.
35422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
35522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
35622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_JMP _rFinish
35722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
35822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
35922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
36022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
36122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_INST, GET_INST_OPCODE, GOTO_OPCODE by using
36222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * a jump table. Uses a single macro - but it should be faster if we
36322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * split up the fetch for rFinish and the jump using rFinish.
36422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
36522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
36622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_A
36722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (rPC), rFinish
36822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(rPC), rINST
36922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
37022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
37122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
37222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
37322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE,
37422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * GOTO_OPCODE by using a jump table. Uses a single macro -
37522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * but it should be faster if we split up the fetch for rFinish
37622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * and the jump using rFinish.
37722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
37822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
37922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH _count
38022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2)(rPC), rFinish
38122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_count*2 + 1)(rPC), rINST
38222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        $$(\_count*2), rPC
38322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
38422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
38522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
38622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
38722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE,
38822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * GOTO_OPCODE by using a jump table. Uses a single macro -
38922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * but it should be faster if we split up the fetch for rFinish
39022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * and the jump using rFinish.
39122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
39222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
39322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .macro      FINISH_RB _reg _rFinish
39422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      (\_reg, rPC), \_rFinish
39522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    movzbl      1(\_reg, rPC), rINST
39622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    addl        \_reg, rPC
39722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
39822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .endm
39922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
40022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch   /*
40122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    * Hard coded helper values.
40222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    */
40322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
40422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.balign 16
40522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
40622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LdoubNeg:
40722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x8000000000000000
40822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
40922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.L64bits:
41022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0xFFFFFFFFFFFFFFFF
41122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
41222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LshiftMask2:
41322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x0000000000000000
41422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LshiftMask:
41522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x000000000000003F
41622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
41722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.Lvalue64:
41822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x0000000000000040
41922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
42022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvaluePosInfLong:
42122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x7FFFFFFFFFFFFFFF
42222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
42322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvalueNegInfLong:
42422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x8000000000000000
42522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
42622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvalueNanLong:
42722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch    .quad       0x0000000000000000
42822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
42922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LintMin:
43022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.long   0x80000000
43122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch
43222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LintMax:
433f8f23d402dc1eef107995b29ad4d91ee5b4e1c34Johnnie Birch.long   0x7FFFFFFF
434