CodeGenIntrinsics.h revision cdcc3e6e12b8b4e224bd62c96768c5f5e325aace
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 37cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// continues from there throug the parameter list. This is useful for 38cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// "matching" types. 39cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling struct IntrinsicSignature { 40cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// 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. 44cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<MVT::SimpleValueType> RetVTs; 45cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 46cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// RetTypeDefs - The records for each return type. 47cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling std::vector<Record*> RetTypeDefs; 48cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 49cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling /// 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. 53cdcc3e6e12b8b4e224bd62c96768c5f5e325aaceBill Wendling 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 { 639e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner NoMem, ReadArgMem, ReadMem, WriteArgMem, WriteMem 649e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner } ModRef; 659e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 66c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer // This is set to true if the intrinsic is overloaded by its argument 67c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer // types. 68c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer bool isOverloaded; 69c4de3dec62c3f60ae7297f93c19c799c403c2e9fReid Spencer 706bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng // isCommutative - True if the intrinsic is commutative. 716bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng // 726bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng bool isCommutative; 736bd9567a6a1ba62118cdd258ddc52ea8f82ff511Evan Cheng 74ee4fa1977dd3a495a8857eef924ee5961db765c6Dan Gohman CodeGenIntrinsic(Record *R); 759e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner }; 769e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 779e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// LoadIntrinsics - Read all of the intrinsics defined in the specified 789e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner /// .td file. 799e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC); 809e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner} 819e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner 829e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#endif 83