Line data Source code
1 : //===-- ARMWinEH.cpp - Windows on ARM EH Support Functions ------*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 :
10 : #include "llvm/Support/ARMWinEH.h"
11 : #include "llvm/Support/raw_ostream.h"
12 :
13 : namespace llvm {
14 : namespace ARM {
15 : namespace WinEH {
16 0 : std::pair<uint16_t, uint32_t> SavedRegisterMask(const RuntimeFunction &RF) {
17 : uint8_t NumRegisters = RF.Reg();
18 : uint8_t RegistersVFP = RF.R();
19 : uint8_t LinkRegister = RF.L();
20 : uint8_t ChainedFrame = RF.C();
21 :
22 0 : uint16_t GPRMask = (ChainedFrame << 11) | (LinkRegister << 14);
23 : uint32_t VFPMask = 0;
24 :
25 0 : if (RegistersVFP)
26 0 : VFPMask |= (((1 << ((NumRegisters + 1) % 8)) - 1) << 8);
27 : else
28 0 : GPRMask |= (((1 << (NumRegisters + 1)) - 1) << 4);
29 :
30 : if (PrologueFolding(RF))
31 0 : GPRMask |= (((1 << (NumRegisters + 1)) - 1) << (~RF.StackAdjust() & 0x3));
32 :
33 0 : return std::make_pair(GPRMask, VFPMask);
34 : }
35 : }
36 : }
37 : }
38 :
|