Path: blob/main/contrib/arm-optimized-routines/string/arm/strlen-armv6t2.S
39554 views
/*1* strlen - calculate the length of a string2*3* Copyright (c) 2010-2022, Arm Limited.4* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception5*/67#if __ARM_ARCH >= 6 && __ARM_ARCH_ISA_THUMB == 289/*10Assumes:11ARMv6T2, AArch321213*/1415#include "asmdefs.h"1617#ifdef __ARMEB__18#define S2LO lsl19#define S2HI lsr20#else21#define S2LO lsr22#define S2HI lsl23#endif2425/* Ensure the .cantunwind directive is prepended to .fnend.26Leaf functions cannot throw exceptions - EHABI only supports27synchronous exceptions. */28#define IS_LEAF2930/* This code requires Thumb. */31.thumb32.syntax unified3334/* Parameters and result. */35#define srcin r036#define result r03738/* Internal variables. */39#define src r140#define data1a r241#define data1b r342#define const_m1 r1243#define const_0 r444#define tmp1 r4 /* Overlaps const_0 */45#define tmp2 r54647ENTRY (__strlen_armv6t2)48prologue 4 5 push_ip=HAVE_PAC_LEAF49pld [srcin, #0]50bic src, srcin, #751mvn const_m1, #052ands tmp1, srcin, #7 /* (8 - bytes) to alignment. */53pld [src, #32]54bne.w L(misaligned8)55mov const_0, #056mov result, #-857L(loop_aligned):58/* Bytes 0-7. */59ldrd data1a, data1b, [src]60pld [src, #64]61add result, result, #862L(start_realigned):63uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */64sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */65uadd8 data1b, data1b, const_m166sel data1b, data1a, const_m1 /* Only used if d1a == 0. */67cbnz data1b, L(null_found)6869/* Bytes 8-15. */70ldrd data1a, data1b, [src, #8]71uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */72add result, result, #873sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */74uadd8 data1b, data1b, const_m175sel data1b, data1a, const_m1 /* Only used if d1a == 0. */76cbnz data1b, L(null_found)7778/* Bytes 16-23. */79ldrd data1a, data1b, [src, #16]80uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */81add result, result, #882sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */83uadd8 data1b, data1b, const_m184sel data1b, data1a, const_m1 /* Only used if d1a == 0. */85cbnz data1b, L(null_found)8687/* Bytes 24-31. */88ldrd data1a, data1b, [src, #24]89add src, src, #3290uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */91add result, result, #892sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */93uadd8 data1b, data1b, const_m194sel data1b, data1a, const_m1 /* Only used if d1a == 0. */95cmp data1b, #096beq L(loop_aligned)9798L(null_found):99.cfi_remember_state100cmp data1a, #0101itt eq102addeq result, result, #4103moveq data1a, data1b104#ifndef __ARMEB__105rev data1a, data1a106#endif107clz data1a, data1a108add result, result, data1a, lsr #3 /* Bits -> Bytes. */109epilogue 4 5 push_ip=HAVE_PAC_LEAF110111L(misaligned8):112.cfi_restore_state113ldrd data1a, data1b, [src]114and tmp2, tmp1, #3115rsb result, tmp1, #0116lsl tmp2, tmp2, #3 /* Bytes -> bits. */117tst tmp1, #4118pld [src, #64]119S2HI tmp2, const_m1, tmp2120orn data1a, data1a, tmp2121itt ne122ornne data1b, data1b, tmp2123movne data1a, const_m1124mov const_0, #0125b L(start_realigned)126127END (__strlen_armv6t2)128129#endif /* __ARM_ARCH >= 6 && __ARM_ARCH_ISA_THUMB == 2 */130131132