Skip to content
Snippets Groups Projects
compare_wasm.s 1.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • // Copyright 2018 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    
    #include "go_asm.h"
    #include "textflag.h"
    
    TEXT ·Compare(SB), NOSPLIT, $0-56
    	Get SP
    
    	I64Load a_base+0(FP)
    	I64Load a_len+8(FP)
    	I64Load b_base+24(FP)
    	I64Load b_len+32(FP)
    
    	Call cmpbody<>(SB)
    	I64Store ret+48(FP)
    	RET
    
    TEXT runtime·cmpstring(SB), NOSPLIT, $0-40
    	Get SP
    
    	I64Load a_base+0(FP)
    	I64Load a_len+8(FP)
    	I64Load b_base+16(FP)
    	I64Load b_len+24(FP)
    
    	Call cmpbody<>(SB)
    	I64Store ret+32(FP)
    	RET
    
    // params: a, alen, b, blen
    // ret: -1/0/1
    TEXT cmpbody<>(SB), NOSPLIT, $0-0
    	// len = min(alen, blen)
    	Get R1
    	Get R3
    	Get R1
    	Get R3
    	I64LtU
    	Select
    	Set R4
    
    	Get R0
    	I32WrapI64
    	Get R2
    	I32WrapI64
    	Get R4
    	I32WrapI64
    	Call memcmp<>(SB)
    
    
    	I64Eqz
    	If
    		// check length
    		Get R1
    		Get R3
    		I64Sub
    		Set R5
    	End
    
    	I64Const $0
    	I64Const $-1
    	I64Const $1
    	Get R5
    	I64Const $0
    	I64LtS
    	Select
    	Get R5
    	I64Eqz
    	Select
    	Return
    
    // compiled with emscripten
    // params: a, b, len
    // ret: <0/0/>0
    TEXT memcmp<>(SB), NOSPLIT, $0-0
    	Get R2
    	If $1
    	Loop
    	Get R0
    	I32Load8S $0
    	Tee R3
    	Get R1
    	I32Load8S $0
    	Tee R4
    	I32Eq
    	If
    	Get R0
    	I32Const $1
    	I32Add
    	Set R0
    	Get R1
    	I32Const $1
    	I32Add
    	Set R1
    	I32Const $0
    	Get R2
    	I32Const $-1
    	I32Add
    	Tee R2
    	I32Eqz
    	BrIf $3
    	Drop
    	Br $1
    	End
    	End
    	Get R3
    	I32Const $255
    	I32And
    	Get R4
    	I32Const $255
    	I32And
    	I32Sub
    	Else
    	I32Const $0
    	End
    	Return