1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* memset.S: optimised assembly memset 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Written by David Howells (dhowells@redhat.com) 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU General Public License 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * as published by the Free Software Foundation; either version 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 2 of the License, or (at your option) any later version. 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .text 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .p2align 4 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng############################################################################### 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# void *memset(void *p, char ch, size_t count) 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# - NOTE: must not use any stack. exception detection performs function return 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# to caller's fixup routine, aborting the remainder of the set 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# GR4, GR7, GR8, and GR11 must be managed 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng############################################################################### 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .globl memset,__memset_end 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .type memset,@function 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset: 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng orcc.p gr10,gr0,gr5,icc3 ; GR5 = count 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andi gr9,#0xff,gr9 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or.p gr8,gr0,gr4 ; GR4 = address 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # conditionally write a byte to 2b-align the address 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos.p #1,gr6 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andicc gr4,#1,gr0,icc0 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ckne icc0,cc7 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstb.p gr9,@(gr4,gr0) ,cc7,#1 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cadd.p gr4,gr6,gr4 ,cc7,#1 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # conditionally write a word to 4b-align the address 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andicc.p gr4,#2,gr0,icc0 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#2,gr0,icc1 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos.p #2,gr6 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ckne icc0,cc7 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng slli.p gr9,#8,gr12 ; need to double up the pattern 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc1,cc5 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or.p gr9,gr12,gr12 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andcr cc7,cc5,cc7 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csth.p gr12,@(gr4,gr0) ,cc7,#1 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cadd.p gr4,gr6,gr4 ,cc7,#1 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # conditionally write a dword to 8b-align the address 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andicc.p gr4,#4,gr0,icc0 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#4,gr0,icc1 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos.p #4,gr6 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ckne icc0,cc7 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng slli.p gr12,#16,gr13 ; need to quadruple-up the pattern 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc1,cc5 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or.p gr13,gr12,gr12 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng andcr cc7,cc5,cc7 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cst.p gr12,@(gr4,gr0) ,cc7,#1 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cadd.p gr4,gr6,gr4 ,cc7,#1 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or.p gr12,gr12,gr13 ; need to octuple-up the pattern 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # the address is now 8b-aligned - loop around writing 64b chunks 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #8,gr7 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subi.p gr4,#8,gr4 ; store with update index does weird stuff 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #64,gr6 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#64,gr0,icc0 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng0: cknc icc0,cc7 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu gr12,@(gr4,gr7) ,cc7,#1 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu gr12,@(gr4,gr7) ,cc7,#1 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu gr12,@(gr4,gr7) ,cc7,#1 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu gr12,@(gr4,gr7) ,cc7,#1 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu gr12,@(gr4,gr7) ,cc7,#1 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#64,gr0,icc0 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnc icc0,#2,0b 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 32-byte remnant 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc.p gr5,#32,gr0,icc0 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #32,gr6 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc0,cc7 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #16,gr6 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#16,gr0,icc0 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 16-byte remnant 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc0,cc7 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr6,gr5 ,cc7,#1 ; also set ICC3 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 8-byte remnant 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#8,gr0,icc1 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc1,cc7 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstdu.p gr12,@(gr4,gr7) ,cc7,#1 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr7,gr5 ,cc7,#1 ; also set ICC3 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos.p #4,gr7 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 4-byte remnant 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc gr5,#4,gr0,icc0 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi.p gr4,#4,gr4 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc0,cc7 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstu.p gr12,@(gr4,gr7) ,cc7,#1 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr7,gr5 ,cc7,#1 ; also set ICC3 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc.p gr5,#2,gr0,icc1 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 2-byte remnant 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #2,gr7 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi.p gr4,#2,gr4 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc1,cc7 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csthu.p gr12,@(gr4,gr7) ,cc7,#1 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng csubcc gr5,gr7,gr5 ,cc7,#1 ; also set ICC3 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng subicc.p gr5,#1,gr0,icc0 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqlr icc3,#0 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # now do 1-byte remnant 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #0,gr7 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi.p gr4,#2,gr4 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cknc icc0,cc7 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cstb.p gr12,@(gr4,gr0) ,cc7,#1 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bralr 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_end: 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .size memset, __memset_end-memset 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng############################################################################### 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# clear memory in userspace 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# - return the number of bytes that could not be cleared (0 on complete success) 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# long __memset_user(void *p, size_t count) 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng############################################################################### 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .globl __memset_user, __memset_user_error_lr, __memset_user_error_handler 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .type __memset_user,@function 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user: 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng movsg lr,gr11 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # abuse memset to do the dirty work 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or.p gr9,gr9,gr10 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #0,gr9 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng call memset 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user_error_lr: 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmpl.p @(gr11,gr0) 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setlos #0,gr8 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # deal any exception generated by memset 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # GR4 - memset's address tracking pointer 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # GR7 - memset's step value (index register for store insns) 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # GR8 - memset's original start address 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng # GR10 - memset's original count 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user_error_handler: 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add.p gr4,gr7,gr4 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng add gr8,gr10,gr8 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmpl.p @(gr11,gr0) 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sub gr8,gr4,gr8 ; we return the amount left uncleared 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .size __memset_user, .-__memset_user 183