ExprASTPtr NumberExprOperation::operator_comp(ASTContext ctx, MathOperator op, ExprASTPtr lval, ExprASTPtr rval) { llvm::Value * LHS = lval->getval(ctx); llvm::Value * RHS = rval->getval(ctx); llvm::IRBuilder<> builder(ctx.block); llvm::Value * result; switch(op){ case OPERATOR_LESS: result = builder.CreateICmpSLT(LHS,RHS); break; case OPERATOR_LESSEQU: result = builder.CreateICmpSLE(LHS,RHS); break; case OPERATOR_GREATER: result = builder.CreateICmpSGT(LHS,RHS); break; case OPERATOR_GREATEREQUL: result = builder.CreateICmpSGE(LHS,RHS); break; case OPERATOR_EQUL: result = builder.CreateICmpEQ(LHS,RHS); break; } //TODO , 构造临时 Number 对象. return lval->type(ctx)->createtemp(ctx,result,NULL); }
// 数字除法. ExprASTPtr NumberExprOperation::operator_div(ASTContext ctx, ExprASTPtr lval, ExprASTPtr rval) { llvm::Value * LHS = lval->getval(ctx); llvm::Value * RHS = rval->getval(ctx); llvm::IRBuilder<> builder(ctx.block); llvm::Value * result = builder.CreateSDiv(LHS,RHS); //TODO , 构造临时 Number 对象. return lval->type(ctx)->createtemp(ctx,result,NULL); }
// 字符串加法. ExprASTPtr StringExprOperation::operator_add(ASTContext ctx, ExprASTPtr lval, ExprASTPtr rval) { llvm::IRBuilder<> builder(ctx.block); llvm::Constant * llvmfunc_calloc = qbc::getbuiltinprotype(ctx,"malloc"); llvm::Constant * llvmfunc_strlen = qbc::getbuiltinprotype(ctx,"strlen"); llvm::Constant * llvmfunc_strcpy = qbc::getbuiltinprotype(ctx,"strcpy"); llvm::Constant * llvmfunc_strcat = qbc::getbuiltinprotype(ctx,"strcat"); llvm::Value * string_left_length = builder.CreateCall(llvmfunc_strlen,lval->getval(ctx)); llvm::Value * string_right_length = builder.CreateCall(llvmfunc_strlen,rval->getval(ctx)); llvm::Value * result_length = builder.CreateAdd(string_left_length, string_right_length); llvm::Value * resultstring = builder.CreateCall(llvmfunc_calloc,result_length); builder.CreateCall(llvmfunc_strcpy, {resultstring, lval->getval(ctx)}); builder.CreateCall(llvmfunc_strcat, {resultstring, rval->getval(ctx)}); return lval->type(ctx)->createtemp(ctx, resultstring, NULL); }