From 8c7f97d39d04869b0026e8c0f462da543a97113c Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 9 Jun 2023 01:58:53 +0100 Subject: [PATCH] compiler(amd64): eliminate a bounds check in memory copy (#1509) Signed-off-by: Nuno Cruces --- internal/engine/compiler/impl_amd64.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/internal/engine/compiler/impl_amd64.go b/internal/engine/compiler/impl_amd64.go index 8f5c6b24..e1c072ce 100644 --- a/internal/engine/compiler/impl_amd64.go +++ b/internal/engine/compiler/impl_amd64.go @@ -3845,15 +3845,14 @@ func (c *amd64Compiler) compileMemoryCopy() error { c.assembler.CompileRegisterToRegister(amd64.ADDQ, copySize.register, sourceOffset.register) // destinationOffset += size. c.assembler.CompileRegisterToRegister(amd64.ADDQ, copySize.register, destinationOffset.register) + // tmp = max(sourceOffset, destinationOffset). + c.assembler.CompileRegisterToRegister(amd64.CMPQ, sourceOffset.register, destinationOffset.register) + c.assembler.CompileRegisterToRegister(amd64.MOVQ, sourceOffset.register, tmp) + c.assembler.CompileRegisterToRegister(amd64.CMOVQCS, destinationOffset.register, tmp) - // Check source bounds and if exceeds the length, exit with out of bounds error. + // Check maximum bounds and if exceeds the length, exit with out of bounds error. c.assembler.CompileMemoryToRegister(amd64.CMPQ, - amd64ReservedRegisterForCallEngine, callEngineModuleContextMemorySliceLenOffset, sourceOffset.register) - c.compileTrapFromNativeCode(amd64.JCC, nativeCallStatusCodeMemoryOutOfBounds) - - // Check destination bounds and if exceeds the length, exit with out of bounds error. - c.assembler.CompileMemoryToRegister(amd64.CMPQ, - amd64ReservedRegisterForCallEngine, callEngineModuleContextMemorySliceLenOffset, destinationOffset.register) + amd64ReservedRegisterForCallEngine, callEngineModuleContextMemorySliceLenOffset, tmp) c.compileTrapFromNativeCode(amd64.JCC, nativeCallStatusCodeMemoryOutOfBounds) // Skip zero size.