1 #ifndef HALIDE_CODEGEN_X86_H
2 #define HALIDE_CODEGEN_X86_H
3 
4 /** \file
5  * Defines the code-generator for producing x86 machine code
6  */
7 
8 #include "CodeGen_Posix.h"
9 #include "Target.h"
10 
11 namespace llvm {
12 class JITEventListener;
13 }
14 
15 namespace Halide {
16 namespace Internal {
17 
18 /** A code generator that emits x86 code from a given Halide stmt. */
19 class CodeGen_X86 : public CodeGen_Posix {
20 public:
21     /** Create an x86 code generator. Processor features can be
22      * enabled using the appropriate flags in the target struct. */
23     CodeGen_X86(Target);
24 
25 protected:
26     std::string mcpu() const override;
27     std::string mattrs() const override;
28     bool use_soft_float_abi() const override;
29     int native_vector_bits() const override;
30 
31     int vector_lanes_for_slice(const Type &t) const;
32 
33     llvm::Type *llvm_type_of(const Type &t) const override;
34 
35     using CodeGen_Posix::visit;
36 
37     /** Nodes for which we want to emit specific sse/avx intrinsics */
38     // @{
39     void visit(const Add *) override;
40     void visit(const Sub *) override;
41     void visit(const Cast *) override;
42     void visit(const Call *) override;
43     void visit(const GT *) override;
44     void visit(const LT *) override;
45     void visit(const LE *) override;
46     void visit(const GE *) override;
47     void visit(const EQ *) override;
48     void visit(const NE *) override;
49     void visit(const Select *) override;
50     void visit(const VectorReduce *) override;
51     void visit(const Mul *) override;
52     // @}
53 };
54 
55 }  // namespace Internal
56 }  // namespace Halide
57 
58 #endif
59