diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index ca988601418..e7e5f59009e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -4,15 +4,14 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.lexer.KtTokens import org.kotlinnative.translator.llvm.types.LLVMIntType import org.kotlinnative.translator.llvm.types.LLVMType -import kotlin.reflect.KFunction0 class LLVMBuilder { private var llvmCode: StringBuilder = StringBuilder() private var variableCount = 0 - fun getNewVariable(type: KFunction0?): LLVMVariable { + fun getNewVariable(type: LLVMType?): LLVMVariable { variableCount++ - return LLVMVariable("%var$variableCount", type?.invoke()) + return LLVMVariable("%var$variableCount", type) } fun addLLVMCode(code: String) { @@ -28,18 +27,23 @@ class LLVMBuilder { } fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { - val newVar = getNewVariable(::LLVMIntType) - val llvmOperator = when (operation) { - KtTokens.PLUS -> "add nsw i32" - KtTokens.MINUS -> "sub nsw i32" - KtTokens.MUL -> "mul nsw i32" - else -> throw UnsupportedOperationException("Unknown binary operator") + val newVar = getNewVariable(LLVMIntType()) + val llvmExpression = when (operation) { + KtTokens.PLUS -> firstOp.type!!.operatorPlus(newVar, firstOp, secondOp) + KtTokens.MINUS -> firstOp.type!!.operatorMinus(newVar, firstOp, secondOp) + KtTokens.MUL -> firstOp.type!!.operatorTimes(newVar, firstOp, secondOp) + else -> throw UnsupportedOperationException("Unkbown binary operator") } - llvmCode.appendln("$newVar = $llvmOperator $firstOp, $secondOp") + addAssignment(newVar, llvmExpression) + return newVar } + fun addAssignment(llvmVariable: LLVMNode, assignExpression: LLVMNode) { + llvmCode.appendln("$llvmVariable = $assignExpression") + } + fun clean() { llvmCode = StringBuilder() } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt index c152429496a..d9ccf052151 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt @@ -1,14 +1,11 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -import kotlin.reflect.KFunction0 -open class LLVMExpression(val variableType: KFunction0, val llvmCode: String) : LLVMNode() { +class LLVMExpression(val variableType: LLVMType, val llvmCode: String) : LLVMNode() { - fun generateExpression(builder: LLVMBuilder): LLVMVariable { - val newVar = builder.getNewVariable(variableType) - builder.addLLVMCode("%$newVar = $llvmCode") - return newVar + override fun toString(): String { + return llvmCode } } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt new file mode 100644 index 00000000000..a30461a35e6 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt @@ -0,0 +1,24 @@ +package org.kotlinnative.translator.llvm.types + +import org.kotlinnative.translator.llvm.LLVMExpression +import org.kotlinnative.translator.llvm.LLVMVariable + + +class LLVMDoubleType() : LLVMType() { + + override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(LLVMDoubleType(), "fsub double i32 $firstOp, $secondOp") + } + + override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(LLVMDoubleType(), "fmul double i32 $firstOp, $secondOp") + } + + override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp") + } + +} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt index cd8a406fe7c..ea7e59b4a6b 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt @@ -6,9 +6,19 @@ import org.kotlinnative.translator.llvm.LLVMVariable class LLVMIntType() : LLVMType() { + override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(LLVMIntType(), "sub nsw i32 $firstOp, $secondOp") + } + + override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { + //TODO switch by types: int + double = int + return LLVMExpression(LLVMIntType(), "mul nsw i32 $firstOp, $secondOp") + } + override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "add nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "add nsw i32 $firstOp, $secondOp") } override fun toString(): String { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt index d74e29a7ca9..af5e2634b70 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt @@ -5,7 +5,10 @@ import org.kotlinnative.translator.llvm.LLVMExpression import org.kotlinnative.translator.llvm.LLVMVariable abstract class LLVMType() { + abstract fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; + abstract fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; + abstract fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression; } fun parseLLVMType(type: String): LLVMType = when(type) {