From 801f6a5036f074e0f5e782c8f2517f6d68eb01bd Mon Sep 17 00:00:00 2001 From: Pavel Punegov Date: Fri, 26 Jun 2020 21:05:41 +0300 Subject: [PATCH] Emit 'fneg' for unary minus with floating point operand. Simple negation from 0 doesn't work in case -0.0 argument. --- .../org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt | 1 + .../jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index daffa50fbfe..ed35db3b41a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -588,6 +588,7 @@ internal class FunctionGenerationContext(val function: LLVMValueRef, fun fsub(arg0: LLVMValueRef, arg1: LLVMValueRef, name: String = ""): LLVMValueRef = LLVMBuildFSub(builder, arg0, arg1, name)!! fun fadd(arg0: LLVMValueRef, arg1: LLVMValueRef, name: String = ""): LLVMValueRef = LLVMBuildFAdd(builder, arg0, arg1, name)!! + fun fneg(arg: LLVMValueRef, name: String = ""): LLVMValueRef = LLVMBuildFNeg(builder, arg, name)!! fun select(ifValue: LLVMValueRef, thenValue: LLVMValueRef, elseValue: LLVMValueRef, name: String = ""): LLVMValueRef = LLVMBuildSelect(builder, ifValue, thenValue, elseValue, name)!! diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt index 61e560d111f..81ad60bccae 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IntrinsicGenerator.kt @@ -699,10 +699,10 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv private fun FunctionGenerationContext.emitUnaryMinus(args: List): LLVMValueRef { val first = args[0] val destTy = first.type - val const0 = makeConstOfType(destTy, 0) return if (destTy.isFloatingPoint()) { - fsub(const0, first) + fneg(first) } else { + val const0 = makeConstOfType(destTy, 0) sub(const0, first) } }