Files
openGauss-server/src/include/codegen/builtinscodegen.h
2021-03-06 12:39:28 +08:00

174 lines
6.9 KiB
C++

/*
* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* ---------------------------------------------------------------------------------------
*
* builtinscodegen.h
* Declarations of code generation for operations on built-in types.
*
*
* IDENTIFICATION
* src/include/codegen/builtinscodegen.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef LLVM_BUILTINS_H
#define LLVM_BUILTINS_H
#include "catalog/pg_type.h"
#include "codegen/gscodegen.h"
#include "fmgr.h"
#include "nodes/execnodes.h"
#include "nodes/primnodes.h"
#include "utils/biginteger.h"
namespace dorado {
/* Get the byte length of a multibyte character. */
#define MB_LEN(mlen, string) \
if ((*string & 0x80) == 0) \
mlen = 1; \
else if ((*string & 0xe0) == 0xc0) \
mlen = 2; \
else if ((*string & 0xf0) == 0xe0) \
mlen = 3; \
else if ((*string & 0xf8) == 0xf0) \
mlen = 4; \
else \
mlen = 1;
/*
* int_codegen.inl
* template function for simple op('='/'!='/'<='/'>='/'<'/'>') of int type.
*/
template <SimpleOp op>
llvm::Function* int2_sop_codegen();
template <SimpleOp op>
llvm::Function* int4_sop_codegen();
template <SimpleOp op>
llvm::Function* int8_sop_codegen();
template <SimpleOp op, int ltype>
llvm::Function* int2_int4_sop_codegen();
template <SimpleOp op, int ltype>
llvm::Function* int4_int8_sop_codegen();
/*
* numeric_codegen.inl
* template function for simple op('='/'!='/'<='/'>='/'<'/'>') of numeric type.
* Since most cases the data can be converted to BI integer, we especially
* codegen the bi64 operations. For orginal numeric data, just call original
* row functions.
*/
template <biop op>
llvm::Function* numeric_sop_codegen();
template <biop op>
llvm::Function* bi64cmp64_codegen();
template <biop op>
llvm::Function* fast_numericbi_sop_codegen();
template <biop op>
llvm::Value* WrapnumericFuncCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* arg);
/* boolcodegen.cpp */
llvm::Function* booleq_codegen();
/* intcodegen.cpp */
llvm::Function* int4pl_codegen();
llvm::Function* int4mi_codegen();
llvm::Function* int4mul_codegen();
llvm::Function* int4div_codegen();
llvm::Function* int8pl_codegen();
llvm::Function* int8mi_codegen();
llvm::Function* int8mul_codegen();
llvm::Function* int8div_codegen();
llvm::Function* int48pl_codegen();
llvm::Function* int84pl_codegen();
llvm::Function* int48mi_codegen();
llvm::Function* int84mi_codegen();
llvm::Function* int48mul_codegen();
llvm::Function* int84mul_codegen();
llvm::Function* int48div_codegen();
llvm::Function* int84div_codegen();
/* floatcodegen.cpp */
llvm::Function* float8eq_codegen();
llvm::Function* float8ne_codegen();
llvm::Function* float8lt_codegen();
llvm::Function* float8le_codegen();
llvm::Function* float8gt_codegen();
llvm::Function* float8ge_codegen();
/* numericcodegen.cpp */
llvm::Function* int8_sum_codegen(Aggref* aggref);
llvm::Function* int8_avg_codegen(Aggref* aggref);
llvm::Function* numeric_sum_codegen(Aggref* aggref);
llvm::Function* vsnumeric_sum_codegen(Aggref* aggref);
llvm::Function* numeric_avg_codegen(Aggref* aggref);
llvm::Function* vsnumeric_avg_codegen(Aggref* aggref);
llvm::Function* vec_count_codegen(Aggref* aggref);
llvm::Function* vsonic_count_codegen(Aggref* aggref);
/* assistant function needed by numeric agg functions */
llvm::Value* DatumGetBINumericCodeGenShort(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* pval);
llvm::Value* DatumGetBINumericCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* pval);
llvm::Value* WrapaddVariableCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* ccontext, llvm::Value* val);
llvm::Value* WrapreplVariableCodeGen(
GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* ccontext, llvm::Value* oldval, llvm::Value* val);
llvm::Value* WrapmakeNumeric64CodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* data, llvm::Value* scale);
llvm::Value* WrapmakeNumeric128CodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* data, llvm::Value* scale);
void WrapBiAggAddMatrixCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* arg1, llvm::Value* arg2,
llvm::Value* leftarg, llvm::Value* rightarg, llvm::Value* ctl);
llvm::Value* WrapBiFunMatrixCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* op, llvm::Value* arg1,
llvm::Value* arg2, llvm::Value* leftarg, llvm::Value* rightarg);
void WrapDeconstructArrayCodeGen(
GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* pval, llvm::Value* datumarray, llvm::Value* ndatum);
void WrapcallnumericaddCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* cell, llvm::Value* mct,
llvm::Value* larg, llvm::Value* rarg, llvm::Value* nidx);
void WrapcallscnumaddCodeGen(
GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* data, llvm::Value* larg, llvm::Value* rarg, llvm::Value* loc);
/* bigintegercodegen.cpp */
llvm::Function* bi64add64_codegen(bool use_ctl);
llvm::Function* bi64sub64_codegen();
llvm::Function* bi64mul64_codegen();
llvm::Function* bi64div64_codegen();
/* assistant function needed by biginteger functions */
llvm::Value* GetInt64MulOutofBoundCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* deltascale);
llvm::Value* ScaleMultiCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* deltascale);
llvm::Value* GetScaleMultiCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* deltascale);
void WrapReplVarWithOldCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* ctl, llvm::Value* Val);
llvm::Value* Wrapbi64div64CodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* larg, llvm::Value* rarg);
/* varcharcodegen.cpp */
llvm::Function* bpchareq_codegen();
llvm::Function* bpcharne_codegen();
llvm::Function* bpcharlen_codegen(int current_encoding);
/* varlenacodegen.cpp */
llvm::Function* texteq_codegen();
llvm::Function* textlt_codegen();
llvm::Function* textgt_codegen();
llvm::Function* substr_codegen();
llvm::Function* rtrim1_codegen();
llvm::Function* btrim1_codegen();
llvm::Function* textlike_codegen();
llvm::Function* textnlike_codegen();
llvm::Function* VarlenaCvtCodeGen();
llvm::Value* VarlenaGetDatumCodeGen(GsCodeGen::LlvmBuilder* ptrbuilder, llvm::Value* len, llvm::Value* data);
} // namespace dorado
/* Include template function in int_codegen.inl */
#include "../../gausskernel/runtime/codegen/codegenutil/int_codegen.inl"
#include "../../gausskernel/runtime/codegen/codegenutil/numeric_codegen.inl"
#endif