1e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
2e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Copyright (C) 2012 The Android Open Source Project
3e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
4e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Licensed under the Apache License, Version 2.0 (the "License");
5e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * you may not use this file except in compliance with the License.
6e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * You may obtain a copy of the License at
7e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
8e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      http://www.apache.org/licenses/LICENSE-2.0
9e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
10e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Unless required by applicable law or agreed to in writing, software
11e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * distributed under the License is distributed on an "AS IS" BASIS,
12e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * See the License for the specific language governing permissions and
14e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * limitations under the License.
15e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
16e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_DEX_QUICK_MIPS_MIPS_LIR_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_DEX_QUICK_MIPS_MIPS_LIR_H_
19e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/compiler_internals.h"
21e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
22e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
24e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
25e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Runtime register conventions.
26e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * zero is always the value 0
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * at is scratch (normally used as temp reg by assembler)
29e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * v0, v1 are scratch (normally hold subroutine return values)
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * a0-a3 are scratch (normally hold subroutine arguments)
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * t0-t8 are scratch
32e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * t9 is scratch (normally used for function calls)
33f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee * s0 (rMIPS_SUSPEND) is reserved [holds suspend-check counter]
34f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee * s1 (rMIPS_SELF) is reserved [holds current &Thread]
35e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * s2-s7 are callee save (promotion target)
36e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * k0, k1 are reserved for use by interrupt handlers
37e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * gp is reserved for global pointer
38e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * sp is reserved
39e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * s8 is callee save (promotion target)
40e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * ra is scratch (normally holds the return addr)
41e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
42e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Preserved across C calls: s0-s8
43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Trashed across C calls: at, v0-v1, a0-a3, t0-t9, gp, ra
44e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
45e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Floating pointer registers
46e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * NOTE: there are 32 fp registers (16 df pairs), but currently
47e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *       only support 16 fp registers (8 df pairs).
48e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * f0-f15
49e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * df0-df7, where df0={f0,f1}, df1={f2,f3}, ... , df7={f14,f15}
50e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
51e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * f0-f15 (df0-df7) trashed across C calls
52e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
53e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * For mips32 code use:
54e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      a0-a3 to hold operands
55e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      v0-v1 to hold results
56e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      t0-t9 for temps
57e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
58e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * All jump/branch instructions have a delay slot after it.
59e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
60e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *  Stack frame diagram (stack grows down, higher addresses at top):
61e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
62e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +------------------------+
63e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | IN[ins-1]              |  {Note: resides in caller's frame}
64e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * |       .                |
65e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | IN[0]                  |
66e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | caller's Method*       |
67e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +========================+  {Note: start of callee's frame}
68e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | spill region           |  {variable sized - will include lr if non-leaf.}
69e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +------------------------+
70e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | ...filler word...      |  {Note: used as 2nd word of V[locals-1] if long]
71e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +------------------------+
72e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | V[locals-1]            |
73e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | V[locals-2]            |
74e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * |      .                 |
75e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * |      .                 |
76e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | V[1]                   |
77e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | V[0]                   |
78e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +------------------------+
79e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * |  0 to 3 words padding  |
80e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +------------------------+
81e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | OUT[outs-1]            |
82e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | OUT[outs-2]            |
83e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * |       .                |
84e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * | OUT[0]                 |
85fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee * | cur_method*            | <<== sp w/ 16-byte alignment
86e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * +========================+
87e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
88e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
89e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
90e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define LOWORD_OFFSET 0
91e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define HIWORD_OFFSET 4
922700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rARG0 rA0
932700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rARG0 rs_rA0
942700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rARG1 rA1
952700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rARG1 rs_rA1
962700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rARG2 rA2
972700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rARG2 rs_rA2
982700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rARG3 rA3
992700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rARG3 rs_rA3
1002700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rRESULT0 rV0
1012700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rRESULT0 rs_rV0
1022700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rRESULT1 rV1
1032700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rRESULT1 rs_rV1
104e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
1052700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFARG0 rF12
1062700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFARG0 rs_rF12
1072700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFARG1 rF13
1082700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFARG1 rs_rF13
1092700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFARG2 rF14
1102700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFARG2 rs_rF14
1112700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFARG3 rF15
1122700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFARG3 rs_rF15
1132700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFRESULT0 rF0
1142700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFRESULT0 rs_rF0
1152700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rFRESULT1 rF1
1162700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rFRESULT1 rs_rF1
117e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
11802031b185b4653e6c72e21f7a51238b903f6d638buzbee// Regs not used for Mips.
1192700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_LR RegStorage::kInvalidRegVal
1202700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_PC RegStorage::kInvalidRegVal
121b046e16d8b8da318d6055f9308950131f1255e08buzbee
122ec13743da80a80c1817cf6660c28917fc28846bcbuzbeeenum MipsResourceEncodingPos {
123ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsGPReg0   = 0,
124ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegSP    = 29,
125ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegLR    = 31,
1267934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFPReg0   = 32,  // only 16 fp regs supported currently.
127ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsFPRegEnd   = 48,
128ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegHI    = kMipsFPRegEnd,
129ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegLO,
130ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegPC,
131ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  kMipsRegEnd   = 51,
132719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
133e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
134cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee#define ENCODE_MIPS_REG_LIST(N)      (static_cast<uint64_t>(N))
135ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_MIPS_REG_SP           (1ULL << kMipsRegSP)
136ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_MIPS_REG_LR           (1ULL << kMipsRegLR)
137ec13743da80a80c1817cf6660c28917fc28846bcbuzbee#define ENCODE_MIPS_REG_PC           (1ULL << kMipsRegPC)
1389da5c1013215176f2a4dbe7a804be899e12d5f68buzbee#define ENCODE_MIPS_REG_HI           (1ULL << kMipsRegHI)
1399da5c1013215176f2a4dbe7a804be899e12d5f68buzbee#define ENCODE_MIPS_REG_LO           (1ULL << kMipsRegLO)
140e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
1412db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung// Set FR_BIT to 0
1422db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung// This bit determines how the CPU access FP registers.
1432db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#define FR_BIT   0
1442db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung
145f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbeeenum MipsNativeRegisterPool {
146091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rZERO = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  0,
147091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rAT   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  1,
148091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rV0   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  2,
149091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rV1   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  3,
150091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rA0   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  4,
151091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rA1   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  5,
152091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rA2   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  6,
153091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rA3   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  7,
154091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT0   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  8,
155091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT1   = RegStorage::k32BitSolo | RegStorage::kCoreRegister |  9,
156091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT2   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 10,
157091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT3   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 11,
158091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT4   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 12,
159091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT5   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 13,
160091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT6   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 14,
161091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT7   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 15,
162091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS0   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 16,
163091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS1   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 17,
164091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS2   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 18,
165091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS3   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 19,
166091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS4   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 20,
167091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS5   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 21,
168091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS6   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 22,
169091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rS7   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 23,
170091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT8   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 24,
171091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rT9   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 25,
172091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rK0   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 26,
173091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rK1   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 27,
174091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rGP   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 28,
175091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rSP   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 29,
176091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rFP   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 30,
177091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rRA   = RegStorage::k32BitSolo | RegStorage::kCoreRegister | 31,
178a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
179091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF0  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  0,
180091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF1  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  1,
181091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF2  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  2,
182091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF3  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  3,
183091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF4  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  4,
184091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF5  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  5,
185091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF6  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  6,
186091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF7  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  7,
187091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF8  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  8,
188091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF9  = RegStorage::k32BitSolo | RegStorage::kFloatingPoint |  9,
189091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF10 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 10,
190091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF11 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 11,
191091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF12 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 12,
192091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF13 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 13,
193091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF14 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 14,
194091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF15 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 15,
19502031b185b4653e6c72e21f7a51238b903f6d638buzbee#if 0
19602031b185b4653e6c72e21f7a51238b903f6d638buzbee  /*
19702031b185b4653e6c72e21f7a51238b903f6d638buzbee   * TODO: The shared resource mask doesn't have enough bit positions to describe all
19802031b185b4653e6c72e21f7a51238b903f6d638buzbee   * MIPS registers.  Expand it and enable use of fp registers 16 through 31.
19902031b185b4653e6c72e21f7a51238b903f6d638buzbee   */
200091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF16 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 16,
201091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF17 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 17,
202091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF18 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 18,
203091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF19 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 19,
204091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF20 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 20,
205091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF21 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 21,
206091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF22 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 22,
207091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF23 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 23,
208091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF24 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 24,
209091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF25 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 25,
210091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF26 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 26,
211091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF27 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 27,
212091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF28 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 28,
213091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF29 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 29,
214091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF30 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 30,
215091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rF31 = RegStorage::k32BitSolo | RegStorage::kFloatingPoint | 31,
216e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
2172db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#if (FR_BIT == 0)
2182db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD0  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  0,
2192db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD1  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  2,
2202db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD2  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  4,
2212db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD3  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  6,
2222db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD4  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  8,
2232db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD5  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 10,
2242db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD6  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 12,
2252db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD7  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 14,
2262db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#if 0  // TODO: expand resource mask to enable use of all MIPS fp registers.
2272db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD8  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 16,
2282db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD9  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 18,
2292db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD10 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 20,
2302db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD11 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 22,
2312db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD12 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 24,
2322db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD13 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 26,
2332db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD14 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 28,
2342db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung  rD15 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 30,
2352db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#endif
2362db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#else
237091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD0  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  0,
238091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD1  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  1,
239091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD2  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  2,
240091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD3  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  3,
241091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD4  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  4,
242091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD5  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  5,
243091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD6  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  6,
244091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD7  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  7,
2457934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom#if 0  // TODO: expand resource mask to enable use of all MIPS fp registers.
246091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD8  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  8,
247091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD9  = RegStorage::k64BitSolo | RegStorage::kFloatingPoint |  9,
248091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD10 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 10,
249091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD11 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 11,
250091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD12 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 12,
251091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD13 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 13,
252091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD14 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 14,
253091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rD15 = RegStorage::k64BitSolo | RegStorage::kFloatingPoint | 15,
254e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
2552db3e269e3051dacb3c8a4af8f03fdad9b0fd740Douglas Leung#endif
256719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
257e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
258091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rZERO(RegStorage::kValid | rZERO);
259091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rAT(RegStorage::kValid | rAT);
260091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rV0(RegStorage::kValid | rV0);
261091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rV1(RegStorage::kValid | rV1);
262091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rA0(RegStorage::kValid | rA0);
263091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rA1(RegStorage::kValid | rA1);
264091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rA2(RegStorage::kValid | rA2);
265091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rA3(RegStorage::kValid | rA3);
266091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT0(RegStorage::kValid | rT0);
267091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT1(RegStorage::kValid | rT1);
268091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT2(RegStorage::kValid | rT2);
269091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT3(RegStorage::kValid | rT3);
270091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT4(RegStorage::kValid | rT4);
271091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT5(RegStorage::kValid | rT5);
272091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT6(RegStorage::kValid | rT6);
273091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT7(RegStorage::kValid | rT7);
274091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS0(RegStorage::kValid | rS0);
275091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS1(RegStorage::kValid | rS1);
276091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS2(RegStorage::kValid | rS2);
277091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS3(RegStorage::kValid | rS3);
278091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS4(RegStorage::kValid | rS4);
279091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS5(RegStorage::kValid | rS5);
280091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS6(RegStorage::kValid | rS6);
281091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rS7(RegStorage::kValid | rS7);
282091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT8(RegStorage::kValid | rT8);
283091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rT9(RegStorage::kValid | rT9);
284091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rK0(RegStorage::kValid | rK0);
285091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rK1(RegStorage::kValid | rK1);
286091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rGP(RegStorage::kValid | rGP);
287091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rSP(RegStorage::kValid | rSP);
288091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rFP(RegStorage::kValid | rFP);
289091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rRA(RegStorage::kValid | rRA);
290091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee
291091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rMIPS_LR(RegStorage::kInvalid);     // Not used for MIPS.
292091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rMIPS_PC(RegStorage::kInvalid);     // Not used for MIPS.
293091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rMIPS_COUNT(RegStorage::kInvalid);  // Not used for MIPS.
294091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee
295091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF0(RegStorage::kValid | rF0);
296091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF1(RegStorage::kValid | rF1);
297091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF2(RegStorage::kValid | rF2);
298091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF3(RegStorage::kValid | rF3);
299091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF4(RegStorage::kValid | rF4);
300091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF5(RegStorage::kValid | rF5);
301091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF6(RegStorage::kValid | rF6);
302091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF7(RegStorage::kValid | rF7);
303091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF8(RegStorage::kValid | rF8);
304091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF9(RegStorage::kValid | rF9);
305091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF10(RegStorage::kValid | rF10);
306091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF11(RegStorage::kValid | rF11);
307091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF12(RegStorage::kValid | rF12);
308091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF13(RegStorage::kValid | rF13);
309091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF14(RegStorage::kValid | rF14);
310091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rF15(RegStorage::kValid | rF15);
311091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee
312091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD0(RegStorage::kValid | rD0);
313091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD1(RegStorage::kValid | rD1);
314091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD2(RegStorage::kValid | rD2);
315091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD3(RegStorage::kValid | rD3);
316091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD4(RegStorage::kValid | rD4);
317091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD5(RegStorage::kValid | rD5);
318091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD6(RegStorage::kValid | rD6);
319091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbeeconstexpr RegStorage rs_rD7(RegStorage::kValid | rD7);
3202700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee
3212700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee// TODO: reduce/eliminate use of these.
3222700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_SUSPEND rS0
3232700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_SUSPEND rs_rS0
3242700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_SELF rS1
3252700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_SELF rs_rS1
3262700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_SP rSP
3272700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_SP rs_rSP
3282700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_ARG0 rARG0
3292700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_ARG0 rs_rARG0
3302700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_ARG1 rARG1
3312700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_ARG1 rs_rARG1
3322700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_ARG2 rARG2
3332700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_ARG2 rs_rARG2
3342700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_ARG3 rARG3
3352700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_ARG3 rs_rARG3
3362700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_FARG0 rFARG0
3372700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_FARG0 rs_rFARG0
3382700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_FARG1 rFARG1
3392700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_FARG1 rs_rFARG1
3402700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_FARG2 rFARG2
3412700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_FARG2 rs_rFARG2
3422700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_FARG3 rFARG3
343091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee#define rs_rMIPS_FARG3 rs_rFARG3
3442700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_RET0 rRESULT0
345091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee#define rs_rMIPS_RET0 rs_rRESULT0
3462700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_RET1 rRESULT1
3472700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_RET1 rs_rRESULT1
3482700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_INVOKE_TGT rT9
3492700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rs_rMIPS_INVOKE_TGT rs_rT9
3502700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee#define rMIPS_COUNT RegStorage::kInvalidRegVal
3515de3494e4297c0d480409da3fecee39173f1d4e1buzbee
35200e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbee// RegisterLocation templates return values (r_V0, or r_V0/r_V1).
35300e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbeeconst RegLocation mips_loc_c_return
354091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee    {kLocPhysReg, 0, 0, 0, 0, 0, 0, 0, 1,
3552700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee     RegStorage(RegStorage::k32BitSolo, rV0), INVALID_SREG, INVALID_SREG};
35600e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbeeconst RegLocation mips_loc_c_return_wide
357091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee    {kLocPhysReg, 1, 0, 0, 0, 0, 0, 0, 1,
3582700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee     RegStorage(RegStorage::k64BitPair, rV0, rV1), INVALID_SREG, INVALID_SREG};
35900e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbeeconst RegLocation mips_loc_c_return_float
360091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee    {kLocPhysReg, 0, 0, 0, 1, 0, 0, 0, 1,
3612700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee     RegStorage(RegStorage::k32BitSolo, rF0), INVALID_SREG, INVALID_SREG};
362091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee// FIXME: move MIPS to k64Bitsolo for doubles
36300e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbeeconst RegLocation mips_loc_c_return_double
364091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee    {kLocPhysReg, 1, 0, 0, 1, 0, 0, 0, 1,
3652700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee     RegStorage(RegStorage::k64BitPair, rF0, rF1), INVALID_SREG, INVALID_SREG};
36600e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbee
367719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesenum MipsShiftEncodings {
368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kMipsLsl = 0x0,
369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kMipsLsr = 0x1,
370a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kMipsAsr = 0x2,
371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kMipsRor = 0x3
372719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
373e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
37402031b185b4653e6c72e21f7a51238b903f6d638buzbee// MIPS sync kinds (Note: support for kinds other than kSYNC0 may not exist).
375a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC0        0x00
376a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC_WMB     0x04
377a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC_MB      0x01
378a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC_ACQUIRE 0x11
379a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC_RELEASE 0x12
380a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSYNC_RMB     0x13
381a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee
38202031b185b4653e6c72e21f7a51238b903f6d638buzbee// TODO: Use smaller hammer when appropriate for target CPU.
383a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kST kSYNC0
384a2ebdd74eb2f36e6efa7a482bc11c7b93d97c2c3buzbee#define kSY kSYNC0
385e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
386e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
387e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * The following enum defines the list of supported Thumb instructions by the
388de797834a282bf913e144f83ff044efd6d77b278Ian Rogers * assembler. Their corresponding EncodingMap positions will be defined in
389de797834a282bf913e144f83ff044efd6d77b278Ian Rogers * Assemble.cc.
390e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
391719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesenum MipsOpCode {
392b046e16d8b8da318d6055f9308950131f1255e08buzbee  kMipsFirst = 0,
3937934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMips32BitData = kMipsFirst,  // data [31..0].
3947934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsAddiu,  // addiu t,s,imm16 [001001] s[25..21] t[20..16] imm16[15..0].
39502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsAddu,  // add d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100001].
39602031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsAnd,   // and d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100100].
39702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsAndi,  // andi t,s,imm16 [001100] s[25..21] t[20..16] imm16[15..0].
39802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsB,     // b o   [0001000000000000] o[15..0].
39902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBal,   // bal o [0000010000010001] o[15..0].
40002031b185b4653e6c72e21f7a51238b903f6d638buzbee  // NOTE: the code tests the range kMipsBeq thru kMipsBne, so adding an instruction in this
40102031b185b4653e6c72e21f7a51238b903f6d638buzbee  //       range may require updates.
40202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBeq,   // beq s,t,o [000100] s[25..21] t[20..16] o[15..0].
40302031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBeqz,  // beqz s,o [000100] s[25..21] [00000] o[15..0].
40402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBgez,  // bgez s,o [000001] s[25..21] [00001] o[15..0].
40502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBgtz,  // bgtz s,o [000111] s[25..21] [00000] o[15..0].
40602031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBlez,  // blez s,o [000110] s[25..21] [00000] o[15..0].
40702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBltz,  // bltz s,o [000001] s[25..21] [00000] o[15..0].
40802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBnez,  // bnez s,o [000101] s[25..21] [00000] o[15..0].
40902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsBne,   // bne s,t,o [000101] s[25..21] t[20..16] o[15..0].
41002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsDiv,   // div s,t [000000] s[25..21] t[20..16] [0000000000011010].
41138f85e4892f6504971bde994fec81fd61780ac30Brian Carlstrom#if __mips_isa_rev >= 2
41202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsExt,   // ext t,s,p,z [011111] s[25..21] t[20..16] z[15..11] p[10..6] [000000].
413e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
41402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsJal,   // jal t [000011] t[25..0].
41502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsJalr,  // jalr d,s [000000] s[25..21] [00000] d[15..11] hint[10..6] [001001].
41602031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsJr,    // jr s [000000] s[25..21] [0000000000] hint[10..6] [001000].
41702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLahi,  // lui t,imm16 [00111100000] t[20..16] imm16[15..0] load addr hi.
41802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLalo,  // ori t,s,imm16 [001001] s[25..21] t[20..16] imm16[15..0] load addr lo.
41902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLui,   // lui t,imm16 [00111100000] t[20..16] imm16[15..0].
42002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLb,    // lb t,o(b) [100000] b[25..21] t[20..16] o[15..0].
42102031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLbu,   // lbu t,o(b) [100100] b[25..21] t[20..16] o[15..0].
42202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLh,    // lh t,o(b) [100001] b[25..21] t[20..16] o[15..0].
42302031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLhu,   // lhu t,o(b) [100101] b[25..21] t[20..16] o[15..0].
42402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsLw,    // lw t,o(b) [100011] b[25..21] t[20..16] o[15..0].
42502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMfhi,  // mfhi d [0000000000000000] d[15..11] [00000010000].
42602031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMflo,  // mflo d [0000000000000000] d[15..11] [00000010010].
42702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMove,  // move d,s [000000] s[25..21] [00000] d[15..11] [00000100101].
42802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMovz,  // movz d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000001010].
42902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMul,   // mul d,s,t [011100] s[25..21] t[20..16] d[15..11] [00000000010].
43002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsNop,   // nop [00000000000000000000000000000000].
43102031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsNor,   // nor d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100111].
43202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsOr,    // or d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100101].
43302031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsOri,   // ori t,s,imm16 [001001] s[25..21] t[20..16] imm16[15..0].
43402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsPref,  // pref h,o(b) [101011] b[25..21] h[20..16] o[15..0].
43502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSb,    // sb t,o(b) [101000] b[25..21] t[20..16] o[15..0].
43638f85e4892f6504971bde994fec81fd61780ac30Brian Carlstrom#if __mips_isa_rev >= 2
43702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSeb,   // seb d,t [01111100000] t[20..16] d[15..11] [10000100000].
43802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSeh,   // seh d,t [01111100000] t[20..16] d[15..11] [11000100000].
439e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
44002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSh,    // sh t,o(b) [101001] b[25..21] t[20..16] o[15..0].
44102031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSll,   // sll d,t,a [00000000000] t[20..16] d[15..11] a[10..6] [000000].
44202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSllv,  // sllv d,t,s [000000] s[25..21] t[20..16] d[15..11] [00000000100].
44302031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSlt,   // slt d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000101010].
44402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSlti,  // slti t,s,imm16 [001010] s[25..21] t[20..16] imm16[15..0].
44502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSltu,  // sltu d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000101011].
44602031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSra,   // sra d,s,imm5 [00000000000] t[20..16] d[15..11] imm5[10..6] [000011].
44702031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSrav,  // srav d,t,s [000000] s[25..21] t[20..16] d[15..11] [00000000111].
44802031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSrl,   // srl d,t,a [00000000000] t[20..16] d[20..16] a[10..6] [000010].
44902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSrlv,  // srlv d,t,s [000000] s[25..21] t[20..16] d[15..11] [00000000110].
45002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSubu,  // subu d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100011].
45102031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSw,    // sw t,o(b) [101011] b[25..21] t[20..16] o[15..0].
45202031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsXor,   // xor d,s,t [000000] s[25..21] t[20..16] d[15..11] [00000100110].
45302031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsXori,  // xori t,s,imm16 [001110] s[25..21] t[20..16] imm16[15..0].
4547934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFadds,  // add.s d,s,t [01000110000] t[20..16] s[15..11] d[10..6] [000000].
4557934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFsubs,  // sub.s d,s,t [01000110000] t[20..16] s[15..11] d[10..6] [000001].
4567934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFmuls,  // mul.s d,s,t [01000110000] t[20..16] s[15..11] d[10..6] [000010].
4577934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFdivs,  // div.s d,s,t [01000110000] t[20..16] s[15..11] d[10..6] [000011].
4587934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFaddd,  // add.d d,s,t [01000110001] t[20..16] s[15..11] d[10..6] [000000].
4597934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFsubd,  // sub.d d,s,t [01000110001] t[20..16] s[15..11] d[10..6] [000001].
4607934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFmuld,  // mul.d d,s,t [01000110001] t[20..16] s[15..11] d[10..6] [000010].
4617934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFdivd,  // div.d d,s,t [01000110001] t[20..16] s[15..11] d[10..6] [000011].
4627934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtsd,  // cvt.s.d d,s [01000110001] [00000] s[15..11] d[10..6] [100000].
4637934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtsw,  // cvt.s.w d,s [01000110100] [00000] s[15..11] d[10..6] [100000].
4647934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtds,  // cvt.d.s d,s [01000110000] [00000] s[15..11] d[10..6] [100001].
4657934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtdw,  // cvt.d.w d,s [01000110100] [00000] s[15..11] d[10..6] [100001].
4667934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtws,  // cvt.w.d d,s [01000110000] [00000] s[15..11] d[10..6] [100100].
4677934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFcvtwd,  // cvt.w.d d,s [01000110001] [00000] s[15..11] d[10..6] [100100].
4687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFmovs,  // mov.s d,s [01000110000] [00000] s[15..11] d[10..6] [000110].
4697934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFmovd,  // mov.d d,s [01000110001] [00000] s[15..11] d[10..6] [000110].
4707934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFlwc1,  // lwc1 t,o(b) [110001] b[25..21] t[20..16] o[15..0].
4717934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFldc1,  // ldc1 t,o(b) [110101] b[25..21] t[20..16] o[15..0].
4727934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFswc1,  // swc1 t,o(b) [111001] b[25..21] t[20..16] o[15..0].
4737934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsFsdc1,  // sdc1 t,o(b) [111101] b[25..21] t[20..16] o[15..0].
47402031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMfc1,  // mfc1 t,s [01000100000] t[20..16] s[15..11] [00000000000].
47502031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsMtc1,  // mtc1 t,s [01000100100] t[20..16] s[15..11] [00000000000].
4767934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsDelta,  // Psuedo for ori t, s, <label>-<label>.
4777934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsDeltaHi,  // Pseudo for lui t, high16(<label>-<label>).
4787934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  kMipsDeltaLo,  // Pseudo for ori t, s, low16(<label>-<label>).
47902031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsCurrPC,  // jal to .+8 to materialize pc.
48002031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsSync,    // sync kind [000000] [0000000000000000] s[10..6] [001111].
48102031b185b4653e6c72e21f7a51238b903f6d638buzbee  kMipsUndefined,  // undefined [011001xxxxxxxxxxxxxxxx].
482a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kMipsLast
483719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
484e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
48502031b185b4653e6c72e21f7a51238b903f6d638buzbee// Instruction assembly field_loc kind.
486719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesenum MipsEncodingKind {
487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kFmtUnused,
488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kFmtBitBlt,    /* Bit string using end/start */
489a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kFmtDfp,       /* Double FP reg */
490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kFmtSfp,       /* Single FP reg */
491a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  kFmtBlt5_2,    /* Same 5-bit field to 2 locations */
492719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
493e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
49402031b185b4653e6c72e21f7a51238b903f6d638buzbee// Struct used to define the snippet positions for each MIPS opcode.
495719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughesstruct MipsEncodingMap {
496eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee  uint32_t skeleton;
497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  struct {
498a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    MipsEncodingKind kind;
49902031b185b4653e6c72e21f7a51238b903f6d638buzbee    int end;   // end for kFmtBitBlt, 1-bit slice end for FP regs.
5007934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    int start;  // start for kFmtBitBlt, 4-bit slice end for FP regs.
501fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  } field_loc[4];
502a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  MipsOpCode opcode;
503ec13743da80a80c1817cf6660c28917fc28846bcbuzbee  uint64_t flags;
504a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  const char *name;
505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  const char* fmt;
50602031b185b4653e6c72e21f7a51238b903f6d638buzbee  int size;   // Note: size is in bytes.
507719ace4734f519c67fd2c1ff7a232c079309a615Elliott Hughes};
508e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
509e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeextern MipsEncodingMap EncodingMap[kMipsLast];
510e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
511e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define IS_UIMM16(v) ((0 <= (v)) && ((v) <= 65535))
512e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define IS_SIMM16(v) ((-32768 <= (v)) && ((v) <= 32766))
5137934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom#define IS_SIMM16_2WORD(v) ((-32764 <= (v)) && ((v) <= 32763))  // 2 offsets must fit.
514e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
515e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}  // namespace art
516e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
517fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_COMPILER_DEX_QUICK_MIPS_MIPS_LIR_H_
518