From d4c3d6dabdae9635788610f10e17aff26421a416 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Wed, 2 Nov 2016 11:31:29 +0300 Subject: [PATCH] plus'n'minus_eq operation: support for integer comparison operations for code (plus_eq): --------------8<------------------ > cat ../backend.native/tests/codegen/function/plus_eq.kt fun plus_eq(a: Int): Int { var b = 11 b += a return b } --------------8<------------------ generator produces: --------------8<------------------ > llvm-dis-mp-3.8 ../backend.native/tests/codegen/function/plus_eq.kt.bc -o - ; ModuleID = '../backend.native/tests/codegen/function/plus_eq.kt.bc' target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.12.0" .... define i32 @"kfun:plus_eq"(i32) { entry: %a = alloca i32 store i32 %0, i32* %a %b = alloca i32 store i32 11, i32* %b %tmp1 = load i32, i32* %b %tmp2 = load i32, i32* %a %tmp0 = add i32 %tmp1, %tmp2 store i32 %tmp0, i32* %b %tmp3 = load i32, i32* %b ret i32 %tmp3 } --------------8<------------------ and for (minus_eq): --------------8<------------------ > cat ../backend.native/tests/codegen/function/minus_eq.kt fun minus_eq(a: Int): Int { var b = 11 b -= a return b } --------------8<------------------ generator produces: --------------8<------------------ > llvm-dis-mp-3.8 ../backend.native/tests/codegen/function/minus_eq.kt.bc -o - ; ModuleID = '../backend.native/tests/codegen/function/minus_eq.kt.bc' target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.12.0" ... define i32 @"kfun:minus_eq"(i32) { entry: %a = alloca i32 store i32 %0, i32* %a %b = alloca i32 store i32 11, i32* %b %tmp1 = load i32, i32* %b %tmp2 = load i32, i32* %a %tmp0 = sub i32 %tmp1, %tmp2 store i32 %tmp0, i32* %b %tmp3 = load i32, i32* %b ret i32 %tmp3 } --------------8<------------------ --- .../kotlin/backend/native/llvm/CodeGenerator.kt | 13 +++++++------ .../kotlin/backend/native/llvm/IrToBitcode.kt | 14 ++++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt index ac00f7d5306..8adcef9f743 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt @@ -119,12 +119,13 @@ internal class CodeGenerator(override val context:Context) : ContextUtils { fun FunctionDescriptor.registerVariable(varName: String, value:LLVMOpaqueValue?) = variables.put(varName, value) private fun FunctionDescriptor.variable(varName: String): LLVMOpaqueValue? = variables[varName] - fun plus (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildAdd (context.llvmBuilder, arg0, arg1, result)!! - fun mul (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildMul (context.llvmBuilder, arg0, arg1, result)!! - fun minus(arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSub (context.llvmBuilder, arg0, arg1, result)!! - fun div (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSDiv(context.llvmBuilder, arg0, arg1, result)!! - fun srem (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSRem(context.llvmBuilder, arg0, arg1, result)!! - fun icmpEq(arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildICmp(context.llvmBuilder, LLVMIntPredicate.LLVMIntEQ, arg0!!, arg1!!, result)!! + fun plus (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildAdd (context.llvmBuilder, arg0, arg1, result)!! + fun mul (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildMul (context.llvmBuilder, arg0, arg1, result)!! + fun minus (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSub (context.llvmBuilder, arg0, arg1, result)!! + fun div (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSDiv(context.llvmBuilder, arg0, arg1, result)!! + fun srem (arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildSRem(context.llvmBuilder, arg0, arg1, result)!! + + fun icmpEq(arg0: LLVMOpaqueValue, arg1: LLVMOpaqueValue, result: String): LLVMOpaqueValue = LLVMBuildICmp(context.llvmBuilder, LLVMIntPredicate.LLVMIntEQ, arg0, arg1, result)!! fun bitcast(type: LLVMOpaqueType?, value: LLVMOpaqueValue, result: String) = LLVMBuildBitCast(context.llvmBuilder, value, type, result) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt index 7be136ade0a..6441b5ec699 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt @@ -361,12 +361,14 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid private fun evaluateOperatorCall(tmpVariableName: String, callee: IrCall, args: MutableList): LLVMOpaqueValue { logger.log("evaluateCall $tmpVariableName = ${ir2string(callee)}") when (callee.origin) { - IrStatementOrigin.PLUS -> return generator.plus (args[0]!!, args[1]!!, tmpVariableName) - IrStatementOrigin.MINUS -> return generator.minus (args[0]!!, args[1]!!, tmpVariableName) - IrStatementOrigin.MUL -> return generator.mul (args[0]!!, args[1]!!, tmpVariableName) - IrStatementOrigin.DIV -> return generator.div (args[0]!!, args[1]!!, tmpVariableName) - IrStatementOrigin.PERC -> return generator.srem (args[0]!!, args[1]!!, tmpVariableName) - IrStatementOrigin.EQEQ -> return generator.icmpEq(args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.PLUS -> return generator.plus (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.MINUS -> return generator.minus (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.PLUSEQ -> return generator.plus (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.MINUSEQ -> return generator.minus (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.MUL -> return generator.mul (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.DIV -> return generator.div (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.PERC -> return generator.srem (args[0]!!, args[1]!!, tmpVariableName) + IrStatementOrigin.EQEQ -> return generator.icmpEq(args[0]!!, args[1]!!, tmpVariableName) else -> { TODO() }