; Copyright (C) 2012-2024 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 ; . #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