summaryrefslogtreecommitdiff
path: root/Type.cc
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-05-29 00:08:49 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-05-29 00:08:49 +0800
commitd4e6ae6f8237f18d9d0b51e7a6404118dffb709f (patch)
treeeb0969f20e5959866e535ac8fe5c84db55595ab5 /Type.cc
parent404afbef3c9223bc44ddd91066c52c44349e43c7 (diff)
add pointer and shifting support
Diffstat (limited to 'Type.cc')
-rw-r--r--Type.cc33
1 files changed, 23 insertions, 10 deletions
diff --git a/Type.cc b/Type.cc
index c01f71f..ea40b29 100644
--- a/Type.cc
+++ b/Type.cc
@@ -93,6 +93,14 @@ Value Type::CreateXor(Value v0, Value v1, Context* context) {
return context->GetBuilder()->CreateXor(v0, v1);
}
+Value Type::CreateShl(Value v0, Value v1, Context* context) {
+ return context->GetBuilder()->CreateShl(v0, v1);
+}
+
+Value Type::CreateShr(Value v0, Value v1, Context* context) {
+ return context->GetBuilder()->CreateAShr(v0, v1);
+}
+
Value Type::CreatePos(Value v, Context* context) { return v; }
Value Type::CreateNeg(Value v, Context* context) {
@@ -174,6 +182,7 @@ Value BooleanType::CreateBinaryOperation(BinaryOperator op, Value v0, Value v1,
&BooleanType::NotAllowed, &BooleanType::CreateEq,
&BooleanType::CreateNe, &BooleanType::CreateAnd,
&BooleanType::CreateOr, &BooleanType::CreateXor,
+ &BooleanType::CreateShl, &BooleanType::CreateShr,
&BooleanType::NotAllowed,
};
return (this->*operations[ToUnderlying(op)])(v0, v1, context);
@@ -198,7 +207,8 @@ Value CharType::CreateBinaryOperation(BinaryOperator op, Value v0, Value v1,
&CharType::CreateDiv, &CharType::CreateMod, &CharType::CreateLt,
&CharType::CreateLe, &CharType::CreateGt, &CharType::CreateGe,
&CharType::CreateEq, &CharType::CreateNe, &CharType::CreateAnd,
- &CharType::CreateOr, &CharType::CreateXor, &CharType::NotAllowed};
+ &CharType::CreateOr, &CharType::CreateXor, &CharType::CreateShl,
+ &CharType::CreateShr, &CharType::NotAllowed};
return (this->*operations[ToUnderlying(op)])(v0, v1, context);
}
@@ -225,6 +235,7 @@ Value IntegerType::CreateBinaryOperation(BinaryOperator op, Value v0, Value v1,
&IntegerType::CreateGe, &IntegerType::CreateEq,
&IntegerType::CreateNe, &IntegerType::CreateAnd,
&IntegerType::CreateOr, &IntegerType::CreateXor,
+ &IntegerType::CreateShl, &IntegerType::CreateShr,
&IntegerType::NotAllowed};
return (this->*operations[ToUnderlying(op)])(v0, v1, context);
}
@@ -249,7 +260,8 @@ Value RealType::CreateBinaryOperation(BinaryOperator op, Value v0, Value v1,
&RealType::CreateFDiv, &RealType::CreateFMod, &RealType::CreateFLt,
&RealType::CreateFLe, &RealType::CreateFGt, &RealType::CreateFGe,
&RealType::CreateFEq, &RealType::CreateFNe, &RealType::NotAllowed,
- &RealType::NotAllowed, &RealType::NotAllowed, &RealType::NotAllowed};
+ &RealType::NotAllowed, &RealType::NotAllowed, &RealType::NotAllowed,
+ &RealType::NotAllowed, &RealType::NotAllowed};
return (this->*operations[ToUnderlying(op)])(v0, v1, context);
}
@@ -287,7 +299,7 @@ Value ArrayType::CreateArrayAccess(Value v0, Value v1, Context* context) {
llvm::ConstantInt::get(IndexType_->GetLLVMType(), 0, true),
IndexType_->CreateBinaryOperation(BinaryOperator::SUB, v1, start_,
context)};
- return context->GetBuilder()->CreateInBoundsGEP(LLVMType_, v0, indices);
+ return context->GetBuilder()->CreateInBoundsGEP(v0, indices);
}
PointerType::PointerType(std::shared_ptr<Type> ElementType,
@@ -309,13 +321,14 @@ Value PointerType::CreateBinaryOperation(BinaryOperator op, Value v0, Value v1,
Context* context) {
static Value (pcc::PointerType::*operations[ToUnderlying(
BinaryOperator::BINARYOP_NUMBER)])(Value, Value, Context*) = {
- &PointerType::NotAllowed, &PointerType::CreatePointerSub,
- &PointerType::NotAllowed, &PointerType::NotAllowed,
- &PointerType::NotAllowed, &PointerType::CreateLt,
- &PointerType::CreateLe, &PointerType::CreateGt,
- &PointerType::CreateGe, &PointerType::CreateEq,
- &PointerType::CreateNe, &PointerType::NotAllowed,
- &PointerType::NotAllowed, &PointerType::NotAllowed,
+ &PointerType::NotAllowed, &PointerType::CreatePointerSub,
+ &PointerType::NotAllowed, &PointerType::NotAllowed,
+ &PointerType::NotAllowed, &PointerType::CreateLt,
+ &PointerType::CreateLe, &PointerType::CreateGt,
+ &PointerType::CreateGe, &PointerType::CreateEq,
+ &PointerType::CreateNe, &PointerType::NotAllowed,
+ &PointerType::NotAllowed, &PointerType::NotAllowed,
+ &PointerType::NotAllowed, &PointerType::NotAllowed,
&PointerType::CreateArrayAccess};
return (this->*operations[ToUnderlying(op)])(v0, v1, context);
}