190a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner//===-- IntrinsicLowering.h - Intrinsic Function Lowering -------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
33f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//                     The LLVM Compiler Infrastructure
43f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
83f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
103f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// This file defines the IntrinsicLowering interface.  This interface allows
113f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// addition of domain-specific or front-end specific intrinsics to LLVM without
12b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner// having to modify all of the C backend or interpreter.
133f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//
143f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//===----------------------------------------------------------------------===//
153f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner
1690a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner#ifndef LLVM_CODEGEN_INTRINSICLOWERING_H
1790a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner#define LLVM_CODEGEN_INTRINSICLOWERING_H
183f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner
19f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner#include "llvm/Intrinsics.h"
20f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner
213f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattnernamespace llvm {
223f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner  class CallInst;
2343c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner  class Module;
2436abe148630ea3742a914d87bd6a54be7d8eb825Reid Spencer  class TargetData;
25ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
26148d2065e4eb60357014a39c8e0d66c908679ffdAlkis Evlogimenos  class IntrinsicLowering {
2736abe148630ea3742a914d87bd6a54be7d8eb825Reid Spencer    const TargetData& TD;
28b41b5e0b2d865f9dcb8cc868b28929daf3a11207Owen Anderson
296279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson
306279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson    bool Warned;
31148d2065e4eb60357014a39c8e0d66c908679ffdAlkis Evlogimenos  public:
326279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson    explicit IntrinsicLowering(const TargetData &td) :
33b41b5e0b2d865f9dcb8cc868b28929daf3a11207Owen Anderson      TD(td), Warned(false) {}
343f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner
3543c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner    /// AddPrototypes - This method, if called, causes all of the prototypes
3643c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner    /// that might be needed by an intrinsic lowering implementation to be
3743c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner    /// inserted into the module specified.
38b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner    void AddPrototypes(Module &M);
3943c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner
40e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer    /// LowerIntrinsicCall - This method replaces a call with the LLVM function
41e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer    /// which should be used to implement the specified intrinsic function call.
42e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer    /// If an intrinsic function must be implemented by the code generator
43e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer    /// (such as va_start), this function should print a message and abort.
443f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    ///
453f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    /// Otherwise, if an intrinsic function call can be lowered, the code to
463f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    /// implement it (often a call to a non-intrinsic function) is inserted
473f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    /// _after_ the call instruction and the call is deleted.  The caller must
483f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    /// be capable of handling this kind of change.
493f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner    ///
50b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner    void LowerIntrinsicCall(CallInst *CI);
5155d42003368c57d3a41c5f464d39b8440050d558Evan Cheng
5255d42003368c57d3a41c5f464d39b8440050d558Evan Cheng    /// LowerToByteSwap - Replace a call instruction into a call to bswap
5355d42003368c57d3a41c5f464d39b8440050d558Evan Cheng    /// intrinsic. Return false if it has determined the call is not a
5455d42003368c57d3a41c5f464d39b8440050d558Evan Cheng    /// simple integer bswap.
5555d42003368c57d3a41c5f464d39b8440050d558Evan Cheng    static bool LowerToByteSwap(CallInst *CI);
563f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner  };
573f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner}
583f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner
593f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner#endif
60