Raw File
CodeGen_Xtensa.h
#ifndef HALIDE_CODEGEN_XTENSA_H
#define HALIDE_CODEGEN_XTENSA_H

/** \file
 * Defines the code-generator for producing Xtensa code
 */

#include "CodeGen_C.h"

namespace Halide {
namespace Internal {

class CodeGen_Xtensa : public CodeGen_C {
public:
    CodeGen_Xtensa(std::ostream &s, Target t, OutputKind kind = CImplementation)
        : CodeGen_C(s, t, kind) {
    }

    /** Emit the declarations contained in the module as C code. */
    void compile(const Module &module);

protected:
    /** Emit the declarations contained in the module as C code. */
    void compile(const LoweredFunc &func, const std::map<std::string, std::string> &metadata_name_map) override;
    void compile(const Buffer<> &buffer) override;

    using CodeGen_C::visit;

    bool is_native_vector_type(Type t);

    std::string print_assignment(Type t, const std::string &rhs) override;
    std::string print_type(Type t, CodeGen_C::AppendSpaceIfNeeded space_option = DoNotAppendSpace) override;
    std::string print_xtensa_call(const Call *op);

    void add_vector_typedefs(const std::set<Type> &vector_types) override;

    void visit(const Mul *) override;
    void visit(const Div *) override;
    void visit(const Mod *) override;

    void visit(const Allocate *) override;
    void visit(const For *) override;
    void visit(const Ramp *op) override;
    void visit(const Broadcast *op) override;
    void visit(const Call *op) override;
    void visit(const Cast *op) override;
    void visit(const Load *op) override;
    void visit(const EQ *op) override;
    void visit(const LE *op) override;
    void visit(const LT *op) override;
    void visit(const GT *op) override;
    void visit(const Or *op) override;
    void visit(const Store *op) override;
    void visit(const Select *op) override;
    void visit(const Shuffle *op) override;
    void visit(const Min *op) override;
    void visit(const Max *op) override;
    void visit(const IntImm *op) override;
    void visit(const Let *op) override;
    void visit(const LetStmt *op) override;

protected:
    int current_loop_level = 0;
    std::vector<std::string> global_static_allocations;

    std::set<std::string> external_buffers;
};

}  // namespace Internal
}  // namespace Halide

#endif
back to top