| ; Copyright (C) 2012-2021 Free Software Foundation, Inc. |
| ; Contributed by Red Hat. |
| ; |
| ; This file is free software; you can redistribute it and/or modify it |
| ; under the terms of the GNU General Public License as published by the |
| ; Free Software Foundation; either version 3, or (at your option) any |
| ; later version. |
| ; |
| ; This file is distributed in the hope that it will be useful, but |
| ; WITHOUT ANY WARRANTY; without even the implied warranty of |
| ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| ; General Public License for more details. |
| ; |
| ; Under Section 7 of GPL version 3, you are granted additional |
| ; permissions described in the GCC Runtime Library Exception, version |
| ; 3.1, as published by the Free Software Foundation. |
| ; |
| ; You should have received a copy of the GNU General Public License and |
| ; a copy of the GCC Runtime Library Exception along with this program; |
| ; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| ; <http://www.gnu.org/licenses/>. |
| |
| #include "vregs.h" |
| |
| START_FUNC ___clzhi2 |
| ;; Argument is in [SP+4], return in R8. |
| movw ax, [SP+4] |
| |
| .global __clzhi2_internal |
| __clzhi2_internal: |
| movw r8, #16 |
| cmpw ax, #0 |
| bz $clzhi2_is_zero |
| mov e, #0xff |
| 1: |
| inc e |
| shlw ax, 1 |
| bnc $1b |
| mov a, e |
| mov r8, a |
| clzhi2_is_zero: |
| ret |
| END_FUNC ___clzhi2 |
| |
| |
| START_FUNC ___clzsi2 |
| ;; Argument is in [SP+6]:[SP+4], return in R8. |
| movw ax, [SP+6] |
| cmpw ax, #0 |
| bnz $__clzhi2_internal |
| movw ax, [SP+4] |
| call !__clzhi2_internal |
| movw ax, r8 |
| addw ax, #16 |
| movw r8, ax |
| ret |
| END_FUNC ___clzsi2 |
| |
| |
| START_FUNC ___ctzhi2 |
| ;; Argument is in [SP+4], return in R8. |
| movw ax, [SP+4] |
| |
| .global __ctzhi2_internal |
| __ctzhi2_internal: |
| movw r8, #16 |
| cmpw ax, #0 |
| bz $ctzhi2_is_zero |
| mov e, #0xff |
| 1: |
| inc e |
| shrw ax, 1 |
| bnc $1b |
| mov a, e |
| mov r8, a |
| ctzhi2_is_zero: |
| ret |
| END_FUNC ___ctzhi2 |
| |
| |
| START_FUNC ___ctzsi2 |
| ;; Argument is in [SP+6]:[SP+4], return in R8. |
| movw ax, [SP+4] |
| cmpw ax, #0 |
| bnz $__ctzhi2_internal |
| movw ax, [SP+6] |
| call !__ctzhi2_internal |
| movw ax, r8 |
| addw ax, #16 |
| movw r8, ax |
| ret |
| END_FUNC ___ctzsi2 |
| |
| |
| START_FUNC ___ffshi2 |
| ;; Argument is in [SP+4], return in R8. |
| movw ax, [SP+4] |
| |
| .global __ffshi2_internal |
| __ffshi2_internal: |
| movw r8, #0 |
| cmpw ax, #0 |
| bz $ffshi2_is_zero |
| mov e, #0 |
| 1: |
| inc e |
| shrw ax, 1 |
| bnc $1b |
| mov a, e |
| mov r8, a |
| ffshi2_is_zero: |
| ret |
| END_FUNC ___ffshi2 |
| |
| |
| START_FUNC ___ffssi2 |
| ;; Argument is in [SP+6]:[SP+4], return in R8. |
| movw ax, [SP+4] |
| cmpw ax, #0 |
| bnz $__ffshi2_internal |
| movw ax, [SP+6] |
| cmpw ax, #0 |
| bz $1f |
| call !__ffshi2_internal |
| movw ax, r8 |
| addw ax, #16 |
| 1: |
| movw r8, ax |
| ret |
| END_FUNC ___ffssi2 |
| |
| |
| START_FUNC ___parityqi_internal |
| mov1 cy, a.0 |
| xor1 cy, a.1 |
| xor1 cy, a.2 |
| xor1 cy, a.3 |
| xor1 cy, a.4 |
| xor1 cy, a.5 |
| xor1 cy, a.6 |
| xor1 cy, a.7 |
| movw ax, #0 |
| bnc $1f |
| incw ax |
| 1: |
| movw r8, ax |
| ret |
| END_FUNC ___parityqi_internal |
| |
| |
| START_FUNC ___parityhi2 |
| ;; Argument is in [SP+4], return in R8. |
| movw ax, [SP+4] |
| xor a, x |
| br $___parityqi_internal |
| END_FUNC ___parityhi2 |
| |
| |
| START_FUNC ___paritysi2 |
| ;; Argument is in [SP+6]:[SP+4], return in R8. |
| movw ax, [SP+4] |
| xor a, x |
| mov b, a |
| movw ax, [SP+6] |
| xor a, x |
| xor a, b |
| br $___parityqi_internal |
| END_FUNC ___paritysi2 |
| |
| |
| |
| START_FUNC ___popcounthi2 |
| ;; Argument is in [SP+4], return in R8. |
| mov d, #2 |
| br $___popcountqi_internal |
| END_FUNC ___popcounthi2 |
| |
| |
| START_FUNC ___popcountsi2 |
| ;; Argument is in [SP+6]:[SP+4], return in R8. |
| mov d, #4 |
| br $___popcountqi_internal |
| END_FUNC ___popcountsi2 |
| |
| |
| START_FUNC ___popcountqi_internal |
| ;; There are D bytes starting at [HL] |
| ;; store count in R8. |
| |
| movw ax, sp |
| addw ax, #4 |
| movw hl, ax |
| mov a, #0 |
| 1: |
| xch a, b |
| mov a, [hl] |
| xch a, b |
| mov e, #8 |
| 2: |
| shl b,1 |
| addc a, #0 |
| dec e |
| bnz $2b |
| |
| incw hl |
| dec d |
| bnz $1b |
| |
| mov x, a |
| mov a, #0 |
| movw r8, ax |
| ret |
| END_FUNC ___popcountqi_internal |