7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 25 package org.graalvm.compiler.lir.amd64; 26 27 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; 28 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; 29 import static jdk.vm.ci.code.ValueUtil.asRegister; 30 31 import org.graalvm.compiler.asm.Label; 32 import org.graalvm.compiler.asm.amd64.AMD64Address; 33 import org.graalvm.compiler.asm.amd64.AMD64Address.Scale; 34 import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag; 35 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler; 36 import org.graalvm.compiler.core.common.LIRKind; 37 import org.graalvm.compiler.debug.GraalError; 38 import org.graalvm.compiler.lir.LIRInstructionClass; 39 import org.graalvm.compiler.lir.Opcode; 40 import org.graalvm.compiler.lir.asm.ArrayDataPointerConstant; 41 import org.graalvm.compiler.lir.asm.CompilationResultBuilder; 42 import org.graalvm.compiler.lir.gen.LIRGeneratorTool; 43 44 import jdk.vm.ci.amd64.AMD64; 45 import jdk.vm.ci.amd64.AMD64Kind; 46 import jdk.vm.ci.code.Register; 47 import jdk.vm.ci.meta.AllocatableValue; 48 import jdk.vm.ci.meta.Value; 49 50 public final class AMD64MathIntrinsicBinaryOp extends AMD64LIRInstruction { 51 public static final LIRInstructionClass<AMD64MathIntrinsicBinaryOp> TYPE = LIRInstructionClass.create(AMD64MathIntrinsicBinaryOp.class); 52 53 public enum BinaryIntrinsicOpcode { 54 POW 55 } 56 57 @Opcode private final BinaryIntrinsicOpcode opcode; 58 @Def protected Value result; 59 @Use protected Value input; 60 @Use protected Value secondInput; 61 @Temp({REG, ILLEGAL}) protected Value xmm1Temp = Value.ILLEGAL; 62 @Temp({REG, ILLEGAL}) protected Value xmm2Temp = Value.ILLEGAL; 63 @Temp({REG, ILLEGAL}) protected Value xmm3Temp = Value.ILLEGAL; 64 @Temp({REG, ILLEGAL}) protected Value xmm4Temp = Value.ILLEGAL; 65 @Temp({REG, ILLEGAL}) protected Value xmm5Temp = Value.ILLEGAL; 66 @Temp({REG, ILLEGAL}) protected Value xmm6Temp = Value.ILLEGAL; 67 @Temp({REG, ILLEGAL}) protected Value xmm7Temp = Value.ILLEGAL; 68 @Temp({REG, ILLEGAL}) protected Value xmm8Temp = Value.ILLEGAL; 69 @Temp({REG, ILLEGAL}) protected Value xmm9Temp = Value.ILLEGAL; 70 @Temp({REG, ILLEGAL}) protected Value xmm10Temp = Value.ILLEGAL; 71 @Temp({REG, ILLEGAL}) protected Value gpr1Temp = Value.ILLEGAL; 72 @Temp({REG, ILLEGAL}) protected Value gpr2Temp = Value.ILLEGAL; 73 @Temp protected AllocatableValue rcxTemp; 74 @Temp({REG, ILLEGAL}) protected Value gpr4Temp = Value.ILLEGAL; 75 @Temp({REG, ILLEGAL}) protected Value gpr5Temp = Value.ILLEGAL; 76 @Temp({REG, ILLEGAL}) protected Value gpr6Temp = Value.ILLEGAL; 77 @Temp({REG, ILLEGAL}) protected Value gpr7Temp = Value.ILLEGAL; 78 @Temp({REG, ILLEGAL}) protected Value gpr8Temp = Value.ILLEGAL; 79 @Temp({REG, ILLEGAL}) protected Value gpr9Temp = Value.ILLEGAL; 80 @Temp({REG, ILLEGAL}) protected Value gpr10Temp = Value.ILLEGAL; 81 82 CompilationResultBuilder internalCrb; 83 84 public AMD64MathIntrinsicBinaryOp(LIRGeneratorTool tool, BinaryIntrinsicOpcode opcode, Value result, Value input, Value alternateInput) { 85 super(TYPE); 86 this.opcode = opcode; 87 this.result = result; 88 this.input = input; 89 this.secondInput = alternateInput; 90 if (opcode == BinaryIntrinsicOpcode.POW) { 91 this.gpr1Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 92 this.gpr2Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 93 this.rcxTemp = AMD64.rcx.asValue(LIRKind.value(AMD64Kind.QWORD)); 94 this.gpr4Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 95 this.gpr5Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 96 this.gpr6Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 97 this.gpr7Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 98 this.gpr8Temp = tool.newVariable(LIRKind.value(AMD64Kind.QWORD)); 99 100 this.xmm1Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 101 this.xmm2Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 102 this.xmm3Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 103 this.xmm4Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 104 this.xmm5Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 105 this.xmm6Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 106 this.xmm7Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 107 this.xmm8Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 108 this.xmm9Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 109 this.xmm10Temp = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE)); 110 } 111 } 112 113 private void setCrb(CompilationResultBuilder crb) { 114 internalCrb = crb; 115 } 116 117 private AMD64Address externalAddress(ArrayDataPointerConstant curPtr) { 118 return (AMD64Address) internalCrb.recordDataReferenceInCode(curPtr); 119 } 120 121 @Override 122 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { 123 switch (opcode) { 124 case POW: 125 powIntrinsic(asRegister(result, AMD64Kind.DOUBLE), asRegister(input, AMD64Kind.DOUBLE), asRegister(secondInput, AMD64Kind.DOUBLE), crb, masm); 126 break; 127 default: 128 throw GraalError.shouldNotReachHere(); 129 } 130 } 131 132 /* 133 * Copyright (c) 2014, 2016, Intel Corporation. All rights reserved. Intel Math Library (LIBM) 134 * Source Code 135 * 136 * ALGORITHM DESCRIPTION - POW() --------------------- 137 * 138 * Let x=2^k * mx, mx in [1,2) 139 * 140 * log2(x) calculation: 141 * 142 * Get B~1/mx based on the output of rcpps instruction (B0) B = int((B0*LH*2^9+0.5))/2^9 LH is a 143 * short approximation for log2(e) 144 * 145 * Reduced argument, scaled by LH: r=B*mx-LH (computed accurately in high and low parts) 146 * 147 * log2(x) result: k - log2(B) + p(r) p(r) is a degree 8 polynomial -log2(B) read from data 148 * table (high, low parts) log2(x) is formed from high and low parts For |x| in [1-1/32, 149 * 1+1/16), a slower but more accurate computation based om the same table design is performed. 150 * 151 * Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8, to filter out all 152 * potential OF/UF cases. exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5 153 * polynomial 154 * 155 * Special cases: pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd integer 156 * < 0. pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and not an odd 157 * integer. pow(-0,y) = -0 for y an odd integer > 0. pow(-0,y) = +0 for y > 0 and not an odd 158 * integer. pow(-1,-INF) = NaN. pow(+1,y) = NaN for any y, even a NaN. pow(x,-0) = 1 for any x, 159 * even a NaN. pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and finite 160 * non-integer y. pow(x,-INF) = +INF for |x|<1. pow(x,-INF) = +0 for |x|>1. pow(x,+INF) = +0 for 161 * |x|<1. pow(x,+INF) = +INF for |x|>1. pow(-INF,y) = -0 for y an odd integer < 0. pow(-INF,y) = 162 * +0 for y < 0 and not an odd integer. pow(-INF,y) = -INF for y an odd integer > 0. pow(-INF,y) 163 * = +INF for y > 0 and not an odd integer. pow(+INF,y) = +0 for y <0. pow(+INF,y) = +INF for y 164 * >0. 165 * 166 */ 167 168 private static int[] highSigMask = { 169 0x00000000, 0xfffff800, 0x00000000, 0xfffff800 170 }; 171 172 private static int[] logTwoE = { 173 0x00000000, 0x3ff72000, 0x161bb241, 0xbf5dabe1 174 }; 175 176 private static int[] highmaskY = { 177 0x00000000, 0xfffffff8, 0x00000000, 0xffffffff 178 }; 179 180 private static int[] tExp = { 181 0x00000000, 0x3ff00000, 0x00000000, 0x3b700000, 0xfa5abcbf, 182 0x3ff00b1a, 0xa7609f71, 0xbc84f6b2, 0xa9fb3335, 0x3ff0163d, 183 0x9ab8cdb7, 0x3c9b6129, 0x143b0281, 0x3ff02168, 0x0fc54eb6, 184 0xbc82bf31, 0x3e778061, 0x3ff02c9a, 0x535b085d, 0xbc719083, 185 0x2e11bbcc, 0x3ff037d4, 0xeeade11a, 0x3c656811, 0xe86e7f85, 186 0x3ff04315, 0x1977c96e, 0xbc90a31c, 0x72f654b1, 0x3ff04e5f, 187 0x3aa0d08c, 0x3c84c379, 0xd3158574, 0x3ff059b0, 0xa475b465, 188 0x3c8d73e2, 0x0e3c1f89, 0x3ff0650a, 0x5799c397, 0xbc95cb7b, 189 0x29ddf6de, 0x3ff0706b, 0xe2b13c27, 0xbc8c91df, 0x2b72a836, 190 0x3ff07bd4, 0x54458700, 0x3c832334, 0x18759bc8, 0x3ff08745, 191 0x4bb284ff, 0x3c6186be, 0xf66607e0, 0x3ff092bd, 0x800a3fd1, 192 0xbc968063, 0xcac6f383, 0x3ff09e3e, 0x18316136, 0x3c914878, 193 0x9b1f3919, 0x3ff0a9c7, 0x873d1d38, 0x3c85d16c, 0x6cf9890f, 194 0x3ff0b558, 0x4adc610b, 0x3c98a62e, 0x45e46c85, 0x3ff0c0f1, 195 0x06d21cef, 0x3c94f989, 0x2b7247f7, 0x3ff0cc92, 0x16e24f71, 196 0x3c901edc, 0x23395dec, 0x3ff0d83b, 0xe43f316a, 0xbc9bc14d, 197 0x32d3d1a2, 0x3ff0e3ec, 0x27c57b52, 0x3c403a17, 0x5fdfa9c5, 198 0x3ff0efa5, 0xbc54021b, 0xbc949db9, 0xaffed31b, 0x3ff0fb66, 199 0xc44ebd7b, 0xbc6b9bed, 0x28d7233e, 0x3ff10730, 0x1692fdd5, 200 0x3c8d46eb, 0xd0125b51, 0x3ff11301, 0x39449b3a, 0xbc96c510, 201 0xab5e2ab6, 0x3ff11edb, 0xf703fb72, 0xbc9ca454, 0xc06c31cc, 202 0x3ff12abd, 0xb36ca5c7, 0xbc51b514, 0x14f204ab, 0x3ff136a8, 203 0xba48dcf0, 0xbc67108f, 0xaea92de0, 0x3ff1429a, 0x9af1369e, 204 0xbc932fbf, 0x934f312e, 0x3ff14e95, 0x39bf44ab, 0xbc8b91e8, 205 0xc8a58e51, 0x3ff15a98, 0xb9eeab0a, 0x3c82406a, 0x5471c3c2, 206 0x3ff166a4, 0x82ea1a32, 0x3c58f23b, 0x3c7d517b, 0x3ff172b8, 207 0xb9d78a76, 0xbc819041, 0x8695bbc0, 0x3ff17ed4, 0xe2ac5a64, 208 0x3c709e3f, 0x388c8dea, 0x3ff18af9, 0xd1970f6c, 0xbc911023, 209 0x58375d2f, 0x3ff19726, 0x85f17e08, 0x3c94aadd, 0xeb6fcb75, 210 0x3ff1a35b, 0x7b4968e4, 0x3c8e5b4c, 0xf8138a1c, 0x3ff1af99, 211 0xa4b69280, 0x3c97bf85, 0x84045cd4, 0x3ff1bbe0, 0x352ef607, 212 0xbc995386, 0x95281c6b, 0x3ff1c82f, 0x8010f8c9, 0x3c900977, 213 0x3168b9aa, 0x3ff1d487, 0x00a2643c, 0x3c9e016e, 0x5eb44027, 214 0x3ff1e0e7, 0x088cb6de, 0xbc96fdd8, 0x22fcd91d, 0x3ff1ed50, 215 0x027bb78c, 0xbc91df98, 0x8438ce4d, 0x3ff1f9c1, 0xa097af5c, 216 0xbc9bf524, 0x88628cd6, 0x3ff2063b, 0x814a8495, 0x3c8dc775, 217 0x3578a819, 0x3ff212be, 0x2cfcaac9, 0x3c93592d, 0x917ddc96, 218 0x3ff21f49, 0x9494a5ee, 0x3c82a97e, 0xa27912d1, 0x3ff22bdd, 219 0x5577d69f, 0x3c8d34fb, 0x6e756238, 0x3ff2387a, 0xb6c70573, 220 0x3c99b07e, 0xfb82140a, 0x3ff2451f, 0x911ca996, 0x3c8acfcc, 221 0x4fb2a63f, 0x3ff251ce, 0xbef4f4a4, 0x3c8ac155, 0x711ece75, 222 0x3ff25e85, 0x4ac31b2c, 0x3c93e1a2, 0x65e27cdd, 0x3ff26b45, 223 0x9940e9d9, 0x3c82bd33, 0x341ddf29, 0x3ff2780e, 0x05f9e76c, 224 0x3c9e067c, 0xe1f56381, 0x3ff284df, 0x8c3f0d7e, 0xbc9a4c3a, 225 0x7591bb70, 0x3ff291ba, 0x28401cbd, 0xbc82cc72, 0xf51fdee1, 226 0x3ff29e9d, 0xafad1255, 0x3c8612e8, 0x66d10f13, 0x3ff2ab8a, 227 0x191690a7, 0xbc995743, 0xd0dad990, 0x3ff2b87f, 0xd6381aa4, 228 0xbc410adc, 0x39771b2f, 0x3ff2c57e, 0xa6eb5124, 0xbc950145, 229 0xa6e4030b, 0x3ff2d285, 0x54db41d5, 0x3c900247, 0x1f641589, 230 0x3ff2df96, 0xfbbce198, 0x3c9d16cf, 0xa93e2f56, 0x3ff2ecaf, 231 0x45d52383, 0x3c71ca0f, 0x4abd886b, 0x3ff2f9d2, 0x532bda93, 232 0xbc653c55, 0x0a31b715, 0x3ff306fe, 0xd23182e4, 0x3c86f46a, 233 0xedeeb2fd, 0x3ff31432, 0xf3f3fcd1, 0x3c8959a3, 0xfc4cd831, 234 0x3ff32170, 0x8e18047c, 0x3c8a9ce7, 0x3ba8ea32, 0x3ff32eb8, 235 0x3cb4f318, 0xbc9c45e8, 0xb26416ff, 0x3ff33c08, 0x843659a6, 236 0x3c932721, 0x66e3fa2d, 0x3ff34962, 0x930881a4, 0xbc835a75, 237 0x5f929ff1, 0x3ff356c5, 0x5c4e4628, 0xbc8b5cee, 0xa2de883b, 238 0x3ff36431, 0xa06cb85e, 0xbc8c3144, 0x373aa9cb, 0x3ff371a7, 239 0xbf42eae2, 0xbc963aea, 0x231e754a, 0x3ff37f26, 0x9eceb23c, 240 0xbc99f5ca, 0x6d05d866, 0x3ff38cae, 0x3c9904bd, 0xbc9e958d, 241 0x1b7140ef, 0x3ff39a40, 0xfc8e2934, 0xbc99a9a5, 0x34e59ff7, 242 0x3ff3a7db, 0xd661f5e3, 0xbc75e436, 0xbfec6cf4, 0x3ff3b57f, 243 0xe26fff18, 0x3c954c66, 0xc313a8e5, 0x3ff3c32d, 0x375d29c3, 244 0xbc9efff8, 0x44ede173, 0x3ff3d0e5, 0x8c284c71, 0x3c7fe8d0, 245 0x4c123422, 0x3ff3dea6, 0x11f09ebc, 0x3c8ada09, 0xdf1c5175, 246 0x3ff3ec70, 0x7b8c9bca, 0xbc8af663, 0x04ac801c, 0x3ff3fa45, 247 0xf956f9f3, 0xbc97d023, 0xc367a024, 0x3ff40822, 0xb6f4d048, 248 0x3c8bddf8, 0x21f72e2a, 0x3ff4160a, 0x1c309278, 0xbc5ef369, 249 0x2709468a, 0x3ff423fb, 0xc0b314dd, 0xbc98462d, 0xd950a897, 250 0x3ff431f5, 0xe35f7999, 0xbc81c7dd, 0x3f84b9d4, 0x3ff43ffa, 251 0x9704c003, 0x3c8880be, 0x6061892d, 0x3ff44e08, 0x04ef80d0, 252 0x3c489b7a, 0x42a7d232, 0x3ff45c20, 0x82fb1f8e, 0xbc686419, 253 0xed1d0057, 0x3ff46a41, 0xd1648a76, 0x3c9c944b, 0x668b3237, 254 0x3ff4786d, 0xed445733, 0xbc9c20f0, 0xb5c13cd0, 0x3ff486a2, 255 0xb69062f0, 0x3c73c1a3, 0xe192aed2, 0x3ff494e1, 0x5e499ea0, 256 0xbc83b289, 0xf0d7d3de, 0x3ff4a32a, 0xf3d1be56, 0x3c99cb62, 257 0xea6db7d7, 0x3ff4b17d, 0x7f2897f0, 0xbc8125b8, 0xd5362a27, 258 0x3ff4bfda, 0xafec42e2, 0x3c7d4397, 0xb817c114, 0x3ff4ce41, 259 0x690abd5d, 0x3c905e29, 0x99fddd0d, 0x3ff4dcb2, 0xbc6a7833, 260 0x3c98ecdb, 0x81d8abff, 0x3ff4eb2d, 0x2e5d7a52, 0xbc95257d, 261 0x769d2ca7, 0x3ff4f9b2, 0xd25957e3, 0xbc94b309, 0x7f4531ee, 262 0x3ff50841, 0x49b7465f, 0x3c7a249b, 0xa2cf6642, 0x3ff516da, 263 0x69bd93ef, 0xbc8f7685, 0xe83f4eef, 0x3ff5257d, 0x43efef71, 264 0xbc7c998d, 0x569d4f82, 0x3ff5342b, 0x1db13cad, 0xbc807abe, 265 0xf4f6ad27, 0x3ff542e2, 0x192d5f7e, 0x3c87926d, 0xca5d920f, 266 0x3ff551a4, 0xefede59b, 0xbc8d689c, 0xdde910d2, 0x3ff56070, 267 0x168eebf0, 0xbc90fb6e, 0x36b527da, 0x3ff56f47, 0x011d93ad, 268 0x3c99bb2c, 0xdbe2c4cf, 0x3ff57e27, 0x8a57b9c4, 0xbc90b98c, 269 0xd497c7fd, 0x3ff58d12, 0x5b9a1de8, 0x3c8295e1, 0x27ff07cc, 270 0x3ff59c08, 0xe467e60f, 0xbc97e2ce, 0xdd485429, 0x3ff5ab07, 271 0x054647ad, 0x3c96324c, 0xfba87a03, 0x3ff5ba11, 0x4c233e1a, 272 0xbc9b77a1, 0x8a5946b7, 0x3ff5c926, 0x816986a2, 0x3c3c4b1b, 273 0x90998b93, 0x3ff5d845, 0xa8b45643, 0xbc9cd6a7, 0x15ad2148, 274 0x3ff5e76f, 0x3080e65e, 0x3c9ba6f9, 0x20dceb71, 0x3ff5f6a3, 275 0xe3cdcf92, 0xbc89eadd, 0xb976dc09, 0x3ff605e1, 0x9b56de47, 276 0xbc93e242, 0xe6cdf6f4, 0x3ff6152a, 0x4ab84c27, 0x3c9e4b3e, 277 0xb03a5585, 0x3ff6247e, 0x7e40b497, 0xbc9383c1, 0x1d1929fd, 278 0x3ff633dd, 0xbeb964e5, 0x3c984710, 0x34ccc320, 0x3ff64346, 279 0x759d8933, 0xbc8c483c, 0xfebc8fb7, 0x3ff652b9, 0xc9a73e09, 280 0xbc9ae3d5, 0x82552225, 0x3ff66238, 0x87591c34, 0xbc9bb609, 281 0xc70833f6, 0x3ff671c1, 0x586c6134, 0xbc8e8732, 0xd44ca973, 282 0x3ff68155, 0x44f73e65, 0x3c6038ae, 0xb19e9538, 0x3ff690f4, 283 0x9aeb445d, 0x3c8804bd, 0x667f3bcd, 0x3ff6a09e, 0x13b26456, 284 0xbc9bdd34, 0xfa75173e, 0x3ff6b052, 0x2c9a9d0e, 0x3c7a38f5, 285 0x750bdabf, 0x3ff6c012, 0x67ff0b0d, 0xbc728956, 0xddd47645, 286 0x3ff6cfdc, 0xb6f17309, 0x3c9c7aa9, 0x3c651a2f, 0x3ff6dfb2, 287 0x683c88ab, 0xbc6bbe3a, 0x98593ae5, 0x3ff6ef92, 0x9e1ac8b2, 288 0xbc90b974, 0xf9519484, 0x3ff6ff7d, 0x25860ef6, 0xbc883c0f, 289 0x66f42e87, 0x3ff70f74, 0xd45aa65f, 0x3c59d644, 0xe8ec5f74, 290 0x3ff71f75, 0x86887a99, 0xbc816e47, 0x86ead08a, 0x3ff72f82, 291 0x2cd62c72, 0xbc920aa0, 0x48a58174, 0x3ff73f9a, 0x6c65d53c, 292 0xbc90a8d9, 0x35d7cbfd, 0x3ff74fbd, 0x618a6e1c, 0x3c9047fd, 293 0x564267c9, 0x3ff75feb, 0x57316dd3, 0xbc902459, 0xb1ab6e09, 294 0x3ff77024, 0x169147f8, 0x3c9b7877, 0x4fde5d3f, 0x3ff78069, 295 0x0a02162d, 0x3c9866b8, 0x38ac1cf6, 0x3ff790b9, 0x62aadd3e, 296 0x3c9349a8, 0x73eb0187, 0x3ff7a114, 0xee04992f, 0xbc841577, 297 0x0976cfdb, 0x3ff7b17b, 0x8468dc88, 0xbc9bebb5, 0x0130c132, 298 0x3ff7c1ed, 0xd1164dd6, 0x3c9f124c, 0x62ff86f0, 0x3ff7d26a, 299 0xfb72b8b4, 0x3c91bddb, 0x36cf4e62, 0x3ff7e2f3, 0xba15797e, 300 0x3c705d02, 0x8491c491, 0x3ff7f387, 0xcf9311ae, 0xbc807f11, 301 0x543e1a12, 0x3ff80427, 0x626d972b, 0xbc927c86, 0xadd106d9, 302 0x3ff814d2, 0x0d151d4d, 0x3c946437, 0x994cce13, 0x3ff82589, 303 0xd41532d8, 0xbc9d4c1d, 0x1eb941f7, 0x3ff8364c, 0x31df2bd5, 304 0x3c999b9a, 0x4623c7ad, 0x3ff8471a, 0xa341cdfb, 0xbc88d684, 305 0x179f5b21, 0x3ff857f4, 0xf8b216d0, 0xbc5ba748, 0x9b4492ed, 306 0x3ff868d9, 0x9bd4f6ba, 0xbc9fc6f8, 0xd931a436, 0x3ff879ca, 307 0xd2db47bd, 0x3c85d2d7, 0xd98a6699, 0x3ff88ac7, 0xf37cb53a, 308 0x3c9994c2, 0xa478580f, 0x3ff89bd0, 0x4475202a, 0x3c9d5395, 309 0x422aa0db, 0x3ff8ace5, 0x56864b27, 0x3c96e9f1, 0xbad61778, 310 0x3ff8be05, 0xfc43446e, 0x3c9ecb5e, 0x16b5448c, 0x3ff8cf32, 311 0x32e9e3aa, 0xbc70d55e, 0x5e0866d9, 0x3ff8e06a, 0x6fc9b2e6, 312 0xbc97114a, 0x99157736, 0x3ff8f1ae, 0xa2e3976c, 0x3c85cc13, 313 0xd0282c8a, 0x3ff902fe, 0x85fe3fd2, 0x3c9592ca, 0x0b91ffc6, 314 0x3ff9145b, 0x2e582524, 0xbc9dd679, 0x53aa2fe2, 0x3ff925c3, 315 0xa639db7f, 0xbc83455f, 0xb0cdc5e5, 0x3ff93737, 0x81b57ebc, 316 0xbc675fc7, 0x2b5f98e5, 0x3ff948b8, 0x797d2d99, 0xbc8dc3d6, 317 0xcbc8520f, 0x3ff95a44, 0x96a5f039, 0xbc764b7c, 0x9a7670b3, 318 0x3ff96bdd, 0x7f19c896, 0xbc5ba596, 0x9fde4e50, 0x3ff97d82, 319 0x7c1b85d1, 0xbc9d185b, 0xe47a22a2, 0x3ff98f33, 0xa24c78ec, 320 0x3c7cabda, 0x70ca07ba, 0x3ff9a0f1, 0x91cee632, 0xbc9173bd, 321 0x4d53fe0d, 0x3ff9b2bb, 0x4df6d518, 0xbc9dd84e, 0x82a3f090, 322 0x3ff9c491, 0xb071f2be, 0x3c7c7c46, 0x194bb8d5, 0x3ff9d674, 323 0xa3dd8233, 0xbc9516be, 0x19e32323, 0x3ff9e863, 0x78e64c6e, 324 0x3c7824ca, 0x8d07f29e, 0x3ff9fa5e, 0xaaf1face, 0xbc84a9ce, 325 0x7b5de565, 0x3ffa0c66, 0x5d1cd533, 0xbc935949, 0xed8eb8bb, 326 0x3ffa1e7a, 0xee8be70e, 0x3c9c6618, 0xec4a2d33, 0x3ffa309b, 327 0x7ddc36ab, 0x3c96305c, 0x80460ad8, 0x3ffa42c9, 0x589fb120, 328 0xbc9aa780, 0xb23e255d, 0x3ffa5503, 0xdb8d41e1, 0xbc9d2f6e, 329 0x8af46052, 0x3ffa674a, 0x30670366, 0x3c650f56, 0x1330b358, 330 0x3ffa799e, 0xcac563c7, 0x3c9bcb7e, 0x53c12e59, 0x3ffa8bfe, 331 0xb2ba15a9, 0xbc94f867, 0x5579fdbf, 0x3ffa9e6b, 0x0ef7fd31, 332 0x3c90fac9, 0x21356eba, 0x3ffab0e5, 0xdae94545, 0x3c889c31, 333 0xbfd3f37a, 0x3ffac36b, 0xcae76cd0, 0xbc8f9234, 0x3a3c2774, 334 0x3ffad5ff, 0xb6b1b8e5, 0x3c97ef3b, 0x995ad3ad, 0x3ffae89f, 335 0x345dcc81, 0x3c97a1cd, 0xe622f2ff, 0x3ffafb4c, 0x0f315ecd, 336 0xbc94b2fc, 0x298db666, 0x3ffb0e07, 0x4c80e425, 0xbc9bdef5, 337 0x6c9a8952, 0x3ffb20ce, 0x4a0756cc, 0x3c94dd02, 0xb84f15fb, 338 0x3ffb33a2, 0x3084d708, 0xbc62805e, 0x15b749b1, 0x3ffb4684, 339 0xe9df7c90, 0xbc7f763d, 0x8de5593a, 0x3ffb5972, 0xbbba6de3, 340 0xbc9c71df, 0x29f1c52a, 0x3ffb6c6e, 0x52883f6e, 0x3c92a8f3, 341 0xf2fb5e47, 0x3ffb7f76, 0x7e54ac3b, 0xbc75584f, 0xf22749e4, 342 0x3ffb928c, 0x54cb65c6, 0xbc9b7216, 0x30a1064a, 0x3ffba5b0, 343 0x0e54292e, 0xbc9efcd3, 0xb79a6f1f, 0x3ffbb8e0, 0xc9696205, 344 0xbc3f52d1, 0x904bc1d2, 0x3ffbcc1e, 0x7a2d9e84, 0x3c823dd0, 345 0xc3f3a207, 0x3ffbdf69, 0x60ea5b53, 0xbc3c2623, 0x5bd71e09, 346 0x3ffbf2c2, 0x3f6b9c73, 0xbc9efdca, 0x6141b33d, 0x3ffc0628, 347 0xa1fbca34, 0xbc8d8a5a, 0xdd85529c, 0x3ffc199b, 0x895048dd, 348 0x3c811065, 0xd9fa652c, 0x3ffc2d1c, 0x17c8a5d7, 0xbc96e516, 349 0x5fffd07a, 0x3ffc40ab, 0xe083c60a, 0x3c9b4537, 0x78fafb22, 350 0x3ffc5447, 0x2493b5af, 0x3c912f07, 0x2e57d14b, 0x3ffc67f1, 351 0xff483cad, 0x3c92884d, 0x8988c933, 0x3ffc7ba8, 0xbe255559, 352 0xbc8e76bb, 0x9406e7b5, 0x3ffc8f6d, 0x48805c44, 0x3c71acbc, 353 0x5751c4db, 0x3ffca340, 0xd10d08f5, 0xbc87f2be, 0xdcef9069, 354 0x3ffcb720, 0xd1e949db, 0x3c7503cb, 0x2e6d1675, 0x3ffccb0f, 355 0x86009092, 0xbc7d220f, 0x555dc3fa, 0x3ffcdf0b, 0x53829d72, 356 0xbc8dd83b, 0x5b5bab74, 0x3ffcf315, 0xb86dff57, 0xbc9a08e9, 357 0x4a07897c, 0x3ffd072d, 0x43797a9c, 0xbc9cbc37, 0x2b08c968, 358 0x3ffd1b53, 0x219a36ee, 0x3c955636, 0x080d89f2, 0x3ffd2f87, 359 0x719d8578, 0xbc9d487b, 0xeacaa1d6, 0x3ffd43c8, 0xbf5a1614, 360 0x3c93db53, 0xdcfba487, 0x3ffd5818, 0xd75b3707, 0x3c82ed02, 361 0xe862e6d3, 0x3ffd6c76, 0x4a8165a0, 0x3c5fe87a, 0x16c98398, 362 0x3ffd80e3, 0x8beddfe8, 0xbc911ec1, 0x71ff6075, 0x3ffd955d, 363 0xbb9af6be, 0x3c9a052d, 0x03db3285, 0x3ffda9e6, 0x696db532, 364 0x3c9c2300, 0xd63a8315, 0x3ffdbe7c, 0x926b8be4, 0xbc9b76f1, 365 0xf301b460, 0x3ffdd321, 0x78f018c3, 0x3c92da57, 0x641c0658, 366 0x3ffde7d5, 0x8e79ba8f, 0xbc9ca552, 0x337b9b5f, 0x3ffdfc97, 367 0x4f184b5c, 0xbc91a5cd, 0x6b197d17, 0x3ffe1167, 0xbd5c7f44, 368 0xbc72b529, 0x14f5a129, 0x3ffe2646, 0x817a1496, 0xbc97b627, 369 0x3b16ee12, 0x3ffe3b33, 0x31fdc68b, 0xbc99f4a4, 0xe78b3ff6, 370 0x3ffe502e, 0x80a9cc8f, 0x3c839e89, 0x24676d76, 0x3ffe6539, 371 0x7522b735, 0xbc863ff8, 0xfbc74c83, 0x3ffe7a51, 0xca0c8de2, 372 0x3c92d522, 0x77cdb740, 0x3ffe8f79, 0x80b054b1, 0xbc910894, 373 0xa2a490da, 0x3ffea4af, 0x179c2893, 0xbc9e9c23, 0x867cca6e, 374 0x3ffeb9f4, 0x2293e4f2, 0x3c94832f, 0x2d8e67f1, 0x3ffecf48, 375 0xb411ad8c, 0xbc9c93f3, 0xa2188510, 0x3ffee4aa, 0xa487568d, 376 0x3c91c68d, 0xee615a27, 0x3ffefa1b, 0x86a4b6b0, 0x3c9dc7f4, 377 0x1cb6412a, 0x3fff0f9c, 0x65181d45, 0xbc932200, 0x376bba97, 378 0x3fff252b, 0xbf0d8e43, 0x3c93a1a5, 0x48dd7274, 0x3fff3ac9, 379 0x3ed837de, 0xbc795a5a, 0x5b6e4540, 0x3fff5076, 0x2dd8a18b, 380 0x3c99d3e1, 0x798844f8, 0x3fff6632, 0x3539343e, 0x3c9fa37b, 381 0xad9cbe14, 0x3fff7bfd, 0xd006350a, 0xbc9dbb12, 0x02243c89, 382 0x3fff91d8, 0xa779f689, 0xbc612ea8, 0x819e90d8, 0x3fffa7c1, 383 0xf3a5931e, 0x3c874853, 0x3692d514, 0x3fffbdba, 0x15098eb6, 384 0xbc796773, 0x2b8f71f1, 0x3fffd3c2, 0x966579e7, 0x3c62eb74, 385 0x6b2a23d9, 0x3fffe9d9, 0x7442fde3, 0x3c74a603 386 }; 387 388 private static int[] eCoeff = { 389 0xe78a6731, 0x3f55d87f, 0xd704a0c0, 0x3fac6b08, 0x6fba4e77, 390 0x3f83b2ab, 0xff82c58f, 0x3fcebfbd, 0xfefa39ef, 0x3fe62e42, 391 0x00000000, 0x00000000 392 }; 393 394 private static int[] coeffH = { 395 0x00000000, 0xbfd61a00, 0x00000000, 0xbf5dabe1 396 }; 397 398 private static int[] highmaskLogX = { 399 0xf8000000, 0xffffffff, 0x00000000, 0xfffff800 400 }; 401 402 private static int[] halfmask = { 403 0xf8000000, 0xffffffff, 0xf8000000, 0xffffffff 404 }; 405 406 private static int[] coeffPow = { 407 0x6dc96112, 0xbf836578, 0xee241472, 0xbf9b0301, 0x9f95985a, 408 0xbfb528db, 0xb3841d2a, 0xbfd619b6, 0x518775e3, 0x3f9004f2, 409 0xac8349bb, 0x3fa76c9b, 0x486ececc, 0x3fc4635e, 0x161bb241, 410 0xbf5dabe1, 0x9f95985a, 0xbfb528db, 0xf8b5787d, 0x3ef2531e, 411 0x486ececb, 0x3fc4635e, 0x412055cc, 0xbdd61bb2 412 }; 413 414 private static int[] lTblPow = { 415 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x20000000, 416 0x3feff00a, 0x96621f95, 0x3e5b1856, 0xe0000000, 0x3fefe019, 417 0xe5916f9e, 0xbe325278, 0x00000000, 0x3fefd02f, 0x859a1062, 418 0x3e595fb7, 0xc0000000, 0x3fefc049, 0xb245f18f, 0xbe529c38, 419 0xe0000000, 0x3fefb069, 0xad2880a7, 0xbe501230, 0x60000000, 420 0x3fefa08f, 0xc8e72420, 0x3e597bd1, 0x80000000, 0x3fef90ba, 421 0xc30c4500, 0xbe5d6c75, 0xe0000000, 0x3fef80ea, 0x02c63f43, 422 0x3e2e1318, 0xc0000000, 0x3fef7120, 0xb3d4cccc, 0xbe44c52a, 423 0x00000000, 0x3fef615c, 0xdbd91397, 0xbe4e7d6c, 0xa0000000, 424 0x3fef519c, 0x65c5cd68, 0xbe522dc8, 0xa0000000, 0x3fef41e2, 425 0x46d1306c, 0xbe5a840e, 0xe0000000, 0x3fef322d, 0xd2980e94, 426 0x3e5071af, 0xa0000000, 0x3fef227e, 0x773abade, 0xbe5891e5, 427 0xa0000000, 0x3fef12d4, 0xdc6bf46b, 0xbe5cccbe, 0xe0000000, 428 0x3fef032f, 0xbc7247fa, 0xbe2bab83, 0x80000000, 0x3feef390, 429 0xbcaa1e46, 0xbe53bb3b, 0x60000000, 0x3feee3f6, 0x5f6c682d, 430 0xbe54c619, 0x80000000, 0x3feed461, 0x5141e368, 0xbe4b6d86, 431 0xe0000000, 0x3feec4d1, 0xec678f76, 0xbe369af6, 0x80000000, 432 0x3feeb547, 0x41301f55, 0xbe2d4312, 0x60000000, 0x3feea5c2, 433 0x676da6bd, 0xbe4d8dd0, 0x60000000, 0x3fee9642, 0x57a891c4, 434 0x3e51f991, 0xa0000000, 0x3fee86c7, 0xe4eb491e, 0x3e579bf9, 435 0x20000000, 0x3fee7752, 0xfddc4a2c, 0xbe3356e6, 0xc0000000, 436 0x3fee67e1, 0xd75b5bf1, 0xbe449531, 0x80000000, 0x3fee5876, 437 0xbd423b8e, 0x3df54fe4, 0x60000000, 0x3fee4910, 0x330e51b9, 438 0x3e54289c, 0x80000000, 0x3fee39af, 0x8651a95f, 0xbe55aad6, 439 0xa0000000, 0x3fee2a53, 0x5e98c708, 0xbe2fc4a9, 0xe0000000, 440 0x3fee1afc, 0x0989328d, 0x3e23958c, 0x40000000, 0x3fee0bab, 441 0xee642abd, 0xbe425dd8, 0xa0000000, 0x3fedfc5e, 0xc394d236, 442 0x3e526362, 0x20000000, 0x3feded17, 0xe104aa8e, 0x3e4ce247, 443 0xc0000000, 0x3fedddd4, 0x265a9be4, 0xbe5bb77a, 0x40000000, 444 0x3fedce97, 0x0ecac52f, 0x3e4a7cb1, 0xe0000000, 0x3fedbf5e, 445 0x124cb3b8, 0x3e257024, 0x80000000, 0x3fedb02b, 0xe6d4febe, 446 0xbe2033ee, 0x20000000, 0x3feda0fd, 0x39cca00e, 0xbe3ddabc, 447 0xc0000000, 0x3fed91d3, 0xef8a552a, 0xbe543390, 0x40000000, 448 0x3fed82af, 0xb8e85204, 0x3e513850, 0xe0000000, 0x3fed738f, 449 0x3d59fe08, 0xbe5db728, 0x40000000, 0x3fed6475, 0x3aa7ead1, 450 0x3e58804b, 0xc0000000, 0x3fed555f, 0xf8a35ba9, 0xbe5298b0, 451 0x00000000, 0x3fed464f, 0x9a88dd15, 0x3e5a8cdb, 0x40000000, 452 0x3fed3743, 0xb0b0a190, 0x3e598635, 0x80000000, 0x3fed283c, 453 0xe2113295, 0xbe5c1119, 0x80000000, 0x3fed193a, 0xafbf1728, 454 0xbe492e9c, 0x60000000, 0x3fed0a3d, 0xe4a4ccf3, 0x3e19b90e, 455 0x20000000, 0x3fecfb45, 0xba3cbeb8, 0x3e406b50, 0xc0000000, 456 0x3fecec51, 0x110f7ddd, 0x3e0d6806, 0x40000000, 0x3fecdd63, 457 0x7dd7d508, 0xbe5a8943, 0x80000000, 0x3fecce79, 0x9b60f271, 458 0xbe50676a, 0x80000000, 0x3fecbf94, 0x0b9ad660, 0x3e59174f, 459 0x60000000, 0x3fecb0b4, 0x00823d9c, 0x3e5bbf72, 0x20000000, 460 0x3feca1d9, 0x38a6ec89, 0xbe4d38f9, 0x80000000, 0x3fec9302, 461 0x3a0b7d8e, 0x3e53dbfd, 0xc0000000, 0x3fec8430, 0xc6826b34, 462 0xbe27c5c9, 0xc0000000, 0x3fec7563, 0x0c706381, 0xbe593653, 463 0x60000000, 0x3fec669b, 0x7df34ec7, 0x3e461ab5, 0xe0000000, 464 0x3fec57d7, 0x40e5e7e8, 0xbe5c3dae, 0x00000000, 0x3fec4919, 465 0x5602770f, 0xbe55219d, 0xc0000000, 0x3fec3a5e, 0xec7911eb, 466 0x3e5a5d25, 0x60000000, 0x3fec2ba9, 0xb39ea225, 0xbe53c00b, 467 0x80000000, 0x3fec1cf8, 0x967a212e, 0x3e5a8ddf, 0x60000000, 468 0x3fec0e4c, 0x580798bd, 0x3e5f53ab, 0x00000000, 0x3febffa5, 469 0xb8282df6, 0xbe46b874, 0x20000000, 0x3febf102, 0xe33a6729, 470 0x3e54963f, 0x00000000, 0x3febe264, 0x3b53e88a, 0xbe3adce1, 471 0x60000000, 0x3febd3ca, 0xc2585084, 0x3e5cde9f, 0x80000000, 472 0x3febc535, 0xa335c5ee, 0xbe39fd9c, 0x20000000, 0x3febb6a5, 473 0x7325b04d, 0x3e42ba15, 0x60000000, 0x3feba819, 0x1564540f, 474 0x3e3a9f35, 0x40000000, 0x3feb9992, 0x83fff592, 0xbe5465ce, 475 0xa0000000, 0x3feb8b0f, 0xb9da63d3, 0xbe4b1a0a, 0x80000000, 476 0x3feb7c91, 0x6d6f1ea4, 0x3e557657, 0x00000000, 0x3feb6e18, 477 0x5e80a1bf, 0x3e4ddbb6, 0x00000000, 0x3feb5fa3, 0x1c9eacb5, 478 0x3e592877, 0xa0000000, 0x3feb5132, 0x6d40beb3, 0xbe51858c, 479 0xa0000000, 0x3feb42c6, 0xd740c67b, 0x3e427ad2, 0x40000000, 480 0x3feb345f, 0xa3e0ccee, 0xbe5c2fc4, 0x40000000, 0x3feb25fc, 481 0x8e752b50, 0xbe3da3c2, 0xc0000000, 0x3feb179d, 0xa892e7de, 482 0x3e1fb481, 0xc0000000, 0x3feb0943, 0x21ed71e9, 0xbe365206, 483 0x20000000, 0x3feafaee, 0x0e1380a3, 0x3e5c5b7b, 0x20000000, 484 0x3feaec9d, 0x3c3d640e, 0xbe5dbbd0, 0x60000000, 0x3feade50, 485 0x8f97a715, 0x3e3a8ec5, 0x20000000, 0x3fead008, 0x23ab2839, 486 0x3e2fe98a, 0x40000000, 0x3feac1c4, 0xf4bbd50f, 0x3e54d8f6, 487 0xe0000000, 0x3feab384, 0x14757c4d, 0xbe48774c, 0xc0000000, 488 0x3feaa549, 0x7c7b0eea, 0x3e5b51bb, 0x20000000, 0x3fea9713, 489 0xf56f7013, 0x3e386200, 0xe0000000, 0x3fea88e0, 0xbe428ebe, 490 0xbe514af5, 0xe0000000, 0x3fea7ab2, 0x8d0e4496, 0x3e4f9165, 491 0x60000000, 0x3fea6c89, 0xdbacc5d5, 0xbe5c063b, 0x20000000, 492 0x3fea5e64, 0x3f19d970, 0xbe5a0c8c, 0x20000000, 0x3fea5043, 493 0x09ea3e6b, 0x3e5065dc, 0x80000000, 0x3fea4226, 0x78df246c, 494 0x3e5e05f6, 0x40000000, 0x3fea340e, 0x4057d4a0, 0x3e431b2b, 495 0x40000000, 0x3fea25fa, 0x82867bb5, 0x3e4b76be, 0xa0000000, 496 0x3fea17ea, 0x9436f40a, 0xbe5aad39, 0x20000000, 0x3fea09df, 497 0x4b5253b3, 0x3e46380b, 0x00000000, 0x3fe9fbd8, 0x8fc52466, 498 0xbe386f9b, 0x20000000, 0x3fe9edd5, 0x22d3f344, 0xbe538347, 499 0x60000000, 0x3fe9dfd6, 0x1ac33522, 0x3e5dbc53, 0x00000000, 500 0x3fe9d1dc, 0xeabdff1d, 0x3e40fc0c, 0xe0000000, 0x3fe9c3e5, 501 0xafd30e73, 0xbe585e63, 0xe0000000, 0x3fe9b5f3, 0xa52f226a, 502 0xbe43e8f9, 0x20000000, 0x3fe9a806, 0xecb8698d, 0xbe515b36, 503 0x80000000, 0x3fe99a1c, 0xf2b4e89d, 0x3e48b62b, 0x20000000, 504 0x3fe98c37, 0x7c9a88fb, 0x3e44414c, 0x00000000, 0x3fe97e56, 505 0xda015741, 0xbe5d13ba, 0xe0000000, 0x3fe97078, 0x5fdace06, 506 0x3e51b947, 0x00000000, 0x3fe962a0, 0x956ca094, 0x3e518785, 507 0x40000000, 0x3fe954cb, 0x01164c1d, 0x3e5d5b57, 0xc0000000, 508 0x3fe946fa, 0xe63b3767, 0xbe4f84e7, 0x40000000, 0x3fe9392e, 509 0xe57cc2a9, 0x3e34eda3, 0xe0000000, 0x3fe92b65, 0x8c75b544, 510 0x3e5766a0, 0xc0000000, 0x3fe91da1, 0x37d1d087, 0xbe5e2ab1, 511 0x80000000, 0x3fe90fe1, 0xa953dc20, 0x3e5fa1f3, 0x80000000, 512 0x3fe90225, 0xdbd3f369, 0x3e47d6db, 0xa0000000, 0x3fe8f46d, 513 0x1c9be989, 0xbe5e2b0a, 0xa0000000, 0x3fe8e6b9, 0x3c93d76a, 514 0x3e5c8618, 0xe0000000, 0x3fe8d909, 0x2182fc9a, 0xbe41aa9e, 515 0x20000000, 0x3fe8cb5e, 0xe6b3539d, 0xbe530d19, 0x60000000, 516 0x3fe8bdb6, 0x49e58cc3, 0xbe3bb374, 0xa0000000, 0x3fe8b012, 517 0xa7cfeb8f, 0x3e56c412, 0x00000000, 0x3fe8a273, 0x8d52bc19, 518 0x3e1429b8, 0x60000000, 0x3fe894d7, 0x4dc32c6c, 0xbe48604c, 519 0xc0000000, 0x3fe8873f, 0x0c868e56, 0xbe564ee5, 0x00000000, 520 0x3fe879ac, 0x56aee828, 0x3e5e2fd8, 0x60000000, 0x3fe86c1c, 521 0x7ceab8ec, 0x3e493365, 0xc0000000, 0x3fe85e90, 0x78d4dadc, 522 0xbe4f7f25, 0x00000000, 0x3fe85109, 0x0ccd8280, 0x3e31e7a2, 523 0x40000000, 0x3fe84385, 0x34ba4e15, 0x3e328077, 0x80000000, 524 0x3fe83605, 0xa670975a, 0xbe53eee5, 0xa0000000, 0x3fe82889, 525 0xf61b77b2, 0xbe43a20a, 0xa0000000, 0x3fe81b11, 0x13e6643b, 526 0x3e5e5fe5, 0xc0000000, 0x3fe80d9d, 0x82cc94e8, 0xbe5ff1f9, 527 0xa0000000, 0x3fe8002d, 0x8a0c9c5d, 0xbe42b0e7, 0x60000000, 528 0x3fe7f2c1, 0x22a16f01, 0x3e5d9ea0, 0x20000000, 0x3fe7e559, 529 0xc38cd451, 0x3e506963, 0xc0000000, 0x3fe7d7f4, 0x9902bc71, 530 0x3e4503d7, 0x40000000, 0x3fe7ca94, 0xdef2a3c0, 0x3e3d98ed, 531 0xa0000000, 0x3fe7bd37, 0xed49abb0, 0x3e24c1ff, 0xe0000000, 532 0x3fe7afde, 0xe3b0be70, 0xbe40c467, 0x00000000, 0x3fe7a28a, 533 0xaf9f193c, 0xbe5dff6c, 0xe0000000, 0x3fe79538, 0xb74cf6b6, 534 0xbe258ed0, 0xa0000000, 0x3fe787eb, 0x1d9127c7, 0x3e345fb0, 535 0x40000000, 0x3fe77aa2, 0x1028c21d, 0xbe4619bd, 0xa0000000, 536 0x3fe76d5c, 0x7cb0b5e4, 0x3e40f1a2, 0xe0000000, 0x3fe7601a, 537 0x2b1bc4ad, 0xbe32e8bb, 0xe0000000, 0x3fe752dc, 0x6839f64e, 538 0x3e41f57b, 0xc0000000, 0x3fe745a2, 0xc4121f7e, 0xbe52c40a, 539 0x60000000, 0x3fe7386c, 0xd6852d72, 0xbe5c4e6b, 0xc0000000, 540 0x3fe72b39, 0x91d690f7, 0xbe57f88f, 0xe0000000, 0x3fe71e0a, 541 0x627a2159, 0xbe4425d5, 0xc0000000, 0x3fe710df, 0x50a54033, 542 0x3e422b7e, 0x60000000, 0x3fe703b8, 0x3b0b5f91, 0x3e5d3857, 543 0xe0000000, 0x3fe6f694, 0x84d628a2, 0xbe51f090, 0x00000000, 544 0x3fe6e975, 0x306d8894, 0xbe414d83, 0xe0000000, 0x3fe6dc58, 545 0x30bf24aa, 0xbe4650ca, 0x80000000, 0x3fe6cf40, 0xd4628d69, 546 0xbe5db007, 0xc0000000, 0x3fe6c22b, 0xa2aae57b, 0xbe31d279, 547 0xc0000000, 0x3fe6b51a, 0x860edf7e, 0xbe2d4c4a, 0x80000000, 548 0x3fe6a80d, 0xf3559341, 0xbe5f7e98, 0xe0000000, 0x3fe69b03, 549 0xa885899e, 0xbe5c2011, 0xe0000000, 0x3fe68dfd, 0x2bdc6d37, 550 0x3e224a82, 0xa0000000, 0x3fe680fb, 0xc12ad1b9, 0xbe40cf56, 551 0x00000000, 0x3fe673fd, 0x1bcdf659, 0xbdf52f2d, 0x00000000, 552 0x3fe66702, 0x5df10408, 0x3e5663e0, 0xc0000000, 0x3fe65a0a, 553 0xa4070568, 0xbe40b12f, 0x00000000, 0x3fe64d17, 0x71c54c47, 554 0x3e5f5e8b, 0x00000000, 0x3fe64027, 0xbd4b7e83, 0x3e42ead6, 555 0xa0000000, 0x3fe6333a, 0x61598bd2, 0xbe4c48d4, 0xc0000000, 556 0x3fe62651, 0x6f538d61, 0x3e548401, 0xa0000000, 0x3fe6196c, 557 0x14344120, 0xbe529af6, 0x00000000, 0x3fe60c8b, 0x5982c587, 558 0xbe3e1e4f, 0x00000000, 0x3fe5ffad, 0xfe51d4ea, 0xbe4c897a, 559 0x80000000, 0x3fe5f2d2, 0xfd46ebe1, 0x3e552e00, 0xa0000000, 560 0x3fe5e5fb, 0xa4695699, 0x3e5ed471, 0x60000000, 0x3fe5d928, 561 0x80d118ae, 0x3e456b61, 0xa0000000, 0x3fe5cc58, 0x304c330b, 562 0x3e54dc29, 0x80000000, 0x3fe5bf8c, 0x0af2dedf, 0xbe3aa9bd, 563 0xe0000000, 0x3fe5b2c3, 0x15fc9258, 0xbe479a37, 0xc0000000, 564 0x3fe5a5fe, 0x9292c7ea, 0x3e188650, 0x20000000, 0x3fe5993d, 565 0x33b4d380, 0x3e5d6d93, 0x20000000, 0x3fe58c7f, 0x02fd16c7, 566 0x3e2fe961, 0xa0000000, 0x3fe57fc4, 0x4a05edb6, 0xbe4d55b4, 567 0xa0000000, 0x3fe5730d, 0x3d443abb, 0xbe5e6954, 0x00000000, 568 0x3fe5665a, 0x024acfea, 0x3e50e61b, 0x00000000, 0x3fe559aa, 569 0xcc9edd09, 0xbe325403, 0x60000000, 0x3fe54cfd, 0x1fe26950, 570 0x3e5d500e, 0x60000000, 0x3fe54054, 0x6c5ae164, 0xbe4a79b4, 571 0xc0000000, 0x3fe533ae, 0x154b0287, 0xbe401571, 0xa0000000, 572 0x3fe5270c, 0x0673f401, 0xbe56e56b, 0xe0000000, 0x3fe51a6d, 573 0x751b639c, 0x3e235269, 0xa0000000, 0x3fe50dd2, 0x7c7b2bed, 574 0x3ddec887, 0xc0000000, 0x3fe5013a, 0xafab4e17, 0x3e5e7575, 575 0x60000000, 0x3fe4f4a6, 0x2e308668, 0x3e59aed6, 0x80000000, 576 0x3fe4e815, 0xf33e2a76, 0xbe51f184, 0xe0000000, 0x3fe4db87, 577 0x839f3e3e, 0x3e57db01, 0xc0000000, 0x3fe4cefd, 0xa9eda7bb, 578 0x3e535e0f, 0x00000000, 0x3fe4c277, 0x2a8f66a5, 0x3e5ce451, 579 0xc0000000, 0x3fe4b5f3, 0x05192456, 0xbe4e8518, 0xc0000000, 580 0x3fe4a973, 0x4aa7cd1d, 0x3e46784a, 0x40000000, 0x3fe49cf7, 581 0x8e23025e, 0xbe5749f2, 0x00000000, 0x3fe4907e, 0x18d30215, 582 0x3e360f39, 0x20000000, 0x3fe48408, 0x63dcf2f3, 0x3e5e00fe, 583 0xc0000000, 0x3fe47795, 0x46182d09, 0xbe5173d9, 0xa0000000, 584 0x3fe46b26, 0x8f0e62aa, 0xbe48f281, 0xe0000000, 0x3fe45eba, 585 0x5775c40c, 0xbe56aad4, 0x60000000, 0x3fe45252, 0x0fe25f69, 586 0x3e48bd71, 0x40000000, 0x3fe445ed, 0xe9989ec5, 0x3e590d97, 587 0x80000000, 0x3fe4398b, 0xb3d9ffe3, 0x3e479dbc, 0x20000000, 588 0x3fe42d2d, 0x388e4d2e, 0xbe5eed80, 0xe0000000, 0x3fe420d1, 589 0x6f797c18, 0x3e554b4c, 0x20000000, 0x3fe4147a, 0x31048bb4, 590 0xbe5b1112, 0x80000000, 0x3fe40825, 0x2efba4f9, 0x3e48ebc7, 591 0x40000000, 0x3fe3fbd4, 0x50201119, 0x3e40b701, 0x40000000, 592 0x3fe3ef86, 0x0a4db32c, 0x3e551de8, 0xa0000000, 0x3fe3e33b, 593 0x0c9c148b, 0xbe50c1f6, 0x20000000, 0x3fe3d6f4, 0xc9129447, 594 0x3e533fa0, 0x00000000, 0x3fe3cab0, 0xaae5b5a0, 0xbe22b68e, 595 0x20000000, 0x3fe3be6f, 0x02305e8a, 0xbe54fc08, 0x60000000, 596 0x3fe3b231, 0x7f908258, 0x3e57dc05, 0x00000000, 0x3fe3a5f7, 597 0x1a09af78, 0x3e08038b, 0xe0000000, 0x3fe399bf, 0x490643c1, 598 0xbe5dbe42, 0xe0000000, 0x3fe38d8b, 0x5e8ad724, 0xbe3c2b72, 599 0x20000000, 0x3fe3815b, 0xc67196b6, 0x3e1713cf, 0xa0000000, 600 0x3fe3752d, 0x6182e429, 0xbe3ec14c, 0x40000000, 0x3fe36903, 601 0xab6eb1ae, 0x3e5a2cc5, 0x40000000, 0x3fe35cdc, 0xfe5dc064, 602 0xbe5c5878, 0x40000000, 0x3fe350b8, 0x0ba6b9e4, 0x3e51619b, 603 0x80000000, 0x3fe34497, 0x857761aa, 0x3e5fff53, 0x00000000, 604 0x3fe3387a, 0xf872d68c, 0x3e484f4d, 0xa0000000, 0x3fe32c5f, 605 0x087e97c2, 0x3e52842e, 0x80000000, 0x3fe32048, 0x73d6d0c0, 606 0xbe503edf, 0x80000000, 0x3fe31434, 0x0c1456a1, 0xbe5f72ad, 607 0xa0000000, 0x3fe30823, 0x83a1a4d5, 0xbe5e65cc, 0xe0000000, 608 0x3fe2fc15, 0x855a7390, 0xbe506438, 0x40000000, 0x3fe2f00b, 609 0xa2898287, 0x3e3d22a2, 0xe0000000, 0x3fe2e403, 0x8b56f66f, 610 0xbe5aa5fd, 0x80000000, 0x3fe2d7ff, 0x52db119a, 0x3e3a2e3d, 611 0x60000000, 0x3fe2cbfe, 0xe2ddd4c0, 0xbe586469, 0x40000000, 612 0x3fe2c000, 0x6b01bf10, 0x3e352b9d, 0x40000000, 0x3fe2b405, 613 0xb07a1cdf, 0x3e5c5cda, 0x80000000, 0x3fe2a80d, 0xc7b5f868, 614 0xbe5668b3, 0xc0000000, 0x3fe29c18, 0x185edf62, 0xbe563d66, 615 0x00000000, 0x3fe29027, 0xf729e1cc, 0x3e59a9a0, 0x80000000, 616 0x3fe28438, 0x6433c727, 0xbe43cc89, 0x00000000, 0x3fe2784d, 617 0x41782631, 0xbe30750c, 0xa0000000, 0x3fe26c64, 0x914911b7, 618 0xbe58290e, 0x40000000, 0x3fe2607f, 0x3dcc73e1, 0xbe4269cd, 619 0x00000000, 0x3fe2549d, 0x2751bf70, 0xbe5a6998, 0xc0000000, 620 0x3fe248bd, 0x4248b9fb, 0xbe4ddb00, 0x80000000, 0x3fe23ce1, 621 0xf35cf82f, 0x3e561b71, 0x60000000, 0x3fe23108, 0x8e481a2d, 622 0x3e518fb9, 0x60000000, 0x3fe22532, 0x5ab96edc, 0xbe5fafc5, 623 0x40000000, 0x3fe2195f, 0x80943911, 0xbe07f819, 0x40000000, 624 0x3fe20d8f, 0x386f2d6c, 0xbe54ba8b, 0x40000000, 0x3fe201c2, 625 0xf29664ac, 0xbe5eb815, 0x20000000, 0x3fe1f5f8, 0x64f03390, 626 0x3e5e320c, 0x20000000, 0x3fe1ea31, 0x747ff696, 0x3e5ef0a5, 627 0x40000000, 0x3fe1de6d, 0x3e9ceb51, 0xbe5f8d27, 0x20000000, 628 0x3fe1d2ac, 0x4ae0b55e, 0x3e5faa21, 0x20000000, 0x3fe1c6ee, 629 0x28569a5e, 0x3e598a4f, 0x20000000, 0x3fe1bb33, 0x54b33e07, 630 0x3e46130a, 0x20000000, 0x3fe1af7b, 0x024f1078, 0xbe4dbf93, 631 0x00000000, 0x3fe1a3c6, 0xb0783bfa, 0x3e419248, 0xe0000000, 632 0x3fe19813, 0x2f02b836, 0x3e4e02b7, 0xc0000000, 0x3fe18c64, 633 0x28dec9d4, 0x3e09064f, 0x80000000, 0x3fe180b8, 0x45cbf406, 634 0x3e5b1f46, 0x40000000, 0x3fe1750f, 0x03d9964c, 0x3e5b0a79, 635 0x00000000, 0x3fe16969, 0x8b5b882b, 0xbe238086, 0xa0000000, 636 0x3fe15dc5, 0x73bad6f8, 0xbdf1fca4, 0x20000000, 0x3fe15225, 637 0x5385769c, 0x3e5e8d76, 0xa0000000, 0x3fe14687, 0x1676dc6b, 638 0x3e571d08, 0x20000000, 0x3fe13aed, 0xa8c41c7f, 0xbe598a25, 639 0x60000000, 0x3fe12f55, 0xc4e1aaf0, 0x3e435277, 0xa0000000, 640 0x3fe123c0, 0x403638e1, 0xbe21aa7c, 0xc0000000, 0x3fe1182e, 641 0x557a092b, 0xbdd0116b, 0xc0000000, 0x3fe10c9f, 0x7d779f66, 642 0x3e4a61ba, 0xc0000000, 0x3fe10113, 0x2b09c645, 0xbe5d586e, 643 0x20000000, 0x3fe0ea04, 0xea2cad46, 0x3e5aa97c, 0x20000000, 644 0x3fe0d300, 0x23190e54, 0x3e50f1a7, 0xa0000000, 0x3fe0bc07, 645 0x1379a5a6, 0xbe51619d, 0x60000000, 0x3fe0a51a, 0x926a3d4a, 646 0x3e5cf019, 0xa0000000, 0x3fe08e38, 0xa8c24358, 0x3e35241e, 647 0x20000000, 0x3fe07762, 0x24317e7a, 0x3e512cfa, 0x00000000, 648 0x3fe06097, 0xfd9cf274, 0xbe55bef3, 0x00000000, 0x3fe049d7, 649 0x3689b49d, 0xbe36d26d, 0x40000000, 0x3fe03322, 0xf72ef6c4, 650 0xbe54cd08, 0xa0000000, 0x3fe01c78, 0x23702d2d, 0xbe5900bf, 651 0x00000000, 0x3fe005da, 0x3f59c14c, 0x3e57d80b, 0x40000000, 652 0x3fdfde8d, 0xad67766d, 0xbe57fad4, 0x40000000, 0x3fdfb17c, 653 0x644f4ae7, 0x3e1ee43b, 0x40000000, 0x3fdf8481, 0x903234d2, 654 0x3e501a86, 0x40000000, 0x3fdf579c, 0xafe9e509, 0xbe267c3e, 655 0x00000000, 0x3fdf2acd, 0xb7dfda0b, 0xbe48149b, 0x40000000, 656 0x3fdefe13, 0x3b94305e, 0x3e5f4ea7, 0x80000000, 0x3fded16f, 657 0x5d95da61, 0xbe55c198, 0x00000000, 0x3fdea4e1, 0x406960c9, 658 0xbdd99a19, 0x00000000, 0x3fde7868, 0xd22f3539, 0x3e470c78, 659 0x80000000, 0x3fde4c04, 0x83eec535, 0xbe3e1232, 0x40000000, 660 0x3fde1fb6, 0x3dfbffcb, 0xbe4b7d71, 0x40000000, 0x3fddf37d, 661 0x7e1be4e0, 0xbe5b8f8f, 0x40000000, 0x3fddc759, 0x46dae887, 662 0xbe350458, 0x80000000, 0x3fdd9b4a, 0xed6ecc49, 0xbe5f0045, 663 0x80000000, 0x3fdd6f50, 0x2e9e883c, 0x3e2915da, 0x80000000, 664 0x3fdd436b, 0xf0bccb32, 0x3e4a68c9, 0x80000000, 0x3fdd179b, 665 0x9bbfc779, 0xbe54a26a, 0x00000000, 0x3fdcebe0, 0x7cea33ab, 666 0x3e43c6b7, 0x40000000, 0x3fdcc039, 0xe740fd06, 0x3e5526c2, 667 0x40000000, 0x3fdc94a7, 0x9eadeb1a, 0xbe396d8d, 0xc0000000, 668 0x3fdc6929, 0xf0a8f95a, 0xbe5c0ab2, 0x80000000, 0x3fdc3dc0, 669 0x6ee2693b, 0x3e0992e6, 0xc0000000, 0x3fdc126b, 0x5ac6b581, 670 0xbe2834b6, 0x40000000, 0x3fdbe72b, 0x8cc226ff, 0x3e3596a6, 671 0x00000000, 0x3fdbbbff, 0xf92a74bb, 0x3e3c5813, 0x00000000, 672 0x3fdb90e7, 0x479664c0, 0xbe50d644, 0x00000000, 0x3fdb65e3, 673 0x5004975b, 0xbe55258f, 0x00000000, 0x3fdb3af3, 0xe4b23194, 674 0xbe588407, 0xc0000000, 0x3fdb1016, 0xe65d4d0a, 0x3e527c26, 675 0x80000000, 0x3fdae54e, 0x814fddd6, 0x3e5962a2, 0x40000000, 676 0x3fdaba9a, 0xe19d0913, 0xbe562f4e, 0x80000000, 0x3fda8ff9, 677 0x43cfd006, 0xbe4cfdeb, 0x40000000, 0x3fda656c, 0x686f0a4e, 678 0x3e5e47a8, 0xc0000000, 0x3fda3af2, 0x7200d410, 0x3e5e1199, 679 0xc0000000, 0x3fda108c, 0xabd2266e, 0x3e5ee4d1, 0x40000000, 680 0x3fd9e63a, 0x396f8f2c, 0x3e4dbffb, 0x00000000, 0x3fd9bbfb, 681 0xe32b25dd, 0x3e5c3a54, 0x40000000, 0x3fd991cf, 0x431e4035, 682 0xbe457925, 0x80000000, 0x3fd967b6, 0x7bed3dd3, 0x3e40c61d, 683 0x00000000, 0x3fd93db1, 0xd7449365, 0x3e306419, 0x80000000, 684 0x3fd913be, 0x1746e791, 0x3e56fcfc, 0x40000000, 0x3fd8e9df, 685 0xf3a9028b, 0xbe5041b9, 0xc0000000, 0x3fd8c012, 0x56840c50, 686 0xbe26e20a, 0x40000000, 0x3fd89659, 0x19763102, 0xbe51f466, 687 0x80000000, 0x3fd86cb2, 0x7032de7c, 0xbe4d298a, 0x80000000, 688 0x3fd8431e, 0xdeb39fab, 0xbe4361eb, 0x40000000, 0x3fd8199d, 689 0x5d01cbe0, 0xbe5425b3, 0x80000000, 0x3fd7f02e, 0x3ce99aa9, 690 0x3e146fa8, 0x80000000, 0x3fd7c6d2, 0xd1a262b9, 0xbe5a1a69, 691 0xc0000000, 0x3fd79d88, 0x8606c236, 0x3e423a08, 0x80000000, 692 0x3fd77451, 0x8fd1e1b7, 0x3e5a6a63, 0xc0000000, 0x3fd74b2c, 693 0xe491456a, 0x3e42c1ca, 0x40000000, 0x3fd7221a, 0x4499a6d7, 694 0x3e36a69a, 0x00000000, 0x3fd6f91a, 0x5237df94, 0xbe0f8f02, 695 0x00000000, 0x3fd6d02c, 0xb6482c6e, 0xbe5abcf7, 0x00000000, 696 0x3fd6a750, 0x1919fd61, 0xbe57ade2, 0x00000000, 0x3fd67e86, 697 0xaa7a994d, 0xbe3f3fbd, 0x00000000, 0x3fd655ce, 0x67db014c, 698 0x3e33c550, 0x00000000, 0x3fd62d28, 0xa82856b7, 0xbe1409d1, 699 0xc0000000, 0x3fd60493, 0x1e6a300d, 0x3e55d899, 0x80000000, 700 0x3fd5dc11, 0x1222bd5c, 0xbe35bfc0, 0xc0000000, 0x3fd5b3a0, 701 0x6e8dc2d3, 0x3e5d4d79, 0x00000000, 0x3fd58b42, 0xe0e4ace6, 702 0xbe517303, 0x80000000, 0x3fd562f4, 0xb306e0a8, 0x3e5edf0f, 703 0xc0000000, 0x3fd53ab8, 0x6574bc54, 0x3e5ee859, 0x80000000, 704 0x3fd5128e, 0xea902207, 0x3e5f6188, 0xc0000000, 0x3fd4ea75, 705 0x9f911d79, 0x3e511735, 0x80000000, 0x3fd4c26e, 0xf9c77397, 706 0xbe5b1643, 0x40000000, 0x3fd49a78, 0x15fc9258, 0x3e479a37, 707 0x80000000, 0x3fd47293, 0xd5a04dd9, 0xbe426e56, 0xc0000000, 708 0x3fd44abf, 0xe04042f5, 0x3e56f7c6, 0x40000000, 0x3fd422fd, 709 0x1d8bf2c8, 0x3e5d8810, 0x00000000, 0x3fd3fb4c, 0x88a8ddee, 710 0xbe311454, 0xc0000000, 0x3fd3d3ab, 0x3e3b5e47, 0xbe5d1b72, 711 0x40000000, 0x3fd3ac1c, 0xc2ab5d59, 0x3e31b02b, 0xc0000000, 712 0x3fd3849d, 0xd4e34b9e, 0x3e51cb2f, 0x40000000, 0x3fd35d30, 713 0x177204fb, 0xbe2b8cd7, 0x80000000, 0x3fd335d3, 0xfcd38c82, 714 0xbe4356e1, 0x80000000, 0x3fd30e87, 0x64f54acc, 0xbe4e6224, 715 0x00000000, 0x3fd2e74c, 0xaa7975d9, 0x3e5dc0fe, 0x80000000, 716 0x3fd2c021, 0x516dab3f, 0xbe50ffa3, 0x40000000, 0x3fd29907, 717 0x2bfb7313, 0x3e5674a2, 0xc0000000, 0x3fd271fd, 0x0549fc99, 718 0x3e385d29, 0xc0000000, 0x3fd24b04, 0x55b63073, 0xbe500c6d, 719 0x00000000, 0x3fd2241c, 0x3f91953a, 0x3e389977, 0xc0000000, 720 0x3fd1fd43, 0xa1543f71, 0xbe3487ab, 0xc0000000, 0x3fd1d67b, 721 0x4ec8867c, 0x3df6a2dc, 0x00000000, 0x3fd1afc4, 0x4328e3bb, 722 0x3e41d9c0, 0x80000000, 0x3fd1891c, 0x2e1cda84, 0x3e3bdd87, 723 0x40000000, 0x3fd16285, 0x4b5331ae, 0xbe53128e, 0x00000000, 724 0x3fd13bfe, 0xb9aec164, 0xbe52ac98, 0xc0000000, 0x3fd11586, 725 0xd91e1316, 0xbe350630, 0x80000000, 0x3fd0ef1f, 0x7cacc12c, 726 0x3e3f5219, 0x40000000, 0x3fd0c8c8, 0xbce277b7, 0x3e3d30c0, 727 0x00000000, 0x3fd0a281, 0x2a63447d, 0xbe541377, 0x80000000, 728 0x3fd07c49, 0xfac483b5, 0xbe5772ec, 0xc0000000, 0x3fd05621, 729 0x36b8a570, 0xbe4fd4bd, 0xc0000000, 0x3fd03009, 0xbae505f7, 730 0xbe450388, 0x80000000, 0x3fd00a01, 0x3e35aead, 0xbe5430fc, 731 0x80000000, 0x3fcfc811, 0x707475ac, 0x3e38806e, 0x80000000, 732 0x3fcf7c3f, 0xc91817fc, 0xbe40ccea, 0x80000000, 0x3fcf308c, 733 0xae05d5e9, 0xbe4919b8, 0x80000000, 0x3fcee4f8, 0xae6cc9e6, 734 0xbe530b94, 0x00000000, 0x3fce9983, 0x1efe3e8e, 0x3e57747e, 735 0x00000000, 0x3fce4e2d, 0xda78d9bf, 0xbe59a608, 0x00000000, 736 0x3fce02f5, 0x8abe2c2e, 0x3e4a35ad, 0x00000000, 0x3fcdb7dc, 737 0x1495450d, 0xbe0872cc, 0x80000000, 0x3fcd6ce1, 0x86ee0ba0, 738 0xbe4f59a0, 0x00000000, 0x3fcd2205, 0xe81ca888, 0x3e5402c3, 739 0x00000000, 0x3fccd747, 0x3b4424b9, 0x3e5dfdc3, 0x80000000, 740 0x3fcc8ca7, 0xd305b56c, 0x3e202da6, 0x00000000, 0x3fcc4226, 741 0x399a6910, 0xbe482a1c, 0x80000000, 0x3fcbf7c2, 0x747f7938, 742 0xbe587372, 0x80000000, 0x3fcbad7c, 0x6fc246a0, 0x3e50d83d, 743 0x00000000, 0x3fcb6355, 0xee9e9be5, 0xbe5c35bd, 0x80000000, 744 0x3fcb194a, 0x8416c0bc, 0x3e546d4f, 0x00000000, 0x3fcacf5e, 745 0x49f7f08f, 0x3e56da76, 0x00000000, 0x3fca858f, 0x5dc30de2, 746 0x3e5f390c, 0x00000000, 0x3fca3bde, 0x950583b6, 0xbe5e4169, 747 0x80000000, 0x3fc9f249, 0x33631553, 0x3e52aeb1, 0x00000000, 748 0x3fc9a8d3, 0xde8795a6, 0xbe59a504, 0x00000000, 0x3fc95f79, 749 0x076bf41e, 0x3e5122fe, 0x80000000, 0x3fc9163c, 0x2914c8e7, 750 0x3e3dd064, 0x00000000, 0x3fc8cd1d, 0x3a30eca3, 0xbe21b4aa, 751 0x80000000, 0x3fc8841a, 0xb2a96650, 0xbe575444, 0x80000000, 752 0x3fc83b34, 0x2376c0cb, 0xbe2a74c7, 0x80000000, 0x3fc7f26b, 753 0xd8a0b653, 0xbe5181b6, 0x00000000, 0x3fc7a9bf, 0x32257882, 754 0xbe4a78b4, 0x00000000, 0x3fc7612f, 0x1eee8bd9, 0xbe1bfe9d, 755 0x80000000, 0x3fc718bb, 0x0c603cc4, 0x3e36fdc9, 0x80000000, 756 0x3fc6d064, 0x3728b8cf, 0xbe1e542e, 0x80000000, 0x3fc68829, 757 0xc79a4067, 0x3e5c380f, 0x00000000, 0x3fc6400b, 0xf69eac69, 758 0x3e550a84, 0x80000000, 0x3fc5f808, 0xb7a780a4, 0x3e5d9224, 759 0x80000000, 0x3fc5b022, 0xad9dfb1e, 0xbe55242f, 0x00000000, 760 0x3fc56858, 0x659b18be, 0xbe4bfda3, 0x80000000, 0x3fc520a9, 761 0x66ee3631, 0xbe57d769, 0x80000000, 0x3fc4d916, 0x1ec62819, 762 0x3e2427f7, 0x80000000, 0x3fc4919f, 0xdec25369, 0xbe435431, 763 0x00000000, 0x3fc44a44, 0xa8acfc4b, 0xbe3c62e8, 0x00000000, 764 0x3fc40304, 0xcf1d3eab, 0xbdfba29f, 0x80000000, 0x3fc3bbdf, 765 0x79aba3ea, 0xbdf1b7c8, 0x80000000, 0x3fc374d6, 0xb8d186da, 766 0xbe5130cf, 0x80000000, 0x3fc32de8, 0x9d74f152, 0x3e2285b6, 767 0x00000000, 0x3fc2e716, 0x50ae7ca9, 0xbe503920, 0x80000000, 768 0x3fc2a05e, 0x6caed92e, 0xbe533924, 0x00000000, 0x3fc259c2, 769 0x9cb5034e, 0xbe510e31, 0x80000000, 0x3fc21340, 0x12c4d378, 770 0xbe540b43, 0x80000000, 0x3fc1ccd9, 0xcc418706, 0x3e59887a, 771 0x00000000, 0x3fc1868e, 0x921f4106, 0xbe528e67, 0x80000000, 772 0x3fc1405c, 0x3969441e, 0x3e5d8051, 0x00000000, 0x3fc0fa46, 773 0xd941ef5b, 0x3e5f9079, 0x80000000, 0x3fc0b44a, 0x5a3e81b2, 774 0xbe567691, 0x00000000, 0x3fc06e69, 0x9d66afe7, 0xbe4d43fb, 775 0x00000000, 0x3fc028a2, 0x0a92a162, 0xbe52f394, 0x00000000, 776 0x3fbfc5ea, 0x209897e5, 0x3e529e37, 0x00000000, 0x3fbf3ac5, 777 0x8458bd7b, 0x3e582831, 0x00000000, 0x3fbeafd5, 0xb8d8b4b8, 778 0xbe486b4a, 0x00000000, 0x3fbe2518, 0xe0a3b7b6, 0x3e5bafd2, 779 0x00000000, 0x3fbd9a90, 0x2bf2710e, 0x3e383b2b, 0x00000000, 780 0x3fbd103c, 0x73eb6ab7, 0xbe56d78d, 0x00000000, 0x3fbc861b, 781 0x32ceaff5, 0xbe32dc5a, 0x00000000, 0x3fbbfc2e, 0xbee04cb7, 782 0xbe4a71a4, 0x00000000, 0x3fbb7274, 0x35ae9577, 0x3e38142f, 783 0x00000000, 0x3fbae8ee, 0xcbaddab4, 0xbe5490f0, 0x00000000, 784 0x3fba5f9a, 0x95ce1114, 0x3e597c71, 0x00000000, 0x3fb9d67a, 785 0x6d7c0f78, 0x3e3abc2d, 0x00000000, 0x3fb94d8d, 0x2841a782, 786 0xbe566cbc, 0x00000000, 0x3fb8c4d2, 0x6ed429c6, 0xbe3cfff9, 787 0x00000000, 0x3fb83c4a, 0xe4a49fbb, 0xbe552964, 0x00000000, 788 0x3fb7b3f4, 0x2193d81e, 0xbe42fa72, 0x00000000, 0x3fb72bd0, 789 0xdd70c122, 0x3e527a8c, 0x00000000, 0x3fb6a3df, 0x03108a54, 790 0xbe450393, 0x00000000, 0x3fb61c1f, 0x30ff7954, 0x3e565840, 791 0x00000000, 0x3fb59492, 0xdedd460c, 0xbe5422b5, 0x00000000, 792 0x3fb50d36, 0x950f9f45, 0xbe5313f6, 0x00000000, 0x3fb4860b, 793 0x582cdcb1, 0x3e506d39, 0x00000000, 0x3fb3ff12, 0x7216d3a6, 794 0x3e4aa719, 0x00000000, 0x3fb3784a, 0x57a423fd, 0x3e5a9b9f, 795 0x00000000, 0x3fb2f1b4, 0x7a138b41, 0xbe50b418, 0x00000000, 796 0x3fb26b4e, 0x2fbfd7ea, 0x3e23a53e, 0x00000000, 0x3fb1e519, 797 0x18913ccb, 0x3e465fc1, 0x00000000, 0x3fb15f15, 0x7ea24e21, 798 0x3e042843, 0x00000000, 0x3fb0d941, 0x7c6d9c77, 0x3e59f61e, 799 0x00000000, 0x3fb0539e, 0x114efd44, 0x3e4ccab7, 0x00000000, 800 0x3faf9c56, 0x1777f657, 0x3e552f65, 0x00000000, 0x3fae91d2, 801 0xc317b86a, 0xbe5a61e0, 0x00000000, 0x3fad87ac, 0xb7664efb, 802 0xbe41f64e, 0x00000000, 0x3fac7de6, 0x5d3d03a9, 0x3e0807a0, 803 0x00000000, 0x3fab7480, 0x743c38eb, 0xbe3726e1, 0x00000000, 804 0x3faa6b78, 0x06a253f1, 0x3e5ad636, 0x00000000, 0x3fa962d0, 805 0xa35f541b, 0x3e5a187a, 0x00000000, 0x3fa85a88, 0x4b86e446, 806 0xbe508150, 0x00000000, 0x3fa7529c, 0x2589cacf, 0x3e52938a, 807 0x00000000, 0x3fa64b10, 0xaf6b11f2, 0xbe3454cd, 0x00000000, 808 0x3fa543e2, 0x97506fef, 0xbe5fdec5, 0x00000000, 0x3fa43d10, 809 0xe75f7dd9, 0xbe388dd3, 0x00000000, 0x3fa3369c, 0xa4139632, 810 0xbdea5177, 0x00000000, 0x3fa23086, 0x352d6f1e, 0xbe565ad6, 811 0x00000000, 0x3fa12acc, 0x77449eb7, 0xbe50d5c7, 0x00000000, 812 0x3fa0256e, 0x7478da78, 0x3e404724, 0x00000000, 0x3f9e40dc, 813 0xf59cef7f, 0xbe539d0a, 0x00000000, 0x3f9c3790, 0x1511d43c, 814 0x3e53c2c8, 0x00000000, 0x3f9a2f00, 0x9b8bff3c, 0xbe43b3e1, 815 0x00000000, 0x3f982724, 0xad1e22a5, 0x3e46f0bd, 0x00000000, 816 0x3f962000, 0x130d9356, 0x3e475ba0, 0x00000000, 0x3f941994, 817 0x8f86f883, 0xbe513d0b, 0x00000000, 0x3f9213dc, 0x914d0dc8, 818 0xbe534335, 0x00000000, 0x3f900ed8, 0x2d73e5e7, 0xbe22ba75, 819 0x00000000, 0x3f8c1510, 0xc5b7d70e, 0x3e599c5d, 0x00000000, 820 0x3f880de0, 0x8a27857e, 0xbe3d28c8, 0x00000000, 0x3f840810, 821 0xda767328, 0x3e531b3d, 0x00000000, 0x3f8003b0, 0x77bacaf3, 822 0xbe5f04e3, 0x00000000, 0x3f780150, 0xdf4b0720, 0x3e5a8bff, 823 0x00000000, 0x3f6ffc40, 0x34c48e71, 0xbe3fcd99, 0x00000000, 824 0x3f5ff6c0, 0x1ad218af, 0xbe4c78a7, 0x00000000, 0x00000000, 825 0x00000000, 0x80000000 826 }; 827 828 private static int[] logTwoPow = { 829 0xfefa39ef, 0x3fe62e42, 0xfefa39ef, 0xbfe62e42 830 }; 831 832 public void powIntrinsic(Register dest, Register value1, Register value2, CompilationResultBuilder crb, AMD64MacroAssembler masm) { 833 ArrayDataPointerConstant highSigMaskPtr = new ArrayDataPointerConstant(highSigMask, 16); 834 ArrayDataPointerConstant logTwoEPtr = new ArrayDataPointerConstant(logTwoE, 16); 835 ArrayDataPointerConstant highmaskYPtr = new ArrayDataPointerConstant(highmaskY, 16); 836 ArrayDataPointerConstant tExpPtr = new ArrayDataPointerConstant(tExp, 16); 837 ArrayDataPointerConstant eCoeffPtr = new ArrayDataPointerConstant(eCoeff, 16); 838 ArrayDataPointerConstant coeffHPtr = new ArrayDataPointerConstant(coeffH, 16); 839 ArrayDataPointerConstant highmaskLogXPtr = new ArrayDataPointerConstant(highmaskLogX, 16); 840 ArrayDataPointerConstant halfmaskPtr = new ArrayDataPointerConstant(halfmask, 8); 841 ArrayDataPointerConstant coeffPowPtr = new ArrayDataPointerConstant(coeffPow, 16); 842 ArrayDataPointerConstant lTblPowPtr = new ArrayDataPointerConstant(lTblPow, 16); 843 ArrayDataPointerConstant logTwoPowPtr = new ArrayDataPointerConstant(logTwoPow, 8); 844 845 Label bb0 = new Label(); 846 Label bb1 = new Label(); 847 Label bb2 = new Label(); 848 Label bb3 = new Label(); 849 Label bb4 = new Label(); 850 Label bb5 = new Label(); 851 Label bb6 = new Label(); 852 Label bb7 = new Label(); 853 Label bb8 = new Label(); 854 Label bb9 = new Label(); 855 Label bb10 = new Label(); 856 Label bb11 = new Label(); 857 Label bb12 = new Label(); 858 Label bb13 = new Label(); 859 Label bb14 = new Label(); 860 Label bb15 = new Label(); 861 Label bb16 = new Label(); 862 Label bb18 = new Label(); 863 Label bb19 = new Label(); 864 Label bb20 = new Label(); 865 Label bb21 = new Label(); 866 Label bb22 = new Label(); 867 Label bb23 = new Label(); 868 Label bb24 = new Label(); 869 Label bb25 = new Label(); 870 Label bb26 = new Label(); 871 Label bb27 = new Label(); 872 Label bb28 = new Label(); 873 Label bb29 = new Label(); 874 Label bb30 = new Label(); 875 Label bb31 = new Label(); 876 Label bb32 = new Label(); 877 Label bb33 = new Label(); 878 Label bb34 = new Label(); 879 Label bb35 = new Label(); 880 Label bb36 = new Label(); 881 Label bb37 = new Label(); 882 Label bb38 = new Label(); 883 Label bb39 = new Label(); 884 Label bb40 = new Label(); 885 Label bb41 = new Label(); 886 Label bb42 = new Label(); 887 Label bb43 = new Label(); 888 Label bb44 = new Label(); 889 Label bb45 = new Label(); 890 Label bb46 = new Label(); 891 Label bb47 = new Label(); 892 Label bb48 = new Label(); 893 Label bb49 = new Label(); 894 Label bb50 = new Label(); 895 Label bb51 = new Label(); 896 Label bb53 = new Label(); 897 Label bb54 = new Label(); 898 Label bb55 = new Label(); 899 Label bb56 = new Label(); 900 901 Register gpr1 = asRegister(gpr1Temp, AMD64Kind.QWORD); 902 Register gpr2 = asRegister(gpr2Temp, AMD64Kind.QWORD); 903 Register gpr3 = asRegister(rcxTemp, AMD64Kind.QWORD); 904 Register gpr4 = asRegister(gpr4Temp, AMD64Kind.QWORD); 905 Register gpr5 = asRegister(gpr5Temp, AMD64Kind.QWORD); 906 Register gpr6 = asRegister(gpr6Temp, AMD64Kind.QWORD); 907 Register gpr7 = asRegister(gpr7Temp, AMD64Kind.QWORD); 908 Register gpr8 = asRegister(gpr8Temp, AMD64Kind.QWORD); 909 910 Register temp1 = asRegister(xmm1Temp, AMD64Kind.DOUBLE); 911 Register temp2 = asRegister(xmm2Temp, AMD64Kind.DOUBLE); 912 Register temp3 = asRegister(xmm3Temp, AMD64Kind.DOUBLE); 913 Register temp4 = asRegister(xmm4Temp, AMD64Kind.DOUBLE); 914 Register temp5 = asRegister(xmm5Temp, AMD64Kind.DOUBLE); 915 Register temp6 = asRegister(xmm6Temp, AMD64Kind.DOUBLE); 916 Register temp7 = asRegister(xmm7Temp, AMD64Kind.DOUBLE); 917 Register temp8 = asRegister(xmm8Temp, AMD64Kind.DOUBLE); 918 Register temp9 = asRegister(xmm9Temp, AMD64Kind.DOUBLE); 919 Register temp10 = asRegister(xmm10Temp, AMD64Kind.DOUBLE); 920 921 setCrb(crb); 922 masm.movdqu(temp10, value1); 923 masm.movsd(temp8, value2); 924 if (dest.encoding != value1.encoding) { 925 masm.movdqu(dest, value1); 926 } 927 928 masm.movq(temp9, externalAddress(logTwoEPtr)); // 0x00000000, 929 // 0x3ff72000 930 masm.pextrw(gpr1, dest, 3); 931 masm.xorpd(temp2, temp2); 932 masm.movq(gpr2, 0x3ff0000000000000L); 933 masm.movdq(temp2, gpr2); 934 masm.movl(gpr5, 1069088768); 935 masm.movdq(temp7, gpr5); 936 masm.xorpd(temp1, temp1); 937 masm.movq(gpr6, 0x77f0000000000000L); 938 masm.movdq(temp1, gpr6); 939 masm.movdqu(temp3, dest); 940 masm.movl(gpr4, 32752); 941 masm.andl(gpr4, gpr1); 942 masm.subl(gpr4, 16368); 943 masm.movl(gpr3, gpr4); 944 masm.sarl(gpr4, 31); 945 masm.addl(gpr3, gpr4); 946 masm.xorl(gpr3, gpr4); 947 masm.por(dest, temp2); 948 masm.movdqu(temp6, externalAddress(highSigMaskPtr)); // 0x00000000, 949 // 0xfffff800, 950 // 0x00000000, 951 // 0xfffff800 952 masm.psrlq(dest, 27); 953 masm.psrld(dest, 2); 954 masm.addl(gpr3, 16); 955 masm.bsrl(gpr3, gpr3); 956 masm.rcpps(dest, dest); 957 masm.psllq(temp3, 12); 958 masm.movl(gpr7, 8192); 959 masm.movdq(temp4, gpr7); 960 masm.psrlq(temp3, 12); 961 masm.subl(gpr1, 16); 962 masm.cmpl(gpr1, 32736); 963 masm.jcc(ConditionFlag.AboveEqual, bb0); 964 965 masm.movl(gpr5, 0); 966 967 masm.bind(bb1); 968 masm.mulss(dest, temp7); 969 masm.movl(gpr4, -1); 970 masm.subl(gpr3, 4); 971 masm.shll(gpr4); 972 masm.shlq(gpr4, 32); 973 masm.movdq(temp5, gpr4); 974 masm.por(temp3, temp1); 975 masm.subl(gpr1, 16351); 976 masm.cmpl(gpr1, 1); 977 masm.jcc(ConditionFlag.BelowEqual, bb2); 978 979 masm.paddd(dest, temp4); 980 masm.pand(temp5, temp3); 981 masm.movdl(gpr4, dest); 982 masm.psllq(dest, 29); 983 984 masm.bind(bb3); 985 masm.subsd(temp3, temp5); 986 masm.pand(dest, temp6); 987 masm.subl(gpr1, 1); 988 masm.sarl(gpr1, 4); 989 masm.cvtsi2sdl(temp7, gpr1); 990 masm.mulpd(temp5, dest); 991 992 masm.bind(bb4); 993 masm.mulsd(temp3, dest); 994 masm.leaq(gpr8, externalAddress(coeffPowPtr)); 995 masm.movdqu(temp1, new AMD64Address(gpr8, 0)); // 0x6dc96112, 996 // 0xbf836578, 997 // 0xee241472, 998 // 0xbf9b0301 999 masm.movdqu(temp4, new AMD64Address(gpr8, 16)); // 0x9f95985a, 1000 // 0xbfb528db, 1001 // 0xb3841d2a, 1002 // 0xbfd619b6 1003 masm.movdqu(temp6, new AMD64Address(gpr8, 32)); // 0x518775e3, 1004 // 0x3f9004f2, 1005 // 0xac8349bb, 1006 // 0x3fa76c9b 1007 masm.movdqu(dest, new AMD64Address(gpr8, 48)); // 0x486ececc, 1008 // 0x3fc4635e, 1009 // 0x161bb241, 1010 // 0xbf5dabe1 1011 masm.subsd(temp5, temp9); 1012 masm.movl(gpr3, gpr1); 1013 masm.sarl(gpr1, 31); 1014 masm.addl(gpr3, gpr1); 1015 masm.xorl(gpr1, gpr3); 1016 masm.addl(gpr1, 1); 1017 masm.bsrl(gpr1, gpr1); 1018 masm.unpcklpd(temp5, temp3); 1019 masm.addsd(temp3, temp5); 1020 masm.leaq(gpr7, externalAddress(lTblPowPtr)); 1021 masm.andl(gpr4, 16760832); 1022 masm.shrl(gpr4, 10); 1023 masm.addpd(temp5, new AMD64Address(gpr7, gpr4, Scale.Times1, -3648)); 1024 masm.pshufd(temp2, temp3, 0x44); 1025 masm.mulsd(temp3, temp3); 1026 masm.mulpd(temp1, temp2); 1027 masm.mulpd(temp4, temp2); 1028 masm.addsd(temp5, temp7); 1029 masm.mulsd(temp2, temp3); 1030 masm.addpd(temp6, temp1); 1031 masm.mulsd(temp3, temp3); 1032 masm.addpd(dest, temp4); 1033 masm.movdqu(temp1, temp8); 1034 masm.pextrw(gpr3, temp8, 3); 1035 masm.pshufd(temp7, temp5, 0xEE); 1036 masm.movq(temp4, externalAddress(highmaskYPtr)); // 0x00000000, 1037 // 0xfffffff8 1038 masm.mulpd(temp6, temp2); 1039 masm.pshufd(temp3, temp3, 0x44); 1040 masm.mulpd(dest, temp2); 1041 masm.shll(gpr1, 4); 1042 masm.subl(gpr1, 15872); 1043 masm.andl(gpr3, 32752); 1044 masm.addl(gpr1, gpr3); 1045 masm.mulpd(temp3, temp6); 1046 masm.cmpl(gpr1, 624); 1047 masm.jcc(ConditionFlag.AboveEqual, bb5); 1048 1049 masm.xorpd(temp6, temp6); 1050 masm.movl(gpr4, 17080); 1051 masm.pinsrw(temp6, gpr4, 3); 1052 masm.movdqu(temp2, temp1); 1053 masm.pand(temp4, temp1); 1054 masm.subsd(temp1, temp4); 1055 masm.mulsd(temp4, temp5); 1056 masm.addsd(dest, temp7); 1057 masm.mulsd(temp1, temp5); 1058 masm.movdqu(temp7, temp6); 1059 masm.addsd(temp6, temp4); 1060 masm.leaq(gpr7, externalAddress(tExpPtr)); 1061 masm.addpd(temp3, dest); 1062 masm.movdl(gpr4, temp6); 1063 masm.movl(gpr3, gpr4); 1064 masm.andl(gpr4, 255); 1065 masm.addl(gpr4, gpr4); 1066 masm.movdqu(temp5, new AMD64Address(gpr7, gpr4, Scale.Times8, 0)); 1067 masm.subsd(temp6, temp7); 1068 masm.pshufd(dest, temp3, 0xEE); 1069 masm.subsd(temp4, temp6); 1070 masm.addsd(dest, temp3); 1071 masm.addsd(temp4, temp1); 1072 masm.mulsd(temp2, dest); 1073 masm.leaq(gpr8, externalAddress(eCoeffPtr)); 1074 masm.movdqu(temp7, new AMD64Address(gpr8, 0)); // 0xe78a6731, 1075 // 0x3f55d87f, 1076 // 0xd704a0c0, 1077 // 0x3fac6b08 1078 masm.movdqu(temp3, new AMD64Address(gpr8, 16)); // 0x6fba4e77, 1079 // 0x3f83b2ab, 1080 // 0xff82c58f, 1081 // 0x3fcebfbd 1082 masm.shll(gpr3, 12); 1083 masm.xorl(gpr3, gpr5); 1084 masm.andl(gpr3, -1048576); 1085 masm.movdq(temp6, gpr3); 1086 masm.addsd(temp2, temp4); 1087 masm.movq(gpr2, 0x3fe62e42fefa39efL); 1088 masm.movdq(temp1, gpr2); 1089 masm.pshufd(dest, temp2, 0x44); 1090 masm.pshufd(temp4, temp2, 0x44); 1091 masm.mulsd(temp1, temp2); 1092 masm.pshufd(temp6, temp6, 0x11); 1093 masm.mulpd(dest, dest); 1094 masm.mulpd(temp7, temp4); 1095 masm.paddd(temp5, temp6); 1096 masm.mulsd(temp1, temp5); 1097 masm.pshufd(temp6, temp5, 0xEE); 1098 masm.mulsd(dest, dest); 1099 masm.addpd(temp3, temp7); 1100 masm.addsd(temp1, temp6); 1101 masm.mulpd(dest, temp3); 1102 masm.pshufd(temp3, dest, 0xEE); 1103 masm.mulsd(dest, temp5); 1104 masm.mulsd(temp3, temp5); 1105 masm.addsd(dest, temp1); 1106 masm.addsd(dest, temp3); 1107 masm.addsd(dest, temp5); 1108 masm.jmp(bb56); 1109 1110 masm.bind(bb0); 1111 masm.addl(gpr1, 16); 1112 masm.movl(gpr4, 32752); 1113 masm.andl(gpr4, gpr1); 1114 masm.cmpl(gpr4, 32752); 1115 masm.jcc(ConditionFlag.Equal, bb6); 1116 1117 masm.testl(gpr1, 32768); 1118 masm.jcc(ConditionFlag.NotEqual, bb7); 1119 1120 masm.bind(bb8); 1121 masm.movdqu(dest, temp10); 1122 masm.movdqu(temp3, temp10); 1123 masm.movdl(gpr4, temp3); 1124 masm.psrlq(temp3, 32); 1125 masm.movdl(gpr3, temp3); 1126 masm.orl(gpr4, gpr3); 1127 masm.cmpl(gpr4, 0); 1128 masm.jcc(ConditionFlag.Equal, bb9); 1129 1130 masm.xorpd(temp3, temp3); 1131 masm.movl(gpr1, 18416); 1132 masm.pinsrw(temp3, gpr1, 3); 1133 masm.mulsd(dest, temp3); 1134 masm.xorpd(temp2, temp2); 1135 masm.movl(gpr1, 16368); 1136 masm.pinsrw(temp2, gpr1, 3); 1137 masm.movdqu(temp3, dest); 1138 masm.pextrw(gpr1, dest, 3); 1139 masm.por(dest, temp2); 1140 masm.movl(gpr3, 18416); 1141 masm.psrlq(dest, 27); 1142 masm.psrld(dest, 2); 1143 masm.rcpps(dest, dest); 1144 masm.psllq(temp3, 12); 1145 masm.movdqu(temp6, externalAddress(highSigMaskPtr)); // 0x00000000, 1146 // 0xfffff800, 1147 // 0x00000000, 1148 // 0xfffff800 1149 masm.psrlq(temp3, 12); 1150 masm.mulss(dest, temp7); 1151 masm.movl(gpr4, -1024); 1152 masm.movdl(temp5, gpr4); 1153 masm.por(temp3, temp1); 1154 masm.paddd(dest, temp4); 1155 masm.psllq(temp5, 32); 1156 masm.movdl(gpr4, dest); 1157 masm.psllq(dest, 29); 1158 masm.pand(temp5, temp3); 1159 masm.movl(gpr5, 0); 1160 masm.pand(dest, temp6); 1161 masm.subsd(temp3, temp5); 1162 masm.andl(gpr1, 32752); 1163 masm.subl(gpr1, 18416); 1164 masm.sarl(gpr1, 4); 1165 masm.cvtsi2sdl(temp7, gpr1); 1166 masm.mulpd(temp5, dest); 1167 masm.jmp(bb4); 1168 1169 masm.bind(bb10); 1170 masm.movdqu(dest, temp10); 1171 masm.movdqu(temp3, temp10); 1172 masm.movdl(gpr4, temp3); 1173 masm.psrlq(temp3, 32); 1174 masm.movdl(gpr3, temp3); 1175 masm.orl(gpr4, gpr3); 1176 masm.cmpl(gpr4, 0); 1177 masm.jcc(ConditionFlag.Equal, bb9); 1178 1179 masm.xorpd(temp3, temp3); 1180 masm.movl(gpr1, 18416); 1181 masm.pinsrw(temp3, gpr1, 3); 1182 masm.mulsd(dest, temp3); 1183 masm.xorpd(temp2, temp2); 1184 masm.movl(gpr1, 16368); 1185 masm.pinsrw(temp2, gpr1, 3); 1186 masm.movdqu(temp3, dest); 1187 masm.pextrw(gpr1, dest, 3); 1188 masm.por(dest, temp2); 1189 masm.movl(gpr3, 18416); 1190 masm.psrlq(dest, 27); 1191 masm.psrld(dest, 2); 1192 masm.rcpps(dest, dest); 1193 masm.psllq(temp3, 12); 1194 masm.movdqu(temp6, externalAddress(highSigMaskPtr)); // 0x00000000, 1195 // 0xfffff800, 1196 // 0x00000000, 1197 // 0xfffff800 1198 masm.psrlq(temp3, 12); 1199 masm.mulss(dest, temp7); 1200 masm.movl(gpr4, -1024); 1201 masm.movdl(temp5, gpr4); 1202 masm.por(temp3, temp1); 1203 masm.paddd(dest, temp4); 1204 masm.psllq(temp5, 32); 1205 masm.movdl(gpr4, dest); 1206 masm.psllq(dest, 29); 1207 masm.pand(temp5, temp3); 1208 masm.movl(gpr5, Integer.MIN_VALUE); 1209 masm.pand(dest, temp6); 1210 masm.subsd(temp3, temp5); 1211 masm.andl(gpr1, 32752); 1212 masm.subl(gpr1, 18416); 1213 masm.sarl(gpr1, 4); 1214 masm.cvtsi2sdl(temp7, gpr1); 1215 masm.mulpd(temp5, dest); 1216 masm.jmp(bb4); 1217 1218 masm.bind(bb5); 1219 masm.cmpl(gpr1, 0); 1220 masm.jcc(ConditionFlag.Less, bb11); 1221 1222 masm.cmpl(gpr1, 752); 1223 masm.jcc(ConditionFlag.AboveEqual, bb12); 1224 1225 masm.addsd(dest, temp7); 1226 masm.movq(temp4, externalAddress(halfmaskPtr)); // 0xf8000000, 1227 // 0xffffffff 1228 masm.addpd(temp3, dest); 1229 masm.xorpd(temp6, temp6); 1230 masm.movl(gpr1, 17080); 1231 masm.pinsrw(temp6, gpr1, 3); 1232 masm.pshufd(dest, temp3, 0xEE); 1233 masm.addsd(dest, temp3); 1234 masm.movdqu(temp3, temp5); 1235 masm.addsd(temp5, dest); 1236 masm.subsd(temp3, temp5); 1237 masm.movdqu(temp7, temp5); 1238 masm.pand(temp5, temp4); 1239 masm.movdqu(temp2, temp1); 1240 masm.pand(temp4, temp1); 1241 masm.subsd(temp7, temp5); 1242 masm.addsd(dest, temp3); 1243 masm.subsd(temp1, temp4); 1244 masm.mulsd(temp4, temp5); 1245 masm.addsd(dest, temp7); 1246 masm.mulsd(temp2, dest); 1247 masm.movdqu(temp7, temp6); 1248 masm.mulsd(temp1, temp5); 1249 masm.addsd(temp6, temp4); 1250 masm.movdl(gpr1, temp6); 1251 masm.subsd(temp6, temp7); 1252 masm.leaq(gpr7, externalAddress(tExpPtr)); 1253 masm.movl(gpr3, gpr1); 1254 masm.andl(gpr1, 255); 1255 masm.addl(gpr1, gpr1); 1256 masm.movdqu(temp5, new AMD64Address(gpr7, gpr1, Scale.Times8, 0)); 1257 masm.addsd(temp2, temp1); 1258 masm.leaq(gpr8, externalAddress(eCoeffPtr)); 1259 masm.movdqu(temp7, new AMD64Address(gpr8, 0)); // 0xe78a6731, 1260 // 0x3f55d87f, 1261 // 0xd704a0c0, 1262 // 0x3fac6b08 1263 masm.movdqu(temp3, new AMD64Address(gpr8, 16)); // 0x6fba4e77, 1264 // 0x3f83b2ab, 1265 // 0xff82c58f, 1266 // 0x3fcebfbd 1267 masm.subsd(temp4, temp6); 1268 masm.pextrw(gpr4, temp6, 3); 1269 masm.addsd(temp2, temp4); 1270 masm.sarl(gpr3, 8); 1271 masm.movl(gpr1, gpr3); 1272 masm.sarl(gpr3, 1); 1273 masm.subl(gpr1, gpr3); 1274 masm.shll(gpr3, 20); 1275 masm.xorl(gpr3, gpr5); 1276 masm.movdl(temp6, gpr3); 1277 masm.movq(temp1, new AMD64Address(gpr8, 32)); // 0xfefa39ef, 1278 // 0x3fe62e42 1279 masm.andl(gpr4, 32767); 1280 masm.cmpl(gpr4, 16529); 1281 masm.jcc(ConditionFlag.Above, bb12); 1282 1283 masm.pshufd(dest, temp2, 0x44); 1284 masm.pshufd(temp4, temp2, 0x44); 1285 masm.mulpd(dest, dest); 1286 masm.mulpd(temp7, temp4); 1287 masm.pshufd(temp6, temp6, 0x11); 1288 masm.mulsd(temp1, temp2); 1289 masm.mulsd(dest, dest); 1290 masm.paddd(temp5, temp6); 1291 masm.addpd(temp3, temp7); 1292 masm.mulsd(temp1, temp5); 1293 masm.pshufd(temp6, temp5, 0xEE); 1294 masm.mulpd(dest, temp3); 1295 masm.addsd(temp1, temp6); 1296 masm.pshufd(temp3, dest, 0xEE); 1297 masm.mulsd(dest, temp5); 1298 masm.mulsd(temp3, temp5); 1299 masm.shll(gpr1, 4); 1300 masm.xorpd(temp4, temp4); 1301 masm.addl(gpr1, 16368); 1302 masm.pinsrw(temp4, gpr1, 3); 1303 masm.addsd(dest, temp1); 1304 masm.addsd(dest, temp3); 1305 masm.movdqu(temp1, dest); 1306 masm.addsd(dest, temp5); 1307 masm.mulsd(dest, temp4); 1308 masm.pextrw(gpr1, dest, 3); 1309 masm.andl(gpr1, 32752); 1310 masm.jcc(ConditionFlag.Equal, bb13); 1311 1312 masm.cmpl(gpr1, 32752); 1313 masm.jcc(ConditionFlag.Equal, bb14); 1314 1315 masm.jmp(bb56); 1316 1317 masm.bind(bb6); 1318 masm.movdqu(temp1, temp8); 1319 masm.movdqu(dest, temp10); 1320 masm.movdqu(temp2, dest); 1321 masm.movdl(gpr1, temp2); 1322 masm.psrlq(temp2, 20); 1323 masm.movdl(gpr4, temp2); 1324 masm.orl(gpr1, gpr4); 1325 masm.jcc(ConditionFlag.Equal, bb15); 1326 1327 masm.movdl(gpr1, temp1); 1328 masm.psrlq(temp1, 32); 1329 masm.movdl(gpr4, temp1); 1330 masm.movl(gpr3, gpr4); 1331 masm.addl(gpr4, gpr4); 1332 masm.orl(gpr1, gpr4); 1333 masm.jcc(ConditionFlag.Equal, bb16); 1334 1335 masm.addsd(dest, dest); 1336 masm.jmp(bb56); 1337 1338 masm.bind(bb16); 1339 masm.xorpd(dest, dest); 1340 masm.movl(gpr1, 16368); 1341 masm.pinsrw(dest, gpr1, 3); 1342 masm.jmp(bb56); 1343 1344 masm.bind(bb18); 1345 masm.addpd(dest, temp8); 1346 masm.jmp(bb56); 1347 1348 masm.bind(bb15); 1349 masm.movdl(gpr1, temp1); 1350 masm.movdqu(temp2, temp1); 1351 masm.psrlq(temp1, 32); 1352 masm.movdl(gpr4, temp1); 1353 masm.movl(gpr3, gpr4); 1354 masm.addl(gpr4, gpr4); 1355 masm.orl(gpr1, gpr4); 1356 masm.jcc(ConditionFlag.Equal, bb19); 1357 1358 masm.pextrw(gpr1, temp2, 3); 1359 masm.andl(gpr1, 32752); 1360 masm.cmpl(gpr1, 32752); 1361 masm.jcc(ConditionFlag.NotEqual, bb20); 1362 1363 masm.movdl(gpr1, temp2); 1364 masm.psrlq(temp2, 20); 1365 masm.movdl(gpr4, temp2); 1366 masm.orl(gpr1, gpr4); 1367 masm.jcc(ConditionFlag.NotEqual, bb18); 1368 1369 masm.bind(bb20); 1370 masm.pextrw(gpr1, dest, 3); 1371 masm.testl(gpr1, 32768); 1372 masm.jcc(ConditionFlag.NotEqual, bb21); 1373 1374 masm.testl(gpr3, Integer.MIN_VALUE); 1375 masm.jcc(ConditionFlag.NotZero, bb22); 1376 1377 masm.jmp(bb56); 1378 1379 masm.bind(bb23); 1380 masm.movdl(gpr1, temp8); 1381 masm.testl(gpr1, 1); 1382 masm.jcc(ConditionFlag.NotEqual, bb24); 1383 1384 masm.testl(gpr1, 2); 1385 masm.jcc(ConditionFlag.NotEqual, bb25); 1386 1387 masm.jmp(bb24); 1388 1389 masm.bind(bb21); 1390 masm.shrl(gpr3, 20); 1391 masm.andl(gpr3, 2047); 1392 masm.cmpl(gpr3, 1075); 1393 masm.jcc(ConditionFlag.Above, bb24); 1394 1395 masm.jcc(ConditionFlag.Equal, bb26); 1396 1397 masm.cmpl(gpr3, 1074); 1398 masm.jcc(ConditionFlag.Above, bb23); 1399 1400 masm.cmpl(gpr3, 1023); 1401 masm.jcc(ConditionFlag.Below, bb24); 1402 1403 masm.movdqu(temp1, temp8); 1404 masm.movl(gpr1, 17208); 1405 masm.xorpd(temp3, temp3); 1406 masm.pinsrw(temp3, gpr1, 3); 1407 masm.movdqu(temp4, temp3); 1408 masm.addsd(temp3, temp1); 1409 masm.subsd(temp4, temp3); 1410 masm.addsd(temp1, temp4); 1411 masm.pextrw(gpr1, temp1, 3); 1412 masm.andl(gpr1, 32752); 1413 masm.jcc(ConditionFlag.NotEqual, bb24); 1414 1415 masm.movdl(gpr1, temp3); 1416 masm.andl(gpr1, 1); 1417 masm.jcc(ConditionFlag.Equal, bb24); 1418 1419 masm.bind(bb25); 1420 masm.pextrw(gpr1, temp8, 3); 1421 masm.andl(gpr1, 32768); 1422 masm.jcc(ConditionFlag.NotEqual, bb27); 1423 1424 masm.jmp(bb56); 1425 1426 masm.bind(bb27); 1427 masm.xorpd(dest, dest); 1428 masm.movl(gpr1, 32768); 1429 masm.pinsrw(dest, gpr1, 3); 1430 masm.jmp(bb56); 1431 1432 masm.bind(bb24); 1433 masm.pextrw(gpr1, temp8, 3); 1434 masm.andl(gpr1, 32768); 1435 masm.jcc(ConditionFlag.NotEqual, bb22); 1436 1437 masm.xorpd(dest, dest); 1438 masm.movl(gpr1, 32752); 1439 masm.pinsrw(dest, gpr1, 3); 1440 masm.jmp(bb56); 1441 1442 masm.bind(bb26); 1443 masm.movdl(gpr1, temp8); 1444 masm.andl(gpr1, 1); 1445 masm.jcc(ConditionFlag.Equal, bb24); 1446 1447 masm.jmp(bb25); 1448 1449 masm.bind(bb28); 1450 masm.movdl(gpr1, temp1); 1451 masm.psrlq(temp1, 20); 1452 masm.movdl(gpr4, temp1); 1453 masm.orl(gpr1, gpr4); 1454 masm.jcc(ConditionFlag.Equal, bb29); 1455 1456 masm.addsd(dest, temp8); 1457 masm.jmp(bb56); 1458 1459 masm.bind(bb29); 1460 masm.movdqu(dest, temp10); 1461 masm.pextrw(gpr1, dest, 3); 1462 masm.cmpl(gpr1, 49136); 1463 masm.jcc(ConditionFlag.NotEqual, bb30); 1464 1465 masm.movdl(gpr3, dest); 1466 masm.psrlq(dest, 20); 1467 masm.movdl(gpr4, dest); 1468 masm.orl(gpr3, gpr4); 1469 masm.jcc(ConditionFlag.NotEqual, bb30); 1470 1471 masm.xorpd(dest, dest); 1472 masm.movl(gpr1, 32760); 1473 masm.pinsrw(dest, gpr1, 3); 1474 masm.jmp(bb56); 1475 1476 masm.bind(bb30); 1477 masm.andl(gpr1, 32752); 1478 masm.subl(gpr1, 16368); 1479 masm.pextrw(gpr4, temp8, 3); 1480 masm.xorpd(dest, dest); 1481 masm.xorl(gpr1, gpr4); 1482 masm.andl(gpr1, 32768); 1483 masm.jcc(ConditionFlag.Equal, bb31); 1484 1485 masm.jmp(bb56); 1486 1487 masm.bind(bb31); 1488 masm.movl(gpr3, 32752); 1489 masm.pinsrw(dest, gpr3, 3); 1490 masm.jmp(bb56); 1491 1492 masm.bind(bb32); 1493 masm.movdl(gpr1, temp1); 1494 masm.cmpl(gpr4, 17184); 1495 masm.jcc(ConditionFlag.Above, bb33); 1496 1497 masm.testl(gpr1, 1); 1498 masm.jcc(ConditionFlag.NotEqual, bb34); 1499 1500 masm.testl(gpr1, 2); 1501 masm.jcc(ConditionFlag.Equal, bb35); 1502 1503 masm.jmp(bb36); 1504 1505 masm.bind(bb33); 1506 masm.testl(gpr1, 1); 1507 masm.jcc(ConditionFlag.Equal, bb35); 1508 1509 masm.jmp(bb36); 1510 1511 masm.bind(bb7); 1512 masm.movdqu(temp2, temp10); 1513 masm.movdl(gpr1, temp2); 1514 masm.psrlq(temp2, 31); 1515 masm.movdl(gpr3, temp2); 1516 masm.orl(gpr1, gpr3); 1517 masm.jcc(ConditionFlag.Equal, bb9); 1518 1519 masm.pextrw(gpr4, temp8, 3); 1520 masm.movdl(gpr1, temp8); 1521 masm.movdqu(temp2, temp8); 1522 masm.psrlq(temp2, 32); 1523 masm.movdl(gpr3, temp2); 1524 masm.addl(gpr3, gpr3); 1525 masm.orl(gpr3, gpr1); 1526 masm.jcc(ConditionFlag.Equal, bb37); 1527 1528 masm.andl(gpr4, 32752); 1529 masm.cmpl(gpr4, 32752); 1530 masm.jcc(ConditionFlag.Equal, bb28); 1531 1532 masm.cmpl(gpr4, 17200); 1533 masm.jcc(ConditionFlag.Above, bb35); 1534 1535 masm.cmpl(gpr4, 17184); 1536 masm.jcc(ConditionFlag.AboveEqual, bb32); 1537 1538 masm.cmpl(gpr4, 16368); 1539 masm.jcc(ConditionFlag.Below, bb34); 1540 1541 masm.movl(gpr1, 17208); 1542 masm.xorpd(temp2, temp2); 1543 masm.pinsrw(temp2, gpr1, 3); 1544 masm.movdqu(temp4, temp2); 1545 masm.addsd(temp2, temp1); 1546 masm.subsd(temp4, temp2); 1547 masm.addsd(temp1, temp4); 1548 masm.pextrw(gpr1, temp1, 3); 1549 masm.andl(gpr1, 32767); 1550 masm.jcc(ConditionFlag.NotEqual, bb34); 1551 1552 masm.movdl(gpr1, temp2); 1553 masm.andl(gpr1, 1); 1554 masm.jcc(ConditionFlag.Equal, bb35); 1555 1556 masm.bind(bb36); 1557 masm.xorpd(temp1, temp1); 1558 masm.movl(gpr4, 30704); 1559 masm.pinsrw(temp1, gpr4, 3); 1560 masm.pextrw(gpr1, temp10, 3); 1561 masm.movl(gpr4, 8192); 1562 masm.movdl(temp4, gpr4); 1563 masm.andl(gpr1, 32767); 1564 masm.subl(gpr1, 16); 1565 masm.jcc(ConditionFlag.Less, bb10); 1566 1567 masm.movl(gpr4, gpr1); 1568 masm.andl(gpr4, 32752); 1569 masm.subl(gpr4, 16368); 1570 masm.movl(gpr3, gpr4); 1571 masm.sarl(gpr4, 31); 1572 masm.addl(gpr3, gpr4); 1573 masm.xorl(gpr3, gpr4); 1574 masm.addl(gpr3, 16); 1575 masm.bsrl(gpr3, gpr3); 1576 masm.movl(gpr5, Integer.MIN_VALUE); 1577 masm.jmp(bb1); 1578 1579 masm.bind(bb34); 1580 masm.xorpd(temp1, temp1); 1581 masm.movl(gpr1, 32752); 1582 masm.pinsrw(temp1, gpr1, 3); 1583 masm.xorpd(dest, dest); 1584 masm.mulsd(dest, temp1); 1585 masm.jmp(bb56); 1586 1587 masm.bind(bb35); 1588 masm.xorpd(temp1, temp1); 1589 masm.movl(gpr4, 30704); 1590 masm.pinsrw(temp1, gpr4, 3); 1591 masm.pextrw(gpr1, temp10, 3); 1592 masm.movl(gpr4, 8192); 1593 masm.movdl(temp4, gpr4); 1594 masm.andl(gpr1, 32767); 1595 masm.subl(gpr1, 16); 1596 masm.jcc(ConditionFlag.Less, bb8); 1597 1598 masm.movl(gpr4, gpr1); 1599 masm.andl(gpr4, 32752); 1600 masm.subl(gpr4, 16368); 1601 masm.movl(gpr3, gpr4); 1602 masm.sarl(gpr4, 31); 1603 masm.addl(gpr3, gpr4); 1604 masm.xorl(gpr3, gpr4); 1605 masm.addl(gpr3, 16); 1606 masm.bsrl(gpr3, gpr3); 1607 masm.movl(gpr5, 0); 1608 masm.jmp(bb1); 1609 1610 masm.bind(bb19); 1611 masm.xorpd(dest, dest); 1612 masm.movl(gpr1, 16368); 1613 masm.pinsrw(dest, gpr1, 3); 1614 masm.jmp(bb56); 1615 1616 masm.bind(bb22); 1617 masm.xorpd(dest, dest); 1618 masm.jmp(bb56); 1619 1620 masm.bind(bb11); 1621 masm.addl(gpr1, 384); 1622 masm.cmpl(gpr1, 0); 1623 masm.jcc(ConditionFlag.Less, bb38); 1624 1625 masm.mulsd(temp5, temp1); 1626 masm.addsd(dest, temp7); 1627 masm.shrl(gpr5, 31); 1628 masm.addpd(temp3, dest); 1629 masm.pshufd(dest, temp3, 0xEE); 1630 masm.addsd(temp3, dest); 1631 masm.leaq(gpr7, externalAddress(logTwoPowPtr)); // 0xfefa39ef, 1632 // 0x3fe62e42, 1633 // 0xfefa39ef, 1634 // 0xbfe62e42 1635 masm.movq(temp4, new AMD64Address(gpr7, gpr5, Scale.Times8, 0)); 1636 masm.mulsd(temp1, temp3); 1637 masm.xorpd(dest, dest); 1638 masm.movl(gpr1, 16368); 1639 masm.shll(gpr5, 15); 1640 masm.orl(gpr1, gpr5); 1641 masm.pinsrw(dest, gpr1, 3); 1642 masm.addsd(temp5, temp1); 1643 masm.mulsd(temp5, temp4); 1644 masm.addsd(dest, temp5); 1645 masm.jmp(bb56); 1646 1647 masm.bind(bb38); 1648 1649 masm.bind(bb37); 1650 masm.xorpd(dest, dest); 1651 masm.movl(gpr1, 16368); 1652 masm.pinsrw(dest, gpr1, 3); 1653 masm.jmp(bb56); 1654 1655 masm.bind(bb39); 1656 masm.xorpd(dest, dest); 1657 masm.movl(gpr1, 16368); 1658 masm.pinsrw(dest, gpr1, 3); 1659 masm.jmp(bb56); 1660 1661 masm.bind(bb9); 1662 masm.movdqu(temp2, temp8); 1663 masm.pextrw(gpr1, temp8, 3); 1664 masm.andl(gpr1, 32752); 1665 masm.cmpl(gpr1, 32752); 1666 masm.jcc(ConditionFlag.NotEqual, bb40); 1667 1668 masm.movdl(gpr1, temp2); 1669 masm.psrlq(temp2, 20); 1670 masm.movdl(gpr4, temp2); 1671 masm.orl(gpr1, gpr4); 1672 masm.jcc(ConditionFlag.NotEqual, bb18); 1673 1674 masm.bind(bb40); 1675 masm.movdl(gpr1, temp1); 1676 masm.psrlq(temp1, 32); 1677 masm.movdl(gpr4, temp1); 1678 masm.movl(gpr3, gpr4); 1679 masm.addl(gpr4, gpr4); 1680 masm.orl(gpr1, gpr4); 1681 masm.jcc(ConditionFlag.Equal, bb39); 1682 1683 masm.shrl(gpr4, 21); 1684 masm.cmpl(gpr4, 1075); 1685 masm.jcc(ConditionFlag.Above, bb41); 1686 1687 masm.jcc(ConditionFlag.Equal, bb42); 1688 1689 masm.cmpl(gpr4, 1023); 1690 masm.jcc(ConditionFlag.Below, bb41); 1691 1692 masm.movdqu(temp1, temp8); 1693 masm.movl(gpr1, 17208); 1694 masm.xorpd(temp3, temp3); 1695 masm.pinsrw(temp3, gpr1, 3); 1696 masm.movdqu(temp4, temp3); 1697 masm.addsd(temp3, temp1); 1698 masm.subsd(temp4, temp3); 1699 masm.addsd(temp1, temp4); 1700 masm.pextrw(gpr1, temp1, 3); 1701 masm.andl(gpr1, 32752); 1702 masm.jcc(ConditionFlag.NotEqual, bb41); 1703 1704 masm.movdl(gpr1, temp3); 1705 masm.andl(gpr1, 1); 1706 masm.jcc(ConditionFlag.Equal, bb41); 1707 1708 masm.bind(bb43); 1709 masm.movdqu(dest, temp10); 1710 masm.testl(gpr3, Integer.MIN_VALUE); 1711 masm.jcc(ConditionFlag.NotEqual, bb44); 1712 1713 masm.jmp(bb56); 1714 1715 masm.bind(bb42); 1716 masm.movdl(gpr1, temp8); 1717 masm.testl(gpr1, 1); 1718 masm.jcc(ConditionFlag.NotEqual, bb43); 1719 1720 masm.bind(bb41); 1721 masm.testl(gpr3, Integer.MIN_VALUE); 1722 masm.jcc(ConditionFlag.Equal, bb22); 1723 1724 masm.xorpd(dest, dest); 1725 1726 masm.bind(bb44); 1727 masm.movl(gpr1, 16368); 1728 masm.xorpd(temp1, temp1); 1729 masm.pinsrw(temp1, gpr1, 3); 1730 masm.divsd(temp1, dest); 1731 masm.movdqu(dest, temp1); 1732 masm.jmp(bb56); 1733 1734 masm.bind(bb12); 1735 masm.pextrw(gpr1, temp10, 3); 1736 masm.pextrw(gpr4, temp8, 3); 1737 masm.movl(gpr3, 32752); 1738 masm.andl(gpr3, gpr4); 1739 masm.cmpl(gpr3, 32752); 1740 masm.jcc(ConditionFlag.Equal, bb45); 1741 1742 masm.andl(gpr1, 32752); 1743 masm.subl(gpr1, 16368); 1744 masm.xorl(gpr4, gpr1); 1745 masm.testl(gpr4, 32768); 1746 masm.jcc(ConditionFlag.NotEqual, bb46); 1747 1748 masm.bind(bb47); 1749 masm.movl(gpr1, 32736); 1750 masm.pinsrw(dest, gpr1, 3); 1751 masm.shrl(gpr5, 16); 1752 masm.orl(gpr1, gpr5); 1753 masm.pinsrw(temp1, gpr1, 3); 1754 masm.mulsd(dest, temp1); 1755 1756 masm.bind(bb14); 1757 masm.jmp(bb56); 1758 1759 masm.bind(bb46); 1760 masm.movl(gpr1, 16); 1761 masm.pinsrw(dest, gpr1, 3); 1762 masm.mulsd(dest, dest); 1763 masm.testl(gpr3, Integer.MIN_VALUE); 1764 masm.jcc(ConditionFlag.Equal, bb48); 1765 1766 masm.movq(gpr2, 0x8000000000000000L); 1767 masm.movdq(temp2, gpr2); 1768 masm.xorpd(dest, temp2); 1769 1770 masm.bind(bb48); 1771 masm.jmp(bb56); 1772 1773 masm.bind(bb13); 1774 masm.pextrw(gpr3, temp5, 3); 1775 masm.pextrw(gpr4, temp4, 3); 1776 masm.movl(gpr1, -1); 1777 masm.andl(gpr3, 32752); 1778 masm.subl(gpr3, 16368); 1779 masm.andl(gpr4, 32752); 1780 masm.addl(gpr4, gpr3); 1781 masm.movl(gpr3, -31); 1782 masm.sarl(gpr4, 4); 1783 masm.subl(gpr3, gpr4); 1784 masm.jcc(ConditionFlag.LessEqual, bb49); 1785 1786 masm.cmpl(gpr3, 20); 1787 masm.jcc(ConditionFlag.Above, bb50); 1788 1789 masm.shll(gpr1); 1790 1791 masm.bind(bb49); 1792 masm.movdl(dest, gpr1); 1793 masm.psllq(dest, 32); 1794 masm.pand(dest, temp5); 1795 masm.subsd(temp5, dest); 1796 masm.addsd(temp5, temp1); 1797 masm.mulsd(dest, temp4); 1798 masm.mulsd(temp5, temp4); 1799 masm.addsd(dest, temp5); 1800 1801 masm.bind(bb50); 1802 masm.jmp(bb48); 1803 1804 masm.bind(bb2); 1805 masm.pextrw(gpr3, temp8, 3); 1806 masm.movl(gpr4, Integer.MIN_VALUE); 1807 masm.movdl(temp1, gpr4); 1808 masm.xorpd(temp7, temp7); 1809 masm.paddd(dest, temp4); 1810 masm.movdl(gpr4, dest); 1811 masm.psllq(dest, 29); 1812 masm.paddq(temp1, temp3); 1813 masm.pand(temp5, temp1); 1814 masm.andl(gpr3, 32752); 1815 masm.cmpl(gpr3, 16560); 1816 masm.jcc(ConditionFlag.Less, bb3); 1817 1818 masm.leaq(gpr7, externalAddress(lTblPowPtr)); 1819 masm.leaq(gpr8, externalAddress(coeffHPtr)); 1820 masm.movdqu(temp4, new AMD64Address(gpr8, 0)); // 0x00000000, 1821 // 0xbfd61a00, 1822 // 0x00000000, 1823 // 0xbf5dabe1 1824 masm.pand(dest, temp6); 1825 masm.subsd(temp3, temp5); 1826 masm.addl(gpr1, 16351); 1827 masm.shrl(gpr1, 4); 1828 masm.subl(gpr1, 1022); 1829 masm.cvtsi2sdl(temp7, gpr1); 1830 masm.mulpd(temp5, dest); 1831 masm.mulsd(temp3, dest); 1832 masm.subsd(temp5, temp9); 1833 masm.pshufd(temp1, temp4, 0xE); 1834 masm.pshufd(temp2, temp3, 0x44); 1835 masm.unpcklpd(temp5, temp3); 1836 masm.addsd(temp3, temp5); 1837 masm.andl(gpr4, 16760832); 1838 masm.shrl(gpr4, 10); 1839 masm.addpd(temp7, new AMD64Address(gpr7, gpr4, Scale.Times1, -3648)); 1840 masm.movdqu(temp6, temp4); 1841 masm.mulsd(temp4, temp5); 1842 masm.movdqu(dest, temp1); 1843 masm.mulsd(dest, temp5); 1844 masm.mulsd(temp6, temp2); 1845 masm.mulsd(temp1, temp2); 1846 masm.movdqu(temp2, temp5); 1847 masm.mulsd(temp4, temp5); 1848 masm.addsd(temp5, dest); 1849 masm.movdqu(dest, temp7); 1850 masm.addsd(temp2, temp3); 1851 masm.addsd(temp7, temp5); 1852 masm.mulsd(temp6, temp2); 1853 masm.subsd(dest, temp7); 1854 masm.movdqu(temp2, temp7); 1855 masm.addsd(temp7, temp4); 1856 masm.addsd(dest, temp5); 1857 masm.subsd(temp2, temp7); 1858 masm.addsd(temp4, temp2); 1859 masm.pshufd(temp2, temp5, 0xEE); 1860 masm.movdqu(temp5, temp7); 1861 masm.addsd(temp7, temp2); 1862 masm.addsd(temp4, dest); 1863 masm.leaq(gpr8, externalAddress(coeffPowPtr)); 1864 masm.movdqu(dest, new AMD64Address(gpr8, 0)); // 0x6dc96112, 1865 // 0xbf836578, 1866 // 0xee241472, 1867 // 0xbf9b0301 1868 masm.subsd(temp5, temp7); 1869 masm.addsd(temp6, temp4); 1870 masm.movdqu(temp4, temp7); 1871 masm.addsd(temp5, temp2); 1872 masm.addsd(temp7, temp1); 1873 masm.movdqu(temp2, new AMD64Address(gpr8, 64)); // 0x486ececc, 1874 // 0x3fc4635e, 1875 // 0x161bb241, 1876 // 0xbf5dabe1 1877 masm.subsd(temp4, temp7); 1878 masm.addsd(temp6, temp5); 1879 masm.addsd(temp4, temp1); 1880 masm.pshufd(temp5, temp7, 0xEE); 1881 masm.movapd(temp1, temp7); 1882 masm.addsd(temp7, temp5); 1883 masm.subsd(temp1, temp7); 1884 masm.addsd(temp1, temp5); 1885 masm.movdqu(temp5, new AMD64Address(gpr8, 80)); // 0x9f95985a, 1886 // 0xbfb528db, 1887 // 0xf8b5787d, 1888 // 0x3ef2531e 1889 masm.pshufd(temp3, temp3, 0x44); 1890 masm.addsd(temp6, temp4); 1891 masm.addsd(temp6, temp1); 1892 masm.movdqu(temp1, new AMD64Address(gpr8, 32)); // 0x9f95985a, 1893 // 0xbfb528db, 1894 // 0xb3841d2a, 1895 // 0xbfd619b6 1896 masm.mulpd(dest, temp3); 1897 masm.mulpd(temp2, temp3); 1898 masm.pshufd(temp4, temp3, 0x44); 1899 masm.mulpd(temp3, temp3); 1900 masm.addpd(dest, temp1); 1901 masm.addpd(temp5, temp2); 1902 masm.mulsd(temp4, temp3); 1903 masm.movq(temp2, externalAddress(highmaskLogXPtr)); // 0xf8000000, 1904 // 0xffffffff 1905 masm.mulpd(temp3, temp3); 1906 masm.movdqu(temp1, temp8); 1907 masm.pextrw(gpr3, temp8, 3); 1908 masm.mulpd(dest, temp4); 1909 masm.pextrw(gpr1, temp7, 3); 1910 masm.mulpd(temp5, temp4); 1911 masm.mulpd(dest, temp3); 1912 masm.leaq(gpr8, externalAddress(highmaskYPtr)); 1913 masm.movq(temp4, new AMD64Address(gpr8, 8)); // 0x00000000, 1914 // 0xffffffff 1915 masm.pand(temp2, temp7); 1916 masm.addsd(temp5, temp6); 1917 masm.subsd(temp7, temp2); 1918 masm.addpd(temp5, dest); 1919 masm.andl(gpr1, 32752); 1920 masm.subl(gpr1, 16368); 1921 masm.andl(gpr3, 32752); 1922 masm.cmpl(gpr3, 32752); 1923 masm.jcc(ConditionFlag.Equal, bb45); 1924 1925 masm.addl(gpr3, gpr1); 1926 masm.cmpl(gpr3, 16576); 1927 masm.jcc(ConditionFlag.AboveEqual, bb51); 1928 1929 masm.pshufd(dest, temp5, 0xEE); 1930 masm.pand(temp4, temp1); 1931 masm.movdqu(temp3, temp1); 1932 masm.addsd(temp5, dest); 1933 masm.subsd(temp1, temp4); 1934 masm.xorpd(temp6, temp6); 1935 masm.movl(gpr4, 17080); 1936 masm.pinsrw(temp6, gpr4, 3); 1937 masm.addsd(temp7, temp5); 1938 masm.mulsd(temp4, temp2); 1939 masm.mulsd(temp1, temp2); 1940 masm.movdqu(temp5, temp6); 1941 masm.mulsd(temp3, temp7); 1942 masm.addsd(temp6, temp4); 1943 masm.addsd(temp1, temp3); 1944 masm.leaq(gpr8, externalAddress(eCoeffPtr)); 1945 masm.movdqu(temp7, new AMD64Address(gpr8, 0)); // 0xe78a6731, 1946 // 0x3f55d87f, 1947 // 0xd704a0c0, 1948 // 0x3fac6b08 1949 masm.movdl(gpr4, temp6); 1950 masm.subsd(temp6, temp5); 1951 masm.leaq(gpr7, externalAddress(tExpPtr)); 1952 masm.movl(gpr3, gpr4); 1953 masm.andl(gpr4, 255); 1954 masm.addl(gpr4, gpr4); 1955 masm.movdqu(temp5, new AMD64Address(gpr7, gpr4, Scale.Times8, 0)); 1956 masm.movdqu(temp3, new AMD64Address(gpr8, 16)); // 0x6fba4e77, 1957 // 0x3f83b2ab, 1958 // 0xff82c58f, 1959 // 0x3fcebfbd 1960 masm.movq(temp2, new AMD64Address(gpr8, 32)); // 0xfefa39ef, 1961 // 0x3fe62e42 1962 masm.subsd(temp4, temp6); 1963 masm.addsd(temp4, temp1); 1964 masm.pextrw(gpr4, temp6, 3); 1965 masm.shrl(gpr3, 8); 1966 masm.movl(gpr1, gpr3); 1967 masm.shrl(gpr3, 1); 1968 masm.subl(gpr1, gpr3); 1969 masm.shll(gpr3, 20); 1970 masm.movdl(temp6, gpr3); 1971 masm.pshufd(dest, temp4, 0x44); 1972 masm.pshufd(temp1, temp4, 0x44); 1973 masm.mulpd(dest, dest); 1974 masm.mulpd(temp7, temp1); 1975 masm.pshufd(temp6, temp6, 0x11); 1976 masm.mulsd(temp2, temp4); 1977 masm.andl(gpr4, 32767); 1978 masm.cmpl(gpr4, 16529); 1979 masm.jcc(ConditionFlag.Above, bb12); 1980 1981 masm.mulsd(dest, dest); 1982 masm.paddd(temp5, temp6); 1983 masm.addpd(temp3, temp7); 1984 masm.mulsd(temp2, temp5); 1985 masm.pshufd(temp6, temp5, 0xEE); 1986 masm.mulpd(dest, temp3); 1987 masm.addsd(temp2, temp6); 1988 masm.pshufd(temp3, dest, 0xEE); 1989 masm.addl(gpr1, 1023); 1990 masm.shll(gpr1, 20); 1991 masm.orl(gpr1, gpr5); 1992 masm.movdl(temp4, gpr1); 1993 masm.mulsd(dest, temp5); 1994 masm.mulsd(temp3, temp5); 1995 masm.addsd(dest, temp2); 1996 masm.psllq(temp4, 32); 1997 masm.addsd(dest, temp3); 1998 masm.movdqu(temp1, dest); 1999 masm.addsd(dest, temp5); 2000 masm.mulsd(dest, temp4); 2001 masm.pextrw(gpr1, dest, 3); 2002 masm.andl(gpr1, 32752); 2003 masm.jcc(ConditionFlag.Equal, bb13); 2004 2005 masm.cmpl(gpr1, 32752); 2006 masm.jcc(ConditionFlag.Equal, bb14); 2007 2008 masm.jmp(bb56); 2009 2010 masm.bind(bb45); 2011 masm.movdqu(dest, temp10); 2012 masm.xorpd(temp2, temp2); 2013 masm.movl(gpr1, 49136); 2014 masm.pinsrw(temp2, gpr1, 3); 2015 masm.addsd(temp2, dest); 2016 masm.pextrw(gpr1, temp2, 3); 2017 masm.cmpl(gpr1, 0); 2018 masm.jcc(ConditionFlag.NotEqual, bb53); 2019 2020 masm.xorpd(dest, dest); 2021 masm.movl(gpr1, 32760); 2022 masm.pinsrw(dest, gpr1, 3); 2023 masm.jmp(bb56); 2024 2025 masm.bind(bb53); 2026 masm.movdqu(temp1, temp8); 2027 masm.movdl(gpr4, temp1); 2028 masm.movdqu(temp3, temp1); 2029 masm.psrlq(temp3, 20); 2030 masm.movdl(gpr3, temp3); 2031 masm.orl(gpr3, gpr4); 2032 masm.jcc(ConditionFlag.Equal, bb54); 2033 2034 masm.addsd(temp1, temp1); 2035 masm.movdqu(dest, temp1); 2036 masm.jmp(bb56); 2037 2038 masm.bind(bb51); 2039 masm.pextrw(gpr1, temp1, 3); 2040 masm.pextrw(gpr3, temp2, 3); 2041 masm.xorl(gpr1, gpr3); 2042 masm.testl(gpr1, 32768); 2043 masm.jcc(ConditionFlag.Equal, bb47); 2044 2045 masm.jmp(bb46); 2046 2047 masm.bind(bb54); 2048 masm.pextrw(gpr1, dest, 3); 2049 masm.andl(gpr1, 32752); 2050 masm.pextrw(gpr4, temp1, 3); 2051 masm.xorpd(dest, dest); 2052 masm.subl(gpr1, 16368); 2053 masm.xorl(gpr1, gpr4); 2054 masm.testl(gpr1, 32768); 2055 masm.jcc(ConditionFlag.Equal, bb55); 2056 2057 masm.jmp(bb56); 2058 2059 masm.bind(bb55); 2060 masm.movl(gpr4, 32752); 2061 masm.pinsrw(dest, gpr4, 3); 2062 masm.jmp(bb56); 2063 2064 masm.bind(bb56); 2065 } 2066 } | 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 25 package org.graalvm.compiler.lir.amd64; 26 27 import static jdk.vm.ci.amd64.AMD64.xmm0; 28 import static jdk.vm.ci.amd64.AMD64.xmm1; 29 import static org.graalvm.compiler.lir.amd64.AMD64HotSpotHelper.registersToValues; 30 31 import org.graalvm.compiler.core.common.LIRKind; 32 import org.graalvm.compiler.lir.LIRInstructionClass; 33 import org.graalvm.compiler.lir.Variable; 34 import org.graalvm.compiler.lir.gen.LIRGenerator; 35 36 import jdk.vm.ci.amd64.AMD64Kind; 37 import jdk.vm.ci.code.Register; 38 import jdk.vm.ci.code.RegisterValue; 39 import jdk.vm.ci.meta.Value; 40 41 /** 42 * AMD64MathIntrinsicBinaryOp assumes that the input values are stored in the xmm0 and xmm1 43 * registers, and it will emit the output value into the xmm0 register. 44 * {@link #emitLIRWrapper(LIRGenerator, Value, Value)} is provided for emitting necessary mov LIRs 45 * before and after this LIR instruction. 46 */ 47 public abstract class AMD64MathIntrinsicBinaryOp extends AMD64LIRInstruction { 48 49 @Def protected Value output; 50 @Use protected Value input0; 51 @Use protected Value input1; 52 @Temp protected Value[] temps; 53 54 public AMD64MathIntrinsicBinaryOp(LIRInstructionClass<? extends AMD64MathIntrinsicBinaryOp> type, Register... registers) { 55 super(type); 56 57 input0 = xmm0.asValue(LIRKind.value(AMD64Kind.DOUBLE)); 58 input1 = xmm1.asValue(LIRKind.value(AMD64Kind.DOUBLE)); 59 output = xmm0.asValue(LIRKind.value(AMD64Kind.DOUBLE)); 60 61 temps = registersToValues(registers); 62 } 63 64 public final Variable emitLIRWrapper(LIRGenerator gen, Value x, Value y) { 65 LIRKind kind = LIRKind.combine(x, y); 66 RegisterValue xmm0Value = xmm0.asValue(kind); 67 gen.emitMove(xmm0Value, x); 68 RegisterValue xmm1Value = xmm1.asValue(kind); 69 gen.emitMove(xmm1Value, y); 70 gen.append(this); 71 Variable result = gen.newVariable(kind); 72 gen.emitMove(result, xmm0Value); 73 return result; 74 } 75 } |