mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
2.8 KiB
142 lines
2.8 KiB
// TITLE("memset")
|
|
//++
|
|
//
|
|
// Copyright (c) 1995 IBM Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// memsetp.s
|
|
//
|
|
// Author:
|
|
//
|
|
// John Morgan (jpm) 13-Oct-1995
|
|
//
|
|
// Environment:
|
|
//
|
|
// User or Kernel mode.
|
|
//
|
|
// Revision History:
|
|
//
|
|
|
|
.globl memset
|
|
.globl ..memset
|
|
|
|
// code table
|
|
|
|
.pdata
|
|
.align 2
|
|
.long ..memset,memset.e,0,0,memset.b
|
|
|
|
// function descriptor
|
|
|
|
.rdata
|
|
.align 2
|
|
memset:
|
|
.long ..memset,.toc
|
|
|
|
// function code
|
|
.text
|
|
.align 6
|
|
|
|
//
|
|
// void * memset(
|
|
// void * dest,
|
|
// int c,
|
|
// size_t count )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// stores c in count bytes starting at dest.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// dest (r3) - pointer to the memory destination
|
|
//
|
|
// c (r4) - byte value to store
|
|
//
|
|
// count (r5) - number of bytes to move
|
|
//
|
|
// Return Value:
|
|
//
|
|
// dest (r3) - original pointer to destination
|
|
//
|
|
|
|
..memset:
|
|
.function ..memset
|
|
memset.b:
|
|
|
|
// make sure destination is aligned.
|
|
addi r0,r5,1
|
|
mtctr r0
|
|
ori r6,r3,0
|
|
b ms.2
|
|
|
|
ms.1:
|
|
// store byte and try again
|
|
addi r5,r5,-1
|
|
stb r4,0(r6)
|
|
addi r6,r6,1
|
|
// check alignment and exit if aligned or entire block set
|
|
ms.2:
|
|
andi. r0,r6,3
|
|
bdnzf- eq,ms.1
|
|
|
|
// set block by 4 words
|
|
rlwimi r4,r4,8,16,23
|
|
srwi. r0,r5,4 // get number of words
|
|
rlwimi r4,r4,16,0,15
|
|
beq+ ms.4 // skip to word copy if length < 16
|
|
mtctr r0
|
|
|
|
ms.3:
|
|
stw r4,0(r6)
|
|
stw r4,4(r6)
|
|
stw r4,8(r6)
|
|
stw r4,12(r6)
|
|
addi r6,r6,16
|
|
bdnz+ ms.3
|
|
|
|
ms.4:
|
|
// set block by words
|
|
rlwinm. r0,r5,30,30,31 // get number of words
|
|
beq- ms.5 // skip word copy if length < 4
|
|
mtctr r0
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
bdz- ms.5
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
bdz- ms.5
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
|
|
ms.5:
|
|
// set last bytes (if any)
|
|
andi. r0,r5,3
|
|
mtctr r0
|
|
beqlr+
|
|
stb r4,0(r6)
|
|
bdzlr-
|
|
stb r4,1(r6)
|
|
bdzlr-
|
|
stb r4,2(r6)
|
|
|
|
blr
|
|
memset.e:
|
|
|
|
|
|
.debug$S
|
|
.ualong 1
|
|
|
|
.uashort 18
|
|
.uashort 0x9 # S_OBJNAME
|
|
.ualong 0
|
|
.byte 11, "memsetp.obj"
|
|
|
|
.uashort 24
|
|
.uashort 0x1 # S_COMPILE
|
|
.byte 0x42 # Target processor = PPC 604
|
|
.byte 3 # Language = ASM
|
|
.byte 0
|
|
.byte 0
|
|
.byte 17, "PowerPC Assembler"
|