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 Workerstd::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