1 //===--- XtensaUtils.cpp ---- Xtensa Utility Functions ----------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains miscellaneous utility functions. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "XtensaUtils.h" 14 15 namespace llvm { 16 17 bool isValidAddrOffset(int Scale, int64_t OffsetVal) { 18 bool Valid = false; 19 20 switch (Scale) { 21 case 1: 22 Valid = (OffsetVal >= 0 && OffsetVal <= 255); 23 break; 24 case 2: 25 Valid = (OffsetVal >= 0 && OffsetVal <= 510) && ((OffsetVal & 0x1) == 0); 26 break; 27 case 4: 28 Valid = (OffsetVal >= 0 && OffsetVal <= 1020) && ((OffsetVal & 0x3) == 0); 29 break; 30 default: 31 break; 32 } 33 return Valid; 34 } 35 36 bool isValidAddrOffset(MachineInstr &MI, int64_t Offset) { 37 int Scale = 0; 38 39 switch (MI.getOpcode()) { 40 case Xtensa::L8UI: 41 case Xtensa::S8I: 42 Scale = 1; 43 break; 44 case Xtensa::L16SI: 45 case Xtensa::L16UI: 46 case Xtensa::S16I: 47 Scale = 2; 48 break; 49 case Xtensa::LEA_ADD: 50 return (Offset >= -128 && Offset <= 127); 51 default: 52 // assume that MI is 32-bit load/store operation 53 Scale = 4; 54 break; 55 } 56 return isValidAddrOffset(Scale, Offset); 57 } 58 59 } // namespace llvm 60