From 40463477cb10c9ffaab4971f474e30832b8bca86 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Thu, 18 Aug 2016 09:40:01 +0300 Subject: [PATCH] translator: add mod operator for all types --- .../kotlin/org/kotlinnative/translator/BlockCodegen.kt | 8 ++++++++ .../kotlinnative/translator/llvm/types/LLVMByteType.kt | 3 +++ .../kotlinnative/translator/llvm/types/LLVMDoubleType.kt | 3 +++ .../kotlinnative/translator/llvm/types/LLVMFloatType.kt | 3 +++ .../org/kotlinnative/translator/llvm/types/LLVMIntType.kt | 3 +++ .../kotlinnative/translator/llvm/types/LLVMLongType.kt | 4 +++- .../kotlinnative/translator/llvm/types/LLVMShortType.kt | 3 +++ .../org/kotlinnative/translator/llvm/types/LLVMType.kt | 1 + 8 files changed, 27 insertions(+), 1 deletion(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index adc6bcf2369..026493ba16d 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -716,6 +716,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va "or" -> firstNativeOp.type!!.operatorOr(firstNativeOp, secondNativeOp) "xor" -> firstNativeOp.type!!.operatorXor(firstNativeOp, secondNativeOp) "and" -> firstNativeOp.type!!.operatorAnd(firstNativeOp, secondNativeOp) + "%" -> firstNativeOp.type!!.operatorMod(firstNativeOp, secondNativeOp) "shl" -> { var secondNativeOpWithRequiredType = secondNativeOp if (firstNativeOp.type != secondNativeOp.type) { @@ -765,6 +766,13 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va codeBuilder.storeVariable(firstOp, resultOp) return LLVMExpression(resultOp.type, "load ${firstOp.getType()} $firstOp, align ${firstOp.type!!.align}") } + "%=" -> { + val llvmExpression = firstNativeOp.type!!.operatorMod(firstNativeOp, secondNativeOp) + val resultOp = codeBuilder.getNewVariable(llvmExpression.variableType) + codeBuilder.addAssignment(resultOp, llvmExpression) + codeBuilder.storeVariable(firstOp, resultOp) + return LLVMExpression(resultOp.type, "load ${firstOp.getType()} $firstOp, align ${firstOp.type!!.align}") + } else -> throw UnsupportedOperationException("Unknown binary operator") } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt index 98d2e50a8a7..f228db83e8e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt @@ -22,6 +22,9 @@ class LLVMByteType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMByteType(), "srem i8 $firstOp, $secondOp") + override fun equals(other: Any?): Boolean { return other is LLVMByteType } 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 index 847dd38d811..8f6657fc96a 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt @@ -42,6 +42,9 @@ class LLVMDoubleType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "fcmp one double $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMDoubleType(), "frem double $firstOp, $secondOp") + override fun equals(other: Any?): Boolean { return other is LLVMDoubleType } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt index f7047f225f9..167753c1b2e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt @@ -42,6 +42,9 @@ class LLVMFloatType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "fcmp one float $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMFloatType(), "frem float $firstOp, $secondOp") + override fun equals(other: Any?): Boolean { return other is LLVMFloatType } 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 1db8609c1d8..da8064736dc 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 @@ -61,6 +61,9 @@ class LLVMIntType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i32 $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMIntType(), "srem i32 $firstOp, $secondOp") + override fun equals(other: Any?): Boolean { return other is LLVMIntType } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt index 8d939230465..ef12bc79d08 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt @@ -43,7 +43,6 @@ class LLVMLongType() : LLVMType() { override fun operatorGt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp sgt i64 $firstOp, $secondOp") - override fun operatorLeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp sle i64 $firstOp, $secondOp") @@ -56,6 +55,9 @@ class LLVMLongType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i64 $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMLongType(), "srem i64 $firstOp, $secondOp") + override fun convertFrom(source: LLVMSingleValue): LLVMExpression = when (source.type!!) { is LLVMBooleanType, is LLVMByteType, diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt index d062d9f7c03..fb3efd3b5aa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt @@ -22,6 +22,9 @@ class LLVMShortType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i16 $firstOp, $secondOp") + override fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMShortType(), "srem i16 $firstOp, $secondOp") + override fun equals(other: Any?): Boolean { return other is LLVMShortType } 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 f4717557471..935f5c7f107 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 @@ -21,6 +21,7 @@ abstract class LLVMType() : Cloneable { open fun operatorShl(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorShr(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorUshr(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() + open fun operatorMod(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorInc(firstOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorDec(firstOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun parseArg(inputArg: String) = inputArg