David S. Miller | 9f82596 | 2012-10-05 13:45:26 -0700 | [diff] [blame] | 1 | /* NG4memset.S: Niagara-4 optimized memset/bzero. |
| 2 | * |
| 3 | * Copyright (C) 2012 David S. Miller (davem@davemloft.net) |
| 4 | */ |
| 5 | |
| 6 | #include <asm/asi.h> |
| 7 | |
| 8 | .register %g2, #scratch |
| 9 | .register %g3, #scratch |
| 10 | |
| 11 | .text |
| 12 | .align 32 |
| 13 | .globl NG4memset |
| 14 | NG4memset: |
| 15 | andcc %o1, 0xff, %o4 |
| 16 | be,pt %icc, 1f |
| 17 | mov %o2, %o1 |
| 18 | sllx %o4, 8, %g1 |
| 19 | or %g1, %o4, %o2 |
| 20 | sllx %o2, 16, %g1 |
| 21 | or %g1, %o2, %o2 |
| 22 | sllx %o2, 32, %g1 |
| 23 | ba,pt %icc, 1f |
| 24 | or %g1, %o2, %o4 |
| 25 | .size NG4memset,.-NG4memset |
| 26 | |
| 27 | .align 32 |
| 28 | .globl NG4bzero |
| 29 | NG4bzero: |
| 30 | clr %o4 |
| 31 | 1: cmp %o1, 16 |
| 32 | ble %icc, .Ltiny |
| 33 | mov %o0, %o3 |
| 34 | sub %g0, %o0, %g1 |
| 35 | and %g1, 0x7, %g1 |
| 36 | brz,pt %g1, .Laligned8 |
| 37 | sub %o1, %g1, %o1 |
| 38 | 1: stb %o4, [%o0 + 0x00] |
| 39 | subcc %g1, 1, %g1 |
| 40 | bne,pt %icc, 1b |
| 41 | add %o0, 1, %o0 |
| 42 | .Laligned8: |
| 43 | cmp %o1, 64 + (64 - 8) |
| 44 | ble .Lmedium |
| 45 | sub %g0, %o0, %g1 |
| 46 | andcc %g1, (64 - 1), %g1 |
| 47 | brz,pn %g1, .Laligned64 |
| 48 | sub %o1, %g1, %o1 |
| 49 | 1: stx %o4, [%o0 + 0x00] |
| 50 | subcc %g1, 8, %g1 |
| 51 | bne,pt %icc, 1b |
| 52 | add %o0, 0x8, %o0 |
| 53 | .Laligned64: |
| 54 | andn %o1, 64 - 1, %g1 |
| 55 | sub %o1, %g1, %o1 |
| 56 | brnz,pn %o4, .Lnon_bzero_loop |
| 57 | mov 0x20, %g2 |
| 58 | 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P |
| 59 | subcc %g1, 0x40, %g1 |
| 60 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P |
| 61 | bne,pt %icc, 1b |
| 62 | add %o0, 0x40, %o0 |
| 63 | .Lpostloop: |
| 64 | cmp %o1, 8 |
| 65 | bl,pn %icc, .Ltiny |
| 66 | membar #StoreStore|#StoreLoad |
| 67 | .Lmedium: |
| 68 | andn %o1, 0x7, %g1 |
| 69 | sub %o1, %g1, %o1 |
| 70 | 1: stx %o4, [%o0 + 0x00] |
| 71 | subcc %g1, 0x8, %g1 |
| 72 | bne,pt %icc, 1b |
| 73 | add %o0, 0x08, %o0 |
| 74 | andcc %o1, 0x4, %g1 |
| 75 | be,pt %icc, .Ltiny |
| 76 | sub %o1, %g1, %o1 |
| 77 | stw %o4, [%o0 + 0x00] |
| 78 | add %o0, 0x4, %o0 |
| 79 | .Ltiny: |
| 80 | cmp %o1, 0 |
| 81 | be,pn %icc, .Lexit |
| 82 | 1: subcc %o1, 1, %o1 |
| 83 | stb %o4, [%o0 + 0x00] |
| 84 | bne,pt %icc, 1b |
| 85 | add %o0, 1, %o0 |
| 86 | .Lexit: |
| 87 | retl |
| 88 | mov %o3, %o0 |
| 89 | .Lnon_bzero_loop: |
| 90 | mov 0x08, %g3 |
| 91 | mov 0x28, %o5 |
| 92 | 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P |
| 93 | subcc %g1, 0x40, %g1 |
| 94 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P |
| 95 | stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P |
| 96 | stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P |
| 97 | add %o0, 0x10, %o0 |
| 98 | stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P |
| 99 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P |
| 100 | stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P |
| 101 | stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P |
| 102 | bne,pt %icc, 1b |
| 103 | add %o0, 0x30, %o0 |
| 104 | ba,a,pt %icc, .Lpostloop |
| 105 | .size NG4bzero,.-NG4bzero |