summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/CellSPU/SPU.h
blob: c6208121902c9fc5e6b939f73f83cf7fa7052d8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
//===-- SPU.h - Top-level interface for Cell SPU Target ----------*- C++ -*-==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the entry points for global functions defined in the LLVM
// Cell SPU back-end.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TARGET_IBMCELLSPU_H
#define LLVM_TARGET_IBMCELLSPU_H

#include "llvm/System/DataTypes.h"
#include "llvm/Target/TargetMachine.h"

namespace llvm {
  class SPUTargetMachine;
  class FunctionPass;
  class formatted_raw_ostream;

  FunctionPass *createSPUISelDag(SPUTargetMachine &TM);

  /*--== Utility functions/predicates/etc used all over the place: --==*/
  //! Predicate test for a signed 10-bit value
  /*!
    \param Value The input value to be tested

    This predicate tests for a signed 10-bit value, returning the 10-bit value
    as a short if true.
   */
  template<typename T>
  inline bool isS10Constant(T Value);

  template<>
  inline bool isS10Constant<short>(short Value) {
    int SExtValue = ((int) Value << (32 - 10)) >> (32 - 10);
    return ((Value > 0 && Value <= (1 << 9) - 1)
            || (Value < 0 && (short) SExtValue == Value));
  }

  template<>
  inline bool isS10Constant<int>(int Value) {
    return (Value >= -(1 << 9) && Value <= (1 << 9) - 1);
  }

  template<>
  inline bool isS10Constant<uint32_t>(uint32_t Value) {
    return (Value <= ((1 << 9) - 1));
  }

  template<>
  inline bool isS10Constant<int64_t>(int64_t Value) {
    return (Value >= -(1 << 9) && Value <= (1 << 9) - 1);
  }

  template<>
  inline bool isS10Constant<uint64_t>(uint64_t Value) {
    return (Value <= ((1 << 9) - 1));
  }

  //! Predicate test for an unsigned 10-bit value
  /*!
    \param Value The input value to be tested
   */
  inline bool isU10Constant(short Value) {
    return (Value == (Value & 0x3ff));
  }

  inline bool isU10Constant(int Value) {
    return (Value == (Value & 0x3ff));
  }

  inline bool isU10Constant(uint32_t Value) {
    return (Value == (Value & 0x3ff));
  }

  inline bool isU10Constant(int64_t Value) {
    return (Value == (Value & 0x3ff));
  }

  inline bool isU10Constant(uint64_t Value) {
    return (Value == (Value & 0x3ff));
  }

  //! Predicate test for a signed 14-bit value
  /*!
    \param Value The input value to be tested
   */
  template<typename T>
  inline bool isS14Constant(T Value);

  template<>
  inline bool isS14Constant<short>(short Value) {
    return (Value >= -(1 << 13) && Value <= (1 << 13) - 1);
  }

  template<>
  inline bool isS14Constant<int>(int Value) {
    return (Value >= -(1 << 13) && Value <= (1 << 13) - 1);
  }

  template<>
  inline bool isS14Constant<uint32_t>(uint32_t Value) {
    return (Value <= ((1 << 13) - 1));
  }

  template<>
  inline bool isS14Constant<int64_t>(int64_t Value) {
    return (Value >= -(1 << 13) && Value <= (1 << 13) - 1);
  }

  template<>
  inline bool isS14Constant<uint64_t>(uint64_t Value) {
    return (Value <= ((1 << 13) - 1));
  }

  //! Predicate test for a signed 16-bit value
  /*!
    \param Value The input value to be tested
   */
  template<typename T>
  inline bool isS16Constant(T Value);

  template<>
  inline bool isS16Constant<short>(short Value) {
    return true;
  }

  template<>
  inline bool isS16Constant<int>(int Value) {
    return (Value >= -(1 << 15) && Value <= (1 << 15) - 1);
  }

  template<>
  inline bool isS16Constant<uint32_t>(uint32_t Value) {
    return (Value <= ((1 << 15) - 1));
  }

  template<>
  inline bool isS16Constant<int64_t>(int64_t Value) {
    return (Value >= -(1 << 15) && Value <= (1 << 15) - 1);
  }

  template<>
  inline bool isS16Constant<uint64_t>(uint64_t Value) {
    return (Value <= ((1 << 15) - 1));
  }

  extern Target TheCellSPUTarget;

}

// Defines symbolic names for the SPU instructions.
//
#include "SPUGenInstrNames.inc"

#endif /* LLVM_TARGET_IBMCELLSPU_H */
OpenPOWER on IntegriCloud