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