diff options
| -rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 1688ea7811..0b17c9d27e 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -2927,7 +2927,7 @@ void IntrinsicLocationsBuilderARM64::VisitCRC32Update(HInvoke* invoke) { locations->SetInAt(0, Location::RequiresRegister()); locations->SetInAt(1, Location::RequiresRegister()); - locations->SetOut(Location::RequiresRegister()); + locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); } // Lower the invoke of CRC32.update(int crc, int b). @@ -2945,9 +2945,13 @@ void IntrinsicCodeGeneratorARM64::VisitCRC32Update(HInvoke* invoke) { // result = crc32_for_byte(crc, b) // crc = ~result // It is directly lowered to three instructions. - __ Mvn(out, crc); - __ Crc32b(out, out, val); - __ Mvn(out, out); + + UseScratchRegisterScope temps(masm); + Register tmp = temps.AcquireSameSizeAs(out); + + __ Mvn(tmp, crc); + __ Crc32b(tmp, tmp, val); + __ Mvn(out, tmp); } // The threshold for sizes of arrays to use the library provided implementation |