1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * linux/arch/m32r/lib/memset.S 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2004 Hirokazu Takata 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * void *memset(void *dst, int val, int len); 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * dst: r0 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * val: r1 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * len: r2 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ret: r0 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .text 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .global memset 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef CONFIG_ISA_DUAL_ISSUE 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .align 4 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset: 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mv r4, r0 || cmpz r2 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jc r14 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #16 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnc qword_align_check 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_align_check: /* len >= 4 */ 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r3, r4, #3 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqz r3, word_set 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r3, #-4 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng neg r3, r3 /* r3 = -(r3 - 4) */ 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalign_word: 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng stb r1, @r4 || addi r4, #1 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-1 || addi r3, #-1 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r3, align_word 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set: 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #8 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 || addi r4, #-4 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #16 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 || addi r2, #-4 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set_loop: 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 || addi r2, #-4 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bgtz r2, word_set_loop 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, byte_set_wrap 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmp r14 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_align_check: /* len >= 16 */ 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r3, r4, #15 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r3, word_align_check 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set: 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #8 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 || addi r4, #-4 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #16 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 || ldi r5, #16 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set_loop: 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ld r3, @(4,r4) /* cache line allocate */ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 || addi r2, #-16 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 || cmpu r2, r5 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnc qword_set_loop || cmpz r2 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jc r14 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengset_remainder: 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set_wrap1 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-4 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bra word_set_loop 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap: 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #4 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpz r2 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jc r14 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap1: 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #4 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(CONFIG_ISA_M32R2) 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set: 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-1 || stb r1, @r4+ 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, byte_set 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#elif defined(CONFIG_ISA_M32R) 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set: 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-1 || stb r1, @r4 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #1 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, byte_set 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#error unknown isa configuration 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengend_memset: 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmp r14 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else /* not CONFIG_ISA_DUAL_ISSUE */ 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .align 4 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset: 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng mv r4, r0 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqz r2, end_memset 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #16 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnc qword_align_check 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_align_check: /* len >= 4 */ 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r3, r4, #3 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqz r3, word_set 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r3, #-4 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng neg r3, r3 /* r3 = -(r3 - 4) */ 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalign_word: 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng stb r1, @r4 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #1 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-1 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r3, #-1 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r3, align_word 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set: 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #8 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #16 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-4 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #-4 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set_loop: 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-4 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bgtz r2, word_set_loop 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, byte_set_wrap 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmp r14 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_align_check: /* len >= 16 */ 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r3, r4, #15 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r3, word_align_check 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set: 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #8 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sll3 r3, r1, #16 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng or r1, r3 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #-4 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set_loop: 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ld r3, @(4,r4) /* cache line allocate */ 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-16 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #16 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng st r1, @+r4 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnc qword_set_loop 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, set_remainder 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmp r14 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengset_remainder: 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cmpui r2, #4 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bc byte_set_wrap1 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-4 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bra word_set_loop 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap: 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #4 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng beqz r2, end_memset 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap1: 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #4 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set: 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r2, #-1 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng stb r1, @r4 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng addi r4, #1 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bnez r2, byte_set 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengend_memset: 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng jmp r14 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* not CONFIG_ISA_DUAL_ISSUE */ 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .end 179