17624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko/* 27624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * Copyright (C) 2014 The Android Open Source Project 37624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * 47624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 57624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * you may not use this file except in compliance with the License. 67624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * You may obtain a copy of the License at 77624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * 87624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 97624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * 107624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * Unless required by applicable law or agreed to in writing, software 117624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 127624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * See the License for the specific language governing permissions and 147624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko * limitations under the License. 157624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko */ 167624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 177624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#ifndef ART_RUNTIME_ARCH_X86_QUICK_METHOD_FRAME_INFO_X86_H_ 187624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#define ART_RUNTIME_ARCH_X86_QUICK_METHOD_FRAME_INFO_X86_H_ 197624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 2080afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#include "base/bit_utils.h" 217624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#include "quick/quick_method_frame_info.h" 227624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#include "registers_x86.h" 237624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#include "runtime.h" // for Runtime::CalleeSaveType. 247624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 257624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markonamespace art { 267624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markonamespace x86 { 277624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 28966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendellenum XMM { 29966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM0 = 0, 30966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM1 = 1, 31966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM2 = 2, 32966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM3 = 3, 33966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM4 = 4, 34966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM5 = 5, 35966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM6 = 6, 36966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell XMM7 = 7, 37966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell}; 38966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell 397624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markostatic constexpr uint32_t kX86CalleeSaveRefSpills = 407624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko (1 << art::x86::EBP) | (1 << art::x86::ESI) | (1 << art::x86::EDI); 417624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markostatic constexpr uint32_t kX86CalleeSaveArgSpills = 427624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko (1 << art::x86::ECX) | (1 << art::x86::EDX) | (1 << art::x86::EBX); 43966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendellstatic constexpr uint32_t kX86CalleeSaveFpArgSpills = 44966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell (1 << art::x86::XMM0) | (1 << art::x86::XMM1) | 45966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell (1 << art::x86::XMM2) | (1 << art::x86::XMM3); 467624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 477624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markoconstexpr uint32_t X86CalleeSaveCoreSpills(Runtime::CalleeSaveType type) { 487624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko return kX86CalleeSaveRefSpills | (type == Runtime::kRefsAndArgs ? kX86CalleeSaveArgSpills : 0) | 497624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko (1 << art::x86::kNumberOfCpuRegisters); // fake return address callee save 507624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko} 517624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 52966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendellconstexpr uint32_t X86CalleeSaveFpSpills(Runtime::CalleeSaveType type) { 53966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell return type == Runtime::kRefsAndArgs ? kX86CalleeSaveFpArgSpills : 0; 54966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell} 55966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell 567624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markoconstexpr uint32_t X86CalleeSaveFrameSize(Runtime::CalleeSaveType type) { 577624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko return RoundUp((POPCOUNT(X86CalleeSaveCoreSpills(type)) /* gprs */ + 58966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell 2 * POPCOUNT(X86CalleeSaveFpSpills(type)) /* fprs */ + 597624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 1 /* Method* */) * kX86PointerSize, kStackAlignment); 607624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko} 617624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 627624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markoconstexpr QuickMethodFrameInfo X86CalleeSaveMethodFrameInfo(Runtime::CalleeSaveType type) { 637624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko return QuickMethodFrameInfo(X86CalleeSaveFrameSize(type), 647624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko X86CalleeSaveCoreSpills(type), 65966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell X86CalleeSaveFpSpills(type)); 667624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko} 677624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 687624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko} // namespace x86 697624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko} // namespace art 707624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko 717624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko#endif // ART_RUNTIME_ARCH_X86_QUICK_METHOD_FRAME_INFO_X86_H_ 72