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