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