From 9ca257196b46fd7629bce0b338580e571e4113a8 Mon Sep 17 00:00:00 2001 From: Pavel Vyssotski Date: Fri, 31 Jul 2015 13:03:17 +0600 Subject: [PATCH] ART: x86_64 RoundDouble/Float intrinsics should initialize out value. x86_64 RoundDouble intrinsic should initialize output register for the case of "inPlusPointFive >= maxLong" as expected. The same for the RoundFloat intrinsic. Fixed also the out register type in CreateSSE41FPToIntLocations provoking a DCHECK failure. Change-Id: I0a910682e2917214861683c678ffba8e0f4bfed8 Signed-off-by: Pavel Vyssotski --- compiler/optimizing/intrinsics_x86_64.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index ea342e938..1a50f50c8 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -690,7 +690,7 @@ static void CreateSSE41FPToIntLocations(ArenaAllocator* arena, LocationSummary::kNoCall, kIntrinsified); locations->SetInAt(0, Location::RequiresFpuRegister()); - locations->SetOut(Location::RequiresFpuRegister()); + locations->SetOut(Location::RequiresRegister()); locations->AddTemp(Location::RequiresFpuRegister()); return; } @@ -732,6 +732,9 @@ void IntrinsicCodeGeneratorX86_64::VisitMathRoundFloat(HInvoke* invoke) { // And truncate to an integer. __ roundss(inPlusPointFive, inPlusPointFive, Immediate(1)); + // Load maxInt into out. + codegen_->Load64BitValue(out, kPrimIntMax); + // if inPlusPointFive >= maxInt goto done __ comiss(inPlusPointFive, codegen_->LiteralFloatAddress(static_cast(kPrimIntMax))); __ j(kAboveEqual, &done); @@ -776,6 +779,9 @@ void IntrinsicCodeGeneratorX86_64::VisitMathRoundDouble(HInvoke* invoke) { // And truncate to an integer. __ roundsd(inPlusPointFive, inPlusPointFive, Immediate(1)); + // Load maxLong into out. + codegen_->Load64BitValue(out, kPrimLongMax); + // if inPlusPointFive >= maxLong goto done __ comisd(inPlusPointFive, codegen_->LiteralDoubleAddress(static_cast(kPrimLongMax))); __ j(kAboveEqual, &done); -- 2.11.0