82 lines · plain
1//===----------------------Hexagon builtin routine ------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9 .macro FUNCTION_BEGIN name10 .text11 .p2align 512 .globl \name13 .type \name, @function14\name:15 .endm16 17 .macro FUNCTION_END name18 .size \name, . - \name19 .endm20 21#define RIN r022#define S r023#define H r124#define D r225#define E r326#define HALF r427#define R r528 29#define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG30#define FAST_ALIAS(TAG) .global __hexagon_fast_##TAG ; .set __hexagon_fast_##TAG, __hexagon_##TAG31#define FAST2_ALIAS(TAG) .global __hexagon_fast2_##TAG ; .set __hexagon_fast2_##TAG, __hexagon_##TAG32 33FUNCTION_BEGIN __hexagon_sqrtf34 {35 E,p0 = sfinvsqrta(RIN)36 R = sffixupr(RIN)37 HALF = ##0x3f000000 // 0.538 r1:0 = combine(#0,#0) // clear S/H39 }40 {41 S += sfmpy(E,R):lib // S042 H += sfmpy(E,HALF):lib // H043 D = HALF44 E = R45 }46 {47 D -= sfmpy(S,H):lib // d048 p1 = sfclass(R,#1) // is zero?49 //E -= sfmpy(S,S):lib // e050 }51 {52 S += sfmpy(S,D):lib // S153 H += sfmpy(H,D):lib // H154 D = HALF55 E = R56 }57 {58 D -= sfmpy(S,H):lib // d059 E -= sfmpy(S,S):lib // e060 }61 {62 S += sfmpy(H,E):lib // S263 H += sfmpy(H,D):lib // H264 D = HALF65 E = R66 }67 {68 //D -= sfmpy(S,H):lib // d269 E -= sfmpy(S,S):lib // e270 if (p1) r0 = or(r0,R) // sqrt(-0.0) = -0.071 }72 {73 S += sfmpy(H,E,p0):scale // S374 jumpr r3175 }76 77FUNCTION_END __hexagon_sqrtf78 79Q6_ALIAS(sqrtf)80FAST_ALIAS(sqrtf)81FAST2_ALIAS(sqrtf)82