19e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner//===- CodeGenIntrinsic.h - Intrinsic Class Wrapper ------------*- C++ -*--===// 29e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// 39e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// The LLVM Compiler Infrastructure 49e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 79e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// 89e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner//===----------------------------------------------------------------------===// 99e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// 109e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// This file defines a wrapper class for the 'Intrinsic' TableGen class. 119e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner// 129e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner//===----------------------------------------------------------------------===// 139e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H 169e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineValueType.h" 189e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#include <string> 199e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#include <vector> 209e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 219e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattnernamespace llvm { 229e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner class Record; 239e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner class RecordKeeper; 248850a1bcef0c2a785f918395fe0a05054914b349Chris Lattner class CodeGenTarget; 259e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 269e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner struct CodeGenIntrinsic { 27c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer Record *TheDef; // The actual record defining this intrinsic. 289e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner std::string Name; // The name of the LLVM function "llvm.bswap.i32" 299e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner std::string EnumName; // The name of the enum "bswap_i32" 30022f64fbbc4669623e79b805379266fed519017dChris Lattner std::string GCCBuiltinName;// Name of the corresponding GCC builtin, or "". 31c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::string MSBuiltinName; // Name of the corresponding MS builtin, or "". 323f8b8913bc9cb232871445eefa8654caf7f9986fChris Lattner std::string TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics. 3383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands 34cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// IntrinsicSignature - This structure holds the return values and 35cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// parameter values of an intrinsic. If the number of return values is > 1, 36cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// then the intrinsic implicitly returns a first-class aggregate. The 37cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// numbering of the types starts at 0 with the first return value and 38da4231f134989af7dc6bd3408821ba573def27b2Jim Grosbach /// continues from there through the parameter list. This is useful for 39cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// "matching" types. 40cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling struct IntrinsicSignature { 41825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// RetVTs - The MVT::SimpleValueType for each return type. Note that this 42cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// list is only populated when in the context of a target .td file. When 43cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// building Intrinsics.td, this isn't available, because we don't know 44cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// the target pointer size. 45825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> RetVTs; 46cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 47cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// RetTypeDefs - The records for each return type. 48cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<Record*> RetTypeDefs; 49cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 50825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// ParamVTs - The MVT::SimpleValueType for each parameter type. Note that 51cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// this list is only populated when in the context of a target .td file. 52cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// When building Intrinsics.td, this isn't available, because we don't 53cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// know the target pointer size. 54825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> ParamVTs; 55cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 56cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// ParamTypeDefs - The records for each parameter type. 57cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<Record*> ParamTypeDefs; 58cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling }; 59cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 60cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling IntrinsicSignature IS; 6183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands 629e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner // Memory mod/ref behavior of this intrinsic. 639e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner enum { 647365c091f92db5e68c98d7faedc6c34e1bbbc898Dan Gohman NoMem, ReadArgMem, ReadMem, ReadWriteArgMem, ReadWriteMem 659e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner } ModRef; 669e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 67a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// This is set to true if the intrinsic is overloaded by its argument 68a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// types. 69c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer bool isOverloaded; 70c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer 71a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// isCommutative - True if the intrinsic is commutative. 726bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng bool isCommutative; 73bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall 74bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall /// canThrow - True if the intrinsic can throw. 75bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall bool canThrow; 7686208903cb3b693b26e144b8c5c7a0ab6a9a45c6Chris Lattner 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// isNoDuplicate - True if the intrinsic is marked as noduplicate. 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isNoDuplicate; 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8086208903cb3b693b26e144b8c5c7a0ab6a9a45c6Chris Lattner /// isNoReturn - True if the intrinsic is no-return. 8186208903cb3b693b26e144b8c5c7a0ab6a9a45c6Chris Lattner bool isNoReturn; 8286208903cb3b693b26e144b8c5c7a0ab6a9a45c6Chris Lattner 83a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner enum ArgAttribute { 84dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky NoCapture, 85dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky ReadOnly, 86dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky ReadNone 87a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner }; 88a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner std::vector<std::pair<unsigned, ArgAttribute> > ArgumentAttributes; 896bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng 90ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman CodeGenIntrinsic(Record *R); 919e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner }; 929e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 939e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// LoadIntrinsics - Read all of the intrinsics defined in the specified 949e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// .td file. 9549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC, 9649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen bool TargetOnly); 979e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner} 989e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 999e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#endif 100