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, OffsetVal: Offset); |
57 | } |
58 | |
59 | } // namespace llvm |
60 | |