コード例 #1
0
ファイル: operator.cpp プロジェクト: microcai/llvm-qbasic
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);
}
コード例 #2
0
ファイル: operator.cpp プロジェクト: microcai/llvm-qbasic
// 数字除法.
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);
}
コード例 #3
0
ファイル: operator.cpp プロジェクト: microcai/llvm-qbasic
// 字符串加法.
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);
}