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 149e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#ifndef CODEGEN_INTRINSIC_H 159e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#define CODEGEN_INTRINSIC_H 169e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 179e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#include <string> 189e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#include <vector> 1943fbbc36dc64243a1a57b072d37bccf6dad4d3cbChris Lattner#include "llvm/CodeGen/ValueTypes.h" 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 "". 313f8b8913bc9cb232871445eefa8654caf7f9986fChris Lattner std::string TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics. 3283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands 33cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// IntrinsicSignature - This structure holds the return values and 34cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// parameter values of an intrinsic. If the number of return values is > 1, 35cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// then the intrinsic implicitly returns a first-class aggregate. The 36cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// numbering of the types starts at 0 with the first return value and 37da4231f134989af7dc6bd3408821ba573def27b2Jim Grosbach /// continues from there through the parameter list. This is useful for 38cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// "matching" types. 39cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling struct IntrinsicSignature { 40825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// RetVTs - The MVT::SimpleValueType for each return type. Note that this 41cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// list is only populated when in the context of a target .td file. When 42cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// building Intrinsics.td, this isn't available, because we don't know 43cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// the target pointer size. 44825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> RetVTs; 45cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 46cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// RetTypeDefs - The records for each return type. 47cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<Record*> RetTypeDefs; 48cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 49825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// ParamVTs - The MVT::SimpleValueType for each parameter type. Note that 50cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// this list is only populated when in the context of a target .td file. 51cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// When building Intrinsics.td, this isn't available, because we don't 52cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// know the target pointer size. 53825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> ParamVTs; 54cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 55cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// ParamTypeDefs - The records for each parameter type. 56cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<Record*> ParamTypeDefs; 57cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling }; 58cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 59cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling IntrinsicSignature IS; 6083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands 619e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner // Memory mod/ref behavior of this intrinsic. 629e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner enum { 637365c091f92db5e68c98d7faedc6c34e1bbbc898Dan Gohman NoMem, ReadArgMem, ReadMem, ReadWriteArgMem, ReadWriteMem 649e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner } ModRef; 659e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 66a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// This is set to true if the intrinsic is overloaded by its argument 67a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// types. 68c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer bool isOverloaded; 69c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer 70a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner /// isCommutative - True if the intrinsic is commutative. 716bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng bool isCommutative; 72bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall 73bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall /// canThrow - True if the intrinsic can throw. 74bd0fa4c00d7870b1da36eac7b2181700381f2f96John McCall bool canThrow; 75a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner 76a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner enum ArgAttribute { 77a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner NoCapture 78a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner }; 79a62c302ddd79c525d6fac050974911d36662ebfeChris Lattner std::vector<std::pair<unsigned, ArgAttribute> > ArgumentAttributes; 806bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng 81ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman CodeGenIntrinsic(Record *R); 829e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner }; 839e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 849e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// LoadIntrinsics - Read all of the intrinsics defined in the specified 859e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// .td file. 8649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC, 8749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen bool TargetOnly); 889e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner} 899e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 909e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#endif 91