|  | /* | 
|  | Copyright (c) 2014, Intel Corporation | 
|  | All rights reserved. | 
|  |  | 
|  | Redistribution and use in source and binary forms, with or without | 
|  | modification, are permitted provided that the following conditions are met: | 
|  |  | 
|  | * Redistributions of source code must retain the above copyright notice, | 
|  | * this list of conditions and the following disclaimer. | 
|  |  | 
|  | * Redistributions in binary form must reproduce the above copyright notice, | 
|  | * this list of conditions and the following disclaimer in the documentation | 
|  | * and/or other materials provided with the distribution. | 
|  |  | 
|  | * Neither the name of Intel Corporation nor the names of its contributors | 
|  | * may be used to endorse or promote products derived from this software | 
|  | * without specific prior written permission. | 
|  |  | 
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | 
|  | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
|  | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|  | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | 
|  | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
|  | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
|  | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | 
|  | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
|  | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | /******************************************************************************/ | 
|  | //                     ALGORITHM DESCRIPTION | 
|  | //                     --------------------- | 
|  | // | 
|  | // X87 version: | 
|  | // Use 80-bit FPU precision fmul, fsqrt to compute square and sqrt. | 
|  | // | 
|  | // SSE version: | 
|  | // Swap x, y if |x|<|y| | 
|  | // For x=2^k*x, get y=y*2^(-k) | 
|  | // Get S ~ sqrt(x^2+y^2)  (leading 1 + leading 25 mantissa bits) | 
|  | // | 
|  | // Get D = ( RN(x^2+y^2) - S^2 ) + ( x^2 - RN(x^2) ) + | 
|  | //                               + ( y^2 - ((RN(x^2+y^2)-RN(x^2)) ) | 
|  | // | 
|  | // Result is 2^k*(S + Se),  where Se = S*e | 
|  | //        S*e is approximated as (D/2S)*( 1 - (D/2S)^2*1.0/S ) | 
|  | // | 
|  | // Return 2^k*(S+Se) | 
|  | // | 
|  | // For |y/x|<2^(-64), return x | 
|  | // | 
|  | // For cases where maximum biased exponent is either greater than 7fdh or | 
|  | // below 32, take a special path to check for special cases (0, NaN, Inf), | 
|  | // possible overflow, and more accurate computation for denormal results | 
|  | // | 
|  | // Special cases: | 
|  | //  hypot(x,y), hypot(y,x), and hypot(x,-y) are equivalent | 
|  | //  hypot(x,+-0) is equivalent to fabs(x) | 
|  | //  hypot(x,y) = y if (x==NaN or x==INF) and y==INF | 
|  | //  hypot(x,y) = x if (x==NaN or x==INF) and y!=INF (even if y==NaN!) | 
|  | //  hypot(x,y) = y if (x!=NaN and x!=INF) and (y==NaN or y==INF) | 
|  | // | 
|  | /******************************************************************************/ | 
|  |  | 
|  | #include <private/bionic_asm.h> | 
|  | # -- Begin  static_func | 
|  | .text | 
|  | .align __bionic_asm_align | 
|  | .type static_func, @function | 
|  | static_func: | 
|  | ..B1.1: | 
|  | call      ..L2 | 
|  | ..L2: | 
|  | popl      %eax | 
|  | lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax | 
|  | lea       static_const_table@GOTOFF(%eax), %eax | 
|  | ret | 
|  | .size   static_func,.-static_func | 
|  | # -- End  static_func | 
|  |  | 
|  | # -- Begin  hypot | 
|  | ENTRY(hypot) | 
|  | # parameter 1: 8 + %ebp | 
|  | # parameter 2: 16 + %ebp | 
|  | ..B2.1: | 
|  | ..B2.2: | 
|  | pushl     %ebp | 
|  | movl      %esp, %ebp | 
|  | subl      $152, %esp | 
|  | movl      %ebx, 96(%esp) | 
|  | call      static_func | 
|  | movl      %eax, %ebx | 
|  | movapd    (%ebx), %xmm3 | 
|  | movsd     160(%esp), %xmm0 | 
|  | movsd     168(%esp), %xmm1 | 
|  | andpd     %xmm3, %xmm0 | 
|  | andpd     %xmm3, %xmm1 | 
|  | pextrw    $3, %xmm0, %eax | 
|  | pextrw    $3, %xmm1, %edx | 
|  | cmpl      $24528, %eax | 
|  | ja        .L_2TAG_PACKET_0.0.2 | 
|  | cmpl      $24528, %edx | 
|  | ja        .L_2TAG_PACKET_0.0.2 | 
|  | .L_2TAG_PACKET_1.0.2: | 
|  | fldl      160(%esp) | 
|  | fldl      168(%esp) | 
|  | fxch      %st(1) | 
|  | fmul      %st(0), %st | 
|  | fxch      %st(1) | 
|  | nop | 
|  | fmul      %st(0), %st | 
|  | faddp     %st, %st(1) | 
|  | fsqrt | 
|  | jmp       .L_2TAG_PACKET_2.0.2 | 
|  | .L_2TAG_PACKET_0.0.2: | 
|  | cmpl      $32752, %eax | 
|  | movl      %eax, %ecx | 
|  | jae       .L_2TAG_PACKET_3.0.2 | 
|  | subl      %edx, %ecx | 
|  | cmpl      $32752, %edx | 
|  | jae       .L_2TAG_PACKET_3.0.2 | 
|  | addl      $928, %ecx | 
|  | addl      %edx, %eax | 
|  | cmpl      $1856, %ecx | 
|  | ja        .L_2TAG_PACKET_4.0.2 | 
|  | cmpl      $49056, %eax | 
|  | jb        .L_2TAG_PACKET_1.0.2 | 
|  | fldl      160(%esp) | 
|  | fldl      168(%esp) | 
|  | fxch      %st(1) | 
|  | fmul      %st(0), %st | 
|  | fxch      %st(1) | 
|  | nop | 
|  | fmul      %st(0), %st | 
|  | faddp     %st, %st(1) | 
|  | fsqrt | 
|  | .L_2TAG_PACKET_5.0.2: | 
|  | fstl      (%esp) | 
|  | fstpt     16(%esp) | 
|  | xorl      %eax, %eax | 
|  | movw      24(%esp), %ax | 
|  | cmpl      $17407, %eax | 
|  | jae       .L_2TAG_PACKET_6.0.2 | 
|  | fldl      (%esp) | 
|  | jmp       .L_2TAG_PACKET_7.0.2 | 
|  | .L_2TAG_PACKET_4.0.2: | 
|  | movsd     %xmm0, 32(%esp) | 
|  | movsd     %xmm1, 40(%esp) | 
|  | fldl      32(%esp) | 
|  | faddl     40(%esp) | 
|  | jmp       .L_2TAG_PACKET_5.0.2 | 
|  | .L_2TAG_PACKET_6.0.2: | 
|  | movl      $46, %edx | 
|  | .L_2TAG_PACKET_8.0.2: | 
|  | movsd     160(%esp), %xmm0 | 
|  | movsd     168(%esp), %xmm1 | 
|  | fldl      (%esp) | 
|  | jmp       .L_2TAG_PACKET_7.0.2 | 
|  | .L_2TAG_PACKET_3.0.2: | 
|  | shufpd    $0, %xmm1, %xmm0 | 
|  | movdqa    %xmm0, %xmm2 | 
|  | movdqa    16(%ebx), %xmm3 | 
|  | movsd     %xmm0, 32(%esp) | 
|  | movsd     %xmm1, 40(%esp) | 
|  | cmppd     $3, %xmm0, %xmm2 | 
|  | cmppd     $0, %xmm0, %xmm3 | 
|  | movmskpd  %xmm2, %edx | 
|  | movmskpd  %xmm3, %eax | 
|  | testl     %edx, %edx | 
|  | je        .L_2TAG_PACKET_9.0.2 | 
|  | fldl      32(%esp) | 
|  | fmull     40(%esp) | 
|  | testl     $1, %eax | 
|  | jne       .L_2TAG_PACKET_10.0.2 | 
|  | testl     $2, %eax | 
|  | jne       .L_2TAG_PACKET_11.0.2 | 
|  | jmp       .L_2TAG_PACKET_2.0.2 | 
|  | .L_2TAG_PACKET_9.0.2: | 
|  | fldl      32(%esp) | 
|  | faddl     40(%esp) | 
|  | jmp       .L_2TAG_PACKET_2.0.2 | 
|  | .L_2TAG_PACKET_10.0.2: | 
|  | fstpl     40(%esp) | 
|  | fldl      32(%esp) | 
|  | jmp       .L_2TAG_PACKET_7.0.2 | 
|  | .L_2TAG_PACKET_11.0.2: | 
|  | fstpl     32(%esp) | 
|  | fldl      40(%esp) | 
|  | jmp       .L_2TAG_PACKET_7.0.2 | 
|  | .L_2TAG_PACKET_2.0.2: | 
|  | .L_2TAG_PACKET_7.0.2: | 
|  | movl      96(%esp), %ebx | 
|  | movl      %ebp, %esp | 
|  | popl      %ebp | 
|  | ret | 
|  | ..B2.3: | 
|  | END(hypot) | 
|  | # -- End  hypot | 
|  |  | 
|  | # Start file scope ASM | 
|  | ALIAS_SYMBOL(hypotl, hypot); | 
|  | # End file scope ASM | 
|  | .section .rodata, "a" | 
|  | .align 16 | 
|  | .align 16 | 
|  | static_const_table: | 
|  | .long	4294967295 | 
|  | .long	2147483647 | 
|  | .long	4294967295 | 
|  | .long	2147483647 | 
|  | .long	0 | 
|  | .long	2146435072 | 
|  | .long	0 | 
|  | .long	2146435072 | 
|  | .type	static_const_table,@object | 
|  | .size	static_const_table,32 | 
|  | .data | 
|  | .section .note.GNU-stack, "",@progbits | 
|  | # End |