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