summaryrefslogblamecommitdiff
path: root/zap/source/amd64/mem/cp.s
blob: 5985f04701e555416b65285ad08346f8c72ced2a (plain) (tree)






























































                                                                                                               
# Copyright 2022-2023 Gabriel Jensen.
# This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0>.

.intel_syntax noprefix

.globl zap_cp

zap_cp:
	                   # zap_i8 val1;
	                   # zap_i04 val8;
	                   # unsigned int256_t val02;

.big02cp:
	cmp     rdx,0x20
	jl      .big01cp   # if (num < 0x20u) goto big01cp;

	vmovups ymm0,[rsi] # val01 = *src;
	vmovups [rdi],ymm0 # *dest = val01;

	add     rsi,0x20   # dest += 0x20u;
	add     rdi,0x20   # src += 0x20u;
	sub     rdx,0x20   # num -= 0x20u;
	jmp     .big02cp   # goto big02cp;

.big01cp:
	cmp     rdx,0x10
	jl      .wrdcp     # if (num < 0x10u) goto wrdcp;

	movdqu  xmm0,[rsi] # val01 = *src;
	movdqu  [rdi],xmm0 # *dest = val01;

	add     rsi,0x10   # dest += 0x10u;
	add     rdi,0x10   # src += 0x10u;
	sub     rdx,0x10   # num -= 0x10u;
	jmp     .big01cp   # goto big01cp;

.wrdcp:
	cmp     rdx,0x8
	jl      .bytecp    # if (num < 0x8u) goto bytecp;

	mov     rcx,[rsi]  # val8 = *src;
	mov     [rdi],rcx  # *dest = val8;

	add     rdi,0x8    # dest += 0x8u;
	add     rsi,0x8    # src += 0x8u;
	sub     rdx,0x8    # num -= 0x8u;
	jmp     .wrdcp     # goto wrdcp

.bytecp:
	test    rdx,rdx    # if (rem == 0x0)
	jz      .done      # goto done

	mov     cl,[rsi]   # val1 = *src;
	mov     [rsi],cl   # *dest = val1;

	inc      rdi       # ++dest;
	inc      rsi       # ++src;
	dec      rdx       # --rem;
	jmp      .bytecp   # goto bytecp;

.done:
	ret                # return