|
|
; Copyright (C) 1985-2000 Intel Corporation. ; ; The information and source code contained herein is the exclusive property ; of Intel Corporation and may not be disclosed, examined, or reproduced in ; whole or in part without explicit written authorization from the Company. ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; pow_p4.asm ; ; double pow(double,double); ; ; Initial version: 01/10/2001 ; Update (bug fixes): 02/26/2001 ; Updated the underflow/overflow path ; to restore edi, esi in the correct order: 03/07/2001 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; x=2^k*1.b1 b2...b6 b7 .. b52 x1=1.b1..b52 ;; f1=(b1 b2 ..b7 +1)/2 ;; x2=x1*rcp_t1[f1]=b'0.b'1 b'2 ... b'52 b'53 (b'53=0 if b'0=1) ;; f2=(b'7 ..b'14 +1)/2 ;; x3=x2*rcp_t2[f2]=b"0.b"1 b"2 ... b"52 b"53 (b"53=0 if b"0=1) ;; f3=(b"13 ..b"21+1)/2 ;; R=x3*rcp_t3[f3] ;; rcp=rcp_t1[f1]*rcp_t2[f2]*rcp_t3[f3] (exact multiplication) ;; E=exact_mul(rcp*x1)-R ;; R'=RN(R+E) ;; ;; H=RN(RN(k+T1[f1]+T2[f2]+T3[f3]+R)+E) (high part of log2(x) approximation) ;; Rl+El=exact(k+T1[f1]+T2[f2]+T3[f3]+R+E)-H ;; ;; Exponential evaluation started with approximate argument yH*HH (exact ;; product of the most significant 26 bits of y and H) ;; Correction added to exponential reduced argument: ;; yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+El)+Pl14), ;; where Pl14=cl1*R'+...+cl4*R'^4 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.686P .387 .XMM .MODEL FLAT,C
EXTRN C __libm_error_support : NEAR
CONST SEGMENT PARA PUBLIC USE32 'CONST' ALIGN 16
rcp_t1 DQ 03ff0000000000000H, 03fefc08000000000H DQ 03fef820000000000H, 03fef448000000000H DQ 03fef07c000000000H, 03feecc0000000000H DQ 03fee914000000000H, 03fee574000000000H DQ 03fee1e0000000000H, 03fede5c000000000H DQ 03fedae8000000000H, 03fed77c000000000H DQ 03fed41c000000000H, 03fed0cc000000000H DQ 03fecd84000000000H, 03feca4c000000000H DQ 03fec71c000000000H, 03fec3f8000000000H DQ 03fec0e0000000000H, 03febdd4000000000H DQ 03febad0000000000H, 03feb7d8000000000H DQ 03feb4e8000000000H, 03feb204000000000H DQ 03feaf28000000000H, 03feac58000000000H DQ 03fea990000000000H, 03fea6d0000000000H DQ 03fea41c000000000H, 03fea16c000000000H DQ 03fe9ec8000000000H, 03fe9c2c000000000H DQ 03fe9998000000000H, 03fe9710000000000H DQ 03fe948c000000000H, 03fe9210000000000H DQ 03fe8f9c000000000H, 03fe8d30000000000H DQ 03fe8acc000000000H, 03fe8870000000000H DQ 03fe8618000000000H, 03fe83c8000000000H DQ 03fe8180000000000H, 03fe7f40000000000H DQ 03fe7d04000000000H, 03fe7ad4000000000H DQ 03fe78a4000000000H, 03fe767c000000000H DQ 03fe745c000000000H, 03fe7244000000000H DQ 03fe7030000000000H, 03fe6e20000000000H DQ 03fe6c18000000000H, 03fe6a14000000000H DQ 03fe6818000000000H, 03fe6620000000000H DQ 03fe642c000000000H, 03fe6240000000000H DQ 03fe6058000000000H, 03fe5e74000000000H DQ 03fe5c98000000000H, 03fe5ac0000000000H DQ 03fe58ec000000000H, 03fe5720000000000H DQ 03fe5554000000000H, 03fe5390000000000H DQ 03fe51d0000000000H, 03fe5014000000000H DQ 03fe4e60000000000H, 03fe4cac000000000H DQ 03fe4afc000000000H, 03fe4954000000000H DQ 03fe47b0000000000H, 03fe460c000000000H DQ 03fe4470000000000H, 03fe42d8000000000H DQ 03fe4140000000000H, 03fe3fb0000000000H DQ 03fe3e24000000000H, 03fe3c98000000000H DQ 03fe3b14000000000H, 03fe3990000000000H DQ 03fe3814000000000H, 03fe3698000000000H DQ 03fe3520000000000H, 03fe33b0000000000H DQ 03fe3240000000000H, 03fe30d0000000000H DQ 03fe2f68000000000H, 03fe2e04000000000H DQ 03fe2ca0000000000H, 03fe2b40000000000H DQ 03fe29e4000000000H, 03fe288c000000000H DQ 03fe2734000000000H, 03fe25e4000000000H DQ 03fe2494000000000H, 03fe2344000000000H DQ 03fe21fc000000000H, 03fe20b4000000000H DQ 03fe1f70000000000H, 03fe1e30000000000H DQ 03fe1cf0000000000H, 03fe1bb4000000000H DQ 03fe1a7c000000000H, 03fe1944000000000H DQ 03fe1810000000000H, 03fe16e0000000000H DQ 03fe15b0000000000H, 03fe1484000000000H DQ 03fe135c000000000H, 03fe1234000000000H DQ 03fe1110000000000H, 03fe0ff0000000000H DQ 03fe0ed0000000000H, 03fe0db4000000000H DQ 03fe0c98000000000H, 03fe0b80000000000H DQ 03fe0a68000000000H, 03fe0954000000000H DQ 03fe0844000000000H, 03fe0734000000000H DQ 03fe0624000000000H, 03fe0518000000000H DQ 03fe0410000000000H, 03fe0308000000000H DQ 03fe0204000000000H, 03fe0100000000000H DQ 03fe0000000000000H, 0
log2_t1 DQ 0, 0 DQ 03f86fdf461d20000H, 03d3c9efc46d9f6f7H DQ 03f96e625317a0000H, 03d453f0e645614dbH DQ 03fa11a6297920000H, 03d4d925cd7d436d6H DQ 03fa6bb01a01f0000H, 03d3c995e7439db70H DQ 03fac4eb3635c8000H, 03d4a8192bdcad609H DQ 03fb0ea8b80338000H, 03d4e1797942f1be5H DQ 03fb3a9f062a90000H, 03d3011ef2e155a44H DQ 03fb665684ff80000H, 03d3084f28da93fafH DQ 03fb919bc335d0000H, 03d246082ed03fe7fH DQ 03fbbc6b9d7c04000H, 03d45b7e842652658H DQ 03fbe7272e1dc8000H, 03d4a2ea92333a25cH DQ 03fc08cd7820ec000H, 03d3543c511b40206H DQ 03fc1dc8f3a33c000H, 03d45598cab6d744cH DQ 03fc32b7a27af4000H, 03d07aba1fd6522b1H DQ 03fc476564c740000H, 03d4dc39f249b8f70H DQ 03fc5c04864906000H, 03d28c5d47e5f3668H DQ 03fc707a4ef786000H, 03d4f86ea591de6f8H DQ 03fc84c59fac38000H, 03d435cd351b14a77H DQ 03fc98e556aacc000H, 03d341c88d156ee10H DQ 03fcacf30032be000H, 03d2e3733debf9165H DQ 03fcc0d3213ae6000H, 03d4b15bcb18be2edH DQ 03fcd49f9d6d66000H, 03d30b557c2a12d29H DQ 03fce83c98a2d0000H, 03d442af5d10d18f2H DQ 03fcfbc44e396e000H, 03d47b3f928665437H DQ 03fd078d40936e000H, 03d38f1f608125902H DQ 03fd112ce25b29000H, 03d3c851c0f45bae5H DQ 03fd1ac0b77e3f000H, 03d3f97100b047ea3H DQ 03fd243a590d2b000H, 03d3c9b75e8e9d45dH DQ 03fd2db57ad935000H, 03cf934f5238ac23eH DQ 03fd37158be940000H, 03d4a16d142e3f4deH DQ 03fd40684445fb000H, 03d469ba14bfbfc6dH DQ 03fd49ad4a118d000H, 03d45cd377302cca5H DQ 03fd52d5be2114000H, 03d3a83640f883e4bH DQ 03fd5bfe367828000H, 03d49755c3dea7d5aH DQ 03fd6517e94738000H, 03d4e8a28223a67c4H DQ 03fd6e22792ef1000H, 03d314f240e7e9039H DQ 03fd771d87fd10000H, 03d258aaf31d36edbH DQ 03fd8008b6b297000H, 03d1605b88ccad976H DQ 03fd88e3a58a56000H, 03d2097ff572e71dfH DQ 03fd91bd19e695000H, 03d4dbb3ee4f6c667H DQ 03fd9a85babbe1000H, 03d4d889a0a61b2d6H DQ 03fda33d25fcb1000H, 03d4f5875d92c8dd6H DQ 03fdabe2f8ec96000H, 03d3c773190e2cc83H DQ 03fdb4865273ed000H, 03d4ab54a099e1f60H DQ 03fdbd07e0e781000H, 03d268ac21c0dcf20H DQ 03fdc5960ba6e1000H, 03d43b4bd96cb81feH DQ 03fdce1168b913000H, 03d2fada3055d19e2H DQ 03fdd679920231000H, 03d18ed5096e87504H DQ 03fddece20dffc000H, 03d43e26c2ced8aaaH DQ 03fde71ebad35f000H, 03d011609e08e95e1H DQ 03fdef6b3d3444000H, 03d40b35b2d1614faH DQ 03fdf7a349e747000H, 03d4a6e7081d99120H DQ 03fdffd6c9e8cc000H, 03cfa67452e86699dH DQ 03fe03fa97e79f000H, 03d275e12e74f8beeH DQ 03fe080748d542800H, 03d3b8c3b78ce0adbH DQ 03fe0c11650cf0000H, 03d461752eb1152a5H DQ 03fe1010826b18000H, 03d4ea3c98a07d258H DQ 03fe140ccdd4ae800H, 03d1fcada197ed2c1H DQ 03fe180633d744800H, 03d22551707e07a41H DQ 03fe1bf426e8e9800H, 03d376aff6c055f55H DQ 03fe1fdef5db3a000H, 03d4442de8501d871H DQ 03fe23c68c8201000H, 03d270c749129a57aH DQ 03fe27a23a05a8000H, 03d4cb0ea30b214a6H DQ 0bfda8f9d1c354000H, 0bd4604f54f4f9853H DQ 0bfda1506aee3b000H, 0bd44ff93dbb28c80H DQ 0bfd99ae48aa53000H, 0bd0e6ed7003dfdf5H DQ 0bfd9213957df2000H, 0bd3e186ac01b3f7fH DQ 0bfd8a9228a043000H, 0bd49bc20cf8dd883H DQ 0bfd8306ebf51c000H, 0bd45c8266e480596H DQ 0bfd7b83a057f9000H, 0bd35f4f79f443745H DQ 0bfd741a637fca000H, 0bd4025f49ff0180dH DQ 0bfd6cb99e7aa4000H, 0bd412b5ad5a7002aH DQ 0bfd654f5e853d000H, 0bd44c7008c4a72a7H DQ 0bfd5dfff91d34000H, 0bd3f544ed390ba95H DQ 0bfd56b9933779000H, 0bd391dc031bae772H DQ 0bfd4f69f5d830000H, 0bd38f36dd24bae46H DQ 0bfd483602143d000H, 0bce09c599a327931H DQ 0bfd410b98a0d4000H, 0bd156a3c28e8042aH DQ 0bfd39d83e4060000H, 0bd447f1643c10456H DQ 0bfd32c15f8b57000H, 0bd0d6ee2e01d9231H DQ 0bfd2ba1c0891f000H, 0bd3795076c3da632H DQ 0bfd249f2ada03000H, 0bd2a7809feb5964fH DQ 0bfd1d9406c900000H, 0bd4546d73ea7c032H DQ 0bfd16935d34fb000H, 0bd2151c6348d84a4H DQ 0bfd0fb093a3fd000H, 0bd2bacac000943a5H DQ 0bfd08c588cda7000H, 0bd43c72c4f78dfa1H DQ 0bfd01d228cf40000H, 0bd3c6972c813e541H DQ 0bfcf5faa7e71a000H, 0bd3d157620c552c1H DQ 0bfce867e093dc000H, 0bd366fa6f3fffcc0H DQ 0bfcdac50fe6d4000H, 0bd2b6484bb8f2009H DQ 0bfccd398e83e8000H, 0bd05f5cde492c839H DQ 0bfcbfc5c1d5be000H, 0bd2784900e42b538H DQ 0bfcb26a0fb83e000H, 0bd4a5b99e91f69b7H DQ 0bfca4fed5abba000H, 0bd45976e8062c61fH DQ 0bfc97d45e2448000H, 0bd401c636755cd02H DQ 0bfc8a9ad0948a000H, 0bd4c89ba64f25a55H DQ 0bfc7d520a4220000H, 0bd216a44d008a53dH DQ 0bfc704b6c17f0000H, 0bd413a806d56d6eeH DQ 0bfc633609cb64000H, 0bd33f125177ec11cH DQ 0bfc563adff6b0000H, 0bd4d0837079422c3H DQ 0bfc495a582ff2000H, 0bd3ebd9313709ef4H DQ 0bfc3c6b62529a000H, 0bd42d2b08296bf5cH DQ 0bfc2f9786ad2e000H, 0bd3b5188c2483623H DQ 0bfc22df302746000H, 0bd3048e3c2505d3dH DQ 0bfc1618c543b8000H, 0bd45b8d6a3b61bd1H DQ 0bfc096e5a2260000H, 0bd4bde98232d61f6H DQ 0bfbf9c0b5c568000H, 0bd4d3483b7a56256H DQ 0bfbe089492ee4000H, 0bd405589fcd57f86H DQ 0bfbc78bae5580000H, 0bd35351d0387c197H DQ 0bfbaec8bfaf64000H, 0bd3d13cbabea0e44H DQ 0bfb95eb24969c000H, 0bd3727fab299d747H DQ 0bfb7d49341a08000H, 0bd4eeef8bcf7aa55H DQ 0bfb64e3caa930000H, 0bd31aad2031e3ecaH DQ 0bfb4c647d2ea8000H, 0bceb43c4115c4fb7H DQ 0bfb3422b94a24000H, 0bd421b493a67e318H DQ 0bfb1bc75cf5a4000H, 0bd4d7db2139e8397H DQ 0bfb03aa8f8dc8000H, 0bd153121e9af5428H DQ 0bfad6e8ef48f8000H, 0bd38293c51765dbcH DQ 0bfaa6fbed7680000H, 0bd2b1c66db7cd724H DQ 0bfa778fdc1828000H, 0bd34378af2af5332H DQ 0bfa47f2e22550000H, 0bd2a424693c56dcdH DQ 0bfa18249a5368000H, 0bd441b0d5fdf534bH DQ 0bf9d1b35ee200000H, 0bd431fb72db4f24dH DQ 0bf97427d317a0000H, 0bd4700f14b03b093H DQ 0bf9163d20d100000H, 0bd46e8b9664fe33fH DQ 0bf872c1f4cf00000H, 0bd2b4934580fe573H DQ 0bf7709c46d780000H, 0bd4563ba56cde924H DQ 0H, 0H
rcp_t2 DQ 03ff0000000000000H, 03fefff4000000000H DQ 03feffe4000000000H, 03feffd4000000000H DQ 03feffc4000000000H, 03feffb4000000000H DQ 03feffa4000000000H, 03feff94000000000H DQ 03feff84000000000H, 03feff74000000000H DQ 03feff64000000000H, 03feff54000000000H DQ 03feff44000000000H, 03feff34000000000H DQ 03feff24000000000H, 03feff14000000000H DQ 03feff04000000000H, 03fefef4000000000H DQ 03fefee4000000000H, 03fefed4000000000H DQ 03fefec4000000000H, 03fefeb4000000000H DQ 03fefea4000000000H, 03fefe94000000000H DQ 03fefe84000000000H, 03fefe74000000000H DQ 03fefe64000000000H, 03fefe54000000000H DQ 03fefe44000000000H, 03fefe34000000000H DQ 03fefe24000000000H, 03fefe14000000000H DQ 03fefe04000000000H, 03fefdf4000000000H DQ 03fefde4000000000H, 03fefdd4000000000H DQ 03fefdc4000000000H, 03fefdb4000000000H DQ 03fefda4000000000H, 03fefd94000000000H DQ 03fefd84000000000H, 03fefd74000000000H DQ 03fefd64000000000H, 03fefd54000000000H DQ 03fefd44000000000H, 03fefd34000000000H DQ 03fefd28000000000H, 03fefd18000000000H DQ 03fefd08000000000H, 03fefcf8000000000H DQ 03fefce8000000000H, 03fefcd8000000000H DQ 03fefcc8000000000H, 03fefcb8000000000H DQ 03fefca8000000000H, 03fefc98000000000H DQ 03fefc88000000000H, 03fefc78000000000H DQ 03fefc68000000000H, 03fefc58000000000H DQ 03fefc48000000000H, 03fefc38000000000H DQ 03fefc28000000000H, 03fefc18000000000H DQ 03ff0100000000000H, 03ff00fc000000000H DQ 03ff00f8000000000H, 03ff00f4000000000H DQ 03ff00f0000000000H, 03ff00ec000000000H DQ 03ff00e8000000000H, 03ff00e4000000000H DQ 03ff00e0000000000H, 03ff00dc000000000H DQ 03ff00d8000000000H, 03ff00d4000000000H DQ 03ff00d0000000000H, 03ff00cc000000000H DQ 03ff00c8000000000H, 03ff00c4000000000H DQ 03ff00c0000000000H, 03ff00bc000000000H DQ 03ff00b8000000000H, 03ff00b4000000000H DQ 03ff00b0000000000H, 03ff00ac000000000H DQ 03ff00a8000000000H, 03ff00a4000000000H DQ 03ff00a0000000000H, 03ff009c000000000H DQ 03ff0098000000000H, 03ff0094000000000H DQ 03ff0090000000000H, 03ff008c000000000H DQ 03ff0088000000000H, 03ff0084000000000H DQ 03ff0080000000000H, 03ff007c000000000H DQ 03ff0078000000000H, 03ff0074000000000H DQ 03ff0070000000000H, 03ff006c000000000H DQ 03ff0068000000000H, 03ff0064000000000H DQ 03ff0060000000000H, 03ff005c000000000H DQ 03ff0058000000000H, 03ff0054000000000H DQ 03ff0050000000000H, 03ff004c000000000H DQ 03ff0048000000000H, 03ff0044000000000H DQ 03ff0040000000000H, 03ff003c000000000H DQ 03ff0038000000000H, 03ff0034000000000H DQ 03ff0030000000000H, 03ff002c000000000H DQ 03ff0028000000000H, 03ff0024000000000H DQ 03ff0020000000000H, 03ff001c000000000H DQ 03ff0018000000000H, 03ff0014000000000H DQ 03ff0010000000000H, 03ff000c000000000H DQ 03ff0008000000000H, 03ff0004000000000H DQ 03ff0000000000000H, 0
log2_t2 DQ 0, 0 DQ 03f2150297c800000H, 03d210909f6306155H DQ 03f34332be0000000H, 03d09518ce032f41dH DQ 03f3fbe9f60c00000H, 03d4ac9bc570c3b37H DQ 03f45a537a3600000H, 03d4325006127af86H DQ 03f4b6b4dcbc00000H, 03d3c621fbc9e2ad6H DQ 03f5098c916300000H, 03d3f7aec2cad082aH DQ 03f537c0264100000H, 03d4bdf2754a94bbeH DQ 03f565f52d1000000H, 03d46f089976214ecH DQ 03f5942ba5e700000H, 03d2645f4fefad48aH DQ 03f5c26390dc00000H, 03d394ecb87dff47fH DQ 03f5f09cee0700000H, 03d415d326245addfH DQ 03f60f6bdebf80000H, 03d492366d5b7121cH DQ 03f62689ffae00000H, 03d3360481790324fH DQ 03f63da8d9da00000H, 03d31fe61b7973265H DQ 03f654c86d4f00000H, 03d4d5202bf82be32H DQ 03f66be8ba1980000H, 03d3a5f8d1a33f641H DQ 03f68309c04400000H, 03d4f65693283bc5bH DQ 03f69a2b7fdb00000H, 03d4b05a072311cdeH DQ 03f6b14df8ea00000H, 03d2da3ce84a38084H DQ 03f6c8712b7c00000H, 03d385b88ccf9e4bcH DQ 03f6df95179d00000H, 03d4138577c1eb13eH DQ 03f6f6b9bd5880000H, 03d4eb2dd71123ec2H DQ 03f706ef8e5d40000H, 03d4d0d7b6d01207aH DQ 03f712829ae740000H, 03d44fe53f52c6d10H DQ 03f71e16045000000H, 03d3f031f657d9491H DQ 03f729a9ca9d40000H, 03d45d9663a7e7da0H DQ 03f7353dedd500000H, 03d418e26d5dfd1bfH DQ 03f740d26dfd00000H, 03d38dc829af0262cH DQ 03f74c674b1b00000H, 03d408e4eb4d165e5H DQ 03f757fc853500000H, 03d3092346f3f705eH DQ 03f763921c5080000H, 03d4e3fa9e85711eeH DQ 03f76f281073c0000H, 03d4d59479023862bH DQ 03f77abe61a480000H, 03d40c38980430771H DQ 03f786550fe880000H, 03d1f92db260b1230H DQ 03f791ec1b4580000H, 03d150038c4b502c5H DQ 03f79d8383c140000H, 03d48cd3d7b281721H DQ 03f7a91b496200000H, 03d42c11f472c64baH DQ 03f7b4b36c2d40000H, 03d4d0945eaf29dd2H DQ 03f7c04bec2940000H, 03d21e7318833be77H DQ 03f7cbe4c95b40000H, 03d462d58105ef8bfH DQ 03f7d77e03c980000H, 03d4f85219e901c30H DQ 03f7e3179b7a00000H, 03d3c51fbafc4227cH DQ 03f7eeb1907240000H, 03d400766896bf3baH DQ 03f7fa4be2b840000H, 03d43558362ba179cH DQ 03f802f3492900000H, 03d2a3ccb5f4b8d2aH DQ 03f8074d69a3c0000H, 03d490b788dcc06d5H DQ 03f80d1b1320e0000H, 03d2b412556cf5977H DQ 03f812e8eb4fc0000H, 03d45c237732b1f78H DQ 03f818b6f23380000H, 03d45669defd365c1H DQ 03f81e8527cf00000H, 03d4589b8de73054bH DQ 03f824538c2540000H, 03d28fab914103d9cH DQ 03f82a221f3900000H, 03d47df970829f58aH DQ 03f82ff0e10d60000H, 03d4b0d87d80e4623H DQ 03f835bfd1a560000H, 03cf61343d497e17fH DQ 03f83b8ef103a0000H, 03d49f7f4ef56f96bH DQ 03f8415e3f2b60000H, 03d4859d5f817f2faH DQ 03f8472dbc1f80000H, 03d3b2734e7bf7114H DQ 03f84cfd67e2e0000H, 03d3753903d1eeba1H DQ 03f852cd427880000H, 03d23a058a8f8ba37H DQ 03f8589d4be340000H, 03d37c2ec6bdcca43H DQ 03f85e6d842620000H, 03d43701d45acf2c4H DQ 03f8643deb4420000H, 03d3d6b197832ab27H DQ 03f86a0e814020000H, 03d411a9b5557b8ccH DQ 0bf7709c46d780000H, 0bd4563ba56cde924H DQ 0bf76adca91cc0000H, 0bd37a1a05bc6b74bH DQ 0bf7651cf479c0000H, 0bd461bfa6c8b2465H DQ 0bf75f5d28ee00000H, 0bd48fc8fd49e79d0H DQ 0bf7599d4678c0000H, 0bd4925a3c7b88c7cH DQ 0bf753dd4d1940000H, 0bd4b4606033fb2beH DQ 0bf74e1d3ccf00000H, 0bd20210971a52753H DQ 0bf7485d1598c0000H, 0bd4812a07c384c12H DQ 0bf7429cd77640000H, 0bd4c07239b769baaH DQ 0bf73cdc8266c0000H, 0bd44838a3ea90181H DQ 0bf7371c166980000H, 0bd288537c7f77e67H DQ 0bf7315b937d80000H, 0bd4575a30536968cH DQ 0bf72b9af9a280000H, 0bd2c45e11e2e7675H DQ 0bf725da48d740000H, 0bd4f8176c38b4ce6H DQ 0bf72019811bc0000H, 0bd1a700bd79ac8a3H DQ 0bf71a58a26e80000H, 0bd46fb3522850043H DQ 0bf71497accf40000H, 0bd4f08e7ddd3e76fH DQ 0bf70ed6a03d40000H, 0bd4ff2a8fb0fa804H DQ 0bf709157cb7c0000H, 0bd4e2fc0aec80d04H DQ 0bf70354423e00000H, 0bd4e332fcfabff4fH DQ 0bf6fb25e19f00000H, 0bd21aebe490c8214H DQ 0bf6efa310d600000H, 0bd4543b144a21404H DQ 0bf6e420122080000H, 0bd45215e0a197589H DQ 0bf6d89ce57d00000H, 0bd30cd2d2dbef9ddH DQ 0bf6cd198ae980000H, 0bd4370f2ebb44e84H DQ 0bf6c196026500000H, 0bd4a99c21180f792H DQ 0bf6b6124bee80000H, 0bd11b04ea788b3a9H DQ 0bf6aa8e678380000H, 0bd3d2d0d040e5bb2H DQ 0bf69f0a552380000H, 0bd201eaa7eae8a79H DQ 0bf6938614cc80000H, 0bd2b467aacd98f5bH DQ 0bf68801a67d00000H, 0bd4b3840d3f33c6bH DQ 0bf67c7d0a3480000H, 0bd25ec92da83377dH DQ 0bf670f83ff080000H, 0bd33ab2631d4676dH DQ 0bf6657347b000000H, 0bd38fd1349b69dfeH DQ 0bf659ee217180000H, 0bd41a8baa44fb97dH DQ 0bf64e68cd3380000H, 0bd4d828cbc5c5ff3H DQ 0bf642e34af500000H, 0bd44361aa8b3c316H DQ 0bf6375d9ab400000H, 0bd49e932f704de99H DQ 0bf62bd7bc6f80000H, 0bd42bd57c254b5e3H DQ 0bf62051b02600000H, 0bd167df372942ee0H DQ 0bf614cb75d580000H, 0bd3c729ec54d36cdH DQ 0bf609450d7d00000H, 0bd490ea5c63bcdf1H DQ 0bf5fb7cee3700000H, 0bd2d803cea0e76a9H DQ 0bf5e46f655d00000H, 0bd4d398b96b4f4d5H DQ 0bf5cd61806b00000H, 0bd4ea2cca3058bbdH DQ 0bf5b6533f5e00000H, 0bd3f3e6ba7bbdd88H DQ 0bf59f44a23200000H, 0bd442ddc05082614H DQ 0bf58835a8e500000H, 0bd40498534d8fe6dH DQ 0bf57126537400000H, 0bd2fa2a0fd4fca1cH DQ 0bf55a16a1db00000H, 0bd4efd6c9949b49bH DQ 0bf54306941900000H, 0bd4975aa0b715781H DQ 0bf52bf62a2a00000H, 0bd4b3ae86d7c16e7H DQ 0bf514e5640c00000H, 0bd3064bec2477c3fH DQ 0bf4fba8837600000H, 0bd20f3d834ceb438H DQ 0bf4cd85866800000H, 0bd433742d88c7aa2H DQ 0bf49f61d0ea00000H, 0bd48f98b25223470H DQ 0bf4713d62f600000H, 0bd4957c30af53ad3H DQ 0bf443183c8600000H, 0bd48218d1305b92fH DQ 0bf414f25d9400000H, 0bd492239f241b9b9H DQ 0bf3cd978c3800000H, 0bcd0642236ea2a75H DQ 0bf37148ec2800000H, 0bd40dfe447087803H DQ 0bf314f8daf400000H, 0bd3e3bcf284f9cb2H DQ 0bf2714eb11800000H, 0bd4e94d8dd523885H DQ 0bf1715193b000000H, 0bd17d35d328b2afeH DQ 0, 0
rcp_t3 DQ 03ff7154740000000H, 03ff71545c0000000H DQ 03ff7154440000000H, 03ff7154300000000H DQ 03ff7154180000000H, 03ff7154000000000H DQ 03ff7153e80000000H, 03ff7153d40000000H DQ 03ff7153bc0000000H, 03ff7153a40000000H DQ 03ff71538c0000000H, 03ff7153780000000H DQ 03ff7153600000000H, 03ff7153480000000H DQ 03ff7153300000000H, 03ff7153180000000H DQ 03ff7153040000000H, 03ff7152ec0000000H DQ 03ff7152d40000000H, 03ff7152bc0000000H DQ 03ff7152a80000000H, 03ff7152900000000H DQ 03ff7152780000000H, 03ff7152600000000H DQ 03ff71524c0000000H, 03ff7152340000000H DQ 03ff71521c0000000H, 03ff7152040000000H DQ 03ff7151ec0000000H, 03ff7151d80000000H DQ 03ff7151c00000000H, 03ff7151a80000000H DQ 03ff7151900000000H, 03ff71517c0000000H DQ 03ff7151640000000H, 03ff71514c0000000H DQ 03ff7151340000000H, 03ff71511c0000000H DQ 03ff7151080000000H, 03ff7150f00000000H DQ 03ff7150d80000000H, 03ff7150c00000000H DQ 03ff7150ac0000000H, 03ff7150940000000H DQ 03ff71507c0000000H, 03ff7150640000000H DQ 03ff7150500000000H, 03ff7150380000000H DQ 03ff7150200000000H, 03ff7150080000000H DQ 03ff714ff00000000H, 03ff714fdc0000000H DQ 03ff714fc40000000H, 03ff714fac0000000H DQ 03ff714f940000000H, 03ff714f800000000H DQ 03ff714f680000000H, 03ff714f500000000H DQ 03ff714f380000000H, 03ff714f240000000H DQ 03ff714f0c0000000H, 03ff714ef40000000H DQ 03ff714edc0000000H, 03ff714ec40000000H DQ 03ff714eb00000000H, 03ff714e980000000H DQ 03ff714e800000000H, 03ff714e680000000H DQ 03ff714e540000000H, 03ff714e3c0000000H DQ 03ff714e240000000H, 03ff714e0c0000000H DQ 03ff714df80000000H, 03ff714de00000000H DQ 03ff714dc80000000H, 03ff714db00000000H DQ 03ff714d980000000H, 03ff714d840000000H DQ 03ff714d6c0000000H, 03ff714d540000000H DQ 03ff714d3c0000000H, 03ff714d280000000H DQ 03ff714d100000000H, 03ff714cf80000000H DQ 03ff714ce00000000H, 03ff714ccc0000000H DQ 03ff714cb40000000H, 03ff714c9c0000000H DQ 03ff714c840000000H, 03ff714c6c0000000H DQ 03ff714c580000000H, 03ff714c400000000H DQ 03ff714c280000000H, 03ff714c100000000H DQ 03ff714bfc0000000H, 03ff714be40000000H DQ 03ff714bcc0000000H, 03ff714bb40000000H DQ 03ff714ba00000000H, 03ff714b880000000H DQ 03ff714b700000000H, 03ff714b580000000H DQ 03ff714b400000000H, 03ff714b2c0000000H DQ 03ff714b140000000H, 03ff714afc0000000H DQ 03ff714ae40000000H, 03ff714ad00000000H DQ 03ff714ab80000000H, 03ff714aa00000000H DQ 03ff714a880000000H, 03ff714a740000000H DQ 03ff714a5c0000000H, 03ff714a440000000H DQ 03ff714a2c0000000H, 03ff714a140000000H DQ 03ff714a000000000H, 03ff7149e80000000H DQ 03ff7149d00000000H, 03ff7149b80000000H DQ 03ff7149a40000000H, 03ff71498c0000000H DQ 03ff7149740000000H, 03ff71495c0000000H DQ 03ff7149480000000H, 03ff7149300000000H DQ 03ff7149180000000H, 03ff7149000000000H DQ 03ff715a380000000H, 03ff715a2c0000000H DQ 03ff715a240000000H, 03ff715a180000000H DQ 03ff715a0c0000000H, 03ff715a000000000H DQ 03ff7159f40000000H, 03ff7159e80000000H DQ 03ff7159dc0000000H, 03ff7159d00000000H DQ 03ff7159c40000000H, 03ff7159bc0000000H DQ 03ff7159b00000000H, 03ff7159a40000000H DQ 03ff7159980000000H, 03ff71598c0000000H DQ 03ff7159800000000H, 03ff7159740000000H DQ 03ff7159680000000H, 03ff7159600000000H DQ 03ff7159540000000H, 03ff7159480000000H DQ 03ff71593c0000000H, 03ff7159300000000H DQ 03ff7159240000000H, 03ff7159180000000H DQ 03ff71590c0000000H, 03ff7159000000000H DQ 03ff7158f80000000H, 03ff7158ec0000000H DQ 03ff7158e00000000H, 03ff7158d40000000H DQ 03ff7158c80000000H, 03ff7158bc0000000H DQ 03ff7158b00000000H, 03ff7158a40000000H DQ 03ff7158980000000H, 03ff7158900000000H DQ 03ff7158840000000H, 03ff7158780000000H DQ 03ff71586c0000000H, 03ff7158600000000H DQ 03ff7158540000000H, 03ff7158480000000H DQ 03ff71583c0000000H, 03ff7158300000000H DQ 03ff7158280000000H, 03ff71581c0000000H DQ 03ff7158100000000H, 03ff7158040000000H DQ 03ff7157f80000000H, 03ff7157ec0000000H DQ 03ff7157e00000000H, 03ff7157d40000000H DQ 03ff7157cc0000000H, 03ff7157c00000000H DQ 03ff7157b40000000H, 03ff7157a80000000H DQ 03ff71579c0000000H, 03ff7157900000000H DQ 03ff7157840000000H, 03ff7157780000000H DQ 03ff71576c0000000H, 03ff7157640000000H DQ 03ff7157580000000H, 03ff71574c0000000H DQ 03ff7157400000000H, 03ff7157340000000H DQ 03ff7157280000000H, 03ff71571c0000000H DQ 03ff7157100000000H, 03ff7157040000000H DQ 03ff7156fc0000000H, 03ff7156f00000000H DQ 03ff7156e40000000H, 03ff7156d80000000H DQ 03ff7156cc0000000H, 03ff7156c00000000H DQ 03ff7156b40000000H, 03ff7156a80000000H DQ 03ff7156a00000000H, 03ff7156940000000H DQ 03ff7156880000000H, 03ff71567c0000000H DQ 03ff7156700000000H, 03ff7156640000000H DQ 03ff7156580000000H, 03ff71564c0000000H DQ 03ff7156400000000H, 03ff7156380000000H DQ 03ff71562c0000000H, 03ff7156200000000H DQ 03ff7156140000000H, 03ff7156080000000H DQ 03ff7155fc0000000H, 03ff7155f00000000H DQ 03ff7155e40000000H, 03ff7155d80000000H DQ 03ff7155d00000000H, 03ff7155c40000000H DQ 03ff7155b80000000H, 03ff7155ac0000000H DQ 03ff7155a00000000H, 03ff7155940000000H DQ 03ff7155880000000H, 03ff71557c0000000H DQ 03ff7155700000000H, 03ff7155680000000H DQ 03ff71555c0000000H, 03ff7155500000000H DQ 03ff7155440000000H, 03ff7155380000000H DQ 03ff71552c0000000H, 03ff7155200000000H DQ 03ff7155140000000H, 03ff71550c0000000H DQ 03ff7155000000000H, 03ff7154f40000000H DQ 03ff7154e80000000H, 03ff7154dc0000000H DQ 03ff7154d00000000H, 03ff7154c40000000H DQ 03ff7154b80000000H, 03ff7154ac0000000H DQ 03ff7154a40000000H, 03ff7154980000000H DQ 03ff71548c0000000H, 03ff7154800000000H DQ 03ff7154740000000H, 0
log2_t3 DQ 0, 0 DQ 03eb80000c0000000H, 03d4722f0009be959H DQ 03ec80001a0000000H, 03d45e6576cb6dc2eH DQ 03ed10001a0000000H, 03d480762a98bdb6aH DQ 03ed7000300000000H, 03d231a4c495ec799H DQ 03edd0004b0000000H, 03d4926846928cda3H DQ 03ee1800368000000H, 03d4527509fdde667H DQ 03ee4000470000000H, 03d44fbd1292ae6daH DQ 03ee70005d8000000H, 03d4ef91cb226fd03H DQ 03eea000778000000H, 03d40978c9dc43b2eH DQ 03eed000948000000H, 03d33ae75bbe97951H DQ 03eef800af0000000H, 03d2d81b9a1639c05H DQ 03ef140068c000000H, 03d3d3aa4a1dd8452H DQ 03ef2c007b8000000H, 03d4d7bbe110bfb09H DQ 03ef4400900000000H, 03d43fbcb9ab61086H DQ 03ef5c00a60000000H, 03d421d94dff79062H DQ 03ef7000b98000000H, 03d43b8e9647408a2H DQ 03ef8800d24000000H, 03d4fd8ce39e1fdd4H DQ 03efa000ecc000000H, 03d439ab84e20bc42H DQ 03efb80108c000000H, 03d3dfd83269c6ac2H DQ 03efcc01214000000H, 03d3ca32ecd8004e0H DQ 03efe401400000000H, 03d47b472936c6005H DQ 03effc01608000000H, 03d31736ce8ef8e21H DQ 03f00a00c14000000H, 03d0617cfc138ccabH DQ 03f01400cfe000000H, 03d4e6d11d620108aH DQ 03f02000e26000000H, 03d2451827455b88dH DQ 03f02c00f58000000H, 03d435e7b8e426950H DQ 03f03801098000000H, 03d3296f937d77647H DQ 03f044011e4000000H, 03d2b6df6e16cae71H DQ 03f04e01302000000H, 03d2ff9376a2ea421H DQ 03f05a01464000000H, 03d438ebd204c10d2H DQ 03f066015d4000000H, 03d2b09d7e2fc6debH DQ 03f07201750000000H, 03d099925641f4f35H DQ 03f07c01896000000H, 03cedfbf4f07288e3H DQ 03f08801a28000000H, 03d32a0616748ca2aH DQ 03f09401bc6000000H, 03d49cc1e9cba43abH DQ 03f0a001d72000000H, 03d41ebd38173f5dbH DQ 03f0ac01f2a000000H, 03d41af6954471a92H DQ 03f0b6020a2000000H, 03d44a88bd59f4b89H DQ 03f0c202272000000H, 03d137160b27044e6H DQ 03f0ce0244c000000H, 03d47d7f6c97ef2fcH DQ 03f0da02634000000H, 03d44e605e1bb0db2H DQ 03f0e4027d4000000H, 03d459d8417d4ebcfH DQ 03f0f0029d4000000H, 03cf5ca7f05f05027H DQ 03f0fc02bde000000H, 03d4363b1c234f566H DQ 03f104016fb000000H, 03d3b7b6ed1035771H DQ 03f109017df000000H, 03d38699e204367efH DQ 03f10f018f6000000H, 03d44924bd9581118H DQ 03f11501a14000000H, 03d2252e80eb13b47H DQ 03f11b01b37000000H, 03d4c3c3381ce38a0H DQ 03f12101c61000000H, 03d4b88d24672a90dH DQ 03f12601d5e000000H, 03d4e1fc955055fefH DQ 03f12c01e94000000H, 03d36e18a547f3bc2H DQ 03f13201fd0000000H, 03ce9cbf2c6119ad4H DQ 03f13802111000000H, 03d4d03232a579871H DQ 03f13d02222000000H, 03d4d5c820ab96aa1H DQ 03f14302370000000H, 03d2ff6235a37497cH DQ 03f149024c3000000H, 03d4a4461e61bb95eH DQ 03f14f0261d000000H, 03d4431272c3ec2f0H DQ 03f15402742000000H, 03d424e2b9e3a8113H DQ 03f15a028a7000000H, 03d4a40baad7a3180H DQ 03f16002a13000000H, 03d33b2fef1b1988bH DQ 03f16602b85000000H, 03d01893f34559377H DQ 03f16c02cfc000000H, 03d4ffe120fb3ef44H DQ 03f17102e3b000000H, 03d120082c162d124H DQ 03f17702fbe000000H, 03d3e587c5b282967H DQ 03f17d03148000000H, 03d1df8f956673eacH DQ 03f183032d7000000H, 03d4ff8cd42de4f13H DQ 03f1880342a000000H, 03c83f84104915062H DQ 03f18e035c5000000H, 03d3484a765ad0e81H DQ 03f19403766000000H, 03d4c2a7e827b5b7cH DQ 03f19a0390e000000H, 03d45b9d9e619a5feH DQ 03f19f03a74000000H, 03d4389fde2d65d47H DQ 03f1a503c27000000H, 03d4b2175bb6d7bccH DQ 03f1ab03de1000000H, 03d34c0cf5c760a80H DQ 03f1b103fa1000000H, 03d046edae6d3e9a5H DQ 03f1b704166000000H, 03d4fd521af377bfcH DQ 03f1bc042e6000000H, 03d0cf59fe6ab1bfdH DQ 03f1c2044b7000000H, 03d3ccd20cc753db5H DQ 03f1c80468f000000H, 03d152df2a92669ccH DQ 03f1ce0486c000000H, 03d4e8cfdbe6ff5d7H DQ 03f1d3049ff000000H, 03d4e51b637245449H DQ 03f1d904be9000000H, 03d30855ccdda9dd0H DQ 03f1df04dd8000000H, 03d49dc0197d07430H DQ 03f1e504fce000000H, 03d431dc9bd27e20aH DQ 03f1ea05175000000H, 03d40ae402534fea4H DQ 03f1f005376000000H, 03d47fa77710aad2aH DQ 03f1f60557e000000H, 03d2bbdb4e113204bH DQ 03f1fc0578b000000H, 03d4d8d3b6e50d246H DQ 03f20102ccf800000H, 03d4bd3fc06a15de9H DQ 03f20382daf800000H, 03d4d93a1498ec6c9H DQ 03f20682ebf800000H, 03d33cb6df935a7f0H DQ 03f20982fd2000000H, 03d4de1089920cfdaH DQ 03f20c830e8000000H, 03d4985b012a6b1acH DQ 03f20f031d2000000H, 03d4913e1b9ba2290H DQ 03f212032ee000000H, 03d1624a57980edbcH DQ 03f2150340c800000H, 03d441ee709125ff3H DQ 03f2180352e800000H, 03d3a45e575f48b5dH DQ 03f21a83622800000H, 03d3501dd1e238a6cH DQ 03f21d8374a000000H, 03d4191bc1ea6aa2cH DQ 03f22083875000000H, 03ce323237921f7b0H DQ 03f223839a2800000H, 03d46b179d0781ff4H DQ 03f22683ad3800000H, 03d44c09dda134362H DQ 03f22903bd4000000H, 03d4652e31de50175H DQ 03f22c03d0b000000H, 03d137d77dcd68a32H DQ 03f22f03e44800000H, 03d4636fb2840cc02H DQ 03f23203f81800000H, 03d41a8e1979c27f4H DQ 03f2348408c000000H, 03d410dbf84163334H DQ 03f237841ce800000H, 03d4a8e042a7d4e75H DQ 03f23a84314800000H, 03d3772593772be29H DQ 03f23d8445d800000H, 03d223d4b2e8c031dH DQ 03f24004572000000H, 03d0c8072ca9dad06H DQ 03f243046c0800000H, 03d315a83ee313d33H DQ 03f24604812000000H, 03d473dc4088b7c68H DQ 03f24904967000000H, 03d3af34ea9dceae1H DQ 03f24c04abf000000H, 03d36c20ba0653485H DQ 03f24e84be0000000H, 03d39a63c847be3ffH DQ 03f25184d3d800000H, 03d48ca7750a55975H DQ 03f25484e9e800000H, 03d38db2a2d1381bbH DQ 03f25785002800000H, 03d2ef2461fbe7983H DQ 03f25a0512d800000H, 03d2c153bc40c395cH DQ 03f25d05297000000H, 03d4064fc5a39c232H DQ 03f26005404000000H, 03d070d1f7c4b597eH DQ 03f26305573800000H, 03d4a28e9bdbbc457H DQ 03f265856a8800000H, 03d474989ecc252f3H DQ 03f2688581e000000H, 03d4e13090fc01d57H DQ 03f26b85997000000H, 03d391227c8678403H DQ 03f26e85b13000000H, 03d155e22f244140dH DQ 0bf170fd210000000H, 0bd24caa429329aeeH DQ 0bf16dfd2ce000000H, 0bd4cb96d8562dc37H DQ 0bf16bfd34d000000H, 0bd2813e19b9dbfb8H DQ 0bf168fd409000000H, 0bd34c1a453011cc5H DQ 0bf165fd4c3000000H, 0bd4cd61ac43e09bcH DQ 0bf162fd57c000000H, 0bd4d64cef90ca8baH DQ 0bf15ffd634000000H, 0bd3819d713b1c267H DQ 0bf15cfd6ea000000H, 0bd319cda711db032H DQ 0bf159fd79e000000H, 0bd43a950c71a6171H DQ 0bf156fd851000000H, 0bd393b25eece00b9H DQ 0bf153fd902000000H, 0bd43ab308b5fe712H DQ 0bf151fd977000000H, 0bd4ca5e736256734H DQ 0bf14efda26000000H, 0bd40886b3b9c924dH DQ 0bf14bfdad3000000H, 0bd428441ff31aa38H DQ 0bf148fdb7f000000H, 0bd14cb421675c431H DQ 0bf145fdc29000000H, 0bcf8fb590baebb8dH DQ 0bf142fdcd1000000H, 0bd3a1f2ca38e93f3H DQ 0bf13ffdd78000000H, 0bd2dc25e83d52ed1H DQ 0bf13cfde1d000000H, 0bd3fd5b6efa081f3H DQ 0bf13afde8a000000H, 0bd49d89dd4f2bf07H DQ 0bf137fdf2d000000H, 0bd3e4f3d5d3a13b4H DQ 0bf134fdfce000000H, 0bd428fd96a5f7723H DQ 0bf131fe06e000000H, 0bd20452b288690a5H DQ 0bf12efe10c000000H, 0bd1d5f7c7e56ea2dH DQ 0bf12bfe1a8000000H, 0bd415fc47d421debH DQ 0bf128fe243000000H, 0bd3a598ca8dc214bH DQ 0bf125fe2dc000000H, 0bd4712f1d7350f14H DQ 0bf122fe374000000H, 0bd3e24878efa43e1H DQ 0bf120fe3d8000000H, 0bd48adffee23f9f0H DQ 0bf11dfe46d000000H, 0bd4d81e00aec2d96H DQ 0bf11afe501000000H, 0bd406eddef9956b1H DQ 0bf117fe593000000H, 0bd4174f65e105551H DQ 0bf114fe624000000H, 0bcf284c306b71311H DQ 0bf111fe6b2000000H, 0bd4dcc69dfedbec3H DQ 0bf10efe740000000H, 0bd323b7cee38aa4bH DQ 0bf10bfe7cc000000H, 0bd144104fd28c140H DQ 0bf108fe856000000H, 0bd34171a36d6a695H DQ 0bf106fe8b1000000H, 0bd4354a0acea06cdH DQ 0bf103fe939000000H, 0bd2eb1b1fae67526H DQ 0bf100fe9bf000000H, 0bd343a73fc467e03H DQ 0bf0fbfd486000000H, 0bd4aa705ed090ecaH DQ 0bf0f5fd58c000000H, 0bd4949cd0d4cde8eH DQ 0bf0effd690000000H, 0bd2816308340bd3dH DQ 0bf0e9fd790000000H, 0bcfb47fd2e8624a6H DQ 0bf0e3fd88c000000H, 0bd338fca5233867dH DQ 0bf0ddfd986000000H, 0bcf9cf14342e7c21H DQ 0bf0d9fda2a000000H, 0bd3388827d84b6e0H DQ 0bf0d3fdb1e000000H, 0bd3b3e0a6d6a2247H DQ 0bf0cdfdc0e000000H, 0bd4f92aec1df2a86H DQ 0bf0c7fdcfc000000H, 0bd4f9f3aa2200d30H DQ 0bf0c1fdde8000000H, 0bd3b894b32ad9b9fH DQ 0bf0bbfded0000000H, 0bd3405d8d2c46051H DQ 0bf0b5fdfb4000000H, 0bd445a0bd420a715H DQ 0bf0affe096000000H, 0bd39940136e0a90fH DQ 0bf0abfe12a000000H, 0bd46b0a6f2af86bbH DQ 0bf0a5fe206000000H, 0bd4bf4a2ca335408H DQ 0bf09ffe2e0000000H, 0bd3ea2d6b12e4d93H DQ 0bf099fe3b6000000H, 0bd40c6fd5fb7f840H DQ 0bf093fe48a000000H, 0bce555685c9c3116H DQ 0bf08dfe558000000H, 0bd4dfc70dfa2e7c3H DQ 0bf087fe626000000H, 0bd337897b84ac785H DQ 0bf081fe6f0000000H, 0bd1ca71ac6acd2d7H DQ 0bf07bfe7b6000000H, 0bd370c682f1de078H DQ 0bf077fe838000000H, 0bd45185d76c79d4cH DQ 0bf071fe8fa000000H, 0bd33bb0cdd985699H DQ 0bf06bfe9b8000000H, 0bd3976c00642b301H DQ 0bf065fea72000000H, 0bd4db1e6f5a163e7H DQ 0bf05ffeb2a000000H, 0bd4cc11808263596H DQ 0bf059febe0000000H, 0bd33d1dff912d171H DQ 0bf053fec92000000H, 0bd24a5ae52911a3aH DQ 0bf04dfed40000000H, 0bd3d050f249f8edcH DQ 0bf047fedec000000H, 0bd27d102dd924b0eH DQ 0bf043fee5c000000H, 0bd3e62957baad081H DQ 0bf03dfef02000000H, 0bd4376ad4524f2a0H DQ 0bf037fefa6000000H, 0bd2752913877e949H DQ 0bf031ff046000000H, 0bd292cb26a5ff847H DQ 0bf02bff0e2000000H, 0bd44da42ec6a2baeH DQ 0bf025ff17c000000H, 0bd4181e4056b600bH DQ 0bf01fff212000000H, 0bd4c420ca7722725H DQ 0bf019ff2a6000000H, 0bd451ab99454bc09H DQ 0bf015ff306000000H, 0bd4f4702fac61211H DQ 0bf00fff396000000H, 0bd23ccbf691e23e3H DQ 0bf009ff420000000H, 0bd48b7d85ede8a3bH DQ 0bf003ff4a8000000H, 0bd4a94f94a602836H DQ 0beffbfea5c000000H, 0bd35151ebd4248b6H DQ 0befeffeb60000000H, 0bd31312ebaebde60H DQ 0befe3fec5c000000H, 0bd44bf0e08b2a851H DQ 0befd7fed54000000H, 0bd3dfbe044563cddH DQ 0befcbfee44000000H, 0bd47553a6bb2cf4dH DQ 0befc3feee4000000H, 0bd02b3272c9e1514H DQ 0befb7fefc8000000H, 0bd4655cdd79568b8H DQ 0befabff0a8000000H, 0bd4998c8c6a29955H DQ 0bef9fff184000000H, 0bd35e84003879074H DQ 0bef93ff258000000H, 0bd34cfa09595f318H DQ 0bef87ff324000000H, 0bd47f3d66389e086H DQ 0bef7bff3ec000000H, 0bd43982f0dd1df79H DQ 0bef6fff4ac000000H, 0bd4d54d70b7407c7H DQ 0bef63ff568000000H, 0bd4529cb1e4119e9H DQ 0bef5bff5e0000000H, 0bd4ea8cf63b0e57aH DQ 0bef4fff694000000H, 0bd1a872dd1f9867bH DQ 0bef43ff73c000000H, 0bd46113f80238647H DQ 0bef37ff7e0000000H, 0bd46e9d9772d7da6H DQ 0bef2bff880000000H, 0bd276ac184b1770cH DQ 0bef1fff918000000H, 0bd171e07ff78e451H DQ 0bef13ff9a8000000H, 0bd3c0a102a88bdf6H DQ 0bef07ffa34000000H, 0bd2cfa098be9e4a8H DQ 0beef7ff570000000H, 0bd3d205955bedc7eH DQ 0beee7ff618000000H, 0bd47b79acbd1c3d4H DQ 0beecfff710000000H, 0bd37b870ff9b8582H DQ 0beeb7ff7f8000000H, 0bd3c31fb1038dd6dH DQ 0bee9fff8d0000000H, 0bd4e6de6a68aa227H DQ 0bee87ff9a0000000H, 0bd4cdaf09ce4e699H DQ 0bee6fffa68000000H, 0bd32c03059eee94bH DQ 0bee57ffb20000000H, 0bd1fead0c4719fccH DQ 0bee3fffbc8000000H, 0bd39656642e976adH DQ 0bee2fffc30000000H, 0bd46c7329db21925H DQ 0bee17ffcc8000000H, 0bd389eab4517a5ceH DQ 0bedffffaa0000000H, 0bd3fdf0e3da560d7H DQ 0bedcfffba0000000H, 0bd0a7c3d4511fbcbH DQ 0bed9fffc80000000H, 0bd0780884d13df75H DQ 0bed6fffd40000000H, 0bd3ec0a3e439ae99H DQ 0bed3fffdf0000000H, 0bd36c139bbface01H DQ 0bed0fffe80000000H, 0bd4578e60a3c176bH DQ 0becbfffe00000000H, 0bd3b5254714383f2H DQ 0bec7fffe80000000H, 0bd4764e185e2f8bbH DQ 0bec1ffff20000000H, 0bd4c67c0d84712a6H DQ 0beb7ffff40000000H, 0bd3f05250dd0685fH DQ 0bea7ffff80000000H, 0bd40b553538e0e0cH DQ 0, 0
; log2 polynomial coefficients clv DQ 03fc47fd462b3b816H, 03e79c3a6966457eeH ; c1|c3 DQ 0bfb550472a8bb463H, 0bfd62e4346694107H ; c2|c4
;-------Table T, D so that movapd gives [ D | T ] ;-------Note that the exponent field of T is set to 000 (instead of 3ffH) exp2_tbl DQ 03ff0000000000000H, 00000000000000000H DQ 03ff0163da9fb3335H, 03c9b61299ab8cdb7H DQ 03ff02c9a3e778061H, 0bc719083535b085dH DQ 03ff04315e86e7f85H, 0bc90a31c1977c96eH DQ 03ff059b0d3158574H, 03c8d73e2a475b465H DQ 03ff0706b29ddf6deH, 0bc8c91dfe2b13c26H DQ 03ff0874518759bc8H, 03c6186be4bb284ffH DQ 03ff09e3ecac6f383H, 03c91487818316135H DQ 03ff0b5586cf9890fH, 03c98a62e4adc610aH DQ 03ff0cc922b7247f7H, 03c901edc16e24f71H DQ 03ff0e3ec32d3d1a2H, 03c403a1727c57b52H DQ 03ff0fb66affed31bH, 0bc6b9bedc44ebd7bH DQ 03ff11301d0125b51H, 0bc96c51039449b39H DQ 03ff12abdc06c31ccH, 0bc51b514b36ca5c7H DQ 03ff1429aaea92de0H, 0bc932fbf9af1369eH DQ 03ff15a98c8a58e51H, 03c82406ab9eeab09H DQ 03ff172b83c7d517bH, 0bc819041b9d78a75H DQ 03ff18af9388c8deaH, 0bc911023d1970f6bH DQ 03ff1a35beb6fcb75H, 03c8e5b4c7b4968e4H DQ 03ff1bbe084045cd4H, 0bc995386352ef607H DQ 03ff1d4873168b9aaH, 03c9e016e00a2643cH DQ 03ff1ed5022fcd91dH, 0bc91df98027bb78bH DQ 03ff2063b88628cd6H, 03c8dc775814a8494H DQ 03ff21f49917ddc96H, 03c82a97e9494a5edH DQ 03ff2387a6e756238H, 03c99b07eb6c70572H DQ 03ff251ce4fb2a63fH, 03c8ac155bef4f4a4H DQ 03ff26b4565e27cddH, 03c82bd339940e9d9H DQ 03ff284dfe1f56381H, 0bc9a4c3a8c3f0d7dH DQ 03ff29e9df51fdee1H, 03c8612e8afad1255H DQ 03ff2b87fd0dad990H, 0bc410adcd6381aa3H DQ 03ff2d285a6e4030bH, 03c90024754db41d4H DQ 03ff2ecafa93e2f56H, 03c71ca0f45d52383H DQ 03ff306fe0a31b715H, 03c86f46ad23182e4H DQ 03ff32170fc4cd831H, 03c8a9ce78e18047cH DQ 03ff33c08b26416ffH, 03c932721843659a5H DQ 03ff356c55f929ff1H, 0bc8b5cee5c4e4628H DQ 03ff371a7373aa9cbH, 0bc963aeabf42eae1H DQ 03ff38cae6d05d866H, 0bc9e958d3c9904bcH DQ 03ff3a7db34e59ff7H, 0bc75e436d661f5e2H DQ 03ff3c32dc313a8e5H, 0bc9efff8375d29c3H DQ 03ff3dea64c123422H, 03c8ada0911f09ebbH DQ 03ff3fa4504ac801cH, 0bc97d023f956f9f3H DQ 03ff4160a21f72e2aH, 0bc5ef3691c309278H DQ 03ff431f5d950a897H, 0bc81c7dde35f7998H DQ 03ff44e086061892dH, 03c489b7a04ef80cfH DQ 03ff46a41ed1d0057H, 03c9c944bd1648a76H DQ 03ff486a2b5c13cd0H, 03c73c1a3b69062f0H DQ 03ff4a32af0d7d3deH, 03c99cb62f3d1be56H DQ 03ff4bfdad5362a27H, 03c7d4397afec42e2H DQ 03ff4dcb299fddd0dH, 03c98ecdbbc6a7833H DQ 03ff4f9b2769d2ca7H, 0bc94b309d25957e3H DQ 03ff516daa2cf6642H, 0bc8f768569bd93eeH DQ 03ff5342b569d4f82H, 0bc807abe1db13cacH DQ 03ff551a4ca5d920fH, 0bc8d689cefede59aH DQ 03ff56f4736b527daH, 03c99bb2c011d93acH DQ 03ff58d12d497c7fdH, 03c8295e15b9a1de7H DQ 03ff5ab07dd485429H, 03c96324c054647acH DQ 03ff5c9268a5946b7H, 03c3c4b1b816986a2H DQ 03ff5e76f15ad2148H, 03c9ba6f93080e65dH DQ 03ff605e1b976dc09H, 0bc93e2429b56de47H DQ 03ff6247eb03a5585H, 0bc9383c17e40b496H DQ 03ff6434634ccc320H, 0bc8c483c759d8932H DQ 03ff6623882552225H, 0bc9bb60987591c33H DQ 03ff68155d44ca973H, 03c6038ae44f73e64H DQ 03ff6a09e667f3bcdH, 0bc9bdd3413b26455H DQ 03ff6c012750bdabfH, 0bc72895667ff0b0cH DQ 03ff6dfb23c651a2fH, 0bc6bbe3a683c88aaH DQ 03ff6ff7df9519484H, 0bc883c0f25860ef6H DQ 03ff71f75e8ec5f74H, 0bc816e4786887a99H DQ 03ff73f9a48a58174H, 0bc90a8d96c65d53bH DQ 03ff75feb564267c9H, 0bc90245957316dd3H DQ 03ff780694fde5d3fH, 03c9866b80a02162cH DQ 03ff7a11473eb0187H, 0bc841577ee04992fH DQ 03ff7c1ed0130c132H, 03c9f124cd1164dd5H DQ 03ff7e2f336cf4e62H, 03c705d02ba15797eH DQ 03ff80427543e1a12H, 0bc927c86626d972aH DQ 03ff82589994cce13H, 0bc9d4c1dd41532d7H DQ 03ff8471a4623c7adH, 0bc88d684a341cdfbH DQ 03ff868d99b4492edH, 0bc9fc6f89bd4f6baH DQ 03ff88ac7d98a6699H, 03c9994c2f37cb53aH DQ 03ff8ace5422aa0dbH, 03c96e9f156864b26H DQ 03ff8cf3216b5448cH, 0bc70d55e32e9e3aaH DQ 03ff8f1ae99157736H, 03c85cc13a2e3976cH DQ 03ff9145b0b91ffc6H, 0bc9dd6792e582523H DQ 03ff93737b0cdc5e5H, 0bc675fc781b57ebbH DQ 03ff95a44cbc8520fH, 0bc764b7c96a5f039H DQ 03ff97d829fde4e50H, 0bc9d185b7c1b85d0H DQ 03ff9a0f170ca07baH, 0bc9173bd91cee632H DQ 03ff9c49182a3f090H, 03c7c7c46b071f2beH DQ 03ff9e86319e32323H, 03c7824ca78e64c6eH DQ 03ffa0c667b5de565H, 0bc9359495d1cd532H DQ 03ffa309bec4a2d33H, 03c96305c7ddc36abH DQ 03ffa5503b23e255dH, 0bc9d2f6edb8d41e1H DQ 03ffa799e1330b358H, 03c9bcb7ecac563c6H DQ 03ffa9e6b5579fdbfH, 03c90fac90ef7fd31H DQ 03ffac36bbfd3f37aH, 0bc8f9234cae76cd0H DQ 03ffae89f995ad3adH, 03c97a1cd345dcc81H DQ 03ffb0e07298db666H, 0bc9bdef54c80e424H DQ 03ffb33a2b84f15fbH, 0bc62805e3084d707H DQ 03ffb59728de5593aH, 0bc9c71dfbbba6de3H DQ 03ffb7f76f2fb5e47H, 0bc75584f7e54ac3aH DQ 03ffba5b030a1064aH, 0bc9efcd30e54292eH DQ 03ffbcc1e904bc1d2H, 03c823dd07a2d9e84H DQ 03ffbf2c25bd71e09H, 0bc9efdca3f6b9c72H DQ 03ffc199bdd85529cH, 03c811065895048ddH DQ 03ffc40ab5fffd07aH, 03c9b4537e083c60aH DQ 03ffc67f12e57d14bH, 03c92884dff483cacH DQ 03ffc8f6d9406e7b5H, 03c71acbc48805c44H DQ 03ffcb720dcef9069H, 03c7503cbd1e949dbH DQ 03ffcdf0b555dc3faH, 0bc8dd83b53829d72H DQ 03ffd072d4a07897cH, 0bc9cbc3743797a9cH DQ 03ffd2f87080d89f2H, 0bc9d487b719d8577H DQ 03ffd5818dcfba487H, 03c82ed02d75b3706H DQ 03ffd80e316c98398H, 0bc911ec18beddfe8H DQ 03ffda9e603db3285H, 03c9c2300696db532H DQ 03ffdd321f301b460H, 03c92da5778f018c2H DQ 03ffdfc97337b9b5fH, 0bc91a5cd4f184b5bH DQ 03ffe264614f5a129H, 0bc97b627817a1496H DQ 03ffe502ee78b3ff6H, 03c839e8980a9cc8fH DQ 03ffe7a51fbc74c83H, 03c92d522ca0c8de1H DQ 03ffea4afa2a490daH, 0bc9e9c23179c2893H DQ 03ffecf482d8e67f1H, 0bc9c93f3b411ad8cH DQ 03ffefa1bee615a27H, 03c9dc7f486a4b6b0H DQ 03fff252b376bba97H, 03c93a1a5bf0d8e43H DQ 03fff50765b6e4540H, 03c99d3e12dd8a18aH DQ 03fff7bfdad9cbe14H, 0bc9dbb12d0063509H DQ 03fffa7c1819e90d8H, 03c874853f3a5931eH DQ 03fffd3c22b8f71f1H, 03c62eb74966579e7H
Shifter DQ 04338000000000000H, 04338000000000000H ; 2^52+2^51|2^52+2^51 SIGMASK DQ 0000fffffffffffffH, 0000fffffffffffffH ONEMASK DQ 03ff0000000000000H, 03ff0000000000000H ABSVALMASK DQ 7fffffffffffffffH, 7fffffffffffffffH
; exponential polynomial coefficients cev DQ 03f55d87fe78a6731H, 03fac6b08d704a0bfH ; c3|c5 DQ 03f83b2ab6fba4e77H, 03fcebfbdff82c58eH ; c2|c4 DQ 03fe62e42fefa39efH ; c1
HALFSIG DQ 0fffffffff8000000H LHN DQ 0bff7154740000000H ; -log2(e) rounded to 27 bits sNaN DQ 07ff0000000000001H INF DQ 07ff0000000000000H NEG_INF DQ 0fff0000000000000H NEG_ZERO DQ 08000000000000000H EMIN DQ 00010000000000000H QIND DQ 0fff8000000000000H ; QNAN indefinite
ALIGN 16 CONST ENDS
$movsd MACRO op1, op2 LOCAL begin_movsd, end_movsd begin_movsd: movupd op1, op2 end_movsd: org begin_movsd db 0F2h org end_movsd ENDM
_TEXT SEGMENT PARA PUBLIC USE32 'CODE' ALIGN 16
PUBLIC _pow_pentium4, _CIpow_pentium4 _CIpow_pentium4 PROC NEAR push ebp mov ebp,esp sub esp,16 ; prepare place for argument and esp,0fffffff0h fxch st(1) fstp qword ptr [esp] ; base fstp qword ptr [esp+8] ; exponent call _pow_pentium4 leave ret _pow_pentium4 label proc ; load first argument movlpd xmm0, QWORD PTR [esp+4] ; load constants movlpd xmm7, QWORD PTR [SIGMASK] movlpd xmm2, QWORD PTR [ONEMASK]
andpd xmm7, xmm0 $movsd xmm4, xmm0 psrlq xmm0, 64-12-8 ; get first 7 bits after leading 1 pextrw eax, xmm0, 0 ; xmm7=first argument, with exponent set to 0+bias orpd xmm7, xmm2 ; extract sign/exponent + next 4 bits pextrw ecx, xmm4, 3
and eax, 0ffH add eax, 1 and eax, 1feH ; get r1=x*rcp_t1 mulsd xmm7, QWORD PTR [rcp_t1+eax*4] ; load first reciprocal value (based on first 7 bits) movlpd xmm5, QWORD PTR [rcp_t1+eax*4] add eax, eax ; load first log2_table values (high, low) in xmm6 movapd xmm6, QWORD PTR [log2_t1+eax*4]
; check sign/exponent of x mov edx, 7fefH ; x infinity/NaN or negative ? sub edx, ecx ; x denormal ? sub ecx, 0010H or ecx, edx cmp ecx, 80000000H jae SPECIAL_X
mov ecx, 0 ; set xmm1=2^8*(bias-0.5-2^{-8}) mov edx, 3fe7fH BACK_MAIN: BACK_DENORMAL: movd xmm1, edx ; get k (exponent) + j (j=0 if mantissa<1.5, 1 otherwise) psubq xmm0, xmm1 psrlq xmm0, 8 ; convert to DP format cvtdq2pd xmm0, xmm0 ; xmm1=mask for splitting argments in high/low parts movlpd xmm1, QWORD PTR [HALFSIG]
; copy r1 to xmm3, set exponent to 0+bias $movsd xmm3, xmm7 ;andpd xmm3, xmm7 ; extract bits 7..14 psrlq xmm7, 64-12-14 pextrw eax, xmm7, 0
; set exponent of argument to 0+bias andpd xmm4, QWORD PTR [SIGMASK]
and eax, 0ffH add eax, 1 and eax, 1feH ; load second reciprocal value (based on 7 bit index) ; get r2=x*rcp_t1*rcp_t2 mulsd xmm3, QWORD PTR [rcp_t2+eax*4] ; rcp_t1*rcp_t2 (exact multiplication) mulsd xmm5, QWORD PTR [rcp_t2+eax*4] add eax, eax ; load next log2_table values (high, low) to xmm6 addpd xmm6, QWORD PTR [log2_t2+eax*4] orpd xmm4, QWORD PTR [ONEMASK] ; add k addsd xmm6, xmm0 ; get xH = high part of x andpd xmm1, xmm4
; copy r2 to xmm2 $movsd xmm2, xmm3 ; extract bits 13...21 psrlq xmm3, 64-12-21 pextrw eax, xmm3, 0
; xmm0 = mask for splitting term in high/low parts movlpd xmm0, QWORD PTR [HALFSIG] ; get xL = low part of x subsd xmm4, xmm1 ; xmm7=-log2(e) in double precision (scaling factor for reduced argument) movlpd xmm7, QWORD PTR [LHN]
and eax, 1ffH add eax, 1 and eax, 3feH ; load third reciprocal value (based on 8 bit index) ; get rcp_t1*rcp_t2*rcp_t3 (exact multiplication) mulsd xmm5, QWORD PTR [rcp_t3+eax*4] ; get r3=x*rcp_t1*rcp_t2*rcp_t3 mulsd xmm2, QWORD PTR [rcp_t3+eax*4] ; load next log2_table values (high, low) to xmm6 addpd xmm6, QWORD PTR [log2_t3+eax*8]
; xmm0=rcp_H andpd xmm0, xmm5 ; xmm5=rcp_L subsd xmm5, xmm0 ; reduced argument addsd xmm7, xmm2
; copy rcp_H $movsd xmm3, xmm0 ; rcp_H*xH mulsd xmm0, xmm1 ; xH*rcp_L mulsd xmm1, xmm5 ; rcp_H*xL mulsd xmm3, xmm4
; calculate rounding error for reduced argument: R-rcp_H*xH subsd xmm2, xmm0 ; rcp_L*xL mulsd xmm4, xmm5 ; copy xmm6=D1+D2+D3|k+T1+T2+T3 $movsd xmm0, xmm6 ; R-rcp_H*xH-rcp_L*xH subsd xmm2, xmm1 ; add reduced argument to high order term: xmm6=D1+D2+D3|k+T1+T2+T3+Rh addsd xmm6, xmm7 ; load y movlpd xmm1, QWORD PTR [esp+12] ; get sign/exponent pextrw eax, xmm1, 3
; R-rcp_H*xH-rcp_L*xH-rcp_H*xL subsd xmm2, xmm3 ; get -Rh subsd xmm0, xmm6 ; xmm3=HALFSIG mask movlpd xmm3, QWORD PTR [HALFSIG]
; get exponent for log2(x) pextrw edx, xmm6, 3
; E=R-rcp_H*xH-rcp_L*xH-rcp_H*xL-rcp_L*xL subsd xmm2, xmm4 ; xmm4=k+T1+T2+T3+Rh $movsd xmm4, xmm6 ; get Rl=R-Rh addsd xmm0, xmm7 ; R=R-E subsd xmm7, xmm2 ; xmm6=D1+D2+D3|k+T1+T2+T3+Rh+Eh subsd xmm6, xmm2 ; xmm7=R|R unpcklpd xmm7, xmm7
; check if y is infinity/NaN and eax, 7ff0H cmp eax, 7ff0H jae SPECIAL_Y and edx, 7ff0H sub eax, 3ff0H add eax, edx ; y*log2(x)>=2^{11} ? (i.e. 2^{11}-eps-x<0) mov edx, 40a0H sub edx, eax ; avoid underflow on intermediate calculations (|y*log2(x)|<2^{-56} ?) sub eax, 3c70H or edx, eax cmp edx, 80000000H ; small input or UF/OF jae RETURN_ONE
BACK_XY_CHECK: ; -Eh subsd xmm4, xmm6 ; -El subsd xmm2, xmm4 ; xmm4=HALFSIG mask movlpd xmm4, QWORD PTR [HALFSIG] ; yH andpd xmm3, xmm1 ; HH (high part of k+T1+T2+T3+Rh+Eh) andpd xmm4, xmm6
; add correction to reduced argument: Rl+El subsd xmm0, xmm2
xorpd xmm2, xmm2 mov edx, 4060H ;70H pinsrw xmm2, edx, 3
; copy yH $movsd xmm5, xmm3 ; yH*HH mulsd xmm3, xmm4 ; HL subsd xmm6, xmm4 ; yL subsd xmm1, xmm5 ; get 2^7*(yH*HH) mulsd xmm3, xmm2 ;paddd xmm3, xmm2
; yH*HL mulsd xmm5, xmm6 ; xmm2=cl1|cl3 movapd xmm2, QWORD PTR [clv] ; HH*yL mulsd xmm4, xmm1
; get int(2^7*H) cvtsd2si eax, xmm3 ; HL*yL mulsd xmm6, xmm1 ; xmm1=cl2|cl4 movapd xmm1, QWORD PTR [clv+16]
; yH*HL+yL*HH addsd xmm5, xmm4 ; get D1+D2+D3 pshufd xmm4, xmm6, 0eeH ; yH*HL+yL*HH+yL*HL addsd xmm5, xmm6
; underflow/possible overflow condition ? mov edx, 1ff7fH ; eax>=(2^10-1)*2^7 sub edx, eax ; eax+bias*2^7<=59*2^7 ? add eax, 1e1ffH or edx, eax ; restore eax value sub eax, 1e1ffH ; check sign bit cmp edx, 0 jle UF_OF_CASES
; get table index, and exponent of result ; ecx contains expected sign of the result, scaled by 2^11 add ecx, eax and eax, 7fH ; get exponent of result (scaled by 2^7) and ecx, 0ffffff80h ; add exponent bias*2^7 add ecx, 1ff80h
; D1+D2+D3+(Rl+El) addsd xmm4, xmm0 ; xmm0=xmm3=2^7*H $movsd xmm0, xmm3 ; (2^7)*H+Shifter (to round to integer) addsd xmm3, QWORD PTR [Shifter]
; cl1*R|cl3*R mulpd xmm2, xmm7
; int((2^7)*H)=((2^7)*H+Shifter)-Shifter subsd xmm3, QWORD PTR [Shifter]
; R^2|R^2 mulpd xmm7, xmm7
; R_exp_h'=R_exp_h*(2^7)=(2^7)*H-int((2^7)*H) subsd xmm0, xmm3
; load table values add eax, eax add eax, eax add eax, eax add eax, eax ; D|T movapd xmm3, QWORD PTR [exp2_tbl+eax]
; load ce3|ce5 movapd xmm6, QWORD PTR [cev]
; cl2*R^2|cl4*R^2 mulpd xmm1, xmm7 ; cl1*R+cl2*R^2|cl3*R+cl4*R^2 addpd xmm2, xmm1 ; unpack cl1*R+cl2*R^2 pshufd xmm1, xmm2, 0eeh ; *|cl3*R^3+cl4*R^4 mulsd xmm2, xmm7 ; xmm7=0 xorpd xmm7, xmm7 mov edx, 3f80H ; Pl14 addsd xmm2, xmm1 ; xmm7=scaling constant pinsrw xmm7, edx, 3 ; low part of log2(x): D1+D2+D3+(Rl+E)+P14 addsd xmm2, xmm4
; load ce1 movlpd xmm4, QWORD PTR [cev+32] ; load 2^k movd xmm1, ecx
UF_BACK: ; y*(D1+D2+D3+(Rl+E)+P14) mulsd xmm2, QWORD PTR [esp+12] ; get R_exp_h=2^{-7}*R_exp_h' mulsd xmm0, xmm7
psllq xmm1, 52-7 ; xmm1=2^k|2^k pshufd xmm1, xmm1, 044h
; load ce2|ce4 movapd xmm7, QWORD PTR [cev+16] ; low part of y*log2(x): yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14) addsd xmm5, xmm2
; get D*2^k|T*2^k mulpd xmm3, xmm1 ; get R_exp=R_exp_h+yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14) addsd xmm0, xmm5 ; xmm0=R_exp|R_exp unpcklpd xmm0, xmm0
; ce3*R_exp|ce5*R_exp mulpd xmm6, xmm0 ; ce1*R_exp mulsd xmm4, xmm0 ; R_exp^2|R_exp^2 mulpd xmm0, xmm0 ; ce2+ce3*R_exp|ce4+ce5*R_exp addpd xmm7, xmm6 ; R_exp^2*(ce2+ce3*R_exp)|R_exp^2*(ce4+ce5*R_exp) mulpd xmm7, xmm0 ; R_exp^2*(T*2^k) mulsd xmm0, xmm3 ; unpack R_exp^2*(ce2+ce3*R_exp) pshufd xmm6, xmm7, 0eeh ; R_exp^4*(T*2^k)*(ce4+ce5*R_exp) mulsd xmm0, xmm7 ; unpack D*2^k pshufd xmm5, xmm3, 0eeh ; R_exp^2*(T*2^k)*(ce2+ce3*R_exp) mulsd xmm6, xmm3 ; ce1*(T*2^k)*R_exp mulsd xmm4, xmm3
; P45*(T*2^k)+D*2^k addsd xmm0, xmm5 sub esp, 16 ; P25*(T*2^k)+D*2^k addsd xmm0, xmm6 ; P15*(T*2^k)+D*2^k addsd xmm0, xmm4
; T+P15*(T*2^k)+D*2^k addsd xmm0, xmm3
movlpd QWORD PTR [esp+4], xmm0 ; return result fld QWORD PTR [esp+4] ; add esp, 16 ret
SPECIAL_X: ; load y movlpd xmm1, QWORD PTR [esp+12] movlpd xmm3, QWORD PTR [ABSVALMASK] ; load low half of y in eax movd eax, xmm1 $movsd xmm2, xmm1 ; eliminate sign, load high half of y in ecx andpd xmm1, xmm3 psrlq xmm1, 32 movd ecx, xmm1 ; y infinity/NaN ? cmp ecx, 7ff00000H jae Y_INF_NAN_CHECK_X ; y=+/- 0? or eax, ecx cmp eax, 0 jz Y_ZERO
; denormal, positive x ? cmp edx, 0 jge DENORMAL_POS_X ; reconstruct sign/expon from edx=7fefH-s/exp neg edx add edx, 7fefH
; y integer ? ; xmm3=0fff00..0 psllq xmm3,64-12 ; set exponent of y to all 1's orpd xmm2, xmm3 ; load bias-12 mov ecx, 3ffH-12 movd xmm3, ecx ; get exponent+64-52 psrlq xmm1, 32-12 psubd xmm1, xmm3 ; xmm3=0 pxor xmm3, xmm3 ; if exponent+12<0, set shift count to 0 pmaxsw xmm1, xmm3 ; get fractional tail of y psllq xmm2, xmm1 ; fractional tail=0 ? (i.e. y integer ?) pcmpeqd xmm2, xmm3 pmovmskb eax, xmm2
; take absolute value of x mov ecx, edx and edx, 7fffH ; check if x infinity/NaN cmp edx, 7ff0H jae INF_NAN_X
; x negative, finite ; y not integer ? and eax, 0ffH cmp eax, 0ffH jnz RET_INVALID
; y integer ; y odd integer ? movlpd xmm1, QWORD PTR [esp+12] movlpd xmm2, QWORD PTR [esp+12] ; load bias-11 mov ecx, 3ffH-11 movd xmm3, ecx ; get exponent+64-53 andpd xmm1, QWORD PTR [ABSVALMASK] psrlq xmm1, 64-12 psubd xmm1, xmm3 ; xmm3=100..0 movlpd xmm3, QWORD PTR [NEG_ZERO] ; get last integer bit, fractional tail of y psllq xmm2, xmm1 ; last int. bit=0 ? (i.e. y is an odd integer ?) pcmpeqd xmm2, xmm3 pmovmskb eax, xmm2 and eax, 0ffH ; if eax!=ffH, set ecx=2^11, else set ecx=0 mov ecx, 3ff01H ; set ecx=2^11*2^7 if y is an odd integer add ecx, eax and ecx, 40000H
; x denormal ? cmp edx, 0010H jb DENORMAL_X
; set xmm1=2^8*(bias-0.5-2^{-8}) mov edx, 0bfe7fH
; load constants, return to main path movlpd xmm3, QWORD PTR [SIGMASK] movlpd xmm2, QWORD PTR [ONEMASK] jmp BACK_MAIN
Y_INF_NAN_CHECK_X: ; x NaN? movlpd xmm7, QWORD PTR [esp+4] movlpd xmm4, QWORD PTR [esp+4] movd edx, xmm7 psrlq xmm7, 32 movd eax, xmm7
mov ecx, eax and eax, 7fffffffH cmp eax, 7ff00000H jb Y_INF_NAN ja X_NAN
cmp edx, 0 ja X_NAN jmp Y_INF_NAN
DENORMAL_POS_X: mov ecx, 0 DENORMAL_X: ; xmm0=2^64 xorpd xmm0, xmm0 mov eax, (3ffH+64)*16 pinsrw xmm0, eax, 3 ; load constants movlpd xmm7, QWORD PTR [SIGMASK] movlpd xmm2, QWORD PTR [ONEMASK]
; scale x by 2^64 mulsd xmm0, xmm4
; x=+/-0 ? movd edx, xmm4 psrlq xmm4, 32 movd eax, xmm4 cmp edx, 0 jz ZERO_X
BACK_DEN: andpd xmm7, xmm0 $movsd xmm4, xmm0 andpd xmm0, QWORD PTR [ABSVALMASK] psrlq xmm0, 64-12-8 ; get first 7 bits after leading 1 pextrw eax, xmm0, 0 orpd xmm7, xmm2
and eax, 0ffH add eax, 1 and eax, 1feH ; get r1=x*rcp_t1 mulsd xmm7, QWORD PTR [rcp_t1+eax*4] ; load first reciprocal value (based on first 7 bits) movlpd xmm5, QWORD PTR [rcp_t1+eax*4] add eax, eax ; load first log2_table values (high, low) in xmm6 movapd xmm6, QWORD PTR [log2_t1+eax*4]
; 2^8*(bias+64-0.5-2^{-8}) mov edx, 43e7fH jmp BACK_DENORMAL
ZERO_X: mov edx, eax and edx, 7fffffffH cmp edx, 0 jnz BACK_DEN
; get sign of y mov edx, DWORD PTR [esp+16] and edx, 80000000H cmp edx, 0 jz ZERO_X_POS_Y
; return -infinity if (y odd and x=-0), +infinity otherwise ; ecx=0 or 2^11*2^7 shl ecx, 20-7 ; eax=2^31 if (y odd and x=-0) and eax, ecx mov edx, 7ff00000H ; set sign of infinity or edx, eax ; load result movd xmm0, edx psllq xmm0, 32
; raise divide by zero movlpd xmm1, QWORD PTR [ONEMASK] movlpd xmm2, QWORD PTR [esp+4] divsd xmm1, xmm2
mov edx, 27 jmp CALL_LIBM_ERROR
ZERO_X_POS_Y:
; x=-0, and y odd integer ? ; ecx=0 or 2^11*2^7 shl ecx, 20-7 ; eax=2^31 if (y odd and x=-0) and eax, ecx cmp eax, 0 jnz RET_NEG_ZERO
; return +0 fldz ret
INF_NAN_X: ; y finite, not zero ; x NaN ? movlpd xmm3, QWORD PTR [SIGMASK] xorpd xmm1, xmm1 ; get significand bits andpd xmm3, xmm4 ; significand bits = 0 ? pcmpeqd xmm1, xmm3 pmovmskb ecx, xmm1 and ecx, 0ffH cmp ecx, 0ffH jnz X_NAN
; x=+infinity ? pextrw ecx, xmm4, 3 and ecx, 8000H cmp ecx,0 jz X_INF
; x=-infinity ; y integer ? and eax, 0ffH cmp eax, 0ffH jnz X_NINF ; y odd integer ? movlpd xmm1, QWORD PTR [esp+12] movlpd xmm2, QWORD PTR [esp+12] ; load bias-11 mov ecx, 3ffH-11 movd xmm3, ecx ; get exponent+64-53 andpd xmm1, QWORD PTR [ABSVALMASK] psrlq xmm1, 64-12 psubd xmm1, xmm3 ; xmm3=0 pxor xmm3, xmm3 ; get last integer bit, fractional tail of y psllq xmm2, xmm1 ; last int. bit=0 ? (i.e. y is an even integer ?) pcmpeqd xmm2, xmm3 pmovmskb eax, xmm2 and eax, 0ffH cmp eax, 0ffH jz X_NINF
; x=-infinity, y an odd integer movlpd xmm1, QWORD PTR [esp+12] pextrw eax, xmm1, 3 and eax, 8000H cmp eax, 0 ; y>0 ? jz RET_NINF ; y<0, return -0
RET_NEG_ZERO: fld [NEG_ZERO] ret
RET_NINF: fld [NEG_INF] ret
X_NINF: ; x=-infinity, y not an odd integer movlpd xmm1, QWORD PTR [esp+12] pextrw eax, xmm1, 3 and eax, 8000H cmp eax, 0 ; y>0 ? (return infinity) jz RET_INF ; y<0, return 0 fldz ret X_INF: ; y<0 ? movlpd xmm1, QWORD PTR [esp+12] pextrw eax, xmm1, 3 and eax, 8000H cmp eax, 0 jz RET_INF
; y<0, return 0 fldz ret
X_NAN: addsd xmm4, xmm4 ; sub esp, 16 ; movlpd QWORD PTR [esp+4], xmm4 ; fld QWORD PTR [esp+4] ; add esp, 16 ; ret $movsd xmm0, xmm4 mov edx, 1006 jmp CALL_LIBM_ERROR
RET_INVALID: ; x=-0? movlpd xmm2, QWORD PTR [esp+4] movd eax, xmm2 psrlq xmm2, 32 movd edx, xmm2 and edx, 7fffffffH or eax, edx mov ecx, 0 cmp eax, 0 jz ZERO_X
; raise INVALID exception movlpd xmm1, QWORD PTR [sNaN] movlpd xmm0, QWORD PTR [QIND] mulsd xmm1, xmm1 mov edx, 28 jmp CALL_LIBM_ERROR
SPECIAL_Y:
; load x, y movlpd xmm4, QWORD PTR [esp+4] movlpd xmm2, QWORD PTR [esp+12] ; x=+/-1 ? ; load lower bits of x movd eax, xmm4 cmp eax, 0 jnz Y_INF_NAN
psrlq xmm4, 32 movd edx, xmm4 ; x=1 ? cmp edx, 3ff00000H jz RET_ONE ; x=-1 ? cmp edx, 0bff00000H jnz Y_INF_NAN
; y=NaN ? (xmm1 contains y) movlpd xmm3, QWORD PTR [SIGMASK] xorpd xmm1, xmm1 ; get significand bits, to determine if y=NaN andpd xmm3, xmm2 ; significand bits = 0 ? pcmpeqd xmm1, xmm3 pmovmskb eax, xmm1 cmp eax, 0ffH jnz RET_Y_NAN
; y=+/-infinity, return 1 fld1 ret
Y_INF_NAN:
movlpd xmm3, QWORD PTR [SIGMASK] xorpd xmm1, xmm1 ; get significand bits, to determine if y=NaN andpd xmm3, xmm2 ; significand bits = 0 ? pcmpeqd xmm1, xmm3 pmovmskb eax, xmm1 and eax, 0ffH cmp eax, 0ffH jnz RET_Y_NAN
; y infinity, get sign pextrw eax, xmm2, 3 ; get x movlpd xmm4, QWORD PTR [esp+4] and eax, 8000H ; x=-1 ? (ecx,edx=high, low parts of x) xor ecx, 0bff00000H or edx, ecx cmp edx, 0 ; if x=-1, return 1 jz RET_ONE cmp eax, 0 jz Y_INF
; |x|<1 ? ( |x|=1 will not take this path) pextrw eax, xmm4, 3 and eax, 7ff0H cmp eax, 3ff0H jb RET_INF
; |x|>1, y=-infinity, return 0 fldz ret
Y_INF: ; y=+infinity ; |x|>=1 ? ( |x|=1 will not take this path) pextrw eax, xmm4, 3 and eax, 7ff0H cmp eax, 3ff0H jae RET_INF
; |x|<1, return 0 fldz ret RET_INF: fld QWORD PTR [INF] ret
RET_Y_NAN: addsd xmm2, xmm2 ; sub esp, 16 ; movlpd QWORD PTR [esp+4], xmm2 ; fld QWORD PTR [esp+4] ; add esp, 16 ; ret $movsd xmm0, xmm2 mov edx, 1006 jmp CALL_LIBM_ERROR
Y_ZERO:
; x=0 ? movd eax, xmm4 psrlq xmm4, 32 movd edx, xmm4 and edx, 7fffffffH mov ecx, eax or eax, edx movlpd xmm0, QWORD PTR [ONEMASK] mov edx, 26 cmp eax, 0 jz CALL_LIBM_ERROR
; x=NaN ? movd eax, xmm4 mov edx, 29 and eax, 7fffffffH cmp eax, 7ff00000H ; x=NaN ja CALL_LIBM_ERROR ; x!=NaN jb Y_ZERO_RET ; x=NaN ? cmp ecx,0 ja CALL_LIBM_ERROR Y_ZERO_RET: ; return 1 for any x sub esp, 16 movlpd QWORD PTR [esp+4], xmm0 fld QWORD PTR [esp+4] add esp, 16
ret
RET_ONE: ; used for x=+/-1, special y ; fld1 ; ret
movlpd xmm1, QWORD PTR [QIND] movlpd xmm0, QWORD PTR [esp+12] ; set Invalid flag, if necessary addsd xmm0, xmm1 mov edx, 28 ; jmp cALL_LIBM_ERROR
CALL_LIBM_ERROR: ;call libm_error_support(void *arg1,void *arg2,void *retval,error_types input_tag) sub esp, 28 movlpd QWORD PTR [esp+16], xmm0 mov DWORD PTR [esp+12],edx mov edx, esp add edx,16 mov DWORD PTR [esp+8],edx add edx,16+8 mov DWORD PTR [esp+4],edx sub edx, 8 mov DWORD PTR [esp],edx call NEAR PTR __libm_error_support ; movlpd xmm0, QWORD PTR [esp+16]
; movlpd QWORD PTR [esp+16], xmm0 ; return result fld QWORD PTR [esp+16] ; add esp,28 ret
UF_OF_CASES: cmp eax,0 jle UNDERFLOW_CASES
; if eax>=2^11*2^7, oF occurs cmp eax, 40000H jae RET_INF_OF
push esi ; overflow ; get table index, and exponent of result mov edx, eax ; ecx contains expected sign of the result, scaled by 2^11 and eax, 7fH ; add exponent (bias+bias)*2^7 add ecx, 3ff00h ; edx+=(bias+(-bias)-1)*2^7 ; the same -1 sub edx, 128 and edx, 0ffffff80H push edi mov edi, 3ff0H jmp OF_CONT
UNDERFLOW_CASES:
cmp eax, (2-1024)*256 jle RET_ZERO_UF
push esi ; get table index, and exponent of result mov edx, eax ; ecx contains expected sign of the result, scaled by 2^11 and eax, 7fH ; add exponent (bias+1-bias)*2^7 add ecx, 80h ; edx=exponent*2^7 and edx, 0ffffff80H ; edx+=(bias+bias-1)*2^7 add edx, 3fe80H push edi mov edi, 0
OF_CONT: ; D1+D2+D3+(Rl+E) addsd xmm4, xmm0 ; xmm0=xmm3=2^7*H $movsd xmm0, xmm3 ; (2^7)*H+Shifter (to round to integer) addsd xmm3, QWORD PTR [Shifter]
; esi=edx-bias*2^7 mov esi, edx sub esi, 1ff80H
; cl1*R|cl3*R mulpd xmm2, xmm7
; int((2^7)*H)=((2^7)*H+Shifter)-Shifter subsd xmm3, QWORD PTR [Shifter]
; R^2|R^2 mulpd xmm7, xmm7
; R_exp_h'=R_exp_h*(2^7)=(2^7)*H-int((2^7)*H) subsd xmm0, xmm3
; load table values add eax, eax add eax, eax add eax, eax add eax, eax ; D|T movapd xmm3, QWORD PTR [exp2_tbl+eax]
; load ce3|ce5 movapd xmm6, QWORD PTR [cev]
; cl2*R^2|cl4*R^2 mulpd xmm1, xmm7 ; cl1*R+cl2*R^2|cl3*R+cl4*R^2 addpd xmm2, xmm1 ; unpack cl1*R+cl2*R^2 pshufd xmm1, xmm2, 0eeh ; *|cl3*R^3+cl4*R^4 mulsd xmm2, xmm7 ; Pl14 addsd xmm2, xmm1 ; low part of log2(x): D1+D2+D3+(Rl+E)+P14 addsd xmm2, xmm4
; load ce1 movlpd xmm4, QWORD PTR [cev+32] ; load 2^k2 movd xmm1, edx ; edx=-(edx-bias*2^7)/2^7 sub edx, 1ff80H neg edx sar edx, 7
add edx, 2 ; if edx>=32, set edx to 64+ mov eax, edx and eax, 32 add edx, eax
; xmm7=0 xorpd xmm7, xmm7 mov eax, 3f80H ; xmm7=scaling constant pinsrw xmm7, eax, 3
; y*(D1+D2+D3+(Rl+E)+P14) mulsd xmm2, QWORD PTR [esp+12+4+4] ; get R_exp_h=2^{-7}*R_exp_h' mulsd xmm0, xmm7
psllq xmm1, 52-7 ; xmm1=2^k2|2^k2 pshufd xmm1, xmm1, 044h
; load ce2|ce4 movapd xmm7, QWORD PTR [cev+16] ; low part of y*log2(x): yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14) addsd xmm5, xmm2
; get D*2^k|T*2^k mulpd xmm3, xmm1 ; get R_exp=R_exp_h+yH*HL+yL*HH+yL*HL+y*(D1+D2+D3+(Rl+E)+P14) addsd xmm0, xmm5 ; xmm0=R_exp|R_exp unpcklpd xmm0, xmm0
; ce3*R_exp|ce5*R_exp mulpd xmm6, xmm0 ; ce1*R_exp mulsd xmm4, xmm0 ; R_exp^2|R_exp^2 mulpd xmm0, xmm0 ; ce2+ce3*R_exp|ce4+ce5*R_exp addpd xmm7, xmm6 ; R_exp^2*(ce2+ce3*R_exp)|R_exp^2*(ce4+ce5*R_exp) mulpd xmm7, xmm0 ; R_exp^2*(T*2^k) mulsd xmm0, xmm3 ; unpack R_exp^2*(ce2+ce3*R_exp) pshufd xmm6, xmm7, 0eeh ; R_exp^4*(T*2^k)*(ce4+ce5*R_exp) mulsd xmm0, xmm7 ; unpack D*2^k pshufd xmm5, xmm3, 0eeh ; R_exp^2*(T*2^k)*(ce2+ce3*R_exp) mulsd xmm6, xmm3 ; ce1*(T*2^k)*R_exp mulsd xmm4, xmm3
; xmm7=2^k' movd xmm7, ecx psllq xmm7, 52-7
movd xmm2, edx pcmpeqd xmm1, xmm1 psllq xmm1, xmm2
; P45*(T*2^k)+D*2^k addsd xmm0, xmm5 ; P25*(T*2^k)+D*2^k addsd xmm0, xmm6
; Th andpd xmm1, xmm3
; P15*(T*2^k)+D*2^k addsd xmm0, xmm4 ; xmm6=0 xorpd xmm6, xmm6
pcmpeqd xmm4, xmm4 psllq xmm4, xmm2
; Tl subsd xmm3, xmm1 ; xmm2=Th $movsd xmm2, xmm1
; (Th+(P15*(T*2^k)+D*2^k)_high)_high addsd xmm1, xmm0 andpd xmm1, xmm4 ; xmm6=(possible OF)?1:0 pinsrw xmm6, edi, 3 pop edi
; -(P15*(T*2^k)+D*2^k)_high subsd xmm2, xmm1
; (P15*(T*2^k)+D*2^k)_low addsd xmm0, xmm2
; Tl+(P15*(T*2^k)+D*2^k)_low addsd xmm0, xmm3
cmp esi, 0 jg SCALE2
pop esi ; final scaling by 2^k' mulsd xmm0, xmm7 mulsd xmm1, xmm7
; final addition addsd xmm0, xmm1
mulsd xmm6, xmm0 addsd xmm0, xmm6
; overflow, or underflow pextrw eax, xmm0, 3 and eax, 7ff0H mov edx, 24 cmp eax, 7ff0H jz CALL_LIBM_ERROR
mov edx, 25 cmp eax, 0 jz CALL_LIBM_ERROR
sub esp, 16 movlpd QWORD PTR [esp+4], xmm0 ; return result fld QWORD PTR [esp+4] ; add esp, 16 ret
SCALE2: pop esi
; final addition addsd xmm0, xmm1 ; final scaling by 2^k' mulsd xmm0, xmm7
mulsd xmm6, xmm0 addsd xmm0, xmm6
; overflow, or underflow pextrw eax, xmm0, 3 and eax, 7ff0H mov edx, 24 cmp eax, 7ff0H jz CALL_LIBM_ERROR
mov edx, 25 cmp eax, 0 jz CALL_LIBM_ERROR
sub esp, 16 movlpd QWORD PTR [esp+4], xmm0 ; return result fld QWORD PTR [esp+4] ; add esp, 16 ret
RET_ZERO_UF:
movlpd xmm0, QWORD PTR [EMIN] ; sign movd xmm1, ecx mulsd xmm0, xmm0
; set sign psllq xmm1, 63-18 orpd xmm0, xmm1
mov edx, 25 jmp CALL_LIBM_ERROR
RET_INF_OF:
mov edx, 24
; check sign cmp ecx, 0 jz RET_INF_OF2
movlpd xmm0, QWORD PTR [NEG_INF] jmp CALL_LIBM_ERROR
RET_INF_OF2:
movlpd xmm0, QWORD PTR [INF] jmp CALL_LIBM_ERROR
RETURN_ONE: ; y|y pshufd xmm4, xmm1, 44H ; y*log2(x)_high mulpd xmm4, xmm6 ; get exponent pextrw eax, xmm4, 3 and eax, 7ff0H ; y*log2(x)>=2^{11} ? (i.e. 2^{11}-eps-x<0) mov edx, 40a0H sub edx, eax ; avoid underflow on intermediate calculations (|y*log2(x)|<2^{-56} ?) sub eax, 3c70H or edx, eax cmp edx, 80000000H ; if no OF/UF occurs, return to main path jb BACK_XY_CHECK
CONT_OF_UF: ; overflow/underflow ? cmp eax, 80000000H jb OF_UF
RET_ONE2: ; return +/- 1 or ecx, 1ff80H movd xmm0, ecx psllq xmm0, 52-7
sub esp, 16 movlpd [esp+4], xmm0 fld QWORD PTR [esp+4] add esp, 16 ret
OF_UF:
movlpd xmm4, [esp+4] pextrw edx, xmm4, 3 and edx, 7ff0H sub edx, 3ff0H
pextrw eax, xmm1, 3 xor eax, edx and eax, 8000H cmp eax, 0 jnz RET_ZERO_UF jmp RET_INF_OF
_CIpow_pentium4 ENDP
ALIGN 16 _TEXT ENDS
END
|