summaryrefslogtreecommitdiff
path: root/include/llvm/Intrinsics.h
blob: f5e525985b4813b744ce1abdf9f8c496a62012fc (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
163
164
165
166
//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file defines a set of enums which allow processing of intrinsic
// functions.  Values of these enum types are returned by
// Function::getIntrinsicID.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_INTRINSICS_H
#define LLVM_INTRINSICS_H

namespace llvm {

/// Intrinsic Namespace - This namespace contains an enum with a value for
/// every intrinsic/builtin function known by LLVM.  These enum values are
/// returned by Function::getIntrinsicID().
///
namespace Intrinsic {
  enum ID {
    not_intrinsic = 0,   // Must be zero

    // Varargs handling intrinsics.
    vastart,        // Used to implement the va_start macro in C
    vaend,          // Used to implement the va_end macro in C
    vacopy,         // Used to implement the va_copy macro in C

    // Code generator intrinsics.
    returnaddress,  // Yields the return address of a dynamic call frame
    frameaddress,   // Yields the frame address of a dynamic call frame

    // setjmp/longjmp intrinsics.
    setjmp,         // Used to represent a setjmp call in C
    longjmp,        // Used to represent a longjmp call in C
    sigsetjmp,      // Used to represent a sigsetjmp call in C
    siglongjmp,     // Used to represent a siglongjmp call in C

    // Garbage Collection intrinsics.
    gcroot,         // Defines a new GC root on the stack
    gcread,         // Defines a read of a heap object  (for read barriers)
    gcwrite,        // Defines a write to a heap object (for write barriers)

    // Debugging intrinsics.
    dbg_stoppoint,    // Represents source lines and breakpointable places
    dbg_region_start, // Start of a region
    dbg_region_end,   // End of a region
    dbg_func_start,   // Start of a function
    dbg_declare,      // Declare a local object


    // Standard libc functions.
    memcpy,         // Copy non-overlapping memory blocks
    memmove,        // Copy potentially overlapping memory blocks
    memset,         // Fill memory with a byte value

    // libm related functions.
    isunordered,    // Return true if either argument is a NaN

    // Input/Output intrinsics.
    readport,
    writeport,
    readio,
    writeio,

    //===------------------------------------------------------------------===//
    // This section defines intrinsic functions used to represent Alpha
    // instructions.
    //
    alpha_ctlz,     // CTLZ (count leading zero): counts the number of leading
                    // zeros in the given ulong value

    alpha_cttz,     // CTTZ (count trailing zero): counts the number of trailing
                    // zeros in the given ulong value 

    alpha_ctpop,    // CTPOP (count population): counts the number of ones in
                    // the given ulong value 

    alpha_umulh,    // UMULH (unsigned multiply quadword high): Takes two 64-bit
                    // (ulong) values, and returns the upper 64 bits of their
                    // 128 bit product as a ulong

    alpha_vecop,    // A generic vector operation. This function is used to
                    // represent various Alpha vector/multimedia instructions.
                    // It takes 4 parameters:
                    //  - the first two are 2 ulong vectors
                    //  - the third (uint) is the size (in bytes) of each 
                    //    vector element. Thus a value of 1 means that the two
                    //    input vectors consist of 8 bytes
                    //  - the fourth (uint) is the operation to be performed on
                    //    the vectors. Its possible values are defined in the
                    //    enumeration AlphaVecOps.

    alpha_pup,      // A pack/unpack operation. This function is used to
                    // represent Alpha pack/unpack operations. 
                    // It takes 3 parameters:
                    //  - the first is an ulong to pack/unpack
                    //  - the second (uint) is the size of each component
                    //    Valid values are 2 (word) or 4 (longword)
                    //  - the third (uint) is the operation to be performed.
                    //    Possible values defined in the enumeration 
                    //    AlphaPupOps

    alpha_bytezap,  // This intrinsic function takes two parameters: a ulong 
                    // (64-bit) value and a ubyte value, and returns a ulong.
                    // Each bit in the ubyte corresponds to a byte in the 
                    // ulong. If the bit is 0, the byte in the output equals
                    // the corresponding byte in the input, else the byte in
                    // the output is zero.

    alpha_bytemanip,// This intrinsic function represents all Alpha byte
                    // manipulation instructions. It takes 3 parameters:
                    //  - The first two are ulong inputs to operate on
                    //  - The third (uint) is the operation to perform. 
                    //    Possible values defined in the enumeration
                    //    AlphaByteManipOps

    alpha_dfpbop,   // This intrinsic function represents Alpha instructions
                    // that operate on two doubles and return a double. The
                    // first two parameters are the two double values to
                    // operate on, and the third is a uint that specifies the
                    // operation to perform. Its possible values are defined in
                    // the enumeration AlphaFloatingBinaryOps

    alpha_dfpuop,   // This intrinsic function represents operation on a single
                    // double precision floating point value. The first 
                    // paramters is the value and the second is the operation.
                    // The possible values for the operations are defined in the
                    // enumeration AlphaFloatingUnaryOps

    alpha_unordered,// This intrinsic function tests if two double precision
                    // floating point values are unordered. It has two
                    // parameters: the two values to be tested. It return a
                    // boolean true if the two are unordered, else false.

    alpha_uqtodfp,  // A generic function that converts a ulong to a double.
                    // How the conversion is performed is specified by the
                    // second parameter, the possible values for which are
                    // defined in the AlphaUqToDfpOps enumeration

    alpha_uqtosfp,  // A generic function that converts a ulong to a float.
                    // How the conversion is performed is specified by the
                    // second parameter, the possible values for which are
                    // defined in the AlphaUqToSfpOps enumeration

    alpha_dfptosq,  // A generic function that converts double to a long.
                    // How the conversion is performed is specified by the
                    // second parameter, the possible values for which are
                    // defined in the AlphaDfpToSqOps enumeration

    alpha_sfptosq,  // A generic function that converts a float to a long.
                    // How the conversion is performed is specified by the
                    // second parameter, the possible values for which are
                    // defined in the AlphaSfpToSq enumeration
  };

} // End Intrinsic namespace

} // End llvm namespace

#endif