| //===--- XtensaUtils.cpp ---- Xtensa Utility Functions ----------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains miscellaneous utility functions. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "XtensaUtils.h" |
| |
| namespace llvm { |
| |
| bool isValidAddrOffset(int Scale, int64_t OffsetVal) { |
| bool Valid = false; |
| |
| switch (Scale) { |
| case 1: |
| Valid = (OffsetVal >= 0 && OffsetVal <= 255); |
| break; |
| case 2: |
| Valid = (OffsetVal >= 0 && OffsetVal <= 510) && ((OffsetVal & 0x1) == 0); |
| break; |
| case 4: |
| Valid = (OffsetVal >= 0 && OffsetVal <= 1020) && ((OffsetVal & 0x3) == 0); |
| break; |
| default: |
| break; |
| } |
| return Valid; |
| } |
| |
| bool isValidAddrOffset(MachineInstr &MI, int64_t Offset) { |
| int Scale = 0; |
| |
| switch (MI.getOpcode()) { |
| case Xtensa::L8UI: |
| case Xtensa::S8I: |
| Scale = 1; |
| break; |
| case Xtensa::L16SI: |
| case Xtensa::L16UI: |
| case Xtensa::S16I: |
| Scale = 2; |
| break; |
| case Xtensa::LEA_ADD: |
| return (Offset >= -128 && Offset <= 127); |
| default: |
| // assume that MI is 32-bit load/store operation |
| Scale = 4; |
| break; |
| } |
| return isValidAddrOffset(Scale, Offset); |
| } |
| |
| } // namespace llvm |