--- a/hotspot/.mx.jvmci/suite.py Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/.mx.jvmci/suite.py Tue Apr 12 14:17:42 2016 -0400
@@ -83,6 +83,21 @@
"workingSets" : "API,JVMCI",
},
+ "jdk.vm.ci.code.test" : {
+ "subDir" : "test/compiler/jvmci",
+ "sourceDirs" : ["src"],
+ "dependencies" : [
+ "mx:JUNIT",
+ "jdk.vm.ci.amd64",
+ "jdk.vm.ci.sparc",
+ "jdk.vm.ci.code",
+ "jdk.vm.ci.hotspot",
+ ],
+ "checkstyle" : "jdk.vm.ci.services",
+ "javaCompliance" : "1.8",
+ "workingSets" : "API,JVMCI",
+ },
+
"jdk.vm.ci.runtime" : {
"subDir" : "src/jdk.vm.ci/share/classes",
"sourceDirs" : ["src"],
@@ -164,7 +179,7 @@
"subDir" : "test/compiler/jvmci",
"sourceDirs" : ["src"],
"dependencies" : [
- "mx:TESTNG",
+ "TESTNG",
"jdk.vm.ci.hotspot",
],
"checkstyle" : "jdk.vm.ci.services",
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Tue Apr 12 14:17:42 2016 -0400
@@ -4190,55 +4190,6 @@
}
%}
- enc_class aarch64_enc_clear_array_reg_reg(iRegL_R11 cnt, iRegP_R10 base) %{
- MacroAssembler _masm(&cbuf);
- Register cnt_reg = as_Register($cnt$$reg);
- Register base_reg = as_Register($base$$reg);
- // base is word aligned
- // cnt is count of words
-
- Label loop;
- Label entry;
-
-// Algorithm:
-//
-// scratch1 = cnt & 7;
-// cnt -= scratch1;
-// p += scratch1;
-// switch (scratch1) {
-// do {
-// cnt -= 8;
-// p[-8] = 0;
-// case 7:
-// p[-7] = 0;
-// case 6:
-// p[-6] = 0;
-// // ...
-// case 1:
-// p[-1] = 0;
-// case 0:
-// p += 8;
-// } while (cnt);
-// }
-
- const int unroll = 8; // Number of str(zr) instructions we'll unroll
-
- __ andr(rscratch1, cnt_reg, unroll - 1); // tmp1 = cnt % unroll
- __ sub(cnt_reg, cnt_reg, rscratch1); // cnt -= unroll
- // base_reg always points to the end of the region we're about to zero
- __ add(base_reg, base_reg, rscratch1, Assembler::LSL, exact_log2(wordSize));
- __ adr(rscratch2, entry);
- __ sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
- __ br(rscratch2);
- __ bind(loop);
- __ sub(cnt_reg, cnt_reg, unroll);
- for (int i = -unroll; i < 0; i++)
- __ str(zr, Address(base_reg, i * wordSize));
- __ bind(entry);
- __ add(base_reg, base_reg, unroll * wordSize);
- __ cbnz(cnt_reg, loop);
- %}
-
/// mov envcodings
enc_class aarch64_enc_movw_imm(iRegI dst, immI src) %{
@@ -13363,7 +13314,9 @@
ins_cost(4 * INSN_COST);
format %{ "ClearArray $cnt, $base" %}
- ins_encode(aarch64_enc_clear_array_reg_reg(cnt, base));
+ ins_encode %{
+ __ zero_words($base$$Register, $cnt$$Register);
+ %}
ins_pipe(pipe_class_memory);
%}
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2942,6 +2942,10 @@
void LIR_Assembler::membar_storeload() { __ membar(MacroAssembler::StoreLoad); }
+void LIR_Assembler::on_spin_wait() {
+ Unimplemented();
+}
+
void LIR_Assembler::get_thread(LIR_Opr result_reg) {
__ mov(result_reg->as_register(), rthread);
}
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRGenerator_aarch64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRGenerator_aarch64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -1127,7 +1127,7 @@
void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
Values* dims = x->dims();
int i = dims->length();
- LIRItemList* items = new LIRItemList(dims->length(), NULL);
+ LIRItemList* items = new LIRItemList(i, i, NULL);
while (i-- > 0) {
LIRItem* size = new LIRItem(dims->at(i), this);
items->at_put(i, size);
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -4670,6 +4670,61 @@
BLOCK_COMMENT(is_string ? "} string_equals" : "} array_equals");
}
+// base: Address of a buffer to be zeroed, 8 bytes aligned.
+// cnt: Count in 8-byte unit.
+void MacroAssembler::zero_words(Register base, Register cnt)
+{
+ fill_words(base, cnt, zr);
+}
+
+// base: Address of a buffer to be filled, 8 bytes aligned.
+// cnt: Count in 8-byte unit.
+// value: Value to be filled with.
+// base will point to the end of the buffer after filling.
+void MacroAssembler::fill_words(Register base, Register cnt, Register value)
+{
+// Algorithm:
+//
+// scratch1 = cnt & 7;
+// cnt -= scratch1;
+// p += scratch1;
+// switch (scratch1) {
+// do {
+// cnt -= 8;
+// p[-8] = v;
+// case 7:
+// p[-7] = v;
+// case 6:
+// p[-6] = v;
+// // ...
+// case 1:
+// p[-1] = v;
+// case 0:
+// p += 8;
+// } while (cnt);
+// }
+
+ assert_different_registers(base, cnt, value, rscratch1, rscratch2);
+
+ Label entry, loop;
+ const int unroll = 8; // Number of str instructions we'll unroll
+
+ andr(rscratch1, cnt, unroll - 1); // tmp1 = cnt % unroll
+ cbz(rscratch1, entry);
+ sub(cnt, cnt, rscratch1); // cnt -= tmp1
+ // base always points to the end of the region we're about to fill
+ add(base, base, rscratch1, Assembler::LSL, 3);
+ adr(rscratch2, entry);
+ sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
+ br(rscratch2);
+ bind(loop);
+ add(base, base, unroll * 8);
+ sub(cnt, cnt, unroll);
+ for (int i = -unroll; i < 0; i++)
+ str(value, Address(base, i * 8));
+ bind(entry);
+ cbnz(cnt, loop);
+}
// encode char[] to byte[] in ISO_8859_1
void MacroAssembler::encode_iso_array(Register src, Register dst,
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1184,6 +1184,9 @@
Register result, Register cnt1,
int elem_size, bool is_string);
+ void fill_words(Register base, Register cnt, Register value);
+ void zero_words(Register base, Register cnt);
+
void encode_iso_array(Register src, Register dst,
Register len, Register result,
FloatRegister Vtmp1, FloatRegister Vtmp2,
--- a/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2022,6 +2022,136 @@
return start;
}
+ //
+ // Generate stub for array fill. If "aligned" is true, the
+ // "to" address is assumed to be heapword aligned.
+ //
+ // Arguments for generated stub:
+ // to: c_rarg0
+ // value: c_rarg1
+ // count: c_rarg2 treated as signed
+ //
+ address generate_fill(BasicType t, bool aligned, const char *name) {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", name);
+ address start = __ pc();
+
+ BLOCK_COMMENT("Entry:");
+
+ const Register to = c_rarg0; // source array address
+ const Register value = c_rarg1; // value
+ const Register count = c_rarg2; // elements count
+ const Register cnt_words = c_rarg3; // temp register
+
+ __ enter();
+
+ Label L_fill_elements, L_exit1;
+
+ int shift = -1;
+ switch (t) {
+ case T_BYTE:
+ shift = 0;
+ __ cmpw(count, 8 >> shift); // Short arrays (< 8 bytes) fill by element
+ __ bfi(value, value, 8, 8); // 8 bit -> 16 bit
+ __ bfi(value, value, 16, 16); // 16 bit -> 32 bit
+ __ br(Assembler::LO, L_fill_elements);
+ break;
+ case T_SHORT:
+ shift = 1;
+ __ cmpw(count, 8 >> shift); // Short arrays (< 8 bytes) fill by element
+ __ bfi(value, value, 16, 16); // 16 bit -> 32 bit
+ __ br(Assembler::LO, L_fill_elements);
+ break;
+ case T_INT:
+ shift = 2;
+ __ cmpw(count, 8 >> shift); // Short arrays (< 8 bytes) fill by element
+ __ br(Assembler::LO, L_fill_elements);
+ break;
+ default: ShouldNotReachHere();
+ }
+
+ // Align source address at 8 bytes address boundary.
+ Label L_skip_align1, L_skip_align2, L_skip_align4;
+ if (!aligned) {
+ switch (t) {
+ case T_BYTE:
+ // One byte misalignment happens only for byte arrays.
+ __ tbz(to, 0, L_skip_align1);
+ __ strb(value, Address(__ post(to, 1)));
+ __ subw(count, count, 1);
+ __ bind(L_skip_align1);
+ // Fallthrough
+ case T_SHORT:
+ // Two bytes misalignment happens only for byte and short (char) arrays.
+ __ tbz(to, 1, L_skip_align2);
+ __ strh(value, Address(__ post(to, 2)));
+ __ subw(count, count, 2 >> shift);
+ __ bind(L_skip_align2);
+ // Fallthrough
+ case T_INT:
+ // Align to 8 bytes, we know we are 4 byte aligned to start.
+ __ tbz(to, 2, L_skip_align4);
+ __ strw(value, Address(__ post(to, 4)));
+ __ subw(count, count, 4 >> shift);
+ __ bind(L_skip_align4);
+ break;
+ default: ShouldNotReachHere();
+ }
+ }
+
+ //
+ // Fill large chunks
+ //
+ __ lsrw(cnt_words, count, 3 - shift); // number of words
+ __ bfi(value, value, 32, 32); // 32 bit -> 64 bit
+ __ subw(count, count, cnt_words, Assembler::LSL, 3 - shift);
+ __ fill_words(to, cnt_words, value);
+
+ // Remaining count is less than 8 bytes. Fill it by a single store.
+ // Note that the total length is no less than 8 bytes.
+ if (t == T_BYTE || t == T_SHORT) {
+ Label L_exit1;
+ __ cbzw(count, L_exit1);
+ __ add(to, to, count, Assembler::LSL, shift); // points to the end
+ __ str(value, Address(to, -8)); // overwrite some elements
+ __ bind(L_exit1);
+ __ leave();
+ __ ret(lr);
+ }
+
+ // Handle copies less than 8 bytes.
+ Label L_fill_2, L_fill_4, L_exit2;
+ __ bind(L_fill_elements);
+ switch (t) {
+ case T_BYTE:
+ __ tbz(count, 0, L_fill_2);
+ __ strb(value, Address(__ post(to, 1)));
+ __ bind(L_fill_2);
+ __ tbz(count, 1, L_fill_4);
+ __ strh(value, Address(__ post(to, 2)));
+ __ bind(L_fill_4);
+ __ tbz(count, 2, L_exit2);
+ __ strw(value, Address(to));
+ break;
+ case T_SHORT:
+ __ tbz(count, 0, L_fill_4);
+ __ strh(value, Address(__ post(to, 2)));
+ __ bind(L_fill_4);
+ __ tbz(count, 1, L_exit2);
+ __ strw(value, Address(to));
+ break;
+ case T_INT:
+ __ cbzw(count, L_exit2);
+ __ strw(value, Address(to));
+ break;
+ default: ShouldNotReachHere();
+ }
+ __ bind(L_exit2);
+ __ leave();
+ __ ret(lr);
+ return start;
+ }
+
void generate_arraycopy_stubs() {
address entry;
address entry_jbyte_arraycopy;
@@ -2125,6 +2255,12 @@
entry_jlong_arraycopy,
entry_checkcast_arraycopy);
+ StubRoutines::_jbyte_fill = generate_fill(T_BYTE, false, "jbyte_fill");
+ StubRoutines::_jshort_fill = generate_fill(T_SHORT, false, "jshort_fill");
+ StubRoutines::_jint_fill = generate_fill(T_INT, false, "jint_fill");
+ StubRoutines::_arrayof_jbyte_fill = generate_fill(T_BYTE, true, "arrayof_jbyte_fill");
+ StubRoutines::_arrayof_jshort_fill = generate_fill(T_SHORT, true, "arrayof_jshort_fill");
+ StubRoutines::_arrayof_jint_fill = generate_fill(T_INT, true, "arrayof_jint_fill");
}
void generate_math_stubs() { Unimplemented(); }
--- a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2845,6 +2845,9 @@
__ membar(Assembler::StoreLoad);
}
+void LIR_Assembler::on_spin_wait() {
+ Unimplemented();
+}
void LIR_Assembler::leal(LIR_Opr addr_opr, LIR_Opr dest) {
LIR_Address* addr = addr_opr->as_address_ptr();
--- a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2015 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -1055,7 +1055,7 @@
void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
Values* dims = x->dims();
int i = dims->length();
- LIRItemList* items = new LIRItemList(dims->length(), NULL);
+ LIRItemList* items = new LIRItemList(i, i, NULL);
while (i-- > 0) {
LIRItem* size = new LIRItem(dims->at(i), this);
items->at_put(i, size);
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -3313,6 +3313,9 @@
__ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
}
+void LIR_Assembler::on_spin_wait() {
+ Unimplemented();
+}
// Pack two sequential registers containing 32 bit values
// into a single 64 bit register.
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1033,7 +1033,7 @@
void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
Values* dims = x->dims();
int i = dims->length();
- LIRItemList* items = new LIRItemList(dims->length(), NULL);
+ LIRItemList* items = new LIRItemList(i, i, NULL);
while (i-- > 0) {
LIRItem* size = new LIRItem(dims->at(i), this);
items->at_put(i, size);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1827,6 +1827,15 @@
emit_int8((unsigned char)(0xC0 | encode));
}
+void Assembler::cvttpd2dq(XMMRegister dst, XMMRegister src) {
+ NOT_LP64(assert(VM_Version::supports_sse2(), ""));
+ int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;
+ InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
+ emit_int8((unsigned char)0xE6);
+ emit_int8((unsigned char)(0xC0 | encode));
+}
+
void Assembler::decl(Address dst) {
// Don't use it directly. Use MacroAssembler::decrement() instead.
InstructionMark im(this);
@@ -4993,7 +5002,7 @@
}
void Assembler::phaddw(XMMRegister dst, XMMRegister src) {
- NOT_LP64(assert(VM_Version::supports_sse3(), ""));
+ assert(VM_Version::supports_sse3(), "");
InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x01);
@@ -5001,7 +5010,7 @@
}
void Assembler::phaddd(XMMRegister dst, XMMRegister src) {
- NOT_LP64(assert(VM_Version::supports_sse3(), ""));
+ assert(VM_Version::supports_sse3(), "");
InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x02);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1048,6 +1048,8 @@
void cvttss2sil(Register dst, XMMRegister src);
void cvttss2siq(Register dst, XMMRegister src);
+ void cvttpd2dq(XMMRegister dst, XMMRegister src);
+
// Divide Scalar Double-Precision Floating-Point Values
void divsd(XMMRegister dst, Address src);
void divsd(XMMRegister dst, XMMRegister src);
--- a/hotspot/src/cpu/x86/vm/c1_FpuStackSim_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_FpuStackSim_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -169,18 +169,18 @@
intArray* FpuStackSim::write_state() {
intArray* res = new intArray(1 + FrameMap::nof_fpu_regs);
- (*res)[0] = stack_size();
+ res->append(stack_size());
for (int i = 0; i < FrameMap::nof_fpu_regs; i++) {
- (*res)[1 + i] = regs_at(i);
+ res->append(regs_at(i));
}
return res;
}
void FpuStackSim::read_state(intArray* fpu_stack_state) {
- _stack_size = (*fpu_stack_state)[0];
+ _stack_size = fpu_stack_state->at(0);
for (int i = 0; i < FrameMap::nof_fpu_regs; i++) {
- set_regs_at(i, (*fpu_stack_state)[1 + i]);
+ set_regs_at(i, fpu_stack_state->at(1 + i));
}
}
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2365,13 +2365,8 @@
} else if (value->is_double_fpu()) {
assert(value->fpu_regnrLo() == 0 && dest->fpu_regnrLo() == 0, "both must be on TOS");
switch(code) {
- case lir_log10 : __ flog10() ; break;
case lir_abs : __ fabs() ; break;
case lir_sqrt : __ fsqrt(); break;
- case lir_tan :
- // Should consider not saving rbx, if not necessary
- __ trigfunc('t', op->as_Op2()->fpu_stack_size());
- break;
default : ShouldNotReachHere();
}
} else {
@@ -3886,6 +3881,10 @@
__ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
}
+void LIR_Assembler::on_spin_wait() {
+ __ pause ();
+}
+
void LIR_Assembler::get_thread(LIR_Opr result_reg) {
assert(result_reg->is_register(), "check");
#ifdef _LP64
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -812,7 +812,8 @@
if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog ||
x->id() == vmIntrinsics::_dpow || x->id() == vmIntrinsics::_dcos ||
- x->id() == vmIntrinsics::_dsin) {
+ x->id() == vmIntrinsics::_dsin || x->id() == vmIntrinsics::_dtan ||
+ x->id() == vmIntrinsics::_dlog10) {
do_LibmIntrinsic(x);
return;
}
@@ -820,58 +821,17 @@
LIRItem value(x->argument_at(0), this);
bool use_fpu = false;
- if (UseSSE >= 2) {
- switch(x->id()) {
- case vmIntrinsics::_dtan:
- case vmIntrinsics::_dlog10:
- use_fpu = true;
- break;
- }
- } else {
+ if (UseSSE < 2) {
value.set_destroys_register();
}
-
value.load_item();
LIR_Opr calc_input = value.result();
- LIR_Opr calc_input2 = NULL;
- if (x->id() == vmIntrinsics::_dpow) {
- LIRItem extra_arg(x->argument_at(1), this);
- if (UseSSE < 2) {
- extra_arg.set_destroys_register();
- }
- extra_arg.load_item();
- calc_input2 = extra_arg.result();
- }
LIR_Opr calc_result = rlock_result(x);
- // sin, cos, pow and exp need two free fpu stack slots, so register
- // two temporary operands
- LIR_Opr tmp1 = FrameMap::caller_save_fpu_reg_at(0);
- LIR_Opr tmp2 = FrameMap::caller_save_fpu_reg_at(1);
-
- if (use_fpu) {
- LIR_Opr tmp = FrameMap::fpu0_double_opr;
- int tmp_start = 1;
- if (calc_input2 != NULL) {
- __ move(calc_input2, tmp);
- tmp_start = 2;
- calc_input2 = tmp;
- }
- __ move(calc_input, tmp);
-
- calc_input = tmp;
- calc_result = tmp;
-
- tmp1 = FrameMap::caller_save_fpu_reg_at(tmp_start);
- tmp2 = FrameMap::caller_save_fpu_reg_at(tmp_start + 1);
- }
-
switch(x->id()) {
case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break;
case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break;
- case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break;
- case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break;
default: ShouldNotReachHere();
}
@@ -912,21 +872,28 @@
result_reg = tmp;
switch(x->id()) {
case vmIntrinsics::_dexp:
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dexp() != NULL) {
__ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args());
} else {
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dexp), getThreadTemp(), result_reg, cc->args());
}
break;
case vmIntrinsics::_dlog:
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dlog() != NULL) {
__ call_runtime_leaf(StubRoutines::dlog(), getThreadTemp(), result_reg, cc->args());
} else {
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog), getThreadTemp(), result_reg, cc->args());
}
break;
+ case vmIntrinsics::_dlog10:
+ if (StubRoutines::dlog10() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dlog10(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
case vmIntrinsics::_dpow:
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dpow() != NULL) {
__ call_runtime_leaf(StubRoutines::dpow(), getThreadTemp(), result_reg, cc->args());
} else {
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dpow), getThreadTemp(), result_reg, cc->args());
@@ -946,18 +913,44 @@
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), getThreadTemp(), result_reg, cc->args());
}
break;
+ case vmIntrinsics::_dtan:
+ if (StubRoutines::dtan() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dtan(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
default: ShouldNotReachHere();
}
#else
switch (x->id()) {
case vmIntrinsics::_dexp:
- __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args());
+ if (StubRoutines::dexp() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dexp), getThreadTemp(), result_reg, cc->args());
+ }
break;
case vmIntrinsics::_dlog:
+ if (StubRoutines::dlog() != NULL) {
__ call_runtime_leaf(StubRoutines::dlog(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
+ case vmIntrinsics::_dlog10:
+ if (StubRoutines::dlog10() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dlog10(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
+ }
break;
case vmIntrinsics::_dpow:
+ if (StubRoutines::dpow() != NULL) {
__ call_runtime_leaf(StubRoutines::dpow(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dpow), getThreadTemp(), result_reg, cc->args());
+ }
break;
case vmIntrinsics::_dsin:
if (StubRoutines::dsin() != NULL) {
@@ -973,6 +966,13 @@
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), getThreadTemp(), result_reg, cc->args());
}
break;
+ case vmIntrinsics::_dtan:
+ if (StubRoutines::dtan() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dtan(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
default: ShouldNotReachHere();
}
#endif // _LP64
@@ -1260,7 +1260,7 @@
void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
Values* dims = x->dims();
int i = dims->length();
- LIRItemList* items = new LIRItemList(dims->length(), NULL);
+ LIRItemList* items = new LIRItemList(i, i, NULL);
while (i-- > 0) {
LIRItem* size = new LIRItem(dims->at(i), this);
items->at_put(i, size);
--- a/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -786,58 +786,6 @@
break;
}
- case lir_log10: {
- // log and log10 need one temporary fpu stack slot, so
- // there is one temporary registers stored in temp of the
- // operation. the stack allocator must guarantee that the stack
- // slots are really free, otherwise there might be a stack
- // overflow.
- assert(right->is_illegal(), "must be");
- assert(left->is_fpu_register(), "must be");
- assert(res->is_fpu_register(), "must be");
- assert(op2->tmp1_opr()->is_fpu_register(), "must be");
-
- insert_free_if_dead(op2->tmp1_opr());
- insert_free_if_dead(res, left);
- insert_exchange(left);
- do_rename(left, res);
-
- new_left = to_fpu_stack_top(res);
- new_res = new_left;
-
- op2->set_fpu_stack_size(sim()->stack_size());
- assert(sim()->stack_size() <= 7, "at least one stack slot must be free");
- break;
- }
-
-
- case lir_tan: {
- // sin, cos and exp need two temporary fpu stack slots, so there are two temporary
- // registers (stored in right and temp of the operation).
- // the stack allocator must guarantee that the stack slots are really free,
- // otherwise there might be a stack overflow.
- assert(left->is_fpu_register(), "must be");
- assert(res->is_fpu_register(), "must be");
- // assert(left->is_last_use(), "old value gets destroyed");
- assert(right->is_fpu_register(), "right is used as the first temporary register");
- assert(op2->tmp1_opr()->is_fpu_register(), "temp is used as the second temporary register");
- assert(fpu_num(left) != fpu_num(right) && fpu_num(right) != fpu_num(op2->tmp1_opr()) && fpu_num(op2->tmp1_opr()) != fpu_num(res), "need distinct temp registers");
-
- insert_free_if_dead(right);
- insert_free_if_dead(op2->tmp1_opr());
-
- insert_free_if_dead(res, left);
- insert_exchange(left);
- do_rename(left, res);
-
- new_left = to_fpu_stack_top(res);
- new_res = new_left;
-
- op2->set_fpu_stack_size(sim()->stack_size());
- assert(sim()->stack_size() <= 6, "at least two stack slots must be free");
- break;
- }
-
default: {
assert(false, "missed a fpu-operation");
}
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -194,9 +194,6 @@
product(bool, UseBMI2Instructions, false, \
"Use BMI2 instructions") \
\
- diagnostic(bool, UseLibmSinIntrinsic, true, \
- "Use Libm Sin Intrinsic") \
- \
- diagnostic(bool, UseLibmCosIntrinsic, true, \
- "Use Libm Cos Intrinsic")
+ diagnostic(bool, UseLibmIntrinsic, true, \
+ "Use Libm Intrinsics")
#endif // CPU_X86_VM_GLOBALS_X86_HPP
--- a/hotspot/src/cpu/x86/vm/macroAssembler_libm_x86_32.cpp Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4571 +0,0 @@
-/*
- * Copyright (c) 2015, Intel Corporation.
- * Intel Math Library (LIBM) Source Code
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-#include "asm/assembler.hpp"
-#include "asm/assembler.inline.hpp"
-#include "runtime/stubRoutines.hpp"
-#include "macroAssembler_x86.hpp"
-
-#ifdef _MSC_VER
-#define ALIGNED_(x) __declspec(align(x))
-#else
-#define ALIGNED_(x) __attribute__ ((aligned(x)))
-#endif
-
-// The 32 bit code is at most SSE2 compliant
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - EXP()
-// ---------------------
-//
-// Description:
-// Let K = 64 (table size).
-// x x/log(2) n
-// e = 2 = 2 * T[j] * (1 + P(y))
-// where
-// x = m*log(2)/K + y, y in [-log(2)/K..log(2)/K]
-// m = n*K + j, m,n,j - signed integer, j in [-K/2..K/2]
-// j/K
-// values of 2 are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
-//
-// P(y) is a minimax polynomial approximation of exp(x)-1
-// on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
-//
-// To avoid problems with arithmetic overflow and underflow,
-// n n1 n2
-// value of 2 is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
-// where BIAS is a value of exponent bias.
-//
-// Special cases:
-// exp(NaN) = NaN
-// exp(+INF) = +INF
-// exp(-INF) = 0
-// exp(x) = 1 for subnormals
-// for finite argument, only exp(0)=1 is exact
-// For IEEE double
-// if x > 709.782712893383973096 then exp(x) overflow
-// if x < -745.133219101941108420 then exp(x) underflow
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _static_const_table[] =
-{
- 0x00000000UL, 0xfff00000UL, 0x00000000UL, 0xfff00000UL, 0xffffffc0UL,
- 0x00000000UL, 0xffffffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL,
- 0x0000ffc0UL, 0x00000000UL, 0x00000000UL, 0x43380000UL, 0x00000000UL,
- 0x43380000UL, 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL,
- 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL, 0xbc9e3b3aUL,
- 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xfffffffeUL, 0x3fdfffffUL,
- 0xfffffffeUL, 0x3fdfffffUL, 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL,
- 0x3fa55555UL, 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0e03754dUL,
- 0x3cad7bbfUL, 0x3e778060UL, 0x00002c9aUL, 0x3567f613UL, 0x3c8cd252UL,
- 0xd3158574UL, 0x000059b0UL, 0x61e6c861UL, 0x3c60f74eUL, 0x18759bc8UL,
- 0x00008745UL, 0x5d837b6cUL, 0x3c979aa6UL, 0x6cf9890fUL, 0x0000b558UL,
- 0x702f9cd1UL, 0x3c3ebe3dUL, 0x32d3d1a2UL, 0x0000e3ecUL, 0x1e63bcd8UL,
- 0x3ca3516eUL, 0xd0125b50UL, 0x00011301UL, 0x26f0387bUL, 0x3ca4c554UL,
- 0xaea92ddfUL, 0x0001429aUL, 0x62523fb6UL, 0x3ca95153UL, 0x3c7d517aUL,
- 0x000172b8UL, 0x3f1353bfUL, 0x3c8b898cUL, 0xeb6fcb75UL, 0x0001a35bUL,
- 0x3e3a2f5fUL, 0x3c9aecf7UL, 0x3168b9aaUL, 0x0001d487UL, 0x44a6c38dUL,
- 0x3c8a6f41UL, 0x88628cd6UL, 0x0002063bUL, 0xe3a8a894UL, 0x3c968efdUL,
- 0x6e756238UL, 0x0002387aUL, 0x981fe7f2UL, 0x3c80472bUL, 0x65e27cddUL,
- 0x00026b45UL, 0x6d09ab31UL, 0x3c82f7e1UL, 0xf51fdee1UL, 0x00029e9dUL,
- 0x720c0ab3UL, 0x3c8b3782UL, 0xa6e4030bUL, 0x0002d285UL, 0x4db0abb6UL,
- 0x3c834d75UL, 0x0a31b715UL, 0x000306feUL, 0x5dd3f84aUL, 0x3c8fdd39UL,
- 0xb26416ffUL, 0x00033c08UL, 0xcc187d29UL, 0x3ca12f8cUL, 0x373aa9caUL,
- 0x000371a7UL, 0x738b5e8bUL, 0x3ca7d229UL, 0x34e59ff6UL, 0x0003a7dbUL,
- 0xa72a4c6dUL, 0x3c859f48UL, 0x4c123422UL, 0x0003dea6UL, 0x259d9205UL,
- 0x3ca8b846UL, 0x21f72e29UL, 0x0004160aUL, 0x60c2ac12UL, 0x3c4363edUL,
- 0x6061892dUL, 0x00044e08UL, 0xdaa10379UL, 0x3c6ecce1UL, 0xb5c13cd0UL,
- 0x000486a2UL, 0xbb7aafb0UL, 0x3c7690ceUL, 0xd5362a27UL, 0x0004bfdaUL,
- 0x9b282a09UL, 0x3ca083ccUL, 0x769d2ca6UL, 0x0004f9b2UL, 0xc1aae707UL,
- 0x3ca509b0UL, 0x569d4f81UL, 0x0005342bUL, 0x18fdd78eUL, 0x3c933505UL,
- 0x36b527daUL, 0x00056f47UL, 0xe21c5409UL, 0x3c9063e1UL, 0xdd485429UL,
- 0x0005ab07UL, 0x2b64c035UL, 0x3c9432e6UL, 0x15ad2148UL, 0x0005e76fUL,
- 0x99f08c0aUL, 0x3ca01284UL, 0xb03a5584UL, 0x0006247eUL, 0x0073dc06UL,
- 0x3c99f087UL, 0x82552224UL, 0x00066238UL, 0x0da05571UL, 0x3c998d4dUL,
- 0x667f3bccUL, 0x0006a09eUL, 0x86ce4786UL, 0x3ca52bb9UL, 0x3c651a2eUL,
- 0x0006dfb2UL, 0x206f0dabUL, 0x3ca32092UL, 0xe8ec5f73UL, 0x00071f75UL,
- 0x8e17a7a6UL, 0x3ca06122UL, 0x564267c8UL, 0x00075febUL, 0x461e9f86UL,
- 0x3ca244acUL, 0x73eb0186UL, 0x0007a114UL, 0xabd66c55UL, 0x3c65ebe1UL,
- 0x36cf4e62UL, 0x0007e2f3UL, 0xbbff67d0UL, 0x3c96fe9fUL, 0x994cce12UL,
- 0x00082589UL, 0x14c801dfUL, 0x3c951f14UL, 0x9b4492ecUL, 0x000868d9UL,
- 0xc1f0eab4UL, 0x3c8db72fUL, 0x422aa0dbUL, 0x0008ace5UL, 0x59f35f44UL,
- 0x3c7bf683UL, 0x99157736UL, 0x0008f1aeUL, 0x9c06283cUL, 0x3ca360baUL,
- 0xb0cdc5e4UL, 0x00093737UL, 0x20f962aaUL, 0x3c95e8d1UL, 0x9fde4e4fUL,
- 0x00097d82UL, 0x2b91ce27UL, 0x3c71affcUL, 0x82a3f090UL, 0x0009c491UL,
- 0x589a2ebdUL, 0x3c9b6d34UL, 0x7b5de564UL, 0x000a0c66UL, 0x9ab89880UL,
- 0x3c95277cUL, 0xb23e255cUL, 0x000a5503UL, 0x6e735ab3UL, 0x3c846984UL,
- 0x5579fdbfUL, 0x000a9e6bUL, 0x92cb3387UL, 0x3c8c1a77UL, 0x995ad3adUL,
- 0x000ae89fUL, 0xdc2d1d96UL, 0x3ca22466UL, 0xb84f15faUL, 0x000b33a2UL,
- 0xb19505aeUL, 0x3ca1112eUL, 0xf2fb5e46UL, 0x000b7f76UL, 0x0a5fddcdUL,
- 0x3c74ffd7UL, 0x904bc1d2UL, 0x000bcc1eUL, 0x30af0cb3UL, 0x3c736eaeUL,
- 0xdd85529cUL, 0x000c199bUL, 0xd10959acUL, 0x3c84e08fUL, 0x2e57d14bUL,
- 0x000c67f1UL, 0x6c921968UL, 0x3c676b2cUL, 0xdcef9069UL, 0x000cb720UL,
- 0x36df99b3UL, 0x3c937009UL, 0x4a07897bUL, 0x000d072dUL, 0xa63d07a7UL,
- 0x3c74a385UL, 0xdcfba487UL, 0x000d5818UL, 0xd5c192acUL, 0x3c8e5a50UL,
- 0x03db3285UL, 0x000da9e6UL, 0x1c4a9792UL, 0x3c98bb73UL, 0x337b9b5eUL,
- 0x000dfc97UL, 0x603a88d3UL, 0x3c74b604UL, 0xe78b3ff6UL, 0x000e502eUL,
- 0x92094926UL, 0x3c916f27UL, 0xa2a490d9UL, 0x000ea4afUL, 0x41aa2008UL,
- 0x3c8ec3bcUL, 0xee615a27UL, 0x000efa1bUL, 0x31d185eeUL, 0x3c8a64a9UL,
- 0x5b6e4540UL, 0x000f5076UL, 0x4d91cd9dUL, 0x3c77893bUL, 0x819e90d8UL,
- 0x000fa7c1UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x7ff00000UL,
- 0x00000000UL, 0x00000000UL, 0xffffffffUL, 0x7fefffffUL, 0x00000000UL,
- 0x00100000UL
-};
-
-//registers,
-// input: (rbp + 8)
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, rbx (tmp)
-
-// Code generated by Intel C compiler for LIBM library
-
-void MacroAssembler::fast_exp(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
- Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
-
- assert_different_registers(tmp, eax, ecx, edx);
- jmp(start);
- address static_const_table = (address)_static_const_table;
-
- bind(start);
- subl(rsp, 120);
- movl(Address(rsp, 64), tmp);
- lea(tmp, ExternalAddress(static_const_table));
- movdqu(xmm0, Address(rsp, 128));
- unpcklpd(xmm0, xmm0);
- movdqu(xmm1, Address(tmp, 64)); // 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL
- movdqu(xmm6, Address(tmp, 48)); // 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
- movdqu(xmm2, Address(tmp, 80)); // 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL
- movdqu(xmm3, Address(tmp, 96)); // 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- movl(edx, 16527);
- subl(edx, eax);
- subl(eax, 15504);
- orl(edx, eax);
- cmpl(edx, INT_MIN);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
- mulpd(xmm1, xmm0);
- addpd(xmm1, xmm6);
- movapd(xmm7, xmm1);
- subpd(xmm1, xmm6);
- mulpd(xmm2, xmm1);
- movdqu(xmm4, Address(tmp, 128)); // 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL
- mulpd(xmm3, xmm1);
- movdqu(xmm5, Address(tmp, 144)); // 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
- subpd(xmm0, xmm2);
- movdl(eax, xmm7);
- movl(ecx, eax);
- andl(ecx, 63);
- shll(ecx, 4);
- sarl(eax, 6);
- movl(edx, eax);
- movdqu(xmm6, Address(tmp, 16)); // 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
- pand(xmm7, xmm6);
- movdqu(xmm6, Address(tmp, 32)); // 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
- paddq(xmm7, xmm6);
- psllq(xmm7, 46);
- subpd(xmm0, xmm3);
- movdqu(xmm2, Address(tmp, ecx, Address::times_1, 160));
- mulpd(xmm4, xmm0);
- movapd(xmm6, xmm0);
- movapd(xmm1, xmm0);
- mulpd(xmm6, xmm6);
- mulpd(xmm0, xmm6);
- addpd(xmm5, xmm4);
- mulsd(xmm0, xmm6);
- mulpd(xmm6, Address(tmp, 112)); // 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL, 0x3fdfffffUL
- addsd(xmm1, xmm2);
- unpckhpd(xmm2, xmm2);
- mulpd(xmm0, xmm5);
- addsd(xmm1, xmm0);
- por(xmm2, xmm7);
- unpckhpd(xmm0, xmm0);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm6);
- addl(edx, 894);
- cmpl(edx, 1916);
- jcc (Assembler::above, L_2TAG_PACKET_1_0_2);
- mulsd(xmm0, xmm2);
- addsd(xmm0, xmm2);
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_1_0_2);
- fnstcw(Address(rsp, 24));
- movzwl(edx, Address(rsp, 24));
- orl(edx, 768);
- movw(Address(rsp, 28), edx);
- fldcw(Address(rsp, 28));
- movl(edx, eax);
- sarl(eax, 1);
- subl(edx, eax);
- movdqu(xmm6, Address(tmp, 0)); // 0x00000000UL, 0xfff00000UL, 0x00000000UL, 0xfff00000UL
- pandn(xmm6, xmm2);
- addl(eax, 1023);
- movdl(xmm3, eax);
- psllq(xmm3, 52);
- por(xmm6, xmm3);
- addl(edx, 1023);
- movdl(xmm4, edx);
- psllq(xmm4, 52);
- movsd(Address(rsp, 8), xmm0);
- fld_d(Address(rsp, 8));
- movsd(Address(rsp, 16), xmm6);
- fld_d(Address(rsp, 16));
- fmula(1);
- faddp(1);
- movsd(Address(rsp, 8), xmm4);
- fld_d(Address(rsp, 8));
- fmulp(1);
- fstp_d(Address(rsp, 8));
- movsd(xmm0,Address(rsp, 8));
- fldcw(Address(rsp, 24));
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32752);
- cmpl(ecx, 32752);
- jcc(Assembler::greaterEqual, L_2TAG_PACKET_3_0_2);
- cmpl(ecx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
- jmp(L_2TAG_PACKET_2_0_2);
- cmpl(ecx, INT_MIN);
- jcc(Assembler::less, L_2TAG_PACKET_3_0_2);
- cmpl(ecx, -1064950997);
- jcc(Assembler::less, L_2TAG_PACKET_2_0_2);
- jcc(Assembler::greater, L_2TAG_PACKET_4_0_2);
- movl(edx, Address(rsp, 128));
- cmpl(edx ,-17155601);
- jcc(Assembler::less, L_2TAG_PACKET_2_0_2);
- jmp(L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_3_0_2);
- movl(edx, 14);
- jmp(L_2TAG_PACKET_5_0_2);
-
- bind(L_2TAG_PACKET_4_0_2);
- movl(edx, 15);
-
- bind(L_2TAG_PACKET_5_0_2);
- movsd(Address(rsp, 0), xmm0);
- movsd(xmm0, Address(rsp, 128));
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_7_0_2);
- cmpl(eax, 2146435072);
- jcc(Assembler::greaterEqual, L_2TAG_PACKET_8_0_2);
- movl(eax, Address(rsp, 132));
- cmpl(eax, INT_MIN);
- jcc(Assembler::greaterEqual, L_2TAG_PACKET_9_0_2);
- movsd(xmm0, Address(tmp, 1208)); // 0xffffffffUL, 0x7fefffffUL
- mulsd(xmm0, xmm0);
- movl(edx, 14);
- jmp(L_2TAG_PACKET_5_0_2);
-
- bind(L_2TAG_PACKET_9_0_2);
- movsd(xmm0, Address(tmp, 1216));
- mulsd(xmm0, xmm0);
- movl(edx, 15);
- jmp(L_2TAG_PACKET_5_0_2);
-
- bind(L_2TAG_PACKET_8_0_2);
- movl(edx, Address(rsp, 128));
- cmpl(eax, 2146435072);
- jcc(Assembler::above, L_2TAG_PACKET_10_0_2);
- cmpl(edx, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_2);
- movl(eax, Address(rsp, 132));
- cmpl(eax, 2146435072);
- jcc(Assembler::notEqual, L_2TAG_PACKET_11_0_2);
- movsd(xmm0, Address(tmp, 1192)); // 0x00000000UL, 0x7ff00000UL
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_11_0_2);
- movsd(xmm0, Address(tmp, 1200)); // 0x00000000UL, 0x00000000UL
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_10_0_2);
- movsd(xmm0, Address(rsp, 128));
- addsd(xmm0, xmm0);
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_0_0_2);
- movl(eax, Address(rsp, 132));
- andl(eax, 2147483647);
- cmpl(eax, 1083179008);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_7_0_2);
- movsd(xmm0, Address(rsp, 128));
- addsd(xmm0, Address(tmp, 1184)); // 0x00000000UL, 0x3ff00000UL
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movsd(Address(rsp, 48), xmm0);
- fld_d(Address(rsp, 48));
-
- bind(L_2TAG_PACKET_6_0_2);
- movl(tmp, Address(rsp, 64));
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - LOG()
-// ---------------------
-//
-// x=2^k * mx, mx in [1,2)
-//
-// Get B~1/mx based on the output of rcpss instruction (B0)
-// B = int((B0*2^7+0.5))/2^7
-//
-// Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
-//
-// Result: k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6) and
-// p(r) is a degree 7 polynomial
-// -log(B) read from data table (high, low parts)
-// Result is formed from high and low parts
-//
-// Special cases:
-// log(NaN) = quiet NaN, and raise invalid exception
-// log(+INF) = that INF
-// log(0) = -INF with divide-by-zero exception raised
-// log(1) = +0
-// log(x) = NaN with invalid exception raised if x < -0, including -INF
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _static_const_table_log[] =
-{
- 0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
- 0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
- 0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
- 0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
- 0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
- 0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
- 0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
- 0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
- 0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
- 0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
- 0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
- 0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
- 0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
- 0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
- 0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
- 0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
- 0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
- 0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
- 0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
- 0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
- 0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
- 0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
- 0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
- 0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
- 0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
- 0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
- 0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
- 0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
- 0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
- 0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
- 0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
- 0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
- 0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
- 0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
- 0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
- 0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
- 0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
- 0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
- 0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
- 0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
- 0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
- 0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
- 0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
- 0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
- 0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
- 0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
- 0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
- 0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
- 0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
- 0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
- 0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
- 0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
- 0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
- 0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
- 0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
- 0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
- 0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
- 0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
- 0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
- 0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
- 0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
- 0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
- 0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
- 0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
- 0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
- 0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
- 0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
- 0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
- 0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
- 0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
- 0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
- 0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
- 0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
- 0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
- 0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
- 0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
- 0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
- 0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
- 0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
- 0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
- 0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
- 0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
- 0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
- 0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
- 0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
- 0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
- 0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
- 0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
- 0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
- 0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
- 0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
- 0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
- 0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
- 0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
- 0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
- 0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
- 0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
- 0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
- 0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
- 0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
- 0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
- 0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
- 0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x80000000UL, 0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL,
- 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
- 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
- 0x00000000UL, 0xbfe00000UL, 0x00000000UL, 0xffffe000UL, 0x00000000UL,
- 0xffffe000UL
-};
-//registers,
-// input: xmm0
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, rbx (tmp)
-
-void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2;
- Label L_2TAG_PACKET_10_0_2, start;
-
- assert_different_registers(tmp, eax, ecx, edx);
- jmp(start);
- address static_const_table = (address)_static_const_table_log;
-
- bind(start);
- subl(rsp, 104);
- movl(Address(rsp, 40), tmp);
- lea(tmp, ExternalAddress(static_const_table));
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- xorpd(xmm3, xmm3);
- movl(edx, 30704);
- pinsrw(xmm3, edx, 3);
- movsd(xmm0, Address(rsp, 112));
- movapd(xmm1, xmm0);
- movl(ecx, 32768);
- movdl(xmm4, ecx);
- movsd(xmm5, Address(tmp, 2128)); // 0x00000000UL, 0xffffe000UL
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- psllq(xmm0, 5);
- movl(ecx, 16352);
- psrlq(xmm0, 34);
- rcpss(xmm0, xmm0);
- psllq(xmm1, 12);
- pshufd(xmm6, xmm5, 228);
- psrlq(xmm1, 12);
- subl(eax, 16);
- cmpl(eax, 32736);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
-
- bind(L_2TAG_PACKET_1_0_2);
- paddd(xmm0, xmm4);
- por(xmm1, xmm3);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm1);
- pand(xmm0, xmm6);
- subsd(xmm1, xmm5);
- mulpd(xmm5, xmm0);
- andl(eax, 32752);
- subl(eax, ecx);
- cvtsi2sdl(xmm7, eax);
- mulsd(xmm1, xmm0);
- movsd(xmm6, Address(tmp, 2064)); // 0xfefa3800UL, 0x3fa62e42UL
- movdqu(xmm3, Address(tmp, 2080)); // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
- subsd(xmm5, xmm2);
- andl(edx, 16711680);
- shrl(edx, 12);
- movdqu(xmm0, Address(tmp, edx));
- movdqu(xmm4, Address(tmp, 2096)); // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
- addsd(xmm1, xmm5);
- movdqu(xmm2, Address(tmp, 2112)); // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
- mulsd(xmm6, xmm7);
- pshufd(xmm5, xmm1, 68);
- mulsd(xmm7, Address(tmp, 2072)); // 0x93c76730UL, 0x3ceef357UL, 0x92492492UL, 0x3fc24924UL
- mulsd(xmm3, xmm1);
- addsd(xmm0, xmm6);
- mulpd(xmm4, xmm5);
- mulpd(xmm5, xmm5);
- pshufd(xmm6, xmm0, 228);
- addsd(xmm0, xmm1);
- addpd(xmm4, xmm2);
- mulpd(xmm3, xmm5);
- subsd(xmm6, xmm0);
- mulsd(xmm4, xmm1);
- pshufd(xmm2, xmm0, 238);
- addsd(xmm1, xmm6);
- mulsd(xmm5, xmm5);
- addsd(xmm7, xmm2);
- addpd(xmm4, xmm3);
- addsd(xmm1, xmm7);
- mulpd(xmm4, xmm5);
- addsd(xmm1, xmm4);
- pshufd(xmm5, xmm4, 238);
- addsd(xmm1, xmm5);
- addsd(xmm0, xmm1);
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_0_0_2);
- movsd(xmm0, Address(rsp, 112));
- movdqu(xmm1, xmm0);
- addl(eax, 16);
- cmpl(eax, 32768);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_3_0_2);
- cmpl(eax, 16);
- jcc(Assembler::below, L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_5_0_2);
- addsd(xmm0, xmm0);
- jmp(L_2TAG_PACKET_2_0_2);
-
- bind(L_2TAG_PACKET_6_0_2);
- jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
- cmpl(edx, 0);
- jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
- jmp(L_2TAG_PACKET_7_0_2);
-
- bind(L_2TAG_PACKET_3_0_2);
- movdl(edx, xmm1);
- psrlq(xmm1, 32);
- movdl(ecx, xmm1);
- addl(ecx, ecx);
- cmpl(ecx, -2097152);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_6_0_2);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
-
- bind(L_2TAG_PACKET_7_0_2);
- xorpd(xmm1, xmm1);
- xorpd(xmm0, xmm0);
- movl(eax, 32752);
- pinsrw(xmm1, eax, 3);
- movl(edx, 3);
- mulsd(xmm0, xmm1);
-
- bind(L_2TAG_PACKET_9_0_2);
- movsd(Address(rsp, 0), xmm0);
- movsd(xmm0, Address(rsp, 112));
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_10_0_2);
-
- bind(L_2TAG_PACKET_8_0_2);
- xorpd(xmm1, xmm1);
- xorpd(xmm0, xmm0);
- movl(eax, 49136);
- pinsrw(xmm0, eax, 3);
- divsd(xmm0, xmm1);
- movl(edx, 2);
- jmp(L_2TAG_PACKET_9_0_2);
-
- bind(L_2TAG_PACKET_4_0_2);
- movdl(edx, xmm1);
- psrlq(xmm1, 32);
- movdl(ecx, xmm1);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
- xorpd(xmm1, xmm1);
- movl(eax, 18416);
- pinsrw(xmm1, eax, 3);
- mulsd(xmm0, xmm1);
- movapd(xmm1, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- psllq(xmm0, 5);
- movl(ecx, 18416);
- psrlq(xmm0, 34);
- rcpss(xmm0, xmm0);
- psllq(xmm1, 12);
- pshufd(xmm6, xmm5, 228);
- psrlq(xmm1, 12);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movsd(Address(rsp, 24), xmm0);
- fld_d(Address(rsp, 24));
-
- bind(L_2TAG_PACKET_10_0_2);
- movl(tmp, Address(rsp, 40));
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - POW()
-// ---------------------
-//
-// Let x=2^k * mx, mx in [1,2)
-//
-// log2(x) calculation:
-//
-// 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 short approximation for log2(e)
-//
-// Reduced argument, scaled by LH:
-// r=B*mx-LH (computed accurately in high and low parts)
-//
-// log2(x) result: k - log2(B) + p(r)
-// p(r) is a degree 8 polynomial
-// -log2(B) read from data table (high, low parts)
-// log2(x) is formed from high and low parts
-// For |x| in [1-1/32, 1+1/16), a slower but more accurate computation
-// based om the same table design is performed.
-//
-// Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8,
-// to filter out all potential OF/UF cases.
-// exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5
-// polynomial
-//
-// Special cases:
-// pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd
-// integer < 0.
-// pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and
-// not an odd integer.
-// pow(-0,y) = -0 for y an odd integer > 0.
-// pow(-0,y) = +0 for y > 0 and not an odd integer.
-// pow(-1,-INF) = NaN.
-// pow(+1,y) = NaN for any y, even a NaN.
-// pow(x,-0) = 1 for any x, even a NaN.
-// pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and
-// finite non-integer y.
-// pow(x,-INF) = +INF for |x|<1.
-// pow(x,-INF) = +0 for |x|>1.
-// pow(x,+INF) = +0 for |x|<1.
-// pow(x,+INF) = +INF for |x|>1.
-// pow(-INF,y) = -0 for y an odd integer < 0.
-// pow(-INF,y) = +0 for y < 0 and not an odd integer.
-// pow(-INF,y) = -INF for y an odd integer > 0.
-// pow(-INF,y) = +INF for y > 0 and not an odd integer.
-// pow(+INF,y) = +0 for y <0.
-// pow(+INF,y) = +INF for y >0.
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _static_const_table_pow[] =
-{
- 0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL, 0xf8000000UL,
- 0xffffffffUL, 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0x3ff00000UL,
- 0x00000000UL, 0x00000000UL, 0x20000000UL, 0x3feff00aUL, 0x96621f95UL,
- 0x3e5b1856UL, 0xe0000000UL, 0x3fefe019UL, 0xe5916f9eUL, 0xbe325278UL,
- 0x00000000UL, 0x3fefd02fUL, 0x859a1062UL, 0x3e595fb7UL, 0xc0000000UL,
- 0x3fefc049UL, 0xb245f18fUL, 0xbe529c38UL, 0xe0000000UL, 0x3fefb069UL,
- 0xad2880a7UL, 0xbe501230UL, 0x60000000UL, 0x3fefa08fUL, 0xc8e72420UL,
- 0x3e597bd1UL, 0x80000000UL, 0x3fef90baUL, 0xc30c4500UL, 0xbe5d6c75UL,
- 0xe0000000UL, 0x3fef80eaUL, 0x02c63f43UL, 0x3e2e1318UL, 0xc0000000UL,
- 0x3fef7120UL, 0xb3d4ccccUL, 0xbe44c52aUL, 0x00000000UL, 0x3fef615cUL,
- 0xdbd91397UL, 0xbe4e7d6cUL, 0xa0000000UL, 0x3fef519cUL, 0x65c5cd68UL,
- 0xbe522dc8UL, 0xa0000000UL, 0x3fef41e2UL, 0x46d1306cUL, 0xbe5a840eUL,
- 0xe0000000UL, 0x3fef322dUL, 0xd2980e94UL, 0x3e5071afUL, 0xa0000000UL,
- 0x3fef227eUL, 0x773abadeUL, 0xbe5891e5UL, 0xa0000000UL, 0x3fef12d4UL,
- 0xdc6bf46bUL, 0xbe5cccbeUL, 0xe0000000UL, 0x3fef032fUL, 0xbc7247faUL,
- 0xbe2bab83UL, 0x80000000UL, 0x3feef390UL, 0xbcaa1e46UL, 0xbe53bb3bUL,
- 0x60000000UL, 0x3feee3f6UL, 0x5f6c682dUL, 0xbe54c619UL, 0x80000000UL,
- 0x3feed461UL, 0x5141e368UL, 0xbe4b6d86UL, 0xe0000000UL, 0x3feec4d1UL,
- 0xec678f76UL, 0xbe369af6UL, 0x80000000UL, 0x3feeb547UL, 0x41301f55UL,
- 0xbe2d4312UL, 0x60000000UL, 0x3feea5c2UL, 0x676da6bdUL, 0xbe4d8dd0UL,
- 0x60000000UL, 0x3fee9642UL, 0x57a891c4UL, 0x3e51f991UL, 0xa0000000UL,
- 0x3fee86c7UL, 0xe4eb491eUL, 0x3e579bf9UL, 0x20000000UL, 0x3fee7752UL,
- 0xfddc4a2cUL, 0xbe3356e6UL, 0xc0000000UL, 0x3fee67e1UL, 0xd75b5bf1UL,
- 0xbe449531UL, 0x80000000UL, 0x3fee5876UL, 0xbd423b8eUL, 0x3df54fe4UL,
- 0x60000000UL, 0x3fee4910UL, 0x330e51b9UL, 0x3e54289cUL, 0x80000000UL,
- 0x3fee39afUL, 0x8651a95fUL, 0xbe55aad6UL, 0xa0000000UL, 0x3fee2a53UL,
- 0x5e98c708UL, 0xbe2fc4a9UL, 0xe0000000UL, 0x3fee1afcUL, 0x0989328dUL,
- 0x3e23958cUL, 0x40000000UL, 0x3fee0babUL, 0xee642abdUL, 0xbe425dd8UL,
- 0xa0000000UL, 0x3fedfc5eUL, 0xc394d236UL, 0x3e526362UL, 0x20000000UL,
- 0x3feded17UL, 0xe104aa8eUL, 0x3e4ce247UL, 0xc0000000UL, 0x3fedddd4UL,
- 0x265a9be4UL, 0xbe5bb77aUL, 0x40000000UL, 0x3fedce97UL, 0x0ecac52fUL,
- 0x3e4a7cb1UL, 0xe0000000UL, 0x3fedbf5eUL, 0x124cb3b8UL, 0x3e257024UL,
- 0x80000000UL, 0x3fedb02bUL, 0xe6d4febeUL, 0xbe2033eeUL, 0x20000000UL,
- 0x3feda0fdUL, 0x39cca00eUL, 0xbe3ddabcUL, 0xc0000000UL, 0x3fed91d3UL,
- 0xef8a552aUL, 0xbe543390UL, 0x40000000UL, 0x3fed82afUL, 0xb8e85204UL,
- 0x3e513850UL, 0xe0000000UL, 0x3fed738fUL, 0x3d59fe08UL, 0xbe5db728UL,
- 0x40000000UL, 0x3fed6475UL, 0x3aa7ead1UL, 0x3e58804bUL, 0xc0000000UL,
- 0x3fed555fUL, 0xf8a35ba9UL, 0xbe5298b0UL, 0x00000000UL, 0x3fed464fUL,
- 0x9a88dd15UL, 0x3e5a8cdbUL, 0x40000000UL, 0x3fed3743UL, 0xb0b0a190UL,
- 0x3e598635UL, 0x80000000UL, 0x3fed283cUL, 0xe2113295UL, 0xbe5c1119UL,
- 0x80000000UL, 0x3fed193aUL, 0xafbf1728UL, 0xbe492e9cUL, 0x60000000UL,
- 0x3fed0a3dUL, 0xe4a4ccf3UL, 0x3e19b90eUL, 0x20000000UL, 0x3fecfb45UL,
- 0xba3cbeb8UL, 0x3e406b50UL, 0xc0000000UL, 0x3fecec51UL, 0x110f7dddUL,
- 0x3e0d6806UL, 0x40000000UL, 0x3fecdd63UL, 0x7dd7d508UL, 0xbe5a8943UL,
- 0x80000000UL, 0x3fecce79UL, 0x9b60f271UL, 0xbe50676aUL, 0x80000000UL,
- 0x3fecbf94UL, 0x0b9ad660UL, 0x3e59174fUL, 0x60000000UL, 0x3fecb0b4UL,
- 0x00823d9cUL, 0x3e5bbf72UL, 0x20000000UL, 0x3feca1d9UL, 0x38a6ec89UL,
- 0xbe4d38f9UL, 0x80000000UL, 0x3fec9302UL, 0x3a0b7d8eUL, 0x3e53dbfdUL,
- 0xc0000000UL, 0x3fec8430UL, 0xc6826b34UL, 0xbe27c5c9UL, 0xc0000000UL,
- 0x3fec7563UL, 0x0c706381UL, 0xbe593653UL, 0x60000000UL, 0x3fec669bUL,
- 0x7df34ec7UL, 0x3e461ab5UL, 0xe0000000UL, 0x3fec57d7UL, 0x40e5e7e8UL,
- 0xbe5c3daeUL, 0x00000000UL, 0x3fec4919UL, 0x5602770fUL, 0xbe55219dUL,
- 0xc0000000UL, 0x3fec3a5eUL, 0xec7911ebUL, 0x3e5a5d25UL, 0x60000000UL,
- 0x3fec2ba9UL, 0xb39ea225UL, 0xbe53c00bUL, 0x80000000UL, 0x3fec1cf8UL,
- 0x967a212eUL, 0x3e5a8ddfUL, 0x60000000UL, 0x3fec0e4cUL, 0x580798bdUL,
- 0x3e5f53abUL, 0x00000000UL, 0x3febffa5UL, 0xb8282df6UL, 0xbe46b874UL,
- 0x20000000UL, 0x3febf102UL, 0xe33a6729UL, 0x3e54963fUL, 0x00000000UL,
- 0x3febe264UL, 0x3b53e88aUL, 0xbe3adce1UL, 0x60000000UL, 0x3febd3caUL,
- 0xc2585084UL, 0x3e5cde9fUL, 0x80000000UL, 0x3febc535UL, 0xa335c5eeUL,
- 0xbe39fd9cUL, 0x20000000UL, 0x3febb6a5UL, 0x7325b04dUL, 0x3e42ba15UL,
- 0x60000000UL, 0x3feba819UL, 0x1564540fUL, 0x3e3a9f35UL, 0x40000000UL,
- 0x3feb9992UL, 0x83fff592UL, 0xbe5465ceUL, 0xa0000000UL, 0x3feb8b0fUL,
- 0xb9da63d3UL, 0xbe4b1a0aUL, 0x80000000UL, 0x3feb7c91UL, 0x6d6f1ea4UL,
- 0x3e557657UL, 0x00000000UL, 0x3feb6e18UL, 0x5e80a1bfUL, 0x3e4ddbb6UL,
- 0x00000000UL, 0x3feb5fa3UL, 0x1c9eacb5UL, 0x3e592877UL, 0xa0000000UL,
- 0x3feb5132UL, 0x6d40beb3UL, 0xbe51858cUL, 0xa0000000UL, 0x3feb42c6UL,
- 0xd740c67bUL, 0x3e427ad2UL, 0x40000000UL, 0x3feb345fUL, 0xa3e0cceeUL,
- 0xbe5c2fc4UL, 0x40000000UL, 0x3feb25fcUL, 0x8e752b50UL, 0xbe3da3c2UL,
- 0xc0000000UL, 0x3feb179dUL, 0xa892e7deUL, 0x3e1fb481UL, 0xc0000000UL,
- 0x3feb0943UL, 0x21ed71e9UL, 0xbe365206UL, 0x20000000UL, 0x3feafaeeUL,
- 0x0e1380a3UL, 0x3e5c5b7bUL, 0x20000000UL, 0x3feaec9dUL, 0x3c3d640eUL,
- 0xbe5dbbd0UL, 0x60000000UL, 0x3feade50UL, 0x8f97a715UL, 0x3e3a8ec5UL,
- 0x20000000UL, 0x3fead008UL, 0x23ab2839UL, 0x3e2fe98aUL, 0x40000000UL,
- 0x3feac1c4UL, 0xf4bbd50fUL, 0x3e54d8f6UL, 0xe0000000UL, 0x3feab384UL,
- 0x14757c4dUL, 0xbe48774cUL, 0xc0000000UL, 0x3feaa549UL, 0x7c7b0eeaUL,
- 0x3e5b51bbUL, 0x20000000UL, 0x3fea9713UL, 0xf56f7013UL, 0x3e386200UL,
- 0xe0000000UL, 0x3fea88e0UL, 0xbe428ebeUL, 0xbe514af5UL, 0xe0000000UL,
- 0x3fea7ab2UL, 0x8d0e4496UL, 0x3e4f9165UL, 0x60000000UL, 0x3fea6c89UL,
- 0xdbacc5d5UL, 0xbe5c063bUL, 0x20000000UL, 0x3fea5e64UL, 0x3f19d970UL,
- 0xbe5a0c8cUL, 0x20000000UL, 0x3fea5043UL, 0x09ea3e6bUL, 0x3e5065dcUL,
- 0x80000000UL, 0x3fea4226UL, 0x78df246cUL, 0x3e5e05f6UL, 0x40000000UL,
- 0x3fea340eUL, 0x4057d4a0UL, 0x3e431b2bUL, 0x40000000UL, 0x3fea25faUL,
- 0x82867bb5UL, 0x3e4b76beUL, 0xa0000000UL, 0x3fea17eaUL, 0x9436f40aUL,
- 0xbe5aad39UL, 0x20000000UL, 0x3fea09dfUL, 0x4b5253b3UL, 0x3e46380bUL,
- 0x00000000UL, 0x3fe9fbd8UL, 0x8fc52466UL, 0xbe386f9bUL, 0x20000000UL,
- 0x3fe9edd5UL, 0x22d3f344UL, 0xbe538347UL, 0x60000000UL, 0x3fe9dfd6UL,
- 0x1ac33522UL, 0x3e5dbc53UL, 0x00000000UL, 0x3fe9d1dcUL, 0xeabdff1dUL,
- 0x3e40fc0cUL, 0xe0000000UL, 0x3fe9c3e5UL, 0xafd30e73UL, 0xbe585e63UL,
- 0xe0000000UL, 0x3fe9b5f3UL, 0xa52f226aUL, 0xbe43e8f9UL, 0x20000000UL,
- 0x3fe9a806UL, 0xecb8698dUL, 0xbe515b36UL, 0x80000000UL, 0x3fe99a1cUL,
- 0xf2b4e89dUL, 0x3e48b62bUL, 0x20000000UL, 0x3fe98c37UL, 0x7c9a88fbUL,
- 0x3e44414cUL, 0x00000000UL, 0x3fe97e56UL, 0xda015741UL, 0xbe5d13baUL,
- 0xe0000000UL, 0x3fe97078UL, 0x5fdace06UL, 0x3e51b947UL, 0x00000000UL,
- 0x3fe962a0UL, 0x956ca094UL, 0x3e518785UL, 0x40000000UL, 0x3fe954cbUL,
- 0x01164c1dUL, 0x3e5d5b57UL, 0xc0000000UL, 0x3fe946faUL, 0xe63b3767UL,
- 0xbe4f84e7UL, 0x40000000UL, 0x3fe9392eUL, 0xe57cc2a9UL, 0x3e34eda3UL,
- 0xe0000000UL, 0x3fe92b65UL, 0x8c75b544UL, 0x3e5766a0UL, 0xc0000000UL,
- 0x3fe91da1UL, 0x37d1d087UL, 0xbe5e2ab1UL, 0x80000000UL, 0x3fe90fe1UL,
- 0xa953dc20UL, 0x3e5fa1f3UL, 0x80000000UL, 0x3fe90225UL, 0xdbd3f369UL,
- 0x3e47d6dbUL, 0xa0000000UL, 0x3fe8f46dUL, 0x1c9be989UL, 0xbe5e2b0aUL,
- 0xa0000000UL, 0x3fe8e6b9UL, 0x3c93d76aUL, 0x3e5c8618UL, 0xe0000000UL,
- 0x3fe8d909UL, 0x2182fc9aUL, 0xbe41aa9eUL, 0x20000000UL, 0x3fe8cb5eUL,
- 0xe6b3539dUL, 0xbe530d19UL, 0x60000000UL, 0x3fe8bdb6UL, 0x49e58cc3UL,
- 0xbe3bb374UL, 0xa0000000UL, 0x3fe8b012UL, 0xa7cfeb8fUL, 0x3e56c412UL,
- 0x00000000UL, 0x3fe8a273UL, 0x8d52bc19UL, 0x3e1429b8UL, 0x60000000UL,
- 0x3fe894d7UL, 0x4dc32c6cUL, 0xbe48604cUL, 0xc0000000UL, 0x3fe8873fUL,
- 0x0c868e56UL, 0xbe564ee5UL, 0x00000000UL, 0x3fe879acUL, 0x56aee828UL,
- 0x3e5e2fd8UL, 0x60000000UL, 0x3fe86c1cUL, 0x7ceab8ecUL, 0x3e493365UL,
- 0xc0000000UL, 0x3fe85e90UL, 0x78d4dadcUL, 0xbe4f7f25UL, 0x00000000UL,
- 0x3fe85109UL, 0x0ccd8280UL, 0x3e31e7a2UL, 0x40000000UL, 0x3fe84385UL,
- 0x34ba4e15UL, 0x3e328077UL, 0x80000000UL, 0x3fe83605UL, 0xa670975aUL,
- 0xbe53eee5UL, 0xa0000000UL, 0x3fe82889UL, 0xf61b77b2UL, 0xbe43a20aUL,
- 0xa0000000UL, 0x3fe81b11UL, 0x13e6643bUL, 0x3e5e5fe5UL, 0xc0000000UL,
- 0x3fe80d9dUL, 0x82cc94e8UL, 0xbe5ff1f9UL, 0xa0000000UL, 0x3fe8002dUL,
- 0x8a0c9c5dUL, 0xbe42b0e7UL, 0x60000000UL, 0x3fe7f2c1UL, 0x22a16f01UL,
- 0x3e5d9ea0UL, 0x20000000UL, 0x3fe7e559UL, 0xc38cd451UL, 0x3e506963UL,
- 0xc0000000UL, 0x3fe7d7f4UL, 0x9902bc71UL, 0x3e4503d7UL, 0x40000000UL,
- 0x3fe7ca94UL, 0xdef2a3c0UL, 0x3e3d98edUL, 0xa0000000UL, 0x3fe7bd37UL,
- 0xed49abb0UL, 0x3e24c1ffUL, 0xe0000000UL, 0x3fe7afdeUL, 0xe3b0be70UL,
- 0xbe40c467UL, 0x00000000UL, 0x3fe7a28aUL, 0xaf9f193cUL, 0xbe5dff6cUL,
- 0xe0000000UL, 0x3fe79538UL, 0xb74cf6b6UL, 0xbe258ed0UL, 0xa0000000UL,
- 0x3fe787ebUL, 0x1d9127c7UL, 0x3e345fb0UL, 0x40000000UL, 0x3fe77aa2UL,
- 0x1028c21dUL, 0xbe4619bdUL, 0xa0000000UL, 0x3fe76d5cUL, 0x7cb0b5e4UL,
- 0x3e40f1a2UL, 0xe0000000UL, 0x3fe7601aUL, 0x2b1bc4adUL, 0xbe32e8bbUL,
- 0xe0000000UL, 0x3fe752dcUL, 0x6839f64eUL, 0x3e41f57bUL, 0xc0000000UL,
- 0x3fe745a2UL, 0xc4121f7eUL, 0xbe52c40aUL, 0x60000000UL, 0x3fe7386cUL,
- 0xd6852d72UL, 0xbe5c4e6bUL, 0xc0000000UL, 0x3fe72b39UL, 0x91d690f7UL,
- 0xbe57f88fUL, 0xe0000000UL, 0x3fe71e0aUL, 0x627a2159UL, 0xbe4425d5UL,
- 0xc0000000UL, 0x3fe710dfUL, 0x50a54033UL, 0x3e422b7eUL, 0x60000000UL,
- 0x3fe703b8UL, 0x3b0b5f91UL, 0x3e5d3857UL, 0xe0000000UL, 0x3fe6f694UL,
- 0x84d628a2UL, 0xbe51f090UL, 0x00000000UL, 0x3fe6e975UL, 0x306d8894UL,
- 0xbe414d83UL, 0xe0000000UL, 0x3fe6dc58UL, 0x30bf24aaUL, 0xbe4650caUL,
- 0x80000000UL, 0x3fe6cf40UL, 0xd4628d69UL, 0xbe5db007UL, 0xc0000000UL,
- 0x3fe6c22bUL, 0xa2aae57bUL, 0xbe31d279UL, 0xc0000000UL, 0x3fe6b51aUL,
- 0x860edf7eUL, 0xbe2d4c4aUL, 0x80000000UL, 0x3fe6a80dUL, 0xf3559341UL,
- 0xbe5f7e98UL, 0xe0000000UL, 0x3fe69b03UL, 0xa885899eUL, 0xbe5c2011UL,
- 0xe0000000UL, 0x3fe68dfdUL, 0x2bdc6d37UL, 0x3e224a82UL, 0xa0000000UL,
- 0x3fe680fbUL, 0xc12ad1b9UL, 0xbe40cf56UL, 0x00000000UL, 0x3fe673fdUL,
- 0x1bcdf659UL, 0xbdf52f2dUL, 0x00000000UL, 0x3fe66702UL, 0x5df10408UL,
- 0x3e5663e0UL, 0xc0000000UL, 0x3fe65a0aUL, 0xa4070568UL, 0xbe40b12fUL,
- 0x00000000UL, 0x3fe64d17UL, 0x71c54c47UL, 0x3e5f5e8bUL, 0x00000000UL,
- 0x3fe64027UL, 0xbd4b7e83UL, 0x3e42ead6UL, 0xa0000000UL, 0x3fe6333aUL,
- 0x61598bd2UL, 0xbe4c48d4UL, 0xc0000000UL, 0x3fe62651UL, 0x6f538d61UL,
- 0x3e548401UL, 0xa0000000UL, 0x3fe6196cUL, 0x14344120UL, 0xbe529af6UL,
- 0x00000000UL, 0x3fe60c8bUL, 0x5982c587UL, 0xbe3e1e4fUL, 0x00000000UL,
- 0x3fe5ffadUL, 0xfe51d4eaUL, 0xbe4c897aUL, 0x80000000UL, 0x3fe5f2d2UL,
- 0xfd46ebe1UL, 0x3e552e00UL, 0xa0000000UL, 0x3fe5e5fbUL, 0xa4695699UL,
- 0x3e5ed471UL, 0x60000000UL, 0x3fe5d928UL, 0x80d118aeUL, 0x3e456b61UL,
- 0xa0000000UL, 0x3fe5cc58UL, 0x304c330bUL, 0x3e54dc29UL, 0x80000000UL,
- 0x3fe5bf8cUL, 0x0af2dedfUL, 0xbe3aa9bdUL, 0xe0000000UL, 0x3fe5b2c3UL,
- 0x15fc9258UL, 0xbe479a37UL, 0xc0000000UL, 0x3fe5a5feUL, 0x9292c7eaUL,
- 0x3e188650UL, 0x20000000UL, 0x3fe5993dUL, 0x33b4d380UL, 0x3e5d6d93UL,
- 0x20000000UL, 0x3fe58c7fUL, 0x02fd16c7UL, 0x3e2fe961UL, 0xa0000000UL,
- 0x3fe57fc4UL, 0x4a05edb6UL, 0xbe4d55b4UL, 0xa0000000UL, 0x3fe5730dUL,
- 0x3d443abbUL, 0xbe5e6954UL, 0x00000000UL, 0x3fe5665aUL, 0x024acfeaUL,
- 0x3e50e61bUL, 0x00000000UL, 0x3fe559aaUL, 0xcc9edd09UL, 0xbe325403UL,
- 0x60000000UL, 0x3fe54cfdUL, 0x1fe26950UL, 0x3e5d500eUL, 0x60000000UL,
- 0x3fe54054UL, 0x6c5ae164UL, 0xbe4a79b4UL, 0xc0000000UL, 0x3fe533aeUL,
- 0x154b0287UL, 0xbe401571UL, 0xa0000000UL, 0x3fe5270cUL, 0x0673f401UL,
- 0xbe56e56bUL, 0xe0000000UL, 0x3fe51a6dUL, 0x751b639cUL, 0x3e235269UL,
- 0xa0000000UL, 0x3fe50dd2UL, 0x7c7b2bedUL, 0x3ddec887UL, 0xc0000000UL,
- 0x3fe5013aUL, 0xafab4e17UL, 0x3e5e7575UL, 0x60000000UL, 0x3fe4f4a6UL,
- 0x2e308668UL, 0x3e59aed6UL, 0x80000000UL, 0x3fe4e815UL, 0xf33e2a76UL,
- 0xbe51f184UL, 0xe0000000UL, 0x3fe4db87UL, 0x839f3e3eUL, 0x3e57db01UL,
- 0xc0000000UL, 0x3fe4cefdUL, 0xa9eda7bbUL, 0x3e535e0fUL, 0x00000000UL,
- 0x3fe4c277UL, 0x2a8f66a5UL, 0x3e5ce451UL, 0xc0000000UL, 0x3fe4b5f3UL,
- 0x05192456UL, 0xbe4e8518UL, 0xc0000000UL, 0x3fe4a973UL, 0x4aa7cd1dUL,
- 0x3e46784aUL, 0x40000000UL, 0x3fe49cf7UL, 0x8e23025eUL, 0xbe5749f2UL,
- 0x00000000UL, 0x3fe4907eUL, 0x18d30215UL, 0x3e360f39UL, 0x20000000UL,
- 0x3fe48408UL, 0x63dcf2f3UL, 0x3e5e00feUL, 0xc0000000UL, 0x3fe47795UL,
- 0x46182d09UL, 0xbe5173d9UL, 0xa0000000UL, 0x3fe46b26UL, 0x8f0e62aaUL,
- 0xbe48f281UL, 0xe0000000UL, 0x3fe45ebaUL, 0x5775c40cUL, 0xbe56aad4UL,
- 0x60000000UL, 0x3fe45252UL, 0x0fe25f69UL, 0x3e48bd71UL, 0x40000000UL,
- 0x3fe445edUL, 0xe9989ec5UL, 0x3e590d97UL, 0x80000000UL, 0x3fe4398bUL,
- 0xb3d9ffe3UL, 0x3e479dbcUL, 0x20000000UL, 0x3fe42d2dUL, 0x388e4d2eUL,
- 0xbe5eed80UL, 0xe0000000UL, 0x3fe420d1UL, 0x6f797c18UL, 0x3e554b4cUL,
- 0x20000000UL, 0x3fe4147aUL, 0x31048bb4UL, 0xbe5b1112UL, 0x80000000UL,
- 0x3fe40825UL, 0x2efba4f9UL, 0x3e48ebc7UL, 0x40000000UL, 0x3fe3fbd4UL,
- 0x50201119UL, 0x3e40b701UL, 0x40000000UL, 0x3fe3ef86UL, 0x0a4db32cUL,
- 0x3e551de8UL, 0xa0000000UL, 0x3fe3e33bUL, 0x0c9c148bUL, 0xbe50c1f6UL,
- 0x20000000UL, 0x3fe3d6f4UL, 0xc9129447UL, 0x3e533fa0UL, 0x00000000UL,
- 0x3fe3cab0UL, 0xaae5b5a0UL, 0xbe22b68eUL, 0x20000000UL, 0x3fe3be6fUL,
- 0x02305e8aUL, 0xbe54fc08UL, 0x60000000UL, 0x3fe3b231UL, 0x7f908258UL,
- 0x3e57dc05UL, 0x00000000UL, 0x3fe3a5f7UL, 0x1a09af78UL, 0x3e08038bUL,
- 0xe0000000UL, 0x3fe399bfUL, 0x490643c1UL, 0xbe5dbe42UL, 0xe0000000UL,
- 0x3fe38d8bUL, 0x5e8ad724UL, 0xbe3c2b72UL, 0x20000000UL, 0x3fe3815bUL,
- 0xc67196b6UL, 0x3e1713cfUL, 0xa0000000UL, 0x3fe3752dUL, 0x6182e429UL,
- 0xbe3ec14cUL, 0x40000000UL, 0x3fe36903UL, 0xab6eb1aeUL, 0x3e5a2cc5UL,
- 0x40000000UL, 0x3fe35cdcUL, 0xfe5dc064UL, 0xbe5c5878UL, 0x40000000UL,
- 0x3fe350b8UL, 0x0ba6b9e4UL, 0x3e51619bUL, 0x80000000UL, 0x3fe34497UL,
- 0x857761aaUL, 0x3e5fff53UL, 0x00000000UL, 0x3fe3387aUL, 0xf872d68cUL,
- 0x3e484f4dUL, 0xa0000000UL, 0x3fe32c5fUL, 0x087e97c2UL, 0x3e52842eUL,
- 0x80000000UL, 0x3fe32048UL, 0x73d6d0c0UL, 0xbe503edfUL, 0x80000000UL,
- 0x3fe31434UL, 0x0c1456a1UL, 0xbe5f72adUL, 0xa0000000UL, 0x3fe30823UL,
- 0x83a1a4d5UL, 0xbe5e65ccUL, 0xe0000000UL, 0x3fe2fc15UL, 0x855a7390UL,
- 0xbe506438UL, 0x40000000UL, 0x3fe2f00bUL, 0xa2898287UL, 0x3e3d22a2UL,
- 0xe0000000UL, 0x3fe2e403UL, 0x8b56f66fUL, 0xbe5aa5fdUL, 0x80000000UL,
- 0x3fe2d7ffUL, 0x52db119aUL, 0x3e3a2e3dUL, 0x60000000UL, 0x3fe2cbfeUL,
- 0xe2ddd4c0UL, 0xbe586469UL, 0x40000000UL, 0x3fe2c000UL, 0x6b01bf10UL,
- 0x3e352b9dUL, 0x40000000UL, 0x3fe2b405UL, 0xb07a1cdfUL, 0x3e5c5cdaUL,
- 0x80000000UL, 0x3fe2a80dUL, 0xc7b5f868UL, 0xbe5668b3UL, 0xc0000000UL,
- 0x3fe29c18UL, 0x185edf62UL, 0xbe563d66UL, 0x00000000UL, 0x3fe29027UL,
- 0xf729e1ccUL, 0x3e59a9a0UL, 0x80000000UL, 0x3fe28438UL, 0x6433c727UL,
- 0xbe43cc89UL, 0x00000000UL, 0x3fe2784dUL, 0x41782631UL, 0xbe30750cUL,
- 0xa0000000UL, 0x3fe26c64UL, 0x914911b7UL, 0xbe58290eUL, 0x40000000UL,
- 0x3fe2607fUL, 0x3dcc73e1UL, 0xbe4269cdUL, 0x00000000UL, 0x3fe2549dUL,
- 0x2751bf70UL, 0xbe5a6998UL, 0xc0000000UL, 0x3fe248bdUL, 0x4248b9fbUL,
- 0xbe4ddb00UL, 0x80000000UL, 0x3fe23ce1UL, 0xf35cf82fUL, 0x3e561b71UL,
- 0x60000000UL, 0x3fe23108UL, 0x8e481a2dUL, 0x3e518fb9UL, 0x60000000UL,
- 0x3fe22532UL, 0x5ab96edcUL, 0xbe5fafc5UL, 0x40000000UL, 0x3fe2195fUL,
- 0x80943911UL, 0xbe07f819UL, 0x40000000UL, 0x3fe20d8fUL, 0x386f2d6cUL,
- 0xbe54ba8bUL, 0x40000000UL, 0x3fe201c2UL, 0xf29664acUL, 0xbe5eb815UL,
- 0x20000000UL, 0x3fe1f5f8UL, 0x64f03390UL, 0x3e5e320cUL, 0x20000000UL,
- 0x3fe1ea31UL, 0x747ff696UL, 0x3e5ef0a5UL, 0x40000000UL, 0x3fe1de6dUL,
- 0x3e9ceb51UL, 0xbe5f8d27UL, 0x20000000UL, 0x3fe1d2acUL, 0x4ae0b55eUL,
- 0x3e5faa21UL, 0x20000000UL, 0x3fe1c6eeUL, 0x28569a5eUL, 0x3e598a4fUL,
- 0x20000000UL, 0x3fe1bb33UL, 0x54b33e07UL, 0x3e46130aUL, 0x20000000UL,
- 0x3fe1af7bUL, 0x024f1078UL, 0xbe4dbf93UL, 0x00000000UL, 0x3fe1a3c6UL,
- 0xb0783bfaUL, 0x3e419248UL, 0xe0000000UL, 0x3fe19813UL, 0x2f02b836UL,
- 0x3e4e02b7UL, 0xc0000000UL, 0x3fe18c64UL, 0x28dec9d4UL, 0x3e09064fUL,
- 0x80000000UL, 0x3fe180b8UL, 0x45cbf406UL, 0x3e5b1f46UL, 0x40000000UL,
- 0x3fe1750fUL, 0x03d9964cUL, 0x3e5b0a79UL, 0x00000000UL, 0x3fe16969UL,
- 0x8b5b882bUL, 0xbe238086UL, 0xa0000000UL, 0x3fe15dc5UL, 0x73bad6f8UL,
- 0xbdf1fca4UL, 0x20000000UL, 0x3fe15225UL, 0x5385769cUL, 0x3e5e8d76UL,
- 0xa0000000UL, 0x3fe14687UL, 0x1676dc6bUL, 0x3e571d08UL, 0x20000000UL,
- 0x3fe13aedUL, 0xa8c41c7fUL, 0xbe598a25UL, 0x60000000UL, 0x3fe12f55UL,
- 0xc4e1aaf0UL, 0x3e435277UL, 0xa0000000UL, 0x3fe123c0UL, 0x403638e1UL,
- 0xbe21aa7cUL, 0xc0000000UL, 0x3fe1182eUL, 0x557a092bUL, 0xbdd0116bUL,
- 0xc0000000UL, 0x3fe10c9fUL, 0x7d779f66UL, 0x3e4a61baUL, 0xc0000000UL,
- 0x3fe10113UL, 0x2b09c645UL, 0xbe5d586eUL, 0x20000000UL, 0x3fe0ea04UL,
- 0xea2cad46UL, 0x3e5aa97cUL, 0x20000000UL, 0x3fe0d300UL, 0x23190e54UL,
- 0x3e50f1a7UL, 0xa0000000UL, 0x3fe0bc07UL, 0x1379a5a6UL, 0xbe51619dUL,
- 0x60000000UL, 0x3fe0a51aUL, 0x926a3d4aUL, 0x3e5cf019UL, 0xa0000000UL,
- 0x3fe08e38UL, 0xa8c24358UL, 0x3e35241eUL, 0x20000000UL, 0x3fe07762UL,
- 0x24317e7aUL, 0x3e512cfaUL, 0x00000000UL, 0x3fe06097UL, 0xfd9cf274UL,
- 0xbe55bef3UL, 0x00000000UL, 0x3fe049d7UL, 0x3689b49dUL, 0xbe36d26dUL,
- 0x40000000UL, 0x3fe03322UL, 0xf72ef6c4UL, 0xbe54cd08UL, 0xa0000000UL,
- 0x3fe01c78UL, 0x23702d2dUL, 0xbe5900bfUL, 0x00000000UL, 0x3fe005daUL,
- 0x3f59c14cUL, 0x3e57d80bUL, 0x40000000UL, 0x3fdfde8dUL, 0xad67766dUL,
- 0xbe57fad4UL, 0x40000000UL, 0x3fdfb17cUL, 0x644f4ae7UL, 0x3e1ee43bUL,
- 0x40000000UL, 0x3fdf8481UL, 0x903234d2UL, 0x3e501a86UL, 0x40000000UL,
- 0x3fdf579cUL, 0xafe9e509UL, 0xbe267c3eUL, 0x00000000UL, 0x3fdf2acdUL,
- 0xb7dfda0bUL, 0xbe48149bUL, 0x40000000UL, 0x3fdefe13UL, 0x3b94305eUL,
- 0x3e5f4ea7UL, 0x80000000UL, 0x3fded16fUL, 0x5d95da61UL, 0xbe55c198UL,
- 0x00000000UL, 0x3fdea4e1UL, 0x406960c9UL, 0xbdd99a19UL, 0x00000000UL,
- 0x3fde7868UL, 0xd22f3539UL, 0x3e470c78UL, 0x80000000UL, 0x3fde4c04UL,
- 0x83eec535UL, 0xbe3e1232UL, 0x40000000UL, 0x3fde1fb6UL, 0x3dfbffcbUL,
- 0xbe4b7d71UL, 0x40000000UL, 0x3fddf37dUL, 0x7e1be4e0UL, 0xbe5b8f8fUL,
- 0x40000000UL, 0x3fddc759UL, 0x46dae887UL, 0xbe350458UL, 0x80000000UL,
- 0x3fdd9b4aUL, 0xed6ecc49UL, 0xbe5f0045UL, 0x80000000UL, 0x3fdd6f50UL,
- 0x2e9e883cUL, 0x3e2915daUL, 0x80000000UL, 0x3fdd436bUL, 0xf0bccb32UL,
- 0x3e4a68c9UL, 0x80000000UL, 0x3fdd179bUL, 0x9bbfc779UL, 0xbe54a26aUL,
- 0x00000000UL, 0x3fdcebe0UL, 0x7cea33abUL, 0x3e43c6b7UL, 0x40000000UL,
- 0x3fdcc039UL, 0xe740fd06UL, 0x3e5526c2UL, 0x40000000UL, 0x3fdc94a7UL,
- 0x9eadeb1aUL, 0xbe396d8dUL, 0xc0000000UL, 0x3fdc6929UL, 0xf0a8f95aUL,
- 0xbe5c0ab2UL, 0x80000000UL, 0x3fdc3dc0UL, 0x6ee2693bUL, 0x3e0992e6UL,
- 0xc0000000UL, 0x3fdc126bUL, 0x5ac6b581UL, 0xbe2834b6UL, 0x40000000UL,
- 0x3fdbe72bUL, 0x8cc226ffUL, 0x3e3596a6UL, 0x00000000UL, 0x3fdbbbffUL,
- 0xf92a74bbUL, 0x3e3c5813UL, 0x00000000UL, 0x3fdb90e7UL, 0x479664c0UL,
- 0xbe50d644UL, 0x00000000UL, 0x3fdb65e3UL, 0x5004975bUL, 0xbe55258fUL,
- 0x00000000UL, 0x3fdb3af3UL, 0xe4b23194UL, 0xbe588407UL, 0xc0000000UL,
- 0x3fdb1016UL, 0xe65d4d0aUL, 0x3e527c26UL, 0x80000000UL, 0x3fdae54eUL,
- 0x814fddd6UL, 0x3e5962a2UL, 0x40000000UL, 0x3fdaba9aUL, 0xe19d0913UL,
- 0xbe562f4eUL, 0x80000000UL, 0x3fda8ff9UL, 0x43cfd006UL, 0xbe4cfdebUL,
- 0x40000000UL, 0x3fda656cUL, 0x686f0a4eUL, 0x3e5e47a8UL, 0xc0000000UL,
- 0x3fda3af2UL, 0x7200d410UL, 0x3e5e1199UL, 0xc0000000UL, 0x3fda108cUL,
- 0xabd2266eUL, 0x3e5ee4d1UL, 0x40000000UL, 0x3fd9e63aUL, 0x396f8f2cUL,
- 0x3e4dbffbUL, 0x00000000UL, 0x3fd9bbfbUL, 0xe32b25ddUL, 0x3e5c3a54UL,
- 0x40000000UL, 0x3fd991cfUL, 0x431e4035UL, 0xbe457925UL, 0x80000000UL,
- 0x3fd967b6UL, 0x7bed3dd3UL, 0x3e40c61dUL, 0x00000000UL, 0x3fd93db1UL,
- 0xd7449365UL, 0x3e306419UL, 0x80000000UL, 0x3fd913beUL, 0x1746e791UL,
- 0x3e56fcfcUL, 0x40000000UL, 0x3fd8e9dfUL, 0xf3a9028bUL, 0xbe5041b9UL,
- 0xc0000000UL, 0x3fd8c012UL, 0x56840c50UL, 0xbe26e20aUL, 0x40000000UL,
- 0x3fd89659UL, 0x19763102UL, 0xbe51f466UL, 0x80000000UL, 0x3fd86cb2UL,
- 0x7032de7cUL, 0xbe4d298aUL, 0x80000000UL, 0x3fd8431eUL, 0xdeb39fabUL,
- 0xbe4361ebUL, 0x40000000UL, 0x3fd8199dUL, 0x5d01cbe0UL, 0xbe5425b3UL,
- 0x80000000UL, 0x3fd7f02eUL, 0x3ce99aa9UL, 0x3e146fa8UL, 0x80000000UL,
- 0x3fd7c6d2UL, 0xd1a262b9UL, 0xbe5a1a69UL, 0xc0000000UL, 0x3fd79d88UL,
- 0x8606c236UL, 0x3e423a08UL, 0x80000000UL, 0x3fd77451UL, 0x8fd1e1b7UL,
- 0x3e5a6a63UL, 0xc0000000UL, 0x3fd74b2cUL, 0xe491456aUL, 0x3e42c1caUL,
- 0x40000000UL, 0x3fd7221aUL, 0x4499a6d7UL, 0x3e36a69aUL, 0x00000000UL,
- 0x3fd6f91aUL, 0x5237df94UL, 0xbe0f8f02UL, 0x00000000UL, 0x3fd6d02cUL,
- 0xb6482c6eUL, 0xbe5abcf7UL, 0x00000000UL, 0x3fd6a750UL, 0x1919fd61UL,
- 0xbe57ade2UL, 0x00000000UL, 0x3fd67e86UL, 0xaa7a994dUL, 0xbe3f3fbdUL,
- 0x00000000UL, 0x3fd655ceUL, 0x67db014cUL, 0x3e33c550UL, 0x00000000UL,
- 0x3fd62d28UL, 0xa82856b7UL, 0xbe1409d1UL, 0xc0000000UL, 0x3fd60493UL,
- 0x1e6a300dUL, 0x3e55d899UL, 0x80000000UL, 0x3fd5dc11UL, 0x1222bd5cUL,
- 0xbe35bfc0UL, 0xc0000000UL, 0x3fd5b3a0UL, 0x6e8dc2d3UL, 0x3e5d4d79UL,
- 0x00000000UL, 0x3fd58b42UL, 0xe0e4ace6UL, 0xbe517303UL, 0x80000000UL,
- 0x3fd562f4UL, 0xb306e0a8UL, 0x3e5edf0fUL, 0xc0000000UL, 0x3fd53ab8UL,
- 0x6574bc54UL, 0x3e5ee859UL, 0x80000000UL, 0x3fd5128eUL, 0xea902207UL,
- 0x3e5f6188UL, 0xc0000000UL, 0x3fd4ea75UL, 0x9f911d79UL, 0x3e511735UL,
- 0x80000000UL, 0x3fd4c26eUL, 0xf9c77397UL, 0xbe5b1643UL, 0x40000000UL,
- 0x3fd49a78UL, 0x15fc9258UL, 0x3e479a37UL, 0x80000000UL, 0x3fd47293UL,
- 0xd5a04dd9UL, 0xbe426e56UL, 0xc0000000UL, 0x3fd44abfUL, 0xe04042f5UL,
- 0x3e56f7c6UL, 0x40000000UL, 0x3fd422fdUL, 0x1d8bf2c8UL, 0x3e5d8810UL,
- 0x00000000UL, 0x3fd3fb4cUL, 0x88a8ddeeUL, 0xbe311454UL, 0xc0000000UL,
- 0x3fd3d3abUL, 0x3e3b5e47UL, 0xbe5d1b72UL, 0x40000000UL, 0x3fd3ac1cUL,
- 0xc2ab5d59UL, 0x3e31b02bUL, 0xc0000000UL, 0x3fd3849dUL, 0xd4e34b9eUL,
- 0x3e51cb2fUL, 0x40000000UL, 0x3fd35d30UL, 0x177204fbUL, 0xbe2b8cd7UL,
- 0x80000000UL, 0x3fd335d3UL, 0xfcd38c82UL, 0xbe4356e1UL, 0x80000000UL,
- 0x3fd30e87UL, 0x64f54accUL, 0xbe4e6224UL, 0x00000000UL, 0x3fd2e74cUL,
- 0xaa7975d9UL, 0x3e5dc0feUL, 0x80000000UL, 0x3fd2c021UL, 0x516dab3fUL,
- 0xbe50ffa3UL, 0x40000000UL, 0x3fd29907UL, 0x2bfb7313UL, 0x3e5674a2UL,
- 0xc0000000UL, 0x3fd271fdUL, 0x0549fc99UL, 0x3e385d29UL, 0xc0000000UL,
- 0x3fd24b04UL, 0x55b63073UL, 0xbe500c6dUL, 0x00000000UL, 0x3fd2241cUL,
- 0x3f91953aUL, 0x3e389977UL, 0xc0000000UL, 0x3fd1fd43UL, 0xa1543f71UL,
- 0xbe3487abUL, 0xc0000000UL, 0x3fd1d67bUL, 0x4ec8867cUL, 0x3df6a2dcUL,
- 0x00000000UL, 0x3fd1afc4UL, 0x4328e3bbUL, 0x3e41d9c0UL, 0x80000000UL,
- 0x3fd1891cUL, 0x2e1cda84UL, 0x3e3bdd87UL, 0x40000000UL, 0x3fd16285UL,
- 0x4b5331aeUL, 0xbe53128eUL, 0x00000000UL, 0x3fd13bfeUL, 0xb9aec164UL,
- 0xbe52ac98UL, 0xc0000000UL, 0x3fd11586UL, 0xd91e1316UL, 0xbe350630UL,
- 0x80000000UL, 0x3fd0ef1fUL, 0x7cacc12cUL, 0x3e3f5219UL, 0x40000000UL,
- 0x3fd0c8c8UL, 0xbce277b7UL, 0x3e3d30c0UL, 0x00000000UL, 0x3fd0a281UL,
- 0x2a63447dUL, 0xbe541377UL, 0x80000000UL, 0x3fd07c49UL, 0xfac483b5UL,
- 0xbe5772ecUL, 0xc0000000UL, 0x3fd05621UL, 0x36b8a570UL, 0xbe4fd4bdUL,
- 0xc0000000UL, 0x3fd03009UL, 0xbae505f7UL, 0xbe450388UL, 0x80000000UL,
- 0x3fd00a01UL, 0x3e35aeadUL, 0xbe5430fcUL, 0x80000000UL, 0x3fcfc811UL,
- 0x707475acUL, 0x3e38806eUL, 0x80000000UL, 0x3fcf7c3fUL, 0xc91817fcUL,
- 0xbe40cceaUL, 0x80000000UL, 0x3fcf308cUL, 0xae05d5e9UL, 0xbe4919b8UL,
- 0x80000000UL, 0x3fcee4f8UL, 0xae6cc9e6UL, 0xbe530b94UL, 0x00000000UL,
- 0x3fce9983UL, 0x1efe3e8eUL, 0x3e57747eUL, 0x00000000UL, 0x3fce4e2dUL,
- 0xda78d9bfUL, 0xbe59a608UL, 0x00000000UL, 0x3fce02f5UL, 0x8abe2c2eUL,
- 0x3e4a35adUL, 0x00000000UL, 0x3fcdb7dcUL, 0x1495450dUL, 0xbe0872ccUL,
- 0x80000000UL, 0x3fcd6ce1UL, 0x86ee0ba0UL, 0xbe4f59a0UL, 0x00000000UL,
- 0x3fcd2205UL, 0xe81ca888UL, 0x3e5402c3UL, 0x00000000UL, 0x3fccd747UL,
- 0x3b4424b9UL, 0x3e5dfdc3UL, 0x80000000UL, 0x3fcc8ca7UL, 0xd305b56cUL,
- 0x3e202da6UL, 0x00000000UL, 0x3fcc4226UL, 0x399a6910UL, 0xbe482a1cUL,
- 0x80000000UL, 0x3fcbf7c2UL, 0x747f7938UL, 0xbe587372UL, 0x80000000UL,
- 0x3fcbad7cUL, 0x6fc246a0UL, 0x3e50d83dUL, 0x00000000UL, 0x3fcb6355UL,
- 0xee9e9be5UL, 0xbe5c35bdUL, 0x80000000UL, 0x3fcb194aUL, 0x8416c0bcUL,
- 0x3e546d4fUL, 0x00000000UL, 0x3fcacf5eUL, 0x49f7f08fUL, 0x3e56da76UL,
- 0x00000000UL, 0x3fca858fUL, 0x5dc30de2UL, 0x3e5f390cUL, 0x00000000UL,
- 0x3fca3bdeUL, 0x950583b6UL, 0xbe5e4169UL, 0x80000000UL, 0x3fc9f249UL,
- 0x33631553UL, 0x3e52aeb1UL, 0x00000000UL, 0x3fc9a8d3UL, 0xde8795a6UL,
- 0xbe59a504UL, 0x00000000UL, 0x3fc95f79UL, 0x076bf41eUL, 0x3e5122feUL,
- 0x80000000UL, 0x3fc9163cUL, 0x2914c8e7UL, 0x3e3dd064UL, 0x00000000UL,
- 0x3fc8cd1dUL, 0x3a30eca3UL, 0xbe21b4aaUL, 0x80000000UL, 0x3fc8841aUL,
- 0xb2a96650UL, 0xbe575444UL, 0x80000000UL, 0x3fc83b34UL, 0x2376c0cbUL,
- 0xbe2a74c7UL, 0x80000000UL, 0x3fc7f26bUL, 0xd8a0b653UL, 0xbe5181b6UL,
- 0x00000000UL, 0x3fc7a9bfUL, 0x32257882UL, 0xbe4a78b4UL, 0x00000000UL,
- 0x3fc7612fUL, 0x1eee8bd9UL, 0xbe1bfe9dUL, 0x80000000UL, 0x3fc718bbUL,
- 0x0c603cc4UL, 0x3e36fdc9UL, 0x80000000UL, 0x3fc6d064UL, 0x3728b8cfUL,
- 0xbe1e542eUL, 0x80000000UL, 0x3fc68829UL, 0xc79a4067UL, 0x3e5c380fUL,
- 0x00000000UL, 0x3fc6400bUL, 0xf69eac69UL, 0x3e550a84UL, 0x80000000UL,
- 0x3fc5f808UL, 0xb7a780a4UL, 0x3e5d9224UL, 0x80000000UL, 0x3fc5b022UL,
- 0xad9dfb1eUL, 0xbe55242fUL, 0x00000000UL, 0x3fc56858UL, 0x659b18beUL,
- 0xbe4bfda3UL, 0x80000000UL, 0x3fc520a9UL, 0x66ee3631UL, 0xbe57d769UL,
- 0x80000000UL, 0x3fc4d916UL, 0x1ec62819UL, 0x3e2427f7UL, 0x80000000UL,
- 0x3fc4919fUL, 0xdec25369UL, 0xbe435431UL, 0x00000000UL, 0x3fc44a44UL,
- 0xa8acfc4bUL, 0xbe3c62e8UL, 0x00000000UL, 0x3fc40304UL, 0xcf1d3eabUL,
- 0xbdfba29fUL, 0x80000000UL, 0x3fc3bbdfUL, 0x79aba3eaUL, 0xbdf1b7c8UL,
- 0x80000000UL, 0x3fc374d6UL, 0xb8d186daUL, 0xbe5130cfUL, 0x80000000UL,
- 0x3fc32de8UL, 0x9d74f152UL, 0x3e2285b6UL, 0x00000000UL, 0x3fc2e716UL,
- 0x50ae7ca9UL, 0xbe503920UL, 0x80000000UL, 0x3fc2a05eUL, 0x6caed92eUL,
- 0xbe533924UL, 0x00000000UL, 0x3fc259c2UL, 0x9cb5034eUL, 0xbe510e31UL,
- 0x80000000UL, 0x3fc21340UL, 0x12c4d378UL, 0xbe540b43UL, 0x80000000UL,
- 0x3fc1ccd9UL, 0xcc418706UL, 0x3e59887aUL, 0x00000000UL, 0x3fc1868eUL,
- 0x921f4106UL, 0xbe528e67UL, 0x80000000UL, 0x3fc1405cUL, 0x3969441eUL,
- 0x3e5d8051UL, 0x00000000UL, 0x3fc0fa46UL, 0xd941ef5bUL, 0x3e5f9079UL,
- 0x80000000UL, 0x3fc0b44aUL, 0x5a3e81b2UL, 0xbe567691UL, 0x00000000UL,
- 0x3fc06e69UL, 0x9d66afe7UL, 0xbe4d43fbUL, 0x00000000UL, 0x3fc028a2UL,
- 0x0a92a162UL, 0xbe52f394UL, 0x00000000UL, 0x3fbfc5eaUL, 0x209897e5UL,
- 0x3e529e37UL, 0x00000000UL, 0x3fbf3ac5UL, 0x8458bd7bUL, 0x3e582831UL,
- 0x00000000UL, 0x3fbeafd5UL, 0xb8d8b4b8UL, 0xbe486b4aUL, 0x00000000UL,
- 0x3fbe2518UL, 0xe0a3b7b6UL, 0x3e5bafd2UL, 0x00000000UL, 0x3fbd9a90UL,
- 0x2bf2710eUL, 0x3e383b2bUL, 0x00000000UL, 0x3fbd103cUL, 0x73eb6ab7UL,
- 0xbe56d78dUL, 0x00000000UL, 0x3fbc861bUL, 0x32ceaff5UL, 0xbe32dc5aUL,
- 0x00000000UL, 0x3fbbfc2eUL, 0xbee04cb7UL, 0xbe4a71a4UL, 0x00000000UL,
- 0x3fbb7274UL, 0x35ae9577UL, 0x3e38142fUL, 0x00000000UL, 0x3fbae8eeUL,
- 0xcbaddab4UL, 0xbe5490f0UL, 0x00000000UL, 0x3fba5f9aUL, 0x95ce1114UL,
- 0x3e597c71UL, 0x00000000UL, 0x3fb9d67aUL, 0x6d7c0f78UL, 0x3e3abc2dUL,
- 0x00000000UL, 0x3fb94d8dUL, 0x2841a782UL, 0xbe566cbcUL, 0x00000000UL,
- 0x3fb8c4d2UL, 0x6ed429c6UL, 0xbe3cfff9UL, 0x00000000UL, 0x3fb83c4aUL,
- 0xe4a49fbbUL, 0xbe552964UL, 0x00000000UL, 0x3fb7b3f4UL, 0x2193d81eUL,
- 0xbe42fa72UL, 0x00000000UL, 0x3fb72bd0UL, 0xdd70c122UL, 0x3e527a8cUL,
- 0x00000000UL, 0x3fb6a3dfUL, 0x03108a54UL, 0xbe450393UL, 0x00000000UL,
- 0x3fb61c1fUL, 0x30ff7954UL, 0x3e565840UL, 0x00000000UL, 0x3fb59492UL,
- 0xdedd460cUL, 0xbe5422b5UL, 0x00000000UL, 0x3fb50d36UL, 0x950f9f45UL,
- 0xbe5313f6UL, 0x00000000UL, 0x3fb4860bUL, 0x582cdcb1UL, 0x3e506d39UL,
- 0x00000000UL, 0x3fb3ff12UL, 0x7216d3a6UL, 0x3e4aa719UL, 0x00000000UL,
- 0x3fb3784aUL, 0x57a423fdUL, 0x3e5a9b9fUL, 0x00000000UL, 0x3fb2f1b4UL,
- 0x7a138b41UL, 0xbe50b418UL, 0x00000000UL, 0x3fb26b4eUL, 0x2fbfd7eaUL,
- 0x3e23a53eUL, 0x00000000UL, 0x3fb1e519UL, 0x18913ccbUL, 0x3e465fc1UL,
- 0x00000000UL, 0x3fb15f15UL, 0x7ea24e21UL, 0x3e042843UL, 0x00000000UL,
- 0x3fb0d941UL, 0x7c6d9c77UL, 0x3e59f61eUL, 0x00000000UL, 0x3fb0539eUL,
- 0x114efd44UL, 0x3e4ccab7UL, 0x00000000UL, 0x3faf9c56UL, 0x1777f657UL,
- 0x3e552f65UL, 0x00000000UL, 0x3fae91d2UL, 0xc317b86aUL, 0xbe5a61e0UL,
- 0x00000000UL, 0x3fad87acUL, 0xb7664efbUL, 0xbe41f64eUL, 0x00000000UL,
- 0x3fac7de6UL, 0x5d3d03a9UL, 0x3e0807a0UL, 0x00000000UL, 0x3fab7480UL,
- 0x743c38ebUL, 0xbe3726e1UL, 0x00000000UL, 0x3faa6b78UL, 0x06a253f1UL,
- 0x3e5ad636UL, 0x00000000UL, 0x3fa962d0UL, 0xa35f541bUL, 0x3e5a187aUL,
- 0x00000000UL, 0x3fa85a88UL, 0x4b86e446UL, 0xbe508150UL, 0x00000000UL,
- 0x3fa7529cUL, 0x2589cacfUL, 0x3e52938aUL, 0x00000000UL, 0x3fa64b10UL,
- 0xaf6b11f2UL, 0xbe3454cdUL, 0x00000000UL, 0x3fa543e2UL, 0x97506fefUL,
- 0xbe5fdec5UL, 0x00000000UL, 0x3fa43d10UL, 0xe75f7dd9UL, 0xbe388dd3UL,
- 0x00000000UL, 0x3fa3369cUL, 0xa4139632UL, 0xbdea5177UL, 0x00000000UL,
- 0x3fa23086UL, 0x352d6f1eUL, 0xbe565ad6UL, 0x00000000UL, 0x3fa12accUL,
- 0x77449eb7UL, 0xbe50d5c7UL, 0x00000000UL, 0x3fa0256eUL, 0x7478da78UL,
- 0x3e404724UL, 0x00000000UL, 0x3f9e40dcUL, 0xf59cef7fUL, 0xbe539d0aUL,
- 0x00000000UL, 0x3f9c3790UL, 0x1511d43cUL, 0x3e53c2c8UL, 0x00000000UL,
- 0x3f9a2f00UL, 0x9b8bff3cUL, 0xbe43b3e1UL, 0x00000000UL, 0x3f982724UL,
- 0xad1e22a5UL, 0x3e46f0bdUL, 0x00000000UL, 0x3f962000UL, 0x130d9356UL,
- 0x3e475ba0UL, 0x00000000UL, 0x3f941994UL, 0x8f86f883UL, 0xbe513d0bUL,
- 0x00000000UL, 0x3f9213dcUL, 0x914d0dc8UL, 0xbe534335UL, 0x00000000UL,
- 0x3f900ed8UL, 0x2d73e5e7UL, 0xbe22ba75UL, 0x00000000UL, 0x3f8c1510UL,
- 0xc5b7d70eUL, 0x3e599c5dUL, 0x00000000UL, 0x3f880de0UL, 0x8a27857eUL,
- 0xbe3d28c8UL, 0x00000000UL, 0x3f840810UL, 0xda767328UL, 0x3e531b3dUL,
- 0x00000000UL, 0x3f8003b0UL, 0x77bacaf3UL, 0xbe5f04e3UL, 0x00000000UL,
- 0x3f780150UL, 0xdf4b0720UL, 0x3e5a8bffUL, 0x00000000UL, 0x3f6ffc40UL,
- 0x34c48e71UL, 0xbe3fcd99UL, 0x00000000UL, 0x3f5ff6c0UL, 0x1ad218afUL,
- 0xbe4c78a7UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL,
- 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL, 0x00000000UL,
- 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL, 0x6dc96112UL, 0xbf836578UL,
- 0xee241472UL, 0xbf9b0301UL, 0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL,
- 0xbfd619b6UL, 0x518775e3UL, 0x3f9004f2UL, 0xac8349bbUL, 0x3fa76c9bUL,
- 0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL, 0x9f95985aUL,
- 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL, 0x486ececbUL, 0x3fc4635eUL,
- 0x412055ccUL, 0xbdd61bb2UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
- 0xffffffffUL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3b700000UL,
- 0xfa5abcbfUL, 0x3ff00b1aUL, 0xa7609f71UL, 0xbc84f6b2UL, 0xa9fb3335UL,
- 0x3ff0163dUL, 0x9ab8cdb7UL, 0x3c9b6129UL, 0x143b0281UL, 0x3ff02168UL,
- 0x0fc54eb6UL, 0xbc82bf31UL, 0x3e778061UL, 0x3ff02c9aUL, 0x535b085dUL,
- 0xbc719083UL, 0x2e11bbccUL, 0x3ff037d4UL, 0xeeade11aUL, 0x3c656811UL,
- 0xe86e7f85UL, 0x3ff04315UL, 0x1977c96eUL, 0xbc90a31cUL, 0x72f654b1UL,
- 0x3ff04e5fUL, 0x3aa0d08cUL, 0x3c84c379UL, 0xd3158574UL, 0x3ff059b0UL,
- 0xa475b465UL, 0x3c8d73e2UL, 0x0e3c1f89UL, 0x3ff0650aUL, 0x5799c397UL,
- 0xbc95cb7bUL, 0x29ddf6deUL, 0x3ff0706bUL, 0xe2b13c27UL, 0xbc8c91dfUL,
- 0x2b72a836UL, 0x3ff07bd4UL, 0x54458700UL, 0x3c832334UL, 0x18759bc8UL,
- 0x3ff08745UL, 0x4bb284ffUL, 0x3c6186beUL, 0xf66607e0UL, 0x3ff092bdUL,
- 0x800a3fd1UL, 0xbc968063UL, 0xcac6f383UL, 0x3ff09e3eUL, 0x18316136UL,
- 0x3c914878UL, 0x9b1f3919UL, 0x3ff0a9c7UL, 0x873d1d38UL, 0x3c85d16cUL,
- 0x6cf9890fUL, 0x3ff0b558UL, 0x4adc610bUL, 0x3c98a62eUL, 0x45e46c85UL,
- 0x3ff0c0f1UL, 0x06d21cefUL, 0x3c94f989UL, 0x2b7247f7UL, 0x3ff0cc92UL,
- 0x16e24f71UL, 0x3c901edcUL, 0x23395decUL, 0x3ff0d83bUL, 0xe43f316aUL,
- 0xbc9bc14dUL, 0x32d3d1a2UL, 0x3ff0e3ecUL, 0x27c57b52UL, 0x3c403a17UL,
- 0x5fdfa9c5UL, 0x3ff0efa5UL, 0xbc54021bUL, 0xbc949db9UL, 0xaffed31bUL,
- 0x3ff0fb66UL, 0xc44ebd7bUL, 0xbc6b9bedUL, 0x28d7233eUL, 0x3ff10730UL,
- 0x1692fdd5UL, 0x3c8d46ebUL, 0xd0125b51UL, 0x3ff11301UL, 0x39449b3aUL,
- 0xbc96c510UL, 0xab5e2ab6UL, 0x3ff11edbUL, 0xf703fb72UL, 0xbc9ca454UL,
- 0xc06c31ccUL, 0x3ff12abdUL, 0xb36ca5c7UL, 0xbc51b514UL, 0x14f204abUL,
- 0x3ff136a8UL, 0xba48dcf0UL, 0xbc67108fUL, 0xaea92de0UL, 0x3ff1429aUL,
- 0x9af1369eUL, 0xbc932fbfUL, 0x934f312eUL, 0x3ff14e95UL, 0x39bf44abUL,
- 0xbc8b91e8UL, 0xc8a58e51UL, 0x3ff15a98UL, 0xb9eeab0aUL, 0x3c82406aUL,
- 0x5471c3c2UL, 0x3ff166a4UL, 0x82ea1a32UL, 0x3c58f23bUL, 0x3c7d517bUL,
- 0x3ff172b8UL, 0xb9d78a76UL, 0xbc819041UL, 0x8695bbc0UL, 0x3ff17ed4UL,
- 0xe2ac5a64UL, 0x3c709e3fUL, 0x388c8deaUL, 0x3ff18af9UL, 0xd1970f6cUL,
- 0xbc911023UL, 0x58375d2fUL, 0x3ff19726UL, 0x85f17e08UL, 0x3c94aaddUL,
- 0xeb6fcb75UL, 0x3ff1a35bUL, 0x7b4968e4UL, 0x3c8e5b4cUL, 0xf8138a1cUL,
- 0x3ff1af99UL, 0xa4b69280UL, 0x3c97bf85UL, 0x84045cd4UL, 0x3ff1bbe0UL,
- 0x352ef607UL, 0xbc995386UL, 0x95281c6bUL, 0x3ff1c82fUL, 0x8010f8c9UL,
- 0x3c900977UL, 0x3168b9aaUL, 0x3ff1d487UL, 0x00a2643cUL, 0x3c9e016eUL,
- 0x5eb44027UL, 0x3ff1e0e7UL, 0x088cb6deUL, 0xbc96fdd8UL, 0x22fcd91dUL,
- 0x3ff1ed50UL, 0x027bb78cUL, 0xbc91df98UL, 0x8438ce4dUL, 0x3ff1f9c1UL,
- 0xa097af5cUL, 0xbc9bf524UL, 0x88628cd6UL, 0x3ff2063bUL, 0x814a8495UL,
- 0x3c8dc775UL, 0x3578a819UL, 0x3ff212beUL, 0x2cfcaac9UL, 0x3c93592dUL,
- 0x917ddc96UL, 0x3ff21f49UL, 0x9494a5eeUL, 0x3c82a97eUL, 0xa27912d1UL,
- 0x3ff22bddUL, 0x5577d69fUL, 0x3c8d34fbUL, 0x6e756238UL, 0x3ff2387aUL,
- 0xb6c70573UL, 0x3c99b07eUL, 0xfb82140aUL, 0x3ff2451fUL, 0x911ca996UL,
- 0x3c8acfccUL, 0x4fb2a63fUL, 0x3ff251ceUL, 0xbef4f4a4UL, 0x3c8ac155UL,
- 0x711ece75UL, 0x3ff25e85UL, 0x4ac31b2cUL, 0x3c93e1a2UL, 0x65e27cddUL,
- 0x3ff26b45UL, 0x9940e9d9UL, 0x3c82bd33UL, 0x341ddf29UL, 0x3ff2780eUL,
- 0x05f9e76cUL, 0x3c9e067cUL, 0xe1f56381UL, 0x3ff284dfUL, 0x8c3f0d7eUL,
- 0xbc9a4c3aUL, 0x7591bb70UL, 0x3ff291baUL, 0x28401cbdUL, 0xbc82cc72UL,
- 0xf51fdee1UL, 0x3ff29e9dUL, 0xafad1255UL, 0x3c8612e8UL, 0x66d10f13UL,
- 0x3ff2ab8aUL, 0x191690a7UL, 0xbc995743UL, 0xd0dad990UL, 0x3ff2b87fUL,
- 0xd6381aa4UL, 0xbc410adcUL, 0x39771b2fUL, 0x3ff2c57eUL, 0xa6eb5124UL,
- 0xbc950145UL, 0xa6e4030bUL, 0x3ff2d285UL, 0x54db41d5UL, 0x3c900247UL,
- 0x1f641589UL, 0x3ff2df96UL, 0xfbbce198UL, 0x3c9d16cfUL, 0xa93e2f56UL,
- 0x3ff2ecafUL, 0x45d52383UL, 0x3c71ca0fUL, 0x4abd886bUL, 0x3ff2f9d2UL,
- 0x532bda93UL, 0xbc653c55UL, 0x0a31b715UL, 0x3ff306feUL, 0xd23182e4UL,
- 0x3c86f46aUL, 0xedeeb2fdUL, 0x3ff31432UL, 0xf3f3fcd1UL, 0x3c8959a3UL,
- 0xfc4cd831UL, 0x3ff32170UL, 0x8e18047cUL, 0x3c8a9ce7UL, 0x3ba8ea32UL,
- 0x3ff32eb8UL, 0x3cb4f318UL, 0xbc9c45e8UL, 0xb26416ffUL, 0x3ff33c08UL,
- 0x843659a6UL, 0x3c932721UL, 0x66e3fa2dUL, 0x3ff34962UL, 0x930881a4UL,
- 0xbc835a75UL, 0x5f929ff1UL, 0x3ff356c5UL, 0x5c4e4628UL, 0xbc8b5ceeUL,
- 0xa2de883bUL, 0x3ff36431UL, 0xa06cb85eUL, 0xbc8c3144UL, 0x373aa9cbUL,
- 0x3ff371a7UL, 0xbf42eae2UL, 0xbc963aeaUL, 0x231e754aUL, 0x3ff37f26UL,
- 0x9eceb23cUL, 0xbc99f5caUL, 0x6d05d866UL, 0x3ff38caeUL, 0x3c9904bdUL,
- 0xbc9e958dUL, 0x1b7140efUL, 0x3ff39a40UL, 0xfc8e2934UL, 0xbc99a9a5UL,
- 0x34e59ff7UL, 0x3ff3a7dbUL, 0xd661f5e3UL, 0xbc75e436UL, 0xbfec6cf4UL,
- 0x3ff3b57fUL, 0xe26fff18UL, 0x3c954c66UL, 0xc313a8e5UL, 0x3ff3c32dUL,
- 0x375d29c3UL, 0xbc9efff8UL, 0x44ede173UL, 0x3ff3d0e5UL, 0x8c284c71UL,
- 0x3c7fe8d0UL, 0x4c123422UL, 0x3ff3dea6UL, 0x11f09ebcUL, 0x3c8ada09UL,
- 0xdf1c5175UL, 0x3ff3ec70UL, 0x7b8c9bcaUL, 0xbc8af663UL, 0x04ac801cUL,
- 0x3ff3fa45UL, 0xf956f9f3UL, 0xbc97d023UL, 0xc367a024UL, 0x3ff40822UL,
- 0xb6f4d048UL, 0x3c8bddf8UL, 0x21f72e2aUL, 0x3ff4160aUL, 0x1c309278UL,
- 0xbc5ef369UL, 0x2709468aUL, 0x3ff423fbUL, 0xc0b314ddUL, 0xbc98462dUL,
- 0xd950a897UL, 0x3ff431f5UL, 0xe35f7999UL, 0xbc81c7ddUL, 0x3f84b9d4UL,
- 0x3ff43ffaUL, 0x9704c003UL, 0x3c8880beUL, 0x6061892dUL, 0x3ff44e08UL,
- 0x04ef80d0UL, 0x3c489b7aUL, 0x42a7d232UL, 0x3ff45c20UL, 0x82fb1f8eUL,
- 0xbc686419UL, 0xed1d0057UL, 0x3ff46a41UL, 0xd1648a76UL, 0x3c9c944bUL,
- 0x668b3237UL, 0x3ff4786dUL, 0xed445733UL, 0xbc9c20f0UL, 0xb5c13cd0UL,
- 0x3ff486a2UL, 0xb69062f0UL, 0x3c73c1a3UL, 0xe192aed2UL, 0x3ff494e1UL,
- 0x5e499ea0UL, 0xbc83b289UL, 0xf0d7d3deUL, 0x3ff4a32aUL, 0xf3d1be56UL,
- 0x3c99cb62UL, 0xea6db7d7UL, 0x3ff4b17dUL, 0x7f2897f0UL, 0xbc8125b8UL,
- 0xd5362a27UL, 0x3ff4bfdaUL, 0xafec42e2UL, 0x3c7d4397UL, 0xb817c114UL,
- 0x3ff4ce41UL, 0x690abd5dUL, 0x3c905e29UL, 0x99fddd0dUL, 0x3ff4dcb2UL,
- 0xbc6a7833UL, 0x3c98ecdbUL, 0x81d8abffUL, 0x3ff4eb2dUL, 0x2e5d7a52UL,
- 0xbc95257dUL, 0x769d2ca7UL, 0x3ff4f9b2UL, 0xd25957e3UL, 0xbc94b309UL,
- 0x7f4531eeUL, 0x3ff50841UL, 0x49b7465fUL, 0x3c7a249bUL, 0xa2cf6642UL,
- 0x3ff516daUL, 0x69bd93efUL, 0xbc8f7685UL, 0xe83f4eefUL, 0x3ff5257dUL,
- 0x43efef71UL, 0xbc7c998dUL, 0x569d4f82UL, 0x3ff5342bUL, 0x1db13cadUL,
- 0xbc807abeUL, 0xf4f6ad27UL, 0x3ff542e2UL, 0x192d5f7eUL, 0x3c87926dUL,
- 0xca5d920fUL, 0x3ff551a4UL, 0xefede59bUL, 0xbc8d689cUL, 0xdde910d2UL,
- 0x3ff56070UL, 0x168eebf0UL, 0xbc90fb6eUL, 0x36b527daUL, 0x3ff56f47UL,
- 0x011d93adUL, 0x3c99bb2cUL, 0xdbe2c4cfUL, 0x3ff57e27UL, 0x8a57b9c4UL,
- 0xbc90b98cUL, 0xd497c7fdUL, 0x3ff58d12UL, 0x5b9a1de8UL, 0x3c8295e1UL,
- 0x27ff07ccUL, 0x3ff59c08UL, 0xe467e60fUL, 0xbc97e2ceUL, 0xdd485429UL,
- 0x3ff5ab07UL, 0x054647adUL, 0x3c96324cUL, 0xfba87a03UL, 0x3ff5ba11UL,
- 0x4c233e1aUL, 0xbc9b77a1UL, 0x8a5946b7UL, 0x3ff5c926UL, 0x816986a2UL,
- 0x3c3c4b1bUL, 0x90998b93UL, 0x3ff5d845UL, 0xa8b45643UL, 0xbc9cd6a7UL,
- 0x15ad2148UL, 0x3ff5e76fUL, 0x3080e65eUL, 0x3c9ba6f9UL, 0x20dceb71UL,
- 0x3ff5f6a3UL, 0xe3cdcf92UL, 0xbc89eaddUL, 0xb976dc09UL, 0x3ff605e1UL,
- 0x9b56de47UL, 0xbc93e242UL, 0xe6cdf6f4UL, 0x3ff6152aUL, 0x4ab84c27UL,
- 0x3c9e4b3eUL, 0xb03a5585UL, 0x3ff6247eUL, 0x7e40b497UL, 0xbc9383c1UL,
- 0x1d1929fdUL, 0x3ff633ddUL, 0xbeb964e5UL, 0x3c984710UL, 0x34ccc320UL,
- 0x3ff64346UL, 0x759d8933UL, 0xbc8c483cUL, 0xfebc8fb7UL, 0x3ff652b9UL,
- 0xc9a73e09UL, 0xbc9ae3d5UL, 0x82552225UL, 0x3ff66238UL, 0x87591c34UL,
- 0xbc9bb609UL, 0xc70833f6UL, 0x3ff671c1UL, 0x586c6134UL, 0xbc8e8732UL,
- 0xd44ca973UL, 0x3ff68155UL, 0x44f73e65UL, 0x3c6038aeUL, 0xb19e9538UL,
- 0x3ff690f4UL, 0x9aeb445dUL, 0x3c8804bdUL, 0x667f3bcdUL, 0x3ff6a09eUL,
- 0x13b26456UL, 0xbc9bdd34UL, 0xfa75173eUL, 0x3ff6b052UL, 0x2c9a9d0eUL,
- 0x3c7a38f5UL, 0x750bdabfUL, 0x3ff6c012UL, 0x67ff0b0dUL, 0xbc728956UL,
- 0xddd47645UL, 0x3ff6cfdcUL, 0xb6f17309UL, 0x3c9c7aa9UL, 0x3c651a2fUL,
- 0x3ff6dfb2UL, 0x683c88abUL, 0xbc6bbe3aUL, 0x98593ae5UL, 0x3ff6ef92UL,
- 0x9e1ac8b2UL, 0xbc90b974UL, 0xf9519484UL, 0x3ff6ff7dUL, 0x25860ef6UL,
- 0xbc883c0fUL, 0x66f42e87UL, 0x3ff70f74UL, 0xd45aa65fUL, 0x3c59d644UL,
- 0xe8ec5f74UL, 0x3ff71f75UL, 0x86887a99UL, 0xbc816e47UL, 0x86ead08aUL,
- 0x3ff72f82UL, 0x2cd62c72UL, 0xbc920aa0UL, 0x48a58174UL, 0x3ff73f9aUL,
- 0x6c65d53cUL, 0xbc90a8d9UL, 0x35d7cbfdUL, 0x3ff74fbdUL, 0x618a6e1cUL,
- 0x3c9047fdUL, 0x564267c9UL, 0x3ff75febUL, 0x57316dd3UL, 0xbc902459UL,
- 0xb1ab6e09UL, 0x3ff77024UL, 0x169147f8UL, 0x3c9b7877UL, 0x4fde5d3fUL,
- 0x3ff78069UL, 0x0a02162dUL, 0x3c9866b8UL, 0x38ac1cf6UL, 0x3ff790b9UL,
- 0x62aadd3eUL, 0x3c9349a8UL, 0x73eb0187UL, 0x3ff7a114UL, 0xee04992fUL,
- 0xbc841577UL, 0x0976cfdbUL, 0x3ff7b17bUL, 0x8468dc88UL, 0xbc9bebb5UL,
- 0x0130c132UL, 0x3ff7c1edUL, 0xd1164dd6UL, 0x3c9f124cUL, 0x62ff86f0UL,
- 0x3ff7d26aUL, 0xfb72b8b4UL, 0x3c91bddbUL, 0x36cf4e62UL, 0x3ff7e2f3UL,
- 0xba15797eUL, 0x3c705d02UL, 0x8491c491UL, 0x3ff7f387UL, 0xcf9311aeUL,
- 0xbc807f11UL, 0x543e1a12UL, 0x3ff80427UL, 0x626d972bUL, 0xbc927c86UL,
- 0xadd106d9UL, 0x3ff814d2UL, 0x0d151d4dUL, 0x3c946437UL, 0x994cce13UL,
- 0x3ff82589UL, 0xd41532d8UL, 0xbc9d4c1dUL, 0x1eb941f7UL, 0x3ff8364cUL,
- 0x31df2bd5UL, 0x3c999b9aUL, 0x4623c7adUL, 0x3ff8471aUL, 0xa341cdfbUL,
- 0xbc88d684UL, 0x179f5b21UL, 0x3ff857f4UL, 0xf8b216d0UL, 0xbc5ba748UL,
- 0x9b4492edUL, 0x3ff868d9UL, 0x9bd4f6baUL, 0xbc9fc6f8UL, 0xd931a436UL,
- 0x3ff879caUL, 0xd2db47bdUL, 0x3c85d2d7UL, 0xd98a6699UL, 0x3ff88ac7UL,
- 0xf37cb53aUL, 0x3c9994c2UL, 0xa478580fUL, 0x3ff89bd0UL, 0x4475202aUL,
- 0x3c9d5395UL, 0x422aa0dbUL, 0x3ff8ace5UL, 0x56864b27UL, 0x3c96e9f1UL,
- 0xbad61778UL, 0x3ff8be05UL, 0xfc43446eUL, 0x3c9ecb5eUL, 0x16b5448cUL,
- 0x3ff8cf32UL, 0x32e9e3aaUL, 0xbc70d55eUL, 0x5e0866d9UL, 0x3ff8e06aUL,
- 0x6fc9b2e6UL, 0xbc97114aUL, 0x99157736UL, 0x3ff8f1aeUL, 0xa2e3976cUL,
- 0x3c85cc13UL, 0xd0282c8aUL, 0x3ff902feUL, 0x85fe3fd2UL, 0x3c9592caUL,
- 0x0b91ffc6UL, 0x3ff9145bUL, 0x2e582524UL, 0xbc9dd679UL, 0x53aa2fe2UL,
- 0x3ff925c3UL, 0xa639db7fUL, 0xbc83455fUL, 0xb0cdc5e5UL, 0x3ff93737UL,
- 0x81b57ebcUL, 0xbc675fc7UL, 0x2b5f98e5UL, 0x3ff948b8UL, 0x797d2d99UL,
- 0xbc8dc3d6UL, 0xcbc8520fUL, 0x3ff95a44UL, 0x96a5f039UL, 0xbc764b7cUL,
- 0x9a7670b3UL, 0x3ff96bddUL, 0x7f19c896UL, 0xbc5ba596UL, 0x9fde4e50UL,
- 0x3ff97d82UL, 0x7c1b85d1UL, 0xbc9d185bUL, 0xe47a22a2UL, 0x3ff98f33UL,
- 0xa24c78ecUL, 0x3c7cabdaUL, 0x70ca07baUL, 0x3ff9a0f1UL, 0x91cee632UL,
- 0xbc9173bdUL, 0x4d53fe0dUL, 0x3ff9b2bbUL, 0x4df6d518UL, 0xbc9dd84eUL,
- 0x82a3f090UL, 0x3ff9c491UL, 0xb071f2beUL, 0x3c7c7c46UL, 0x194bb8d5UL,
- 0x3ff9d674UL, 0xa3dd8233UL, 0xbc9516beUL, 0x19e32323UL, 0x3ff9e863UL,
- 0x78e64c6eUL, 0x3c7824caUL, 0x8d07f29eUL, 0x3ff9fa5eUL, 0xaaf1faceUL,
- 0xbc84a9ceUL, 0x7b5de565UL, 0x3ffa0c66UL, 0x5d1cd533UL, 0xbc935949UL,
- 0xed8eb8bbUL, 0x3ffa1e7aUL, 0xee8be70eUL, 0x3c9c6618UL, 0xec4a2d33UL,
- 0x3ffa309bUL, 0x7ddc36abUL, 0x3c96305cUL, 0x80460ad8UL, 0x3ffa42c9UL,
- 0x589fb120UL, 0xbc9aa780UL, 0xb23e255dUL, 0x3ffa5503UL, 0xdb8d41e1UL,
- 0xbc9d2f6eUL, 0x8af46052UL, 0x3ffa674aUL, 0x30670366UL, 0x3c650f56UL,
- 0x1330b358UL, 0x3ffa799eUL, 0xcac563c7UL, 0x3c9bcb7eUL, 0x53c12e59UL,
- 0x3ffa8bfeUL, 0xb2ba15a9UL, 0xbc94f867UL, 0x5579fdbfUL, 0x3ffa9e6bUL,
- 0x0ef7fd31UL, 0x3c90fac9UL, 0x21356ebaUL, 0x3ffab0e5UL, 0xdae94545UL,
- 0x3c889c31UL, 0xbfd3f37aUL, 0x3ffac36bUL, 0xcae76cd0UL, 0xbc8f9234UL,
- 0x3a3c2774UL, 0x3ffad5ffUL, 0xb6b1b8e5UL, 0x3c97ef3bUL, 0x995ad3adUL,
- 0x3ffae89fUL, 0x345dcc81UL, 0x3c97a1cdUL, 0xe622f2ffUL, 0x3ffafb4cUL,
- 0x0f315ecdUL, 0xbc94b2fcUL, 0x298db666UL, 0x3ffb0e07UL, 0x4c80e425UL,
- 0xbc9bdef5UL, 0x6c9a8952UL, 0x3ffb20ceUL, 0x4a0756ccUL, 0x3c94dd02UL,
- 0xb84f15fbUL, 0x3ffb33a2UL, 0x3084d708UL, 0xbc62805eUL, 0x15b749b1UL,
- 0x3ffb4684UL, 0xe9df7c90UL, 0xbc7f763dUL, 0x8de5593aUL, 0x3ffb5972UL,
- 0xbbba6de3UL, 0xbc9c71dfUL, 0x29f1c52aUL, 0x3ffb6c6eUL, 0x52883f6eUL,
- 0x3c92a8f3UL, 0xf2fb5e47UL, 0x3ffb7f76UL, 0x7e54ac3bUL, 0xbc75584fUL,
- 0xf22749e4UL, 0x3ffb928cUL, 0x54cb65c6UL, 0xbc9b7216UL, 0x30a1064aUL,
- 0x3ffba5b0UL, 0x0e54292eUL, 0xbc9efcd3UL, 0xb79a6f1fUL, 0x3ffbb8e0UL,
- 0xc9696205UL, 0xbc3f52d1UL, 0x904bc1d2UL, 0x3ffbcc1eUL, 0x7a2d9e84UL,
- 0x3c823dd0UL, 0xc3f3a207UL, 0x3ffbdf69UL, 0x60ea5b53UL, 0xbc3c2623UL,
- 0x5bd71e09UL, 0x3ffbf2c2UL, 0x3f6b9c73UL, 0xbc9efdcaUL, 0x6141b33dUL,
- 0x3ffc0628UL, 0xa1fbca34UL, 0xbc8d8a5aUL, 0xdd85529cUL, 0x3ffc199bUL,
- 0x895048ddUL, 0x3c811065UL, 0xd9fa652cUL, 0x3ffc2d1cUL, 0x17c8a5d7UL,
- 0xbc96e516UL, 0x5fffd07aUL, 0x3ffc40abUL, 0xe083c60aUL, 0x3c9b4537UL,
- 0x78fafb22UL, 0x3ffc5447UL, 0x2493b5afUL, 0x3c912f07UL, 0x2e57d14bUL,
- 0x3ffc67f1UL, 0xff483cadUL, 0x3c92884dUL, 0x8988c933UL, 0x3ffc7ba8UL,
- 0xbe255559UL, 0xbc8e76bbUL, 0x9406e7b5UL, 0x3ffc8f6dUL, 0x48805c44UL,
- 0x3c71acbcUL, 0x5751c4dbUL, 0x3ffca340UL, 0xd10d08f5UL, 0xbc87f2beUL,
- 0xdcef9069UL, 0x3ffcb720UL, 0xd1e949dbUL, 0x3c7503cbUL, 0x2e6d1675UL,
- 0x3ffccb0fUL, 0x86009092UL, 0xbc7d220fUL, 0x555dc3faUL, 0x3ffcdf0bUL,
- 0x53829d72UL, 0xbc8dd83bUL, 0x5b5bab74UL, 0x3ffcf315UL, 0xb86dff57UL,
- 0xbc9a08e9UL, 0x4a07897cUL, 0x3ffd072dUL, 0x43797a9cUL, 0xbc9cbc37UL,
- 0x2b08c968UL, 0x3ffd1b53UL, 0x219a36eeUL, 0x3c955636UL, 0x080d89f2UL,
- 0x3ffd2f87UL, 0x719d8578UL, 0xbc9d487bUL, 0xeacaa1d6UL, 0x3ffd43c8UL,
- 0xbf5a1614UL, 0x3c93db53UL, 0xdcfba487UL, 0x3ffd5818UL, 0xd75b3707UL,
- 0x3c82ed02UL, 0xe862e6d3UL, 0x3ffd6c76UL, 0x4a8165a0UL, 0x3c5fe87aUL,
- 0x16c98398UL, 0x3ffd80e3UL, 0x8beddfe8UL, 0xbc911ec1UL, 0x71ff6075UL,
- 0x3ffd955dUL, 0xbb9af6beUL, 0x3c9a052dUL, 0x03db3285UL, 0x3ffda9e6UL,
- 0x696db532UL, 0x3c9c2300UL, 0xd63a8315UL, 0x3ffdbe7cUL, 0x926b8be4UL,
- 0xbc9b76f1UL, 0xf301b460UL, 0x3ffdd321UL, 0x78f018c3UL, 0x3c92da57UL,
- 0x641c0658UL, 0x3ffde7d5UL, 0x8e79ba8fUL, 0xbc9ca552UL, 0x337b9b5fUL,
- 0x3ffdfc97UL, 0x4f184b5cUL, 0xbc91a5cdUL, 0x6b197d17UL, 0x3ffe1167UL,
- 0xbd5c7f44UL, 0xbc72b529UL, 0x14f5a129UL, 0x3ffe2646UL, 0x817a1496UL,
- 0xbc97b627UL, 0x3b16ee12UL, 0x3ffe3b33UL, 0x31fdc68bUL, 0xbc99f4a4UL,
- 0xe78b3ff6UL, 0x3ffe502eUL, 0x80a9cc8fUL, 0x3c839e89UL, 0x24676d76UL,
- 0x3ffe6539UL, 0x7522b735UL, 0xbc863ff8UL, 0xfbc74c83UL, 0x3ffe7a51UL,
- 0xca0c8de2UL, 0x3c92d522UL, 0x77cdb740UL, 0x3ffe8f79UL, 0x80b054b1UL,
- 0xbc910894UL, 0xa2a490daUL, 0x3ffea4afUL, 0x179c2893UL, 0xbc9e9c23UL,
- 0x867cca6eUL, 0x3ffeb9f4UL, 0x2293e4f2UL, 0x3c94832fUL, 0x2d8e67f1UL,
- 0x3ffecf48UL, 0xb411ad8cUL, 0xbc9c93f3UL, 0xa2188510UL, 0x3ffee4aaUL,
- 0xa487568dUL, 0x3c91c68dUL, 0xee615a27UL, 0x3ffefa1bUL, 0x86a4b6b0UL,
- 0x3c9dc7f4UL, 0x1cb6412aUL, 0x3fff0f9cUL, 0x65181d45UL, 0xbc932200UL,
- 0x376bba97UL, 0x3fff252bUL, 0xbf0d8e43UL, 0x3c93a1a5UL, 0x48dd7274UL,
- 0x3fff3ac9UL, 0x3ed837deUL, 0xbc795a5aUL, 0x5b6e4540UL, 0x3fff5076UL,
- 0x2dd8a18bUL, 0x3c99d3e1UL, 0x798844f8UL, 0x3fff6632UL, 0x3539343eUL,
- 0x3c9fa37bUL, 0xad9cbe14UL, 0x3fff7bfdUL, 0xd006350aUL, 0xbc9dbb12UL,
- 0x02243c89UL, 0x3fff91d8UL, 0xa779f689UL, 0xbc612ea8UL, 0x819e90d8UL,
- 0x3fffa7c1UL, 0xf3a5931eUL, 0x3c874853UL, 0x3692d514UL, 0x3fffbdbaUL,
- 0x15098eb6UL, 0xbc796773UL, 0x2b8f71f1UL, 0x3fffd3c2UL, 0x966579e7UL,
- 0x3c62eb74UL, 0x6b2a23d9UL, 0x3fffe9d9UL, 0x7442fde3UL, 0x3c74a603UL,
- 0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL, 0x6fba4e77UL,
- 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL, 0xfefa39efUL, 0x3fe62e42UL,
- 0x00000000UL, 0x00000000UL, 0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL,
- 0xbfe62e42UL, 0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL,
- 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL
-
-};
-
-//registers,
-// input: xmm0, xmm1
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// eax, edx, ecx, ebx
-
-// Code generated by Intel C compiler for LIBM library
-
-void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
- Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, L_2TAG_PACKET_14_0_2, L_2TAG_PACKET_15_0_2;
- Label L_2TAG_PACKET_16_0_2, L_2TAG_PACKET_17_0_2, L_2TAG_PACKET_18_0_2, L_2TAG_PACKET_19_0_2;
- Label L_2TAG_PACKET_20_0_2, L_2TAG_PACKET_21_0_2, L_2TAG_PACKET_22_0_2, L_2TAG_PACKET_23_0_2;
- Label L_2TAG_PACKET_24_0_2, L_2TAG_PACKET_25_0_2, L_2TAG_PACKET_26_0_2, L_2TAG_PACKET_27_0_2;
- Label L_2TAG_PACKET_28_0_2, L_2TAG_PACKET_29_0_2, L_2TAG_PACKET_30_0_2, L_2TAG_PACKET_31_0_2;
- Label L_2TAG_PACKET_32_0_2, L_2TAG_PACKET_33_0_2, L_2TAG_PACKET_34_0_2, L_2TAG_PACKET_35_0_2;
- Label L_2TAG_PACKET_36_0_2, L_2TAG_PACKET_37_0_2, L_2TAG_PACKET_38_0_2, L_2TAG_PACKET_39_0_2;
- Label L_2TAG_PACKET_40_0_2, L_2TAG_PACKET_41_0_2, L_2TAG_PACKET_42_0_2, L_2TAG_PACKET_43_0_2;
- Label L_2TAG_PACKET_44_0_2, L_2TAG_PACKET_45_0_2, L_2TAG_PACKET_46_0_2, L_2TAG_PACKET_47_0_2;
- Label L_2TAG_PACKET_48_0_2, L_2TAG_PACKET_49_0_2, L_2TAG_PACKET_50_0_2, L_2TAG_PACKET_51_0_2;
- Label L_2TAG_PACKET_52_0_2, L_2TAG_PACKET_53_0_2, L_2TAG_PACKET_54_0_2, L_2TAG_PACKET_55_0_2;
- Label L_2TAG_PACKET_56_0_2, L_2TAG_PACKET_57_0_2, L_2TAG_PACKET_58_0_2, start;
-
- assert_different_registers(tmp, eax, ecx, edx);
-
- address static_const_table_pow = (address)_static_const_table_pow;
-
- bind(start);
- subl(rsp, 120);
- movl(Address(rsp, 64), tmp);
- lea(tmp, ExternalAddress(static_const_table_pow));
- movsd(xmm0, Address(rsp, 128));
- movsd(xmm1, Address(rsp, 136));
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- movl(ecx, 1069088768);
- movdl(xmm7, ecx);
- movsd(Address(rsp, 16), xmm1);
- xorpd(xmm1, xmm1);
- movl(edx, 30704);
- pinsrw(xmm1, edx, 3);
- movsd(Address(rsp, 8), xmm0);
- movdqu(xmm3, xmm0);
- movl(edx, 8192);
- movdl(xmm4, edx);
- movdqu(xmm6, Address(tmp, 8240));
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- psllq(xmm0, 5);
- movsd(xmm2, Address(tmp, 8256));
- psrlq(xmm0, 34);
- movl(edx, eax);
- andl(edx, 32752);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- rcpss(xmm0, xmm0);
- psllq(xmm3, 12);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- psrlq(xmm3, 12);
- movl(Address(rsp, 24), rsi);
- subl(eax, 16);
- cmpl(eax, 32736);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
- movl(rsi, 0);
-
- bind(L_2TAG_PACKET_1_0_2);
- mulss(xmm0, xmm7);
- movl(edx, -1);
- subl(ecx, 4);
- shll(edx);
- movdl(xmm5, edx);
- por(xmm3, xmm1);
- subl(eax, 16351);
- cmpl(eax, 1);
- jcc(Assembler::belowEqual, L_2TAG_PACKET_2_0_2);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm3);
-
- bind(L_2TAG_PACKET_3_0_2);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- subl(eax, 1);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
-
- bind(L_2TAG_PACKET_4_0_2);
- mulsd(xmm3, xmm0);
- movdqu(xmm1, Address(tmp, 8272));
- subsd(xmm5, xmm2);
- movdqu(xmm4, Address(tmp, 8288));
- movl(ecx, eax);
- sarl(eax, 31);
- addl(ecx, eax);
- xorl(eax, ecx);
- addl(eax, 1);
- bsrl(eax, eax);
- unpcklpd(xmm5, xmm3);
- movdqu(xmm6, Address(tmp, 8304));
- addsd(xmm3, xmm5);
- andl(edx, 16760832);
- shrl(edx, 10);
- addpd(xmm5, Address(tmp, edx, Address::times_1, -3616));
- movdqu(xmm0, Address(tmp, 8320));
- pshufd(xmm2, xmm3, 68);
- mulsd(xmm3, xmm3);
- mulpd(xmm1, xmm2);
- mulpd(xmm4, xmm2);
- addsd(xmm5, xmm7);
- mulsd(xmm2, xmm3);
- addpd(xmm6, xmm1);
- mulsd(xmm3, xmm3);
- addpd(xmm0, xmm4);
- movsd(xmm1, Address(rsp, 16));
- movzwl(ecx, Address(rsp, 22));
- pshufd(xmm7, xmm5, 238);
- movsd(xmm4, Address(tmp, 8368));
- mulpd(xmm6, xmm2);
- pshufd(xmm3, xmm3, 68);
- mulpd(xmm0, xmm2);
- shll(eax, 4);
- subl(eax, 15872);
- andl(ecx, 32752);
- addl(eax, ecx);
- mulpd(xmm3, xmm6);
- cmpl(eax, 624);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
- xorpd(xmm6, xmm6);
- movl(edx, 17080);
- pinsrw(xmm6, edx, 3);
- movdqu(xmm2, xmm1);
- pand(xmm4, xmm1);
- subsd(xmm1, xmm4);
- mulsd(xmm4, xmm5);
- addsd(xmm0, xmm7);
- mulsd(xmm1, xmm5);
- movdqu(xmm7, xmm6);
- addsd(xmm6, xmm4);
- addpd(xmm3, xmm0);
- movdl(edx, xmm6);
- subsd(xmm6, xmm7);
- pshufd(xmm0, xmm3, 238);
- subsd(xmm4, xmm6);
- addsd(xmm0, xmm3);
- movl(ecx, edx);
- andl(edx, 255);
- addl(edx, edx);
- movdqu(xmm5, Address(tmp, edx, Address::times_8, 8384));
- addsd(xmm4, xmm1);
- mulsd(xmm2, xmm0);
- movdqu(xmm7, Address(tmp, 12480));
- movdqu(xmm3, Address(tmp, 12496));
- shll(ecx, 12);
- xorl(ecx, rsi);
- andl(ecx, -1048576);
- movdl(xmm6, ecx);
- addsd(xmm2, xmm4);
- movsd(xmm1, Address(tmp, 12512));
- pshufd(xmm0, xmm2, 68);
- pshufd(xmm4, xmm2, 68);
- mulpd(xmm0, xmm0);
- movl(rsi, Address(rsp, 24));
- mulpd(xmm7, xmm4);
- pshufd(xmm6, xmm6, 17);
- mulsd(xmm1, xmm2);
- mulsd(xmm0, xmm0);
- paddd(xmm5, xmm6);
- addpd(xmm3, xmm7);
- mulsd(xmm1, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulpd(xmm0, xmm3);
- addsd(xmm1, xmm6);
- pshufd(xmm3, xmm0, 238);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm3);
- addsd(xmm0, xmm5);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_7_0_2);
- movsd(xmm0, Address(rsp, 128));
- movsd(xmm1, Address(rsp, 136));
- mulsd(xmm0, xmm1);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_0_0_2);
- addl(eax, 16);
- movl(edx, 32752);
- andl(edx, eax);
- cmpl(edx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
- testl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_2);
-
- bind(L_2TAG_PACKET_10_0_2);
- movl(ecx, Address(rsp, 16));
- xorl(edx, edx);
- testl(ecx, ecx);
- movl(ecx, 1);
- cmovl(Assembler::notEqual, edx, ecx);
- orl(edx, Address(rsp, 20));
- cmpl(edx, 1072693248);
- jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
- movsd(xmm0, Address(rsp, 8));
- movsd(xmm3, Address(rsp, 8));
- movdl(edx, xmm3);
- psrlq(xmm3, 32);
- movdl(ecx, xmm3);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
- xorpd(xmm3, xmm3);
- movl(eax, 18416);
- pinsrw(xmm3, eax, 3);
- mulsd(xmm0, xmm3);
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm3, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- movl(ecx, 18416);
- psllq(xmm0, 5);
- movsd(xmm2, Address(tmp, 8256));
- psrlq(xmm0, 34);
- rcpss(xmm0, xmm0);
- psllq(xmm3, 12);
- movdqu(xmm6, Address(tmp, 8240));
- psrlq(xmm3, 12);
- mulss(xmm0, xmm7);
- movl(edx, -1024);
- movdl(xmm5, edx);
- por(xmm3, xmm1);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm3);
- movl(rsi, 0);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- andl(eax, 32752);
- subl(eax, 18416);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- jmp(L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_12_0_2);
- movl(ecx, Address(rsp, 16));
- xorl(edx, edx);
- testl(ecx, ecx);
- movl(ecx, 1);
- cmovl(Assembler::notEqual, edx, ecx);
- orl(edx, Address(rsp, 20));
- cmpl(edx, 1072693248);
- jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
- movsd(xmm0, Address(rsp, 8));
- movsd(xmm3, Address(rsp, 8));
- movdl(edx, xmm3);
- psrlq(xmm3, 32);
- movdl(ecx, xmm3);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
- xorpd(xmm3, xmm3);
- movl(eax, 18416);
- pinsrw(xmm3, eax, 3);
- mulsd(xmm0, xmm3);
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm3, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- movl(ecx, 18416);
- psllq(xmm0, 5);
- movsd(xmm2, Address(tmp, 8256));
- psrlq(xmm0, 34);
- rcpss(xmm0, xmm0);
- psllq(xmm3, 12);
- movdqu(xmm6, Address(tmp, 8240));
- psrlq(xmm3, 12);
- mulss(xmm0, xmm7);
- movl(edx, -1024);
- movdl(xmm5, edx);
- por(xmm3, xmm1);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm3);
- movl(rsi, INT_MIN);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- andl(eax, 32752);
- subl(eax, 18416);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- jmp(L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_5_0_2);
- cmpl(eax, 0);
- jcc(Assembler::less, L_2TAG_PACKET_13_0_2);
- cmpl(eax, 752);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_14_0_2);
-
- bind(L_2TAG_PACKET_15_0_2);
- addsd(xmm0, xmm7);
- movsd(xmm2, Address(tmp, 12544));
- addpd(xmm3, xmm0);
- xorpd(xmm6, xmm6);
- movl(eax, 17080);
- pinsrw(xmm6, eax, 3);
- pshufd(xmm0, xmm3, 238);
- addsd(xmm0, xmm3);
- movdqu(xmm3, xmm5);
- addsd(xmm5, xmm0);
- movdqu(xmm4, xmm2);
- subsd(xmm3, xmm5);
- movdqu(xmm7, xmm5);
- pand(xmm5, xmm2);
- movdqu(xmm2, xmm1);
- pand(xmm4, xmm1);
- subsd(xmm7, xmm5);
- addsd(xmm0, xmm3);
- subsd(xmm1, xmm4);
- mulsd(xmm4, xmm5);
- addsd(xmm0, xmm7);
- mulsd(xmm2, xmm0);
- movdqu(xmm7, xmm6);
- mulsd(xmm1, xmm5);
- addsd(xmm6, xmm4);
- movdl(eax, xmm6);
- subsd(xmm6, xmm7);
- addsd(xmm2, xmm1);
- movdqu(xmm7, Address(tmp, 12480));
- movdqu(xmm3, Address(tmp, 12496));
- subsd(xmm4, xmm6);
- pextrw(edx, xmm6, 3);
- movl(ecx, eax);
- andl(eax, 255);
- addl(eax, eax);
- movdqu(xmm5, Address(tmp, eax, Address::times_8, 8384));
- addsd(xmm2, xmm4);
- sarl(ecx, 8);
- movl(eax, ecx);
- sarl(ecx, 1);
- subl(eax, ecx);
- shll(ecx, 20);
- xorl(ecx, rsi);
- movdl(xmm6, ecx);
- movsd(xmm1, Address(tmp, 12512));
- andl(edx, 32767);
- cmpl(edx, 16529);
- jcc(Assembler::above, L_2TAG_PACKET_14_0_2);
- pshufd(xmm0, xmm2, 68);
- pshufd(xmm4, xmm2, 68);
- mulpd(xmm0, xmm0);
- mulpd(xmm7, xmm4);
- pshufd(xmm6, xmm6, 17);
- mulsd(xmm1, xmm2);
- mulsd(xmm0, xmm0);
- paddd(xmm5, xmm6);
- addpd(xmm3, xmm7);
- mulsd(xmm1, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulpd(xmm0, xmm3);
- addsd(xmm1, xmm6);
- pshufd(xmm3, xmm0, 238);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- shll(eax, 4);
- xorpd(xmm4, xmm4);
- addl(eax, 16368);
- pinsrw(xmm4, eax, 3);
- addsd(xmm0, xmm1);
- movl(rsi, Address(rsp, 24));
- addsd(xmm0, xmm3);
- movdqu(xmm1, xmm0);
- addsd(xmm0, xmm5);
- mulsd(xmm0, xmm4);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_18_0_2);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_8_0_2);
- movsd(xmm1, Address(rsp, 16));
- movsd(xmm0, Address(rsp, 8));
- movdqu(xmm2, xmm0);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_19_0_2);
- addsd(xmm0, xmm0);
- movdl(eax, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_20_0_2);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_20_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- movl(edx, 29);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_22_0_2);
- movsd(xmm0, Address(rsp, 16));
- addpd(xmm0, xmm0);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_19_0_2);
- movdl(eax, xmm1);
- movdqu(xmm2, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_23_0_2);
- pextrw(eax, xmm2, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
-
- bind(L_2TAG_PACKET_24_0_2);
- pextrw(eax, xmm0, 3);
- testl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_25_0_2);
- testl(ecx, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_26_0_2);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_27_0_2);
- movsd(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_28_0_2);
- testl(eax, 2);
- jcc(Assembler::notEqual, L_2TAG_PACKET_29_0_2);
- jmp(L_2TAG_PACKET_28_0_2);
-
- bind(L_2TAG_PACKET_25_0_2);
- shrl(ecx, 20);
- andl(ecx, 2047);
- cmpl(ecx, 1075);
- jcc(Assembler::above, L_2TAG_PACKET_28_0_2);
- jcc(Assembler::equal, L_2TAG_PACKET_30_0_2);
- cmpl(ecx, 1074);
- jcc(Assembler::above, L_2TAG_PACKET_27_0_2);
- cmpl(ecx, 1023);
- jcc(Assembler::below, L_2TAG_PACKET_28_0_2);
- movsd(xmm1, Address(rsp, 16));
- movl(eax, 17208);
- xorpd(xmm3, xmm3);
- pinsrw(xmm3, eax, 3);
- movdqu(xmm4, xmm3);
- addsd(xmm3, xmm1);
- subsd(xmm4, xmm3);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_28_0_2);
- movdl(eax, xmm3);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
-
- bind(L_2TAG_PACKET_29_0_2);
- movsd(xmm1, Address(rsp, 16));
- pextrw(eax, xmm1, 3);
- andl(eax, 32768);
- jcc(Assembler::equal, L_2TAG_PACKET_18_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32768);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_28_0_2);
- movsd(xmm1, Address(rsp, 16));
- pextrw(eax, xmm1, 3);
- andl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_26_0_2);
-
- bind(L_2TAG_PACKET_31_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32752);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_30_0_2);
- movsd(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
- jmp(L_2TAG_PACKET_29_0_2);
-
- bind(L_2TAG_PACKET_32_0_2);
- movdl(eax, xmm1);
- psrlq(xmm1, 20);
- movdl(edx, xmm1);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_33_0_2);
- movsd(xmm0, Address(rsp, 16));
- addsd(xmm0, xmm0);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_33_0_2);
- movsd(xmm0, Address(rsp, 8));
- pextrw(eax, xmm0, 3);
- cmpl(eax, 49136);
- jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
- movdl(ecx, xmm0);
- psrlq(xmm0, 20);
- movdl(edx, xmm0);
- orl(ecx, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32760);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_34_0_2);
- movsd(xmm1, Address(rsp, 16));
- andl(eax, 32752);
- subl(eax, 16368);
- pextrw(edx, xmm1, 3);
- xorpd(xmm0, xmm0);
- xorl(eax, edx);
- andl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
- movl(ecx, 32752);
- pinsrw(xmm0, ecx, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_35_0_2);
- movdl(eax, xmm1);
- cmpl(edx, 17184);
- jcc(Assembler::above, L_2TAG_PACKET_36_0_2);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_37_0_2);
- testl(eax, 2);
- jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
- jmp(L_2TAG_PACKET_39_0_2);
-
- bind(L_2TAG_PACKET_36_0_2);
- testl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
- jmp(L_2TAG_PACKET_39_0_2);
-
- bind(L_2TAG_PACKET_9_0_2);
- movsd(xmm2, Address(rsp, 8));
- movdl(eax, xmm2);
- psrlq(xmm2, 31);
- movdl(ecx, xmm2);
- orl(eax, ecx);
- jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
- movsd(xmm1, Address(rsp, 16));
- pextrw(edx, xmm1, 3);
- movdl(eax, xmm1);
- movdqu(xmm2, xmm1);
- psrlq(xmm2, 32);
- movdl(ecx, xmm2);
- addl(ecx, ecx);
- orl(ecx, eax);
- jcc(Assembler::equal, L_2TAG_PACKET_40_0_2);
- andl(edx, 32752);
- cmpl(edx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_32_0_2);
- cmpl(edx, 17200);
- jcc(Assembler::above, L_2TAG_PACKET_38_0_2);
- cmpl(edx, 17184);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_35_0_2);
- cmpl(edx, 16368);
- jcc(Assembler::below, L_2TAG_PACKET_37_0_2);
- movl(eax, 17208);
- xorpd(xmm2, xmm2);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm4, xmm2);
- addsd(xmm2, xmm1);
- subsd(xmm4, xmm2);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32767);
- jcc(Assembler::notEqual, L_2TAG_PACKET_37_0_2);
- movdl(eax, xmm2);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
-
- bind(L_2TAG_PACKET_39_0_2);
- xorpd(xmm1, xmm1);
- movl(edx, 30704);
- pinsrw(xmm1, edx, 3);
- movsd(xmm2, Address(tmp, 8256));
- movsd(xmm4, Address(rsp, 8));
- pextrw(eax, xmm4, 3);
- movl(edx, 8192);
- movdl(xmm4, edx);
- andl(eax, 32767);
- subl(eax, 16);
- jcc(Assembler::less, L_2TAG_PACKET_12_0_2);
- movl(edx, eax);
- andl(edx, 32752);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- movl(rsi, INT_MIN);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_37_0_2);
- xorpd(xmm1, xmm1);
- movl(eax, 32752);
- pinsrw(xmm1, eax, 3);
- xorpd(xmm0, xmm0);
- mulsd(xmm0, xmm1);
- movl(edx, 28);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_38_0_2);
- xorpd(xmm1, xmm1);
- movl(edx, 30704);
- pinsrw(xmm1, edx, 3);
- movsd(xmm2, Address(tmp, 8256));
- movsd(xmm4, Address(rsp, 8));
- pextrw(eax, xmm4, 3);
- movl(edx, 8192);
- movdl(xmm4, edx);
- andl(eax, 32767);
- subl(eax, 16);
- jcc(Assembler::less, L_2TAG_PACKET_10_0_2);
- movl(edx, eax);
- andl(edx, 32752);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- movl(rsi, 0);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_23_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_26_0_2);
- xorpd(xmm0, xmm0);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_13_0_2);
- addl(eax, 384);
- cmpl(eax, 0);
- jcc(Assembler::less, L_2TAG_PACKET_41_0_2);
- mulsd(xmm5, xmm1);
- addsd(xmm0, xmm7);
- shrl(rsi, 31);
- addpd(xmm3, xmm0);
- pshufd(xmm0, xmm3, 238);
- addsd(xmm3, xmm0);
- movsd(xmm4, Address(tmp, rsi, Address::times_8, 12528));
- mulsd(xmm1, xmm3);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- shll(rsi, 15);
- orl(eax, rsi);
- pinsrw(xmm0, eax, 3);
- addsd(xmm5, xmm1);
- movl(rsi, Address(rsp, 24));
- mulsd(xmm5, xmm4);
- addsd(xmm0, xmm5);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_41_0_2);
- movl(rsi, Address(rsp, 24));
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_40_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_42_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- movl(edx, 26);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_11_0_2);
- movsd(xmm1, Address(rsp, 16));
- movdqu(xmm2, xmm1);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_43_0_2);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
-
- bind(L_2TAG_PACKET_43_0_2);
- movdl(eax, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_42_0_2);
- shrl(edx, 21);
- cmpl(edx, 1075);
- jcc(Assembler::above, L_2TAG_PACKET_44_0_2);
- jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
- cmpl(edx, 1023);
- jcc(Assembler::below, L_2TAG_PACKET_44_0_2);
- movsd(xmm1, Address(rsp, 16));
- movl(eax, 17208);
- xorpd(xmm3, xmm3);
- pinsrw(xmm3, eax, 3);
- movdqu(xmm4, xmm3);
- addsd(xmm3, xmm1);
- subsd(xmm4, xmm3);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_44_0_2);
- movdl(eax, xmm3);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_44_0_2);
-
- bind(L_2TAG_PACKET_46_0_2);
- movsd(xmm0, Address(rsp, 8));
- testl(ecx, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_47_0_2);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_45_0_2);
- movsd(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_46_0_2);
-
- bind(L_2TAG_PACKET_44_0_2);
- testl(ecx, INT_MIN);
- jcc(Assembler::equal, L_2TAG_PACKET_26_0_2);
- xorpd(xmm0, xmm0);
-
- bind(L_2TAG_PACKET_47_0_2);
- movl(eax, 16368);
- xorpd(xmm1, xmm1);
- pinsrw(xmm1, eax, 3);
- divsd(xmm1, xmm0);
- movdqu(xmm0, xmm1);
- movl(edx, 27);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_14_0_2);
- movsd(xmm2, Address(rsp, 8));
- movsd(xmm6, Address(rsp, 16));
- pextrw(eax, xmm2, 3);
- pextrw(edx, xmm6, 3);
- movl(ecx, 32752);
- andl(ecx, edx);
- cmpl(ecx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
- andl(eax, 32752);
- subl(eax, 16368);
- xorl(edx, eax);
- testl(edx, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_49_0_2);
-
- bind(L_2TAG_PACKET_50_0_2);
- movl(eax, 32736);
- pinsrw(xmm0, eax, 3);
- shrl(rsi, 16);
- orl(eax, rsi);
- pinsrw(xmm1, eax, 3);
- movl(rsi, Address(rsp, 24));
- mulsd(xmm0, xmm1);
-
- bind(L_2TAG_PACKET_17_0_2);
- movl(edx, 24);
-
- bind(L_2TAG_PACKET_21_0_2);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_49_0_2);
- movl(eax, 16);
- pinsrw(xmm0, eax, 3);
- mulsd(xmm0, xmm0);
- testl(rsi, INT_MIN);
- jcc(Assembler::equal, L_2TAG_PACKET_51_0_2);
- movsd(xmm2, Address(tmp, 12560));
- xorpd(xmm0, xmm2);
-
- bind(L_2TAG_PACKET_51_0_2);
- movl(rsi, Address(rsp, 24));
- movl(edx, 25);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_16_0_2);
- pextrw(ecx, xmm5, 3);
- pextrw(edx, xmm4, 3);
- movl(eax, -1);
- andl(ecx, 32752);
- subl(ecx, 16368);
- andl(edx, 32752);
- addl(edx, ecx);
- movl(ecx, -31);
- sarl(edx, 4);
- subl(ecx, edx);
- jcc(Assembler::lessEqual, L_2TAG_PACKET_52_0_2);
- cmpl(ecx, 20);
- jcc(Assembler::above, L_2TAG_PACKET_53_0_2);
- shll(eax);
-
- bind(L_2TAG_PACKET_52_0_2);
- movdl(xmm0, eax);
- psllq(xmm0, 32);
- pand(xmm0, xmm5);
- subsd(xmm5, xmm0);
- addsd(xmm5, xmm1);
- mulsd(xmm0, xmm4);
- mulsd(xmm5, xmm4);
- addsd(xmm0, xmm5);
-
- bind(L_2TAG_PACKET_53_0_2);
- movl(edx, 25);
- jmp(L_2TAG_PACKET_21_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movzwl(ecx, Address(rsp, 22));
- movl(edx, INT_MIN);
- movdl(xmm1, edx);
- xorpd(xmm7, xmm7);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- paddq(xmm1, xmm3);
- pand(xmm5, xmm1);
- andl(ecx, 32752);
- cmpl(ecx, 16560);
- jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- addl(eax, 16351);
- shrl(eax, 4);
- subl(eax, 1022);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- movsd(xmm4, Address(tmp, 0));
- mulsd(xmm3, xmm0);
- movsd(xmm6, Address(tmp, 0));
- subsd(xmm5, xmm2);
- movsd(xmm1, Address(tmp, 8));
- pshufd(xmm2, xmm3, 68);
- unpcklpd(xmm5, xmm3);
- addsd(xmm3, xmm5);
- movsd(xmm0, Address(tmp, 8));
- andl(edx, 16760832);
- shrl(edx, 10);
- addpd(xmm7, Address(tmp, edx, Address::times_1, -3616));
- mulsd(xmm4, xmm5);
- mulsd(xmm0, xmm5);
- mulsd(xmm6, xmm2);
- mulsd(xmm1, xmm2);
- movdqu(xmm2, xmm5);
- mulsd(xmm4, xmm5);
- addsd(xmm5, xmm0);
- movdqu(xmm0, xmm7);
- addsd(xmm2, xmm3);
- addsd(xmm7, xmm5);
- mulsd(xmm6, xmm2);
- subsd(xmm0, xmm7);
- movdqu(xmm2, xmm7);
- addsd(xmm7, xmm4);
- addsd(xmm0, xmm5);
- subsd(xmm2, xmm7);
- addsd(xmm4, xmm2);
- pshufd(xmm2, xmm5, 238);
- movdqu(xmm5, xmm7);
- addsd(xmm7, xmm2);
- addsd(xmm4, xmm0);
- movdqu(xmm0, Address(tmp, 8272));
- subsd(xmm5, xmm7);
- addsd(xmm6, xmm4);
- movdqu(xmm4, xmm7);
- addsd(xmm5, xmm2);
- addsd(xmm7, xmm1);
- movdqu(xmm2, Address(tmp, 8336));
- subsd(xmm4, xmm7);
- addsd(xmm6, xmm5);
- addsd(xmm4, xmm1);
- pshufd(xmm5, xmm7, 238);
- movdqu(xmm1, xmm7);
- addsd(xmm7, xmm5);
- subsd(xmm1, xmm7);
- addsd(xmm1, xmm5);
- movdqu(xmm5, Address(tmp, 8352));
- pshufd(xmm3, xmm3, 68);
- addsd(xmm6, xmm4);
- addsd(xmm6, xmm1);
- movdqu(xmm1, Address(tmp, 8304));
- mulpd(xmm0, xmm3);
- mulpd(xmm2, xmm3);
- pshufd(xmm4, xmm3, 68);
- mulpd(xmm3, xmm3);
- addpd(xmm0, xmm1);
- addpd(xmm5, xmm2);
- mulsd(xmm4, xmm3);
- movsd(xmm2, Address(tmp, 16));
- mulpd(xmm3, xmm3);
- movsd(xmm1, Address(rsp, 16));
- movzwl(ecx, Address(rsp, 22));
- mulpd(xmm0, xmm4);
- pextrw(eax, xmm7, 3);
- mulpd(xmm5, xmm4);
- mulpd(xmm0, xmm3);
- movsd(xmm4, Address(tmp, 8376));
- pand(xmm2, xmm7);
- addsd(xmm5, xmm6);
- subsd(xmm7, xmm2);
- addpd(xmm5, xmm0);
- andl(eax, 32752);
- subl(eax, 16368);
- andl(ecx, 32752);
- cmpl(ecx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
- addl(ecx, eax);
- cmpl(ecx, 16576);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_54_0_2);
- pshufd(xmm0, xmm5, 238);
- pand(xmm4, xmm1);
- movdqu(xmm3, xmm1);
- addsd(xmm5, xmm0);
- subsd(xmm1, xmm4);
- xorpd(xmm6, xmm6);
- movl(edx, 17080);
- pinsrw(xmm6, edx, 3);
- addsd(xmm7, xmm5);
- mulsd(xmm4, xmm2);
- mulsd(xmm1, xmm2);
- movdqu(xmm5, xmm6);
- mulsd(xmm3, xmm7);
- addsd(xmm6, xmm4);
- addsd(xmm1, xmm3);
- movdqu(xmm7, Address(tmp, 12480));
- movdl(edx, xmm6);
- subsd(xmm6, xmm5);
- movdqu(xmm3, Address(tmp, 12496));
- movsd(xmm2, Address(tmp, 12512));
- subsd(xmm4, xmm6);
- movl(ecx, edx);
- andl(edx, 255);
- addl(edx, edx);
- movdqu(xmm5, Address(tmp, edx, Address::times_8, 8384));
- addsd(xmm4, xmm1);
- pextrw(edx, xmm6, 3);
- shrl(ecx, 8);
- movl(eax, ecx);
- shrl(ecx, 1);
- subl(eax, ecx);
- shll(ecx, 20);
- movdl(xmm6, ecx);
- pshufd(xmm0, xmm4, 68);
- pshufd(xmm1, xmm4, 68);
- mulpd(xmm0, xmm0);
- mulpd(xmm7, xmm1);
- pshufd(xmm6, xmm6, 17);
- mulsd(xmm2, xmm4);
- andl(edx, 32767);
- cmpl(edx, 16529);
- jcc(Assembler::above, L_2TAG_PACKET_14_0_2);
- mulsd(xmm0, xmm0);
- paddd(xmm5, xmm6);
- addpd(xmm3, xmm7);
- mulsd(xmm2, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulpd(xmm0, xmm3);
- addsd(xmm2, xmm6);
- pshufd(xmm3, xmm0, 238);
- addl(eax, 1023);
- shll(eax, 20);
- orl(eax, rsi);
- movdl(xmm4, eax);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- addsd(xmm0, xmm2);
- psllq(xmm4, 32);
- addsd(xmm0, xmm3);
- movdqu(xmm1, xmm0);
- addsd(xmm0, xmm5);
- movl(rsi, Address(rsp, 24));
- mulsd(xmm0, xmm4);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_55_0_2);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_48_0_2);
- movl(rsi, Address(rsp, 24));
-
- bind(L_2TAG_PACKET_56_0_2);
- movsd(xmm0, Address(rsp, 8));
- movsd(xmm1, Address(rsp, 16));
- addsd(xmm1, xmm1);
- xorpd(xmm2, xmm2);
- movl(eax, 49136);
- pinsrw(xmm2, eax, 3);
- addsd(xmm2, xmm0);
- pextrw(eax, xmm2, 3);
- cmpl(eax, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_57_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32760);
- pinsrw(xmm0, eax, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_57_0_2);
- movdl(edx, xmm1);
- movdqu(xmm3, xmm1);
- psrlq(xmm3, 20);
- movdl(ecx, xmm3);
- orl(ecx, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_58_0_2);
- addsd(xmm1, xmm1);
- movdqu(xmm0, xmm1);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_58_0_2);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- pextrw(edx, xmm1, 3);
- xorpd(xmm0, xmm0);
- subl(eax, 16368);
- xorl(eax, edx);
- testl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
- movl(edx, 32752);
- pinsrw(xmm0, edx, 3);
- jmp(L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_54_0_2);
- pextrw(eax, xmm1, 3);
- pextrw(ecx, xmm2, 3);
- xorl(eax, ecx);
- testl(eax, 32768);
- jcc(Assembler::equal, L_2TAG_PACKET_50_0_2);
- jmp(L_2TAG_PACKET_49_0_2);
-
- bind(L_2TAG_PACKET_6_0_2);
- movl(tmp, Address(rsp, 64));
-
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - SIN()
-// ---------------------
-//
-// 1. RANGE REDUCTION
-//
-// We perform an initial range reduction from X to r with
-//
-// X =~= N * pi/32 + r
-//
-// so that |r| <= pi/64 + epsilon. We restrict inputs to those
-// where |N| <= 932560. Beyond this, the range reduction is
-// insufficiently accurate. For extremely small inputs,
-// denormalization can occur internally, impacting performance.
-// This means that the main path is actually only taken for
-// 2^-252 <= |X| < 90112.
-//
-// To avoid branches, we perform the range reduction to full
-// accuracy each time.
-//
-// X - N * (P_1 + P_2 + P_3)
-//
-// where P_1 and P_2 are 32-bit numbers (so multiplication by N
-// is exact) and P_3 is a 53-bit number. Together, these
-// approximate pi well enough for all cases in the restricted
-// range.
-//
-// The main reduction sequence is:
-//
-// y = 32/pi * x
-// N = integer(y)
-// (computed by adding and subtracting off SHIFTER)
-//
-// m_1 = N * P_1
-// m_2 = N * P_2
-// r_1 = x - m_1
-// r = r_1 - m_2
-// (this r can be used for most of the calculation)
-//
-// c_1 = r_1 - r
-// m_3 = N * P_3
-// c_2 = c_1 - m_2
-// c = c_2 - m_3
-//
-// 2. MAIN ALGORITHM
-//
-// The algorithm uses a table lookup based on B = M * pi / 32
-// where M = N mod 64. The stored values are:
-// sigma closest power of 2 to cos(B)
-// C_hl 53-bit cos(B) - sigma
-// S_hi + S_lo 2 * 53-bit sin(B)
-//
-// The computation is organized as follows:
-//
-// sin(B + r + c) = [sin(B) + sigma * r] +
-// r * (cos(B) - sigma) +
-// sin(B) * [cos(r + c) - 1] +
-// cos(B) * [sin(r + c) - r]
-//
-// which is approximately:
-//
-// [S_hi + sigma * r] +
-// C_hl * r +
-// S_lo + S_hi * [(cos(r) - 1) - r * c] +
-// (C_hl + sigma) * [(sin(r) - r) + c]
-//
-// and this is what is actually computed. We separate this sum
-// into four parts:
-//
-// hi + med + pols + corr
-//
-// where
-//
-// hi = S_hi + sigma r
-// med = C_hl * r
-// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-// 3. POLYNOMIAL
-//
-// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-// (sin(r) - r) can be rearranged freely, since it is quite
-// small, so we exploit parallelism to the fullest.
-//
-// psc4 = SC_4 * r_1
-// msc4 = psc4 * r
-// r2 = r * r
-// msc2 = SC_2 * r2
-// r4 = r2 * r2
-// psc3 = SC_3 + msc4
-// psc1 = SC_1 + msc2
-// msc3 = r4 * psc3
-// sincospols = psc1 + msc3
-// pols = sincospols *
-// <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-// 4. CORRECTION TERM
-//
-// This is where the "c" component of the range reduction is
-// taken into account; recall that just "r" is used for most of
-// the calculation.
-//
-// -c = m_3 - c_2
-// -d = S_hi * r - (C_hl + sigma)
-// corr = -c * -d + S_lo
-//
-// 5. COMPENSATED SUMMATIONS
-//
-// The two successive compensated summations add up the high
-// and medium parts, leaving just the low parts to add up at
-// the end.
-//
-// rs = sigma * r
-// res_int = S_hi + rs
-// k_0 = S_hi - res_int
-// k_2 = k_0 + rs
-// med = C_hl * r
-// res_hi = res_int + med
-// k_1 = res_int - res_hi
-// k_3 = k_1 + med
-//
-// 6. FINAL SUMMATION
-//
-// We now add up all the small parts:
-//
-// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-// Now the overall result is just:
-//
-// res_hi + res_lo
-//
-// 7. SMALL ARGUMENTS
-//
-// If |x| < SNN (SNN meaning the smallest normal number), we
-// simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
-// do 2^-55 * (2^55 * x - x).
-//
-// Special cases:
-// sin(NaN) = quiet NaN, and raise invalid exception
-// sin(INF) = NaN and raise invalid exception
-// sin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-ALIGNED_(8) juint _zero_none[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL
-};
-
-ALIGNED_(4) juint __4onpi_d[] =
-{
- 0x6dc9c883UL, 0x3ff45f30UL
-};
-
-ALIGNED_(4) juint _TWO_32H[] =
-{
- 0x00000000UL, 0x41f80000UL
-};
-
-ALIGNED_(4) juint _pi04_3d[] =
-{
- 0x54442d00UL, 0x3fe921fbUL, 0x98cc5180UL, 0x3ce84698UL, 0xcbb5bf6cUL,
- 0xb9dfc8f8UL
-};
-
-ALIGNED_(4) juint _pi04_5d[] =
-{
- 0x54400000UL, 0x3fe921fbUL, 0x1a600000UL, 0x3dc0b461UL, 0x2e000000UL,
- 0x3b93198aUL, 0x25200000UL, 0x396b839aUL, 0x533e63a0UL, 0x37027044UL
-};
-
-ALIGNED_(4) juint _SCALE[] =
-{
- 0x00000000UL, 0x32600000UL
-};
-
-ALIGNED_(4) juint _zeros[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL
-};
-
-ALIGNED_(4) juint _pi04_2d[] =
-{
- 0x54400000UL, 0x3fe921fbUL, 0x1a626331UL, 0x3dc0b461UL
-};
-
-ALIGNED_(4) juint _TWO_12H[] =
-{
- 0x00000000UL, 0x40b80000UL
-};
-
-ALIGNED_(2) jushort __4onpi_31l[] =
-{
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x836e, 0xa2f9,
- 0x40d8, 0x0000, 0x0000, 0x0000, 0x2a50, 0x9c88, 0x40b7, 0x0000, 0x0000, 0x0000,
- 0xabe8, 0xfe13, 0x4099, 0x0000, 0x0000, 0x0000, 0x6ee0, 0xfa9a, 0x4079, 0x0000,
- 0x0000, 0x0000, 0x9580, 0xdb62, 0x4058, 0x0000, 0x0000, 0x0000, 0x1c82, 0xc9e2,
- 0x403d, 0x0000, 0x0000, 0x0000, 0xb1c0, 0xff28, 0x4019, 0x0000, 0x0000, 0x0000,
- 0xef14, 0xaf7a, 0x3ffe, 0x0000, 0x0000, 0x0000, 0x48dc, 0xc36e, 0x3fdf, 0x0000,
- 0x0000, 0x0000, 0x3740, 0xe909, 0x3fbe, 0x0000, 0x0000, 0x0000, 0x924a, 0xb801,
- 0x3fa2, 0x0000, 0x0000, 0x0000, 0x3a32, 0xdd41, 0x3f83, 0x0000, 0x0000, 0x0000,
- 0x8778, 0x873f, 0x3f62, 0x0000, 0x0000, 0x0000, 0x1298, 0xb1cb, 0x3f44, 0x0000,
- 0x0000, 0x0000, 0xa208, 0x9cfb, 0x3f26, 0x0000, 0x0000, 0x0000, 0xbaec, 0xd7d4,
- 0x3f06, 0x0000, 0x0000, 0x0000, 0xd338, 0x8909, 0x3ee7, 0x0000, 0x0000, 0x0000,
- 0x68b8, 0xe04d, 0x3ec7, 0x0000, 0x0000, 0x0000, 0x4e64, 0xdf90, 0x3eaa, 0x0000,
- 0x0000, 0x0000, 0xc1a8, 0xeb1c, 0x3e89, 0x0000, 0x0000, 0x0000, 0x2720, 0xce7d,
- 0x3e6a, 0x0000, 0x0000, 0x0000, 0x77b8, 0x8bf1, 0x3e4b, 0x0000, 0x0000, 0x0000,
- 0xec7e, 0xe4a0, 0x3e2e, 0x0000, 0x0000, 0x0000, 0xffbc, 0xf12f, 0x3e0f, 0x0000,
- 0x0000, 0x0000, 0xfdc0, 0xb301, 0x3deb, 0x0000, 0x0000, 0x0000, 0xc5ac, 0x9788,
- 0x3dd1, 0x0000, 0x0000, 0x0000, 0x47da, 0x829b, 0x3db2, 0x0000, 0x0000, 0x0000,
- 0xd9e4, 0xa6cf, 0x3d93, 0x0000, 0x0000, 0x0000, 0x36e8, 0xf961, 0x3d73, 0x0000,
- 0x0000, 0x0000, 0xf668, 0xf463, 0x3d54, 0x0000, 0x0000, 0x0000, 0x5168, 0xf2ff,
- 0x3d35, 0x0000, 0x0000, 0x0000, 0x758e, 0xea4f, 0x3d17, 0x0000, 0x0000, 0x0000,
- 0xf17a, 0xebe5, 0x3cf8, 0x0000, 0x0000, 0x0000, 0x9cfa, 0x9e83, 0x3cd9, 0x0000,
- 0x0000, 0x0000, 0xa4ba, 0xe294, 0x3cba, 0x0000, 0x0000, 0x0000, 0xd7ec, 0x9afe,
- 0x3c9a, 0x0000, 0x0000, 0x0000, 0xae80, 0x8fc6, 0x3c79, 0x0000, 0x0000, 0x0000,
- 0x3304, 0x8560, 0x3c5c, 0x0000, 0x0000, 0x0000, 0x6d70, 0xdf8f, 0x3c3b, 0x0000,
- 0x0000, 0x0000, 0x3ef0, 0xafc3, 0x3c1e, 0x0000, 0x0000, 0x0000, 0xd0d8, 0x826b,
- 0x3bfe, 0x0000, 0x0000, 0x0000, 0x1c80, 0xed4f, 0x3bdd, 0x0000, 0x0000, 0x0000,
- 0x730c, 0xb0af, 0x3bc1, 0x0000, 0x0000, 0x0000, 0x6660, 0xc219, 0x3ba2, 0x0000,
- 0x0000, 0x0000, 0x940c, 0xabe2, 0x3b83, 0x0000, 0x0000, 0x0000, 0xdffc, 0x8408,
- 0x3b64, 0x0000, 0x0000, 0x0000, 0x6b98, 0xc402, 0x3b45, 0x0000, 0x0000, 0x0000,
- 0x1818, 0x9cc4, 0x3b26, 0x0000, 0x0000, 0x0000, 0x5390, 0xaab6, 0x3b05, 0x0000,
- 0x0000, 0x0000, 0xb070, 0xd464, 0x3ae9, 0x0000, 0x0000, 0x0000, 0x231a, 0x9ef0,
- 0x3aca, 0x0000, 0x0000, 0x0000, 0x0670, 0xd1f1, 0x3aaa, 0x0000, 0x0000, 0x0000,
- 0x7738, 0xd9f3, 0x3a8a, 0x0000, 0x0000, 0x0000, 0xa834, 0x8092, 0x3a6c, 0x0000,
- 0x0000, 0x0000, 0xb45c, 0xce23, 0x3a4d, 0x0000, 0x0000, 0x0000, 0x36e8, 0xb0e5,
- 0x3a2d, 0x0000, 0x0000, 0x0000, 0xd156, 0xaf44, 0x3a10, 0x0000, 0x0000, 0x0000,
- 0x9f52, 0x8c82, 0x39f1, 0x0000, 0x0000, 0x0000, 0x829c, 0xff83, 0x39d1, 0x0000,
- 0x0000, 0x0000, 0x7d06, 0xefc6, 0x39b3, 0x0000, 0x0000, 0x0000, 0x93e0, 0xb0b7,
- 0x3992, 0x0000, 0x0000, 0x0000, 0xedde, 0xc193, 0x3975, 0x0000, 0x0000, 0x0000,
- 0xbbc0, 0xcf49, 0x3952, 0x0000, 0x0000, 0x0000, 0xbdf0, 0xd63c, 0x3937, 0x0000,
- 0x0000, 0x0000, 0x1f34, 0x9f3a, 0x3918, 0x0000, 0x0000, 0x0000, 0x3f8e, 0xe579,
- 0x38f9, 0x0000, 0x0000, 0x0000, 0x90c8, 0xc3f8, 0x38d9, 0x0000, 0x0000, 0x0000,
- 0x48c0, 0xf8f8, 0x38b7, 0x0000, 0x0000, 0x0000, 0xed56, 0xafa6, 0x389c, 0x0000,
- 0x0000, 0x0000, 0x8218, 0xb969, 0x387d, 0x0000, 0x0000, 0x0000, 0x1852, 0xec57,
- 0x385e, 0x0000, 0x0000, 0x0000, 0x670c, 0xd674, 0x383e, 0x0000, 0x0000, 0x0000,
- 0xad40, 0xc2c4, 0x3820, 0x0000, 0x0000, 0x0000, 0x2e80, 0xa696, 0x3801, 0x0000,
- 0x0000, 0x0000, 0xd800, 0xc467, 0x37dc, 0x0000, 0x0000, 0x0000, 0x3c72, 0xc5ae,
- 0x37c3, 0x0000, 0x0000, 0x0000, 0xb006, 0xac69, 0x37a4, 0x0000, 0x0000, 0x0000,
- 0x34a0, 0x8cdf, 0x3782, 0x0000, 0x0000, 0x0000, 0x9ed2, 0xd25e, 0x3766, 0x0000,
- 0x0000, 0x0000, 0x6fec, 0xaaaa, 0x3747, 0x0000, 0x0000, 0x0000, 0x6040, 0xfb5c,
- 0x3726, 0x0000, 0x0000, 0x0000, 0x764c, 0xa3fc, 0x3708, 0x0000, 0x0000, 0x0000,
- 0xb254, 0x954e, 0x36e9, 0x0000, 0x0000, 0x0000, 0x3e1c, 0xf5dc, 0x36ca, 0x0000,
- 0x0000, 0x0000, 0x7b06, 0xc635, 0x36ac, 0x0000, 0x0000, 0x0000, 0xa8ba, 0xd738,
- 0x368d, 0x0000, 0x0000, 0x0000, 0x06cc, 0xb24e, 0x366d, 0x0000, 0x0000, 0x0000,
- 0x7108, 0xac76, 0x364f, 0x0000, 0x0000, 0x0000, 0x2324, 0xa7cb, 0x3630, 0x0000,
- 0x0000, 0x0000, 0xac40, 0xef15, 0x360f, 0x0000, 0x0000, 0x0000, 0xae46, 0xd516,
- 0x35f2, 0x0000, 0x0000, 0x0000, 0x615e, 0xe003, 0x35d3, 0x0000, 0x0000, 0x0000,
- 0x0cf0, 0xefe7, 0x35b1, 0x0000, 0x0000, 0x0000, 0xfb50, 0xf98c, 0x3595, 0x0000,
- 0x0000, 0x0000, 0x0abc, 0xf333, 0x3575, 0x0000, 0x0000, 0x0000, 0xdd60, 0xca3f,
- 0x3555, 0x0000, 0x0000, 0x0000, 0x7eb6, 0xd87f, 0x3538, 0x0000, 0x0000, 0x0000,
- 0x44f4, 0xb291, 0x3519, 0x0000, 0x0000, 0x0000, 0xff80, 0xc982, 0x34f6, 0x0000,
- 0x0000, 0x0000, 0x9de0, 0xd9b8, 0x34db, 0x0000, 0x0000, 0x0000, 0xcd42, 0x9366,
- 0x34bc, 0x0000, 0x0000, 0x0000, 0xbef0, 0xfaee, 0x349d, 0x0000, 0x0000, 0x0000,
- 0xdac4, 0xb6f1, 0x347d, 0x0000, 0x0000, 0x0000, 0xf140, 0x94de, 0x345d, 0x0000,
- 0x0000, 0x0000, 0xa218, 0x8b4b, 0x343e, 0x0000, 0x0000, 0x0000, 0x6380, 0xa135,
- 0x341e, 0x0000, 0x0000, 0x0000, 0xb184, 0x8cb2, 0x3402, 0x0000, 0x0000, 0x0000,
- 0x196e, 0xdc61, 0x33e3, 0x0000, 0x0000, 0x0000, 0x0c00, 0xde05, 0x33c4, 0x0000,
- 0x0000, 0x0000, 0xef9a, 0xbd38, 0x33a5, 0x0000, 0x0000, 0x0000, 0xc1a0, 0xdf00,
- 0x3385, 0x0000, 0x0000, 0x0000, 0x1090, 0x9973, 0x3365, 0x0000, 0x0000, 0x0000,
- 0x4882, 0x8301, 0x3348, 0x0000, 0x0000, 0x0000, 0x7abe, 0xadc7, 0x3329, 0x0000,
- 0x0000, 0x0000, 0x7cba, 0xec2b, 0x330a, 0x0000, 0x0000, 0x0000, 0xa520, 0x8f21,
- 0x32e9, 0x0000, 0x0000, 0x0000, 0x710c, 0x8d36, 0x32cc, 0x0000, 0x0000, 0x0000,
- 0x5212, 0xc6ed, 0x32ad, 0x0000, 0x0000, 0x0000, 0x7308, 0xfd76, 0x328d, 0x0000,
- 0x0000, 0x0000, 0x5014, 0xd548, 0x326f, 0x0000, 0x0000, 0x0000, 0xd3f2, 0xb499,
- 0x3250, 0x0000, 0x0000, 0x0000, 0x7f74, 0xa606, 0x3230, 0x0000, 0x0000, 0x0000,
- 0xf0a8, 0xd720, 0x3212, 0x0000, 0x0000, 0x0000, 0x185c, 0xe20f, 0x31f2, 0x0000,
- 0x0000, 0x0000, 0xa5a8, 0x8738, 0x31d4, 0x0000, 0x0000, 0x0000, 0xdd74, 0xcafb,
- 0x31b4, 0x0000, 0x0000, 0x0000, 0x98b6, 0xbd8e, 0x3196, 0x0000, 0x0000, 0x0000,
- 0xe9de, 0x977f, 0x3177, 0x0000, 0x0000, 0x0000, 0x67c0, 0x818d, 0x3158, 0x0000,
- 0x0000, 0x0000, 0xe52a, 0x9322, 0x3139, 0x0000, 0x0000, 0x0000, 0xe568, 0x9b6c,
- 0x3119, 0x0000, 0x0000, 0x0000, 0x2358, 0xaa0a, 0x30fa, 0x0000, 0x0000, 0x0000,
- 0xe480, 0xe13b, 0x30d9, 0x0000, 0x0000, 0x0000, 0x3024, 0x90a1, 0x30bd, 0x0000,
- 0x0000, 0x0000, 0x9620, 0xda30, 0x309d, 0x0000, 0x0000, 0x0000, 0x898a, 0xb388,
- 0x307f, 0x0000, 0x0000, 0x0000, 0xb24c, 0xc891, 0x3060, 0x0000, 0x0000, 0x0000,
- 0x8056, 0xf98b, 0x3041, 0x0000, 0x0000, 0x0000, 0x72a4, 0xa1ea, 0x3021, 0x0000,
- 0x0000, 0x0000, 0x6af8, 0x9488, 0x3001, 0x0000, 0x0000, 0x0000, 0xe00c, 0xdfcb,
- 0x2fe4, 0x0000, 0x0000, 0x0000, 0xeeec, 0xc941, 0x2fc4, 0x0000, 0x0000, 0x0000,
- 0x53e0, 0xe70f, 0x2fa4, 0x0000, 0x0000, 0x0000, 0x8f60, 0x9c07, 0x2f85, 0x0000,
- 0x0000, 0x0000, 0xb328, 0xc3e7, 0x2f68, 0x0000, 0x0000, 0x0000, 0x9404, 0xf8c7,
- 0x2f48, 0x0000, 0x0000, 0x0000, 0x38e0, 0xc99f, 0x2f29, 0x0000, 0x0000, 0x0000,
- 0x9778, 0xd984, 0x2f09, 0x0000, 0x0000, 0x0000, 0xe700, 0xd142, 0x2eea, 0x0000,
- 0x0000, 0x0000, 0xd904, 0x9443, 0x2ecd, 0x0000, 0x0000, 0x0000, 0xd4ba, 0xae7e,
- 0x2eae, 0x0000, 0x0000, 0x0000, 0x8e5e, 0x8524, 0x2e8f, 0x0000, 0x0000, 0x0000,
- 0xb550, 0xc9ed, 0x2e6e, 0x0000, 0x0000, 0x0000, 0x53b8, 0x8648, 0x2e51, 0x0000,
- 0x0000, 0x0000, 0xdae4, 0x87f9, 0x2e32, 0x0000, 0x0000, 0x0000, 0x2942, 0xd966,
- 0x2e13, 0x0000, 0x0000, 0x0000, 0x4f28, 0xcf3c, 0x2df3, 0x0000, 0x0000, 0x0000,
- 0xfa40, 0xc4ef, 0x2dd1, 0x0000, 0x0000, 0x0000, 0x4424, 0xbca7, 0x2db5, 0x0000,
- 0x0000, 0x0000, 0x2e62, 0xcdc5, 0x2d97, 0x0000, 0x0000, 0x0000, 0xed88, 0x996b,
- 0x2d78, 0x0000, 0x0000, 0x0000, 0x7c30, 0xd97d, 0x2d56, 0x0000, 0x0000, 0x0000,
- 0xed26, 0xbf6e, 0x2d3a, 0x0000, 0x0000, 0x0000, 0x2918, 0x921b, 0x2d1a, 0x0000,
- 0x0000, 0x0000, 0x4e24, 0xe84e, 0x2cfb, 0x0000, 0x0000, 0x0000, 0x6dc0, 0x92ec,
- 0x2cdd, 0x0000, 0x0000, 0x0000, 0x4f2c, 0xacf8, 0x2cbd, 0x0000, 0x0000, 0x0000,
- 0xc634, 0xf094, 0x2c9e, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe5d3, 0x2c7e, 0x0000,
- 0x0000, 0x0000, 0x2180, 0xa600, 0x2c5b, 0x0000, 0x0000, 0x0000, 0x8480, 0xd680,
- 0x2c3c, 0x0000, 0x0000, 0x0000, 0x8b24, 0xd63b, 0x2c22, 0x0000, 0x0000, 0x0000,
- 0x02e0, 0xaa47, 0x2c00, 0x0000, 0x0000, 0x0000, 0x9ad0, 0xee84, 0x2be3, 0x0000,
- 0x0000, 0x0000, 0xf7dc, 0xf699, 0x2bc6, 0x0000, 0x0000, 0x0000, 0xddde, 0xe490,
- 0x2ba7, 0x0000, 0x0000, 0x0000, 0x34a0, 0xb4fd, 0x2b85, 0x0000, 0x0000, 0x0000,
- 0x91b4, 0x8ef6, 0x2b68, 0x0000, 0x0000, 0x0000, 0xa3e0, 0xa2a7, 0x2b47, 0x0000,
- 0x0000, 0x0000, 0xcce4, 0x82b3, 0x2b2a, 0x0000, 0x0000, 0x0000, 0xe4be, 0x8207,
- 0x2b0c, 0x0000, 0x0000, 0x0000, 0x1d92, 0xab43, 0x2aed, 0x0000, 0x0000, 0x0000,
- 0xe818, 0xf9f6, 0x2acd, 0x0000, 0x0000, 0x0000, 0xff12, 0xba80, 0x2aaf, 0x0000,
- 0x0000, 0x0000, 0x5254, 0x8529, 0x2a90, 0x0000, 0x0000, 0x0000, 0x1b88, 0xe032,
- 0x2a71, 0x0000, 0x0000, 0x0000, 0x3248, 0xd86d, 0x2a50, 0x0000, 0x0000, 0x0000,
- 0x3140, 0xc9d5, 0x2a2e, 0x0000, 0x0000, 0x0000, 0x14e6, 0xbd47, 0x2a14, 0x0000,
- 0x0000, 0x0000, 0x5c10, 0xe544, 0x29f4, 0x0000, 0x0000, 0x0000, 0x9f50, 0x90b6,
- 0x29d4, 0x0000, 0x0000, 0x0000, 0x9850, 0xab55, 0x29b6, 0x0000, 0x0000, 0x0000,
- 0x2750, 0x9d07, 0x2998, 0x0000, 0x0000, 0x0000, 0x6700, 0x8bbb, 0x2973, 0x0000,
- 0x0000, 0x0000, 0x5dba, 0xed31, 0x295a, 0x0000, 0x0000, 0x0000, 0x61dc, 0x85fe,
- 0x293a, 0x0000, 0x0000, 0x0000, 0x9ba2, 0xd6b4, 0x291c, 0x0000, 0x0000, 0x0000,
- 0x2d30, 0xe3a5, 0x28fb, 0x0000, 0x0000, 0x0000, 0x6630, 0xb566, 0x28dd, 0x0000,
- 0x0000, 0x0000, 0x5ad4, 0xa829, 0x28bf, 0x0000, 0x0000, 0x0000, 0x89d8, 0xe290,
- 0x28a0, 0x0000, 0x0000, 0x0000, 0x3916, 0xc428, 0x2881, 0x0000, 0x0000, 0x0000,
- 0x0490, 0xbea4, 0x2860, 0x0000, 0x0000, 0x0000, 0xee06, 0x80ee, 0x2843, 0x0000,
- 0x0000, 0x0000, 0xfc00, 0xf327, 0x2820, 0x0000, 0x0000, 0x0000, 0xea40, 0xa871,
- 0x2800, 0x0000, 0x0000, 0x0000, 0x63d8, 0x9c26, 0x27e4, 0x0000, 0x0000, 0x0000,
- 0x07ba, 0xc0c9, 0x27c7, 0x0000, 0x0000, 0x0000, 0x3fa2, 0x9797, 0x27a8, 0x0000,
- 0x0000, 0x0000, 0x21c6, 0xfeca, 0x2789, 0x0000, 0x0000, 0x0000, 0xde40, 0x860d,
- 0x2768, 0x0000, 0x0000, 0x0000, 0x9cc8, 0x98ce, 0x2749, 0x0000, 0x0000, 0x0000,
- 0x3778, 0xa31c, 0x272a, 0x0000, 0x0000, 0x0000, 0xe778, 0xf6e2, 0x270b, 0x0000,
- 0x0000, 0x0000, 0x59b8, 0xf841, 0x26ed, 0x0000, 0x0000, 0x0000, 0x02e0, 0xad04,
- 0x26cd, 0x0000, 0x0000, 0x0000, 0x5a92, 0x9380, 0x26b0, 0x0000, 0x0000, 0x0000,
- 0xc740, 0x8886, 0x268d, 0x0000, 0x0000, 0x0000, 0x0680, 0xfaf8, 0x266c, 0x0000,
- 0x0000, 0x0000, 0xfb60, 0x897f, 0x2653, 0x0000, 0x0000, 0x0000, 0x8760, 0xf903,
- 0x2634, 0x0000, 0x0000, 0x0000, 0xad2a, 0xc2c8, 0x2615, 0x0000, 0x0000, 0x0000,
- 0x2d86, 0x8aef, 0x25f6, 0x0000, 0x0000, 0x0000, 0x1ef4, 0xe627, 0x25d6, 0x0000,
- 0x0000, 0x0000, 0x09e4, 0x8020, 0x25b7, 0x0000, 0x0000, 0x0000, 0x7548, 0xd227,
- 0x2598, 0x0000, 0x0000, 0x0000, 0x75dc, 0xfb5b, 0x2579, 0x0000, 0x0000, 0x0000,
- 0xea84, 0xc8b6, 0x255a, 0x0000, 0x0000, 0x0000, 0xe4d0, 0x8145, 0x253b, 0x0000,
- 0x0000, 0x0000, 0x3640, 0x9768, 0x251c, 0x0000, 0x0000, 0x0000, 0x246a, 0xccec,
- 0x24fe, 0x0000, 0x0000, 0x0000, 0x51d0, 0xa075, 0x24dd, 0x0000, 0x0000, 0x0000,
- 0x4638, 0xa385, 0x24bf, 0x0000, 0x0000, 0x0000, 0xd788, 0xd776, 0x24a1, 0x0000,
- 0x0000, 0x0000, 0x1370, 0x8997, 0x2482, 0x0000, 0x0000, 0x0000, 0x1e88, 0x9b67,
- 0x2462, 0x0000, 0x0000, 0x0000, 0x6c08, 0xd975, 0x2444, 0x0000, 0x0000, 0x0000,
- 0xfdb0, 0xcfc0, 0x2422, 0x0000, 0x0000, 0x0000, 0x3100, 0xc026, 0x2406, 0x0000,
- 0x0000, 0x0000, 0xc5b4, 0xae64, 0x23e6, 0x0000, 0x0000, 0x0000, 0x2280, 0xf687,
- 0x23c3, 0x0000, 0x0000, 0x0000, 0x2de0, 0x9006, 0x23a9, 0x0000, 0x0000, 0x0000,
- 0x24bc, 0xf631, 0x238a, 0x0000, 0x0000, 0x0000, 0xb8d4, 0xa975, 0x236b, 0x0000,
- 0x0000, 0x0000, 0xd9a4, 0xb949, 0x234b, 0x0000, 0x0000, 0x0000, 0xb54e, 0xbd39,
- 0x232d, 0x0000, 0x0000, 0x0000, 0x4aac, 0x9a52, 0x230e, 0x0000, 0x0000, 0x0000,
- 0xbbbc, 0xd085, 0x22ef, 0x0000, 0x0000, 0x0000, 0xdf18, 0xc633, 0x22cf, 0x0000,
- 0x0000, 0x0000, 0x16d0, 0xeca5, 0x22af, 0x0000, 0x0000, 0x0000, 0xf2a0, 0xdf6f,
- 0x228e, 0x0000, 0x0000, 0x0000, 0x8c44, 0xe86b, 0x2272, 0x0000, 0x0000, 0x0000,
- 0x35c0, 0xbbf4, 0x2253, 0x0000, 0x0000, 0x0000, 0x0c40, 0xdafb, 0x2230, 0x0000,
- 0x0000, 0x0000, 0x92dc, 0x9935, 0x2216, 0x0000, 0x0000, 0x0000, 0x0ca0, 0xbda6,
- 0x21f3, 0x0000, 0x0000, 0x0000, 0x5958, 0xa6fd, 0x21d6, 0x0000, 0x0000, 0x0000,
- 0xa3dc, 0x9d7f, 0x21b9, 0x0000, 0x0000, 0x0000, 0x79dc, 0xfcb5, 0x2199, 0x0000,
- 0x0000, 0x0000, 0xf264, 0xcebb, 0x217b, 0x0000, 0x0000, 0x0000, 0x0abe, 0x8308,
- 0x215c, 0x0000, 0x0000, 0x0000, 0x30ae, 0xb463, 0x213d, 0x0000, 0x0000, 0x0000,
- 0x6228, 0xb040, 0x211c, 0x0000, 0x0000, 0x0000, 0xc9b2, 0xf43b, 0x20ff, 0x0000,
- 0x0000, 0x0000, 0x3d8e, 0xa4b3, 0x20e0, 0x0000, 0x0000, 0x0000, 0x84e6, 0x8dab,
- 0x20c1, 0x0000, 0x0000, 0x0000, 0xa124, 0x9b74, 0x20a1, 0x0000, 0x0000, 0x0000,
- 0xc276, 0xd497, 0x2083, 0x0000, 0x0000, 0x0000, 0x6354, 0xa466, 0x2063, 0x0000,
- 0x0000, 0x0000, 0x8654, 0xaf0a, 0x2044, 0x0000, 0x0000, 0x0000, 0x1d20, 0xfa5c,
- 0x2024, 0x0000, 0x0000, 0x0000, 0xbcd0, 0xf3f0, 0x2004, 0x0000, 0x0000, 0x0000,
- 0xedf0, 0xf0b6, 0x1fe7, 0x0000, 0x0000, 0x0000, 0x45bc, 0x9182, 0x1fc9, 0x0000,
- 0x0000, 0x0000, 0xe254, 0xdc85, 0x1faa, 0x0000, 0x0000, 0x0000, 0xb898, 0xe9b1,
- 0x1f8a, 0x0000, 0x0000, 0x0000, 0x0ebe, 0xe6f0, 0x1f6c, 0x0000, 0x0000, 0x0000,
- 0xa9b8, 0xf584, 0x1f4c, 0x0000, 0x0000, 0x0000, 0x12e8, 0xdf6b, 0x1f2e, 0x0000,
- 0x0000, 0x0000, 0x9f9e, 0xcd55, 0x1f0f, 0x0000, 0x0000, 0x0000, 0x05a0, 0xec3a,
- 0x1eef, 0x0000, 0x0000, 0x0000, 0xd8e0, 0x96f8, 0x1ed1, 0x0000, 0x0000, 0x0000,
- 0x3bd4, 0xccc6, 0x1eb1, 0x0000, 0x0000, 0x0000, 0x4910, 0xb87b, 0x1e93, 0x0000,
- 0x0000, 0x0000, 0xbefc, 0xd40b, 0x1e73, 0x0000, 0x0000, 0x0000, 0x317e, 0xa406,
- 0x1e55, 0x0000, 0x0000, 0x0000, 0x6bb2, 0xc2b2, 0x1e36, 0x0000, 0x0000, 0x0000,
- 0xb87e, 0xbb78, 0x1e17, 0x0000, 0x0000, 0x0000, 0xa03c, 0xdbbd, 0x1df7, 0x0000,
- 0x0000, 0x0000, 0x5b6c, 0xe3c8, 0x1dd9, 0x0000, 0x0000, 0x0000, 0x8968, 0xca8e,
- 0x1dba, 0x0000, 0x0000, 0x0000, 0xc024, 0xe6ab, 0x1d9a, 0x0000, 0x0000, 0x0000,
- 0x4110, 0xd4eb, 0x1d7a, 0x0000, 0x0000, 0x0000, 0xa168, 0xbdb5, 0x1d5d, 0x0000,
- 0x0000, 0x0000, 0x012e, 0xa5fa, 0x1d3e, 0x0000, 0x0000, 0x0000, 0x6838, 0x9c1f,
- 0x1d1e, 0x0000, 0x0000, 0x0000, 0xa158, 0xaa76, 0x1d00, 0x0000, 0x0000, 0x0000,
- 0x090a, 0xbd95, 0x1ce1, 0x0000, 0x0000, 0x0000, 0xf73e, 0x8b6d, 0x1cc2, 0x0000,
- 0x0000, 0x0000, 0x5fda, 0xbcbf, 0x1ca3, 0x0000, 0x0000, 0x0000, 0xdbe8, 0xb89f,
- 0x1c84, 0x0000, 0x0000, 0x0000, 0x6e4c, 0x96c7, 0x1c64, 0x0000, 0x0000, 0x0000,
- 0x19c2, 0xf2a4, 0x1c46, 0x0000, 0x0000, 0x0000, 0xb800, 0xf855, 0x1c1e, 0x0000,
- 0x0000, 0x0000, 0x87fc, 0x85ff, 0x1c08, 0x0000, 0x0000, 0x0000, 0x1418, 0x839f,
- 0x1be9, 0x0000, 0x0000, 0x0000, 0x6186, 0xd9d8, 0x1bca, 0x0000, 0x0000, 0x0000,
- 0xf500, 0xabaa, 0x1ba6, 0x0000, 0x0000, 0x0000, 0x7b36, 0xdafe, 0x1b8c, 0x0000,
- 0x0000, 0x0000, 0xf394, 0xe6d8, 0x1b6c, 0x0000, 0x0000, 0x0000, 0x6efc, 0x9e55,
- 0x1b4e, 0x0000, 0x0000, 0x0000, 0x5e10, 0xc523, 0x1b2e, 0x0000, 0x0000, 0x0000,
- 0x8210, 0xb6f9, 0x1b0d, 0x0000, 0x0000, 0x0000, 0x9ab0, 0x96e3, 0x1af1, 0x0000,
- 0x0000, 0x0000, 0x3864, 0x92e7, 0x1ad1, 0x0000, 0x0000, 0x0000, 0x9878, 0xdc65,
- 0x1ab1, 0x0000, 0x0000, 0x0000, 0xfa20, 0xd6cb, 0x1a94, 0x0000, 0x0000, 0x0000,
- 0x6c00, 0xa4e4, 0x1a70, 0x0000, 0x0000, 0x0000, 0xab40, 0xb41b, 0x1a53, 0x0000,
- 0x0000, 0x0000, 0x43a4, 0x8ede, 0x1a37, 0x0000, 0x0000, 0x0000, 0x22e0, 0x9314,
- 0x1a15, 0x0000, 0x0000, 0x0000, 0x6170, 0xb949, 0x19f8, 0x0000, 0x0000, 0x0000,
- 0x6b00, 0xe056, 0x19d8, 0x0000, 0x0000, 0x0000, 0x9ba8, 0xa94c, 0x19b9, 0x0000,
- 0x0000, 0x0000, 0xfaa0, 0xaa16, 0x199b, 0x0000, 0x0000, 0x0000, 0x899a, 0xf627,
- 0x197d, 0x0000, 0x0000, 0x0000, 0x9f20, 0xfb70, 0x195d, 0x0000, 0x0000, 0x0000,
- 0xa4b8, 0xc176, 0x193e, 0x0000, 0x0000, 0x0000, 0xb21c, 0x85c3, 0x1920, 0x0000,
- 0x0000, 0x0000, 0x50d2, 0x9b19, 0x1901, 0x0000, 0x0000, 0x0000, 0xd4b0, 0xb708,
- 0x18e0, 0x0000, 0x0000, 0x0000, 0xfb88, 0xf510, 0x18c1, 0x0000, 0x0000, 0x0000,
- 0x31ec, 0xdc8d, 0x18a3, 0x0000, 0x0000, 0x0000, 0x3c00, 0xbff9, 0x1885, 0x0000,
- 0x0000, 0x0000, 0x5020, 0xc30b, 0x1862, 0x0000, 0x0000, 0x0000, 0xd4f0, 0xda0c,
- 0x1844, 0x0000, 0x0000, 0x0000, 0x20d2, 0x99a5, 0x1828, 0x0000, 0x0000, 0x0000,
- 0x852e, 0xd159, 0x1809, 0x0000, 0x0000, 0x0000, 0x7cd8, 0x97a1, 0x17e9, 0x0000,
- 0x0000, 0x0000, 0x423a, 0x997b, 0x17cb, 0x0000, 0x0000, 0x0000, 0xc1c0, 0xbe7d,
- 0x17a8, 0x0000, 0x0000, 0x0000, 0xe8bc, 0xdcdd, 0x178d, 0x0000, 0x0000, 0x0000,
- 0x8b28, 0xae06, 0x176e, 0x0000, 0x0000, 0x0000, 0x102e, 0xb8d4, 0x174f, 0x0000,
- 0x0000, 0x0000, 0xaa00, 0xaa5c, 0x172f, 0x0000, 0x0000, 0x0000, 0x51f0, 0x9fc0,
- 0x170e, 0x0000, 0x0000, 0x0000, 0xf858, 0xe181, 0x16f2, 0x0000, 0x0000, 0x0000,
- 0x91a8, 0x8162, 0x16d3, 0x0000, 0x0000, 0x0000, 0x5f40, 0xcb6f, 0x16b1, 0x0000,
- 0x0000, 0x0000, 0xbb50, 0xe55f, 0x1693, 0x0000, 0x0000, 0x0000, 0xacd2, 0xd895,
- 0x1676, 0x0000, 0x0000, 0x0000, 0xef30, 0x97bf, 0x1654, 0x0000, 0x0000, 0x0000,
- 0xf700, 0xb3d7, 0x1633, 0x0000, 0x0000, 0x0000, 0x3454, 0xa7b5, 0x1619, 0x0000,
- 0x0000, 0x0000, 0x6b00, 0xa929, 0x15f6, 0x0000, 0x0000, 0x0000, 0x9f04, 0x89f7,
- 0x15db, 0x0000, 0x0000, 0x0000, 0xad78, 0xd985, 0x15bc, 0x0000, 0x0000, 0x0000,
- 0xa46a, 0xae3f, 0x159d, 0x0000, 0x0000, 0x0000, 0x63a0, 0xd0da, 0x157c, 0x0000,
- 0x0000, 0x0000, 0x5e90, 0x817d, 0x155e, 0x0000, 0x0000, 0x0000, 0x1494, 0xb13f,
- 0x1540, 0x0000, 0x0000, 0x0000, 0x0090, 0x9c40, 0x1521, 0x0000, 0x0000, 0x0000,
- 0xdd70, 0xcc86, 0x1500, 0x0000, 0x0000, 0x0000, 0x64f8, 0xdb6f, 0x14e1, 0x0000,
- 0x0000, 0x0000, 0xe22c, 0xac17, 0x14c3, 0x0000, 0x0000, 0x0000, 0x60e0, 0xa9ad,
- 0x14a3, 0x0000, 0x0000, 0x0000, 0x4640, 0xd658, 0x1481, 0x0000, 0x0000, 0x0000,
- 0x6490, 0xa181, 0x1467, 0x0000, 0x0000, 0x0000, 0x1df4, 0xaaa2, 0x1447, 0x0000,
- 0x0000, 0x0000, 0xb94a, 0x8f61, 0x1429, 0x0000, 0x0000, 0x0000, 0x5198, 0x9d83,
- 0x1409, 0x0000, 0x0000, 0x0000, 0x0f7a, 0xa818, 0x13eb, 0x0000, 0x0000, 0x0000,
- 0xc45e, 0xc06c, 0x13cc, 0x0000, 0x0000, 0x0000, 0x4ec0, 0xfa29, 0x13a8, 0x0000,
- 0x0000, 0x0000, 0x6418, 0x8cad, 0x138c, 0x0000, 0x0000, 0x0000, 0xbcc8, 0xe7d1,
- 0x136f, 0x0000, 0x0000, 0x0000, 0xc934, 0xf9b0, 0x134f, 0x0000, 0x0000, 0x0000,
- 0x6ce0, 0x98df, 0x1331, 0x0000, 0x0000, 0x0000, 0x3516, 0xe5e9, 0x1312, 0x0000,
- 0x0000, 0x0000, 0xc6c0, 0xef8b, 0x12ef, 0x0000, 0x0000, 0x0000, 0xaf02, 0x913d,
- 0x12d4, 0x0000, 0x0000, 0x0000, 0xd230, 0xe1d5, 0x12b5, 0x0000, 0x0000, 0x0000,
- 0xfba8, 0xc232, 0x1295, 0x0000, 0x0000, 0x0000, 0x7ba4, 0xabeb, 0x1277, 0x0000,
- 0x0000, 0x0000, 0x6e5c, 0xc692, 0x1258, 0x0000, 0x0000, 0x0000, 0x76a2, 0x9756,
- 0x1239, 0x0000, 0x0000, 0x0000, 0xe180, 0xe423, 0x1214, 0x0000, 0x0000, 0x0000,
- 0x8c3c, 0x90f8, 0x11fb, 0x0000, 0x0000, 0x0000, 0x9f3c, 0x9fd2, 0x11dc, 0x0000,
- 0x0000, 0x0000, 0x53e0, 0xb73e, 0x11bd, 0x0000, 0x0000, 0x0000, 0x45be, 0x88d6,
- 0x119e, 0x0000, 0x0000, 0x0000, 0x111a, 0x8bc0, 0x117f, 0x0000, 0x0000, 0x0000,
- 0xe26a, 0xd7ff, 0x1160, 0x0000, 0x0000, 0x0000, 0xfb60, 0xdd8d, 0x113f, 0x0000,
- 0x0000, 0x0000, 0x9370, 0xc108, 0x1120, 0x0000, 0x0000, 0x0000, 0x9654, 0x8baf,
- 0x1103, 0x0000, 0x0000, 0x0000, 0xd6ec, 0xd6b9, 0x10e4, 0x0000, 0x0000, 0x0000,
- 0x23e4, 0xd7b7, 0x10c4, 0x0000, 0x0000, 0x0000, 0x1aa6, 0xa847, 0x10a6, 0x0000,
- 0x0000, 0x0000, 0xbee6, 0x9fef, 0x1087, 0x0000, 0x0000, 0x0000, 0x26d0, 0xa6eb,
- 0x1066, 0x0000, 0x0000, 0x0000, 0x5b86, 0xa880, 0x1049, 0x0000, 0x0000, 0x0000,
- 0x125c, 0xd971, 0x1029, 0x0000, 0x0000, 0x0000, 0x1f78, 0x9d18, 0x100a, 0x0000,
- 0x0000, 0x0000, 0x0e84, 0xb15b, 0x0feb, 0x0000, 0x0000, 0x0000, 0xd0c0, 0xc150,
- 0x0fcc, 0x0000, 0x0000, 0x0000, 0xa330, 0xc40c, 0x0fad, 0x0000, 0x0000, 0x0000,
- 0x5202, 0xfc2c, 0x0f8f, 0x0000, 0x0000, 0x0000, 0x3f7c, 0xecf5, 0x0f6f, 0x0000,
- 0x0000, 0x0000, 0xef44, 0xfdfd, 0x0f50, 0x0000, 0x0000, 0x0000, 0x3f6c, 0xab1b,
- 0x0f31, 0x0000, 0x0000, 0x0000, 0xf658, 0x89ec, 0x0f11, 0x0000, 0x0000, 0x0000,
- 0xbfc8, 0x9ba8, 0x0ef4, 0x0000, 0x0000, 0x0000, 0x3d40, 0xbe21, 0x0ed5, 0x0000,
- 0x0000, 0x0000, 0xbbc4, 0xc70d, 0x0eb6, 0x0000, 0x0000, 0x0000, 0x5158, 0xdb16,
- 0x0e96, 0x0000, 0x0000, 0x0000, 0xb5a8, 0xa8d8, 0x0e78, 0x0000, 0x0000, 0x0000,
- 0xcccc, 0xb40e, 0x0e58, 0x0000, 0x0000, 0x0000, 0x448c, 0xcb62, 0x0e3a, 0x0000,
- 0x0000, 0x0000, 0xf12a, 0x8aed, 0x0e1b, 0x0000, 0x0000, 0x0000, 0x79d0, 0xc59c,
- 0x0dfb, 0x0000, 0x0000, 0x0000, 0x06b4, 0xcdc9, 0x0ddd, 0x0000, 0x0000, 0x0000,
- 0xae70, 0xa979, 0x0dbe, 0x0000, 0x0000, 0x0000, 0x317c, 0xa8fb, 0x0d9e, 0x0000,
- 0x0000, 0x0000, 0x5fe0, 0x8a50, 0x0d7d, 0x0000, 0x0000, 0x0000, 0x70b6, 0xfdfa,
- 0x0d61, 0x0000, 0x0000, 0x0000, 0x1640, 0x9dc7, 0x0d41, 0x0000, 0x0000, 0x0000,
- 0x9a9c, 0xdc50, 0x0d23, 0x0000, 0x0000, 0x0000, 0x4fcc, 0x9a9b, 0x0d04, 0x0000,
- 0x0000, 0x0000, 0x7e48, 0x8f77, 0x0ce5, 0x0000, 0x0000, 0x0000, 0x84e4, 0xd4b9,
- 0x0cc6, 0x0000, 0x0000, 0x0000, 0x84e0, 0xbd10, 0x0ca6, 0x0000, 0x0000, 0x0000,
- 0x1b0a, 0xc8d9, 0x0c88, 0x0000, 0x0000, 0x0000, 0x6a48, 0xfc81, 0x0c68, 0x0000,
- 0x0000, 0x0000, 0x070a, 0xbef6, 0x0c4a, 0x0000, 0x0000, 0x0000, 0x8a70, 0xf096,
- 0x0c2b, 0x0000, 0x0000, 0x0000, 0xecc2, 0xc994, 0x0c0c, 0x0000, 0x0000, 0x0000,
- 0x1540, 0x9537, 0x0bea, 0x0000, 0x0000, 0x0000, 0x1b02, 0xab5b, 0x0bce, 0x0000,
- 0x0000, 0x0000, 0x5dc0, 0xb0c8, 0x0bad, 0x0000, 0x0000, 0x0000, 0xc928, 0xe034,
- 0x0b8f, 0x0000, 0x0000, 0x0000, 0x2d12, 0xb4b0, 0x0b71, 0x0000, 0x0000, 0x0000,
- 0x8fc2, 0xbb94, 0x0b52, 0x0000, 0x0000, 0x0000, 0xe236, 0xe22f, 0x0b33, 0x0000,
- 0x0000, 0x0000, 0xb97c, 0xbe9e, 0x0b13, 0x0000, 0x0000, 0x0000, 0xe1a6, 0xe16d,
- 0x0af5, 0x0000, 0x0000, 0x0000, 0xd330, 0xbaf0, 0x0ad6, 0x0000, 0x0000, 0x0000,
- 0xc0bc, 0xbbd0, 0x0ab7, 0x0000, 0x0000, 0x0000, 0x8e66, 0xdd9b, 0x0a98, 0x0000,
- 0x0000, 0x0000, 0xc95c, 0xf799, 0x0a79, 0x0000, 0x0000, 0x0000, 0xdac0, 0xbe4c,
- 0x0a55, 0x0000, 0x0000, 0x0000, 0xafc0, 0xc378, 0x0a37, 0x0000, 0x0000, 0x0000,
- 0xa880, 0xe341, 0x0a19, 0x0000, 0x0000, 0x0000, 0xc242, 0x81f6, 0x09fd, 0x0000,
- 0x0000, 0x0000, 0x7470, 0xc777, 0x09de, 0x0000, 0x0000, 0x0000, 0x62bc, 0xb684,
- 0x09be, 0x0000, 0x0000, 0x0000, 0x43ac, 0x8c58, 0x099f, 0x0000, 0x0000, 0x0000,
- 0xcc3c, 0xf9ac, 0x0981, 0x0000, 0x0000, 0x0000, 0x1526, 0xb670, 0x0962, 0x0000,
- 0x0000, 0x0000, 0xc9fe, 0xdf50, 0x0943, 0x0000, 0x0000, 0x0000, 0x6ae6, 0xc065,
- 0x0924, 0x0000, 0x0000, 0x0000, 0xb114, 0xcf29, 0x0905, 0x0000, 0x0000, 0x0000,
- 0xd388, 0x922a, 0x08e4, 0x0000, 0x0000, 0x0000, 0xcf54, 0xb926, 0x08c7, 0x0000,
- 0x0000, 0x0000, 0x3826, 0xe855, 0x08a8, 0x0000, 0x0000, 0x0000, 0xe7c8, 0x829b,
- 0x0888, 0x0000, 0x0000, 0x0000, 0x546c, 0xa903, 0x086a, 0x0000, 0x0000, 0x0000,
- 0x8768, 0x99cc, 0x0849, 0x0000, 0x0000, 0x0000, 0x00ac, 0xf529, 0x082b, 0x0000,
- 0x0000, 0x0000, 0x2658, 0x9f0b, 0x080c, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x9e21,
- 0x07ee, 0x0000, 0x0000, 0x0000, 0x6da2, 0x9910, 0x07cf, 0x0000, 0x0000, 0x0000,
- 0x9220, 0xf9b3, 0x07b0, 0x0000, 0x0000, 0x0000, 0x3d90, 0xa541, 0x0791, 0x0000,
- 0x0000, 0x0000, 0x6e4c, 0xe7cc, 0x0771, 0x0000, 0x0000, 0x0000, 0xa8fa, 0xe80a,
- 0x0753, 0x0000, 0x0000, 0x0000, 0x4e14, 0xc3a7, 0x0734, 0x0000, 0x0000, 0x0000,
- 0xf7e0, 0xbad9, 0x0712, 0x0000, 0x0000, 0x0000, 0xfea0, 0xeff2, 0x06f5, 0x0000,
- 0x0000, 0x0000, 0xcef6, 0xbd48, 0x06d7, 0x0000, 0x0000, 0x0000, 0x7544, 0xf559,
- 0x06b7, 0x0000, 0x0000, 0x0000, 0x2388, 0xf655, 0x0698, 0x0000, 0x0000, 0x0000,
- 0xe900, 0xad56, 0x0676, 0x0000, 0x0000, 0x0000, 0x2cc0, 0x8437, 0x0659, 0x0000,
- 0x0000, 0x0000, 0x3068, 0xc544, 0x063b, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe73c,
- 0x061b, 0x0000, 0x0000, 0x0000, 0xee50, 0x9d49, 0x05fc, 0x0000, 0x0000, 0x0000,
- 0x93d2, 0x81f6, 0x05df, 0x0000, 0x0000, 0x0000, 0x941c, 0xadff, 0x05bf, 0x0000,
- 0x0000, 0x0000, 0x2ce2, 0x8e45, 0x05a1, 0x0000, 0x0000, 0x0000, 0x4a60, 0x95fd,
- 0x0581, 0x0000, 0x0000, 0x0000, 0x79f8, 0xb83a, 0x0563, 0x0000, 0x0000, 0x0000,
- 0xcb58, 0xa1f5, 0x0543, 0x0000, 0x0000, 0x0000, 0x2a3a, 0xdc36, 0x0525, 0x0000,
- 0x0000, 0x0000, 0x14ee, 0x890e, 0x0506, 0x0000, 0x0000, 0x0000, 0x8f20, 0xc432,
- 0x04e3, 0x0000, 0x0000, 0x0000, 0x8440, 0xb21d, 0x04c6, 0x0000, 0x0000, 0x0000,
- 0x5430, 0xf698, 0x04a7, 0x0000, 0x0000, 0x0000, 0x04ae, 0x8b20, 0x048a, 0x0000,
- 0x0000, 0x0000, 0x04d0, 0xe872, 0x046b, 0x0000, 0x0000, 0x0000, 0xc78e, 0x8893,
- 0x044c, 0x0000, 0x0000, 0x0000, 0x0f78, 0x9895, 0x042b, 0x0000, 0x0000, 0x0000,
- 0x11d4, 0xdf2e, 0x040d, 0x0000, 0x0000, 0x0000, 0xe84c, 0x89d5, 0x03ef, 0x0000,
- 0x0000, 0x0000, 0xf7be, 0x8a67, 0x03d0, 0x0000, 0x0000, 0x0000, 0x95d0, 0xc906,
- 0x03b1, 0x0000, 0x0000, 0x0000, 0x64ce, 0xd96c, 0x0392, 0x0000, 0x0000, 0x0000,
- 0x97ba, 0xa16f, 0x0373, 0x0000, 0x0000, 0x0000, 0x463c, 0xc51a, 0x0354, 0x0000,
- 0x0000, 0x0000, 0xef0a, 0xe93e, 0x0335, 0x0000, 0x0000, 0x0000, 0x526a, 0xa466,
- 0x0316, 0x0000, 0x0000, 0x0000, 0x4140, 0xa94d, 0x02f5, 0x0000, 0x0000, 0x0000,
- 0xb4ec, 0xce68, 0x02d8, 0x0000, 0x0000, 0x0000, 0x4fa2, 0x8490, 0x02b9, 0x0000,
- 0x0000, 0x0000, 0x4e60, 0xca98, 0x0298, 0x0000, 0x0000, 0x0000, 0x08dc, 0xe09c,
- 0x027a, 0x0000, 0x0000, 0x0000, 0x2b90, 0xc7e3, 0x025c, 0x0000, 0x0000, 0x0000,
- 0x5a7c, 0xf8ef, 0x023c, 0x0000, 0x0000, 0x0000, 0x5022, 0x9d58, 0x021e, 0x0000,
- 0x0000, 0x0000, 0x553a, 0xe242, 0x01ff, 0x0000, 0x0000, 0x0000, 0x7e6e, 0xb54d,
- 0x01e0, 0x0000, 0x0000, 0x0000, 0xd2d4, 0xa88c, 0x01c1, 0x0000, 0x0000, 0x0000,
- 0x75b6, 0xfe6d, 0x01a2, 0x0000, 0x0000, 0x0000, 0x3bb2, 0xf04c, 0x0183, 0x0000,
- 0x0000, 0x0000, 0xc2d0, 0xc046, 0x0163, 0x0000, 0x0000, 0x0000, 0x250c, 0xf9d6,
- 0x0145, 0x0000, 0x0000, 0x0000, 0xb7b4, 0x8a0d, 0x0126, 0x0000, 0x0000, 0x0000,
- 0x1a72, 0xe4f5, 0x0107, 0x0000, 0x0000, 0x0000, 0x825c, 0xa9b8, 0x00e8, 0x0000,
- 0x0000, 0x0000, 0x6c90, 0xc9ad, 0x00c6, 0x0000, 0x0000, 0x0000, 0x4d00, 0xd1bb,
- 0x00aa, 0x0000, 0x0000, 0x0000, 0xa4a0, 0xee01, 0x0087, 0x0000, 0x0000, 0x0000,
- 0x89a8, 0xbe9f, 0x006b, 0x0000, 0x0000, 0x0000, 0x038e, 0xc80c, 0x004d, 0x0000,
- 0x0000, 0x0000, 0xfe26, 0x8384, 0x002e, 0x0000, 0x0000, 0x0000, 0xcd90, 0xca57,
- 0x000e, 0x0000
-};
-
-void MacroAssembler::libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
- Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12;
- Label B1_13, B1_14, B1_15;
-
- assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
-
- address zero_none = (address)_zero_none;
- address _4onpi_d = (address)__4onpi_d;
- address TWO_32H = (address)_TWO_32H;
- address pi04_3d = (address)_pi04_3d;
- address pi04_5d = (address)_pi04_5d;
- address SCALE = (address)_SCALE;
- address zeros = (address)_zeros;
- address pi04_2d = (address)_pi04_2d;
- address TWO_12H = (address)_TWO_12H;
- address _4onpi_31l = (address)__4onpi_31l;
-
- bind(B1_1);
- push(ebp);
- movl(ebp, esp);
- andl(esp, -16);
- push(esi);
- push(edi);
- push(ebx);
- subl(esp, 20);
- movzwl(ebx, Address(ebp, 16));
- andl(ebx, 32767);
- movl(eax, Address(ebp, 20));
- cmpl(ebx, 16413);
- movl(esi, Address(ebp, 24));
- movl(Address(esp, 4), eax);
- jcc(Assembler::greaterEqual, B1_8);
-
- bind(B1_2);
- fld_x(Address(ebp, 8));
- fld_d(ExternalAddress(_4onpi_d)); //0x6dc9c883UL, 0x3ff45f30UL
- fmul(1);
- fstp_x(Address(esp, 8));
- movzwl(ecx, Address(esp, 16));
- negl(ecx);
- addl(ecx, 30);
- movl(eax, Address(esp, 12));
- shrl(eax);
- cmpl(Address(esp, 4), 0);
- jcc(Assembler::notEqual, B1_4);
-
- bind(B1_3);
- lea(ecx, Address(eax, 1));
- andl(ecx, -2);
- jmp(B1_5);
-
- bind(B1_4);
- movl(ecx, eax);
- addl(eax, Address(esp, 4));
- movl(edx, eax);
- andl(edx, 1);
- addl(ecx, edx);
-
- bind(B1_5);
- fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL
- cmpl(ebx, 16400);
- movl(Address(esp, 0), ecx);
- fild_s(Address(esp, 0));
- jcc(Assembler::greaterEqual, B1_7);
-
- bind(B1_6);
- fld_d(ExternalAddress(pi04_3d)); //0x54442d00UL, 0x3fe921fbUL
- fmul(1);
- fsubp(3);
- fxch(1);
- fmul(2);
- fld_s(2);
- fadd(1);
- fsubrp(1);
- fld_s(0);
- fxch(1);
- fsuba(3);
- fld_d(ExternalAddress(8 + pi04_3d)); //0x98cc5180UL, 0x3ce84698UL
- fmul(3);
- fsuba(2);
- fxch(1);
- fsub(2);
- fsubrp(1);
- faddp(3);
- fld_d(ExternalAddress(16 + pi04_3d)); //0xcbb5bf6cUL, 0xb9dfc8f8UL
- fmulp(2);
- fld_s(1);
- fsubr(1);
- fsuba(1);
- fxch(2);
- fsubp(1);
- faddp(2);
- fxch(1);
- jmp(B1_15);
-
- bind(B1_7);
- fld_d(ExternalAddress(pi04_5d)); //0x54400000UL, 0x3fe921fbUL
- fmul(1);
- fsubp(3);
- fxch(1);
- fmul(2);
- fld_s(2);
- fadd(1);
- fsubrp(1);
- fld_s(0);
- fxch(1);
- fsuba(3);
- fld_d(ExternalAddress(8 + pi04_5d)); //0x1a600000UL, 0x3dc0b461UL
- fmul(3);
- fsuba(2);
- fxch(1);
- fsub(2);
- fsubrp(1);
- faddp(3);
- fld_d(ExternalAddress(16 + pi04_5d)); //0x2e000000UL, 0x3b93198aUL
- fmul(2);
- fld_s(0);
- fsubr(2);
- fsuba(2);
- fxch(1);
- fsubp(2);
- fxch(1);
- faddp(3);
- fld_d(ExternalAddress(24 + pi04_5d)); //0x25200000UL, 0x396b839aUL
- fmul(2);
- fld_s(0);
- fsubr(2);
- fsuba(2);
- fxch(1);
- fsubp(2);
- fxch(1);
- faddp(3);
- fld_d(ExternalAddress(32 + pi04_5d)); //0x533e63a0UL, 0x37027044UL
- fmulp(2);
- fld_s(1);
- fsubr(1);
- fsuba(1);
- fxch(2);
- fsubp(1);
- faddp(2);
- fxch(1);
- jmp(B1_15);
-
- bind(B1_8);
- fld_x(Address(ebp, 8));
- addl(ebx, -16417);
- fmul_d(as_Address(ExternalAddress(SCALE))); //0x00000000UL, 0x32600000UL
- movl(eax, -2078209981);
- imull(ebx);
- addl(edx, ebx);
- movl(ecx, ebx);
- sarl(edx, 4);
- sarl(ecx, 31);
- subl(edx, ecx);
- movl(eax, edx);
- shll(eax, 5);
- fstp_x(Address(ebp, 8));
- fld_x(Address(ebp, 8));
- subl(eax, edx);
- movl(Address(ebp, 8), 0);
- subl(ebx, eax);
- fld_x(Address(ebp, 8));
- cmpl(ebx, 17);
- fsuba(1);
- jcc(Assembler::less, B1_10);
-
- bind(B1_9);
- lea(eax, Address(noreg, edx, Address::times_8));
- lea(ecx, Address(eax, edx, Address::times_4));
- incl(edx);
- fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmul(2);
- fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmul(2);
- fld_s(0);
- fadd(2);
- fsuba(2);
- fxch(1);
- faddp(2);
- fld_s(1);
- fadd(1);
- fstp_x(Address(esp, 8));
- andl(Address(esp, 8), -16777216);
- fld_x(Address(esp, 8));
- fsubp(1);
- jmp(B1_11);
-
- bind(B1_10);
- fld_d(ExternalAddress(zeros)); //0x00000000UL, 0x00000000UL
- fld_s(0);
-
- bind(B1_11);
- fld_s(0);
- lea(eax, Address(noreg, edx, Address::times_8));
- fld_s(3);
- lea(edx, Address(eax, edx, Address::times_4));
- fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
- fmul(6);
- movl(Address(esp, 0), edx);
- fadda(2);
- fxch(2);
- fsuba(3);
- fxch(2);
- faddp(3);
- fxch(2);
- faddp(3);
- fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
- fmula(2);
- fld_s(2);
- fadd(2);
- fld_s(0);
- fxch(1);
- fsubra(3);
- fxch(3);
- fchs();
- faddp(4);
- fxch(3);
- faddp(4);
- fxch(2);
- fadd(3);
- fxch(2);
- fmul(5);
- fadda(2);
- fld_s(4);
- fld_x(Address(24 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
- fmula(1);
- fxch(1);
- fadda(4);
- fxch(4);
- fstp_x(Address(esp, 8));
- movzwl(ebx, Address(esp, 16));
- andl(ebx, 32767);
- cmpl(ebx, 16415);
- jcc(Assembler::greaterEqual, B1_13);
-
- bind(B1_12);
- negl(ebx);
- addl(ebx, 30);
- movl(ecx, ebx);
- movl(eax, Address(esp, 12));
- shrl(eax);
- shll(eax);
- movl(Address(esp, 12), eax);
- movl(Address(esp, 8), 0);
- shrl(eax);
- jmp(B1_14);
-
- bind(B1_13);
- negl(ebx);
- addl(ebx, 30);
- movl(ecx, ebx);
- movl(edx, Address(esp, 8));
- shrl(edx);
- shll(edx);
- negl(ecx);
- movl(eax, Address(esp, 12));
- shll(eax);
- movl(ecx, ebx);
- movl(Address(esp, 8), edx);
- shrl(edx);
- orl(eax, edx);
-
- bind(B1_14);
- fld_x(Address(esp, 8));
- addl(eax, Address(esp, 4));
- fsubp(3);
- fmul(6);
- fld_s(4);
- movl(edx, eax);
- andl(edx, 1);
- fadd(3);
- movl(ecx, Address(esp, 0));
- fsuba(3);
- fxch(3);
- faddp(5);
- fld_s(1);
- fxch(3);
- fadd_d(Address(zero_none, RelocationHolder::none).plus_disp(edx, Address::times_8));
- fadda(3);
- fsub(3);
- faddp(2);
- fxch(1);
- faddp(4);
- fld_s(2);
- fadd(2);
- fsuba(2);
- fxch(3);
- faddp(2);
- fxch(1);
- faddp(3);
- fld_s(0);
- fadd(2);
- fsuba(2);
- fxch(1);
- faddp(2);
- fxch(1);
- faddp(2);
- fld_s(2);
- fld_x(Address(36 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmula(1);
- fld_s(1);
- fadd(3);
- fsuba(3);
- fxch(2);
- faddp(3);
- fxch(2);
- faddp(3);
- fxch(1);
- fmul(4);
- fld_s(0);
- fadd(2);
- fsuba(2);
- fxch(1);
- faddp(2);
- fxch(1);
- faddp(2);
- fld_s(2);
- fld_x(Address(48 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmula(1);
- fld_s(1);
- fadd(3);
- fsuba(3);
- fxch(2);
- faddp(3);
- fxch(2);
- faddp(3);
- fld_s(3);
- fxch(2);
- fmul(5);
- fld_x(Address(60 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmula(3);
- fxch(3);
- faddp(1);
- fld_s(0);
- fadd(2);
- fsuba(2);
- fxch(1);
- faddp(2);
- fxch(1);
- faddp(3);
- fld_s(3);
- fxch(2);
- fmul(5);
- fld_x(Address(72 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmula(3);
- fxch(3);
- faddp(1);
- fld_s(0);
- fadd(2);
- fsuba(2);
- fxch(1);
- faddp(2);
- fxch(1);
- faddp(3);
- fxch(1);
- fmulp(4);
- fld_x(Address(84 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
- fmulp(3);
- fxch(2);
- faddp(3);
- fld_s(2);
- fadd(2);
- fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL
- fmul(1);
- fadda(1);
- fsubp(1);
- fsuba(2);
- fxch(3);
- faddp(2);
- faddp(1);
- fld_d(ExternalAddress(pi04_2d)); //0x54400000UL, 0x3fe921fbUL
- fld_s(0);
- fmul(2);
- fxch(2);
- fadd(3);
- fxch(1);
- fmulp(3);
- fmul_d(as_Address(ExternalAddress(8 + pi04_2d))); //0x1a626331UL, 0x3dc0b461UL
- faddp(1);
-
- bind(B1_15);
- fld_d(ExternalAddress(TWO_12H)); //0x00000000UL, 0x40b80000UL
- fld_s(2);
- fadd(2);
- fmula(1);
- fstp_x(Address(esp, 8));
- fld_x(Address(esp, 8));
- fadd(1);
- fsubrp(1);
- fst_d(Address(esi, 0));
- fsubp(2);
- faddp(1);
- fstp_d(Address(esi, 8));
- addl(esp, 20);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-}
-
-ALIGNED_(16) juint _L_2il0floatpacket_0[] =
-{
- 0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
-};
-
-ALIGNED_(16) juint _Pi4Inv[] =
-{
- 0x6dc9c883UL, 0x3ff45f30UL
-};
-
-ALIGNED_(16) juint _Pi4x3[] =
-{
- 0x54443000UL, 0xbfe921fbUL, 0x3b39a000UL, 0x3d373dcbUL, 0xe0e68948UL,
- 0xba845c06UL
-};
-
-ALIGNED_(16) juint _Pi4x4[] =
-{
- 0x54400000UL, 0xbfe921fbUL, 0x1a600000UL, 0xbdc0b461UL, 0x2e000000UL,
- 0xbb93198aUL, 0x252049c1UL, 0xb96b839aUL
-};
-
-ALIGNED_(16) jushort _SP[] =
-{
- 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffc, 0x0000, 0x8887, 0x8888, 0x8888, 0x8888,
- 0x3ff8, 0x0000, 0xc527, 0x0d00, 0x00d0, 0xd00d, 0xbff2, 0x0000, 0x45f6, 0xb616,
- 0x1d2a, 0xb8ef, 0x3fec, 0x0000, 0x825b, 0x3997, 0x2b3f, 0xd732, 0xbfe5, 0x0000,
- 0xbf33, 0x8bb4, 0x2fda, 0xb092, 0x3fde, 0x0000, 0x44a6, 0xed1a, 0x29ef, 0xd73e,
- 0xbfd6, 0x0000, 0x8610, 0x307f, 0x62a1, 0xc921, 0x3fce, 0x0000
-};
-
-ALIGNED_(16) jushort _CP[] =
-{
- 0x0000, 0x0000, 0x0000, 0x8000, 0xbffe, 0x0000, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x3ffa, 0x0000, 0x9c2f, 0x0b60, 0x60b6, 0xb60b, 0xbff5, 0x0000, 0xf024, 0x0cac,
- 0x00d0, 0xd00d, 0x3fef, 0x0000, 0x03fe, 0x3f65, 0x7dbb, 0x93f2, 0xbfe9, 0x0000,
- 0xd84d, 0xadee, 0xc698, 0x8f76, 0x3fe2, 0x0000, 0xdaba, 0xfe79, 0xea36, 0xc9c9,
- 0xbfda, 0x0000, 0x3ac6, 0x0ba0, 0x07ce, 0xd585, 0x3fd2, 0x0000
-};
-
-ALIGNED_(16) juint _ones[] =
-{
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xbff00000UL
-};
-
-void MacroAssembler::libm_sincos_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
- Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12;
- Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
- Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
- Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_41, B1_42, B1_43, B1_44, B1_45, B1_46;
-
- assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
-
- address L_2il0floatpacket_0 = (address)_L_2il0floatpacket_0;
- address Pi4Inv = (address)_Pi4Inv;
- address Pi4x3 = (address)_Pi4x3;
- address Pi4x4 = (address)_Pi4x4;
- address ones = (address)_ones;
- address CP = (address)_CP;
- address SP = (address)_SP;
-
- bind(B1_1);
- push(ebp);
- movl(ebp, esp);
- andl(esp, -64);
- push(esi);
- push(edi);
- push(ebx);
- subl(esp, 52);
- movl(eax, Address(ebp, 16));
- movl(edx, Address(ebp, 20));
- movl(Address(esp, 32), eax);
- movl(Address(esp, 36), edx);
-
- bind(B1_2);
- fnstcw(Address(esp, 30));
-
- bind(B1_3);
- movsd(xmm1, Address(ebp, 8));
- movl(esi, Address(ebp, 12));
- movl(eax, esi);
- andl(eax, 2147483647);
- andps(xmm1, ExternalAddress(L_2il0floatpacket_0)); //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
- shrl(esi, 31);
- movl(Address(esp, 40), eax);
- cmpl(eax, 1104150528);
- movsd(Address(ebp, 8), xmm1);
- jcc(Assembler::aboveEqual, B1_11);
-
- bind(B1_4);
- movsd(xmm0, ExternalAddress(Pi4Inv)); //0x6dc9c883UL, 0x3ff45f30UL
- mulsd(xmm0, xmm1);
- movzwl(edx, Address(esp, 30));
- movl(eax, edx);
- andl(eax, 768);
- movsd(Address(esp, 0), xmm0);
- cmpl(eax, 768);
- jcc(Assembler::equal, B1_42);
-
- bind(B1_5);
- orl(edx, -64768);
- movw(Address(esp, 28), edx);
-
- bind(B1_6);
- fldcw(Address(esp, 28));
-
- bind(B1_7);
- movsd(xmm1, Address(ebp, 8));
- movl(ebx, 1);
-
- bind(B1_8);
- movl(Address(esp, 12), ebx);
- movl(ebx, Address(esp, 4));
- movl(eax, ebx);
- movl(Address(esp, 8), esi);
- movl(esi, ebx);
- shrl(esi, 20);
- andl(eax, 1048575);
- movl(ecx, esi);
- orl(eax, 1048576);
- negl(ecx);
- movl(edx, eax);
- addl(ecx, 19);
- addl(esi, 13);
- movl(Address(esp, 24), ecx);
- shrl(edx);
- movl(ecx, esi);
- shll(eax);
- movl(ecx, Address(esp, 24));
- movl(esi, Address(esp, 0));
- shrl(esi);
- orl(eax, esi);
- cmpl(ebx, 1094713344);
- movsd(Address(esp, 16), xmm1);
- fld_d(Address(esp, 16));
- cmov32(Assembler::below, eax, edx);
- movl(esi, Address(esp, 8));
- lea(edx, Address(eax, 1));
- movl(ebx, edx);
- andl(ebx, -2);
- movl(Address(esp, 16), ebx);
- fild_s(Address(esp, 16));
- movl(ebx, Address(esp, 12));
- cmpl(Address(esp, 40), 1094713344);
- jcc(Assembler::aboveEqual, B1_10);
-
- bind(B1_9);
- fld_d(ExternalAddress(Pi4x3)); //0x54443000UL, 0xbfe921fbUL
- fmul(1);
- faddp(2);
- fld_d(ExternalAddress(8 + Pi4x3)); //0x3b39a000UL, 0x3d373dcbUL
- fmul(1);
- faddp(2);
- fld_d(ExternalAddress(16 + Pi4x3)); //0xe0e68948UL, 0xba845c06UL
- fmulp(1);
- faddp(1);
- jmp(B1_17);
-
- bind(B1_10);
- fld_d(ExternalAddress(Pi4x4)); //0x54400000UL, 0xbfe921fbUL
- fmul(1);
- faddp(2);
- fld_d(ExternalAddress(8 + Pi4x4)); //0x1a600000UL, 0xbdc0b461UL
- fmul(1);
- faddp(2);
- fld_d(ExternalAddress(16 + Pi4x4)); //0x2e000000UL, 0xbb93198aUL
- fmul(1);
- faddp(2);
- fld_d(ExternalAddress(24 + Pi4x4)); //0x252049c1UL, 0xb96b839aUL
- fmulp(1);
- faddp(1);
- jmp(B1_17);
-
- bind(B1_11);
- movzwl(edx, Address(esp, 30));
- movl(eax, edx);
- andl(eax, 768);
- cmpl(eax, 768);
- jcc(Assembler::equal, B1_43);
- bind(B1_12);
- orl(edx, -64768);
- movw(Address(esp, 28), edx);
-
- bind(B1_13);
- fldcw(Address(esp, 28));
-
- bind(B1_14);
- movsd(xmm1, Address(ebp, 8));
- movl(ebx, 1);
-
- bind(B1_15);
- movsd(Address(esp, 16), xmm1);
- fld_d(Address(esp, 16));
- addl(esp, -32);
- lea(eax, Address(esp, 32));
- fstp_x(Address(esp, 0));
- movl(Address(esp, 12), 0);
- movl(Address(esp, 16), eax);
- call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_reduce_pi04l())));
-
- bind(B1_46);
- addl(esp, 32);
-
- bind(B1_16);
- fld_d(Address(esp, 0));
- lea(edx, Address(eax, 1));
- fld_d(Address(esp, 8));
- faddp(1);
-
- bind(B1_17);
- movl(ecx, edx);
- addl(eax, 3);
- shrl(ecx, 2);
- andl(ecx, 1);
- shrl(eax, 2);
- xorl(esi, ecx);
- movl(ecx, Address(esp, 36));
- andl(eax, 1);
- andl(ecx, 3);
- cmpl(ecx, 3);
- jcc(Assembler::notEqual, B1_25);
-
- bind(B1_18);
- fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
- fld_s(1);
- fmul((2));
- testb(edx, 2);
- fmula((1));
- fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
- faddp(2);
- fmula(1);
- fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
- fmul(1);
- fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(62 + CP)); //0xd84d, 0xadee, 0xc6
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
- faddp(1);
- fmul(1);
- fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
- faddp(1);
- fmulp(1);
- fld_d(Address(ones, RelocationHolder::none).plus_disp(esi, Address::times_8));
- fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
- jcc(Assembler::equal, B1_22);
-
- bind(B1_19);
- fmulp(4);
- testl(ebx, ebx);
- fxch(2);
- fmul(3);
- movl(eax, Address(esp, 2));
- faddp(3);
- fxch(2);
- fstp_d(Address(eax, 0));
- fmula(1);
- faddp(1);
- fstp_d(Address(eax, 8));
- jcc(Assembler::equal, B1_21);
-
- bind(B1_20);
- fldcw(Address(esp, 30));
-
- bind(B1_21);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-
- bind(B1_22);
- fxch(1);
- fmulp(4);
- testl(ebx, ebx);
- fxch(2);
- fmul(3);
- movl(eax, Address(esp, 32));
- faddp(3);
- fxch(2);
- fstp_d(Address(eax, 8));
- fmula(1);
- faddp(1);
- fstp_d(Address(eax, 0));
- jcc(Assembler::equal, B1_24);
-
- bind(B1_23);
- fldcw(Address(esp, 30));
-
- bind(B1_24);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-
- bind(B1_25);
- testb(Address(esp, 36), 2);
- jcc(Assembler::equal, B1_33);
-
- bind(B1_26);
- fld_s(0);
- testb(edx, 2);
- fmul(1);
- fld_s(0);
- fmul(1);
- jcc(Assembler::equal, B1_30);
-
- bind(B1_27);
- fstp_d(2);
- fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
- testl(ebx, ebx);
- fmul(2);
- fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
- fmul(3);
- fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6
- movl(eax, Address(rsp, 32));
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
- faddp(2);
- fxch(1);
- fmulp(3);
- fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
- faddp(1);
- fmulp(1);
- faddp(1);
- fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8));
- fmula(1);
- faddp(1);
- fstp_d(Address(eax, 8));
- jcc(Assembler::equal, B1_29);
-
- bind(B1_28);
- fldcw(Address(esp, 30));
-
- bind(B1_29);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-
- bind(B1_30);
- fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
- testl(ebx, ebx);
- fmul(1);
- fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
- fmul(2);
- fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
- movl(eax, Address(rsp, 32));
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
- faddp(2);
- fxch(1);
- fmulp(2);
- fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
- faddp(1);
- fmulp(2);
- faddp(1);
- fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8));
- fmulp(2);
- fmul(1);
- faddp(1);
- fstp_d(Address(eax, 8));
- jcc(Assembler::equal, B1_32);
-
- bind(B1_31);
- fldcw(Address(esp, 30));
-
- bind(B1_32);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-
- bind(B1_33);
- testb(Address(esp, 36), 1);
- jcc(Assembler::equal, B1_41);
-
- bind(B1_34);
- fld_s(0);
- testb(edx, 2);
- fmul(1);
- fld_s(0);
- fmul(1);
- jcc(Assembler::equal, B1_38);
-
- bind(B1_35);
- fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
- testl(ebx, ebx);
- fmul(1);
- fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
- fmul(2);
- fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
- faddp(2);
- fxch(1);
- fmul(2);
- fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
- faddp(2);
- fxch(1);
- fmulp(2);
- fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
- faddp(1);
- fmulp(2);
- faddp(1);
- fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
- fmulp(2);
- fmul(1);
- movl(eax, Address(esp, 32));
- faddp(1);
- fstp_d(Address(eax, 0));
- jcc(Assembler::equal, B1_37);
-
- bind(B1_36);
- fldcw(Address(esp, 30));
-
- bind(B1_37);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
-
- bind(B1_38);
- fstp_d(2);
- fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
- testl(ebx, ebx);
- fmul(2);
- fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
- fmul(3);
- fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
- faddp(2);
- fxch(1);
- fmul(3);
- fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
- faddp(2);
- fxch(1);
- fmulp(3);
- fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
- faddp(1);
- fmulp(1);
- faddp(1);
- fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
- fmula(1);
- movl(eax, Address(esp, 32));
- faddp(1);
- fstp_d(Address(eax, 0));
- jcc(Assembler::equal, B1_40);
-
- bind(B1_39);
- fldcw(Address(esp, 30));
- bind(B1_40);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
- bind(B1_41);
- fstp_d(0);
- addl(esp, 52);
- pop(ebx);
- pop(edi);
- pop(esi);
- movl(esp, ebp);
- pop(ebp);
- ret(0);
- bind(B1_42);
- xorl(ebx, ebx);
- jmp(B1_8);
- bind(B1_43);
- xorl(ebx, ebx);
- jmp(B1_15);
-}
-
-ALIGNED_(16) juint _static_const_table_sin[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
- 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
- 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
- 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
- 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
- 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
- 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
- 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
- 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
- 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
- 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
- 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
- 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
- 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
- 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
- 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
- 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
- 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
- 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
- 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
- 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
- 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
- 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
- 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
- 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
- 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
- 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
- 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
- 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
- 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
- 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
- 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
- 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
- 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
- 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
- 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
- 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
- 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
- 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
- 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
- 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
- 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
- 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
- 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
- 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
- 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
- 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
- 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
- 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
- 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
- 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
- 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
- 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
- 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
- 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
- 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
- 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
- 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
- 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
- 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
- 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
- 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
- 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
- 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
- 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
- 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
- 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
- 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
- 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
- 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
- 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
- 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
- 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
- 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
- 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
- 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0x3ff00000UL, 0x55555555UL, 0xbfc55555UL, 0x00000000UL,
- 0xbfe00000UL, 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL,
- 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL, 0xa556c734UL,
- 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL, 0x1a600000UL, 0x3d90b461UL,
- 0x1a600000UL, 0x3d90b461UL, 0x54400000UL, 0x3fb921fbUL, 0x00000000UL,
- 0x00000000UL, 0x2e037073UL, 0x3b63198aUL, 0x00000000UL, 0x00000000UL,
- 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x43380000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
- 0x00000000UL, 0xffffffffUL, 0x3fefffffUL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x80000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x3fe00000UL,
- 0x00000000UL, 0x3fe00000UL
-};
-
-void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register edx) {
-
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, start;
- assert_different_registers(eax, ebx, edx);
- address static_const_table_sin = (address)_static_const_table_sin;
-
- bind(start);
- subl(rsp, 120);
- movl(Address(rsp, 56), ebx);
- lea(ebx, ExternalAddress(static_const_table_sin));
- movsd(xmm0, Address(rsp, 128));
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- subl(eax, 12336);
- cmpl(eax, 4293);
- jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
- movsd(xmm1, Address(ebx, 2160));
- mulsd(xmm1, xmm0);
- movsd(xmm5, Address(ebx, 2272));
- movdqu(xmm4, Address(ebx, 2256));
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- movsd(xmm3, Address(ebx, 2128));
- movdqu(xmm2, Address(ebx, 2112));
- addpd(xmm1, xmm5);
- cvttsd2sil(edx, xmm1);
- cvtsi2sdl(xmm1, edx);
- mulsd(xmm3, xmm1);
- unpcklpd(xmm1, xmm1);
- addl(edx, 1865216);
- movdqu(xmm4, xmm0);
- andl(edx, 63);
- movdqu(xmm5, Address(ebx, 2096));
- lea(eax, Address(ebx, 0));
- shll(edx, 5);
- addl(eax, edx);
- mulpd(xmm2, xmm1);
- subsd(xmm0, xmm3);
- mulsd(xmm1, Address(ebx, 2144));
- subsd(xmm4, xmm3);
- movsd(xmm7, Address(eax, 8));
- unpcklpd(xmm0, xmm0);
- movapd(xmm3, xmm4);
- subsd(xmm4, xmm2);
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm2);
- movdqu(xmm6, Address(ebx, 2064));
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm2);
- movdqu(xmm2, Address(eax, 0));
- subsd(xmm1, xmm3);
- movsd(xmm3, Address(eax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, Address(ebx, 2080));
- mulsd(xmm4, Address(eax, 0));
- addpd(xmm6, Address(ebx, 2048));
- mulpd(xmm5, xmm0);
- movapd(xmm0, xmm3);
- addsd(xmm3, Address(eax, 8));
- mulpd(xmm1, xmm7);
- movapd(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movsd(xmm5, Address(eax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(eax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm5, xmm0);
- addsd(xmm3, xmm7);
- addsd(xmm1, xmm5);
- addsd(xmm1, xmm3);
- addsd(xmm1, xmm6);
- unpckhpd(xmm6, xmm6);
- addsd(xmm1, xmm6);
- addsd(xmm4, xmm1);
- movsd(Address(rsp, 0), xmm4);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_0_0_2);
- jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
- shrl(eax, 4);
- cmpl(eax, 268434685);
- jcc(Assembler::notEqual, L_2TAG_PACKET_3_0_2);
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_3_0_2);
- movsd(xmm3, Address(ebx, 2192));
- mulsd(xmm3, xmm0);
- subsd(xmm3, xmm0);
- mulsd(xmm3, Address(ebx, 2208));
- movsd(Address(rsp, 0), xmm0);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movl(eax, Address(rsp, 132));
- andl(eax, 2146435072);
- cmpl(eax, 2146435072);
- jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
- subl(rsp, 32);
- movsd(Address(rsp, 0), xmm0);
- lea(eax, Address(rsp, 40));
- movl(Address(rsp, 8), eax);
- movl(eax, 2);
- movl(Address(rsp, 12), eax);
- call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_sin_cos_huge())));
- addl(rsp, 32);
- fld_d(Address(rsp, 16));
- jmp(L_2TAG_PACKET_1_0_2);
- bind(L_2TAG_PACKET_4_0_2);
- fld_d(Address(rsp, 128));
- fmul_d(Address(ebx, 2240));
- bind(L_2TAG_PACKET_1_0_2);
- movl(ebx, Address(rsp, 56));
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - COS()
-// ---------------------
-//
-// 1. RANGE REDUCTION
-//
-// We perform an initial range reduction from X to r with
-//
-// X =~= N * pi/32 + r
-//
-// so that |r| <= pi/64 + epsilon. We restrict inputs to those
-// where |N| <= 932560. Beyond this, the range reduction is
-// insufficiently accurate. For extremely small inputs,
-// denormalization can occur internally, impacting performance.
-// This means that the main path is actually only taken for
-// 2^-252 <= |X| < 90112.
-//
-// To avoid branches, we perform the range reduction to full
-// accuracy each time.
-//
-// X - N * (P_1 + P_2 + P_3)
-//
-// where P_1 and P_2 are 32-bit numbers (so multiplication by N
-// is exact) and P_3 is a 53-bit number. Together, these
-// approximate pi well enough for all cases in the restricted
-// range.
-//
-// The main reduction sequence is:
-//
-// y = 32/pi * x
-// N = integer(y)
-// (computed by adding and subtracting off SHIFTER)
-//
-// m_1 = N * P_1
-// m_2 = N * P_2
-// r_1 = x - m_1
-// r = r_1 - m_2
-// (this r can be used for most of the calculation)
-//
-// c_1 = r_1 - r
-// m_3 = N * P_3
-// c_2 = c_1 - m_2
-// c = c_2 - m_3
-//
-// 2. MAIN ALGORITHM
-//
-// The algorithm uses a table lookup based on B = M * pi / 32
-// where M = N mod 64. The stored values are:
-// sigma closest power of 2 to cos(B)
-// C_hl 53-bit cos(B) - sigma
-// S_hi + S_lo 2 * 53-bit sin(B)
-//
-// The computation is organized as follows:
-//
-// sin(B + r + c) = [sin(B) + sigma * r] +
-// r * (cos(B) - sigma) +
-// sin(B) * [cos(r + c) - 1] +
-// cos(B) * [sin(r + c) - r]
-//
-// which is approximately:
-//
-// [S_hi + sigma * r] +
-// C_hl * r +
-// S_lo + S_hi * [(cos(r) - 1) - r * c] +
-// (C_hl + sigma) * [(sin(r) - r) + c]
-//
-// and this is what is actually computed. We separate this sum
-// into four parts:
-//
-// hi + med + pols + corr
-//
-// where
-//
-// hi = S_hi + sigma r
-// med = C_hl * r
-// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-// 3. POLYNOMIAL
-//
-// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-// (sin(r) - r) can be rearranged freely, since it is quite
-// small, so we exploit parallelism to the fullest.
-//
-// psc4 = SC_4 * r_1
-// msc4 = psc4 * r
-// r2 = r * r
-// msc2 = SC_2 * r2
-// r4 = r2 * r2
-// psc3 = SC_3 + msc4
-// psc1 = SC_1 + msc2
-// msc3 = r4 * psc3
-// sincospols = psc1 + msc3
-// pols = sincospols *
-// <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-// 4. CORRECTION TERM
-//
-// This is where the "c" component of the range reduction is
-// taken into account; recall that just "r" is used for most of
-// the calculation.
-//
-// -c = m_3 - c_2
-// -d = S_hi * r - (C_hl + sigma)
-// corr = -c * -d + S_lo
-//
-// 5. COMPENSATED SUMMATIONS
-//
-// The two successive compensated summations add up the high
-// and medium parts, leaving just the low parts to add up at
-// the end.
-//
-// rs = sigma * r
-// res_int = S_hi + rs
-// k_0 = S_hi - res_int
-// k_2 = k_0 + rs
-// med = C_hl * r
-// res_hi = res_int + med
-// k_1 = res_int - res_hi
-// k_3 = k_1 + med
-//
-// 6. FINAL SUMMATION
-//
-// We now add up all the small parts:
-//
-// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-// Now the overall result is just:
-//
-// res_hi + res_lo
-//
-// 7. SMALL ARGUMENTS
-//
-// Inputs with |X| < 2^-252 are treated specially as
-// 1 - |x|.
-//
-// Special cases:
-// cos(NaN) = quiet NaN, and raise invalid exception
-// cos(INF) = NaN and raise invalid exception
-// cos(0) = 1
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _static_const_table_cos[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
- 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
- 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
- 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
- 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
- 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
- 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
- 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
- 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
- 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
- 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
- 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
- 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
- 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
- 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
- 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
- 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
- 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
- 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
- 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
- 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
- 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
- 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
- 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
- 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
- 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
- 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
- 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
- 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
- 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
- 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
- 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
- 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
- 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
- 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
- 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
- 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
- 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
- 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
- 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
- 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
- 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
- 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
- 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
- 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
- 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
- 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
- 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
- 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
- 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
- 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
- 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
- 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
- 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
- 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
- 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
- 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
- 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
- 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
- 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
- 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
- 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
- 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
- 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
- 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
- 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
- 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
- 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
- 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
- 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
- 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
- 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
- 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
- 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
- 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
- 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0x3ff00000UL, 0x55555555UL, 0xbfc55555UL, 0x00000000UL,
- 0xbfe00000UL, 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL,
- 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL, 0xa556c734UL,
- 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL, 0x1a600000UL, 0x3d90b461UL,
- 0x1a600000UL, 0x3d90b461UL, 0x54400000UL, 0x3fb921fbUL, 0x00000000UL,
- 0x00000000UL, 0x2e037073UL, 0x3b63198aUL, 0x00000000UL, 0x00000000UL,
- 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x43380000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3ff00000UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
-};
-
-//registers,
-// input: (rbp + 8)
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, rbx (tmp)
-
-// Code generated by Intel C compiler for LIBM library
-
-void MacroAssembler::fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
- Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
-
- assert_different_registers(tmp, eax, ecx, edx);
-
- address static_const_table_cos = (address)_static_const_table_cos;
-
- bind(start);
- subl(rsp, 120);
- movl(Address(rsp, 56), tmp);
- lea(tmp, ExternalAddress(static_const_table_cos));
- movsd(xmm0, Address(rsp, 128));
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- subl(eax, 12336);
- cmpl(eax, 4293);
- jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
- movsd(xmm1, Address(tmp, 2160));
- mulsd(xmm1, xmm0);
- movdqu(xmm5, Address(tmp, 2240));
- movsd(xmm4, Address(tmp, 2224));
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- movsd(xmm3, Address(tmp, 2128));
- movdqu(xmm2, Address(tmp, 2112));
- addpd(xmm1, xmm5);
- cvttsd2sil(edx, xmm1);
- cvtsi2sdl(xmm1, edx);
- mulsd(xmm3, xmm1);
- unpcklpd(xmm1, xmm1);
- addl(edx, 1865232);
- movdqu(xmm4, xmm0);
- andl(edx, 63);
- movdqu(xmm5, Address(tmp, 2096));
- lea(eax, Address(tmp, 0));
- shll(edx, 5);
- addl(eax, edx);
- mulpd(xmm2, xmm1);
- subsd(xmm0, xmm3);
- mulsd(xmm1, Address(tmp, 2144));
- subsd(xmm4, xmm3);
- movsd(xmm7, Address(eax, 8));
- unpcklpd(xmm0, xmm0);
- movapd(xmm3, xmm4);
- subsd(xmm4, xmm2);
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm2);
- movdqu(xmm6, Address(tmp, 2064));
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm2);
- movdqu(xmm2, Address(eax, 0));
- subsd(xmm1, xmm3);
- movsd(xmm3, Address(eax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, Address(tmp, 2080));
- mulsd(xmm4, Address(eax, 0));
- addpd(xmm6, Address(tmp, 2048));
- mulpd(xmm5, xmm0);
- movapd(xmm0, xmm3);
- addsd(xmm3, Address(eax, 8));
- mulpd(xmm1, xmm7);
- movapd(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movsd(xmm5, Address(eax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(eax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm5, xmm0);
- addsd(xmm3, xmm7);
- addsd(xmm1, xmm5);
- addsd(xmm1, xmm3);
- addsd(xmm1, xmm6);
- unpckhpd(xmm6, xmm6);
- addsd(xmm1, xmm6);
- addsd(xmm4, xmm1);
- movsd(Address(rsp, 0), xmm4);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_0_0_2);
- jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- pinsrw(xmm0, eax, 3);
- movsd(xmm1, Address(tmp, 2192));
- subsd(xmm1, xmm0);
- movsd(Address(rsp, 0), xmm1);
- fld_d(Address(rsp, 0));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movl(eax, Address(rsp, 132));
- andl(eax, 2146435072);
- cmpl(eax, 2146435072);
- jcc(Assembler::equal, L_2TAG_PACKET_3_0_2);
- subl(rsp, 32);
- movsd(Address(rsp, 0), xmm0);
- lea(eax, Address(rsp, 40));
- movl(Address(rsp, 8), eax);
- movl(eax, 1);
- movl(Address(rsp, 12), eax);
- call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_sin_cos_huge())));
- addl(rsp, 32);
- fld_d(Address(rsp, 8));
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_3_0_2);
- fld_d(Address(rsp, 128));
- fmul_d(Address(tmp, 2208));
-
- bind(L_2TAG_PACKET_1_0_2);
- movl(tmp, Address(rsp, 56));
-}
-
--- a/hotspot/src/cpu/x86/vm/macroAssembler_libm_x86_64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3945 +0,0 @@
-/*
- * Copyright (c) 2015, Intel Corporation.
- * Intel Math Library (LIBM) Source Code
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-#include "asm/assembler.hpp"
-#include "asm/assembler.inline.hpp"
-#include "macroAssembler_x86.hpp"
-
-#ifdef _MSC_VER
-#define ALIGNED_(x) __declspec(align(x))
-#else
-#define ALIGNED_(x) __attribute__ ((aligned(x)))
-#endif
-
-// The 64 bit code is at most SSE2 compliant
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - EXP()
-// ---------------------
-//
-// Description:
-// Let K = 64 (table size).
-// x x/log(2) n
-// e = 2 = 2 * T[j] * (1 + P(y))
-// where
-// x = m*log(2)/K + y, y in [-log(2)/K..log(2)/K]
-// m = n*K + j, m,n,j - signed integer, j in [-K/2..K/2]
-// j/K
-// values of 2 are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
-//
-// P(y) is a minimax polynomial approximation of exp(x)-1
-// on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
-//
-// To avoid problems with arithmetic overflow and underflow,
-// n n1 n2
-// value of 2 is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
-// where BIAS is a value of exponent bias.
-//
-// Special cases:
-// exp(NaN) = NaN
-// exp(+INF) = +INF
-// exp(-INF) = 0
-// exp(x) = 1 for subnormals
-// for finite argument, only exp(0)=1 is exact
-// For IEEE double
-// if x > 709.782712893383973096 then exp(x) overflow
-// if x < -745.133219101941108420 then exp(x) underflow
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _cv[] =
-{
- 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL, 0xfefa0000UL,
- 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL, 0xbc9e3b3aUL, 0x3d1cf79aUL,
- 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL,
- 0x3fdfffffUL, 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL,
- 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
-};
-
-ALIGNED_(16) juint _shifter[] =
-{
- 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
-};
-
-ALIGNED_(16) juint _mmask[] =
-{
- 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
-};
-
-ALIGNED_(16) juint _bias[] =
-{
- 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
-};
-
-ALIGNED_(16) juint _Tbl_addr[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0e03754dUL,
- 0x3cad7bbfUL, 0x3e778060UL, 0x00002c9aUL, 0x3567f613UL, 0x3c8cd252UL,
- 0xd3158574UL, 0x000059b0UL, 0x61e6c861UL, 0x3c60f74eUL, 0x18759bc8UL,
- 0x00008745UL, 0x5d837b6cUL, 0x3c979aa6UL, 0x6cf9890fUL, 0x0000b558UL,
- 0x702f9cd1UL, 0x3c3ebe3dUL, 0x32d3d1a2UL, 0x0000e3ecUL, 0x1e63bcd8UL,
- 0x3ca3516eUL, 0xd0125b50UL, 0x00011301UL, 0x26f0387bUL, 0x3ca4c554UL,
- 0xaea92ddfUL, 0x0001429aUL, 0x62523fb6UL, 0x3ca95153UL, 0x3c7d517aUL,
- 0x000172b8UL, 0x3f1353bfUL, 0x3c8b898cUL, 0xeb6fcb75UL, 0x0001a35bUL,
- 0x3e3a2f5fUL, 0x3c9aecf7UL, 0x3168b9aaUL, 0x0001d487UL, 0x44a6c38dUL,
- 0x3c8a6f41UL, 0x88628cd6UL, 0x0002063bUL, 0xe3a8a894UL, 0x3c968efdUL,
- 0x6e756238UL, 0x0002387aUL, 0x981fe7f2UL, 0x3c80472bUL, 0x65e27cddUL,
- 0x00026b45UL, 0x6d09ab31UL, 0x3c82f7e1UL, 0xf51fdee1UL, 0x00029e9dUL,
- 0x720c0ab3UL, 0x3c8b3782UL, 0xa6e4030bUL, 0x0002d285UL, 0x4db0abb6UL,
- 0x3c834d75UL, 0x0a31b715UL, 0x000306feUL, 0x5dd3f84aUL, 0x3c8fdd39UL,
- 0xb26416ffUL, 0x00033c08UL, 0xcc187d29UL, 0x3ca12f8cUL, 0x373aa9caUL,
- 0x000371a7UL, 0x738b5e8bUL, 0x3ca7d229UL, 0x34e59ff6UL, 0x0003a7dbUL,
- 0xa72a4c6dUL, 0x3c859f48UL, 0x4c123422UL, 0x0003dea6UL, 0x259d9205UL,
- 0x3ca8b846UL, 0x21f72e29UL, 0x0004160aUL, 0x60c2ac12UL, 0x3c4363edUL,
- 0x6061892dUL, 0x00044e08UL, 0xdaa10379UL, 0x3c6ecce1UL, 0xb5c13cd0UL,
- 0x000486a2UL, 0xbb7aafb0UL, 0x3c7690ceUL, 0xd5362a27UL, 0x0004bfdaUL,
- 0x9b282a09UL, 0x3ca083ccUL, 0x769d2ca6UL, 0x0004f9b2UL, 0xc1aae707UL,
- 0x3ca509b0UL, 0x569d4f81UL, 0x0005342bUL, 0x18fdd78eUL, 0x3c933505UL,
- 0x36b527daUL, 0x00056f47UL, 0xe21c5409UL, 0x3c9063e1UL, 0xdd485429UL,
- 0x0005ab07UL, 0x2b64c035UL, 0x3c9432e6UL, 0x15ad2148UL, 0x0005e76fUL,
- 0x99f08c0aUL, 0x3ca01284UL, 0xb03a5584UL, 0x0006247eUL, 0x0073dc06UL,
- 0x3c99f087UL, 0x82552224UL, 0x00066238UL, 0x0da05571UL, 0x3c998d4dUL,
- 0x667f3bccUL, 0x0006a09eUL, 0x86ce4786UL, 0x3ca52bb9UL, 0x3c651a2eUL,
- 0x0006dfb2UL, 0x206f0dabUL, 0x3ca32092UL, 0xe8ec5f73UL, 0x00071f75UL,
- 0x8e17a7a6UL, 0x3ca06122UL, 0x564267c8UL, 0x00075febUL, 0x461e9f86UL,
- 0x3ca244acUL, 0x73eb0186UL, 0x0007a114UL, 0xabd66c55UL, 0x3c65ebe1UL,
- 0x36cf4e62UL, 0x0007e2f3UL, 0xbbff67d0UL, 0x3c96fe9fUL, 0x994cce12UL,
- 0x00082589UL, 0x14c801dfUL, 0x3c951f14UL, 0x9b4492ecUL, 0x000868d9UL,
- 0xc1f0eab4UL, 0x3c8db72fUL, 0x422aa0dbUL, 0x0008ace5UL, 0x59f35f44UL,
- 0x3c7bf683UL, 0x99157736UL, 0x0008f1aeUL, 0x9c06283cUL, 0x3ca360baUL,
- 0xb0cdc5e4UL, 0x00093737UL, 0x20f962aaUL, 0x3c95e8d1UL, 0x9fde4e4fUL,
- 0x00097d82UL, 0x2b91ce27UL, 0x3c71affcUL, 0x82a3f090UL, 0x0009c491UL,
- 0x589a2ebdUL, 0x3c9b6d34UL, 0x7b5de564UL, 0x000a0c66UL, 0x9ab89880UL,
- 0x3c95277cUL, 0xb23e255cUL, 0x000a5503UL, 0x6e735ab3UL, 0x3c846984UL,
- 0x5579fdbfUL, 0x000a9e6bUL, 0x92cb3387UL, 0x3c8c1a77UL, 0x995ad3adUL,
- 0x000ae89fUL, 0xdc2d1d96UL, 0x3ca22466UL, 0xb84f15faUL, 0x000b33a2UL,
- 0xb19505aeUL, 0x3ca1112eUL, 0xf2fb5e46UL, 0x000b7f76UL, 0x0a5fddcdUL,
- 0x3c74ffd7UL, 0x904bc1d2UL, 0x000bcc1eUL, 0x30af0cb3UL, 0x3c736eaeUL,
- 0xdd85529cUL, 0x000c199bUL, 0xd10959acUL, 0x3c84e08fUL, 0x2e57d14bUL,
- 0x000c67f1UL, 0x6c921968UL, 0x3c676b2cUL, 0xdcef9069UL, 0x000cb720UL,
- 0x36df99b3UL, 0x3c937009UL, 0x4a07897bUL, 0x000d072dUL, 0xa63d07a7UL,
- 0x3c74a385UL, 0xdcfba487UL, 0x000d5818UL, 0xd5c192acUL, 0x3c8e5a50UL,
- 0x03db3285UL, 0x000da9e6UL, 0x1c4a9792UL, 0x3c98bb73UL, 0x337b9b5eUL,
- 0x000dfc97UL, 0x603a88d3UL, 0x3c74b604UL, 0xe78b3ff6UL, 0x000e502eUL,
- 0x92094926UL, 0x3c916f27UL, 0xa2a490d9UL, 0x000ea4afUL, 0x41aa2008UL,
- 0x3c8ec3bcUL, 0xee615a27UL, 0x000efa1bUL, 0x31d185eeUL, 0x3c8a64a9UL,
- 0x5b6e4540UL, 0x000f5076UL, 0x4d91cd9dUL, 0x3c77893bUL, 0x819e90d8UL,
- 0x000fa7c1UL
-};
-
-ALIGNED_(16) juint _ALLONES[] =
-{
- 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL
-};
-
-ALIGNED_(16) juint _ebias[] =
-{
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3ff00000UL
-};
-
-ALIGNED_(4) juint _XMAX[] =
-{
- 0xffffffffUL, 0x7fefffffUL
-};
-
-ALIGNED_(4) juint _XMIN[] =
-{
- 0x00000000UL, 0x00100000UL
-};
-
-ALIGNED_(4) juint _INF[] =
-{
- 0x00000000UL, 0x7ff00000UL
-};
-
-ALIGNED_(4) juint _ZERO[] =
-{
- 0x00000000UL, 0x00000000UL
-};
-
-ALIGNED_(4) juint _ONE_val[] =
-{
- 0x00000000UL, 0x3ff00000UL
-};
-
-
-// Registers:
-// input: xmm0
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, tmp - r11
-
-// Code generated by Intel C compiler for LIBM library
-
-void MacroAssembler::fast_exp(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
- Label L_2TAG_PACKET_12_0_2, B1_3, B1_5, start;
-
- assert_different_registers(tmp, eax, ecx, edx);
- jmp(start);
- address cv = (address)_cv;
- address Shifter = (address)_shifter;
- address mmask = (address)_mmask;
- address bias = (address)_bias;
- address Tbl_addr = (address)_Tbl_addr;
- address ALLONES = (address)_ALLONES;
- address ebias = (address)_ebias;
- address XMAX = (address)_XMAX;
- address XMIN = (address)_XMIN;
- address INF = (address)_INF;
- address ZERO = (address)_ZERO;
- address ONE_val = (address)_ONE_val;
-
- bind(start);
- subq(rsp, 24);
- movsd(Address(rsp, 8), xmm0);
- unpcklpd(xmm0, xmm0);
- movdqu(xmm1, ExternalAddress(cv)); // 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL
- movdqu(xmm6, ExternalAddress(Shifter)); // 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
- movdqu(xmm2, ExternalAddress(16+cv)); // 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL
- movdqu(xmm3, ExternalAddress(32+cv)); // 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- movl(edx, 16527);
- subl(edx, eax);
- subl(eax, 15504);
- orl(edx, eax);
- cmpl(edx, INT_MIN);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
- mulpd(xmm1, xmm0);
- addpd(xmm1, xmm6);
- movapd(xmm7, xmm1);
- subpd(xmm1, xmm6);
- mulpd(xmm2, xmm1);
- movdqu(xmm4, ExternalAddress(64+cv)); // 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL
- mulpd(xmm3, xmm1);
- movdqu(xmm5, ExternalAddress(80+cv)); // 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
- subpd(xmm0, xmm2);
- movdl(eax, xmm7);
- movl(ecx, eax);
- andl(ecx, 63);
- shll(ecx, 4);
- sarl(eax, 6);
- movl(edx, eax);
- movdqu(xmm6, ExternalAddress(mmask)); // 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
- pand(xmm7, xmm6);
- movdqu(xmm6, ExternalAddress(bias)); // 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
- paddq(xmm7, xmm6);
- psllq(xmm7, 46);
- subpd(xmm0, xmm3);
- lea(tmp, ExternalAddress(Tbl_addr));
- movdqu(xmm2, Address(ecx,tmp));
- mulpd(xmm4, xmm0);
- movapd(xmm6, xmm0);
- movapd(xmm1, xmm0);
- mulpd(xmm6, xmm6);
- mulpd(xmm0, xmm6);
- addpd(xmm5, xmm4);
- mulsd(xmm0, xmm6);
- mulpd(xmm6, ExternalAddress(48+cv)); // 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL, 0x3fdfffffUL
- addsd(xmm1, xmm2);
- unpckhpd(xmm2, xmm2);
- mulpd(xmm0, xmm5);
- addsd(xmm1, xmm0);
- por(xmm2, xmm7);
- unpckhpd(xmm0, xmm0);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm6);
- addl(edx, 894);
- cmpl(edx, 1916);
- jcc (Assembler::above, L_2TAG_PACKET_1_0_2);
- mulsd(xmm0, xmm2);
- addsd(xmm0, xmm2);
- jmp (B1_5);
-
- bind(L_2TAG_PACKET_1_0_2);
- xorpd(xmm3, xmm3);
- movdqu(xmm4, ExternalAddress(ALLONES)); // 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL
- movl(edx, -1022);
- subl(edx, eax);
- movdl(xmm5, edx);
- psllq(xmm4, xmm5);
- movl(ecx, eax);
- sarl(eax, 1);
- pinsrw(xmm3, eax, 3);
- movdqu(xmm6, ExternalAddress(ebias)); // 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3ff00000UL
- psllq(xmm3, 4);
- psubd(xmm2, xmm3);
- mulsd(xmm0, xmm2);
- cmpl(edx, 52);
- jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
- pand(xmm4, xmm2);
- paddd(xmm3, xmm6);
- subsd(xmm2, xmm4);
- addsd(xmm0, xmm2);
- cmpl(ecx, 1023);
- jcc(Assembler::greaterEqual, L_2TAG_PACKET_3_0_2);
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32768);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
- movapd(xmm6, xmm0);
- addsd(xmm0, xmm4);
- mulsd(xmm0, xmm3);
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32752);
- cmpl(ecx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_5_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_5_0_2);
- mulsd(xmm6, xmm3);
- mulsd(xmm4, xmm3);
- movdqu(xmm0, xmm6);
- pxor(xmm6, xmm4);
- psrad(xmm6, 31);
- pshufd(xmm6, xmm6, 85);
- psllq(xmm0, 1);
- psrlq(xmm0, 1);
- pxor(xmm0, xmm6);
- psrlq(xmm6, 63);
- paddq(xmm0, xmm6);
- paddq(xmm0, xmm4);
- movl(Address(rsp,0), 15);
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_4_0_2);
- addsd(xmm0, xmm4);
- mulsd(xmm0, xmm3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_3_0_2);
- addsd(xmm0, xmm4);
- mulsd(xmm0, xmm3);
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32752);
- cmpl(ecx, 32752);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_7_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_2_0_2);
- paddd(xmm3, xmm6);
- addpd(xmm0, xmm2);
- mulsd(xmm0, xmm3);
- movl(Address(rsp,0), 15);
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_8_0_2);
- cmpl(eax, 2146435072);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_9_0_2);
- movl(eax, Address(rsp,12));
- cmpl(eax, INT_MIN);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_10_0_2);
- movsd(xmm0, ExternalAddress(XMAX)); // 0xffffffffUL, 0x7fefffffUL
- mulsd(xmm0, xmm0);
-
- bind(L_2TAG_PACKET_7_0_2);
- movl(Address(rsp,0), 14);
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_10_0_2);
- movsd(xmm0, ExternalAddress(XMIN)); // 0x00000000UL, 0x00100000UL
- mulsd(xmm0, xmm0);
- movl(Address(rsp,0), 15);
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_9_0_2);
- movl(edx, Address(rsp,8));
- cmpl(eax, 2146435072);
- jcc(Assembler::above, L_2TAG_PACKET_11_0_2);
- cmpl(edx, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_11_0_2);
- movl(eax, Address(rsp,12));
- cmpl(eax, 2146435072);
- jcc(Assembler::notEqual, L_2TAG_PACKET_12_0_2);
- movsd(xmm0, ExternalAddress(INF)); // 0x00000000UL, 0x7ff00000UL
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_12_0_2);
- movsd(xmm0, ExternalAddress(ZERO)); // 0x00000000UL, 0x00000000UL
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_11_0_2);
- movsd(xmm0, Address(rsp, 8));
- addsd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_0_0_2);
- movl(eax, Address(rsp, 12));
- andl(eax, 2147483647);
- cmpl(eax, 1083179008);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_8_0_2);
- movsd(Address(rsp, 8), xmm0);
- addsd(xmm0, ExternalAddress(ONE_val)); // 0x00000000UL, 0x3ff00000UL
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_6_0_2);
- movq(Address(rsp, 16), xmm0);
-
- bind(B1_3);
- movq(xmm0, Address(rsp, 16));
-
- bind(B1_5);
- addq(rsp, 24);
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - LOG()
-// ---------------------
-//
-// x=2^k * mx, mx in [1,2)
-//
-// Get B~1/mx based on the output of rcpss instruction (B0)
-// B = int((B0*2^7+0.5))/2^7
-//
-// Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
-//
-// Result: k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6) and
-// p(r) is a degree 7 polynomial
-// -log(B) read from data table (high, low parts)
-// Result is formed from high and low parts
-//
-// Special cases:
-// log(NaN) = quiet NaN, and raise invalid exception
-// log(+INF) = that INF
-// log(0) = -INF with divide-by-zero exception raised
-// log(1) = +0
-// log(x) = NaN with invalid exception raised if x < -0, including -INF
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _L_tbl[] =
-{
- 0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
- 0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
- 0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
- 0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
- 0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
- 0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
- 0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
- 0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
- 0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
- 0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
- 0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
- 0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
- 0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
- 0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
- 0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
- 0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
- 0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
- 0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
- 0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
- 0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
- 0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
- 0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
- 0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
- 0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
- 0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
- 0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
- 0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
- 0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
- 0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
- 0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
- 0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
- 0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
- 0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
- 0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
- 0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
- 0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
- 0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
- 0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
- 0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
- 0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
- 0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
- 0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
- 0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
- 0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
- 0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
- 0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
- 0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
- 0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
- 0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
- 0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
- 0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
- 0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
- 0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
- 0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
- 0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
- 0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
- 0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
- 0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
- 0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
- 0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
- 0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
- 0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
- 0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
- 0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
- 0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
- 0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
- 0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
- 0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
- 0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
- 0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
- 0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
- 0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
- 0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
- 0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
- 0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
- 0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
- 0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
- 0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
- 0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
- 0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
- 0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
- 0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
- 0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
- 0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
- 0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
- 0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
- 0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
- 0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
- 0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
- 0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
- 0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
- 0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
- 0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
- 0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
- 0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
- 0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
- 0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
- 0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
- 0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
- 0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
- 0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
- 0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
- 0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x80000000UL
-};
-
-ALIGNED_(16) juint _log2[] =
-{
- 0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL
-};
-
-ALIGNED_(16) juint _coeff[] =
-{
- 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
- 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
- 0x00000000UL, 0xbfe00000UL
-};
-
-//registers,
-// input: xmm0
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, r8, r11
-
-void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp1, Register tmp2) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2;
- Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
-
- assert_different_registers(tmp1, tmp2, eax, ecx, edx);
- jmp(start);
- address L_tbl = (address)_L_tbl;
- address log2 = (address)_log2;
- address coeff = (address)_coeff;
-
- bind(start);
- subq(rsp, 24);
- movsd(Address(rsp, 0), xmm0);
- mov64(rax, 0x3ff0000000000000);
- movdq(xmm2, rax);
- mov64(rdx, 0x77f0000000000000);
- movdq(xmm3, rdx);
- movl(ecx, 32768);
- movdl(xmm4, rcx);
- mov64(tmp1, 0xffffe00000000000);
- movdq(xmm5, tmp1);
- movdqu(xmm1, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- movl(ecx, 16352);
- psrlq(xmm0, 27);
- lea(tmp2, ExternalAddress(L_tbl));
- psrld(xmm0, 2);
- rcpps(xmm0, xmm0);
- psllq(xmm1, 12);
- pshufd(xmm6, xmm5, 228);
- psrlq(xmm1, 12);
- subl(eax, 16);
- cmpl(eax, 32736);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
-
- bind(L_2TAG_PACKET_1_0_2);
- paddd(xmm0, xmm4);
- por(xmm1, xmm3);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm1);
- pand(xmm0, xmm6);
- subsd(xmm1, xmm5);
- mulpd(xmm5, xmm0);
- andl(eax, 32752);
- subl(eax, ecx);
- cvtsi2sdl(xmm7, eax);
- mulsd(xmm1, xmm0);
- movq(xmm6, ExternalAddress(log2)); // 0xfefa3800UL, 0x3fa62e42UL
- movdqu(xmm3, ExternalAddress(coeff)); // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
- subsd(xmm5, xmm2);
- andl(edx, 16711680);
- shrl(edx, 12);
- movdqu(xmm0, Address(tmp2, edx));
- movdqu(xmm4, ExternalAddress(16 + coeff)); // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
- addsd(xmm1, xmm5);
- movdqu(xmm2, ExternalAddress(32 + coeff)); // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
- mulsd(xmm6, xmm7);
- if (VM_Version::supports_sse3()) {
- movddup(xmm5, xmm1);
- } else {
- movdqu(xmm5, xmm1);
- movlhps(xmm5, xmm5);
- }
- mulsd(xmm7, ExternalAddress(8 + log2)); // 0x93c76730UL, 0x3ceef357UL
- mulsd(xmm3, xmm1);
- addsd(xmm0, xmm6);
- mulpd(xmm4, xmm5);
- mulpd(xmm5, xmm5);
- if (VM_Version::supports_sse3()) {
- movddup(xmm6, xmm0);
- } else {
- movdqu(xmm6, xmm0);
- movlhps(xmm6, xmm6);
- }
- addsd(xmm0, xmm1);
- addpd(xmm4, xmm2);
- mulpd(xmm3, xmm5);
- subsd(xmm6, xmm0);
- mulsd(xmm4, xmm1);
- pshufd(xmm2, xmm0, 238);
- addsd(xmm1, xmm6);
- mulsd(xmm5, xmm5);
- addsd(xmm7, xmm2);
- addpd(xmm4, xmm3);
- addsd(xmm1, xmm7);
- mulpd(xmm4, xmm5);
- addsd(xmm1, xmm4);
- pshufd(xmm5, xmm4, 238);
- addsd(xmm1, xmm5);
- addsd(xmm0, xmm1);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_0_0_2);
- movq(xmm0, Address(rsp, 0));
- movq(xmm1, Address(rsp, 0));
- addl(eax, 16);
- cmpl(eax, 32768);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_2_0_2);
- cmpl(eax, 16);
- jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
-
- bind(L_2TAG_PACKET_4_0_2);
- addsd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_5_0_2);
- jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
- cmpl(edx, 0);
- jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
- jmp(L_2TAG_PACKET_6_0_2);
-
- bind(L_2TAG_PACKET_3_0_2);
- xorpd(xmm1, xmm1);
- addsd(xmm1, xmm0);
- movdl(edx, xmm1);
- psrlq(xmm1, 32);
- movdl(ecx, xmm1);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
- xorpd(xmm1, xmm1);
- movl(eax, 18416);
- pinsrw(xmm1, eax, 3);
- mulsd(xmm0, xmm1);
- movdqu(xmm1, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- psrlq(xmm0, 27);
- movl(ecx, 18416);
- psrld(xmm0, 2);
- rcpps(xmm0, xmm0);
- psllq(xmm1, 12);
- pshufd(xmm6, xmm5, 228);
- psrlq(xmm1, 12);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movdl(edx, xmm1);
- psrlq(xmm1, 32);
- movdl(ecx, xmm1);
- addl(ecx, ecx);
- cmpl(ecx, -2097152);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
-
- bind(L_2TAG_PACKET_6_0_2);
- xorpd(xmm1, xmm1);
- xorpd(xmm0, xmm0);
- movl(eax, 32752);
- pinsrw(xmm1, eax, 3);
- mulsd(xmm0, xmm1);
- movl(Address(rsp, 16), 3);
- jmp(L_2TAG_PACKET_8_0_2);
- bind(L_2TAG_PACKET_7_0_2);
- xorpd(xmm1, xmm1);
- xorpd(xmm0, xmm0);
- movl(eax, 49136);
- pinsrw(xmm0, eax, 3);
- divsd(xmm0, xmm1);
- movl(Address(rsp, 16), 2);
-
- bind(L_2TAG_PACKET_8_0_2);
- movq(Address(rsp, 8), xmm0);
-
- bind(B1_3);
- movq(xmm0, Address(rsp, 8));
-
- bind(B1_5);
- addq(rsp, 24);
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - POW()
-// ---------------------
-//
-// Let x=2^k * mx, mx in [1,2)
-//
-// log2(x) calculation:
-//
-// 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 short approximation for log2(e)
-//
-// Reduced argument, scaled by LH:
-// r=B*mx-LH (computed accurately in high and low parts)
-//
-// log2(x) result: k - log2(B) + p(r)
-// p(r) is a degree 8 polynomial
-// -log2(B) read from data table (high, low parts)
-// log2(x) is formed from high and low parts
-// For |x| in [1-1/32, 1+1/16), a slower but more accurate computation
-// based om the same table design is performed.
-//
-// Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8,
-// to filter out all potential OF/UF cases.
-// exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5
-// polynomial
-//
-// Special cases:
-// pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd
-// integer < 0.
-// pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and
-// not an odd integer.
-// pow(-0,y) = -0 for y an odd integer > 0.
-// pow(-0,y) = +0 for y > 0 and not an odd integer.
-// pow(-1,-INF) = NaN.
-// pow(+1,y) = NaN for any y, even a NaN.
-// pow(x,-0) = 1 for any x, even a NaN.
-// pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and
-// finite non-integer y.
-// pow(x,-INF) = +INF for |x|<1.
-// pow(x,-INF) = +0 for |x|>1.
-// pow(x,+INF) = +0 for |x|<1.
-// pow(x,+INF) = +INF for |x|>1.
-// pow(-INF,y) = -0 for y an odd integer < 0.
-// pow(-INF,y) = +0 for y < 0 and not an odd integer.
-// pow(-INF,y) = -INF for y an odd integer > 0.
-// pow(-INF,y) = +INF for y > 0 and not an odd integer.
-// pow(+INF,y) = +0 for y <0.
-// pow(+INF,y) = +INF for y >0.
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _HIGHSIGMASK[] =
-{
- 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
-};
-
-ALIGNED_(16) juint _LOG2_E[] =
-{
- 0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
-};
-
-ALIGNED_(16) juint _HIGHMASK_Y[] =
-{
- 0x00000000UL, 0xfffffff8UL, 0x00000000UL, 0xffffffffUL
-};
-
-ALIGNED_(16) juint _T_exp[] =
-{
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3b700000UL, 0xfa5abcbfUL,
- 0x3ff00b1aUL, 0xa7609f71UL, 0xbc84f6b2UL, 0xa9fb3335UL, 0x3ff0163dUL,
- 0x9ab8cdb7UL, 0x3c9b6129UL, 0x143b0281UL, 0x3ff02168UL, 0x0fc54eb6UL,
- 0xbc82bf31UL, 0x3e778061UL, 0x3ff02c9aUL, 0x535b085dUL, 0xbc719083UL,
- 0x2e11bbccUL, 0x3ff037d4UL, 0xeeade11aUL, 0x3c656811UL, 0xe86e7f85UL,
- 0x3ff04315UL, 0x1977c96eUL, 0xbc90a31cUL, 0x72f654b1UL, 0x3ff04e5fUL,
- 0x3aa0d08cUL, 0x3c84c379UL, 0xd3158574UL, 0x3ff059b0UL, 0xa475b465UL,
- 0x3c8d73e2UL, 0x0e3c1f89UL, 0x3ff0650aUL, 0x5799c397UL, 0xbc95cb7bUL,
- 0x29ddf6deUL, 0x3ff0706bUL, 0xe2b13c27UL, 0xbc8c91dfUL, 0x2b72a836UL,
- 0x3ff07bd4UL, 0x54458700UL, 0x3c832334UL, 0x18759bc8UL, 0x3ff08745UL,
- 0x4bb284ffUL, 0x3c6186beUL, 0xf66607e0UL, 0x3ff092bdUL, 0x800a3fd1UL,
- 0xbc968063UL, 0xcac6f383UL, 0x3ff09e3eUL, 0x18316136UL, 0x3c914878UL,
- 0x9b1f3919UL, 0x3ff0a9c7UL, 0x873d1d38UL, 0x3c85d16cUL, 0x6cf9890fUL,
- 0x3ff0b558UL, 0x4adc610bUL, 0x3c98a62eUL, 0x45e46c85UL, 0x3ff0c0f1UL,
- 0x06d21cefUL, 0x3c94f989UL, 0x2b7247f7UL, 0x3ff0cc92UL, 0x16e24f71UL,
- 0x3c901edcUL, 0x23395decUL, 0x3ff0d83bUL, 0xe43f316aUL, 0xbc9bc14dUL,
- 0x32d3d1a2UL, 0x3ff0e3ecUL, 0x27c57b52UL, 0x3c403a17UL, 0x5fdfa9c5UL,
- 0x3ff0efa5UL, 0xbc54021bUL, 0xbc949db9UL, 0xaffed31bUL, 0x3ff0fb66UL,
- 0xc44ebd7bUL, 0xbc6b9bedUL, 0x28d7233eUL, 0x3ff10730UL, 0x1692fdd5UL,
- 0x3c8d46ebUL, 0xd0125b51UL, 0x3ff11301UL, 0x39449b3aUL, 0xbc96c510UL,
- 0xab5e2ab6UL, 0x3ff11edbUL, 0xf703fb72UL, 0xbc9ca454UL, 0xc06c31ccUL,
- 0x3ff12abdUL, 0xb36ca5c7UL, 0xbc51b514UL, 0x14f204abUL, 0x3ff136a8UL,
- 0xba48dcf0UL, 0xbc67108fUL, 0xaea92de0UL, 0x3ff1429aUL, 0x9af1369eUL,
- 0xbc932fbfUL, 0x934f312eUL, 0x3ff14e95UL, 0x39bf44abUL, 0xbc8b91e8UL,
- 0xc8a58e51UL, 0x3ff15a98UL, 0xb9eeab0aUL, 0x3c82406aUL, 0x5471c3c2UL,
- 0x3ff166a4UL, 0x82ea1a32UL, 0x3c58f23bUL, 0x3c7d517bUL, 0x3ff172b8UL,
- 0xb9d78a76UL, 0xbc819041UL, 0x8695bbc0UL, 0x3ff17ed4UL, 0xe2ac5a64UL,
- 0x3c709e3fUL, 0x388c8deaUL, 0x3ff18af9UL, 0xd1970f6cUL, 0xbc911023UL,
- 0x58375d2fUL, 0x3ff19726UL, 0x85f17e08UL, 0x3c94aaddUL, 0xeb6fcb75UL,
- 0x3ff1a35bUL, 0x7b4968e4UL, 0x3c8e5b4cUL, 0xf8138a1cUL, 0x3ff1af99UL,
- 0xa4b69280UL, 0x3c97bf85UL, 0x84045cd4UL, 0x3ff1bbe0UL, 0x352ef607UL,
- 0xbc995386UL, 0x95281c6bUL, 0x3ff1c82fUL, 0x8010f8c9UL, 0x3c900977UL,
- 0x3168b9aaUL, 0x3ff1d487UL, 0x00a2643cUL, 0x3c9e016eUL, 0x5eb44027UL,
- 0x3ff1e0e7UL, 0x088cb6deUL, 0xbc96fdd8UL, 0x22fcd91dUL, 0x3ff1ed50UL,
- 0x027bb78cUL, 0xbc91df98UL, 0x8438ce4dUL, 0x3ff1f9c1UL, 0xa097af5cUL,
- 0xbc9bf524UL, 0x88628cd6UL, 0x3ff2063bUL, 0x814a8495UL, 0x3c8dc775UL,
- 0x3578a819UL, 0x3ff212beUL, 0x2cfcaac9UL, 0x3c93592dUL, 0x917ddc96UL,
- 0x3ff21f49UL, 0x9494a5eeUL, 0x3c82a97eUL, 0xa27912d1UL, 0x3ff22bddUL,
- 0x5577d69fUL, 0x3c8d34fbUL, 0x6e756238UL, 0x3ff2387aUL, 0xb6c70573UL,
- 0x3c99b07eUL, 0xfb82140aUL, 0x3ff2451fUL, 0x911ca996UL, 0x3c8acfccUL,
- 0x4fb2a63fUL, 0x3ff251ceUL, 0xbef4f4a4UL, 0x3c8ac155UL, 0x711ece75UL,
- 0x3ff25e85UL, 0x4ac31b2cUL, 0x3c93e1a2UL, 0x65e27cddUL, 0x3ff26b45UL,
- 0x9940e9d9UL, 0x3c82bd33UL, 0x341ddf29UL, 0x3ff2780eUL, 0x05f9e76cUL,
- 0x3c9e067cUL, 0xe1f56381UL, 0x3ff284dfUL, 0x8c3f0d7eUL, 0xbc9a4c3aUL,
- 0x7591bb70UL, 0x3ff291baUL, 0x28401cbdUL, 0xbc82cc72UL, 0xf51fdee1UL,
- 0x3ff29e9dUL, 0xafad1255UL, 0x3c8612e8UL, 0x66d10f13UL, 0x3ff2ab8aUL,
- 0x191690a7UL, 0xbc995743UL, 0xd0dad990UL, 0x3ff2b87fUL, 0xd6381aa4UL,
- 0xbc410adcUL, 0x39771b2fUL, 0x3ff2c57eUL, 0xa6eb5124UL, 0xbc950145UL,
- 0xa6e4030bUL, 0x3ff2d285UL, 0x54db41d5UL, 0x3c900247UL, 0x1f641589UL,
- 0x3ff2df96UL, 0xfbbce198UL, 0x3c9d16cfUL, 0xa93e2f56UL, 0x3ff2ecafUL,
- 0x45d52383UL, 0x3c71ca0fUL, 0x4abd886bUL, 0x3ff2f9d2UL, 0x532bda93UL,
- 0xbc653c55UL, 0x0a31b715UL, 0x3ff306feUL, 0xd23182e4UL, 0x3c86f46aUL,
- 0xedeeb2fdUL, 0x3ff31432UL, 0xf3f3fcd1UL, 0x3c8959a3UL, 0xfc4cd831UL,
- 0x3ff32170UL, 0x8e18047cUL, 0x3c8a9ce7UL, 0x3ba8ea32UL, 0x3ff32eb8UL,
- 0x3cb4f318UL, 0xbc9c45e8UL, 0xb26416ffUL, 0x3ff33c08UL, 0x843659a6UL,
- 0x3c932721UL, 0x66e3fa2dUL, 0x3ff34962UL, 0x930881a4UL, 0xbc835a75UL,
- 0x5f929ff1UL, 0x3ff356c5UL, 0x5c4e4628UL, 0xbc8b5ceeUL, 0xa2de883bUL,
- 0x3ff36431UL, 0xa06cb85eUL, 0xbc8c3144UL, 0x373aa9cbUL, 0x3ff371a7UL,
- 0xbf42eae2UL, 0xbc963aeaUL, 0x231e754aUL, 0x3ff37f26UL, 0x9eceb23cUL,
- 0xbc99f5caUL, 0x6d05d866UL, 0x3ff38caeUL, 0x3c9904bdUL, 0xbc9e958dUL,
- 0x1b7140efUL, 0x3ff39a40UL, 0xfc8e2934UL, 0xbc99a9a5UL, 0x34e59ff7UL,
- 0x3ff3a7dbUL, 0xd661f5e3UL, 0xbc75e436UL, 0xbfec6cf4UL, 0x3ff3b57fUL,
- 0xe26fff18UL, 0x3c954c66UL, 0xc313a8e5UL, 0x3ff3c32dUL, 0x375d29c3UL,
- 0xbc9efff8UL, 0x44ede173UL, 0x3ff3d0e5UL, 0x8c284c71UL, 0x3c7fe8d0UL,
- 0x4c123422UL, 0x3ff3dea6UL, 0x11f09ebcUL, 0x3c8ada09UL, 0xdf1c5175UL,
- 0x3ff3ec70UL, 0x7b8c9bcaUL, 0xbc8af663UL, 0x04ac801cUL, 0x3ff3fa45UL,
- 0xf956f9f3UL, 0xbc97d023UL, 0xc367a024UL, 0x3ff40822UL, 0xb6f4d048UL,
- 0x3c8bddf8UL, 0x21f72e2aUL, 0x3ff4160aUL, 0x1c309278UL, 0xbc5ef369UL,
- 0x2709468aUL, 0x3ff423fbUL, 0xc0b314ddUL, 0xbc98462dUL, 0xd950a897UL,
- 0x3ff431f5UL, 0xe35f7999UL, 0xbc81c7ddUL, 0x3f84b9d4UL, 0x3ff43ffaUL,
- 0x9704c003UL, 0x3c8880beUL, 0x6061892dUL, 0x3ff44e08UL, 0x04ef80d0UL,
- 0x3c489b7aUL, 0x42a7d232UL, 0x3ff45c20UL, 0x82fb1f8eUL, 0xbc686419UL,
- 0xed1d0057UL, 0x3ff46a41UL, 0xd1648a76UL, 0x3c9c944bUL, 0x668b3237UL,
- 0x3ff4786dUL, 0xed445733UL, 0xbc9c20f0UL, 0xb5c13cd0UL, 0x3ff486a2UL,
- 0xb69062f0UL, 0x3c73c1a3UL, 0xe192aed2UL, 0x3ff494e1UL, 0x5e499ea0UL,
- 0xbc83b289UL, 0xf0d7d3deUL, 0x3ff4a32aUL, 0xf3d1be56UL, 0x3c99cb62UL,
- 0xea6db7d7UL, 0x3ff4b17dUL, 0x7f2897f0UL, 0xbc8125b8UL, 0xd5362a27UL,
- 0x3ff4bfdaUL, 0xafec42e2UL, 0x3c7d4397UL, 0xb817c114UL, 0x3ff4ce41UL,
- 0x690abd5dUL, 0x3c905e29UL, 0x99fddd0dUL, 0x3ff4dcb2UL, 0xbc6a7833UL,
- 0x3c98ecdbUL, 0x81d8abffUL, 0x3ff4eb2dUL, 0x2e5d7a52UL, 0xbc95257dUL,
- 0x769d2ca7UL, 0x3ff4f9b2UL, 0xd25957e3UL, 0xbc94b309UL, 0x7f4531eeUL,
- 0x3ff50841UL, 0x49b7465fUL, 0x3c7a249bUL, 0xa2cf6642UL, 0x3ff516daUL,
- 0x69bd93efUL, 0xbc8f7685UL, 0xe83f4eefUL, 0x3ff5257dUL, 0x43efef71UL,
- 0xbc7c998dUL, 0x569d4f82UL, 0x3ff5342bUL, 0x1db13cadUL, 0xbc807abeUL,
- 0xf4f6ad27UL, 0x3ff542e2UL, 0x192d5f7eUL, 0x3c87926dUL, 0xca5d920fUL,
- 0x3ff551a4UL, 0xefede59bUL, 0xbc8d689cUL, 0xdde910d2UL, 0x3ff56070UL,
- 0x168eebf0UL, 0xbc90fb6eUL, 0x36b527daUL, 0x3ff56f47UL, 0x011d93adUL,
- 0x3c99bb2cUL, 0xdbe2c4cfUL, 0x3ff57e27UL, 0x8a57b9c4UL, 0xbc90b98cUL,
- 0xd497c7fdUL, 0x3ff58d12UL, 0x5b9a1de8UL, 0x3c8295e1UL, 0x27ff07ccUL,
- 0x3ff59c08UL, 0xe467e60fUL, 0xbc97e2ceUL, 0xdd485429UL, 0x3ff5ab07UL,
- 0x054647adUL, 0x3c96324cUL, 0xfba87a03UL, 0x3ff5ba11UL, 0x4c233e1aUL,
- 0xbc9b77a1UL, 0x8a5946b7UL, 0x3ff5c926UL, 0x816986a2UL, 0x3c3c4b1bUL,
- 0x90998b93UL, 0x3ff5d845UL, 0xa8b45643UL, 0xbc9cd6a7UL, 0x15ad2148UL,
- 0x3ff5e76fUL, 0x3080e65eUL, 0x3c9ba6f9UL, 0x20dceb71UL, 0x3ff5f6a3UL,
- 0xe3cdcf92UL, 0xbc89eaddUL, 0xb976dc09UL, 0x3ff605e1UL, 0x9b56de47UL,
- 0xbc93e242UL, 0xe6cdf6f4UL, 0x3ff6152aUL, 0x4ab84c27UL, 0x3c9e4b3eUL,
- 0xb03a5585UL, 0x3ff6247eUL, 0x7e40b497UL, 0xbc9383c1UL, 0x1d1929fdUL,
- 0x3ff633ddUL, 0xbeb964e5UL, 0x3c984710UL, 0x34ccc320UL, 0x3ff64346UL,
- 0x759d8933UL, 0xbc8c483cUL, 0xfebc8fb7UL, 0x3ff652b9UL, 0xc9a73e09UL,
- 0xbc9ae3d5UL, 0x82552225UL, 0x3ff66238UL, 0x87591c34UL, 0xbc9bb609UL,
- 0xc70833f6UL, 0x3ff671c1UL, 0x586c6134UL, 0xbc8e8732UL, 0xd44ca973UL,
- 0x3ff68155UL, 0x44f73e65UL, 0x3c6038aeUL, 0xb19e9538UL, 0x3ff690f4UL,
- 0x9aeb445dUL, 0x3c8804bdUL, 0x667f3bcdUL, 0x3ff6a09eUL, 0x13b26456UL,
- 0xbc9bdd34UL, 0xfa75173eUL, 0x3ff6b052UL, 0x2c9a9d0eUL, 0x3c7a38f5UL,
- 0x750bdabfUL, 0x3ff6c012UL, 0x67ff0b0dUL, 0xbc728956UL, 0xddd47645UL,
- 0x3ff6cfdcUL, 0xb6f17309UL, 0x3c9c7aa9UL, 0x3c651a2fUL, 0x3ff6dfb2UL,
- 0x683c88abUL, 0xbc6bbe3aUL, 0x98593ae5UL, 0x3ff6ef92UL, 0x9e1ac8b2UL,
- 0xbc90b974UL, 0xf9519484UL, 0x3ff6ff7dUL, 0x25860ef6UL, 0xbc883c0fUL,
- 0x66f42e87UL, 0x3ff70f74UL, 0xd45aa65fUL, 0x3c59d644UL, 0xe8ec5f74UL,
- 0x3ff71f75UL, 0x86887a99UL, 0xbc816e47UL, 0x86ead08aUL, 0x3ff72f82UL,
- 0x2cd62c72UL, 0xbc920aa0UL, 0x48a58174UL, 0x3ff73f9aUL, 0x6c65d53cUL,
- 0xbc90a8d9UL, 0x35d7cbfdUL, 0x3ff74fbdUL, 0x618a6e1cUL, 0x3c9047fdUL,
- 0x564267c9UL, 0x3ff75febUL, 0x57316dd3UL, 0xbc902459UL, 0xb1ab6e09UL,
- 0x3ff77024UL, 0x169147f8UL, 0x3c9b7877UL, 0x4fde5d3fUL, 0x3ff78069UL,
- 0x0a02162dUL, 0x3c9866b8UL, 0x38ac1cf6UL, 0x3ff790b9UL, 0x62aadd3eUL,
- 0x3c9349a8UL, 0x73eb0187UL, 0x3ff7a114UL, 0xee04992fUL, 0xbc841577UL,
- 0x0976cfdbUL, 0x3ff7b17bUL, 0x8468dc88UL, 0xbc9bebb5UL, 0x0130c132UL,
- 0x3ff7c1edUL, 0xd1164dd6UL, 0x3c9f124cUL, 0x62ff86f0UL, 0x3ff7d26aUL,
- 0xfb72b8b4UL, 0x3c91bddbUL, 0x36cf4e62UL, 0x3ff7e2f3UL, 0xba15797eUL,
- 0x3c705d02UL, 0x8491c491UL, 0x3ff7f387UL, 0xcf9311aeUL, 0xbc807f11UL,
- 0x543e1a12UL, 0x3ff80427UL, 0x626d972bUL, 0xbc927c86UL, 0xadd106d9UL,
- 0x3ff814d2UL, 0x0d151d4dUL, 0x3c946437UL, 0x994cce13UL, 0x3ff82589UL,
- 0xd41532d8UL, 0xbc9d4c1dUL, 0x1eb941f7UL, 0x3ff8364cUL, 0x31df2bd5UL,
- 0x3c999b9aUL, 0x4623c7adUL, 0x3ff8471aUL, 0xa341cdfbUL, 0xbc88d684UL,
- 0x179f5b21UL, 0x3ff857f4UL, 0xf8b216d0UL, 0xbc5ba748UL, 0x9b4492edUL,
- 0x3ff868d9UL, 0x9bd4f6baUL, 0xbc9fc6f8UL, 0xd931a436UL, 0x3ff879caUL,
- 0xd2db47bdUL, 0x3c85d2d7UL, 0xd98a6699UL, 0x3ff88ac7UL, 0xf37cb53aUL,
- 0x3c9994c2UL, 0xa478580fUL, 0x3ff89bd0UL, 0x4475202aUL, 0x3c9d5395UL,
- 0x422aa0dbUL, 0x3ff8ace5UL, 0x56864b27UL, 0x3c96e9f1UL, 0xbad61778UL,
- 0x3ff8be05UL, 0xfc43446eUL, 0x3c9ecb5eUL, 0x16b5448cUL, 0x3ff8cf32UL,
- 0x32e9e3aaUL, 0xbc70d55eUL, 0x5e0866d9UL, 0x3ff8e06aUL, 0x6fc9b2e6UL,
- 0xbc97114aUL, 0x99157736UL, 0x3ff8f1aeUL, 0xa2e3976cUL, 0x3c85cc13UL,
- 0xd0282c8aUL, 0x3ff902feUL, 0x85fe3fd2UL, 0x3c9592caUL, 0x0b91ffc6UL,
- 0x3ff9145bUL, 0x2e582524UL, 0xbc9dd679UL, 0x53aa2fe2UL, 0x3ff925c3UL,
- 0xa639db7fUL, 0xbc83455fUL, 0xb0cdc5e5UL, 0x3ff93737UL, 0x81b57ebcUL,
- 0xbc675fc7UL, 0x2b5f98e5UL, 0x3ff948b8UL, 0x797d2d99UL, 0xbc8dc3d6UL,
- 0xcbc8520fUL, 0x3ff95a44UL, 0x96a5f039UL, 0xbc764b7cUL, 0x9a7670b3UL,
- 0x3ff96bddUL, 0x7f19c896UL, 0xbc5ba596UL, 0x9fde4e50UL, 0x3ff97d82UL,
- 0x7c1b85d1UL, 0xbc9d185bUL, 0xe47a22a2UL, 0x3ff98f33UL, 0xa24c78ecUL,
- 0x3c7cabdaUL, 0x70ca07baUL, 0x3ff9a0f1UL, 0x91cee632UL, 0xbc9173bdUL,
- 0x4d53fe0dUL, 0x3ff9b2bbUL, 0x4df6d518UL, 0xbc9dd84eUL, 0x82a3f090UL,
- 0x3ff9c491UL, 0xb071f2beUL, 0x3c7c7c46UL, 0x194bb8d5UL, 0x3ff9d674UL,
- 0xa3dd8233UL, 0xbc9516beUL, 0x19e32323UL, 0x3ff9e863UL, 0x78e64c6eUL,
- 0x3c7824caUL, 0x8d07f29eUL, 0x3ff9fa5eUL, 0xaaf1faceUL, 0xbc84a9ceUL,
- 0x7b5de565UL, 0x3ffa0c66UL, 0x5d1cd533UL, 0xbc935949UL, 0xed8eb8bbUL,
- 0x3ffa1e7aUL, 0xee8be70eUL, 0x3c9c6618UL, 0xec4a2d33UL, 0x3ffa309bUL,
- 0x7ddc36abUL, 0x3c96305cUL, 0x80460ad8UL, 0x3ffa42c9UL, 0x589fb120UL,
- 0xbc9aa780UL, 0xb23e255dUL, 0x3ffa5503UL, 0xdb8d41e1UL, 0xbc9d2f6eUL,
- 0x8af46052UL, 0x3ffa674aUL, 0x30670366UL, 0x3c650f56UL, 0x1330b358UL,
- 0x3ffa799eUL, 0xcac563c7UL, 0x3c9bcb7eUL, 0x53c12e59UL, 0x3ffa8bfeUL,
- 0xb2ba15a9UL, 0xbc94f867UL, 0x5579fdbfUL, 0x3ffa9e6bUL, 0x0ef7fd31UL,
- 0x3c90fac9UL, 0x21356ebaUL, 0x3ffab0e5UL, 0xdae94545UL, 0x3c889c31UL,
- 0xbfd3f37aUL, 0x3ffac36bUL, 0xcae76cd0UL, 0xbc8f9234UL, 0x3a3c2774UL,
- 0x3ffad5ffUL, 0xb6b1b8e5UL, 0x3c97ef3bUL, 0x995ad3adUL, 0x3ffae89fUL,
- 0x345dcc81UL, 0x3c97a1cdUL, 0xe622f2ffUL, 0x3ffafb4cUL, 0x0f315ecdUL,
- 0xbc94b2fcUL, 0x298db666UL, 0x3ffb0e07UL, 0x4c80e425UL, 0xbc9bdef5UL,
- 0x6c9a8952UL, 0x3ffb20ceUL, 0x4a0756ccUL, 0x3c94dd02UL, 0xb84f15fbUL,
- 0x3ffb33a2UL, 0x3084d708UL, 0xbc62805eUL, 0x15b749b1UL, 0x3ffb4684UL,
- 0xe9df7c90UL, 0xbc7f763dUL, 0x8de5593aUL, 0x3ffb5972UL, 0xbbba6de3UL,
- 0xbc9c71dfUL, 0x29f1c52aUL, 0x3ffb6c6eUL, 0x52883f6eUL, 0x3c92a8f3UL,
- 0xf2fb5e47UL, 0x3ffb7f76UL, 0x7e54ac3bUL, 0xbc75584fUL, 0xf22749e4UL,
- 0x3ffb928cUL, 0x54cb65c6UL, 0xbc9b7216UL, 0x30a1064aUL, 0x3ffba5b0UL,
- 0x0e54292eUL, 0xbc9efcd3UL, 0xb79a6f1fUL, 0x3ffbb8e0UL, 0xc9696205UL,
- 0xbc3f52d1UL, 0x904bc1d2UL, 0x3ffbcc1eUL, 0x7a2d9e84UL, 0x3c823dd0UL,
- 0xc3f3a207UL, 0x3ffbdf69UL, 0x60ea5b53UL, 0xbc3c2623UL, 0x5bd71e09UL,
- 0x3ffbf2c2UL, 0x3f6b9c73UL, 0xbc9efdcaUL, 0x6141b33dUL, 0x3ffc0628UL,
- 0xa1fbca34UL, 0xbc8d8a5aUL, 0xdd85529cUL, 0x3ffc199bUL, 0x895048ddUL,
- 0x3c811065UL, 0xd9fa652cUL, 0x3ffc2d1cUL, 0x17c8a5d7UL, 0xbc96e516UL,
- 0x5fffd07aUL, 0x3ffc40abUL, 0xe083c60aUL, 0x3c9b4537UL, 0x78fafb22UL,
- 0x3ffc5447UL, 0x2493b5afUL, 0x3c912f07UL, 0x2e57d14bUL, 0x3ffc67f1UL,
- 0xff483cadUL, 0x3c92884dUL, 0x8988c933UL, 0x3ffc7ba8UL, 0xbe255559UL,
- 0xbc8e76bbUL, 0x9406e7b5UL, 0x3ffc8f6dUL, 0x48805c44UL, 0x3c71acbcUL,
- 0x5751c4dbUL, 0x3ffca340UL, 0xd10d08f5UL, 0xbc87f2beUL, 0xdcef9069UL,
- 0x3ffcb720UL, 0xd1e949dbUL, 0x3c7503cbUL, 0x2e6d1675UL, 0x3ffccb0fUL,
- 0x86009092UL, 0xbc7d220fUL, 0x555dc3faUL, 0x3ffcdf0bUL, 0x53829d72UL,
- 0xbc8dd83bUL, 0x5b5bab74UL, 0x3ffcf315UL, 0xb86dff57UL, 0xbc9a08e9UL,
- 0x4a07897cUL, 0x3ffd072dUL, 0x43797a9cUL, 0xbc9cbc37UL, 0x2b08c968UL,
- 0x3ffd1b53UL, 0x219a36eeUL, 0x3c955636UL, 0x080d89f2UL, 0x3ffd2f87UL,
- 0x719d8578UL, 0xbc9d487bUL, 0xeacaa1d6UL, 0x3ffd43c8UL, 0xbf5a1614UL,
- 0x3c93db53UL, 0xdcfba487UL, 0x3ffd5818UL, 0xd75b3707UL, 0x3c82ed02UL,
- 0xe862e6d3UL, 0x3ffd6c76UL, 0x4a8165a0UL, 0x3c5fe87aUL, 0x16c98398UL,
- 0x3ffd80e3UL, 0x8beddfe8UL, 0xbc911ec1UL, 0x71ff6075UL, 0x3ffd955dUL,
- 0xbb9af6beUL, 0x3c9a052dUL, 0x03db3285UL, 0x3ffda9e6UL, 0x696db532UL,
- 0x3c9c2300UL, 0xd63a8315UL, 0x3ffdbe7cUL, 0x926b8be4UL, 0xbc9b76f1UL,
- 0xf301b460UL, 0x3ffdd321UL, 0x78f018c3UL, 0x3c92da57UL, 0x641c0658UL,
- 0x3ffde7d5UL, 0x8e79ba8fUL, 0xbc9ca552UL, 0x337b9b5fUL, 0x3ffdfc97UL,
- 0x4f184b5cUL, 0xbc91a5cdUL, 0x6b197d17UL, 0x3ffe1167UL, 0xbd5c7f44UL,
- 0xbc72b529UL, 0x14f5a129UL, 0x3ffe2646UL, 0x817a1496UL, 0xbc97b627UL,
- 0x3b16ee12UL, 0x3ffe3b33UL, 0x31fdc68bUL, 0xbc99f4a4UL, 0xe78b3ff6UL,
- 0x3ffe502eUL, 0x80a9cc8fUL, 0x3c839e89UL, 0x24676d76UL, 0x3ffe6539UL,
- 0x7522b735UL, 0xbc863ff8UL, 0xfbc74c83UL, 0x3ffe7a51UL, 0xca0c8de2UL,
- 0x3c92d522UL, 0x77cdb740UL, 0x3ffe8f79UL, 0x80b054b1UL, 0xbc910894UL,
- 0xa2a490daUL, 0x3ffea4afUL, 0x179c2893UL, 0xbc9e9c23UL, 0x867cca6eUL,
- 0x3ffeb9f4UL, 0x2293e4f2UL, 0x3c94832fUL, 0x2d8e67f1UL, 0x3ffecf48UL,
- 0xb411ad8cUL, 0xbc9c93f3UL, 0xa2188510UL, 0x3ffee4aaUL, 0xa487568dUL,
- 0x3c91c68dUL, 0xee615a27UL, 0x3ffefa1bUL, 0x86a4b6b0UL, 0x3c9dc7f4UL,
- 0x1cb6412aUL, 0x3fff0f9cUL, 0x65181d45UL, 0xbc932200UL, 0x376bba97UL,
- 0x3fff252bUL, 0xbf0d8e43UL, 0x3c93a1a5UL, 0x48dd7274UL, 0x3fff3ac9UL,
- 0x3ed837deUL, 0xbc795a5aUL, 0x5b6e4540UL, 0x3fff5076UL, 0x2dd8a18bUL,
- 0x3c99d3e1UL, 0x798844f8UL, 0x3fff6632UL, 0x3539343eUL, 0x3c9fa37bUL,
- 0xad9cbe14UL, 0x3fff7bfdUL, 0xd006350aUL, 0xbc9dbb12UL, 0x02243c89UL,
- 0x3fff91d8UL, 0xa779f689UL, 0xbc612ea8UL, 0x819e90d8UL, 0x3fffa7c1UL,
- 0xf3a5931eUL, 0x3c874853UL, 0x3692d514UL, 0x3fffbdbaUL, 0x15098eb6UL,
- 0xbc796773UL, 0x2b8f71f1UL, 0x3fffd3c2UL, 0x966579e7UL, 0x3c62eb74UL,
- 0x6b2a23d9UL, 0x3fffe9d9UL, 0x7442fde3UL, 0x3c74a603UL
-};
-
-ALIGNED_(16) juint _e_coeff[] =
-{
- 0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL, 0x6fba4e77UL,
- 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL, 0xfefa39efUL, 0x3fe62e42UL,
- 0x00000000UL, 0x00000000UL
-};
-
-ALIGNED_(16) juint _coeff_h[] =
-{
- 0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
-};
-
-ALIGNED_(16) juint _HIGHMASK_LOG_X[] =
-{
- 0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xfffff800UL
-};
-
-ALIGNED_(8) juint _HALFMASK[] =
-{
- 0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL
-};
-
-ALIGNED_(16) juint _coeff_pow[] =
-{
- 0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL, 0x9f95985aUL,
- 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL, 0x518775e3UL, 0x3f9004f2UL,
- 0xac8349bbUL, 0x3fa76c9bUL, 0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL,
- 0xbf5dabe1UL, 0x9f95985aUL, 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL,
- 0x486ececbUL, 0x3fc4635eUL, 0x412055ccUL, 0xbdd61bb2UL
-};
-
-ALIGNED_(16) juint _L_tbl_pow[] =
-{
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x20000000UL,
- 0x3feff00aUL, 0x96621f95UL, 0x3e5b1856UL, 0xe0000000UL, 0x3fefe019UL,
- 0xe5916f9eUL, 0xbe325278UL, 0x00000000UL, 0x3fefd02fUL, 0x859a1062UL,
- 0x3e595fb7UL, 0xc0000000UL, 0x3fefc049UL, 0xb245f18fUL, 0xbe529c38UL,
- 0xe0000000UL, 0x3fefb069UL, 0xad2880a7UL, 0xbe501230UL, 0x60000000UL,
- 0x3fefa08fUL, 0xc8e72420UL, 0x3e597bd1UL, 0x80000000UL, 0x3fef90baUL,
- 0xc30c4500UL, 0xbe5d6c75UL, 0xe0000000UL, 0x3fef80eaUL, 0x02c63f43UL,
- 0x3e2e1318UL, 0xc0000000UL, 0x3fef7120UL, 0xb3d4ccccUL, 0xbe44c52aUL,
- 0x00000000UL, 0x3fef615cUL, 0xdbd91397UL, 0xbe4e7d6cUL, 0xa0000000UL,
- 0x3fef519cUL, 0x65c5cd68UL, 0xbe522dc8UL, 0xa0000000UL, 0x3fef41e2UL,
- 0x46d1306cUL, 0xbe5a840eUL, 0xe0000000UL, 0x3fef322dUL, 0xd2980e94UL,
- 0x3e5071afUL, 0xa0000000UL, 0x3fef227eUL, 0x773abadeUL, 0xbe5891e5UL,
- 0xa0000000UL, 0x3fef12d4UL, 0xdc6bf46bUL, 0xbe5cccbeUL, 0xe0000000UL,
- 0x3fef032fUL, 0xbc7247faUL, 0xbe2bab83UL, 0x80000000UL, 0x3feef390UL,
- 0xbcaa1e46UL, 0xbe53bb3bUL, 0x60000000UL, 0x3feee3f6UL, 0x5f6c682dUL,
- 0xbe54c619UL, 0x80000000UL, 0x3feed461UL, 0x5141e368UL, 0xbe4b6d86UL,
- 0xe0000000UL, 0x3feec4d1UL, 0xec678f76UL, 0xbe369af6UL, 0x80000000UL,
- 0x3feeb547UL, 0x41301f55UL, 0xbe2d4312UL, 0x60000000UL, 0x3feea5c2UL,
- 0x676da6bdUL, 0xbe4d8dd0UL, 0x60000000UL, 0x3fee9642UL, 0x57a891c4UL,
- 0x3e51f991UL, 0xa0000000UL, 0x3fee86c7UL, 0xe4eb491eUL, 0x3e579bf9UL,
- 0x20000000UL, 0x3fee7752UL, 0xfddc4a2cUL, 0xbe3356e6UL, 0xc0000000UL,
- 0x3fee67e1UL, 0xd75b5bf1UL, 0xbe449531UL, 0x80000000UL, 0x3fee5876UL,
- 0xbd423b8eUL, 0x3df54fe4UL, 0x60000000UL, 0x3fee4910UL, 0x330e51b9UL,
- 0x3e54289cUL, 0x80000000UL, 0x3fee39afUL, 0x8651a95fUL, 0xbe55aad6UL,
- 0xa0000000UL, 0x3fee2a53UL, 0x5e98c708UL, 0xbe2fc4a9UL, 0xe0000000UL,
- 0x3fee1afcUL, 0x0989328dUL, 0x3e23958cUL, 0x40000000UL, 0x3fee0babUL,
- 0xee642abdUL, 0xbe425dd8UL, 0xa0000000UL, 0x3fedfc5eUL, 0xc394d236UL,
- 0x3e526362UL, 0x20000000UL, 0x3feded17UL, 0xe104aa8eUL, 0x3e4ce247UL,
- 0xc0000000UL, 0x3fedddd4UL, 0x265a9be4UL, 0xbe5bb77aUL, 0x40000000UL,
- 0x3fedce97UL, 0x0ecac52fUL, 0x3e4a7cb1UL, 0xe0000000UL, 0x3fedbf5eUL,
- 0x124cb3b8UL, 0x3e257024UL, 0x80000000UL, 0x3fedb02bUL, 0xe6d4febeUL,
- 0xbe2033eeUL, 0x20000000UL, 0x3feda0fdUL, 0x39cca00eUL, 0xbe3ddabcUL,
- 0xc0000000UL, 0x3fed91d3UL, 0xef8a552aUL, 0xbe543390UL, 0x40000000UL,
- 0x3fed82afUL, 0xb8e85204UL, 0x3e513850UL, 0xe0000000UL, 0x3fed738fUL,
- 0x3d59fe08UL, 0xbe5db728UL, 0x40000000UL, 0x3fed6475UL, 0x3aa7ead1UL,
- 0x3e58804bUL, 0xc0000000UL, 0x3fed555fUL, 0xf8a35ba9UL, 0xbe5298b0UL,
- 0x00000000UL, 0x3fed464fUL, 0x9a88dd15UL, 0x3e5a8cdbUL, 0x40000000UL,
- 0x3fed3743UL, 0xb0b0a190UL, 0x3e598635UL, 0x80000000UL, 0x3fed283cUL,
- 0xe2113295UL, 0xbe5c1119UL, 0x80000000UL, 0x3fed193aUL, 0xafbf1728UL,
- 0xbe492e9cUL, 0x60000000UL, 0x3fed0a3dUL, 0xe4a4ccf3UL, 0x3e19b90eUL,
- 0x20000000UL, 0x3fecfb45UL, 0xba3cbeb8UL, 0x3e406b50UL, 0xc0000000UL,
- 0x3fecec51UL, 0x110f7dddUL, 0x3e0d6806UL, 0x40000000UL, 0x3fecdd63UL,
- 0x7dd7d508UL, 0xbe5a8943UL, 0x80000000UL, 0x3fecce79UL, 0x9b60f271UL,
- 0xbe50676aUL, 0x80000000UL, 0x3fecbf94UL, 0x0b9ad660UL, 0x3e59174fUL,
- 0x60000000UL, 0x3fecb0b4UL, 0x00823d9cUL, 0x3e5bbf72UL, 0x20000000UL,
- 0x3feca1d9UL, 0x38a6ec89UL, 0xbe4d38f9UL, 0x80000000UL, 0x3fec9302UL,
- 0x3a0b7d8eUL, 0x3e53dbfdUL, 0xc0000000UL, 0x3fec8430UL, 0xc6826b34UL,
- 0xbe27c5c9UL, 0xc0000000UL, 0x3fec7563UL, 0x0c706381UL, 0xbe593653UL,
- 0x60000000UL, 0x3fec669bUL, 0x7df34ec7UL, 0x3e461ab5UL, 0xe0000000UL,
- 0x3fec57d7UL, 0x40e5e7e8UL, 0xbe5c3daeUL, 0x00000000UL, 0x3fec4919UL,
- 0x5602770fUL, 0xbe55219dUL, 0xc0000000UL, 0x3fec3a5eUL, 0xec7911ebUL,
- 0x3e5a5d25UL, 0x60000000UL, 0x3fec2ba9UL, 0xb39ea225UL, 0xbe53c00bUL,
- 0x80000000UL, 0x3fec1cf8UL, 0x967a212eUL, 0x3e5a8ddfUL, 0x60000000UL,
- 0x3fec0e4cUL, 0x580798bdUL, 0x3e5f53abUL, 0x00000000UL, 0x3febffa5UL,
- 0xb8282df6UL, 0xbe46b874UL, 0x20000000UL, 0x3febf102UL, 0xe33a6729UL,
- 0x3e54963fUL, 0x00000000UL, 0x3febe264UL, 0x3b53e88aUL, 0xbe3adce1UL,
- 0x60000000UL, 0x3febd3caUL, 0xc2585084UL, 0x3e5cde9fUL, 0x80000000UL,
- 0x3febc535UL, 0xa335c5eeUL, 0xbe39fd9cUL, 0x20000000UL, 0x3febb6a5UL,
- 0x7325b04dUL, 0x3e42ba15UL, 0x60000000UL, 0x3feba819UL, 0x1564540fUL,
- 0x3e3a9f35UL, 0x40000000UL, 0x3feb9992UL, 0x83fff592UL, 0xbe5465ceUL,
- 0xa0000000UL, 0x3feb8b0fUL, 0xb9da63d3UL, 0xbe4b1a0aUL, 0x80000000UL,
- 0x3feb7c91UL, 0x6d6f1ea4UL, 0x3e557657UL, 0x00000000UL, 0x3feb6e18UL,
- 0x5e80a1bfUL, 0x3e4ddbb6UL, 0x00000000UL, 0x3feb5fa3UL, 0x1c9eacb5UL,
- 0x3e592877UL, 0xa0000000UL, 0x3feb5132UL, 0x6d40beb3UL, 0xbe51858cUL,
- 0xa0000000UL, 0x3feb42c6UL, 0xd740c67bUL, 0x3e427ad2UL, 0x40000000UL,
- 0x3feb345fUL, 0xa3e0cceeUL, 0xbe5c2fc4UL, 0x40000000UL, 0x3feb25fcUL,
- 0x8e752b50UL, 0xbe3da3c2UL, 0xc0000000UL, 0x3feb179dUL, 0xa892e7deUL,
- 0x3e1fb481UL, 0xc0000000UL, 0x3feb0943UL, 0x21ed71e9UL, 0xbe365206UL,
- 0x20000000UL, 0x3feafaeeUL, 0x0e1380a3UL, 0x3e5c5b7bUL, 0x20000000UL,
- 0x3feaec9dUL, 0x3c3d640eUL, 0xbe5dbbd0UL, 0x60000000UL, 0x3feade50UL,
- 0x8f97a715UL, 0x3e3a8ec5UL, 0x20000000UL, 0x3fead008UL, 0x23ab2839UL,
- 0x3e2fe98aUL, 0x40000000UL, 0x3feac1c4UL, 0xf4bbd50fUL, 0x3e54d8f6UL,
- 0xe0000000UL, 0x3feab384UL, 0x14757c4dUL, 0xbe48774cUL, 0xc0000000UL,
- 0x3feaa549UL, 0x7c7b0eeaUL, 0x3e5b51bbUL, 0x20000000UL, 0x3fea9713UL,
- 0xf56f7013UL, 0x3e386200UL, 0xe0000000UL, 0x3fea88e0UL, 0xbe428ebeUL,
- 0xbe514af5UL, 0xe0000000UL, 0x3fea7ab2UL, 0x8d0e4496UL, 0x3e4f9165UL,
- 0x60000000UL, 0x3fea6c89UL, 0xdbacc5d5UL, 0xbe5c063bUL, 0x20000000UL,
- 0x3fea5e64UL, 0x3f19d970UL, 0xbe5a0c8cUL, 0x20000000UL, 0x3fea5043UL,
- 0x09ea3e6bUL, 0x3e5065dcUL, 0x80000000UL, 0x3fea4226UL, 0x78df246cUL,
- 0x3e5e05f6UL, 0x40000000UL, 0x3fea340eUL, 0x4057d4a0UL, 0x3e431b2bUL,
- 0x40000000UL, 0x3fea25faUL, 0x82867bb5UL, 0x3e4b76beUL, 0xa0000000UL,
- 0x3fea17eaUL, 0x9436f40aUL, 0xbe5aad39UL, 0x20000000UL, 0x3fea09dfUL,
- 0x4b5253b3UL, 0x3e46380bUL, 0x00000000UL, 0x3fe9fbd8UL, 0x8fc52466UL,
- 0xbe386f9bUL, 0x20000000UL, 0x3fe9edd5UL, 0x22d3f344UL, 0xbe538347UL,
- 0x60000000UL, 0x3fe9dfd6UL, 0x1ac33522UL, 0x3e5dbc53UL, 0x00000000UL,
- 0x3fe9d1dcUL, 0xeabdff1dUL, 0x3e40fc0cUL, 0xe0000000UL, 0x3fe9c3e5UL,
- 0xafd30e73UL, 0xbe585e63UL, 0xe0000000UL, 0x3fe9b5f3UL, 0xa52f226aUL,
- 0xbe43e8f9UL, 0x20000000UL, 0x3fe9a806UL, 0xecb8698dUL, 0xbe515b36UL,
- 0x80000000UL, 0x3fe99a1cUL, 0xf2b4e89dUL, 0x3e48b62bUL, 0x20000000UL,
- 0x3fe98c37UL, 0x7c9a88fbUL, 0x3e44414cUL, 0x00000000UL, 0x3fe97e56UL,
- 0xda015741UL, 0xbe5d13baUL, 0xe0000000UL, 0x3fe97078UL, 0x5fdace06UL,
- 0x3e51b947UL, 0x00000000UL, 0x3fe962a0UL, 0x956ca094UL, 0x3e518785UL,
- 0x40000000UL, 0x3fe954cbUL, 0x01164c1dUL, 0x3e5d5b57UL, 0xc0000000UL,
- 0x3fe946faUL, 0xe63b3767UL, 0xbe4f84e7UL, 0x40000000UL, 0x3fe9392eUL,
- 0xe57cc2a9UL, 0x3e34eda3UL, 0xe0000000UL, 0x3fe92b65UL, 0x8c75b544UL,
- 0x3e5766a0UL, 0xc0000000UL, 0x3fe91da1UL, 0x37d1d087UL, 0xbe5e2ab1UL,
- 0x80000000UL, 0x3fe90fe1UL, 0xa953dc20UL, 0x3e5fa1f3UL, 0x80000000UL,
- 0x3fe90225UL, 0xdbd3f369UL, 0x3e47d6dbUL, 0xa0000000UL, 0x3fe8f46dUL,
- 0x1c9be989UL, 0xbe5e2b0aUL, 0xa0000000UL, 0x3fe8e6b9UL, 0x3c93d76aUL,
- 0x3e5c8618UL, 0xe0000000UL, 0x3fe8d909UL, 0x2182fc9aUL, 0xbe41aa9eUL,
- 0x20000000UL, 0x3fe8cb5eUL, 0xe6b3539dUL, 0xbe530d19UL, 0x60000000UL,
- 0x3fe8bdb6UL, 0x49e58cc3UL, 0xbe3bb374UL, 0xa0000000UL, 0x3fe8b012UL,
- 0xa7cfeb8fUL, 0x3e56c412UL, 0x00000000UL, 0x3fe8a273UL, 0x8d52bc19UL,
- 0x3e1429b8UL, 0x60000000UL, 0x3fe894d7UL, 0x4dc32c6cUL, 0xbe48604cUL,
- 0xc0000000UL, 0x3fe8873fUL, 0x0c868e56UL, 0xbe564ee5UL, 0x00000000UL,
- 0x3fe879acUL, 0x56aee828UL, 0x3e5e2fd8UL, 0x60000000UL, 0x3fe86c1cUL,
- 0x7ceab8ecUL, 0x3e493365UL, 0xc0000000UL, 0x3fe85e90UL, 0x78d4dadcUL,
- 0xbe4f7f25UL, 0x00000000UL, 0x3fe85109UL, 0x0ccd8280UL, 0x3e31e7a2UL,
- 0x40000000UL, 0x3fe84385UL, 0x34ba4e15UL, 0x3e328077UL, 0x80000000UL,
- 0x3fe83605UL, 0xa670975aUL, 0xbe53eee5UL, 0xa0000000UL, 0x3fe82889UL,
- 0xf61b77b2UL, 0xbe43a20aUL, 0xa0000000UL, 0x3fe81b11UL, 0x13e6643bUL,
- 0x3e5e5fe5UL, 0xc0000000UL, 0x3fe80d9dUL, 0x82cc94e8UL, 0xbe5ff1f9UL,
- 0xa0000000UL, 0x3fe8002dUL, 0x8a0c9c5dUL, 0xbe42b0e7UL, 0x60000000UL,
- 0x3fe7f2c1UL, 0x22a16f01UL, 0x3e5d9ea0UL, 0x20000000UL, 0x3fe7e559UL,
- 0xc38cd451UL, 0x3e506963UL, 0xc0000000UL, 0x3fe7d7f4UL, 0x9902bc71UL,
- 0x3e4503d7UL, 0x40000000UL, 0x3fe7ca94UL, 0xdef2a3c0UL, 0x3e3d98edUL,
- 0xa0000000UL, 0x3fe7bd37UL, 0xed49abb0UL, 0x3e24c1ffUL, 0xe0000000UL,
- 0x3fe7afdeUL, 0xe3b0be70UL, 0xbe40c467UL, 0x00000000UL, 0x3fe7a28aUL,
- 0xaf9f193cUL, 0xbe5dff6cUL, 0xe0000000UL, 0x3fe79538UL, 0xb74cf6b6UL,
- 0xbe258ed0UL, 0xa0000000UL, 0x3fe787ebUL, 0x1d9127c7UL, 0x3e345fb0UL,
- 0x40000000UL, 0x3fe77aa2UL, 0x1028c21dUL, 0xbe4619bdUL, 0xa0000000UL,
- 0x3fe76d5cUL, 0x7cb0b5e4UL, 0x3e40f1a2UL, 0xe0000000UL, 0x3fe7601aUL,
- 0x2b1bc4adUL, 0xbe32e8bbUL, 0xe0000000UL, 0x3fe752dcUL, 0x6839f64eUL,
- 0x3e41f57bUL, 0xc0000000UL, 0x3fe745a2UL, 0xc4121f7eUL, 0xbe52c40aUL,
- 0x60000000UL, 0x3fe7386cUL, 0xd6852d72UL, 0xbe5c4e6bUL, 0xc0000000UL,
- 0x3fe72b39UL, 0x91d690f7UL, 0xbe57f88fUL, 0xe0000000UL, 0x3fe71e0aUL,
- 0x627a2159UL, 0xbe4425d5UL, 0xc0000000UL, 0x3fe710dfUL, 0x50a54033UL,
- 0x3e422b7eUL, 0x60000000UL, 0x3fe703b8UL, 0x3b0b5f91UL, 0x3e5d3857UL,
- 0xe0000000UL, 0x3fe6f694UL, 0x84d628a2UL, 0xbe51f090UL, 0x00000000UL,
- 0x3fe6e975UL, 0x306d8894UL, 0xbe414d83UL, 0xe0000000UL, 0x3fe6dc58UL,
- 0x30bf24aaUL, 0xbe4650caUL, 0x80000000UL, 0x3fe6cf40UL, 0xd4628d69UL,
- 0xbe5db007UL, 0xc0000000UL, 0x3fe6c22bUL, 0xa2aae57bUL, 0xbe31d279UL,
- 0xc0000000UL, 0x3fe6b51aUL, 0x860edf7eUL, 0xbe2d4c4aUL, 0x80000000UL,
- 0x3fe6a80dUL, 0xf3559341UL, 0xbe5f7e98UL, 0xe0000000UL, 0x3fe69b03UL,
- 0xa885899eUL, 0xbe5c2011UL, 0xe0000000UL, 0x3fe68dfdUL, 0x2bdc6d37UL,
- 0x3e224a82UL, 0xa0000000UL, 0x3fe680fbUL, 0xc12ad1b9UL, 0xbe40cf56UL,
- 0x00000000UL, 0x3fe673fdUL, 0x1bcdf659UL, 0xbdf52f2dUL, 0x00000000UL,
- 0x3fe66702UL, 0x5df10408UL, 0x3e5663e0UL, 0xc0000000UL, 0x3fe65a0aUL,
- 0xa4070568UL, 0xbe40b12fUL, 0x00000000UL, 0x3fe64d17UL, 0x71c54c47UL,
- 0x3e5f5e8bUL, 0x00000000UL, 0x3fe64027UL, 0xbd4b7e83UL, 0x3e42ead6UL,
- 0xa0000000UL, 0x3fe6333aUL, 0x61598bd2UL, 0xbe4c48d4UL, 0xc0000000UL,
- 0x3fe62651UL, 0x6f538d61UL, 0x3e548401UL, 0xa0000000UL, 0x3fe6196cUL,
- 0x14344120UL, 0xbe529af6UL, 0x00000000UL, 0x3fe60c8bUL, 0x5982c587UL,
- 0xbe3e1e4fUL, 0x00000000UL, 0x3fe5ffadUL, 0xfe51d4eaUL, 0xbe4c897aUL,
- 0x80000000UL, 0x3fe5f2d2UL, 0xfd46ebe1UL, 0x3e552e00UL, 0xa0000000UL,
- 0x3fe5e5fbUL, 0xa4695699UL, 0x3e5ed471UL, 0x60000000UL, 0x3fe5d928UL,
- 0x80d118aeUL, 0x3e456b61UL, 0xa0000000UL, 0x3fe5cc58UL, 0x304c330bUL,
- 0x3e54dc29UL, 0x80000000UL, 0x3fe5bf8cUL, 0x0af2dedfUL, 0xbe3aa9bdUL,
- 0xe0000000UL, 0x3fe5b2c3UL, 0x15fc9258UL, 0xbe479a37UL, 0xc0000000UL,
- 0x3fe5a5feUL, 0x9292c7eaUL, 0x3e188650UL, 0x20000000UL, 0x3fe5993dUL,
- 0x33b4d380UL, 0x3e5d6d93UL, 0x20000000UL, 0x3fe58c7fUL, 0x02fd16c7UL,
- 0x3e2fe961UL, 0xa0000000UL, 0x3fe57fc4UL, 0x4a05edb6UL, 0xbe4d55b4UL,
- 0xa0000000UL, 0x3fe5730dUL, 0x3d443abbUL, 0xbe5e6954UL, 0x00000000UL,
- 0x3fe5665aUL, 0x024acfeaUL, 0x3e50e61bUL, 0x00000000UL, 0x3fe559aaUL,
- 0xcc9edd09UL, 0xbe325403UL, 0x60000000UL, 0x3fe54cfdUL, 0x1fe26950UL,
- 0x3e5d500eUL, 0x60000000UL, 0x3fe54054UL, 0x6c5ae164UL, 0xbe4a79b4UL,
- 0xc0000000UL, 0x3fe533aeUL, 0x154b0287UL, 0xbe401571UL, 0xa0000000UL,
- 0x3fe5270cUL, 0x0673f401UL, 0xbe56e56bUL, 0xe0000000UL, 0x3fe51a6dUL,
- 0x751b639cUL, 0x3e235269UL, 0xa0000000UL, 0x3fe50dd2UL, 0x7c7b2bedUL,
- 0x3ddec887UL, 0xc0000000UL, 0x3fe5013aUL, 0xafab4e17UL, 0x3e5e7575UL,
- 0x60000000UL, 0x3fe4f4a6UL, 0x2e308668UL, 0x3e59aed6UL, 0x80000000UL,
- 0x3fe4e815UL, 0xf33e2a76UL, 0xbe51f184UL, 0xe0000000UL, 0x3fe4db87UL,
- 0x839f3e3eUL, 0x3e57db01UL, 0xc0000000UL, 0x3fe4cefdUL, 0xa9eda7bbUL,
- 0x3e535e0fUL, 0x00000000UL, 0x3fe4c277UL, 0x2a8f66a5UL, 0x3e5ce451UL,
- 0xc0000000UL, 0x3fe4b5f3UL, 0x05192456UL, 0xbe4e8518UL, 0xc0000000UL,
- 0x3fe4a973UL, 0x4aa7cd1dUL, 0x3e46784aUL, 0x40000000UL, 0x3fe49cf7UL,
- 0x8e23025eUL, 0xbe5749f2UL, 0x00000000UL, 0x3fe4907eUL, 0x18d30215UL,
- 0x3e360f39UL, 0x20000000UL, 0x3fe48408UL, 0x63dcf2f3UL, 0x3e5e00feUL,
- 0xc0000000UL, 0x3fe47795UL, 0x46182d09UL, 0xbe5173d9UL, 0xa0000000UL,
- 0x3fe46b26UL, 0x8f0e62aaUL, 0xbe48f281UL, 0xe0000000UL, 0x3fe45ebaUL,
- 0x5775c40cUL, 0xbe56aad4UL, 0x60000000UL, 0x3fe45252UL, 0x0fe25f69UL,
- 0x3e48bd71UL, 0x40000000UL, 0x3fe445edUL, 0xe9989ec5UL, 0x3e590d97UL,
- 0x80000000UL, 0x3fe4398bUL, 0xb3d9ffe3UL, 0x3e479dbcUL, 0x20000000UL,
- 0x3fe42d2dUL, 0x388e4d2eUL, 0xbe5eed80UL, 0xe0000000UL, 0x3fe420d1UL,
- 0x6f797c18UL, 0x3e554b4cUL, 0x20000000UL, 0x3fe4147aUL, 0x31048bb4UL,
- 0xbe5b1112UL, 0x80000000UL, 0x3fe40825UL, 0x2efba4f9UL, 0x3e48ebc7UL,
- 0x40000000UL, 0x3fe3fbd4UL, 0x50201119UL, 0x3e40b701UL, 0x40000000UL,
- 0x3fe3ef86UL, 0x0a4db32cUL, 0x3e551de8UL, 0xa0000000UL, 0x3fe3e33bUL,
- 0x0c9c148bUL, 0xbe50c1f6UL, 0x20000000UL, 0x3fe3d6f4UL, 0xc9129447UL,
- 0x3e533fa0UL, 0x00000000UL, 0x3fe3cab0UL, 0xaae5b5a0UL, 0xbe22b68eUL,
- 0x20000000UL, 0x3fe3be6fUL, 0x02305e8aUL, 0xbe54fc08UL, 0x60000000UL,
- 0x3fe3b231UL, 0x7f908258UL, 0x3e57dc05UL, 0x00000000UL, 0x3fe3a5f7UL,
- 0x1a09af78UL, 0x3e08038bUL, 0xe0000000UL, 0x3fe399bfUL, 0x490643c1UL,
- 0xbe5dbe42UL, 0xe0000000UL, 0x3fe38d8bUL, 0x5e8ad724UL, 0xbe3c2b72UL,
- 0x20000000UL, 0x3fe3815bUL, 0xc67196b6UL, 0x3e1713cfUL, 0xa0000000UL,
- 0x3fe3752dUL, 0x6182e429UL, 0xbe3ec14cUL, 0x40000000UL, 0x3fe36903UL,
- 0xab6eb1aeUL, 0x3e5a2cc5UL, 0x40000000UL, 0x3fe35cdcUL, 0xfe5dc064UL,
- 0xbe5c5878UL, 0x40000000UL, 0x3fe350b8UL, 0x0ba6b9e4UL, 0x3e51619bUL,
- 0x80000000UL, 0x3fe34497UL, 0x857761aaUL, 0x3e5fff53UL, 0x00000000UL,
- 0x3fe3387aUL, 0xf872d68cUL, 0x3e484f4dUL, 0xa0000000UL, 0x3fe32c5fUL,
- 0x087e97c2UL, 0x3e52842eUL, 0x80000000UL, 0x3fe32048UL, 0x73d6d0c0UL,
- 0xbe503edfUL, 0x80000000UL, 0x3fe31434UL, 0x0c1456a1UL, 0xbe5f72adUL,
- 0xa0000000UL, 0x3fe30823UL, 0x83a1a4d5UL, 0xbe5e65ccUL, 0xe0000000UL,
- 0x3fe2fc15UL, 0x855a7390UL, 0xbe506438UL, 0x40000000UL, 0x3fe2f00bUL,
- 0xa2898287UL, 0x3e3d22a2UL, 0xe0000000UL, 0x3fe2e403UL, 0x8b56f66fUL,
- 0xbe5aa5fdUL, 0x80000000UL, 0x3fe2d7ffUL, 0x52db119aUL, 0x3e3a2e3dUL,
- 0x60000000UL, 0x3fe2cbfeUL, 0xe2ddd4c0UL, 0xbe586469UL, 0x40000000UL,
- 0x3fe2c000UL, 0x6b01bf10UL, 0x3e352b9dUL, 0x40000000UL, 0x3fe2b405UL,
- 0xb07a1cdfUL, 0x3e5c5cdaUL, 0x80000000UL, 0x3fe2a80dUL, 0xc7b5f868UL,
- 0xbe5668b3UL, 0xc0000000UL, 0x3fe29c18UL, 0x185edf62UL, 0xbe563d66UL,
- 0x00000000UL, 0x3fe29027UL, 0xf729e1ccUL, 0x3e59a9a0UL, 0x80000000UL,
- 0x3fe28438UL, 0x6433c727UL, 0xbe43cc89UL, 0x00000000UL, 0x3fe2784dUL,
- 0x41782631UL, 0xbe30750cUL, 0xa0000000UL, 0x3fe26c64UL, 0x914911b7UL,
- 0xbe58290eUL, 0x40000000UL, 0x3fe2607fUL, 0x3dcc73e1UL, 0xbe4269cdUL,
- 0x00000000UL, 0x3fe2549dUL, 0x2751bf70UL, 0xbe5a6998UL, 0xc0000000UL,
- 0x3fe248bdUL, 0x4248b9fbUL, 0xbe4ddb00UL, 0x80000000UL, 0x3fe23ce1UL,
- 0xf35cf82fUL, 0x3e561b71UL, 0x60000000UL, 0x3fe23108UL, 0x8e481a2dUL,
- 0x3e518fb9UL, 0x60000000UL, 0x3fe22532UL, 0x5ab96edcUL, 0xbe5fafc5UL,
- 0x40000000UL, 0x3fe2195fUL, 0x80943911UL, 0xbe07f819UL, 0x40000000UL,
- 0x3fe20d8fUL, 0x386f2d6cUL, 0xbe54ba8bUL, 0x40000000UL, 0x3fe201c2UL,
- 0xf29664acUL, 0xbe5eb815UL, 0x20000000UL, 0x3fe1f5f8UL, 0x64f03390UL,
- 0x3e5e320cUL, 0x20000000UL, 0x3fe1ea31UL, 0x747ff696UL, 0x3e5ef0a5UL,
- 0x40000000UL, 0x3fe1de6dUL, 0x3e9ceb51UL, 0xbe5f8d27UL, 0x20000000UL,
- 0x3fe1d2acUL, 0x4ae0b55eUL, 0x3e5faa21UL, 0x20000000UL, 0x3fe1c6eeUL,
- 0x28569a5eUL, 0x3e598a4fUL, 0x20000000UL, 0x3fe1bb33UL, 0x54b33e07UL,
- 0x3e46130aUL, 0x20000000UL, 0x3fe1af7bUL, 0x024f1078UL, 0xbe4dbf93UL,
- 0x00000000UL, 0x3fe1a3c6UL, 0xb0783bfaUL, 0x3e419248UL, 0xe0000000UL,
- 0x3fe19813UL, 0x2f02b836UL, 0x3e4e02b7UL, 0xc0000000UL, 0x3fe18c64UL,
- 0x28dec9d4UL, 0x3e09064fUL, 0x80000000UL, 0x3fe180b8UL, 0x45cbf406UL,
- 0x3e5b1f46UL, 0x40000000UL, 0x3fe1750fUL, 0x03d9964cUL, 0x3e5b0a79UL,
- 0x00000000UL, 0x3fe16969UL, 0x8b5b882bUL, 0xbe238086UL, 0xa0000000UL,
- 0x3fe15dc5UL, 0x73bad6f8UL, 0xbdf1fca4UL, 0x20000000UL, 0x3fe15225UL,
- 0x5385769cUL, 0x3e5e8d76UL, 0xa0000000UL, 0x3fe14687UL, 0x1676dc6bUL,
- 0x3e571d08UL, 0x20000000UL, 0x3fe13aedUL, 0xa8c41c7fUL, 0xbe598a25UL,
- 0x60000000UL, 0x3fe12f55UL, 0xc4e1aaf0UL, 0x3e435277UL, 0xa0000000UL,
- 0x3fe123c0UL, 0x403638e1UL, 0xbe21aa7cUL, 0xc0000000UL, 0x3fe1182eUL,
- 0x557a092bUL, 0xbdd0116bUL, 0xc0000000UL, 0x3fe10c9fUL, 0x7d779f66UL,
- 0x3e4a61baUL, 0xc0000000UL, 0x3fe10113UL, 0x2b09c645UL, 0xbe5d586eUL,
- 0x20000000UL, 0x3fe0ea04UL, 0xea2cad46UL, 0x3e5aa97cUL, 0x20000000UL,
- 0x3fe0d300UL, 0x23190e54UL, 0x3e50f1a7UL, 0xa0000000UL, 0x3fe0bc07UL,
- 0x1379a5a6UL, 0xbe51619dUL, 0x60000000UL, 0x3fe0a51aUL, 0x926a3d4aUL,
- 0x3e5cf019UL, 0xa0000000UL, 0x3fe08e38UL, 0xa8c24358UL, 0x3e35241eUL,
- 0x20000000UL, 0x3fe07762UL, 0x24317e7aUL, 0x3e512cfaUL, 0x00000000UL,
- 0x3fe06097UL, 0xfd9cf274UL, 0xbe55bef3UL, 0x00000000UL, 0x3fe049d7UL,
- 0x3689b49dUL, 0xbe36d26dUL, 0x40000000UL, 0x3fe03322UL, 0xf72ef6c4UL,
- 0xbe54cd08UL, 0xa0000000UL, 0x3fe01c78UL, 0x23702d2dUL, 0xbe5900bfUL,
- 0x00000000UL, 0x3fe005daUL, 0x3f59c14cUL, 0x3e57d80bUL, 0x40000000UL,
- 0x3fdfde8dUL, 0xad67766dUL, 0xbe57fad4UL, 0x40000000UL, 0x3fdfb17cUL,
- 0x644f4ae7UL, 0x3e1ee43bUL, 0x40000000UL, 0x3fdf8481UL, 0x903234d2UL,
- 0x3e501a86UL, 0x40000000UL, 0x3fdf579cUL, 0xafe9e509UL, 0xbe267c3eUL,
- 0x00000000UL, 0x3fdf2acdUL, 0xb7dfda0bUL, 0xbe48149bUL, 0x40000000UL,
- 0x3fdefe13UL, 0x3b94305eUL, 0x3e5f4ea7UL, 0x80000000UL, 0x3fded16fUL,
- 0x5d95da61UL, 0xbe55c198UL, 0x00000000UL, 0x3fdea4e1UL, 0x406960c9UL,
- 0xbdd99a19UL, 0x00000000UL, 0x3fde7868UL, 0xd22f3539UL, 0x3e470c78UL,
- 0x80000000UL, 0x3fde4c04UL, 0x83eec535UL, 0xbe3e1232UL, 0x40000000UL,
- 0x3fde1fb6UL, 0x3dfbffcbUL, 0xbe4b7d71UL, 0x40000000UL, 0x3fddf37dUL,
- 0x7e1be4e0UL, 0xbe5b8f8fUL, 0x40000000UL, 0x3fddc759UL, 0x46dae887UL,
- 0xbe350458UL, 0x80000000UL, 0x3fdd9b4aUL, 0xed6ecc49UL, 0xbe5f0045UL,
- 0x80000000UL, 0x3fdd6f50UL, 0x2e9e883cUL, 0x3e2915daUL, 0x80000000UL,
- 0x3fdd436bUL, 0xf0bccb32UL, 0x3e4a68c9UL, 0x80000000UL, 0x3fdd179bUL,
- 0x9bbfc779UL, 0xbe54a26aUL, 0x00000000UL, 0x3fdcebe0UL, 0x7cea33abUL,
- 0x3e43c6b7UL, 0x40000000UL, 0x3fdcc039UL, 0xe740fd06UL, 0x3e5526c2UL,
- 0x40000000UL, 0x3fdc94a7UL, 0x9eadeb1aUL, 0xbe396d8dUL, 0xc0000000UL,
- 0x3fdc6929UL, 0xf0a8f95aUL, 0xbe5c0ab2UL, 0x80000000UL, 0x3fdc3dc0UL,
- 0x6ee2693bUL, 0x3e0992e6UL, 0xc0000000UL, 0x3fdc126bUL, 0x5ac6b581UL,
- 0xbe2834b6UL, 0x40000000UL, 0x3fdbe72bUL, 0x8cc226ffUL, 0x3e3596a6UL,
- 0x00000000UL, 0x3fdbbbffUL, 0xf92a74bbUL, 0x3e3c5813UL, 0x00000000UL,
- 0x3fdb90e7UL, 0x479664c0UL, 0xbe50d644UL, 0x00000000UL, 0x3fdb65e3UL,
- 0x5004975bUL, 0xbe55258fUL, 0x00000000UL, 0x3fdb3af3UL, 0xe4b23194UL,
- 0xbe588407UL, 0xc0000000UL, 0x3fdb1016UL, 0xe65d4d0aUL, 0x3e527c26UL,
- 0x80000000UL, 0x3fdae54eUL, 0x814fddd6UL, 0x3e5962a2UL, 0x40000000UL,
- 0x3fdaba9aUL, 0xe19d0913UL, 0xbe562f4eUL, 0x80000000UL, 0x3fda8ff9UL,
- 0x43cfd006UL, 0xbe4cfdebUL, 0x40000000UL, 0x3fda656cUL, 0x686f0a4eUL,
- 0x3e5e47a8UL, 0xc0000000UL, 0x3fda3af2UL, 0x7200d410UL, 0x3e5e1199UL,
- 0xc0000000UL, 0x3fda108cUL, 0xabd2266eUL, 0x3e5ee4d1UL, 0x40000000UL,
- 0x3fd9e63aUL, 0x396f8f2cUL, 0x3e4dbffbUL, 0x00000000UL, 0x3fd9bbfbUL,
- 0xe32b25ddUL, 0x3e5c3a54UL, 0x40000000UL, 0x3fd991cfUL, 0x431e4035UL,
- 0xbe457925UL, 0x80000000UL, 0x3fd967b6UL, 0x7bed3dd3UL, 0x3e40c61dUL,
- 0x00000000UL, 0x3fd93db1UL, 0xd7449365UL, 0x3e306419UL, 0x80000000UL,
- 0x3fd913beUL, 0x1746e791UL, 0x3e56fcfcUL, 0x40000000UL, 0x3fd8e9dfUL,
- 0xf3a9028bUL, 0xbe5041b9UL, 0xc0000000UL, 0x3fd8c012UL, 0x56840c50UL,
- 0xbe26e20aUL, 0x40000000UL, 0x3fd89659UL, 0x19763102UL, 0xbe51f466UL,
- 0x80000000UL, 0x3fd86cb2UL, 0x7032de7cUL, 0xbe4d298aUL, 0x80000000UL,
- 0x3fd8431eUL, 0xdeb39fabUL, 0xbe4361ebUL, 0x40000000UL, 0x3fd8199dUL,
- 0x5d01cbe0UL, 0xbe5425b3UL, 0x80000000UL, 0x3fd7f02eUL, 0x3ce99aa9UL,
- 0x3e146fa8UL, 0x80000000UL, 0x3fd7c6d2UL, 0xd1a262b9UL, 0xbe5a1a69UL,
- 0xc0000000UL, 0x3fd79d88UL, 0x8606c236UL, 0x3e423a08UL, 0x80000000UL,
- 0x3fd77451UL, 0x8fd1e1b7UL, 0x3e5a6a63UL, 0xc0000000UL, 0x3fd74b2cUL,
- 0xe491456aUL, 0x3e42c1caUL, 0x40000000UL, 0x3fd7221aUL, 0x4499a6d7UL,
- 0x3e36a69aUL, 0x00000000UL, 0x3fd6f91aUL, 0x5237df94UL, 0xbe0f8f02UL,
- 0x00000000UL, 0x3fd6d02cUL, 0xb6482c6eUL, 0xbe5abcf7UL, 0x00000000UL,
- 0x3fd6a750UL, 0x1919fd61UL, 0xbe57ade2UL, 0x00000000UL, 0x3fd67e86UL,
- 0xaa7a994dUL, 0xbe3f3fbdUL, 0x00000000UL, 0x3fd655ceUL, 0x67db014cUL,
- 0x3e33c550UL, 0x00000000UL, 0x3fd62d28UL, 0xa82856b7UL, 0xbe1409d1UL,
- 0xc0000000UL, 0x3fd60493UL, 0x1e6a300dUL, 0x3e55d899UL, 0x80000000UL,
- 0x3fd5dc11UL, 0x1222bd5cUL, 0xbe35bfc0UL, 0xc0000000UL, 0x3fd5b3a0UL,
- 0x6e8dc2d3UL, 0x3e5d4d79UL, 0x00000000UL, 0x3fd58b42UL, 0xe0e4ace6UL,
- 0xbe517303UL, 0x80000000UL, 0x3fd562f4UL, 0xb306e0a8UL, 0x3e5edf0fUL,
- 0xc0000000UL, 0x3fd53ab8UL, 0x6574bc54UL, 0x3e5ee859UL, 0x80000000UL,
- 0x3fd5128eUL, 0xea902207UL, 0x3e5f6188UL, 0xc0000000UL, 0x3fd4ea75UL,
- 0x9f911d79UL, 0x3e511735UL, 0x80000000UL, 0x3fd4c26eUL, 0xf9c77397UL,
- 0xbe5b1643UL, 0x40000000UL, 0x3fd49a78UL, 0x15fc9258UL, 0x3e479a37UL,
- 0x80000000UL, 0x3fd47293UL, 0xd5a04dd9UL, 0xbe426e56UL, 0xc0000000UL,
- 0x3fd44abfUL, 0xe04042f5UL, 0x3e56f7c6UL, 0x40000000UL, 0x3fd422fdUL,
- 0x1d8bf2c8UL, 0x3e5d8810UL, 0x00000000UL, 0x3fd3fb4cUL, 0x88a8ddeeUL,
- 0xbe311454UL, 0xc0000000UL, 0x3fd3d3abUL, 0x3e3b5e47UL, 0xbe5d1b72UL,
- 0x40000000UL, 0x3fd3ac1cUL, 0xc2ab5d59UL, 0x3e31b02bUL, 0xc0000000UL,
- 0x3fd3849dUL, 0xd4e34b9eUL, 0x3e51cb2fUL, 0x40000000UL, 0x3fd35d30UL,
- 0x177204fbUL, 0xbe2b8cd7UL, 0x80000000UL, 0x3fd335d3UL, 0xfcd38c82UL,
- 0xbe4356e1UL, 0x80000000UL, 0x3fd30e87UL, 0x64f54accUL, 0xbe4e6224UL,
- 0x00000000UL, 0x3fd2e74cUL, 0xaa7975d9UL, 0x3e5dc0feUL, 0x80000000UL,
- 0x3fd2c021UL, 0x516dab3fUL, 0xbe50ffa3UL, 0x40000000UL, 0x3fd29907UL,
- 0x2bfb7313UL, 0x3e5674a2UL, 0xc0000000UL, 0x3fd271fdUL, 0x0549fc99UL,
- 0x3e385d29UL, 0xc0000000UL, 0x3fd24b04UL, 0x55b63073UL, 0xbe500c6dUL,
- 0x00000000UL, 0x3fd2241cUL, 0x3f91953aUL, 0x3e389977UL, 0xc0000000UL,
- 0x3fd1fd43UL, 0xa1543f71UL, 0xbe3487abUL, 0xc0000000UL, 0x3fd1d67bUL,
- 0x4ec8867cUL, 0x3df6a2dcUL, 0x00000000UL, 0x3fd1afc4UL, 0x4328e3bbUL,
- 0x3e41d9c0UL, 0x80000000UL, 0x3fd1891cUL, 0x2e1cda84UL, 0x3e3bdd87UL,
- 0x40000000UL, 0x3fd16285UL, 0x4b5331aeUL, 0xbe53128eUL, 0x00000000UL,
- 0x3fd13bfeUL, 0xb9aec164UL, 0xbe52ac98UL, 0xc0000000UL, 0x3fd11586UL,
- 0xd91e1316UL, 0xbe350630UL, 0x80000000UL, 0x3fd0ef1fUL, 0x7cacc12cUL,
- 0x3e3f5219UL, 0x40000000UL, 0x3fd0c8c8UL, 0xbce277b7UL, 0x3e3d30c0UL,
- 0x00000000UL, 0x3fd0a281UL, 0x2a63447dUL, 0xbe541377UL, 0x80000000UL,
- 0x3fd07c49UL, 0xfac483b5UL, 0xbe5772ecUL, 0xc0000000UL, 0x3fd05621UL,
- 0x36b8a570UL, 0xbe4fd4bdUL, 0xc0000000UL, 0x3fd03009UL, 0xbae505f7UL,
- 0xbe450388UL, 0x80000000UL, 0x3fd00a01UL, 0x3e35aeadUL, 0xbe5430fcUL,
- 0x80000000UL, 0x3fcfc811UL, 0x707475acUL, 0x3e38806eUL, 0x80000000UL,
- 0x3fcf7c3fUL, 0xc91817fcUL, 0xbe40cceaUL, 0x80000000UL, 0x3fcf308cUL,
- 0xae05d5e9UL, 0xbe4919b8UL, 0x80000000UL, 0x3fcee4f8UL, 0xae6cc9e6UL,
- 0xbe530b94UL, 0x00000000UL, 0x3fce9983UL, 0x1efe3e8eUL, 0x3e57747eUL,
- 0x00000000UL, 0x3fce4e2dUL, 0xda78d9bfUL, 0xbe59a608UL, 0x00000000UL,
- 0x3fce02f5UL, 0x8abe2c2eUL, 0x3e4a35adUL, 0x00000000UL, 0x3fcdb7dcUL,
- 0x1495450dUL, 0xbe0872ccUL, 0x80000000UL, 0x3fcd6ce1UL, 0x86ee0ba0UL,
- 0xbe4f59a0UL, 0x00000000UL, 0x3fcd2205UL, 0xe81ca888UL, 0x3e5402c3UL,
- 0x00000000UL, 0x3fccd747UL, 0x3b4424b9UL, 0x3e5dfdc3UL, 0x80000000UL,
- 0x3fcc8ca7UL, 0xd305b56cUL, 0x3e202da6UL, 0x00000000UL, 0x3fcc4226UL,
- 0x399a6910UL, 0xbe482a1cUL, 0x80000000UL, 0x3fcbf7c2UL, 0x747f7938UL,
- 0xbe587372UL, 0x80000000UL, 0x3fcbad7cUL, 0x6fc246a0UL, 0x3e50d83dUL,
- 0x00000000UL, 0x3fcb6355UL, 0xee9e9be5UL, 0xbe5c35bdUL, 0x80000000UL,
- 0x3fcb194aUL, 0x8416c0bcUL, 0x3e546d4fUL, 0x00000000UL, 0x3fcacf5eUL,
- 0x49f7f08fUL, 0x3e56da76UL, 0x00000000UL, 0x3fca858fUL, 0x5dc30de2UL,
- 0x3e5f390cUL, 0x00000000UL, 0x3fca3bdeUL, 0x950583b6UL, 0xbe5e4169UL,
- 0x80000000UL, 0x3fc9f249UL, 0x33631553UL, 0x3e52aeb1UL, 0x00000000UL,
- 0x3fc9a8d3UL, 0xde8795a6UL, 0xbe59a504UL, 0x00000000UL, 0x3fc95f79UL,
- 0x076bf41eUL, 0x3e5122feUL, 0x80000000UL, 0x3fc9163cUL, 0x2914c8e7UL,
- 0x3e3dd064UL, 0x00000000UL, 0x3fc8cd1dUL, 0x3a30eca3UL, 0xbe21b4aaUL,
- 0x80000000UL, 0x3fc8841aUL, 0xb2a96650UL, 0xbe575444UL, 0x80000000UL,
- 0x3fc83b34UL, 0x2376c0cbUL, 0xbe2a74c7UL, 0x80000000UL, 0x3fc7f26bUL,
- 0xd8a0b653UL, 0xbe5181b6UL, 0x00000000UL, 0x3fc7a9bfUL, 0x32257882UL,
- 0xbe4a78b4UL, 0x00000000UL, 0x3fc7612fUL, 0x1eee8bd9UL, 0xbe1bfe9dUL,
- 0x80000000UL, 0x3fc718bbUL, 0x0c603cc4UL, 0x3e36fdc9UL, 0x80000000UL,
- 0x3fc6d064UL, 0x3728b8cfUL, 0xbe1e542eUL, 0x80000000UL, 0x3fc68829UL,
- 0xc79a4067UL, 0x3e5c380fUL, 0x00000000UL, 0x3fc6400bUL, 0xf69eac69UL,
- 0x3e550a84UL, 0x80000000UL, 0x3fc5f808UL, 0xb7a780a4UL, 0x3e5d9224UL,
- 0x80000000UL, 0x3fc5b022UL, 0xad9dfb1eUL, 0xbe55242fUL, 0x00000000UL,
- 0x3fc56858UL, 0x659b18beUL, 0xbe4bfda3UL, 0x80000000UL, 0x3fc520a9UL,
- 0x66ee3631UL, 0xbe57d769UL, 0x80000000UL, 0x3fc4d916UL, 0x1ec62819UL,
- 0x3e2427f7UL, 0x80000000UL, 0x3fc4919fUL, 0xdec25369UL, 0xbe435431UL,
- 0x00000000UL, 0x3fc44a44UL, 0xa8acfc4bUL, 0xbe3c62e8UL, 0x00000000UL,
- 0x3fc40304UL, 0xcf1d3eabUL, 0xbdfba29fUL, 0x80000000UL, 0x3fc3bbdfUL,
- 0x79aba3eaUL, 0xbdf1b7c8UL, 0x80000000UL, 0x3fc374d6UL, 0xb8d186daUL,
- 0xbe5130cfUL, 0x80000000UL, 0x3fc32de8UL, 0x9d74f152UL, 0x3e2285b6UL,
- 0x00000000UL, 0x3fc2e716UL, 0x50ae7ca9UL, 0xbe503920UL, 0x80000000UL,
- 0x3fc2a05eUL, 0x6caed92eUL, 0xbe533924UL, 0x00000000UL, 0x3fc259c2UL,
- 0x9cb5034eUL, 0xbe510e31UL, 0x80000000UL, 0x3fc21340UL, 0x12c4d378UL,
- 0xbe540b43UL, 0x80000000UL, 0x3fc1ccd9UL, 0xcc418706UL, 0x3e59887aUL,
- 0x00000000UL, 0x3fc1868eUL, 0x921f4106UL, 0xbe528e67UL, 0x80000000UL,
- 0x3fc1405cUL, 0x3969441eUL, 0x3e5d8051UL, 0x00000000UL, 0x3fc0fa46UL,
- 0xd941ef5bUL, 0x3e5f9079UL, 0x80000000UL, 0x3fc0b44aUL, 0x5a3e81b2UL,
- 0xbe567691UL, 0x00000000UL, 0x3fc06e69UL, 0x9d66afe7UL, 0xbe4d43fbUL,
- 0x00000000UL, 0x3fc028a2UL, 0x0a92a162UL, 0xbe52f394UL, 0x00000000UL,
- 0x3fbfc5eaUL, 0x209897e5UL, 0x3e529e37UL, 0x00000000UL, 0x3fbf3ac5UL,
- 0x8458bd7bUL, 0x3e582831UL, 0x00000000UL, 0x3fbeafd5UL, 0xb8d8b4b8UL,
- 0xbe486b4aUL, 0x00000000UL, 0x3fbe2518UL, 0xe0a3b7b6UL, 0x3e5bafd2UL,
- 0x00000000UL, 0x3fbd9a90UL, 0x2bf2710eUL, 0x3e383b2bUL, 0x00000000UL,
- 0x3fbd103cUL, 0x73eb6ab7UL, 0xbe56d78dUL, 0x00000000UL, 0x3fbc861bUL,
- 0x32ceaff5UL, 0xbe32dc5aUL, 0x00000000UL, 0x3fbbfc2eUL, 0xbee04cb7UL,
- 0xbe4a71a4UL, 0x00000000UL, 0x3fbb7274UL, 0x35ae9577UL, 0x3e38142fUL,
- 0x00000000UL, 0x3fbae8eeUL, 0xcbaddab4UL, 0xbe5490f0UL, 0x00000000UL,
- 0x3fba5f9aUL, 0x95ce1114UL, 0x3e597c71UL, 0x00000000UL, 0x3fb9d67aUL,
- 0x6d7c0f78UL, 0x3e3abc2dUL, 0x00000000UL, 0x3fb94d8dUL, 0x2841a782UL,
- 0xbe566cbcUL, 0x00000000UL, 0x3fb8c4d2UL, 0x6ed429c6UL, 0xbe3cfff9UL,
- 0x00000000UL, 0x3fb83c4aUL, 0xe4a49fbbUL, 0xbe552964UL, 0x00000000UL,
- 0x3fb7b3f4UL, 0x2193d81eUL, 0xbe42fa72UL, 0x00000000UL, 0x3fb72bd0UL,
- 0xdd70c122UL, 0x3e527a8cUL, 0x00000000UL, 0x3fb6a3dfUL, 0x03108a54UL,
- 0xbe450393UL, 0x00000000UL, 0x3fb61c1fUL, 0x30ff7954UL, 0x3e565840UL,
- 0x00000000UL, 0x3fb59492UL, 0xdedd460cUL, 0xbe5422b5UL, 0x00000000UL,
- 0x3fb50d36UL, 0x950f9f45UL, 0xbe5313f6UL, 0x00000000UL, 0x3fb4860bUL,
- 0x582cdcb1UL, 0x3e506d39UL, 0x00000000UL, 0x3fb3ff12UL, 0x7216d3a6UL,
- 0x3e4aa719UL, 0x00000000UL, 0x3fb3784aUL, 0x57a423fdUL, 0x3e5a9b9fUL,
- 0x00000000UL, 0x3fb2f1b4UL, 0x7a138b41UL, 0xbe50b418UL, 0x00000000UL,
- 0x3fb26b4eUL, 0x2fbfd7eaUL, 0x3e23a53eUL, 0x00000000UL, 0x3fb1e519UL,
- 0x18913ccbUL, 0x3e465fc1UL, 0x00000000UL, 0x3fb15f15UL, 0x7ea24e21UL,
- 0x3e042843UL, 0x00000000UL, 0x3fb0d941UL, 0x7c6d9c77UL, 0x3e59f61eUL,
- 0x00000000UL, 0x3fb0539eUL, 0x114efd44UL, 0x3e4ccab7UL, 0x00000000UL,
- 0x3faf9c56UL, 0x1777f657UL, 0x3e552f65UL, 0x00000000UL, 0x3fae91d2UL,
- 0xc317b86aUL, 0xbe5a61e0UL, 0x00000000UL, 0x3fad87acUL, 0xb7664efbUL,
- 0xbe41f64eUL, 0x00000000UL, 0x3fac7de6UL, 0x5d3d03a9UL, 0x3e0807a0UL,
- 0x00000000UL, 0x3fab7480UL, 0x743c38ebUL, 0xbe3726e1UL, 0x00000000UL,
- 0x3faa6b78UL, 0x06a253f1UL, 0x3e5ad636UL, 0x00000000UL, 0x3fa962d0UL,
- 0xa35f541bUL, 0x3e5a187aUL, 0x00000000UL, 0x3fa85a88UL, 0x4b86e446UL,
- 0xbe508150UL, 0x00000000UL, 0x3fa7529cUL, 0x2589cacfUL, 0x3e52938aUL,
- 0x00000000UL, 0x3fa64b10UL, 0xaf6b11f2UL, 0xbe3454cdUL, 0x00000000UL,
- 0x3fa543e2UL, 0x97506fefUL, 0xbe5fdec5UL, 0x00000000UL, 0x3fa43d10UL,
- 0xe75f7dd9UL, 0xbe388dd3UL, 0x00000000UL, 0x3fa3369cUL, 0xa4139632UL,
- 0xbdea5177UL, 0x00000000UL, 0x3fa23086UL, 0x352d6f1eUL, 0xbe565ad6UL,
- 0x00000000UL, 0x3fa12accUL, 0x77449eb7UL, 0xbe50d5c7UL, 0x00000000UL,
- 0x3fa0256eUL, 0x7478da78UL, 0x3e404724UL, 0x00000000UL, 0x3f9e40dcUL,
- 0xf59cef7fUL, 0xbe539d0aUL, 0x00000000UL, 0x3f9c3790UL, 0x1511d43cUL,
- 0x3e53c2c8UL, 0x00000000UL, 0x3f9a2f00UL, 0x9b8bff3cUL, 0xbe43b3e1UL,
- 0x00000000UL, 0x3f982724UL, 0xad1e22a5UL, 0x3e46f0bdUL, 0x00000000UL,
- 0x3f962000UL, 0x130d9356UL, 0x3e475ba0UL, 0x00000000UL, 0x3f941994UL,
- 0x8f86f883UL, 0xbe513d0bUL, 0x00000000UL, 0x3f9213dcUL, 0x914d0dc8UL,
- 0xbe534335UL, 0x00000000UL, 0x3f900ed8UL, 0x2d73e5e7UL, 0xbe22ba75UL,
- 0x00000000UL, 0x3f8c1510UL, 0xc5b7d70eUL, 0x3e599c5dUL, 0x00000000UL,
- 0x3f880de0UL, 0x8a27857eUL, 0xbe3d28c8UL, 0x00000000UL, 0x3f840810UL,
- 0xda767328UL, 0x3e531b3dUL, 0x00000000UL, 0x3f8003b0UL, 0x77bacaf3UL,
- 0xbe5f04e3UL, 0x00000000UL, 0x3f780150UL, 0xdf4b0720UL, 0x3e5a8bffUL,
- 0x00000000UL, 0x3f6ffc40UL, 0x34c48e71UL, 0xbe3fcd99UL, 0x00000000UL,
- 0x3f5ff6c0UL, 0x1ad218afUL, 0xbe4c78a7UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x80000000UL
-};
-
-ALIGNED_(8) juint _log2_pow[] =
-{
- 0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
-};
-
-//registers,
-// input: xmm0, xmm1
-// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
-// rax, rdx, rcx, r8, r11
-
-// Code generated by Intel C compiler for LIBM library
-
-void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
- Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
- Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
- Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
- Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, L_2TAG_PACKET_14_0_2, L_2TAG_PACKET_15_0_2;
- Label L_2TAG_PACKET_16_0_2, L_2TAG_PACKET_17_0_2, L_2TAG_PACKET_18_0_2, L_2TAG_PACKET_19_0_2;
- Label L_2TAG_PACKET_20_0_2, L_2TAG_PACKET_21_0_2, L_2TAG_PACKET_22_0_2, L_2TAG_PACKET_23_0_2;
- Label L_2TAG_PACKET_24_0_2, L_2TAG_PACKET_25_0_2, L_2TAG_PACKET_26_0_2, L_2TAG_PACKET_27_0_2;
- Label L_2TAG_PACKET_28_0_2, L_2TAG_PACKET_29_0_2, L_2TAG_PACKET_30_0_2, L_2TAG_PACKET_31_0_2;
- Label L_2TAG_PACKET_32_0_2, L_2TAG_PACKET_33_0_2, L_2TAG_PACKET_34_0_2, L_2TAG_PACKET_35_0_2;
- Label L_2TAG_PACKET_36_0_2, L_2TAG_PACKET_37_0_2, L_2TAG_PACKET_38_0_2, L_2TAG_PACKET_39_0_2;
- Label L_2TAG_PACKET_40_0_2, L_2TAG_PACKET_41_0_2, L_2TAG_PACKET_42_0_2, L_2TAG_PACKET_43_0_2;
- Label L_2TAG_PACKET_44_0_2, L_2TAG_PACKET_45_0_2, L_2TAG_PACKET_46_0_2, L_2TAG_PACKET_47_0_2;
- Label L_2TAG_PACKET_48_0_2, L_2TAG_PACKET_49_0_2, L_2TAG_PACKET_50_0_2, L_2TAG_PACKET_51_0_2;
- Label L_2TAG_PACKET_52_0_2, L_2TAG_PACKET_53_0_2, L_2TAG_PACKET_54_0_2, L_2TAG_PACKET_55_0_2;
- Label L_2TAG_PACKET_56_0_2;
- Label B1_2, B1_3, B1_5, start;
-
- assert_different_registers(tmp1, tmp2, eax, ecx, edx);
- jmp(start);
- address HIGHSIGMASK = (address)_HIGHSIGMASK;
- address LOG2_E = (address)_LOG2_E;
- address coeff = (address)_coeff_pow;
- address L_tbl = (address)_L_tbl_pow;
- address HIGHMASK_Y = (address)_HIGHMASK_Y;
- address T_exp = (address)_T_exp;
- address e_coeff = (address)_e_coeff;
- address coeff_h = (address)_coeff_h;
- address HIGHMASK_LOG_X = (address)_HIGHMASK_LOG_X;
- address HALFMASK = (address)_HALFMASK;
- address log2 = (address)_log2_pow;
-
-
- bind(start);
- subq(rsp, 40);
- movsd(Address(rsp, 8), xmm0);
- movsd(Address(rsp, 16), xmm1);
-
- bind(B1_2);
- pextrw(eax, xmm0, 3);
- xorpd(xmm2, xmm2);
- mov64(tmp2, 0x3ff0000000000000);
- movdq(xmm2, tmp2);
- movl(tmp1, 1069088768);
- movdq(xmm7, tmp1);
- xorpd(xmm1, xmm1);
- mov64(tmp3, 0x77f0000000000000);
- movdq(xmm1, tmp3);
- movdqu(xmm3, xmm0);
- movl(edx, 32752);
- andl(edx, eax);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- por(xmm0, xmm2);
- movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
- psrlq(xmm0, 27);
- movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
- psrld(xmm0, 2);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- rcpps(xmm0, xmm0);
- psllq(xmm3, 12);
- movl(tmp4, 8192);
- movdq(xmm4, tmp4);
- psrlq(xmm3, 12);
- subl(eax, 16);
- cmpl(eax, 32736);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
- movl(tmp1, 0);
-
- bind(L_2TAG_PACKET_1_0_2);
- mulss(xmm0, xmm7);
- movl(edx, -1);
- subl(ecx, 4);
- shll(edx);
- shlq(edx, 32);
- movdq(xmm5, edx);
- por(xmm3, xmm1);
- subl(eax, 16351);
- cmpl(eax, 1);
- jcc(Assembler::belowEqual, L_2TAG_PACKET_2_0_2);
- paddd(xmm0, xmm4);
- pand(xmm5, xmm3);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
-
- bind(L_2TAG_PACKET_3_0_2);
- subsd(xmm3, xmm5);
- pand(xmm0, xmm6);
- subl(eax, 1);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
-
- bind(L_2TAG_PACKET_4_0_2);
- mulsd(xmm3, xmm0);
- movdqu(xmm1, ExternalAddress(coeff)); //0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL
- lea(tmp4, ExternalAddress(L_tbl));
- subsd(xmm5, xmm2);
- movdqu(xmm4, ExternalAddress(16 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL
- movl(ecx, eax);
- sarl(eax, 31);
- addl(ecx, eax);
- xorl(eax, ecx);
- addl(eax, 1);
- bsrl(eax, eax);
- unpcklpd(xmm5, xmm3);
- movdqu(xmm6, ExternalAddress(32 + coeff)); //0x518775e3UL, 0x3f9004f2UL, 0xac8349bbUL, 0x3fa76c9bUL
- addsd(xmm3, xmm5);
- andl(edx, 16760832);
- shrl(edx, 10);
- addpd(xmm5, Address(tmp4, edx, Address::times_1, -3648));
- movdqu(xmm0, ExternalAddress(48 + coeff)); //0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL
- pshufd(xmm2, xmm3, 68);
- mulsd(xmm3, xmm3);
- mulpd(xmm1, xmm2);
- mulpd(xmm4, xmm2);
- addsd(xmm5, xmm7);
- mulsd(xmm2, xmm3);
- addpd(xmm6, xmm1);
- mulsd(xmm3, xmm3);
- addpd(xmm0, xmm4);
- movq(xmm1, Address(rsp, 16));
- movw(ecx, Address(rsp, 22));
- pshufd(xmm7, xmm5, 238);
- movq(xmm4, ExternalAddress(HIGHMASK_Y)); //0x00000000UL, 0xfffffff8UL, 0x00000000UL, 0xffffffffUL
- mulpd(xmm6, xmm2);
- pshufd(xmm3, xmm3, 68);
- mulpd(xmm0, xmm2);
- shll(eax, 4);
- subl(eax, 15872);
- andl(ecx, 32752);
- addl(eax, ecx);
- mulpd(xmm3, xmm6);
- cmpl(eax, 624);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
- xorpd(xmm6, xmm6);
- movl(edx, 17080);
- pinsrw(xmm6, edx, 3);
- movdqu(xmm2, xmm1);
- pand(xmm4, xmm1);
- subsd(xmm1, xmm4);
- mulsd(xmm4, xmm5);
- addsd(xmm0, xmm7);
- mulsd(xmm1, xmm5);
- movdqu(xmm7, xmm6);
- addsd(xmm6, xmm4);
- lea(tmp4, ExternalAddress(T_exp));
- addpd(xmm3, xmm0);
- movdl(edx, xmm6);
- subsd(xmm6, xmm7);
- pshufd(xmm0, xmm3, 238);
- subsd(xmm4, xmm6);
- addsd(xmm0, xmm3);
- movl(ecx, edx);
- andl(edx, 255);
- addl(edx, edx);
- movdqu(xmm5, Address(tmp4, edx, Address::times_8, 0));
- addsd(xmm4, xmm1);
- mulsd(xmm2, xmm0);
- movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
- movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
- shll(ecx, 12);
- xorl(ecx, tmp1);
- andl(rcx, -1048576);
- movdq(xmm6, rcx);
- addsd(xmm2, xmm4);
- mov64(tmp2, 0x3fe62e42fefa39ef);
- movdq(xmm1, tmp2);
- pshufd(xmm0, xmm2, 68);
- pshufd(xmm4, xmm2, 68);
- mulsd(xmm1, xmm2);
- pshufd(xmm6, xmm6, 17);
- mulpd(xmm0, xmm0);
- mulpd(xmm7, xmm4);
- paddd(xmm5, xmm6);
- mulsd(xmm1, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulsd(xmm0, xmm0);
- addpd(xmm3, xmm7);
- addsd(xmm1, xmm6);
- mulpd(xmm0, xmm3);
- pshufd(xmm3, xmm0, 238);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm3);
- addsd(xmm0, xmm5);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_0_0_2);
- addl(eax, 16);
- movl(edx, 32752);
- andl(edx, eax);
- cmpl(edx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_6_0_2);
- testl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_7_0_2);
-
- bind(L_2TAG_PACKET_8_0_2);
- movq(xmm0, Address(rsp, 8));
- movq(xmm3, Address(rsp, 8));
- movdl(edx, xmm3);
- psrlq(xmm3, 32);
- movdl(ecx, xmm3);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
- xorpd(xmm3, xmm3);
- movl(eax, 18416);
- pinsrw(xmm3, eax, 3);
- mulsd(xmm0, xmm3);
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm3, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- movl(ecx, 18416);
- psrlq(xmm0, 27);
- movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
- psrld(xmm0, 2);
- rcpps(xmm0, xmm0);
- psllq(xmm3, 12);
- movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
- psrlq(xmm3, 12);
- mulss(xmm0, xmm7);
- movl(edx, -1024);
- movdl(xmm5, edx);
- por(xmm3, xmm1);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm3);
- movl(tmp1, 0);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- andl(eax, 32752);
- subl(eax, 18416);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- jmp(L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_10_0_2);
- movq(xmm0, Address(rsp, 8));
- movq(xmm3, Address(rsp, 8));
- movdl(edx, xmm3);
- psrlq(xmm3, 32);
- movdl(ecx, xmm3);
- orl(edx, ecx);
- cmpl(edx, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
- xorpd(xmm3, xmm3);
- movl(eax, 18416);
- pinsrw(xmm3, eax, 3);
- mulsd(xmm0, xmm3);
- xorpd(xmm2, xmm2);
- movl(eax, 16368);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm3, xmm0);
- pextrw(eax, xmm0, 3);
- por(xmm0, xmm2);
- movl(ecx, 18416);
- psrlq(xmm0, 27);
- movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
- psrld(xmm0, 2);
- rcpps(xmm0, xmm0);
- psllq(xmm3, 12);
- movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
- psrlq(xmm3, 12);
- mulss(xmm0, xmm7);
- movl(edx, -1024);
- movdl(xmm5, edx);
- por(xmm3, xmm1);
- paddd(xmm0, xmm4);
- psllq(xmm5, 32);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- pand(xmm5, xmm3);
- movl(tmp1, INT_MIN);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- andl(eax, 32752);
- subl(eax, 18416);
- sarl(eax, 4);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- jmp(L_2TAG_PACKET_4_0_2);
-
- bind(L_2TAG_PACKET_5_0_2);
- cmpl(eax, 0);
- jcc(Assembler::less, L_2TAG_PACKET_11_0_2);
- cmpl(eax, 752);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_12_0_2);
- addsd(xmm0, xmm7);
- movq(xmm2, ExternalAddress(HALFMASK)); //0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL
- addpd(xmm3, xmm0);
- xorpd(xmm6, xmm6);
- movl(eax, 17080);
- pinsrw(xmm6, eax, 3);
- pshufd(xmm0, xmm3, 238);
- addsd(xmm0, xmm3);
- movdqu(xmm3, xmm5);
- addsd(xmm5, xmm0);
- movdqu(xmm4, xmm2);
- subsd(xmm3, xmm5);
- movdqu(xmm7, xmm5);
- pand(xmm5, xmm2);
- movdqu(xmm2, xmm1);
- pand(xmm4, xmm1);
- subsd(xmm7, xmm5);
- addsd(xmm0, xmm3);
- subsd(xmm1, xmm4);
- mulsd(xmm4, xmm5);
- addsd(xmm0, xmm7);
- mulsd(xmm2, xmm0);
- movdqu(xmm7, xmm6);
- mulsd(xmm1, xmm5);
- addsd(xmm6, xmm4);
- movdl(eax, xmm6);
- subsd(xmm6, xmm7);
- lea(tmp4, ExternalAddress(T_exp));
- addsd(xmm2, xmm1);
- movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
- movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
- subsd(xmm4, xmm6);
- pextrw(edx, xmm6, 3);
- movl(ecx, eax);
- andl(eax, 255);
- addl(eax, eax);
- movdqu(xmm5, Address(tmp4, rax, Address::times_8, 0));
- addsd(xmm2, xmm4);
- sarl(ecx, 8);
- movl(eax, ecx);
- sarl(ecx, 1);
- subl(eax, ecx);
- shll(ecx, 20);
- xorl(ecx, tmp1);
- movdl(xmm6, ecx);
- movq(xmm1, ExternalAddress(32 + e_coeff)); //0xfefa39efUL, 0x3fe62e42UL, 0x00000000UL, 0x00000000UL
- andl(edx, 32767);
- cmpl(edx, 16529);
- jcc(Assembler::above, L_2TAG_PACKET_12_0_2);
- pshufd(xmm0, xmm2, 68);
- pshufd(xmm4, xmm2, 68);
- mulpd(xmm0, xmm0);
- mulpd(xmm7, xmm4);
- pshufd(xmm6, xmm6, 17);
- mulsd(xmm1, xmm2);
- mulsd(xmm0, xmm0);
- paddd(xmm5, xmm6);
- addpd(xmm3, xmm7);
- mulsd(xmm1, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulpd(xmm0, xmm3);
- addsd(xmm1, xmm6);
- pshufd(xmm3, xmm0, 238);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- shll(eax, 4);
- xorpd(xmm4, xmm4);
- addl(eax, 16368);
- pinsrw(xmm4, eax, 3);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm3);
- movdqu(xmm1, xmm0);
- addsd(xmm0, xmm5);
- mulsd(xmm0, xmm4);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_13_0_2);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_14_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_6_0_2);
- movq(xmm1, Address(rsp, 16));
- movq(xmm0, Address(rsp, 8));
- movdqu(xmm2, xmm0);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_15_0_2);
- movdl(eax, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
- addsd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_16_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- movl(Address(rsp, 0), 29);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_18_0_2);
- movq(xmm0, Address(rsp, 16));
- addpd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_15_0_2);
- movdl(eax, xmm1);
- movdqu(xmm2, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_19_0_2);
- pextrw(eax, xmm2, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_20_0_2);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_20_0_2);
- pextrw(eax, xmm0, 3);
- testl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_21_0_2);
- testl(ecx, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_23_0_2);
- movq(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
- testl(eax, 2);
- jcc(Assembler::notEqual, L_2TAG_PACKET_25_0_2);
- jmp(L_2TAG_PACKET_24_0_2);
-
- bind(L_2TAG_PACKET_21_0_2);
- shrl(ecx, 20);
- andl(ecx, 2047);
- cmpl(ecx, 1075);
- jcc(Assembler::above, L_2TAG_PACKET_24_0_2);
- jcc(Assembler::equal, L_2TAG_PACKET_26_0_2);
- cmpl(ecx, 1074);
- jcc(Assembler::above, L_2TAG_PACKET_23_0_2);
- cmpl(ecx, 1023);
- jcc(Assembler::below, L_2TAG_PACKET_24_0_2);
- movq(xmm1, Address(rsp, 16));
- movl(eax, 17208);
- xorpd(xmm3, xmm3);
- pinsrw(xmm3, eax, 3);
- movdqu(xmm4, xmm3);
- addsd(xmm3, xmm1);
- subsd(xmm4, xmm3);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
- movdl(eax, xmm3);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_24_0_2);
-
- bind(L_2TAG_PACKET_25_0_2);
- movq(xmm1, Address(rsp, 16));
- pextrw(eax, xmm1, 3);
- andl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_27_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_27_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32768);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_24_0_2);
- movq(xmm1, Address(rsp, 16));
- pextrw(eax, xmm1, 3);
- andl(eax, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32752);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_26_0_2);
- movq(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_24_0_2);
- jmp(L_2TAG_PACKET_25_0_2);
-
- bind(L_2TAG_PACKET_28_0_2);
- movdl(eax, xmm1);
- psrlq(xmm1, 20);
- movdl(edx, xmm1);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_29_0_2);
- movq(xmm0, Address(rsp, 16));
- addsd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_29_0_2);
- movq(xmm0, Address(rsp, 8));
- pextrw(eax, xmm0, 3);
- cmpl(eax, 49136);
- jcc(Assembler::notEqual, L_2TAG_PACKET_30_0_2);
- movdl(ecx, xmm0);
- psrlq(xmm0, 20);
- movdl(edx, xmm0);
- orl(ecx, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_30_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32760);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_30_0_2);
- movq(xmm1, Address(rsp, 16));
- andl(eax, 32752);
- subl(eax, 16368);
- pextrw(edx, xmm1, 3);
- xorpd(xmm0, xmm0);
- xorl(eax, edx);
- andl(eax, 32768);
- jcc(Assembler::equal, L_2TAG_PACKET_31_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_31_0_2);
- movl(ecx, 32752);
- pinsrw(xmm0, ecx, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_32_0_2);
- movdl(eax, xmm1);
- cmpl(edx, 17184);
- jcc(Assembler::above, L_2TAG_PACKET_33_0_2);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
- testl(eax, 2);
- jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
- jmp(L_2TAG_PACKET_36_0_2);
-
- bind(L_2TAG_PACKET_33_0_2);
- testl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
- jmp(L_2TAG_PACKET_36_0_2);
-
- bind(L_2TAG_PACKET_7_0_2);
- movq(xmm2, Address(rsp, 8));
- movdl(eax, xmm2);
- psrlq(xmm2, 31);
- movdl(ecx, xmm2);
- orl(eax, ecx);
- jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
- movq(xmm1, Address(rsp, 16));
- pextrw(edx, xmm1, 3);
- movdl(eax, xmm1);
- movdqu(xmm2, xmm1);
- psrlq(xmm2, 32);
- movdl(ecx, xmm2);
- addl(ecx, ecx);
- orl(ecx, eax);
- jcc(Assembler::equal, L_2TAG_PACKET_37_0_2);
- andl(edx, 32752);
- cmpl(edx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
- cmpl(edx, 17200);
- jcc(Assembler::above, L_2TAG_PACKET_35_0_2);
- cmpl(edx, 17184);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_32_0_2);
- cmpl(edx, 16368);
- jcc(Assembler::below, L_2TAG_PACKET_34_0_2);
- movl(eax, 17208);
- xorpd(xmm2, xmm2);
- pinsrw(xmm2, eax, 3);
- movdqu(xmm4, xmm2);
- addsd(xmm2, xmm1);
- subsd(xmm4, xmm2);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32767);
- jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
- movdl(eax, xmm2);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
-
- bind(L_2TAG_PACKET_36_0_2);
- xorpd(xmm1, xmm1);
- movl(edx, 30704);
- pinsrw(xmm1, edx, 3);
- movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
- movq(xmm4, Address(rsp, 8));
- pextrw(eax, xmm4, 3);
- movl(edx, 8192);
- movdl(xmm4, edx);
- andl(eax, 32767);
- subl(eax, 16);
- jcc(Assembler::less, L_2TAG_PACKET_10_0_2);
- movl(edx, eax);
- andl(edx, 32752);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- movl(tmp1, INT_MIN);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_34_0_2);
- xorpd(xmm1, xmm1);
- movl(eax, 32752);
- pinsrw(xmm1, eax, 3);
- xorpd(xmm0, xmm0);
- mulsd(xmm0, xmm1);
- movl(Address(rsp, 0), 28);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_35_0_2);
- xorpd(xmm1, xmm1);
- movl(edx, 30704);
- pinsrw(xmm1, edx, 3);
- movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
- movq(xmm4, Address(rsp, 8));
- pextrw(eax, xmm4, 3);
- movl(edx, 8192);
- movdl(xmm4, edx);
- andl(eax, 32767);
- subl(eax, 16);
- jcc(Assembler::less, L_2TAG_PACKET_8_0_2);
- movl(edx, eax);
- andl(edx, 32752);
- subl(edx, 16368);
- movl(ecx, edx);
- sarl(edx, 31);
- addl(ecx, edx);
- xorl(ecx, edx);
- addl(ecx, 16);
- bsrl(ecx, ecx);
- movl(tmp1, 0);
- jmp(L_2TAG_PACKET_1_0_2);
-
- bind(L_2TAG_PACKET_19_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_22_0_2);
- xorpd(xmm0, xmm0);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_11_0_2);
- addl(eax, 384);
- cmpl(eax, 0);
- jcc(Assembler::less, L_2TAG_PACKET_38_0_2);
- mulsd(xmm5, xmm1);
- addsd(xmm0, xmm7);
- shrl(tmp1, 31);
- addpd(xmm3, xmm0);
- pshufd(xmm0, xmm3, 238);
- addsd(xmm3, xmm0);
- lea(tmp4, ExternalAddress(log2)); //0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
- movq(xmm4, Address(tmp4, tmp1, Address::times_8, 0));
- mulsd(xmm1, xmm3);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- shll(tmp1, 15);
- orl(eax, tmp1);
- pinsrw(xmm0, eax, 3);
- addsd(xmm5, xmm1);
- mulsd(xmm5, xmm4);
- addsd(xmm0, xmm5);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_38_0_2);
-
- bind(L_2TAG_PACKET_37_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_39_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 16368);
- pinsrw(xmm0, eax, 3);
- movl(Address(rsp, 0), 26);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_9_0_2);
- movq(xmm1, Address(rsp, 16));
- movdqu(xmm2, xmm1);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_40_0_2);
- movdl(eax, xmm2);
- psrlq(xmm2, 20);
- movdl(edx, xmm2);
- orl(eax, edx);
- jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
-
- bind(L_2TAG_PACKET_40_0_2);
- movdl(eax, xmm1);
- psrlq(xmm1, 32);
- movdl(edx, xmm1);
- movl(ecx, edx);
- addl(edx, edx);
- orl(eax, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_39_0_2);
- shrl(edx, 21);
- cmpl(edx, 1075);
- jcc(Assembler::above, L_2TAG_PACKET_41_0_2);
- jcc(Assembler::equal, L_2TAG_PACKET_42_0_2);
- cmpl(edx, 1023);
- jcc(Assembler::below, L_2TAG_PACKET_41_0_2);
- movq(xmm1, Address(rsp, 16));
- movl(eax, 17208);
- xorpd(xmm3, xmm3);
- pinsrw(xmm3, eax, 3);
- movdqu(xmm4, xmm3);
- addsd(xmm3, xmm1);
- subsd(xmm4, xmm3);
- addsd(xmm1, xmm4);
- pextrw(eax, xmm1, 3);
- andl(eax, 32752);
- jcc(Assembler::notEqual, L_2TAG_PACKET_41_0_2);
- movdl(eax, xmm3);
- andl(eax, 1);
- jcc(Assembler::equal, L_2TAG_PACKET_41_0_2);
-
- bind(L_2TAG_PACKET_43_0_2);
- movq(xmm0, Address(rsp, 8));
- testl(ecx, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_44_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_42_0_2);
- movq(xmm1, Address(rsp, 16));
- movdl(eax, xmm1);
- testl(eax, 1);
- jcc(Assembler::notEqual, L_2TAG_PACKET_43_0_2);
-
- bind(L_2TAG_PACKET_41_0_2);
- testl(ecx, INT_MIN);
- jcc(Assembler::equal, L_2TAG_PACKET_22_0_2);
- xorpd(xmm0, xmm0);
-
- bind(L_2TAG_PACKET_44_0_2);
- movl(eax, 16368);
- xorpd(xmm1, xmm1);
- pinsrw(xmm1, eax, 3);
- divsd(xmm1, xmm0);
- movdqu(xmm0, xmm1);
- movl(Address(rsp, 0), 27);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_12_0_2);
- movq(xmm2, Address(rsp, 8));
- movq(xmm6, Address(rsp, 16));
- pextrw(eax, xmm2, 3);
- pextrw(edx, xmm6, 3);
- movl(ecx, 32752);
- andl(ecx, edx);
- cmpl(ecx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
- andl(eax, 32752);
- subl(eax, 16368);
- xorl(edx, eax);
- testl(edx, 32768);
- jcc(Assembler::notEqual, L_2TAG_PACKET_46_0_2);
-
- bind(L_2TAG_PACKET_47_0_2);
- movl(eax, 32736);
- pinsrw(xmm0, eax, 3);
- shrl(tmp1, 16);
- orl(eax, tmp1);
- pinsrw(xmm1, eax, 3);
- mulsd(xmm0, xmm1);
-
- bind(L_2TAG_PACKET_14_0_2);
- movl(Address(rsp, 0), 24);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_46_0_2);
- movl(eax, 16);
- pinsrw(xmm0, eax, 3);
- mulsd(xmm0, xmm0);
- testl(tmp1, INT_MIN);
- jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
- mov64(tmp2, 0x8000000000000000);
- movdq(xmm2, tmp2);
- xorpd(xmm0, xmm2);
-
- bind(L_2TAG_PACKET_48_0_2);
- movl(Address(rsp, 0), 25);
- jmp(L_2TAG_PACKET_17_0_2);
-
- bind(L_2TAG_PACKET_13_0_2);
- pextrw(ecx, xmm5, 3);
- pextrw(edx, xmm4, 3);
- movl(eax, -1);
- andl(ecx, 32752);
- subl(ecx, 16368);
- andl(edx, 32752);
- addl(edx, ecx);
- movl(ecx, -31);
- sarl(edx, 4);
- subl(ecx, edx);
- jcc(Assembler::lessEqual, L_2TAG_PACKET_49_0_2);
- cmpl(ecx, 20);
- jcc(Assembler::above, L_2TAG_PACKET_50_0_2);
- shll(eax);
-
- bind(L_2TAG_PACKET_49_0_2);
- movdl(xmm0, eax);
- psllq(xmm0, 32);
- pand(xmm0, xmm5);
- subsd(xmm5, xmm0);
- addsd(xmm5, xmm1);
- mulsd(xmm0, xmm4);
- mulsd(xmm5, xmm4);
- addsd(xmm0, xmm5);
-
- bind(L_2TAG_PACKET_50_0_2);
- jmp(L_2TAG_PACKET_48_0_2);
-
- bind(L_2TAG_PACKET_2_0_2);
- movw(ecx, Address(rsp, 22));
- movl(edx, INT_MIN);
- movdl(xmm1, rdx);
- xorpd(xmm7, xmm7);
- paddd(xmm0, xmm4);
- movdl(edx, xmm0);
- psllq(xmm0, 29);
- paddq(xmm1, xmm3);
- pand(xmm5, xmm1);
- andl(ecx, 32752);
- cmpl(ecx, 16560);
- jcc(Assembler::less, L_2TAG_PACKET_3_0_2);
- pand(xmm0, xmm6);
- subsd(xmm3, xmm5);
- addl(eax, 16351);
- shrl(eax, 4);
- subl(eax, 1022);
- cvtsi2sdl(xmm7, eax);
- mulpd(xmm5, xmm0);
- lea(r11, ExternalAddress(L_tbl));
- movq(xmm4, ExternalAddress(coeff_h)); //0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
- mulsd(xmm3, xmm0);
- movq(xmm6, ExternalAddress(coeff_h)); //0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
- subsd(xmm5, xmm2);
- movq(xmm1, ExternalAddress(8 + coeff_h)); //0x00000000UL, 0xbf5dabe1UL
- pshufd(xmm2, xmm3, 68);
- unpcklpd(xmm5, xmm3);
- addsd(xmm3, xmm5);
- movq(xmm0, ExternalAddress(8 + coeff_h)); //0x00000000UL, 0xbf5dabe1UL
- andl(edx, 16760832);
- shrl(edx, 10);
- addpd(xmm7, Address(tmp4, edx, Address::times_1, -3648));
- mulsd(xmm4, xmm5);
- mulsd(xmm0, xmm5);
- mulsd(xmm6, xmm2);
- mulsd(xmm1, xmm2);
- movdqu(xmm2, xmm5);
- mulsd(xmm4, xmm5);
- addsd(xmm5, xmm0);
- movdqu(xmm0, xmm7);
- addsd(xmm2, xmm3);
- addsd(xmm7, xmm5);
- mulsd(xmm6, xmm2);
- subsd(xmm0, xmm7);
- movdqu(xmm2, xmm7);
- addsd(xmm7, xmm4);
- addsd(xmm0, xmm5);
- subsd(xmm2, xmm7);
- addsd(xmm4, xmm2);
- pshufd(xmm2, xmm5, 238);
- movdqu(xmm5, xmm7);
- addsd(xmm7, xmm2);
- addsd(xmm4, xmm0);
- movdqu(xmm0, ExternalAddress(coeff)); //0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL
- subsd(xmm5, xmm7);
- addsd(xmm6, xmm4);
- movdqu(xmm4, xmm7);
- addsd(xmm5, xmm2);
- addsd(xmm7, xmm1);
- movdqu(xmm2, ExternalAddress(64 + coeff)); //0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL
- subsd(xmm4, xmm7);
- addsd(xmm6, xmm5);
- addsd(xmm4, xmm1);
- pshufd(xmm5, xmm7, 238);
- movapd(xmm1, xmm7);
- addsd(xmm7, xmm5);
- subsd(xmm1, xmm7);
- addsd(xmm1, xmm5);
- movdqu(xmm5, ExternalAddress(80 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL
- pshufd(xmm3, xmm3, 68);
- addsd(xmm6, xmm4);
- addsd(xmm6, xmm1);
- movdqu(xmm1, ExternalAddress(32 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL
- mulpd(xmm0, xmm3);
- mulpd(xmm2, xmm3);
- pshufd(xmm4, xmm3, 68);
- mulpd(xmm3, xmm3);
- addpd(xmm0, xmm1);
- addpd(xmm5, xmm2);
- mulsd(xmm4, xmm3);
- movq(xmm2, ExternalAddress(HIGHMASK_LOG_X)); //0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xfffff800UL
- mulpd(xmm3, xmm3);
- movq(xmm1, Address(rsp, 16));
- movw(ecx, Address(rsp, 22));
- mulpd(xmm0, xmm4);
- pextrw(eax, xmm7, 3);
- mulpd(xmm5, xmm4);
- mulpd(xmm0, xmm3);
- movq(xmm4, ExternalAddress(8 + HIGHMASK_Y)); //0x00000000UL, 0xffffffffUL
- pand(xmm2, xmm7);
- addsd(xmm5, xmm6);
- subsd(xmm7, xmm2);
- addpd(xmm5, xmm0);
- andl(eax, 32752);
- subl(eax, 16368);
- andl(ecx, 32752);
- cmpl(ecx, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
- addl(ecx, eax);
- cmpl(ecx, 16576);
- jcc(Assembler::aboveEqual, L_2TAG_PACKET_51_0_2);
- pshufd(xmm0, xmm5, 238);
- pand(xmm4, xmm1);
- movdqu(xmm3, xmm1);
- addsd(xmm5, xmm0);
- subsd(xmm1, xmm4);
- xorpd(xmm6, xmm6);
- movl(edx, 17080);
- pinsrw(xmm6, edx, 3);
- addsd(xmm7, xmm5);
- mulsd(xmm4, xmm2);
- mulsd(xmm1, xmm2);
- movdqu(xmm5, xmm6);
- mulsd(xmm3, xmm7);
- addsd(xmm6, xmm4);
- addsd(xmm1, xmm3);
- movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
- movdl(edx, xmm6);
- subsd(xmm6, xmm5);
- lea(tmp4, ExternalAddress(T_exp));
- movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
- movq(xmm2, ExternalAddress(32 + e_coeff)); //0xfefa39efUL, 0x3fe62e42UL, 0x00000000UL, 0x00000000UL
- subsd(xmm4, xmm6);
- movl(ecx, edx);
- andl(edx, 255);
- addl(edx, edx);
- movdqu(xmm5, Address(tmp4, edx, Address::times_8, 0));
- addsd(xmm4, xmm1);
- pextrw(edx, xmm6, 3);
- shrl(ecx, 8);
- movl(eax, ecx);
- shrl(ecx, 1);
- subl(eax, ecx);
- shll(ecx, 20);
- movdl(xmm6, ecx);
- pshufd(xmm0, xmm4, 68);
- pshufd(xmm1, xmm4, 68);
- mulpd(xmm0, xmm0);
- mulpd(xmm7, xmm1);
- pshufd(xmm6, xmm6, 17);
- mulsd(xmm2, xmm4);
- andl(edx, 32767);
- cmpl(edx, 16529);
- jcc(Assembler::above, L_2TAG_PACKET_12_0_2);
- mulsd(xmm0, xmm0);
- paddd(xmm5, xmm6);
- addpd(xmm3, xmm7);
- mulsd(xmm2, xmm5);
- pshufd(xmm6, xmm5, 238);
- mulpd(xmm0, xmm3);
- addsd(xmm2, xmm6);
- pshufd(xmm3, xmm0, 238);
- addl(eax, 1023);
- shll(eax, 20);
- orl(eax, tmp1);
- movdl(xmm4, eax);
- mulsd(xmm0, xmm5);
- mulsd(xmm3, xmm5);
- addsd(xmm0, xmm2);
- psllq(xmm4, 32);
- addsd(xmm0, xmm3);
- movdqu(xmm1, xmm0);
- addsd(xmm0, xmm5);
- mulsd(xmm0, xmm4);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_13_0_2);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_14_0_2);
-
- bind(L_2TAG_PACKET_52_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_45_0_2);
- movq(xmm0, Address(rsp, 8));
- xorpd(xmm2, xmm2);
- movl(eax, 49136);
- pinsrw(xmm2, eax, 3);
- addsd(xmm2, xmm0);
- pextrw(eax, xmm2, 3);
- cmpl(eax, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_53_0_2);
- xorpd(xmm0, xmm0);
- movl(eax, 32760);
- pinsrw(xmm0, eax, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_53_0_2);
- movq(xmm1, Address(rsp, 16));
- movdl(edx, xmm1);
- movdqu(xmm3, xmm1);
- psrlq(xmm3, 20);
- movdl(ecx, xmm3);
- orl(ecx, edx);
- jcc(Assembler::equal, L_2TAG_PACKET_54_0_2);
- addsd(xmm1, xmm1);
- movdqu(xmm0, xmm1);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_51_0_2);
- pextrw(eax, xmm1, 3);
- pextrw(ecx, xmm2, 3);
- xorl(eax, ecx);
- testl(eax, 32768);
- jcc(Assembler::equal, L_2TAG_PACKET_47_0_2);
- jmp(L_2TAG_PACKET_46_0_2);
-
- bind(L_2TAG_PACKET_54_0_2);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- pextrw(edx, xmm1, 3);
- xorpd(xmm0, xmm0);
- subl(eax, 16368);
- xorl(eax, edx);
- testl(eax, 32768);
- jcc(Assembler::equal, L_2TAG_PACKET_55_0_2);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_55_0_2);
- movl(edx, 32752);
- pinsrw(xmm0, edx, 3);
- jmp(B1_5);
-
- bind(L_2TAG_PACKET_17_0_2);
- movq(Address(rsp, 24), xmm0);
-
- bind(B1_3);
- movq(xmm0, Address(rsp, 24));
-
- bind(L_2TAG_PACKET_56_0_2);
-
- bind(B1_5);
- addq(rsp, 40);
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - SIN()
-// ---------------------
-//
-// 1. RANGE REDUCTION
-//
-// We perform an initial range reduction from X to r with
-//
-// X =~= N * pi/32 + r
-//
-// so that |r| <= pi/64 + epsilon. We restrict inputs to those
-// where |N| <= 932560. Beyond this, the range reduction is
-// insufficiently accurate. For extremely small inputs,
-// denormalization can occur internally, impacting performance.
-// This means that the main path is actually only taken for
-// 2^-252 <= |X| < 90112.
-//
-// To avoid branches, we perform the range reduction to full
-// accuracy each time.
-//
-// X - N * (P_1 + P_2 + P_3)
-//
-// where P_1 and P_2 are 32-bit numbers (so multiplication by N
-// is exact) and P_3 is a 53-bit number. Together, these
-// approximate pi well enough for all cases in the restricted
-// range.
-//
-// The main reduction sequence is:
-//
-// y = 32/pi * x
-// N = integer(y)
-// (computed by adding and subtracting off SHIFTER)
-//
-// m_1 = N * P_1
-// m_2 = N * P_2
-// r_1 = x - m_1
-// r = r_1 - m_2
-// (this r can be used for most of the calculation)
-//
-// c_1 = r_1 - r
-// m_3 = N * P_3
-// c_2 = c_1 - m_2
-// c = c_2 - m_3
-//
-// 2. MAIN ALGORITHM
-//
-// The algorithm uses a table lookup based on B = M * pi / 32
-// where M = N mod 64. The stored values are:
-// sigma closest power of 2 to cos(B)
-// C_hl 53-bit cos(B) - sigma
-// S_hi + S_lo 2 * 53-bit sin(B)
-//
-// The computation is organized as follows:
-//
-// sin(B + r + c) = [sin(B) + sigma * r] +
-// r * (cos(B) - sigma) +
-// sin(B) * [cos(r + c) - 1] +
-// cos(B) * [sin(r + c) - r]
-//
-// which is approximately:
-//
-// [S_hi + sigma * r] +
-// C_hl * r +
-// S_lo + S_hi * [(cos(r) - 1) - r * c] +
-// (C_hl + sigma) * [(sin(r) - r) + c]
-//
-// and this is what is actually computed. We separate this sum
-// into four parts:
-//
-// hi + med + pols + corr
-//
-// where
-//
-// hi = S_hi + sigma r
-// med = C_hl * r
-// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-// 3. POLYNOMIAL
-//
-// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-// (sin(r) - r) can be rearranged freely, since it is quite
-// small, so we exploit parallelism to the fullest.
-//
-// psc4 = SC_4 * r_1
-// msc4 = psc4 * r
-// r2 = r * r
-// msc2 = SC_2 * r2
-// r4 = r2 * r2
-// psc3 = SC_3 + msc4
-// psc1 = SC_1 + msc2
-// msc3 = r4 * psc3
-// sincospols = psc1 + msc3
-// pols = sincospols *
-// <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-// 4. CORRECTION TERM
-//
-// This is where the "c" component of the range reduction is
-// taken into account; recall that just "r" is used for most of
-// the calculation.
-//
-// -c = m_3 - c_2
-// -d = S_hi * r - (C_hl + sigma)
-// corr = -c * -d + S_lo
-//
-// 5. COMPENSATED SUMMATIONS
-//
-// The two successive compensated summations add up the high
-// and medium parts, leaving just the low parts to add up at
-// the end.
-//
-// rs = sigma * r
-// res_int = S_hi + rs
-// k_0 = S_hi - res_int
-// k_2 = k_0 + rs
-// med = C_hl * r
-// res_hi = res_int + med
-// k_1 = res_int - res_hi
-// k_3 = k_1 + med
-//
-// 6. FINAL SUMMATION
-//
-// We now add up all the small parts:
-//
-// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-// Now the overall result is just:
-//
-// res_hi + res_lo
-//
-// 7. SMALL ARGUMENTS
-//
-// If |x| < SNN (SNN meaning the smallest normal number), we
-// simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
-// do 2^-55 * (2^55 * x - x).
-//
-// Special cases:
-// sin(NaN) = quiet NaN, and raise invalid exception
-// sin(INF) = NaN and raise invalid exception
-// sin(+/-0) = +/-0
-//
-/******************************************************************************/
-
-ALIGNED_(16) juint _ONEHALF[] =
-{
- 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
-};
-
-ALIGNED_(16) juint _P_2[] =
-{
- 0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
-};
-
-ALIGNED_(16) juint _SC_4[] =
-{
- 0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
-};
-
-ALIGNED_(16) juint _Ctable[] =
-{
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
- 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
- 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
- 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
- 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
- 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
- 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
- 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
- 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
- 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
- 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
- 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
- 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
- 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
- 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
- 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
- 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
- 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
- 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
- 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
- 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
- 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
- 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
- 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
- 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
- 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
- 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
- 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
- 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
- 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
- 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
- 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
- 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
- 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
- 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
- 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
- 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
- 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
- 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
- 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
- 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
- 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
- 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
- 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
- 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
- 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
- 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
- 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
- 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
- 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
- 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
- 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
- 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
- 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
- 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
- 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
- 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
- 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
- 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
- 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
- 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
- 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
- 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
- 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
- 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
- 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
- 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
- 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
- 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
- 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
- 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
- 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
- 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
- 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
- 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
- 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
- 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
- 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
- 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
- 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
- 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
- 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
- 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
- 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
- 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
- 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
- 0x00000000UL, 0x3ff00000UL
-};
-
-ALIGNED_(16) juint _SC_2[] =
-{
- 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
-};
-
-ALIGNED_(16) juint _SC_3[] =
-{
- 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
-};
-
-ALIGNED_(16) juint _SC_1[] =
-{
- 0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
-};
-
-ALIGNED_(16) juint _PI_INV_TABLE[] =
-{
- 0x00000000UL, 0x00000000UL, 0xa2f9836eUL, 0x4e441529UL, 0xfc2757d1UL,
- 0xf534ddc0UL, 0xdb629599UL, 0x3c439041UL, 0xfe5163abUL, 0xdebbc561UL,
- 0xb7246e3aUL, 0x424dd2e0UL, 0x06492eeaUL, 0x09d1921cUL, 0xfe1deb1cUL,
- 0xb129a73eUL, 0xe88235f5UL, 0x2ebb4484UL, 0xe99c7026UL, 0xb45f7e41UL,
- 0x3991d639UL, 0x835339f4UL, 0x9c845f8bUL, 0xbdf9283bUL, 0x1ff897ffUL,
- 0xde05980fUL, 0xef2f118bUL, 0x5a0a6d1fUL, 0x6d367ecfUL, 0x27cb09b7UL,
- 0x4f463f66UL, 0x9e5fea2dUL, 0x7527bac7UL, 0xebe5f17bUL, 0x3d0739f7UL,
- 0x8a5292eaUL, 0x6bfb5fb1UL, 0x1f8d5d08UL, 0x56033046UL, 0xfc7b6babUL,
- 0xf0cfbc21UL
-};
-
-ALIGNED_(8) juint _PI_4[] =
-{
- 0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
-};
-
-ALIGNED_(8) juint _PI32INV[] =
-{
- 0x6dc9c883UL, 0x40245f30UL
-};
-
-ALIGNED_(8) juint _SHIFTER[] =
-{
- 0x00000000UL, 0x43380000UL
-};
-
-ALIGNED_(8) juint _SIGN_MASK[] =
-{
- 0x00000000UL, 0x80000000UL
-};
-
-ALIGNED_(8) juint _P_3[] =
-{
- 0x2e037073UL, 0x3b63198aUL
-};
-
-ALIGNED_(8) juint _ALL_ONES[] =
-{
- 0xffffffffUL, 0x3fefffffUL
-};
-
-ALIGNED_(8) juint _TWO_POW_55[] =
-{
- 0x00000000UL, 0x43600000UL
-};
-
-ALIGNED_(8) juint _TWO_POW_M55[] =
-{
- 0x00000000UL, 0x3c800000ULL
-};
-
-ALIGNED_(8) juint _P_1[] =
-{
- 0x54400000UL, 0x3fb921fbUL
-};
-
-ALIGNED_(8) juint _NEG_ZERO[] =
-{
- 0x00000000UL, 0x80000000UL
-};
-
-void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register ecx, Register edx, Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
- Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1;
- Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1;
- Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1;
- Label L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1;
- Label L_2TAG_PACKET_12_0_1, B1_1, B1_2, B1_4, start;
-
- assert_different_registers(tmp1, tmp2, tmp3, tmp4, eax, ebx, ecx, edx);
- address ONEHALF = (address)_ONEHALF;
- address P_2 = (address)_P_2;
- address SC_4 = (address)_SC_4;
- address Ctable = (address)_Ctable;
- address SC_2 = (address)_SC_2;
- address SC_3 = (address)_SC_3;
- address SC_1 = (address)_SC_1;
- address PI_INV_TABLE = (address)_PI_INV_TABLE;
- address PI_4 = (address)_PI_4;
- address PI32INV = (address)_PI32INV;
- address SHIFTER = (address)_SHIFTER;
- address SIGN_MASK = (address)_SIGN_MASK;
- address P_3 = (address)_P_3;
- address ALL_ONES = (address)_ALL_ONES;
- address TWO_POW_55 = (address)_TWO_POW_55;
- address TWO_POW_M55 = (address)_TWO_POW_M55;
- address P_1 = (address)_P_1;
- address NEG_ZERO = (address)_NEG_ZERO;
-
- bind(start);
- push(rbx);
- subq(rsp, 16);
- movsd(Address(rsp, 8), xmm0);
- movl(eax, Address(rsp, 12));
- movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
- movq(xmm2, ExternalAddress(SHIFTER)); //0x00000000UL, 0x43380000UL
- andl(eax, 2147418112);
- subl(eax, 808452096);
- cmpl(eax, 281346048);
- jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
- mulsd(xmm1, xmm0);
- movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
- movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- addpd(xmm1, xmm5);
- cvttsd2sil(edx, xmm1);
- cvtsi2sdl(xmm1, edx);
- movdqu(xmm6, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
- mov64(r8, 0x3fb921fb54400000);
- movdq(xmm3, r8);
- movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
- pshufd(xmm4, xmm0, 68);
- mulsd(xmm3, xmm1);
- movddup(xmm1, xmm1);
- andl(edx, 63);
- shll(edx, 5);
- lea(rax, ExternalAddress(Ctable));
- addq(rax, rdx);
- mulpd(xmm6, xmm1);
- mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
- subsd(xmm4, xmm3);
- movq(xmm7, Address(rax, 8));
- subsd(xmm0, xmm3);
- movddup(xmm3, xmm4);
- subsd(xmm4, xmm6);
- pshufd(xmm0, xmm0, 68);
- movdqu(xmm2, Address(rax, 0));
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm6);
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm6);
- movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
- subsd(xmm1, xmm3);
- movq(xmm3, Address(rax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
- mulsd(xmm4, Address(rax, 0));
- addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
- mulpd(xmm5, xmm0);
- movdqu(xmm0, xmm3);
- addsd(xmm3, Address(rax, 8));
- mulpd(xmm1, xmm7);
- movdqu(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movq(xmm5, Address(rax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(rax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm5, xmm0);
- addsd(xmm3, xmm7);
- addsd(xmm1, xmm5);
- addsd(xmm1, xmm3);
- addsd(xmm1, xmm6);
- unpckhpd(xmm6, xmm6);
- movdqu(xmm0, xmm4);
- addsd(xmm1, xmm6);
- addsd(xmm0, xmm1);
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_0_0_1);
- jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
- shrl(eax, 20);
- cmpl(eax, 3325);
- jcc(Assembler::notEqual, L_2TAG_PACKET_2_0_1);
- mulsd(xmm0, ExternalAddress(ALL_ONES)); //0xffffffffUL, 0x3fefffffUL
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_2_0_1);
- movq(xmm3, ExternalAddress(TWO_POW_55)); //0x00000000UL, 0x43600000UL
- mulsd(xmm3, xmm0);
- subsd(xmm3, xmm0);
- mulsd(xmm3, ExternalAddress(TWO_POW_M55)); //0x00000000UL, 0x3c800000UL
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_1_0_1);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_3_0_1);
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32752);
- subl(ecx, 16224);
- shrl(ecx, 7);
- andl(ecx, 65532);
- lea(r11, ExternalAddress(PI_INV_TABLE));
- addq(rcx, r11);
- movdq(rax, xmm0);
- movl(r10, Address(rcx, 20));
- movl(r8, Address(rcx, 24));
- movl(edx, eax);
- shrq(rax, 21);
- orl(eax, INT_MIN);
- shrl(eax, 11);
- movl(r9, r10);
- imulq(r10, rdx);
- imulq(r9, rax);
- imulq(r8, rax);
- movl(rsi, Address(rcx, 16));
- movl(rdi, Address(rcx, 12));
- movl(r11, r10);
- shrq(r10, 32);
- addq(r9, r10);
- addq(r11, r8);
- movl(r8, r11);
- shrq(r11, 32);
- addq(r9, r11);
- movl(r10, rsi);
- imulq(rsi, rdx);
- imulq(r10, rax);
- movl(r11, rdi);
- imulq(rdi, rdx);
- movl(ebx, rsi);
- shrq(rsi, 32);
- addq(r9, rbx);
- movl(ebx, r9);
- shrq(r9, 32);
- addq(r10, rsi);
- addq(r10, r9);
- shlq(rbx, 32);
- orq(r8, rbx);
- imulq(r11, rax);
- movl(r9, Address(rcx, 8));
- movl(rsi, Address(rcx, 4));
- movl(ebx, rdi);
- shrq(rdi, 32);
- addq(r10, rbx);
- movl(ebx, r10);
- shrq(r10, 32);
- addq(r11, rdi);
- addq(r11, r10);
- movq(rdi, r9);
- imulq(r9, rdx);
- imulq(rdi, rax);
- movl(r10, r9);
- shrq(r9, 32);
- addq(r11, r10);
- movl(r10, r11);
- shrq(r11, 32);
- addq(rdi, r9);
- addq(rdi, r11);
- movq(r9, rsi);
- imulq(rsi, rdx);
- imulq(r9, rax);
- shlq(r10, 32);
- orq(r10, rbx);
- movl(eax, Address(rcx, 0));
- movl(r11, rsi);
- shrq(rsi, 32);
- addq(rdi, r11);
- movl(r11, rdi);
- shrq(rdi, 32);
- addq(r9, rsi);
- addq(r9, rdi);
- imulq(rdx, rax);
- pextrw(ebx, xmm0, 3);
- lea(rdi, ExternalAddress(PI_INV_TABLE));
- subq(rcx, rdi);
- addl(ecx, ecx);
- addl(ecx, ecx);
- addl(ecx, ecx);
- addl(ecx, 19);
- movl(rsi, 32768);
- andl(rsi, ebx);
- shrl(ebx, 4);
- andl(ebx, 2047);
- subl(ebx, 1023);
- subl(ecx, ebx);
- addq(r9, rdx);
- movl(edx, ecx);
- addl(edx, 32);
- cmpl(ecx, 1);
- jcc(Assembler::less, L_2TAG_PACKET_4_0_1);
- negl(ecx);
- addl(ecx, 29);
- shll(r9);
- movl(rdi, r9);
- andl(r9, 536870911);
- testl(r9, 268435456);
- jcc(Assembler::notEqual, L_2TAG_PACKET_5_0_1);
- shrl(r9);
- movl(ebx, 0);
- shlq(r9, 32);
- orq(r9, r11);
-
- bind(L_2TAG_PACKET_6_0_1);
-
- bind(L_2TAG_PACKET_7_0_1);
-
- cmpq(r9, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_8_0_1);
-
- bind(L_2TAG_PACKET_9_0_1);
- bsrq(r11, r9);
- movl(ecx, 29);
- subl(ecx, r11);
- jcc(Assembler::lessEqual, L_2TAG_PACKET_10_0_1);
- shlq(r9);
- movq(rax, r10);
- shlq(r10);
- addl(edx, ecx);
- negl(ecx);
- addl(ecx, 64);
- shrq(rax);
- shrq(r8);
- orq(r9, rax);
- orq(r10, r8);
-
- bind(L_2TAG_PACKET_11_0_1);
- cvtsi2sdq(xmm0, r9);
- shrq(r10, 1);
- cvtsi2sdq(xmm3, r10);
- xorpd(xmm4, xmm4);
- shll(edx, 4);
- negl(edx);
- addl(edx, 16368);
- orl(edx, rsi);
- xorl(edx, ebx);
- pinsrw(xmm4, edx, 3);
- movq(xmm2, ExternalAddress(PI_4)); //0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
- movq(xmm6, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
- xorpd(xmm5, xmm5);
- subl(edx, 1008);
- pinsrw(xmm5, edx, 3);
- mulsd(xmm0, xmm4);
- shll(rsi, 16);
- sarl(rsi, 31);
- mulsd(xmm3, xmm5);
- movdqu(xmm1, xmm0);
- mulsd(xmm0, xmm2);
- shrl(rdi, 29);
- addsd(xmm1, xmm3);
- mulsd(xmm3, xmm2);
- addl(rdi, rsi);
- xorl(rdi, rsi);
- mulsd(xmm6, xmm1);
- movl(eax, rdi);
- addsd(xmm6, xmm3);
- movdqu(xmm2, xmm0);
- addsd(xmm0, xmm6);
- subsd(xmm2, xmm0);
- addsd(xmm6, xmm2);
-
- bind(L_2TAG_PACKET_12_0_1);
- movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
- mulsd(xmm1, xmm0);
- movq(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
- movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- addpd(xmm1, xmm5);
- cvttsd2sil(edx, xmm1);
- cvtsi2sdl(xmm1, edx);
- movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
- movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
- mulsd(xmm3, xmm1);
- unpcklpd(xmm1, xmm1);
- shll(eax, 3);
- addl(edx, 1865216);
- movdqu(xmm4, xmm0);
- addl(edx, eax);
- andl(edx, 63);
- movdqu(xmm5, ExternalAddress(SC_4)); //0x54400000UL, 0x3fb921fbUL
- lea(rax, ExternalAddress(Ctable));
- shll(edx, 5);
- addq(rax, rdx);
- mulpd(xmm2, xmm1);
- subsd(xmm0, xmm3);
- mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
- subsd(xmm4, xmm3);
- movq(xmm7, Address(rax, 8));
- unpcklpd(xmm0, xmm0);
- movdqu(xmm3, xmm4);
- subsd(xmm4, xmm2);
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm2);
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm2);
- movdqu(xmm2, Address(rax, 0));
- subsd(xmm1, xmm3);
- movq(xmm3, Address(rax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- subsd(xmm1, xmm6);
- movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
- mulsd(xmm4, Address(rax, 0));
- addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
- mulpd(xmm5, xmm0);
- movdqu(xmm0, xmm3);
- addsd(xmm3, Address(rax, 8));
- mulpd(xmm1, xmm7);
- movdqu(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movq(xmm5, Address(rax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(rax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm5, xmm0);
- addsd(xmm3, xmm7);
- addsd(xmm1, xmm5);
- addsd(xmm1, xmm3);
- addsd(xmm1, xmm6);
- unpckhpd(xmm6, xmm6);
- movdqu(xmm0, xmm4);
- addsd(xmm1, xmm6);
- addsd(xmm0, xmm1);
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_8_0_1);
- addl(edx, 64);
- movq(r9, r10);
- movq(r10, r8);
- movl(r8, 0);
- cmpq(r9, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1);
- addl(edx, 64);
- movq(r9, r10);
- movq(r10, r8);
- cmpq(r9, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1);
- xorpd(xmm0, xmm0);
- xorpd(xmm6, xmm6);
- jmp(L_2TAG_PACKET_12_0_1);
-
- bind(L_2TAG_PACKET_10_0_1);
- jcc(Assembler::equal, L_2TAG_PACKET_11_0_1);
- negl(ecx);
- shrq(r10);
- movq(rax, r9);
- shrq(r9);
- subl(edx, ecx);
- negl(ecx);
- addl(ecx, 64);
- shlq(rax);
- orq(r10, rax);
- jmp(L_2TAG_PACKET_11_0_1);
-
- bind(L_2TAG_PACKET_4_0_1);
- negl(ecx);
- shlq(r9, 32);
- orq(r9, r11);
- shlq(r9);
- movq(rdi, r9);
- testl(r9, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_13_0_1);
- shrl(r9);
- movl(ebx, 0);
- shrq(rdi, 3);
- jmp(L_2TAG_PACKET_7_0_1);
-
- bind(L_2TAG_PACKET_5_0_1);
- shrl(r9);
- movl(ebx, 536870912);
- shrl(ebx);
- shlq(r9, 32);
- orq(r9, r11);
- shlq(rbx, 32);
- addl(rdi, 536870912);
- movl(rcx, 0);
- movl(r11, 0);
- subq(rcx, r8);
- sbbq(r11, r10);
- sbbq(rbx, r9);
- movq(r8, rcx);
- movq(r10, r11);
- movq(r9, rbx);
- movl(ebx, 32768);
- jmp(L_2TAG_PACKET_6_0_1);
-
- bind(L_2TAG_PACKET_13_0_1);
- shrl(r9);
- mov64(rbx, 0x100000000);
- shrq(rbx);
- movl(rcx, 0);
- movl(r11, 0);
- subq(rcx, r8);
- sbbq(r11, r10);
- sbbq(rbx, r9);
- movq(r8, rcx);
- movq(r10, r11);
- movq(r9, rbx);
- movl(ebx, 32768);
- shrq(rdi, 3);
- addl(rdi, 536870912);
- jmp(L_2TAG_PACKET_7_0_1);
-
- bind(L_2TAG_PACKET_3_0_1);
- movq(xmm0, Address(rsp, 8));
- mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL
- movq(Address(rsp, 0), xmm0);
-
- bind(L_2TAG_PACKET_14_0_1);
-
- bind(B1_4);
- addq(rsp, 16);
- pop(rbx);
-}
-
-/******************************************************************************/
-// ALGORITHM DESCRIPTION - COS()
-// ---------------------
-//
-// 1. RANGE REDUCTION
-//
-// We perform an initial range reduction from X to r with
-//
-// X =~= N * pi/32 + r
-//
-// so that |r| <= pi/64 + epsilon. We restrict inputs to those
-// where |N| <= 932560. Beyond this, the range reduction is
-// insufficiently accurate. For extremely small inputs,
-// denormalization can occur internally, impacting performance.
-// This means that the main path is actually only taken for
-// 2^-252 <= |X| < 90112.
-//
-// To avoid branches, we perform the range reduction to full
-// accuracy each time.
-//
-// X - N * (P_1 + P_2 + P_3)
-//
-// where P_1 and P_2 are 32-bit numbers (so multiplication by N
-// is exact) and P_3 is a 53-bit number. Together, these
-// approximate pi well enough for all cases in the restricted
-// range.
-//
-// The main reduction sequence is:
-//
-// y = 32/pi * x
-// N = integer(y)
-// (computed by adding and subtracting off SHIFTER)
-//
-// m_1 = N * P_1
-// m_2 = N * P_2
-// r_1 = x - m_1
-// r = r_1 - m_2
-// (this r can be used for most of the calculation)
-//
-// c_1 = r_1 - r
-// m_3 = N * P_3
-// c_2 = c_1 - m_2
-// c = c_2 - m_3
-//
-// 2. MAIN ALGORITHM
-//
-// The algorithm uses a table lookup based on B = M * pi / 32
-// where M = N mod 64. The stored values are:
-// sigma closest power of 2 to cos(B)
-// C_hl 53-bit cos(B) - sigma
-// S_hi + S_lo 2 * 53-bit sin(B)
-//
-// The computation is organized as follows:
-//
-// sin(B + r + c) = [sin(B) + sigma * r] +
-// r * (cos(B) - sigma) +
-// sin(B) * [cos(r + c) - 1] +
-// cos(B) * [sin(r + c) - r]
-//
-// which is approximately:
-//
-// [S_hi + sigma * r] +
-// C_hl * r +
-// S_lo + S_hi * [(cos(r) - 1) - r * c] +
-// (C_hl + sigma) * [(sin(r) - r) + c]
-//
-// and this is what is actually computed. We separate this sum
-// into four parts:
-//
-// hi + med + pols + corr
-//
-// where
-//
-// hi = S_hi + sigma r
-// med = C_hl * r
-// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
-// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
-//
-// 3. POLYNOMIAL
-//
-// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
-// (sin(r) - r) can be rearranged freely, since it is quite
-// small, so we exploit parallelism to the fullest.
-//
-// psc4 = SC_4 * r_1
-// msc4 = psc4 * r
-// r2 = r * r
-// msc2 = SC_2 * r2
-// r4 = r2 * r2
-// psc3 = SC_3 + msc4
-// psc1 = SC_1 + msc2
-// msc3 = r4 * psc3
-// sincospols = psc1 + msc3
-// pols = sincospols *
-// <S_hi * r^2 | (C_hl + sigma) * r^3>
-//
-// 4. CORRECTION TERM
-//
-// This is where the "c" component of the range reduction is
-// taken into account; recall that just "r" is used for most of
-// the calculation.
-//
-// -c = m_3 - c_2
-// -d = S_hi * r - (C_hl + sigma)
-// corr = -c * -d + S_lo
-//
-// 5. COMPENSATED SUMMATIONS
-//
-// The two successive compensated summations add up the high
-// and medium parts, leaving just the low parts to add up at
-// the end.
-//
-// rs = sigma * r
-// res_int = S_hi + rs
-// k_0 = S_hi - res_int
-// k_2 = k_0 + rs
-// med = C_hl * r
-// res_hi = res_int + med
-// k_1 = res_int - res_hi
-// k_3 = k_1 + med
-//
-// 6. FINAL SUMMATION
-//
-// We now add up all the small parts:
-//
-// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
-//
-// Now the overall result is just:
-//
-// res_hi + res_lo
-//
-// 7. SMALL ARGUMENTS
-//
-// Inputs with |X| < 2^-252 are treated specially as
-// 1 - |x|.
-//
-// Special cases:
-// cos(NaN) = quiet NaN, and raise invalid exception
-// cos(INF) = NaN and raise invalid exception
-// cos(0) = 1
-//
-/******************************************************************************/
-
-ALIGNED_(8) juint _ONE[] =
-{
- 0x00000000UL, 0x3ff00000UL
-};
-
-void MacroAssembler::fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r8, Register r9, Register r10, Register r11) {
- Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1;
- Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1;
- Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1;
- Label L_2TAG_PACKET_12_0_1, L_2TAG_PACKET_13_0_1, B1_2, B1_3, B1_4, B1_5, start;
-
- assert_different_registers(r8, r9, r10, r11, eax, ecx, edx);
-
- address ONEHALF = (address)_ONEHALF;
- address P_2 = (address)_P_2;
- address SC_4 = (address)_SC_4;
- address Ctable = (address)_Ctable;
- address SC_2 = (address)_SC_2;
- address SC_3 = (address)_SC_3;
- address SC_1 = (address)_SC_1;
- address PI_INV_TABLE = (address)_PI_INV_TABLE;
- address PI_4 = (address)_PI_4;
- address PI32INV = (address)_PI32INV;
- address SIGN_MASK = (address)_SIGN_MASK;
- address P_1 = (address)_P_1;
- address P_3 = (address)_P_3;
- address ONE = (address)_ONE;
- address NEG_ZERO = (address)_NEG_ZERO;
-
- bind(start);
- push(rbx);
- subq(rsp, 16);
- movsd(Address(rsp, 8), xmm0);
-
- bind(B1_2);
- movl(eax, Address(rsp, 12));
- movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
- andl(eax, 2147418112);
- subl(eax, 808452096);
- cmpl(eax, 281346048);
- jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
- mulsd(xmm1, xmm0);
- movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
- movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- addpd(xmm1, xmm5);
- cvttsd2sil(edx, xmm1);
- cvtsi2sdl(xmm1, edx);
- movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
- movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
- mulsd(xmm3, xmm1);
- unpcklpd(xmm1, xmm1);
- addq(rdx, 1865232);
- movdqu(xmm4, xmm0);
- andq(rdx, 63);
- movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
- lea(rax, ExternalAddress(Ctable));
- shlq(rdx, 5);
- addq(rax, rdx);
- mulpd(xmm2, xmm1);
- subsd(xmm0, xmm3);
- mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
- subsd(xmm4, xmm3);
- movq(xmm7, Address(rax, 8));
- unpcklpd(xmm0, xmm0);
- movdqu(xmm3, xmm4);
- subsd(xmm4, xmm2);
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm2);
- movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm2);
- movdqu(xmm2, Address(rax, 0));
- subsd(xmm1, xmm3);
- movq(xmm3, Address(rax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
- mulsd(xmm4, Address(rax, 0));
- addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
- mulpd(xmm5, xmm0);
- movdqu(xmm0, xmm3);
- addsd(xmm3, Address(rax, 8));
- mulpd(xmm1, xmm7);
- movdqu(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movq(xmm5, Address(rax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(rax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm0, xmm5);
- addsd(xmm3, xmm7);
- addsd(xmm0, xmm1);
- addsd(xmm0, xmm3);
- addsd(xmm0, xmm6);
- unpckhpd(xmm6, xmm6);
- addsd(xmm0, xmm6);
- addsd(xmm0, xmm4);
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_0_0_1);
- jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
- pextrw(eax, xmm0, 3);
- andl(eax, 32767);
- pinsrw(xmm0, eax, 3);
- movq(xmm1, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
- subsd(xmm1, xmm0);
- movdqu(xmm0, xmm1);
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_1_0_1);
- pextrw(eax, xmm0, 3);
- andl(eax, 32752);
- cmpl(eax, 32752);
- jcc(Assembler::equal, L_2TAG_PACKET_2_0_1);
- pextrw(ecx, xmm0, 3);
- andl(ecx, 32752);
- subl(ecx, 16224);
- shrl(ecx, 7);
- andl(ecx, 65532);
- lea(r11, ExternalAddress(PI_INV_TABLE));
- addq(rcx, r11);
- movdq(rax, xmm0);
- movl(r10, Address(rcx, 20));
- movl(r8, Address(rcx, 24));
- movl(edx, eax);
- shrq(rax, 21);
- orl(eax, INT_MIN);
- shrl(eax, 11);
- movl(r9, r10);
- imulq(r10, rdx);
- imulq(r9, rax);
- imulq(r8, rax);
- movl(rsi, Address(rcx, 16));
- movl(rdi, Address(rcx, 12));
- movl(r11, r10);
- shrq(r10, 32);
- addq(r9, r10);
- addq(r11, r8);
- movl(r8, r11);
- shrq(r11, 32);
- addq(r9, r11);
- movl(r10, rsi);
- imulq(rsi, rdx);
- imulq(r10, rax);
- movl(r11, rdi);
- imulq(rdi, rdx);
- movl(rbx, rsi);
- shrq(rsi, 32);
- addq(r9, rbx);
- movl(rbx, r9);
- shrq(r9, 32);
- addq(r10, rsi);
- addq(r10, r9);
- shlq(rbx, 32);
- orq(r8, rbx);
- imulq(r11, rax);
- movl(r9, Address(rcx, 8));
- movl(rsi, Address(rcx, 4));
- movl(rbx, rdi);
- shrq(rdi, 32);
- addq(r10, rbx);
- movl(rbx, r10);
- shrq(r10, 32);
- addq(r11, rdi);
- addq(r11, r10);
- movq(rdi, r9);
- imulq(r9, rdx);
- imulq(rdi, rax);
- movl(r10, r9);
- shrq(r9, 32);
- addq(r11, r10);
- movl(r10, r11);
- shrq(r11, 32);
- addq(rdi, r9);
- addq(rdi, r11);
- movq(r9, rsi);
- imulq(rsi, rdx);
- imulq(r9, rax);
- shlq(r10, 32);
- orq(r10, rbx);
- movl(eax, Address(rcx, 0));
- movl(r11, rsi);
- shrq(rsi, 32);
- addq(rdi, r11);
- movl(r11, rdi);
- shrq(rdi, 32);
- addq(r9, rsi);
- addq(r9, rdi);
- imulq(rdx, rax);
- pextrw(rbx, xmm0, 3);
- lea(rdi, ExternalAddress(PI_INV_TABLE));
- subq(rcx, rdi);
- addl(ecx, ecx);
- addl(ecx, ecx);
- addl(ecx, ecx);
- addl(ecx, 19);
- movl(rsi, 32768);
- andl(rsi, rbx);
- shrl(rbx, 4);
- andl(rbx, 2047);
- subl(rbx, 1023);
- subl(ecx, rbx);
- addq(r9, rdx);
- movl(edx, ecx);
- addl(edx, 32);
- cmpl(ecx, 1);
- jcc(Assembler::less, L_2TAG_PACKET_3_0_1);
- negl(ecx);
- addl(ecx, 29);
- shll(r9);
- movl(rdi, r9);
- andl(r9, 536870911);
- testl(r9, 268435456);
- jcc(Assembler::notEqual, L_2TAG_PACKET_4_0_1);
- shrl(r9);
- movl(rbx, 0);
- shlq(r9, 32);
- orq(r9, r11);
-
- bind(L_2TAG_PACKET_5_0_1);
-
- bind(L_2TAG_PACKET_6_0_1);
- cmpq(r9, 0);
- jcc(Assembler::equal, L_2TAG_PACKET_7_0_1);
-
- bind(L_2TAG_PACKET_8_0_1);
- bsrq(r11, r9);
- movl(ecx, 29);
- subl(ecx, r11);
- jcc(Assembler::lessEqual, L_2TAG_PACKET_9_0_1);
- shlq(r9);
- movq(rax, r10);
- shlq(r10);
- addl(edx, ecx);
- negl(ecx);
- addl(ecx, 64);
- shrq(rax);
- shrq(r8);
- orq(r9, rax);
- orq(r10, r8);
-
- bind(L_2TAG_PACKET_10_0_1);
- cvtsi2sdq(xmm0, r9);
- shrq(r10, 1);
- cvtsi2sdq(xmm3, r10);
- xorpd(xmm4, xmm4);
- shll(edx, 4);
- negl(edx);
- addl(edx, 16368);
- orl(edx, rsi);
- xorl(edx, rbx);
- pinsrw(xmm4, edx, 3);
- movq(xmm2, ExternalAddress(PI_4)); //0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
- movq(xmm6, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
- xorpd(xmm5, xmm5);
- subl(edx, 1008);
- pinsrw(xmm5, edx, 3);
- mulsd(xmm0, xmm4);
- shll(rsi, 16);
- sarl(rsi, 31);
- mulsd(xmm3, xmm5);
- movdqu(xmm1, xmm0);
- mulsd(xmm0, xmm2);
- shrl(rdi, 29);
- addsd(xmm1, xmm3);
- mulsd(xmm3, xmm2);
- addl(rdi, rsi);
- xorl(rdi, rsi);
- mulsd(xmm6, xmm1);
- movl(eax, rdi);
- addsd(xmm6, xmm3);
- movdqu(xmm2, xmm0);
- addsd(xmm0, xmm6);
- subsd(xmm2, xmm0);
- addsd(xmm6, xmm2);
-
- bind(L_2TAG_PACKET_11_0_1);
- movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
- mulsd(xmm1, xmm0);
- movq(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
- movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
- pand(xmm4, xmm0);
- por(xmm5, xmm4);
- addpd(xmm1, xmm5);
- cvttsd2siq(rdx, xmm1);
- cvtsi2sdq(xmm1, rdx);
- movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
- movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
- mulsd(xmm3, xmm1);
- unpcklpd(xmm1, xmm1);
- shll(eax, 3);
- addl(edx, 1865232);
- movdqu(xmm4, xmm0);
- addl(edx, eax);
- andl(edx, 63);
- movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
- lea(rax, ExternalAddress(Ctable));
- shll(edx, 5);
- addq(rax, rdx);
- mulpd(xmm2, xmm1);
- subsd(xmm0, xmm3);
- mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
- subsd(xmm4, xmm3);
- movq(xmm7, Address(rax, 8));
- unpcklpd(xmm0, xmm0);
- movdqu(xmm3, xmm4);
- subsd(xmm4, xmm2);
- mulpd(xmm5, xmm0);
- subpd(xmm0, xmm2);
- mulsd(xmm7, xmm4);
- subsd(xmm3, xmm4);
- mulpd(xmm5, xmm0);
- mulpd(xmm0, xmm0);
- subsd(xmm3, xmm2);
- movdqu(xmm2, Address(rax, 0));
- subsd(xmm1, xmm3);
- movq(xmm3, Address(rax, 24));
- addsd(xmm2, xmm3);
- subsd(xmm7, xmm2);
- subsd(xmm1, xmm6);
- movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
- mulsd(xmm2, xmm4);
- mulpd(xmm6, xmm0);
- mulsd(xmm3, xmm4);
- mulpd(xmm2, xmm0);
- mulpd(xmm0, xmm0);
- addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
- mulsd(xmm4, Address(rax, 0));
- addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
- mulpd(xmm5, xmm0);
- movdqu(xmm0, xmm3);
- addsd(xmm3, Address(rax, 8));
- mulpd(xmm1, xmm7);
- movdqu(xmm7, xmm4);
- addsd(xmm4, xmm3);
- addpd(xmm6, xmm5);
- movq(xmm5, Address(rax, 8));
- subsd(xmm5, xmm3);
- subsd(xmm3, xmm4);
- addsd(xmm1, Address(rax, 16));
- mulpd(xmm6, xmm2);
- addsd(xmm5, xmm0);
- addsd(xmm3, xmm7);
- addsd(xmm1, xmm5);
- addsd(xmm1, xmm3);
- addsd(xmm1, xmm6);
- unpckhpd(xmm6, xmm6);
- movdqu(xmm0, xmm4);
- addsd(xmm1, xmm6);
- addsd(xmm0, xmm1);
- jmp(B1_4);
-
- bind(L_2TAG_PACKET_7_0_1);
- addl(edx, 64);
- movq(r9, r10);
- movq(r10, r8);
- movl(r8, 0);
- cmpq(r9, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_8_0_1);
- addl(edx, 64);
- movq(r9, r10);
- movq(r10, r8);
- cmpq(r9, 0);
- jcc(Assembler::notEqual, L_2TAG_PACKET_8_0_1);
- xorpd(xmm0, xmm0);
- xorpd(xmm6, xmm6);
- jmp(L_2TAG_PACKET_11_0_1);
-
- bind(L_2TAG_PACKET_9_0_1);
- jcc(Assembler::equal, L_2TAG_PACKET_10_0_1);
- negl(ecx);
- shrq(r10);
- movq(rax, r9);
- shrq(r9);
- subl(edx, ecx);
- negl(ecx);
- addl(ecx, 64);
- shlq(rax);
- orq(r10, rax);
- jmp(L_2TAG_PACKET_10_0_1);
- bind(L_2TAG_PACKET_3_0_1);
- negl(ecx);
- shlq(r9, 32);
- orq(r9, r11);
- shlq(r9);
- movq(rdi, r9);
- testl(r9, INT_MIN);
- jcc(Assembler::notEqual, L_2TAG_PACKET_12_0_1);
- shrl(r9);
- movl(rbx, 0);
- shrq(rdi, 3);
- jmp(L_2TAG_PACKET_6_0_1);
-
- bind(L_2TAG_PACKET_4_0_1);
- shrl(r9);
- movl(rbx, 536870912);
- shrl(rbx);
- shlq(r9, 32);
- orq(r9, r11);
- shlq(rbx, 32);
- addl(rdi, 536870912);
- movl(rcx, 0);
- movl(r11, 0);
- subq(rcx, r8);
- sbbq(r11, r10);
- sbbq(rbx, r9);
- movq(r8, rcx);
- movq(r10, r11);
- movq(r9, rbx);
- movl(rbx, 32768);
- jmp(L_2TAG_PACKET_5_0_1);
-
- bind(L_2TAG_PACKET_12_0_1);
- shrl(r9);
- mov64(rbx, 0x100000000);
- shrq(rbx);
- movl(rcx, 0);
- movl(r11, 0);
- subq(rcx, r8);
- sbbq(r11, r10);
- sbbq(rbx, r9);
- movq(r8, rcx);
- movq(r10, r11);
- movq(r9, rbx);
- movl(rbx, 32768);
- shrq(rdi, 3);
- addl(rdi, 536870912);
- jmp(L_2TAG_PACKET_6_0_1);
-
- bind(L_2TAG_PACKET_2_0_1);
- movsd(xmm0, Address(rsp, 8));
- mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL
- movq(Address(rsp, 0), xmm0);
-
- bind(L_2TAG_PACKET_13_0_1);
-
- bind(B1_4);
- addq(rsp, 16);
- pop(rbx);
-}
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -928,6 +928,10 @@
XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
Register rax, Register rcx, Register rdx, Register tmp1, Register tmp2);
+ void fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
+ XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
+ Register rax, Register rcx, Register rdx, Register r11);
+
void fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4,
XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register rax, Register rcx,
Register rdx, Register tmp1, Register tmp2, Register tmp3, Register tmp4);
@@ -941,11 +945,19 @@
XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
Register rax, Register rcx, Register rdx, Register tmp1,
Register tmp2, Register tmp3, Register tmp4);
+ void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
+ XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
+ Register rax, Register rcx, Register rdx, Register tmp1,
+ Register tmp2, Register tmp3, Register tmp4);
#else
void fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
Register rax, Register rcx, Register rdx, Register tmp1);
+ void fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
+ XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
+ Register rax, Register rcx, Register rdx, Register tmp);
+
void fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4,
XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register rax, Register rcx,
Register rdx, Register tmp);
@@ -964,6 +976,14 @@
void libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx,
Register esi, Register edi, Register ebp, Register esp);
+
+ void libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx,
+ Register edx, Register ebx, Register esi, Register edi,
+ Register ebp, Register esp);
+
+ void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
+ XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
+ Register rax, Register rcx, Register rdx, Register tmp);
#endif
void increase_precision();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_cos.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,889 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - COS()
+// ---------------------
+//
+// 1. RANGE REDUCTION
+//
+// We perform an initial range reduction from X to r with
+//
+// X =~= N * pi/32 + r
+//
+// so that |r| <= pi/64 + epsilon. We restrict inputs to those
+// where |N| <= 932560. Beyond this, the range reduction is
+// insufficiently accurate. For extremely small inputs,
+// denormalization can occur internally, impacting performance.
+// This means that the main path is actually only taken for
+// 2^-252 <= |X| < 90112.
+//
+// To avoid branches, we perform the range reduction to full
+// accuracy each time.
+//
+// X - N * (P_1 + P_2 + P_3)
+//
+// where P_1 and P_2 are 32-bit numbers (so multiplication by N
+// is exact) and P_3 is a 53-bit number. Together, these
+// approximate pi well enough for all cases in the restricted
+// range.
+//
+// The main reduction sequence is:
+//
+// y = 32/pi * x
+// N = integer(y)
+// (computed by adding and subtracting off SHIFTER)
+//
+// m_1 = N * P_1
+// m_2 = N * P_2
+// r_1 = x - m_1
+// r = r_1 - m_2
+// (this r can be used for most of the calculation)
+//
+// c_1 = r_1 - r
+// m_3 = N * P_3
+// c_2 = c_1 - m_2
+// c = c_2 - m_3
+//
+// 2. MAIN ALGORITHM
+//
+// The algorithm uses a table lookup based on B = M * pi / 32
+// where M = N mod 64. The stored values are:
+// sigma closest power of 2 to cos(B)
+// C_hl 53-bit cos(B) - sigma
+// S_hi + S_lo 2 * 53-bit sin(B)
+//
+// The computation is organized as follows:
+//
+// sin(B + r + c) = [sin(B) + sigma * r] +
+// r * (cos(B) - sigma) +
+// sin(B) * [cos(r + c) - 1] +
+// cos(B) * [sin(r + c) - r]
+//
+// which is approximately:
+//
+// [S_hi + sigma * r] +
+// C_hl * r +
+// S_lo + S_hi * [(cos(r) - 1) - r * c] +
+// (C_hl + sigma) * [(sin(r) - r) + c]
+//
+// and this is what is actually computed. We separate this sum
+// into four parts:
+//
+// hi + med + pols + corr
+//
+// where
+//
+// hi = S_hi + sigma r
+// med = C_hl * r
+// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+// 3. POLYNOMIAL
+//
+// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+// (sin(r) - r) can be rearranged freely, since it is quite
+// small, so we exploit parallelism to the fullest.
+//
+// psc4 = SC_4 * r_1
+// msc4 = psc4 * r
+// r2 = r * r
+// msc2 = SC_2 * r2
+// r4 = r2 * r2
+// psc3 = SC_3 + msc4
+// psc1 = SC_1 + msc2
+// msc3 = r4 * psc3
+// sincospols = psc1 + msc3
+// pols = sincospols *
+// <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+// 4. CORRECTION TERM
+//
+// This is where the "c" component of the range reduction is
+// taken into account; recall that just "r" is used for most of
+// the calculation.
+//
+// -c = m_3 - c_2
+// -d = S_hi * r - (C_hl + sigma)
+// corr = -c * -d + S_lo
+//
+// 5. COMPENSATED SUMMATIONS
+//
+// The two successive compensated summations add up the high
+// and medium parts, leaving just the low parts to add up at
+// the end.
+//
+// rs = sigma * r
+// res_int = S_hi + rs
+// k_0 = S_hi - res_int
+// k_2 = k_0 + rs
+// med = C_hl * r
+// res_hi = res_int + med
+// k_1 = res_int - res_hi
+// k_3 = k_1 + med
+//
+// 6. FINAL SUMMATION
+//
+// We now add up all the small parts:
+//
+// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+// Now the overall result is just:
+//
+// res_hi + res_lo
+//
+// 7. SMALL ARGUMENTS
+//
+// Inputs with |X| < 2^-252 are treated specially as
+// 1 - |x|.
+//
+// Special cases:
+// cos(NaN) = quiet NaN, and raise invalid exception
+// cos(INF) = NaN and raise invalid exception
+// cos(0) = 1
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(8) juint _ONE[] =
+{
+ 0x00000000UL, 0x3ff00000UL
+};
+void MacroAssembler::fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r8, Register r9, Register r10, Register r11) {
+
+ Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1;
+ Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1;
+ Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1;
+ Label L_2TAG_PACKET_12_0_1, L_2TAG_PACKET_13_0_1, B1_2, B1_3, B1_4, B1_5, start;
+
+ assert_different_registers(r8, r9, r10, r11, eax, ecx, edx);
+
+ address ONEHALF = StubRoutines::x86::_ONEHALF_addr();
+ address P_2 = StubRoutines::x86::_P_2_addr();
+ address SC_4 = StubRoutines::x86::_SC_4_addr();
+ address Ctable = StubRoutines::x86::_Ctable_addr();
+ address SC_2 = StubRoutines::x86::_SC_2_addr();
+ address SC_3 = StubRoutines::x86::_SC_3_addr();
+ address SC_1 = StubRoutines::x86::_SC_1_addr();
+ address PI_INV_TABLE = StubRoutines::x86::_PI_INV_TABLE_addr();
+ address PI_4 = (address)StubRoutines::x86::_PI_4_addr();
+ address PI32INV = (address)StubRoutines::x86::_PI32INV_addr();
+ address SIGN_MASK = (address)StubRoutines::x86::_SIGN_MASK_addr();
+ address P_1 = (address)StubRoutines::x86::_P_1_addr();
+ address P_3 = (address)StubRoutines::x86::_P_3_addr();
+ address ONE = (address)_ONE;
+ address NEG_ZERO = (address)StubRoutines::x86::_NEG_ZERO_addr();
+
+ bind(start);
+ push(rbx);
+ subq(rsp, 16);
+ movsd(Address(rsp, 8), xmm0);
+
+ bind(B1_2);
+ movl(eax, Address(rsp, 12));
+ movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
+ andl(eax, 2147418112);
+ subl(eax, 808452096);
+ cmpl(eax, 281346048);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
+ mulsd(xmm1, xmm0);
+ movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ cvttsd2sil(edx, xmm1);
+ cvtsi2sdl(xmm1, edx);
+ movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
+ movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
+ mulsd(xmm3, xmm1);
+ unpcklpd(xmm1, xmm1);
+ addq(rdx, 1865232);
+ movdqu(xmm4, xmm0);
+ andq(rdx, 63);
+ movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
+ lea(rax, ExternalAddress(Ctable));
+ shlq(rdx, 5);
+ addq(rax, rdx);
+ mulpd(xmm2, xmm1);
+ subsd(xmm0, xmm3);
+ mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
+ subsd(xmm4, xmm3);
+ movq(xmm7, Address(rax, 8));
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm3, xmm4);
+ subsd(xmm4, xmm2);
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm2);
+ movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm2);
+ movdqu(xmm2, Address(rax, 0));
+ subsd(xmm1, xmm3);
+ movq(xmm3, Address(rax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
+ mulsd(xmm4, Address(rax, 0));
+ addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
+ mulpd(xmm5, xmm0);
+ movdqu(xmm0, xmm3);
+ addsd(xmm3, Address(rax, 8));
+ mulpd(xmm1, xmm7);
+ movdqu(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movq(xmm5, Address(rax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(rax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm0, xmm5);
+ addsd(xmm3, xmm7);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm3);
+ addsd(xmm0, xmm6);
+ unpckhpd(xmm6, xmm6);
+ addsd(xmm0, xmm6);
+ addsd(xmm0, xmm4);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_0_0_1);
+ jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ pinsrw(xmm0, eax, 3);
+ movq(xmm1, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
+ subsd(xmm1, xmm0);
+ movdqu(xmm0, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_1_0_1);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_2_0_1);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ subl(ecx, 16224);
+ shrl(ecx, 7);
+ andl(ecx, 65532);
+ lea(r11, ExternalAddress(PI_INV_TABLE));
+ addq(rcx, r11);
+ movdq(rax, xmm0);
+ movl(r10, Address(rcx, 20));
+ movl(r8, Address(rcx, 24));
+ movl(edx, eax);
+ shrq(rax, 21);
+ orl(eax, INT_MIN);
+ shrl(eax, 11);
+ movl(r9, r10);
+ imulq(r10, rdx);
+ imulq(r9, rax);
+ imulq(r8, rax);
+ movl(rsi, Address(rcx, 16));
+ movl(rdi, Address(rcx, 12));
+ movl(r11, r10);
+ shrq(r10, 32);
+ addq(r9, r10);
+ addq(r11, r8);
+ movl(r8, r11);
+ shrq(r11, 32);
+ addq(r9, r11);
+ movl(r10, rsi);
+ imulq(rsi, rdx);
+ imulq(r10, rax);
+ movl(r11, rdi);
+ imulq(rdi, rdx);
+ movl(rbx, rsi);
+ shrq(rsi, 32);
+ addq(r9, rbx);
+ movl(rbx, r9);
+ shrq(r9, 32);
+ addq(r10, rsi);
+ addq(r10, r9);
+ shlq(rbx, 32);
+ orq(r8, rbx);
+ imulq(r11, rax);
+ movl(r9, Address(rcx, 8));
+ movl(rsi, Address(rcx, 4));
+ movl(rbx, rdi);
+ shrq(rdi, 32);
+ addq(r10, rbx);
+ movl(rbx, r10);
+ shrq(r10, 32);
+ addq(r11, rdi);
+ addq(r11, r10);
+ movq(rdi, r9);
+ imulq(r9, rdx);
+ imulq(rdi, rax);
+ movl(r10, r9);
+ shrq(r9, 32);
+ addq(r11, r10);
+ movl(r10, r11);
+ shrq(r11, 32);
+ addq(rdi, r9);
+ addq(rdi, r11);
+ movq(r9, rsi);
+ imulq(rsi, rdx);
+ imulq(r9, rax);
+ shlq(r10, 32);
+ orq(r10, rbx);
+ movl(eax, Address(rcx, 0));
+ movl(r11, rsi);
+ shrq(rsi, 32);
+ addq(rdi, r11);
+ movl(r11, rdi);
+ shrq(rdi, 32);
+ addq(r9, rsi);
+ addq(r9, rdi);
+ imulq(rdx, rax);
+ pextrw(rbx, xmm0, 3);
+ lea(rdi, ExternalAddress(PI_INV_TABLE));
+ subq(rcx, rdi);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, 19);
+ movl(rsi, 32768);
+ andl(rsi, rbx);
+ shrl(rbx, 4);
+ andl(rbx, 2047);
+ subl(rbx, 1023);
+ subl(ecx, rbx);
+ addq(r9, rdx);
+ movl(edx, ecx);
+ addl(edx, 32);
+ cmpl(ecx, 1);
+ jcc(Assembler::less, L_2TAG_PACKET_3_0_1);
+ negl(ecx);
+ addl(ecx, 29);
+ shll(r9);
+ movl(rdi, r9);
+ andl(r9, 536870911);
+ testl(r9, 268435456);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_4_0_1);
+ shrl(r9);
+ movl(rbx, 0);
+ shlq(r9, 32);
+ orq(r9, r11);
+
+ bind(L_2TAG_PACKET_5_0_1);
+
+ bind(L_2TAG_PACKET_6_0_1);
+ cmpq(r9, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_1);
+
+ bind(L_2TAG_PACKET_8_0_1);
+ bsrq(r11, r9);
+ movl(ecx, 29);
+ subl(ecx, r11);
+ jcc(Assembler::lessEqual, L_2TAG_PACKET_9_0_1);
+ shlq(r9);
+ movq(rax, r10);
+ shlq(r10);
+ addl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shrq(rax);
+ shrq(r8);
+ orq(r9, rax);
+ orq(r10, r8);
+
+ bind(L_2TAG_PACKET_10_0_1);
+ cvtsi2sdq(xmm0, r9);
+ shrq(r10, 1);
+ cvtsi2sdq(xmm3, r10);
+ xorpd(xmm4, xmm4);
+ shll(edx, 4);
+ negl(edx);
+ addl(edx, 16368);
+ orl(edx, rsi);
+ xorl(edx, rbx);
+ pinsrw(xmm4, edx, 3);
+ movq(xmm2, ExternalAddress(PI_4)); //0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
+ movq(xmm6, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
+ xorpd(xmm5, xmm5);
+ subl(edx, 1008);
+ pinsrw(xmm5, edx, 3);
+ mulsd(xmm0, xmm4);
+ shll(rsi, 16);
+ sarl(rsi, 31);
+ mulsd(xmm3, xmm5);
+ movdqu(xmm1, xmm0);
+ mulsd(xmm0, xmm2);
+ shrl(rdi, 29);
+ addsd(xmm1, xmm3);
+ mulsd(xmm3, xmm2);
+ addl(rdi, rsi);
+ xorl(rdi, rsi);
+ mulsd(xmm6, xmm1);
+ movl(eax, rdi);
+ addsd(xmm6, xmm3);
+ movdqu(xmm2, xmm0);
+ addsd(xmm0, xmm6);
+ subsd(xmm2, xmm0);
+ addsd(xmm6, xmm2);
+
+ bind(L_2TAG_PACKET_11_0_1);
+ movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
+ mulsd(xmm1, xmm0);
+ movq(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ cvttsd2siq(rdx, xmm1);
+ cvtsi2sdq(xmm1, rdx);
+ movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
+ movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
+ mulsd(xmm3, xmm1);
+ unpcklpd(xmm1, xmm1);
+ shll(eax, 3);
+ addl(edx, 1865232);
+ movdqu(xmm4, xmm0);
+ addl(edx, eax);
+ andl(edx, 63);
+ movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
+ lea(rax, ExternalAddress(Ctable));
+ shll(edx, 5);
+ addq(rax, rdx);
+ mulpd(xmm2, xmm1);
+ subsd(xmm0, xmm3);
+ mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
+ subsd(xmm4, xmm3);
+ movq(xmm7, Address(rax, 8));
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm3, xmm4);
+ subsd(xmm4, xmm2);
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm2);
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm2);
+ movdqu(xmm2, Address(rax, 0));
+ subsd(xmm1, xmm3);
+ movq(xmm3, Address(rax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ subsd(xmm1, xmm6);
+ movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
+ mulsd(xmm4, Address(rax, 0));
+ addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
+ mulpd(xmm5, xmm0);
+ movdqu(xmm0, xmm3);
+ addsd(xmm3, Address(rax, 8));
+ mulpd(xmm1, xmm7);
+ movdqu(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movq(xmm5, Address(rax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(rax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm5, xmm0);
+ addsd(xmm3, xmm7);
+ addsd(xmm1, xmm5);
+ addsd(xmm1, xmm3);
+ addsd(xmm1, xmm6);
+ unpckhpd(xmm6, xmm6);
+ movdqu(xmm0, xmm4);
+ addsd(xmm1, xmm6);
+ addsd(xmm0, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_7_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ movl(r8, 0);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_8_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_8_0_1);
+ xorpd(xmm0, xmm0);
+ xorpd(xmm6, xmm6);
+ jmp(L_2TAG_PACKET_11_0_1);
+
+ bind(L_2TAG_PACKET_9_0_1);
+ jcc(Assembler::equal, L_2TAG_PACKET_10_0_1);
+ negl(ecx);
+ shrq(r10);
+ movq(rax, r9);
+ shrq(r9);
+ subl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shlq(rax);
+ orq(r10, rax);
+ jmp(L_2TAG_PACKET_10_0_1);
+ bind(L_2TAG_PACKET_3_0_1);
+ negl(ecx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(r9);
+ movq(rdi, r9);
+ testl(r9, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_12_0_1);
+ shrl(r9);
+ movl(rbx, 0);
+ shrq(rdi, 3);
+ jmp(L_2TAG_PACKET_6_0_1);
+
+ bind(L_2TAG_PACKET_4_0_1);
+ shrl(r9);
+ movl(rbx, 536870912);
+ shrl(rbx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(rbx, 32);
+ addl(rdi, 536870912);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(rbx, 32768);
+ jmp(L_2TAG_PACKET_5_0_1);
+
+ bind(L_2TAG_PACKET_12_0_1);
+ shrl(r9);
+ mov64(rbx, 0x100000000);
+ shrq(rbx);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(rbx, 32768);
+ shrq(rdi, 3);
+ addl(rdi, 536870912);
+ jmp(L_2TAG_PACKET_6_0_1);
+
+ bind(L_2TAG_PACKET_2_0_1);
+ movsd(xmm0, Address(rsp, 8));
+ mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL
+ movq(Address(rsp, 0), xmm0);
+
+ bind(L_2TAG_PACKET_13_0_1);
+
+ bind(B1_4);
+ addq(rsp, 16);
+ pop(rbx);
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+
+ALIGNED_(16) juint _static_const_table_cos[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
+ 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
+ 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
+ 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
+ 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
+ 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
+ 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
+ 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
+ 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
+ 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
+ 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
+ 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
+ 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
+ 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
+ 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
+ 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
+ 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
+ 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
+ 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
+ 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
+ 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
+ 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
+ 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
+ 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
+ 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
+ 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
+ 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
+ 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
+ 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
+ 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
+ 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
+ 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
+ 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
+ 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
+ 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
+ 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
+ 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
+ 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
+ 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
+ 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
+ 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
+ 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
+ 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
+ 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
+ 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
+ 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
+ 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
+ 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
+ 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
+ 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
+ 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
+ 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
+ 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
+ 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
+ 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
+ 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
+ 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
+ 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
+ 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
+ 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
+ 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
+ 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
+ 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
+ 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
+ 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
+ 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
+ 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
+ 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
+ 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
+ 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
+ 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
+ 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
+ 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
+ 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
+ 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0x3ff00000UL, 0x55555555UL, 0xbfc55555UL, 0x00000000UL,
+ 0xbfe00000UL, 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL,
+ 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL, 0xa556c734UL,
+ 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL, 0x1a600000UL, 0x3d90b461UL,
+ 0x1a600000UL, 0x3d90b461UL, 0x54400000UL, 0x3fb921fbUL, 0x00000000UL,
+ 0x00000000UL, 0x2e037073UL, 0x3b63198aUL, 0x00000000UL, 0x00000000UL,
+ 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x43380000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+};
+//registers,
+// input: (rbp + 8)
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, rbx (tmp)
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+
+ address static_const_table_cos = (address)_static_const_table_cos;
+
+ bind(start);
+ subl(rsp, 120);
+ movl(Address(rsp, 56), tmp);
+ lea(tmp, ExternalAddress(static_const_table_cos));
+ movsd(xmm0, Address(rsp, 128));
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ subl(eax, 12336);
+ cmpl(eax, 4293);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
+ movsd(xmm1, Address(tmp, 2160));
+ mulsd(xmm1, xmm0);
+ movdqu(xmm5, Address(tmp, 2240));
+ movsd(xmm4, Address(tmp, 2224));
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ movsd(xmm3, Address(tmp, 2128));
+ movdqu(xmm2, Address(tmp, 2112));
+ addpd(xmm1, xmm5);
+ cvttsd2sil(edx, xmm1);
+ cvtsi2sdl(xmm1, edx);
+ mulsd(xmm3, xmm1);
+ unpcklpd(xmm1, xmm1);
+ addl(edx, 1865232);
+ movdqu(xmm4, xmm0);
+ andl(edx, 63);
+ movdqu(xmm5, Address(tmp, 2096));
+ lea(eax, Address(tmp, 0));
+ shll(edx, 5);
+ addl(eax, edx);
+ mulpd(xmm2, xmm1);
+ subsd(xmm0, xmm3);
+ mulsd(xmm1, Address(tmp, 2144));
+ subsd(xmm4, xmm3);
+ movsd(xmm7, Address(eax, 8));
+ unpcklpd(xmm0, xmm0);
+ movapd(xmm3, xmm4);
+ subsd(xmm4, xmm2);
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm2);
+ movdqu(xmm6, Address(tmp, 2064));
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm2);
+ movdqu(xmm2, Address(eax, 0));
+ subsd(xmm1, xmm3);
+ movsd(xmm3, Address(eax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, Address(tmp, 2080));
+ mulsd(xmm4, Address(eax, 0));
+ addpd(xmm6, Address(tmp, 2048));
+ mulpd(xmm5, xmm0);
+ movapd(xmm0, xmm3);
+ addsd(xmm3, Address(eax, 8));
+ mulpd(xmm1, xmm7);
+ movapd(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movsd(xmm5, Address(eax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(eax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm5, xmm0);
+ addsd(xmm3, xmm7);
+ addsd(xmm1, xmm5);
+ addsd(xmm1, xmm3);
+ addsd(xmm1, xmm6);
+ unpckhpd(xmm6, xmm6);
+ addsd(xmm1, xmm6);
+ addsd(xmm4, xmm1);
+ movsd(Address(rsp, 0), xmm4);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ pinsrw(xmm0, eax, 3);
+ movsd(xmm1, Address(tmp, 2192));
+ subsd(xmm1, xmm0);
+ movsd(Address(rsp, 0), xmm1);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movl(eax, Address(rsp, 132));
+ andl(eax, 2146435072);
+ cmpl(eax, 2146435072);
+ jcc(Assembler::equal, L_2TAG_PACKET_3_0_2);
+ subl(rsp, 32);
+ movsd(Address(rsp, 0), xmm0);
+ lea(eax, Address(rsp, 40));
+ movl(Address(rsp, 8), eax);
+ movl(eax, 1);
+ movl(Address(rsp, 12), eax);
+ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_sin_cos_huge())));
+ addl(rsp, 32);
+ fld_d(Address(rsp, 8));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ fld_d(Address(rsp, 128));
+ fmul_d(Address(tmp, 2208));
+
+ bind(L_2TAG_PACKET_1_0_2);
+ movl(tmp, Address(rsp, 56));
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_exp.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,674 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - EXP()
+// ---------------------
+//
+// Description:
+// Let K = 64 (table size).
+// x x/log(2) n
+// e = 2 = 2 * T[j] * (1 + P(y))
+// where
+// x = m*log(2)/K + y, y in [-log(2)/K..log(2)/K]
+// m = n*K + j, m,n,j - signed integer, j in [-K/2..K/2]
+// j/K
+// values of 2 are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
+//
+// P(y) is a minimax polynomial approximation of exp(x)-1
+// on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
+//
+// To avoid problems with arithmetic overflow and underflow,
+// n n1 n2
+// value of 2 is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
+// where BIAS is a value of exponent bias.
+//
+// Special cases:
+// exp(NaN) = NaN
+// exp(+INF) = +INF
+// exp(-INF) = 0
+// exp(x) = 1 for subnormals
+// for finite argument, only exp(0)=1 is exact
+// For IEEE double
+// if x > 709.782712893383973096 then exp(x) overflow
+// if x < -745.133219101941108420 then exp(x) underflow
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _cv[] =
+{
+ 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL, 0xfefa0000UL,
+ 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL, 0xbc9e3b3aUL, 0x3d1cf79aUL,
+ 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL,
+ 0x3fdfffffUL, 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL,
+ 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
+};
+
+ALIGNED_(16) juint _shifter[] =
+{
+ 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
+};
+
+ALIGNED_(16) juint _mmask[] =
+{
+ 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint _bias[] =
+{
+ 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint _Tbl_addr[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0e03754dUL,
+ 0x3cad7bbfUL, 0x3e778060UL, 0x00002c9aUL, 0x3567f613UL, 0x3c8cd252UL,
+ 0xd3158574UL, 0x000059b0UL, 0x61e6c861UL, 0x3c60f74eUL, 0x18759bc8UL,
+ 0x00008745UL, 0x5d837b6cUL, 0x3c979aa6UL, 0x6cf9890fUL, 0x0000b558UL,
+ 0x702f9cd1UL, 0x3c3ebe3dUL, 0x32d3d1a2UL, 0x0000e3ecUL, 0x1e63bcd8UL,
+ 0x3ca3516eUL, 0xd0125b50UL, 0x00011301UL, 0x26f0387bUL, 0x3ca4c554UL,
+ 0xaea92ddfUL, 0x0001429aUL, 0x62523fb6UL, 0x3ca95153UL, 0x3c7d517aUL,
+ 0x000172b8UL, 0x3f1353bfUL, 0x3c8b898cUL, 0xeb6fcb75UL, 0x0001a35bUL,
+ 0x3e3a2f5fUL, 0x3c9aecf7UL, 0x3168b9aaUL, 0x0001d487UL, 0x44a6c38dUL,
+ 0x3c8a6f41UL, 0x88628cd6UL, 0x0002063bUL, 0xe3a8a894UL, 0x3c968efdUL,
+ 0x6e756238UL, 0x0002387aUL, 0x981fe7f2UL, 0x3c80472bUL, 0x65e27cddUL,
+ 0x00026b45UL, 0x6d09ab31UL, 0x3c82f7e1UL, 0xf51fdee1UL, 0x00029e9dUL,
+ 0x720c0ab3UL, 0x3c8b3782UL, 0xa6e4030bUL, 0x0002d285UL, 0x4db0abb6UL,
+ 0x3c834d75UL, 0x0a31b715UL, 0x000306feUL, 0x5dd3f84aUL, 0x3c8fdd39UL,
+ 0xb26416ffUL, 0x00033c08UL, 0xcc187d29UL, 0x3ca12f8cUL, 0x373aa9caUL,
+ 0x000371a7UL, 0x738b5e8bUL, 0x3ca7d229UL, 0x34e59ff6UL, 0x0003a7dbUL,
+ 0xa72a4c6dUL, 0x3c859f48UL, 0x4c123422UL, 0x0003dea6UL, 0x259d9205UL,
+ 0x3ca8b846UL, 0x21f72e29UL, 0x0004160aUL, 0x60c2ac12UL, 0x3c4363edUL,
+ 0x6061892dUL, 0x00044e08UL, 0xdaa10379UL, 0x3c6ecce1UL, 0xb5c13cd0UL,
+ 0x000486a2UL, 0xbb7aafb0UL, 0x3c7690ceUL, 0xd5362a27UL, 0x0004bfdaUL,
+ 0x9b282a09UL, 0x3ca083ccUL, 0x769d2ca6UL, 0x0004f9b2UL, 0xc1aae707UL,
+ 0x3ca509b0UL, 0x569d4f81UL, 0x0005342bUL, 0x18fdd78eUL, 0x3c933505UL,
+ 0x36b527daUL, 0x00056f47UL, 0xe21c5409UL, 0x3c9063e1UL, 0xdd485429UL,
+ 0x0005ab07UL, 0x2b64c035UL, 0x3c9432e6UL, 0x15ad2148UL, 0x0005e76fUL,
+ 0x99f08c0aUL, 0x3ca01284UL, 0xb03a5584UL, 0x0006247eUL, 0x0073dc06UL,
+ 0x3c99f087UL, 0x82552224UL, 0x00066238UL, 0x0da05571UL, 0x3c998d4dUL,
+ 0x667f3bccUL, 0x0006a09eUL, 0x86ce4786UL, 0x3ca52bb9UL, 0x3c651a2eUL,
+ 0x0006dfb2UL, 0x206f0dabUL, 0x3ca32092UL, 0xe8ec5f73UL, 0x00071f75UL,
+ 0x8e17a7a6UL, 0x3ca06122UL, 0x564267c8UL, 0x00075febUL, 0x461e9f86UL,
+ 0x3ca244acUL, 0x73eb0186UL, 0x0007a114UL, 0xabd66c55UL, 0x3c65ebe1UL,
+ 0x36cf4e62UL, 0x0007e2f3UL, 0xbbff67d0UL, 0x3c96fe9fUL, 0x994cce12UL,
+ 0x00082589UL, 0x14c801dfUL, 0x3c951f14UL, 0x9b4492ecUL, 0x000868d9UL,
+ 0xc1f0eab4UL, 0x3c8db72fUL, 0x422aa0dbUL, 0x0008ace5UL, 0x59f35f44UL,
+ 0x3c7bf683UL, 0x99157736UL, 0x0008f1aeUL, 0x9c06283cUL, 0x3ca360baUL,
+ 0xb0cdc5e4UL, 0x00093737UL, 0x20f962aaUL, 0x3c95e8d1UL, 0x9fde4e4fUL,
+ 0x00097d82UL, 0x2b91ce27UL, 0x3c71affcUL, 0x82a3f090UL, 0x0009c491UL,
+ 0x589a2ebdUL, 0x3c9b6d34UL, 0x7b5de564UL, 0x000a0c66UL, 0x9ab89880UL,
+ 0x3c95277cUL, 0xb23e255cUL, 0x000a5503UL, 0x6e735ab3UL, 0x3c846984UL,
+ 0x5579fdbfUL, 0x000a9e6bUL, 0x92cb3387UL, 0x3c8c1a77UL, 0x995ad3adUL,
+ 0x000ae89fUL, 0xdc2d1d96UL, 0x3ca22466UL, 0xb84f15faUL, 0x000b33a2UL,
+ 0xb19505aeUL, 0x3ca1112eUL, 0xf2fb5e46UL, 0x000b7f76UL, 0x0a5fddcdUL,
+ 0x3c74ffd7UL, 0x904bc1d2UL, 0x000bcc1eUL, 0x30af0cb3UL, 0x3c736eaeUL,
+ 0xdd85529cUL, 0x000c199bUL, 0xd10959acUL, 0x3c84e08fUL, 0x2e57d14bUL,
+ 0x000c67f1UL, 0x6c921968UL, 0x3c676b2cUL, 0xdcef9069UL, 0x000cb720UL,
+ 0x36df99b3UL, 0x3c937009UL, 0x4a07897bUL, 0x000d072dUL, 0xa63d07a7UL,
+ 0x3c74a385UL, 0xdcfba487UL, 0x000d5818UL, 0xd5c192acUL, 0x3c8e5a50UL,
+ 0x03db3285UL, 0x000da9e6UL, 0x1c4a9792UL, 0x3c98bb73UL, 0x337b9b5eUL,
+ 0x000dfc97UL, 0x603a88d3UL, 0x3c74b604UL, 0xe78b3ff6UL, 0x000e502eUL,
+ 0x92094926UL, 0x3c916f27UL, 0xa2a490d9UL, 0x000ea4afUL, 0x41aa2008UL,
+ 0x3c8ec3bcUL, 0xee615a27UL, 0x000efa1bUL, 0x31d185eeUL, 0x3c8a64a9UL,
+ 0x5b6e4540UL, 0x000f5076UL, 0x4d91cd9dUL, 0x3c77893bUL, 0x819e90d8UL,
+ 0x000fa7c1UL
+};
+
+ALIGNED_(16) juint _ALLONES[] =
+{
+ 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL
+};
+
+ALIGNED_(16) juint _ebias[] =
+{
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3ff00000UL
+};
+
+ALIGNED_(4) juint _XMAX[] =
+{
+ 0xffffffffUL, 0x7fefffffUL
+};
+
+ALIGNED_(4) juint _XMIN[] =
+{
+ 0x00000000UL, 0x00100000UL
+};
+
+ALIGNED_(4) juint _INF[] =
+{
+ 0x00000000UL, 0x7ff00000UL
+};
+
+ALIGNED_(4) juint _ZERO[] =
+{
+ 0x00000000UL, 0x00000000UL
+};
+
+ALIGNED_(4) juint _ONE_val[] =
+{
+ 0x00000000UL, 0x3ff00000UL
+};
+
+
+// Registers:
+// input: xmm0
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, tmp - r11
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_exp(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+ jmp(start);
+ address cv = (address)_cv;
+ address Shifter = (address)_shifter;
+ address mmask = (address)_mmask;
+ address bias = (address)_bias;
+ address Tbl_addr = (address)_Tbl_addr;
+ address ALLONES = (address)_ALLONES;
+ address ebias = (address)_ebias;
+ address XMAX = (address)_XMAX;
+ address XMIN = (address)_XMIN;
+ address INF = (address)_INF;
+ address ZERO = (address)_ZERO;
+ address ONE_val = (address)_ONE_val;
+
+ bind(start);
+ subq(rsp, 24);
+ movsd(Address(rsp, 8), xmm0);
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm1, ExternalAddress(cv)); // 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL
+ movdqu(xmm6, ExternalAddress(Shifter)); // 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
+ movdqu(xmm2, ExternalAddress(16 + cv)); // 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL
+ movdqu(xmm3, ExternalAddress(32 + cv)); // 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ movl(edx, 16527);
+ subl(edx, eax);
+ subl(eax, 15504);
+ orl(edx, eax);
+ cmpl(edx, INT_MIN);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+ mulpd(xmm1, xmm0);
+ addpd(xmm1, xmm6);
+ movapd(xmm7, xmm1);
+ subpd(xmm1, xmm6);
+ mulpd(xmm2, xmm1);
+ movdqu(xmm4, ExternalAddress(64 + cv)); // 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL
+ mulpd(xmm3, xmm1);
+ movdqu(xmm5, ExternalAddress(80 + cv)); // 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
+ subpd(xmm0, xmm2);
+ movdl(eax, xmm7);
+ movl(ecx, eax);
+ andl(ecx, 63);
+ shll(ecx, 4);
+ sarl(eax, 6);
+ movl(edx, eax);
+ movdqu(xmm6, ExternalAddress(mmask)); // 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
+ pand(xmm7, xmm6);
+ movdqu(xmm6, ExternalAddress(bias)); // 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
+ paddq(xmm7, xmm6);
+ psllq(xmm7, 46);
+ subpd(xmm0, xmm3);
+ lea(tmp, ExternalAddress(Tbl_addr));
+ movdqu(xmm2, Address(ecx, tmp));
+ mulpd(xmm4, xmm0);
+ movapd(xmm6, xmm0);
+ movapd(xmm1, xmm0);
+ mulpd(xmm6, xmm6);
+ mulpd(xmm0, xmm6);
+ addpd(xmm5, xmm4);
+ mulsd(xmm0, xmm6);
+ mulpd(xmm6, ExternalAddress(48 + cv)); // 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL, 0x3fdfffffUL
+ addsd(xmm1, xmm2);
+ unpckhpd(xmm2, xmm2);
+ mulpd(xmm0, xmm5);
+ addsd(xmm1, xmm0);
+ por(xmm2, xmm7);
+ unpckhpd(xmm0, xmm0);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm6);
+ addl(edx, 894);
+ cmpl(edx, 1916);
+ jcc(Assembler::above, L_2TAG_PACKET_1_0_2);
+ mulsd(xmm0, xmm2);
+ addsd(xmm0, xmm2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ xorpd(xmm3, xmm3);
+ movdqu(xmm4, ExternalAddress(ALLONES)); // 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL
+ movl(edx, -1022);
+ subl(edx, eax);
+ movdl(xmm5, edx);
+ psllq(xmm4, xmm5);
+ movl(ecx, eax);
+ sarl(eax, 1);
+ pinsrw(xmm3, eax, 3);
+ movdqu(xmm6, ExternalAddress(ebias)); // 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3ff00000UL
+ psllq(xmm3, 4);
+ psubd(xmm2, xmm3);
+ mulsd(xmm0, xmm2);
+ cmpl(edx, 52);
+ jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
+ pand(xmm4, xmm2);
+ paddd(xmm3, xmm6);
+ subsd(xmm2, xmm4);
+ addsd(xmm0, xmm2);
+ cmpl(ecx, 1023);
+ jcc(Assembler::greaterEqual, L_2TAG_PACKET_3_0_2);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32768);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
+ movapd(xmm6, xmm0);
+ addsd(xmm0, xmm4);
+ mulsd(xmm0, xmm3);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ cmpl(ecx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_5_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ mulsd(xmm6, xmm3);
+ mulsd(xmm4, xmm3);
+ movdqu(xmm0, xmm6);
+ pxor(xmm6, xmm4);
+ psrad(xmm6, 31);
+ pshufd(xmm6, xmm6, 85);
+ psllq(xmm0, 1);
+ psrlq(xmm0, 1);
+ pxor(xmm0, xmm6);
+ psrlq(xmm6, 63);
+ paddq(xmm0, xmm6);
+ paddq(xmm0, xmm4);
+ movl(Address(rsp, 0), 15);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ addsd(xmm0, xmm4);
+ mulsd(xmm0, xmm3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ addsd(xmm0, xmm4);
+ mulsd(xmm0, xmm3);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ cmpl(ecx, 32752);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_7_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ paddd(xmm3, xmm6);
+ addpd(xmm0, xmm2);
+ mulsd(xmm0, xmm3);
+ movl(Address(rsp, 0), 15);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ cmpl(eax, 2146435072);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_9_0_2);
+ movl(eax, Address(rsp, 12));
+ cmpl(eax, INT_MIN);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_10_0_2);
+ movsd(xmm0, ExternalAddress(XMAX)); // 0xffffffffUL, 0x7fefffffUL
+ mulsd(xmm0, xmm0);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ movl(Address(rsp, 0), 14);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movsd(xmm0, ExternalAddress(XMIN)); // 0x00000000UL, 0x00100000UL
+ mulsd(xmm0, xmm0);
+ movl(Address(rsp, 0), 15);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movl(edx, Address(rsp, 8));
+ cmpl(eax, 2146435072);
+ jcc(Assembler::above, L_2TAG_PACKET_11_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_11_0_2);
+ movl(eax, Address(rsp, 12));
+ cmpl(eax, 2146435072);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_12_0_2);
+ movsd(xmm0, ExternalAddress(INF)); // 0x00000000UL, 0x7ff00000UL
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_12_0_2);
+ movsd(xmm0, ExternalAddress(ZERO)); // 0x00000000UL, 0x00000000UL
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_11_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ addsd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movl(eax, Address(rsp, 12));
+ andl(eax, 2147483647);
+ cmpl(eax, 1083179008);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_8_0_2);
+ movsd(Address(rsp, 8), xmm0);
+ addsd(xmm0, ExternalAddress(ONE_val)); // 0x00000000UL, 0x3ff00000UL
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ movq(Address(rsp, 16), xmm0);
+
+ bind(B1_3);
+ movq(xmm0, Address(rsp, 16));
+
+ bind(B1_5);
+ addq(rsp, 24);
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _static_const_table[] =
+{
+ 0x00000000UL, 0xfff00000UL, 0x00000000UL, 0xfff00000UL, 0xffffffc0UL,
+ 0x00000000UL, 0xffffffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL,
+ 0x0000ffc0UL, 0x00000000UL, 0x00000000UL, 0x43380000UL, 0x00000000UL,
+ 0x43380000UL, 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL,
+ 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL, 0xbc9e3b3aUL,
+ 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xfffffffeUL, 0x3fdfffffUL,
+ 0xfffffffeUL, 0x3fdfffffUL, 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL,
+ 0x3fa55555UL, 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0e03754dUL,
+ 0x3cad7bbfUL, 0x3e778060UL, 0x00002c9aUL, 0x3567f613UL, 0x3c8cd252UL,
+ 0xd3158574UL, 0x000059b0UL, 0x61e6c861UL, 0x3c60f74eUL, 0x18759bc8UL,
+ 0x00008745UL, 0x5d837b6cUL, 0x3c979aa6UL, 0x6cf9890fUL, 0x0000b558UL,
+ 0x702f9cd1UL, 0x3c3ebe3dUL, 0x32d3d1a2UL, 0x0000e3ecUL, 0x1e63bcd8UL,
+ 0x3ca3516eUL, 0xd0125b50UL, 0x00011301UL, 0x26f0387bUL, 0x3ca4c554UL,
+ 0xaea92ddfUL, 0x0001429aUL, 0x62523fb6UL, 0x3ca95153UL, 0x3c7d517aUL,
+ 0x000172b8UL, 0x3f1353bfUL, 0x3c8b898cUL, 0xeb6fcb75UL, 0x0001a35bUL,
+ 0x3e3a2f5fUL, 0x3c9aecf7UL, 0x3168b9aaUL, 0x0001d487UL, 0x44a6c38dUL,
+ 0x3c8a6f41UL, 0x88628cd6UL, 0x0002063bUL, 0xe3a8a894UL, 0x3c968efdUL,
+ 0x6e756238UL, 0x0002387aUL, 0x981fe7f2UL, 0x3c80472bUL, 0x65e27cddUL,
+ 0x00026b45UL, 0x6d09ab31UL, 0x3c82f7e1UL, 0xf51fdee1UL, 0x00029e9dUL,
+ 0x720c0ab3UL, 0x3c8b3782UL, 0xa6e4030bUL, 0x0002d285UL, 0x4db0abb6UL,
+ 0x3c834d75UL, 0x0a31b715UL, 0x000306feUL, 0x5dd3f84aUL, 0x3c8fdd39UL,
+ 0xb26416ffUL, 0x00033c08UL, 0xcc187d29UL, 0x3ca12f8cUL, 0x373aa9caUL,
+ 0x000371a7UL, 0x738b5e8bUL, 0x3ca7d229UL, 0x34e59ff6UL, 0x0003a7dbUL,
+ 0xa72a4c6dUL, 0x3c859f48UL, 0x4c123422UL, 0x0003dea6UL, 0x259d9205UL,
+ 0x3ca8b846UL, 0x21f72e29UL, 0x0004160aUL, 0x60c2ac12UL, 0x3c4363edUL,
+ 0x6061892dUL, 0x00044e08UL, 0xdaa10379UL, 0x3c6ecce1UL, 0xb5c13cd0UL,
+ 0x000486a2UL, 0xbb7aafb0UL, 0x3c7690ceUL, 0xd5362a27UL, 0x0004bfdaUL,
+ 0x9b282a09UL, 0x3ca083ccUL, 0x769d2ca6UL, 0x0004f9b2UL, 0xc1aae707UL,
+ 0x3ca509b0UL, 0x569d4f81UL, 0x0005342bUL, 0x18fdd78eUL, 0x3c933505UL,
+ 0x36b527daUL, 0x00056f47UL, 0xe21c5409UL, 0x3c9063e1UL, 0xdd485429UL,
+ 0x0005ab07UL, 0x2b64c035UL, 0x3c9432e6UL, 0x15ad2148UL, 0x0005e76fUL,
+ 0x99f08c0aUL, 0x3ca01284UL, 0xb03a5584UL, 0x0006247eUL, 0x0073dc06UL,
+ 0x3c99f087UL, 0x82552224UL, 0x00066238UL, 0x0da05571UL, 0x3c998d4dUL,
+ 0x667f3bccUL, 0x0006a09eUL, 0x86ce4786UL, 0x3ca52bb9UL, 0x3c651a2eUL,
+ 0x0006dfb2UL, 0x206f0dabUL, 0x3ca32092UL, 0xe8ec5f73UL, 0x00071f75UL,
+ 0x8e17a7a6UL, 0x3ca06122UL, 0x564267c8UL, 0x00075febUL, 0x461e9f86UL,
+ 0x3ca244acUL, 0x73eb0186UL, 0x0007a114UL, 0xabd66c55UL, 0x3c65ebe1UL,
+ 0x36cf4e62UL, 0x0007e2f3UL, 0xbbff67d0UL, 0x3c96fe9fUL, 0x994cce12UL,
+ 0x00082589UL, 0x14c801dfUL, 0x3c951f14UL, 0x9b4492ecUL, 0x000868d9UL,
+ 0xc1f0eab4UL, 0x3c8db72fUL, 0x422aa0dbUL, 0x0008ace5UL, 0x59f35f44UL,
+ 0x3c7bf683UL, 0x99157736UL, 0x0008f1aeUL, 0x9c06283cUL, 0x3ca360baUL,
+ 0xb0cdc5e4UL, 0x00093737UL, 0x20f962aaUL, 0x3c95e8d1UL, 0x9fde4e4fUL,
+ 0x00097d82UL, 0x2b91ce27UL, 0x3c71affcUL, 0x82a3f090UL, 0x0009c491UL,
+ 0x589a2ebdUL, 0x3c9b6d34UL, 0x7b5de564UL, 0x000a0c66UL, 0x9ab89880UL,
+ 0x3c95277cUL, 0xb23e255cUL, 0x000a5503UL, 0x6e735ab3UL, 0x3c846984UL,
+ 0x5579fdbfUL, 0x000a9e6bUL, 0x92cb3387UL, 0x3c8c1a77UL, 0x995ad3adUL,
+ 0x000ae89fUL, 0xdc2d1d96UL, 0x3ca22466UL, 0xb84f15faUL, 0x000b33a2UL,
+ 0xb19505aeUL, 0x3ca1112eUL, 0xf2fb5e46UL, 0x000b7f76UL, 0x0a5fddcdUL,
+ 0x3c74ffd7UL, 0x904bc1d2UL, 0x000bcc1eUL, 0x30af0cb3UL, 0x3c736eaeUL,
+ 0xdd85529cUL, 0x000c199bUL, 0xd10959acUL, 0x3c84e08fUL, 0x2e57d14bUL,
+ 0x000c67f1UL, 0x6c921968UL, 0x3c676b2cUL, 0xdcef9069UL, 0x000cb720UL,
+ 0x36df99b3UL, 0x3c937009UL, 0x4a07897bUL, 0x000d072dUL, 0xa63d07a7UL,
+ 0x3c74a385UL, 0xdcfba487UL, 0x000d5818UL, 0xd5c192acUL, 0x3c8e5a50UL,
+ 0x03db3285UL, 0x000da9e6UL, 0x1c4a9792UL, 0x3c98bb73UL, 0x337b9b5eUL,
+ 0x000dfc97UL, 0x603a88d3UL, 0x3c74b604UL, 0xe78b3ff6UL, 0x000e502eUL,
+ 0x92094926UL, 0x3c916f27UL, 0xa2a490d9UL, 0x000ea4afUL, 0x41aa2008UL,
+ 0x3c8ec3bcUL, 0xee615a27UL, 0x000efa1bUL, 0x31d185eeUL, 0x3c8a64a9UL,
+ 0x5b6e4540UL, 0x000f5076UL, 0x4d91cd9dUL, 0x3c77893bUL, 0x819e90d8UL,
+ 0x000fa7c1UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x7ff00000UL,
+ 0x00000000UL, 0x00000000UL, 0xffffffffUL, 0x7fefffffUL, 0x00000000UL,
+ 0x00100000UL
+};
+
+//registers,
+// input: (rbp + 8)
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, rbx (tmp)
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_exp(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+ jmp(start);
+ address static_const_table = (address)_static_const_table;
+
+ bind(start);
+ subl(rsp, 120);
+ movl(Address(rsp, 64), tmp);
+ lea(tmp, ExternalAddress(static_const_table));
+ movdqu(xmm0, Address(rsp, 128));
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm1, Address(tmp, 64)); // 0x652b82feUL, 0x40571547UL, 0x652b82feUL, 0x40571547UL
+ movdqu(xmm6, Address(tmp, 48)); // 0x00000000UL, 0x43380000UL, 0x00000000UL, 0x43380000UL
+ movdqu(xmm2, Address(tmp, 80)); // 0xfefa0000UL, 0x3f862e42UL, 0xfefa0000UL, 0x3f862e42UL
+ movdqu(xmm3, Address(tmp, 96)); // 0xbc9e3b3aUL, 0x3d1cf79aUL, 0xbc9e3b3aUL, 0x3d1cf79aUL
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ movl(edx, 16527);
+ subl(edx, eax);
+ subl(eax, 15504);
+ orl(edx, eax);
+ cmpl(edx, INT_MIN);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+ mulpd(xmm1, xmm0);
+ addpd(xmm1, xmm6);
+ movapd(xmm7, xmm1);
+ subpd(xmm1, xmm6);
+ mulpd(xmm2, xmm1);
+ movdqu(xmm4, Address(tmp, 128)); // 0xe3289860UL, 0x3f56c15cUL, 0x555b9e25UL, 0x3fa55555UL
+ mulpd(xmm3, xmm1);
+ movdqu(xmm5, Address(tmp, 144)); // 0xc090cf0fUL, 0x3f811115UL, 0x55548ba1UL, 0x3fc55555UL
+ subpd(xmm0, xmm2);
+ movdl(eax, xmm7);
+ movl(ecx, eax);
+ andl(ecx, 63);
+ shll(ecx, 4);
+ sarl(eax, 6);
+ movl(edx, eax);
+ movdqu(xmm6, Address(tmp, 16)); // 0xffffffc0UL, 0x00000000UL, 0xffffffc0UL, 0x00000000UL
+ pand(xmm7, xmm6);
+ movdqu(xmm6, Address(tmp, 32)); // 0x0000ffc0UL, 0x00000000UL, 0x0000ffc0UL, 0x00000000UL
+ paddq(xmm7, xmm6);
+ psllq(xmm7, 46);
+ subpd(xmm0, xmm3);
+ movdqu(xmm2, Address(tmp, ecx, Address::times_1, 160));
+ mulpd(xmm4, xmm0);
+ movapd(xmm6, xmm0);
+ movapd(xmm1, xmm0);
+ mulpd(xmm6, xmm6);
+ mulpd(xmm0, xmm6);
+ addpd(xmm5, xmm4);
+ mulsd(xmm0, xmm6);
+ mulpd(xmm6, Address(tmp, 112)); // 0xfffffffeUL, 0x3fdfffffUL, 0xfffffffeUL, 0x3fdfffffUL
+ addsd(xmm1, xmm2);
+ unpckhpd(xmm2, xmm2);
+ mulpd(xmm0, xmm5);
+ addsd(xmm1, xmm0);
+ por(xmm2, xmm7);
+ unpckhpd(xmm0, xmm0);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm6);
+ addl(edx, 894);
+ cmpl(edx, 1916);
+ jcc(Assembler::above, L_2TAG_PACKET_1_0_2);
+ mulsd(xmm0, xmm2);
+ addsd(xmm0, xmm2);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ fnstcw(Address(rsp, 24));
+ movzwl(edx, Address(rsp, 24));
+ orl(edx, 768);
+ movw(Address(rsp, 28), edx);
+ fldcw(Address(rsp, 28));
+ movl(edx, eax);
+ sarl(eax, 1);
+ subl(edx, eax);
+ movdqu(xmm6, Address(tmp, 0)); // 0x00000000UL, 0xfff00000UL, 0x00000000UL, 0xfff00000UL
+ pandn(xmm6, xmm2);
+ addl(eax, 1023);
+ movdl(xmm3, eax);
+ psllq(xmm3, 52);
+ por(xmm6, xmm3);
+ addl(edx, 1023);
+ movdl(xmm4, edx);
+ psllq(xmm4, 52);
+ movsd(Address(rsp, 8), xmm0);
+ fld_d(Address(rsp, 8));
+ movsd(Address(rsp, 16), xmm6);
+ fld_d(Address(rsp, 16));
+ fmula(1);
+ faddp(1);
+ movsd(Address(rsp, 8), xmm4);
+ fld_d(Address(rsp, 8));
+ fmulp(1);
+ fstp_d(Address(rsp, 8));
+ movsd(xmm0, Address(rsp, 8));
+ fldcw(Address(rsp, 24));
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ cmpl(ecx, 32752);
+ jcc(Assembler::greaterEqual, L_2TAG_PACKET_3_0_2);
+ cmpl(ecx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
+ jmp(L_2TAG_PACKET_2_0_2);
+ cmpl(ecx, INT_MIN);
+ jcc(Assembler::less, L_2TAG_PACKET_3_0_2);
+ cmpl(ecx, -1064950997);
+ jcc(Assembler::less, L_2TAG_PACKET_2_0_2);
+ jcc(Assembler::greater, L_2TAG_PACKET_4_0_2);
+ movl(edx, Address(rsp, 128));
+ cmpl(edx, -17155601);
+ jcc(Assembler::less, L_2TAG_PACKET_2_0_2);
+ jmp(L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ movl(edx, 14);
+ jmp(L_2TAG_PACKET_5_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ movl(edx, 15);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ movsd(xmm0, Address(rsp, 128));
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ cmpl(eax, 2146435072);
+ jcc(Assembler::greaterEqual, L_2TAG_PACKET_8_0_2);
+ movl(eax, Address(rsp, 132));
+ cmpl(eax, INT_MIN);
+ jcc(Assembler::greaterEqual, L_2TAG_PACKET_9_0_2);
+ movsd(xmm0, Address(tmp, 1208)); // 0xffffffffUL, 0x7fefffffUL
+ mulsd(xmm0, xmm0);
+ movl(edx, 14);
+ jmp(L_2TAG_PACKET_5_0_2);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movsd(xmm0, Address(tmp, 1216));
+ mulsd(xmm0, xmm0);
+ movl(edx, 15);
+ jmp(L_2TAG_PACKET_5_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ movl(edx, Address(rsp, 128));
+ cmpl(eax, 2146435072);
+ jcc(Assembler::above, L_2TAG_PACKET_10_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_2);
+ movl(eax, Address(rsp, 132));
+ cmpl(eax, 2146435072);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_11_0_2);
+ movsd(xmm0, Address(tmp, 1192)); // 0x00000000UL, 0x7ff00000UL
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_11_0_2);
+ movsd(xmm0, Address(tmp, 1200)); // 0x00000000UL, 0x00000000UL
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movsd(xmm0, Address(rsp, 128));
+ addsd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movl(eax, Address(rsp, 132));
+ andl(eax, 2147483647);
+ cmpl(eax, 1083179008);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_7_0_2);
+ movsd(xmm0, Address(rsp, 128));
+ addsd(xmm0, Address(tmp, 1184)); // 0x00000000UL, 0x3ff00000UL
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movsd(Address(rsp, 48), xmm0);
+ fld_d(Address(rsp, 48));
+
+ bind(L_2TAG_PACKET_6_0_2);
+ movl(tmp, Address(rsp, 64));
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_log.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,655 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - LOG()
+// ---------------------
+//
+// x=2^k * mx, mx in [1,2)
+//
+// Get B~1/mx based on the output of rcpss instruction (B0)
+// B = int((B0*2^7+0.5))/2^7
+//
+// Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
+//
+// Result: k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6) and
+// p(r) is a degree 7 polynomial
+// -log(B) read from data table (high, low parts)
+// Result is formed from high and low parts
+//
+// Special cases:
+// log(NaN) = quiet NaN, and raise invalid exception
+// log(+INF) = that INF
+// log(0) = -INF with divide-by-zero exception raised
+// log(1) = +0
+// log(x) = NaN with invalid exception raised if x < -0, including -INF
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _L_tbl[] =
+{
+ 0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
+ 0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
+ 0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
+ 0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
+ 0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
+ 0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
+ 0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
+ 0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
+ 0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
+ 0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
+ 0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
+ 0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
+ 0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
+ 0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
+ 0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
+ 0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
+ 0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
+ 0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
+ 0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
+ 0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
+ 0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
+ 0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
+ 0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
+ 0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
+ 0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
+ 0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
+ 0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
+ 0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
+ 0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
+ 0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
+ 0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
+ 0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
+ 0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
+ 0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
+ 0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
+ 0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
+ 0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
+ 0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
+ 0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
+ 0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
+ 0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
+ 0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
+ 0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
+ 0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
+ 0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
+ 0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
+ 0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
+ 0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
+ 0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
+ 0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
+ 0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
+ 0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
+ 0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
+ 0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
+ 0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
+ 0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
+ 0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
+ 0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
+ 0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
+ 0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
+ 0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
+ 0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
+ 0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
+ 0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
+ 0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
+ 0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
+ 0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
+ 0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
+ 0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
+ 0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
+ 0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
+ 0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
+ 0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
+ 0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
+ 0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
+ 0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
+ 0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
+ 0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
+ 0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
+ 0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
+ 0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
+ 0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
+ 0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
+ 0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
+ 0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
+ 0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
+ 0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
+ 0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
+ 0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
+ 0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
+ 0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
+ 0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
+ 0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
+ 0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
+ 0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
+ 0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
+ 0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
+ 0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
+ 0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
+ 0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
+ 0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
+ 0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
+ 0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x80000000UL
+};
+
+ALIGNED_(16) juint _log2[] =
+{
+ 0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL
+};
+
+ALIGNED_(16) juint _coeff[] =
+{
+ 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
+ 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
+ 0x00000000UL, 0xbfe00000UL
+};
+
+//registers,
+// input: xmm0
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, r8, r11
+
+void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp1, Register tmp2) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp1, tmp2, eax, ecx, edx);
+ jmp(start);
+ address L_tbl = (address)_L_tbl;
+ address log2 = (address)_log2;
+ address coeff = (address)_coeff;
+
+ bind(start);
+ subq(rsp, 24);
+ movsd(Address(rsp, 0), xmm0);
+ mov64(rax, 0x3ff0000000000000);
+ movdq(xmm2, rax);
+ mov64(rdx, 0x77f0000000000000);
+ movdq(xmm3, rdx);
+ movl(ecx, 32768);
+ movdl(xmm4, rcx);
+ mov64(tmp1, 0xffffe00000000000);
+ movdq(xmm5, tmp1);
+ movdqu(xmm1, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 16352);
+ psrlq(xmm0, 27);
+ lea(tmp2, ExternalAddress(L_tbl));
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 228);
+ psrlq(xmm1, 12);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ paddd(xmm0, xmm4);
+ por(xmm1, xmm3);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm1);
+ pand(xmm0, xmm6);
+ subsd(xmm1, xmm5);
+ mulpd(xmm5, xmm0);
+ andl(eax, 32752);
+ subl(eax, ecx);
+ cvtsi2sdl(xmm7, eax);
+ mulsd(xmm1, xmm0);
+ movq(xmm6, ExternalAddress(log2)); // 0xfefa3800UL, 0x3fa62e42UL
+ movdqu(xmm3, ExternalAddress(coeff)); // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
+ subsd(xmm5, xmm2);
+ andl(edx, 16711680);
+ shrl(edx, 12);
+ movdqu(xmm0, Address(tmp2, edx));
+ movdqu(xmm4, ExternalAddress(16 + coeff)); // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
+ addsd(xmm1, xmm5);
+ movdqu(xmm2, ExternalAddress(32 + coeff)); // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
+ mulsd(xmm6, xmm7);
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm5, xmm1);
+ }
+ else {
+ movdqu(xmm5, xmm1);
+ movlhps(xmm5, xmm5);
+ }
+ mulsd(xmm7, ExternalAddress(8 + log2)); // 0x93c76730UL, 0x3ceef357UL
+ mulsd(xmm3, xmm1);
+ addsd(xmm0, xmm6);
+ mulpd(xmm4, xmm5);
+ mulpd(xmm5, xmm5);
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm6, xmm0);
+ }
+ else {
+ movdqu(xmm6, xmm0);
+ movlhps(xmm6, xmm6);
+ }
+ addsd(xmm0, xmm1);
+ addpd(xmm4, xmm2);
+ mulpd(xmm3, xmm5);
+ subsd(xmm6, xmm0);
+ mulsd(xmm4, xmm1);
+ pshufd(xmm2, xmm0, 238);
+ addsd(xmm1, xmm6);
+ mulsd(xmm5, xmm5);
+ addsd(xmm7, xmm2);
+ addpd(xmm4, xmm3);
+ addsd(xmm1, xmm7);
+ mulpd(xmm4, xmm5);
+ addsd(xmm1, xmm4);
+ pshufd(xmm5, xmm4, 238);
+ addsd(xmm1, xmm5);
+ addsd(xmm0, xmm1);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movq(xmm0, Address(rsp, 0));
+ movq(xmm1, Address(rsp, 0));
+ addl(eax, 16);
+ cmpl(eax, 32768);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_2_0_2);
+ cmpl(eax, 16);
+ jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ addsd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ xorpd(xmm1, xmm1);
+ addsd(xmm1, xmm0);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 18416);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ movdqu(xmm1, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ psrlq(xmm0, 27);
+ movl(ecx, 18416);
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 228);
+ psrlq(xmm1, 12);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ addl(ecx, ecx);
+ cmpl(ecx, -2097152);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ movl(Address(rsp, 16), 3);
+ jmp(L_2TAG_PACKET_8_0_2);
+ bind(L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 49136);
+ pinsrw(xmm0, eax, 3);
+ divsd(xmm0, xmm1);
+ movl(Address(rsp, 16), 2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ movq(Address(rsp, 8), xmm0);
+
+ bind(B1_3);
+ movq(xmm0, Address(rsp, 8));
+
+ bind(B1_5);
+ addq(rsp, 24);
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _static_const_table_log[] =
+{
+ 0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
+ 0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
+ 0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
+ 0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
+ 0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
+ 0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
+ 0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
+ 0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
+ 0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
+ 0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
+ 0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
+ 0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
+ 0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
+ 0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
+ 0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
+ 0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
+ 0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
+ 0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
+ 0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
+ 0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
+ 0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
+ 0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
+ 0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
+ 0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
+ 0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
+ 0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
+ 0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
+ 0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
+ 0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
+ 0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
+ 0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
+ 0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
+ 0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
+ 0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
+ 0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
+ 0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
+ 0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
+ 0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
+ 0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
+ 0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
+ 0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
+ 0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
+ 0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
+ 0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
+ 0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
+ 0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
+ 0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
+ 0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
+ 0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
+ 0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
+ 0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
+ 0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
+ 0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
+ 0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
+ 0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
+ 0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
+ 0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
+ 0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
+ 0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
+ 0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
+ 0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
+ 0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
+ 0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
+ 0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
+ 0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
+ 0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
+ 0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
+ 0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
+ 0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
+ 0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
+ 0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
+ 0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
+ 0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
+ 0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
+ 0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
+ 0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
+ 0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
+ 0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
+ 0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
+ 0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
+ 0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
+ 0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
+ 0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
+ 0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
+ 0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
+ 0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
+ 0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
+ 0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
+ 0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
+ 0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
+ 0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
+ 0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
+ 0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
+ 0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
+ 0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
+ 0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
+ 0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
+ 0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
+ 0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
+ 0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
+ 0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
+ 0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
+ 0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x80000000UL, 0xfefa3800UL, 0x3fa62e42UL, 0x93c76730UL, 0x3ceef357UL,
+ 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL, 0x3d6fb175UL,
+ 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL, 0x9999999aUL, 0x3fc99999UL,
+ 0x00000000UL, 0xbfe00000UL, 0x00000000UL, 0xffffe000UL, 0x00000000UL,
+ 0xffffe000UL
+};
+//registers,
+// input: xmm0
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, rbx (tmp)
+
+void MacroAssembler::fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2;
+ Label L_2TAG_PACKET_10_0_2, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+ jmp(start);
+ address static_const_table = (address)_static_const_table_log;
+
+ bind(start);
+ subl(rsp, 104);
+ movl(Address(rsp, 40), tmp);
+ lea(tmp, ExternalAddress(static_const_table));
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ xorpd(xmm3, xmm3);
+ movl(edx, 30704);
+ pinsrw(xmm3, edx, 3);
+ movsd(xmm0, Address(rsp, 112));
+ movapd(xmm1, xmm0);
+ movl(ecx, 32768);
+ movdl(xmm4, ecx);
+ movsd(xmm5, Address(tmp, 2128)); // 0x00000000UL, 0xffffe000UL
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ psllq(xmm0, 5);
+ movl(ecx, 16352);
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 228);
+ psrlq(xmm1, 12);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ paddd(xmm0, xmm4);
+ por(xmm1, xmm3);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm1);
+ pand(xmm0, xmm6);
+ subsd(xmm1, xmm5);
+ mulpd(xmm5, xmm0);
+ andl(eax, 32752);
+ subl(eax, ecx);
+ cvtsi2sdl(xmm7, eax);
+ mulsd(xmm1, xmm0);
+ movsd(xmm6, Address(tmp, 2064)); // 0xfefa3800UL, 0x3fa62e42UL
+ movdqu(xmm3, Address(tmp, 2080)); // 0x92492492UL, 0x3fc24924UL, 0x00000000UL, 0xbfd00000UL
+ subsd(xmm5, xmm2);
+ andl(edx, 16711680);
+ shrl(edx, 12);
+ movdqu(xmm0, Address(tmp, edx));
+ movdqu(xmm4, Address(tmp, 2096)); // 0x3d6fb175UL, 0xbfc5555eUL, 0x55555555UL, 0x3fd55555UL
+ addsd(xmm1, xmm5);
+ movdqu(xmm2, Address(tmp, 2112)); // 0x9999999aUL, 0x3fc99999UL, 0x00000000UL, 0xbfe00000UL
+ mulsd(xmm6, xmm7);
+ pshufd(xmm5, xmm1, 68);
+ mulsd(xmm7, Address(tmp, 2072)); // 0x93c76730UL, 0x3ceef357UL, 0x92492492UL, 0x3fc24924UL
+ mulsd(xmm3, xmm1);
+ addsd(xmm0, xmm6);
+ mulpd(xmm4, xmm5);
+ mulpd(xmm5, xmm5);
+ pshufd(xmm6, xmm0, 228);
+ addsd(xmm0, xmm1);
+ addpd(xmm4, xmm2);
+ mulpd(xmm3, xmm5);
+ subsd(xmm6, xmm0);
+ mulsd(xmm4, xmm1);
+ pshufd(xmm2, xmm0, 238);
+ addsd(xmm1, xmm6);
+ mulsd(xmm5, xmm5);
+ addsd(xmm7, xmm2);
+ addpd(xmm4, xmm3);
+ addsd(xmm1, xmm7);
+ mulpd(xmm4, xmm5);
+ addsd(xmm1, xmm4);
+ pshufd(xmm5, xmm4, 238);
+ addsd(xmm1, xmm5);
+ addsd(xmm0, xmm1);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movsd(xmm0, Address(rsp, 112));
+ movdqu(xmm1, xmm0);
+ addl(eax, 16);
+ cmpl(eax, 32768);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_3_0_2);
+ cmpl(eax, 16);
+ jcc(Assembler::below, L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ addsd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
+ jmp(L_2TAG_PACKET_7_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ addl(ecx, ecx);
+ cmpl(ecx, -2097152);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_6_0_2);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ movl(edx, 3);
+ mulsd(xmm0, xmm1);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ movsd(xmm0, Address(rsp, 112));
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_10_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 49136);
+ pinsrw(xmm0, eax, 3);
+ divsd(xmm0, xmm1);
+ movl(edx, 2);
+ jmp(L_2TAG_PACKET_9_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 18416);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ movapd(xmm1, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ psllq(xmm0, 5);
+ movl(ecx, 18416);
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 228);
+ psrlq(xmm1, 12);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movsd(Address(rsp, 24), xmm0);
+ fld_d(Address(rsp, 24));
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movl(tmp, Address(rsp, 40));
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_log10.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,687 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - LOG10()
+// ---------------------
+//
+// Let x=2^k * mx, mx in [1,2)
+//
+// Get B~1/mx based on the output of rcpss instruction (B0)
+// B = int((B0*LH*2^7+0.5))/2^7
+// LH is a short approximation for log10(e)
+//
+// Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
+//
+// Result: k*log10(2) - log(B) + p(r)
+// p(r) is a degree 7 polynomial
+// -log(B) read from data table (high, low parts)
+// Result is formed from high and low parts
+//
+// Special cases:
+// log10(0) = -INF with divide-by-zero exception raised
+// log10(1) = +0
+// log10(x) = NaN with invalid exception raised if x < -0, including -INF
+// log10(+INF) = +INF
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _HIGHSIGMASK_log10[] =
+{
+ 0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xffffe000UL
+};
+
+ALIGNED_(16) juint _LOG10_E[] =
+{
+ 0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
+};
+
+ALIGNED_(16) juint _L_tbl_log10[] =
+{
+ 0x509f7800UL, 0x3fd34413UL, 0x1f12b358UL, 0x3d1fef31UL, 0x80333400UL,
+ 0x3fd32418UL, 0xc671d9d0UL, 0xbcf542bfUL, 0x51195000UL, 0x3fd30442UL,
+ 0x78a4b0c3UL, 0x3d18216aUL, 0x6fc79400UL, 0x3fd2e490UL, 0x80fa389dUL,
+ 0xbc902869UL, 0x89d04000UL, 0x3fd2c502UL, 0x75c2f564UL, 0x3d040754UL,
+ 0x4ddd1c00UL, 0x3fd2a598UL, 0xd219b2c3UL, 0xbcfa1d84UL, 0x6baa7c00UL,
+ 0x3fd28651UL, 0xfd9abec1UL, 0x3d1be6d3UL, 0x94028800UL, 0x3fd2672dUL,
+ 0xe289a455UL, 0xbd1ede5eUL, 0x78b86400UL, 0x3fd2482cUL, 0x6734d179UL,
+ 0x3d1fe79bUL, 0xcca3c800UL, 0x3fd2294dUL, 0x981a40b8UL, 0xbced34eaUL,
+ 0x439c5000UL, 0x3fd20a91UL, 0xcc392737UL, 0xbd1a9cc3UL, 0x92752c00UL,
+ 0x3fd1ebf6UL, 0x03c9afe7UL, 0x3d1e98f8UL, 0x6ef8dc00UL, 0x3fd1cd7dUL,
+ 0x71dae7f4UL, 0x3d08a86cUL, 0x8fe4dc00UL, 0x3fd1af25UL, 0xee9185a1UL,
+ 0xbcff3412UL, 0xace59400UL, 0x3fd190eeUL, 0xc2cab353UL, 0x3cf17ed9UL,
+ 0x7e925000UL, 0x3fd172d8UL, 0x6952c1b2UL, 0x3cf1521cUL, 0xbe694400UL,
+ 0x3fd154e2UL, 0xcacb79caUL, 0xbd0bdc78UL, 0x26cbac00UL, 0x3fd1370dUL,
+ 0xf71f4de1UL, 0xbd01f8beUL, 0x72fa0800UL, 0x3fd11957UL, 0x55bf910bUL,
+ 0x3c946e2bUL, 0x5f106000UL, 0x3fd0fbc1UL, 0x39e639c1UL, 0x3d14a84bUL,
+ 0xa802a800UL, 0x3fd0de4aUL, 0xd3f31d5dUL, 0xbd178385UL, 0x0b992000UL,
+ 0x3fd0c0f3UL, 0x3843106fUL, 0xbd1f602fUL, 0x486ce800UL, 0x3fd0a3baUL,
+ 0x8819497cUL, 0x3cef987aUL, 0x1de49400UL, 0x3fd086a0UL, 0x1caa0467UL,
+ 0x3d0faec7UL, 0x4c30cc00UL, 0x3fd069a4UL, 0xa4424372UL, 0xbd1618fcUL,
+ 0x94490000UL, 0x3fd04cc6UL, 0x946517d2UL, 0xbd18384bUL, 0xb7e84000UL,
+ 0x3fd03006UL, 0xe0109c37UL, 0xbd19a6acUL, 0x798a0c00UL, 0x3fd01364UL,
+ 0x5121e864UL, 0xbd164cf7UL, 0x38ce8000UL, 0x3fcfedbfUL, 0x46214d1aUL,
+ 0xbcbbc402UL, 0xc8e62000UL, 0x3fcfb4efUL, 0xdab93203UL, 0x3d1e0176UL,
+ 0x2cb02800UL, 0x3fcf7c5aUL, 0x2a2ea8e4UL, 0xbcfec86aUL, 0xeeeaa000UL,
+ 0x3fcf43fdUL, 0xc18e49a4UL, 0x3cf110a8UL, 0x9bb6e800UL, 0x3fcf0bdaUL,
+ 0x923cc9c0UL, 0xbd15ce99UL, 0xc093f000UL, 0x3fced3efUL, 0x4d4b51e9UL,
+ 0x3d1a04c7UL, 0xec58f800UL, 0x3fce9c3cUL, 0x163cad59UL, 0x3cac8260UL,
+ 0x9a907000UL, 0x3fce2d7dUL, 0x3fa93646UL, 0x3ce4a1c0UL, 0x37311000UL,
+ 0x3fcdbf99UL, 0x32abd1fdUL, 0x3d07ea9dUL, 0x6744b800UL, 0x3fcd528cUL,
+ 0x4dcbdfd4UL, 0xbd1b08e2UL, 0xe36de800UL, 0x3fcce653UL, 0x0b7b7f7fUL,
+ 0xbd1b8f03UL, 0x77506800UL, 0x3fcc7aecUL, 0xa821c9fbUL, 0x3d13c163UL,
+ 0x00ff8800UL, 0x3fcc1053UL, 0x536bca76UL, 0xbd074ee5UL, 0x70719800UL,
+ 0x3fcba684UL, 0xd7da9b6bUL, 0xbd1fbf16UL, 0xc6f8d800UL, 0x3fcb3d7dUL,
+ 0xe2220bb3UL, 0x3d1a295dUL, 0x16c15800UL, 0x3fcad53cUL, 0xe724911eUL,
+ 0xbcf55822UL, 0x82533800UL, 0x3fca6dbcUL, 0x6d982371UL, 0x3cac567cUL,
+ 0x3c19e800UL, 0x3fca06fcUL, 0x84d17d80UL, 0x3d1da204UL, 0x85ef8000UL,
+ 0x3fc9a0f8UL, 0x54466a6aUL, 0xbd002204UL, 0xb0ac2000UL, 0x3fc93baeUL,
+ 0xd601fd65UL, 0x3d18840cUL, 0x1bb9b000UL, 0x3fc8d71cUL, 0x7bf58766UL,
+ 0xbd14f897UL, 0x34aae800UL, 0x3fc8733eUL, 0x3af6ac24UL, 0xbd0f5c45UL,
+ 0x76d68000UL, 0x3fc81012UL, 0x4303e1a1UL, 0xbd1f9a80UL, 0x6af57800UL,
+ 0x3fc7ad96UL, 0x43fbcb46UL, 0x3cf4c33eUL, 0xa6c51000UL, 0x3fc74bc7UL,
+ 0x70f0eac5UL, 0xbd192e3bUL, 0xccab9800UL, 0x3fc6eaa3UL, 0xc0093dfeUL,
+ 0xbd0faf15UL, 0x8b60b800UL, 0x3fc68a28UL, 0xde78d5fdUL, 0xbc9ea4eeUL,
+ 0x9d987000UL, 0x3fc62a53UL, 0x962bea6eUL, 0xbd194084UL, 0xc9b0e800UL,
+ 0x3fc5cb22UL, 0x888dd999UL, 0x3d1fe201UL, 0xe1634800UL, 0x3fc56c93UL,
+ 0x16ada7adUL, 0x3d1b1188UL, 0xc176c000UL, 0x3fc50ea4UL, 0x4159b5b5UL,
+ 0xbcf09c08UL, 0x51766000UL, 0x3fc4b153UL, 0x84393d23UL, 0xbcf6a89cUL,
+ 0x83695000UL, 0x3fc4549dUL, 0x9f0b8bbbUL, 0x3d1c4b8cUL, 0x538d5800UL,
+ 0x3fc3f881UL, 0xf49df747UL, 0x3cf89b99UL, 0xc8138000UL, 0x3fc39cfcUL,
+ 0xd503b834UL, 0xbd13b99fUL, 0xf0df0800UL, 0x3fc3420dUL, 0xf011b386UL,
+ 0xbd05d8beUL, 0xe7466800UL, 0x3fc2e7b2UL, 0xf39c7bc2UL, 0xbd1bb94eUL,
+ 0xcdd62800UL, 0x3fc28de9UL, 0x05e6d69bUL, 0xbd10ed05UL, 0xd015d800UL,
+ 0x3fc234b0UL, 0xe29b6c9dUL, 0xbd1ff967UL, 0x224ea800UL, 0x3fc1dc06UL,
+ 0x727711fcUL, 0xbcffb30dUL, 0x01540000UL, 0x3fc183e8UL, 0x39786c5aUL,
+ 0x3cc23f57UL, 0xb24d9800UL, 0x3fc12c54UL, 0xc905a342UL, 0x3d003a1dUL,
+ 0x82835800UL, 0x3fc0d54aUL, 0x9b9920c0UL, 0x3d03b25aUL, 0xc72ac000UL,
+ 0x3fc07ec7UL, 0x46f26a24UL, 0x3cf0fa41UL, 0xdd35d800UL, 0x3fc028caUL,
+ 0x41d9d6dcUL, 0x3d034a65UL, 0x52474000UL, 0x3fbfa6a4UL, 0x44f66449UL,
+ 0x3d19cad3UL, 0x2da3d000UL, 0x3fbefcb8UL, 0x67832999UL, 0x3d18400fUL,
+ 0x32a10000UL, 0x3fbe53ceUL, 0x9c0e3b1aUL, 0xbcff62fdUL, 0x556b7000UL,
+ 0x3fbdabe3UL, 0x02976913UL, 0xbcf8243bUL, 0x97e88000UL, 0x3fbd04f4UL,
+ 0xec793797UL, 0x3d1c0578UL, 0x09647000UL, 0x3fbc5effUL, 0x05fc0565UL,
+ 0xbd1d799eUL, 0xc6426000UL, 0x3fbbb9ffUL, 0x4625f5edUL, 0x3d1f5723UL,
+ 0xf7afd000UL, 0x3fbb15f3UL, 0xdd5aae61UL, 0xbd1a7e1eUL, 0xd358b000UL,
+ 0x3fba72d8UL, 0x3314e4d3UL, 0x3d17bc91UL, 0x9b1f5000UL, 0x3fb9d0abUL,
+ 0x9a4d514bUL, 0x3cf18c9bUL, 0x9cd4e000UL, 0x3fb92f69UL, 0x7e4496abUL,
+ 0x3cf1f96dUL, 0x31f4f000UL, 0x3fb88f10UL, 0xf56479e7UL, 0x3d165818UL,
+ 0xbf628000UL, 0x3fb7ef9cUL, 0x26bf486dUL, 0xbd1113a6UL, 0xb526b000UL,
+ 0x3fb7510cUL, 0x1a1c3384UL, 0x3ca9898dUL, 0x8e31e000UL, 0x3fb6b35dUL,
+ 0xb3875361UL, 0xbd0661acUL, 0xd01de000UL, 0x3fb6168cUL, 0x2a7cacfaUL,
+ 0xbd1bdf10UL, 0x0af23000UL, 0x3fb57a98UL, 0xff868816UL, 0x3cf046d0UL,
+ 0xd8ea0000UL, 0x3fb4df7cUL, 0x1515fbe7UL, 0xbd1fd529UL, 0xde3b2000UL,
+ 0x3fb44538UL, 0x6e59a132UL, 0x3d1faeeeUL, 0xc8df9000UL, 0x3fb3abc9UL,
+ 0xf1322361UL, 0xbd198807UL, 0x505f1000UL, 0x3fb3132dUL, 0x0888e6abUL,
+ 0x3d1e5380UL, 0x359bd000UL, 0x3fb27b61UL, 0xdfbcbb22UL, 0xbcfe2724UL,
+ 0x429ee000UL, 0x3fb1e463UL, 0x6eb4c58cUL, 0xbcfe4dd6UL, 0x4a673000UL,
+ 0x3fb14e31UL, 0x4ce1ac9bUL, 0x3d1ba691UL, 0x28b96000UL, 0x3fb0b8c9UL,
+ 0x8c7813b8UL, 0xbd0b3872UL, 0xc1f08000UL, 0x3fb02428UL, 0xc2bc8c2cUL,
+ 0x3cb5ea6bUL, 0x05a1a000UL, 0x3faf209cUL, 0x72e8f18eUL, 0xbce8df84UL,
+ 0xc0b5e000UL, 0x3fadfa6dUL, 0x9fdef436UL, 0x3d087364UL, 0xaf416000UL,
+ 0x3facd5c2UL, 0x1068c3a9UL, 0x3d0827e7UL, 0xdb356000UL, 0x3fabb296UL,
+ 0x120a34d3UL, 0x3d101a9fUL, 0x5dfea000UL, 0x3faa90e6UL, 0xdaded264UL,
+ 0xbd14c392UL, 0x6034c000UL, 0x3fa970adUL, 0x1c9d06a9UL, 0xbd1b705eUL,
+ 0x194c6000UL, 0x3fa851e8UL, 0x83996ad9UL, 0xbd0117bcUL, 0xcf4ac000UL,
+ 0x3fa73492UL, 0xb1a94a62UL, 0xbca5ea42UL, 0xd67b4000UL, 0x3fa618a9UL,
+ 0x75aed8caUL, 0xbd07119bUL, 0x9126c000UL, 0x3fa4fe29UL, 0x5291d533UL,
+ 0x3d12658fUL, 0x6f4d4000UL, 0x3fa3e50eUL, 0xcd2c5cd9UL, 0x3d1d5c70UL,
+ 0xee608000UL, 0x3fa2cd54UL, 0xd1008489UL, 0x3d1a4802UL, 0x9900e000UL,
+ 0x3fa1b6f9UL, 0x54fb5598UL, 0xbd16593fUL, 0x06bb6000UL, 0x3fa0a1f9UL,
+ 0x64ef57b4UL, 0xbd17636bUL, 0xb7940000UL, 0x3f9f1c9fUL, 0xee6a4737UL,
+ 0x3cb5d479UL, 0x91aa0000UL, 0x3f9cf7f5UL, 0x3a16373cUL, 0x3d087114UL,
+ 0x156b8000UL, 0x3f9ad5edUL, 0x836c554aUL, 0x3c6900b0UL, 0xd4764000UL,
+ 0x3f98b67fUL, 0xed12f17bUL, 0xbcffc974UL, 0x77dec000UL, 0x3f9699a7UL,
+ 0x232ce7eaUL, 0x3d1e35bbUL, 0xbfbf4000UL, 0x3f947f5dUL, 0xd84ffa6eUL,
+ 0x3d0e0a49UL, 0x82c7c000UL, 0x3f92679cUL, 0x8d170e90UL, 0xbd14d9f2UL,
+ 0xadd20000UL, 0x3f90525dUL, 0x86d9f88eUL, 0x3cdeb986UL, 0x86f10000UL,
+ 0x3f8c7f36UL, 0xb9e0a517UL, 0x3ce29faaUL, 0xb75c8000UL, 0x3f885e9eUL,
+ 0x542568cbUL, 0xbd1f7bdbUL, 0x46b30000UL, 0x3f8442e8UL, 0xb954e7d9UL,
+ 0x3d1e5287UL, 0xb7e60000UL, 0x3f802c07UL, 0x22da0b17UL, 0xbd19fb27UL,
+ 0x6c8b0000UL, 0x3f7833e3UL, 0x821271efUL, 0xbd190f96UL, 0x29910000UL,
+ 0x3f701936UL, 0xbc3491a5UL, 0xbd1bcf45UL, 0x354a0000UL, 0x3f600fe3UL,
+ 0xc0ff520aUL, 0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL
+};
+
+ALIGNED_(16) juint _log2_log10[] =
+{
+ 0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL
+};
+
+ALIGNED_(16) juint _coeff_log10[] =
+{
+ 0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL, 0x385593b1UL,
+ 0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL,
+ 0xdc77b115UL, 0xbff27af2UL
+};
+
+// Registers:
+// input: xmm0
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, tmp - r11
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r11) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, B1_2, B1_3, B1_4, B1_5, start;
+
+ assert_different_registers(r11, eax, ecx, edx);
+
+ address HIGHSIGMASK = (address)_HIGHSIGMASK_log10;
+ address LOG10_E = (address)_LOG10_E;
+ address L_tbl = (address)_L_tbl_log10;
+ address log2 = (address)_log2_log10;
+ address coeff = (address)_coeff_log10;
+
+ bind(start);
+ subq(rsp, 24);
+ movsd(Address(rsp, 0), xmm0);
+
+ bind(B1_2);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movl(ecx, 1054736384);
+ movdl(xmm7, ecx);
+ xorpd(xmm3, xmm3);
+ movl(edx, 30704);
+ pinsrw(xmm3, edx, 3);
+ movdqu(xmm1, xmm0);
+ movl(edx, 32768);
+ movdl(xmm4, edx);
+ movdqu(xmm5, ExternalAddress(HIGHSIGMASK)); //0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xffffe000UL
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 16352);
+ psrlq(xmm0, 27);
+ movdqu(xmm2, ExternalAddress(LOG10_E)); //0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 78);
+ psrlq(xmm1, 12);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ mulss(xmm0, xmm7);
+ por(xmm1, xmm3);
+ lea(r11, ExternalAddress(L_tbl));
+ andpd(xmm5, xmm1);
+ paddd(xmm0, xmm4);
+ subsd(xmm1, xmm5);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ andpd(xmm0, xmm6);
+ andl(eax, 32752);
+ subl(eax, ecx);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ mulsd(xmm1, xmm0);
+ movq(xmm6, ExternalAddress(log2)); //0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL
+ movdqu(xmm3, ExternalAddress(coeff)); //0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL
+ subsd(xmm5, xmm2);
+ andl(edx, 16711680);
+ shrl(edx, 12);
+ movdqu(xmm0, Address(r11, rdx, Address::times_1, -1504));
+ movdqu(xmm4, ExternalAddress(16 + coeff)); //0x385593b1UL, 0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL
+ addsd(xmm1, xmm5);
+ movdqu(xmm2, ExternalAddress(32 + coeff)); //0x7f9d3aa1UL, 0x4016ab9fUL, 0xdc77b115UL, 0xbff27af2UL
+ mulsd(xmm6, xmm7);
+ pshufd(xmm5, xmm1, 68);
+ mulsd(xmm7, ExternalAddress(8 + log2)); //0x1f12b358UL, 0x3cdfef31UL
+ mulsd(xmm3, xmm1);
+ addsd(xmm0, xmm6);
+ mulpd(xmm4, xmm5);
+ movq(xmm6, ExternalAddress(8 + LOG10_E)); //0xbf2e4108UL, 0x3f5a7a6cUL
+ mulpd(xmm5, xmm5);
+ addpd(xmm4, xmm2);
+ mulpd(xmm3, xmm5);
+ pshufd(xmm2, xmm0, 228);
+ addsd(xmm0, xmm1);
+ mulsd(xmm4, xmm1);
+ subsd(xmm2, xmm0);
+ mulsd(xmm6, xmm1);
+ addsd(xmm1, xmm2);
+ pshufd(xmm2, xmm0, 238);
+ mulsd(xmm5, xmm5);
+ addsd(xmm7, xmm2);
+ addsd(xmm1, xmm6);
+ addpd(xmm4, xmm3);
+ addsd(xmm1, xmm7);
+ mulpd(xmm4, xmm5);
+ addsd(xmm1, xmm4);
+ pshufd(xmm5, xmm4, 238);
+ addsd(xmm1, xmm5);
+ addsd(xmm0, xmm1);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movq(xmm0, Address(rsp, 0));
+ movq(xmm1, Address(rsp, 0));
+ addl(eax, 16);
+ cmpl(eax, 32768);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_2_0_2);
+ cmpl(eax, 16);
+ jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ addsd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::above, L_2TAG_PACKET_4_0_2);
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ xorpd(xmm1, xmm1);
+ addsd(xmm1, xmm0);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 18416);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm1, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psrlq(xmm0, 27);
+ movdqu(xmm2, ExternalAddress(LOG10_E)); //0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 78);
+ psrlq(xmm1, 12);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ addl(ecx, ecx);
+ cmpl(ecx, -2097152);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ movl(Address(rsp, 16), 9);
+ jmp(L_2TAG_PACKET_8_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 49136);
+ pinsrw(xmm0, eax, 3);
+ divsd(xmm0, xmm1);
+ movl(Address(rsp, 16), 8);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ movq(Address(rsp, 8), xmm0);
+
+ bind(B1_3);
+ movq(xmm0, Address(rsp, 8));
+
+ bind(L_2TAG_PACKET_9_0_2);
+
+ bind(B1_5);
+ addq(rsp, 24);
+
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _static_const_table_log10[] =
+{
+ 0x509f7800UL, 0x3fd34413UL, 0x1f12b358UL, 0x3d1fef31UL, 0x80333400UL,
+ 0x3fd32418UL, 0xc671d9d0UL, 0xbcf542bfUL, 0x51195000UL, 0x3fd30442UL,
+ 0x78a4b0c3UL, 0x3d18216aUL, 0x6fc79400UL, 0x3fd2e490UL, 0x80fa389dUL,
+ 0xbc902869UL, 0x89d04000UL, 0x3fd2c502UL, 0x75c2f564UL, 0x3d040754UL,
+ 0x4ddd1c00UL, 0x3fd2a598UL, 0xd219b2c3UL, 0xbcfa1d84UL, 0x6baa7c00UL,
+ 0x3fd28651UL, 0xfd9abec1UL, 0x3d1be6d3UL, 0x94028800UL, 0x3fd2672dUL,
+ 0xe289a455UL, 0xbd1ede5eUL, 0x78b86400UL, 0x3fd2482cUL, 0x6734d179UL,
+ 0x3d1fe79bUL, 0xcca3c800UL, 0x3fd2294dUL, 0x981a40b8UL, 0xbced34eaUL,
+ 0x439c5000UL, 0x3fd20a91UL, 0xcc392737UL, 0xbd1a9cc3UL, 0x92752c00UL,
+ 0x3fd1ebf6UL, 0x03c9afe7UL, 0x3d1e98f8UL, 0x6ef8dc00UL, 0x3fd1cd7dUL,
+ 0x71dae7f4UL, 0x3d08a86cUL, 0x8fe4dc00UL, 0x3fd1af25UL, 0xee9185a1UL,
+ 0xbcff3412UL, 0xace59400UL, 0x3fd190eeUL, 0xc2cab353UL, 0x3cf17ed9UL,
+ 0x7e925000UL, 0x3fd172d8UL, 0x6952c1b2UL, 0x3cf1521cUL, 0xbe694400UL,
+ 0x3fd154e2UL, 0xcacb79caUL, 0xbd0bdc78UL, 0x26cbac00UL, 0x3fd1370dUL,
+ 0xf71f4de1UL, 0xbd01f8beUL, 0x72fa0800UL, 0x3fd11957UL, 0x55bf910bUL,
+ 0x3c946e2bUL, 0x5f106000UL, 0x3fd0fbc1UL, 0x39e639c1UL, 0x3d14a84bUL,
+ 0xa802a800UL, 0x3fd0de4aUL, 0xd3f31d5dUL, 0xbd178385UL, 0x0b992000UL,
+ 0x3fd0c0f3UL, 0x3843106fUL, 0xbd1f602fUL, 0x486ce800UL, 0x3fd0a3baUL,
+ 0x8819497cUL, 0x3cef987aUL, 0x1de49400UL, 0x3fd086a0UL, 0x1caa0467UL,
+ 0x3d0faec7UL, 0x4c30cc00UL, 0x3fd069a4UL, 0xa4424372UL, 0xbd1618fcUL,
+ 0x94490000UL, 0x3fd04cc6UL, 0x946517d2UL, 0xbd18384bUL, 0xb7e84000UL,
+ 0x3fd03006UL, 0xe0109c37UL, 0xbd19a6acUL, 0x798a0c00UL, 0x3fd01364UL,
+ 0x5121e864UL, 0xbd164cf7UL, 0x38ce8000UL, 0x3fcfedbfUL, 0x46214d1aUL,
+ 0xbcbbc402UL, 0xc8e62000UL, 0x3fcfb4efUL, 0xdab93203UL, 0x3d1e0176UL,
+ 0x2cb02800UL, 0x3fcf7c5aUL, 0x2a2ea8e4UL, 0xbcfec86aUL, 0xeeeaa000UL,
+ 0x3fcf43fdUL, 0xc18e49a4UL, 0x3cf110a8UL, 0x9bb6e800UL, 0x3fcf0bdaUL,
+ 0x923cc9c0UL, 0xbd15ce99UL, 0xc093f000UL, 0x3fced3efUL, 0x4d4b51e9UL,
+ 0x3d1a04c7UL, 0xec58f800UL, 0x3fce9c3cUL, 0x163cad59UL, 0x3cac8260UL,
+ 0x9a907000UL, 0x3fce2d7dUL, 0x3fa93646UL, 0x3ce4a1c0UL, 0x37311000UL,
+ 0x3fcdbf99UL, 0x32abd1fdUL, 0x3d07ea9dUL, 0x6744b800UL, 0x3fcd528cUL,
+ 0x4dcbdfd4UL, 0xbd1b08e2UL, 0xe36de800UL, 0x3fcce653UL, 0x0b7b7f7fUL,
+ 0xbd1b8f03UL, 0x77506800UL, 0x3fcc7aecUL, 0xa821c9fbUL, 0x3d13c163UL,
+ 0x00ff8800UL, 0x3fcc1053UL, 0x536bca76UL, 0xbd074ee5UL, 0x70719800UL,
+ 0x3fcba684UL, 0xd7da9b6bUL, 0xbd1fbf16UL, 0xc6f8d800UL, 0x3fcb3d7dUL,
+ 0xe2220bb3UL, 0x3d1a295dUL, 0x16c15800UL, 0x3fcad53cUL, 0xe724911eUL,
+ 0xbcf55822UL, 0x82533800UL, 0x3fca6dbcUL, 0x6d982371UL, 0x3cac567cUL,
+ 0x3c19e800UL, 0x3fca06fcUL, 0x84d17d80UL, 0x3d1da204UL, 0x85ef8000UL,
+ 0x3fc9a0f8UL, 0x54466a6aUL, 0xbd002204UL, 0xb0ac2000UL, 0x3fc93baeUL,
+ 0xd601fd65UL, 0x3d18840cUL, 0x1bb9b000UL, 0x3fc8d71cUL, 0x7bf58766UL,
+ 0xbd14f897UL, 0x34aae800UL, 0x3fc8733eUL, 0x3af6ac24UL, 0xbd0f5c45UL,
+ 0x76d68000UL, 0x3fc81012UL, 0x4303e1a1UL, 0xbd1f9a80UL, 0x6af57800UL,
+ 0x3fc7ad96UL, 0x43fbcb46UL, 0x3cf4c33eUL, 0xa6c51000UL, 0x3fc74bc7UL,
+ 0x70f0eac5UL, 0xbd192e3bUL, 0xccab9800UL, 0x3fc6eaa3UL, 0xc0093dfeUL,
+ 0xbd0faf15UL, 0x8b60b800UL, 0x3fc68a28UL, 0xde78d5fdUL, 0xbc9ea4eeUL,
+ 0x9d987000UL, 0x3fc62a53UL, 0x962bea6eUL, 0xbd194084UL, 0xc9b0e800UL,
+ 0x3fc5cb22UL, 0x888dd999UL, 0x3d1fe201UL, 0xe1634800UL, 0x3fc56c93UL,
+ 0x16ada7adUL, 0x3d1b1188UL, 0xc176c000UL, 0x3fc50ea4UL, 0x4159b5b5UL,
+ 0xbcf09c08UL, 0x51766000UL, 0x3fc4b153UL, 0x84393d23UL, 0xbcf6a89cUL,
+ 0x83695000UL, 0x3fc4549dUL, 0x9f0b8bbbUL, 0x3d1c4b8cUL, 0x538d5800UL,
+ 0x3fc3f881UL, 0xf49df747UL, 0x3cf89b99UL, 0xc8138000UL, 0x3fc39cfcUL,
+ 0xd503b834UL, 0xbd13b99fUL, 0xf0df0800UL, 0x3fc3420dUL, 0xf011b386UL,
+ 0xbd05d8beUL, 0xe7466800UL, 0x3fc2e7b2UL, 0xf39c7bc2UL, 0xbd1bb94eUL,
+ 0xcdd62800UL, 0x3fc28de9UL, 0x05e6d69bUL, 0xbd10ed05UL, 0xd015d800UL,
+ 0x3fc234b0UL, 0xe29b6c9dUL, 0xbd1ff967UL, 0x224ea800UL, 0x3fc1dc06UL,
+ 0x727711fcUL, 0xbcffb30dUL, 0x01540000UL, 0x3fc183e8UL, 0x39786c5aUL,
+ 0x3cc23f57UL, 0xb24d9800UL, 0x3fc12c54UL, 0xc905a342UL, 0x3d003a1dUL,
+ 0x82835800UL, 0x3fc0d54aUL, 0x9b9920c0UL, 0x3d03b25aUL, 0xc72ac000UL,
+ 0x3fc07ec7UL, 0x46f26a24UL, 0x3cf0fa41UL, 0xdd35d800UL, 0x3fc028caUL,
+ 0x41d9d6dcUL, 0x3d034a65UL, 0x52474000UL, 0x3fbfa6a4UL, 0x44f66449UL,
+ 0x3d19cad3UL, 0x2da3d000UL, 0x3fbefcb8UL, 0x67832999UL, 0x3d18400fUL,
+ 0x32a10000UL, 0x3fbe53ceUL, 0x9c0e3b1aUL, 0xbcff62fdUL, 0x556b7000UL,
+ 0x3fbdabe3UL, 0x02976913UL, 0xbcf8243bUL, 0x97e88000UL, 0x3fbd04f4UL,
+ 0xec793797UL, 0x3d1c0578UL, 0x09647000UL, 0x3fbc5effUL, 0x05fc0565UL,
+ 0xbd1d799eUL, 0xc6426000UL, 0x3fbbb9ffUL, 0x4625f5edUL, 0x3d1f5723UL,
+ 0xf7afd000UL, 0x3fbb15f3UL, 0xdd5aae61UL, 0xbd1a7e1eUL, 0xd358b000UL,
+ 0x3fba72d8UL, 0x3314e4d3UL, 0x3d17bc91UL, 0x9b1f5000UL, 0x3fb9d0abUL,
+ 0x9a4d514bUL, 0x3cf18c9bUL, 0x9cd4e000UL, 0x3fb92f69UL, 0x7e4496abUL,
+ 0x3cf1f96dUL, 0x31f4f000UL, 0x3fb88f10UL, 0xf56479e7UL, 0x3d165818UL,
+ 0xbf628000UL, 0x3fb7ef9cUL, 0x26bf486dUL, 0xbd1113a6UL, 0xb526b000UL,
+ 0x3fb7510cUL, 0x1a1c3384UL, 0x3ca9898dUL, 0x8e31e000UL, 0x3fb6b35dUL,
+ 0xb3875361UL, 0xbd0661acUL, 0xd01de000UL, 0x3fb6168cUL, 0x2a7cacfaUL,
+ 0xbd1bdf10UL, 0x0af23000UL, 0x3fb57a98UL, 0xff868816UL, 0x3cf046d0UL,
+ 0xd8ea0000UL, 0x3fb4df7cUL, 0x1515fbe7UL, 0xbd1fd529UL, 0xde3b2000UL,
+ 0x3fb44538UL, 0x6e59a132UL, 0x3d1faeeeUL, 0xc8df9000UL, 0x3fb3abc9UL,
+ 0xf1322361UL, 0xbd198807UL, 0x505f1000UL, 0x3fb3132dUL, 0x0888e6abUL,
+ 0x3d1e5380UL, 0x359bd000UL, 0x3fb27b61UL, 0xdfbcbb22UL, 0xbcfe2724UL,
+ 0x429ee000UL, 0x3fb1e463UL, 0x6eb4c58cUL, 0xbcfe4dd6UL, 0x4a673000UL,
+ 0x3fb14e31UL, 0x4ce1ac9bUL, 0x3d1ba691UL, 0x28b96000UL, 0x3fb0b8c9UL,
+ 0x8c7813b8UL, 0xbd0b3872UL, 0xc1f08000UL, 0x3fb02428UL, 0xc2bc8c2cUL,
+ 0x3cb5ea6bUL, 0x05a1a000UL, 0x3faf209cUL, 0x72e8f18eUL, 0xbce8df84UL,
+ 0xc0b5e000UL, 0x3fadfa6dUL, 0x9fdef436UL, 0x3d087364UL, 0xaf416000UL,
+ 0x3facd5c2UL, 0x1068c3a9UL, 0x3d0827e7UL, 0xdb356000UL, 0x3fabb296UL,
+ 0x120a34d3UL, 0x3d101a9fUL, 0x5dfea000UL, 0x3faa90e6UL, 0xdaded264UL,
+ 0xbd14c392UL, 0x6034c000UL, 0x3fa970adUL, 0x1c9d06a9UL, 0xbd1b705eUL,
+ 0x194c6000UL, 0x3fa851e8UL, 0x83996ad9UL, 0xbd0117bcUL, 0xcf4ac000UL,
+ 0x3fa73492UL, 0xb1a94a62UL, 0xbca5ea42UL, 0xd67b4000UL, 0x3fa618a9UL,
+ 0x75aed8caUL, 0xbd07119bUL, 0x9126c000UL, 0x3fa4fe29UL, 0x5291d533UL,
+ 0x3d12658fUL, 0x6f4d4000UL, 0x3fa3e50eUL, 0xcd2c5cd9UL, 0x3d1d5c70UL,
+ 0xee608000UL, 0x3fa2cd54UL, 0xd1008489UL, 0x3d1a4802UL, 0x9900e000UL,
+ 0x3fa1b6f9UL, 0x54fb5598UL, 0xbd16593fUL, 0x06bb6000UL, 0x3fa0a1f9UL,
+ 0x64ef57b4UL, 0xbd17636bUL, 0xb7940000UL, 0x3f9f1c9fUL, 0xee6a4737UL,
+ 0x3cb5d479UL, 0x91aa0000UL, 0x3f9cf7f5UL, 0x3a16373cUL, 0x3d087114UL,
+ 0x156b8000UL, 0x3f9ad5edUL, 0x836c554aUL, 0x3c6900b0UL, 0xd4764000UL,
+ 0x3f98b67fUL, 0xed12f17bUL, 0xbcffc974UL, 0x77dec000UL, 0x3f9699a7UL,
+ 0x232ce7eaUL, 0x3d1e35bbUL, 0xbfbf4000UL, 0x3f947f5dUL, 0xd84ffa6eUL,
+ 0x3d0e0a49UL, 0x82c7c000UL, 0x3f92679cUL, 0x8d170e90UL, 0xbd14d9f2UL,
+ 0xadd20000UL, 0x3f90525dUL, 0x86d9f88eUL, 0x3cdeb986UL, 0x86f10000UL,
+ 0x3f8c7f36UL, 0xb9e0a517UL, 0x3ce29faaUL, 0xb75c8000UL, 0x3f885e9eUL,
+ 0x542568cbUL, 0xbd1f7bdbUL, 0x46b30000UL, 0x3f8442e8UL, 0xb954e7d9UL,
+ 0x3d1e5287UL, 0xb7e60000UL, 0x3f802c07UL, 0x22da0b17UL, 0xbd19fb27UL,
+ 0x6c8b0000UL, 0x3f7833e3UL, 0x821271efUL, 0xbd190f96UL, 0x29910000UL,
+ 0x3f701936UL, 0xbc3491a5UL, 0xbd1bcf45UL, 0x354a0000UL, 0x3f600fe3UL,
+ 0xc0ff520aUL, 0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x509f7800UL, 0x3f934413UL, 0x1f12b358UL, 0x3cdfef31UL,
+ 0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL, 0xc0089309UL, 0x385593b1UL,
+ 0xc025c917UL, 0xdc963467UL, 0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL,
+ 0xdc77b115UL, 0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL,
+ 0xffffe000UL, 0x00000000UL, 0x3fdbc000UL, 0xbf2e4108UL, 0x3f5a7a6cUL
+};
+//registers,
+// input: xmm0
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, rbx (tmp)
+
+void MacroAssembler::fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+
+ address static_const_table_log10 = (address)_static_const_table_log10;
+
+ bind(start);
+ subl(rsp, 104);
+ movl(Address(rsp, 40), tmp);
+ lea(tmp, ExternalAddress(static_const_table_log10));
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movl(ecx, 1054736384);
+ movdl(xmm7, ecx);
+ xorpd(xmm3, xmm3);
+ movl(edx, 30704);
+ pinsrw(xmm3, edx, 3);
+ movsd(xmm0, Address(rsp, 112));
+ movdqu(xmm1, xmm0);
+ movl(edx, 32768);
+ movdl(xmm4, edx);
+ movdqu(xmm5, Address(tmp, 2128)); //0x3ffc6a02UL, 0x7f9d3aa1UL, 0x4016ab9fUL, 0xdc77b115UL
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 16352);
+ psllq(xmm0, 5);
+ movsd(xmm2, Address(tmp, 2144)); //0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 78);
+ psrlq(xmm1, 12);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ mulss(xmm0, xmm7);
+ por(xmm1, xmm3);
+ andpd(xmm5, xmm1);
+ paddd(xmm0, xmm4);
+ subsd(xmm1, xmm5);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ andpd(xmm0, xmm6);
+ andl(eax, 32752);
+ subl(eax, ecx);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ mulsd(xmm1, xmm0);
+ movsd(xmm6, Address(tmp, 2064)); //0xbd19d71cUL, 0x00000000UL, 0x00000000UL, 0x00000000UL
+ movdqu(xmm3, Address(tmp, 2080)); //0x00000000UL, 0x509f7800UL, 0x3f934413UL, 0x1f12b358UL
+ subsd(xmm5, xmm2);
+ andl(edx, 16711680);
+ shrl(edx, 12);
+ movdqu(xmm0, Address(tmp, edx, Address::times_1, -1504));
+ movdqu(xmm4, Address(tmp, 2096)); //0x3cdfef31UL, 0xc1a5f12eUL, 0x40358874UL, 0x64d4ef0dUL
+ addsd(xmm1, xmm5);
+ movdqu(xmm2, Address(tmp, 2112)); //0xc0089309UL, 0x385593b1UL, 0xc025c917UL, 0xdc963467UL
+ mulsd(xmm6, xmm7);
+ pshufd(xmm5, xmm1, 68);
+ mulsd(xmm7, Address(tmp, 2072)); //0x00000000UL, 0x00000000UL, 0x00000000UL, 0x509f7800UL
+ mulsd(xmm3, xmm1);
+ addsd(xmm0, xmm6);
+ mulpd(xmm4, xmm5);
+ movsd(xmm6, Address(tmp, 2152)); //0xffffffffUL, 0x00000000UL, 0xffffe000UL, 0x00000000UL
+ mulpd(xmm5, xmm5);
+ addpd(xmm4, xmm2);
+ mulpd(xmm3, xmm5);
+ pshufd(xmm2, xmm0, 228);
+ addsd(xmm0, xmm1);
+ mulsd(xmm4, xmm1);
+ subsd(xmm2, xmm0);
+ mulsd(xmm6, xmm1);
+ addsd(xmm1, xmm2);
+ pshufd(xmm2, xmm0, 238);
+ mulsd(xmm5, xmm5);
+ addsd(xmm7, xmm2);
+ addsd(xmm1, xmm6);
+ addpd(xmm4, xmm3);
+ addsd(xmm1, xmm7);
+ mulpd(xmm4, xmm5);
+ addsd(xmm1, xmm4);
+ pshufd(xmm5, xmm4, 238);
+ addsd(xmm1, xmm5);
+ addsd(xmm0, xmm1);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ movsd(xmm0, Address(rsp, 112)); //0xbcfa1d84UL, 0x6baa7c00UL, 0x3fd28651UL, 0xfd9abec1UL
+ movdqu(xmm1, xmm0);
+ addl(eax, 16);
+ cmpl(eax, 32768);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_3_0_2);
+ cmpl(eax, 16);
+ jcc(Assembler::below, L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ addsd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_2_0_2);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
+ cmpl(edx, 0);
+ jcc(Assembler::above, L_2TAG_PACKET_5_0_2);
+ jmp(L_2TAG_PACKET_7_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ addl(ecx, ecx);
+ cmpl(ecx, -2097152);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_6_0_2);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ movl(edx, 9);
+ mulsd(xmm0, xmm1);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ movsd(xmm0, Address(rsp, 112)); //0xbcfa1d84UL, 0x6baa7c00UL, 0x3fd28651UL, 0xfd9abec1UL
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_10_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ xorpd(xmm1, xmm1);
+ xorpd(xmm0, xmm0);
+ movl(eax, 49136);
+ pinsrw(xmm0, eax, 3);
+ divsd(xmm0, xmm1);
+ movl(edx, 8);
+ jmp(L_2TAG_PACKET_9_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ movdl(edx, xmm1);
+ psrlq(xmm1, 32);
+ movdl(ecx, xmm1);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 18416);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm1, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psllq(xmm0, 5);
+ movsd(xmm2, Address(tmp, 2144)); //0xbff27af2UL, 0xf8000000UL, 0xffffffffUL, 0x00000000UL
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm1, 12);
+ pshufd(xmm6, xmm5, 78);
+ psrlq(xmm1, 12);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movsd(Address(rsp, 24), xmm0);
+ fld_d(Address(rsp, 24));
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movl(tmp, Address(rsp, 40));
+
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_pow.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,3592 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - POW()
+// ---------------------
+//
+// Let x=2^k * mx, mx in [1,2)
+//
+// log2(x) calculation:
+//
+// 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 short approximation for log2(e)
+//
+// Reduced argument, scaled by LH:
+// r=B*mx-LH (computed accurately in high and low parts)
+//
+// log2(x) result: k - log2(B) + p(r)
+// p(r) is a degree 8 polynomial
+// -log2(B) read from data table (high, low parts)
+// log2(x) is formed from high and low parts
+// For |x| in [1-1/32, 1+1/16), a slower but more accurate computation
+// based om the same table design is performed.
+//
+// Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8,
+// to filter out all potential OF/UF cases.
+// exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5
+// polynomial
+//
+// Special cases:
+// pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd
+// integer < 0.
+// pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and
+// not an odd integer.
+// pow(-0,y) = -0 for y an odd integer > 0.
+// pow(-0,y) = +0 for y > 0 and not an odd integer.
+// pow(-1,-INF) = NaN.
+// pow(+1,y) = NaN for any y, even a NaN.
+// pow(x,-0) = 1 for any x, even a NaN.
+// pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and
+// finite non-integer y.
+// pow(x,-INF) = +INF for |x|<1.
+// pow(x,-INF) = +0 for |x|>1.
+// pow(x,+INF) = +0 for |x|<1.
+// pow(x,+INF) = +INF for |x|>1.
+// pow(-INF,y) = -0 for y an odd integer < 0.
+// pow(-INF,y) = +0 for y < 0 and not an odd integer.
+// pow(-INF,y) = -INF for y an odd integer > 0.
+// pow(-INF,y) = +INF for y > 0 and not an odd integer.
+// pow(+INF,y) = +0 for y <0.
+// pow(+INF,y) = +INF for y >0.
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _HIGHSIGMASK[] =
+{
+ 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
+};
+
+ALIGNED_(16) juint _LOG2_E[] =
+{
+ 0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+};
+
+ALIGNED_(16) juint _HIGHMASK_Y[] =
+{
+ 0x00000000UL, 0xfffffff8UL, 0x00000000UL, 0xffffffffUL
+};
+
+ALIGNED_(16) juint _T_exp[] =
+{
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3b700000UL, 0xfa5abcbfUL,
+ 0x3ff00b1aUL, 0xa7609f71UL, 0xbc84f6b2UL, 0xa9fb3335UL, 0x3ff0163dUL,
+ 0x9ab8cdb7UL, 0x3c9b6129UL, 0x143b0281UL, 0x3ff02168UL, 0x0fc54eb6UL,
+ 0xbc82bf31UL, 0x3e778061UL, 0x3ff02c9aUL, 0x535b085dUL, 0xbc719083UL,
+ 0x2e11bbccUL, 0x3ff037d4UL, 0xeeade11aUL, 0x3c656811UL, 0xe86e7f85UL,
+ 0x3ff04315UL, 0x1977c96eUL, 0xbc90a31cUL, 0x72f654b1UL, 0x3ff04e5fUL,
+ 0x3aa0d08cUL, 0x3c84c379UL, 0xd3158574UL, 0x3ff059b0UL, 0xa475b465UL,
+ 0x3c8d73e2UL, 0x0e3c1f89UL, 0x3ff0650aUL, 0x5799c397UL, 0xbc95cb7bUL,
+ 0x29ddf6deUL, 0x3ff0706bUL, 0xe2b13c27UL, 0xbc8c91dfUL, 0x2b72a836UL,
+ 0x3ff07bd4UL, 0x54458700UL, 0x3c832334UL, 0x18759bc8UL, 0x3ff08745UL,
+ 0x4bb284ffUL, 0x3c6186beUL, 0xf66607e0UL, 0x3ff092bdUL, 0x800a3fd1UL,
+ 0xbc968063UL, 0xcac6f383UL, 0x3ff09e3eUL, 0x18316136UL, 0x3c914878UL,
+ 0x9b1f3919UL, 0x3ff0a9c7UL, 0x873d1d38UL, 0x3c85d16cUL, 0x6cf9890fUL,
+ 0x3ff0b558UL, 0x4adc610bUL, 0x3c98a62eUL, 0x45e46c85UL, 0x3ff0c0f1UL,
+ 0x06d21cefUL, 0x3c94f989UL, 0x2b7247f7UL, 0x3ff0cc92UL, 0x16e24f71UL,
+ 0x3c901edcUL, 0x23395decUL, 0x3ff0d83bUL, 0xe43f316aUL, 0xbc9bc14dUL,
+ 0x32d3d1a2UL, 0x3ff0e3ecUL, 0x27c57b52UL, 0x3c403a17UL, 0x5fdfa9c5UL,
+ 0x3ff0efa5UL, 0xbc54021bUL, 0xbc949db9UL, 0xaffed31bUL, 0x3ff0fb66UL,
+ 0xc44ebd7bUL, 0xbc6b9bedUL, 0x28d7233eUL, 0x3ff10730UL, 0x1692fdd5UL,
+ 0x3c8d46ebUL, 0xd0125b51UL, 0x3ff11301UL, 0x39449b3aUL, 0xbc96c510UL,
+ 0xab5e2ab6UL, 0x3ff11edbUL, 0xf703fb72UL, 0xbc9ca454UL, 0xc06c31ccUL,
+ 0x3ff12abdUL, 0xb36ca5c7UL, 0xbc51b514UL, 0x14f204abUL, 0x3ff136a8UL,
+ 0xba48dcf0UL, 0xbc67108fUL, 0xaea92de0UL, 0x3ff1429aUL, 0x9af1369eUL,
+ 0xbc932fbfUL, 0x934f312eUL, 0x3ff14e95UL, 0x39bf44abUL, 0xbc8b91e8UL,
+ 0xc8a58e51UL, 0x3ff15a98UL, 0xb9eeab0aUL, 0x3c82406aUL, 0x5471c3c2UL,
+ 0x3ff166a4UL, 0x82ea1a32UL, 0x3c58f23bUL, 0x3c7d517bUL, 0x3ff172b8UL,
+ 0xb9d78a76UL, 0xbc819041UL, 0x8695bbc0UL, 0x3ff17ed4UL, 0xe2ac5a64UL,
+ 0x3c709e3fUL, 0x388c8deaUL, 0x3ff18af9UL, 0xd1970f6cUL, 0xbc911023UL,
+ 0x58375d2fUL, 0x3ff19726UL, 0x85f17e08UL, 0x3c94aaddUL, 0xeb6fcb75UL,
+ 0x3ff1a35bUL, 0x7b4968e4UL, 0x3c8e5b4cUL, 0xf8138a1cUL, 0x3ff1af99UL,
+ 0xa4b69280UL, 0x3c97bf85UL, 0x84045cd4UL, 0x3ff1bbe0UL, 0x352ef607UL,
+ 0xbc995386UL, 0x95281c6bUL, 0x3ff1c82fUL, 0x8010f8c9UL, 0x3c900977UL,
+ 0x3168b9aaUL, 0x3ff1d487UL, 0x00a2643cUL, 0x3c9e016eUL, 0x5eb44027UL,
+ 0x3ff1e0e7UL, 0x088cb6deUL, 0xbc96fdd8UL, 0x22fcd91dUL, 0x3ff1ed50UL,
+ 0x027bb78cUL, 0xbc91df98UL, 0x8438ce4dUL, 0x3ff1f9c1UL, 0xa097af5cUL,
+ 0xbc9bf524UL, 0x88628cd6UL, 0x3ff2063bUL, 0x814a8495UL, 0x3c8dc775UL,
+ 0x3578a819UL, 0x3ff212beUL, 0x2cfcaac9UL, 0x3c93592dUL, 0x917ddc96UL,
+ 0x3ff21f49UL, 0x9494a5eeUL, 0x3c82a97eUL, 0xa27912d1UL, 0x3ff22bddUL,
+ 0x5577d69fUL, 0x3c8d34fbUL, 0x6e756238UL, 0x3ff2387aUL, 0xb6c70573UL,
+ 0x3c99b07eUL, 0xfb82140aUL, 0x3ff2451fUL, 0x911ca996UL, 0x3c8acfccUL,
+ 0x4fb2a63fUL, 0x3ff251ceUL, 0xbef4f4a4UL, 0x3c8ac155UL, 0x711ece75UL,
+ 0x3ff25e85UL, 0x4ac31b2cUL, 0x3c93e1a2UL, 0x65e27cddUL, 0x3ff26b45UL,
+ 0x9940e9d9UL, 0x3c82bd33UL, 0x341ddf29UL, 0x3ff2780eUL, 0x05f9e76cUL,
+ 0x3c9e067cUL, 0xe1f56381UL, 0x3ff284dfUL, 0x8c3f0d7eUL, 0xbc9a4c3aUL,
+ 0x7591bb70UL, 0x3ff291baUL, 0x28401cbdUL, 0xbc82cc72UL, 0xf51fdee1UL,
+ 0x3ff29e9dUL, 0xafad1255UL, 0x3c8612e8UL, 0x66d10f13UL, 0x3ff2ab8aUL,
+ 0x191690a7UL, 0xbc995743UL, 0xd0dad990UL, 0x3ff2b87fUL, 0xd6381aa4UL,
+ 0xbc410adcUL, 0x39771b2fUL, 0x3ff2c57eUL, 0xa6eb5124UL, 0xbc950145UL,
+ 0xa6e4030bUL, 0x3ff2d285UL, 0x54db41d5UL, 0x3c900247UL, 0x1f641589UL,
+ 0x3ff2df96UL, 0xfbbce198UL, 0x3c9d16cfUL, 0xa93e2f56UL, 0x3ff2ecafUL,
+ 0x45d52383UL, 0x3c71ca0fUL, 0x4abd886bUL, 0x3ff2f9d2UL, 0x532bda93UL,
+ 0xbc653c55UL, 0x0a31b715UL, 0x3ff306feUL, 0xd23182e4UL, 0x3c86f46aUL,
+ 0xedeeb2fdUL, 0x3ff31432UL, 0xf3f3fcd1UL, 0x3c8959a3UL, 0xfc4cd831UL,
+ 0x3ff32170UL, 0x8e18047cUL, 0x3c8a9ce7UL, 0x3ba8ea32UL, 0x3ff32eb8UL,
+ 0x3cb4f318UL, 0xbc9c45e8UL, 0xb26416ffUL, 0x3ff33c08UL, 0x843659a6UL,
+ 0x3c932721UL, 0x66e3fa2dUL, 0x3ff34962UL, 0x930881a4UL, 0xbc835a75UL,
+ 0x5f929ff1UL, 0x3ff356c5UL, 0x5c4e4628UL, 0xbc8b5ceeUL, 0xa2de883bUL,
+ 0x3ff36431UL, 0xa06cb85eUL, 0xbc8c3144UL, 0x373aa9cbUL, 0x3ff371a7UL,
+ 0xbf42eae2UL, 0xbc963aeaUL, 0x231e754aUL, 0x3ff37f26UL, 0x9eceb23cUL,
+ 0xbc99f5caUL, 0x6d05d866UL, 0x3ff38caeUL, 0x3c9904bdUL, 0xbc9e958dUL,
+ 0x1b7140efUL, 0x3ff39a40UL, 0xfc8e2934UL, 0xbc99a9a5UL, 0x34e59ff7UL,
+ 0x3ff3a7dbUL, 0xd661f5e3UL, 0xbc75e436UL, 0xbfec6cf4UL, 0x3ff3b57fUL,
+ 0xe26fff18UL, 0x3c954c66UL, 0xc313a8e5UL, 0x3ff3c32dUL, 0x375d29c3UL,
+ 0xbc9efff8UL, 0x44ede173UL, 0x3ff3d0e5UL, 0x8c284c71UL, 0x3c7fe8d0UL,
+ 0x4c123422UL, 0x3ff3dea6UL, 0x11f09ebcUL, 0x3c8ada09UL, 0xdf1c5175UL,
+ 0x3ff3ec70UL, 0x7b8c9bcaUL, 0xbc8af663UL, 0x04ac801cUL, 0x3ff3fa45UL,
+ 0xf956f9f3UL, 0xbc97d023UL, 0xc367a024UL, 0x3ff40822UL, 0xb6f4d048UL,
+ 0x3c8bddf8UL, 0x21f72e2aUL, 0x3ff4160aUL, 0x1c309278UL, 0xbc5ef369UL,
+ 0x2709468aUL, 0x3ff423fbUL, 0xc0b314ddUL, 0xbc98462dUL, 0xd950a897UL,
+ 0x3ff431f5UL, 0xe35f7999UL, 0xbc81c7ddUL, 0x3f84b9d4UL, 0x3ff43ffaUL,
+ 0x9704c003UL, 0x3c8880beUL, 0x6061892dUL, 0x3ff44e08UL, 0x04ef80d0UL,
+ 0x3c489b7aUL, 0x42a7d232UL, 0x3ff45c20UL, 0x82fb1f8eUL, 0xbc686419UL,
+ 0xed1d0057UL, 0x3ff46a41UL, 0xd1648a76UL, 0x3c9c944bUL, 0x668b3237UL,
+ 0x3ff4786dUL, 0xed445733UL, 0xbc9c20f0UL, 0xb5c13cd0UL, 0x3ff486a2UL,
+ 0xb69062f0UL, 0x3c73c1a3UL, 0xe192aed2UL, 0x3ff494e1UL, 0x5e499ea0UL,
+ 0xbc83b289UL, 0xf0d7d3deUL, 0x3ff4a32aUL, 0xf3d1be56UL, 0x3c99cb62UL,
+ 0xea6db7d7UL, 0x3ff4b17dUL, 0x7f2897f0UL, 0xbc8125b8UL, 0xd5362a27UL,
+ 0x3ff4bfdaUL, 0xafec42e2UL, 0x3c7d4397UL, 0xb817c114UL, 0x3ff4ce41UL,
+ 0x690abd5dUL, 0x3c905e29UL, 0x99fddd0dUL, 0x3ff4dcb2UL, 0xbc6a7833UL,
+ 0x3c98ecdbUL, 0x81d8abffUL, 0x3ff4eb2dUL, 0x2e5d7a52UL, 0xbc95257dUL,
+ 0x769d2ca7UL, 0x3ff4f9b2UL, 0xd25957e3UL, 0xbc94b309UL, 0x7f4531eeUL,
+ 0x3ff50841UL, 0x49b7465fUL, 0x3c7a249bUL, 0xa2cf6642UL, 0x3ff516daUL,
+ 0x69bd93efUL, 0xbc8f7685UL, 0xe83f4eefUL, 0x3ff5257dUL, 0x43efef71UL,
+ 0xbc7c998dUL, 0x569d4f82UL, 0x3ff5342bUL, 0x1db13cadUL, 0xbc807abeUL,
+ 0xf4f6ad27UL, 0x3ff542e2UL, 0x192d5f7eUL, 0x3c87926dUL, 0xca5d920fUL,
+ 0x3ff551a4UL, 0xefede59bUL, 0xbc8d689cUL, 0xdde910d2UL, 0x3ff56070UL,
+ 0x168eebf0UL, 0xbc90fb6eUL, 0x36b527daUL, 0x3ff56f47UL, 0x011d93adUL,
+ 0x3c99bb2cUL, 0xdbe2c4cfUL, 0x3ff57e27UL, 0x8a57b9c4UL, 0xbc90b98cUL,
+ 0xd497c7fdUL, 0x3ff58d12UL, 0x5b9a1de8UL, 0x3c8295e1UL, 0x27ff07ccUL,
+ 0x3ff59c08UL, 0xe467e60fUL, 0xbc97e2ceUL, 0xdd485429UL, 0x3ff5ab07UL,
+ 0x054647adUL, 0x3c96324cUL, 0xfba87a03UL, 0x3ff5ba11UL, 0x4c233e1aUL,
+ 0xbc9b77a1UL, 0x8a5946b7UL, 0x3ff5c926UL, 0x816986a2UL, 0x3c3c4b1bUL,
+ 0x90998b93UL, 0x3ff5d845UL, 0xa8b45643UL, 0xbc9cd6a7UL, 0x15ad2148UL,
+ 0x3ff5e76fUL, 0x3080e65eUL, 0x3c9ba6f9UL, 0x20dceb71UL, 0x3ff5f6a3UL,
+ 0xe3cdcf92UL, 0xbc89eaddUL, 0xb976dc09UL, 0x3ff605e1UL, 0x9b56de47UL,
+ 0xbc93e242UL, 0xe6cdf6f4UL, 0x3ff6152aUL, 0x4ab84c27UL, 0x3c9e4b3eUL,
+ 0xb03a5585UL, 0x3ff6247eUL, 0x7e40b497UL, 0xbc9383c1UL, 0x1d1929fdUL,
+ 0x3ff633ddUL, 0xbeb964e5UL, 0x3c984710UL, 0x34ccc320UL, 0x3ff64346UL,
+ 0x759d8933UL, 0xbc8c483cUL, 0xfebc8fb7UL, 0x3ff652b9UL, 0xc9a73e09UL,
+ 0xbc9ae3d5UL, 0x82552225UL, 0x3ff66238UL, 0x87591c34UL, 0xbc9bb609UL,
+ 0xc70833f6UL, 0x3ff671c1UL, 0x586c6134UL, 0xbc8e8732UL, 0xd44ca973UL,
+ 0x3ff68155UL, 0x44f73e65UL, 0x3c6038aeUL, 0xb19e9538UL, 0x3ff690f4UL,
+ 0x9aeb445dUL, 0x3c8804bdUL, 0x667f3bcdUL, 0x3ff6a09eUL, 0x13b26456UL,
+ 0xbc9bdd34UL, 0xfa75173eUL, 0x3ff6b052UL, 0x2c9a9d0eUL, 0x3c7a38f5UL,
+ 0x750bdabfUL, 0x3ff6c012UL, 0x67ff0b0dUL, 0xbc728956UL, 0xddd47645UL,
+ 0x3ff6cfdcUL, 0xb6f17309UL, 0x3c9c7aa9UL, 0x3c651a2fUL, 0x3ff6dfb2UL,
+ 0x683c88abUL, 0xbc6bbe3aUL, 0x98593ae5UL, 0x3ff6ef92UL, 0x9e1ac8b2UL,
+ 0xbc90b974UL, 0xf9519484UL, 0x3ff6ff7dUL, 0x25860ef6UL, 0xbc883c0fUL,
+ 0x66f42e87UL, 0x3ff70f74UL, 0xd45aa65fUL, 0x3c59d644UL, 0xe8ec5f74UL,
+ 0x3ff71f75UL, 0x86887a99UL, 0xbc816e47UL, 0x86ead08aUL, 0x3ff72f82UL,
+ 0x2cd62c72UL, 0xbc920aa0UL, 0x48a58174UL, 0x3ff73f9aUL, 0x6c65d53cUL,
+ 0xbc90a8d9UL, 0x35d7cbfdUL, 0x3ff74fbdUL, 0x618a6e1cUL, 0x3c9047fdUL,
+ 0x564267c9UL, 0x3ff75febUL, 0x57316dd3UL, 0xbc902459UL, 0xb1ab6e09UL,
+ 0x3ff77024UL, 0x169147f8UL, 0x3c9b7877UL, 0x4fde5d3fUL, 0x3ff78069UL,
+ 0x0a02162dUL, 0x3c9866b8UL, 0x38ac1cf6UL, 0x3ff790b9UL, 0x62aadd3eUL,
+ 0x3c9349a8UL, 0x73eb0187UL, 0x3ff7a114UL, 0xee04992fUL, 0xbc841577UL,
+ 0x0976cfdbUL, 0x3ff7b17bUL, 0x8468dc88UL, 0xbc9bebb5UL, 0x0130c132UL,
+ 0x3ff7c1edUL, 0xd1164dd6UL, 0x3c9f124cUL, 0x62ff86f0UL, 0x3ff7d26aUL,
+ 0xfb72b8b4UL, 0x3c91bddbUL, 0x36cf4e62UL, 0x3ff7e2f3UL, 0xba15797eUL,
+ 0x3c705d02UL, 0x8491c491UL, 0x3ff7f387UL, 0xcf9311aeUL, 0xbc807f11UL,
+ 0x543e1a12UL, 0x3ff80427UL, 0x626d972bUL, 0xbc927c86UL, 0xadd106d9UL,
+ 0x3ff814d2UL, 0x0d151d4dUL, 0x3c946437UL, 0x994cce13UL, 0x3ff82589UL,
+ 0xd41532d8UL, 0xbc9d4c1dUL, 0x1eb941f7UL, 0x3ff8364cUL, 0x31df2bd5UL,
+ 0x3c999b9aUL, 0x4623c7adUL, 0x3ff8471aUL, 0xa341cdfbUL, 0xbc88d684UL,
+ 0x179f5b21UL, 0x3ff857f4UL, 0xf8b216d0UL, 0xbc5ba748UL, 0x9b4492edUL,
+ 0x3ff868d9UL, 0x9bd4f6baUL, 0xbc9fc6f8UL, 0xd931a436UL, 0x3ff879caUL,
+ 0xd2db47bdUL, 0x3c85d2d7UL, 0xd98a6699UL, 0x3ff88ac7UL, 0xf37cb53aUL,
+ 0x3c9994c2UL, 0xa478580fUL, 0x3ff89bd0UL, 0x4475202aUL, 0x3c9d5395UL,
+ 0x422aa0dbUL, 0x3ff8ace5UL, 0x56864b27UL, 0x3c96e9f1UL, 0xbad61778UL,
+ 0x3ff8be05UL, 0xfc43446eUL, 0x3c9ecb5eUL, 0x16b5448cUL, 0x3ff8cf32UL,
+ 0x32e9e3aaUL, 0xbc70d55eUL, 0x5e0866d9UL, 0x3ff8e06aUL, 0x6fc9b2e6UL,
+ 0xbc97114aUL, 0x99157736UL, 0x3ff8f1aeUL, 0xa2e3976cUL, 0x3c85cc13UL,
+ 0xd0282c8aUL, 0x3ff902feUL, 0x85fe3fd2UL, 0x3c9592caUL, 0x0b91ffc6UL,
+ 0x3ff9145bUL, 0x2e582524UL, 0xbc9dd679UL, 0x53aa2fe2UL, 0x3ff925c3UL,
+ 0xa639db7fUL, 0xbc83455fUL, 0xb0cdc5e5UL, 0x3ff93737UL, 0x81b57ebcUL,
+ 0xbc675fc7UL, 0x2b5f98e5UL, 0x3ff948b8UL, 0x797d2d99UL, 0xbc8dc3d6UL,
+ 0xcbc8520fUL, 0x3ff95a44UL, 0x96a5f039UL, 0xbc764b7cUL, 0x9a7670b3UL,
+ 0x3ff96bddUL, 0x7f19c896UL, 0xbc5ba596UL, 0x9fde4e50UL, 0x3ff97d82UL,
+ 0x7c1b85d1UL, 0xbc9d185bUL, 0xe47a22a2UL, 0x3ff98f33UL, 0xa24c78ecUL,
+ 0x3c7cabdaUL, 0x70ca07baUL, 0x3ff9a0f1UL, 0x91cee632UL, 0xbc9173bdUL,
+ 0x4d53fe0dUL, 0x3ff9b2bbUL, 0x4df6d518UL, 0xbc9dd84eUL, 0x82a3f090UL,
+ 0x3ff9c491UL, 0xb071f2beUL, 0x3c7c7c46UL, 0x194bb8d5UL, 0x3ff9d674UL,
+ 0xa3dd8233UL, 0xbc9516beUL, 0x19e32323UL, 0x3ff9e863UL, 0x78e64c6eUL,
+ 0x3c7824caUL, 0x8d07f29eUL, 0x3ff9fa5eUL, 0xaaf1faceUL, 0xbc84a9ceUL,
+ 0x7b5de565UL, 0x3ffa0c66UL, 0x5d1cd533UL, 0xbc935949UL, 0xed8eb8bbUL,
+ 0x3ffa1e7aUL, 0xee8be70eUL, 0x3c9c6618UL, 0xec4a2d33UL, 0x3ffa309bUL,
+ 0x7ddc36abUL, 0x3c96305cUL, 0x80460ad8UL, 0x3ffa42c9UL, 0x589fb120UL,
+ 0xbc9aa780UL, 0xb23e255dUL, 0x3ffa5503UL, 0xdb8d41e1UL, 0xbc9d2f6eUL,
+ 0x8af46052UL, 0x3ffa674aUL, 0x30670366UL, 0x3c650f56UL, 0x1330b358UL,
+ 0x3ffa799eUL, 0xcac563c7UL, 0x3c9bcb7eUL, 0x53c12e59UL, 0x3ffa8bfeUL,
+ 0xb2ba15a9UL, 0xbc94f867UL, 0x5579fdbfUL, 0x3ffa9e6bUL, 0x0ef7fd31UL,
+ 0x3c90fac9UL, 0x21356ebaUL, 0x3ffab0e5UL, 0xdae94545UL, 0x3c889c31UL,
+ 0xbfd3f37aUL, 0x3ffac36bUL, 0xcae76cd0UL, 0xbc8f9234UL, 0x3a3c2774UL,
+ 0x3ffad5ffUL, 0xb6b1b8e5UL, 0x3c97ef3bUL, 0x995ad3adUL, 0x3ffae89fUL,
+ 0x345dcc81UL, 0x3c97a1cdUL, 0xe622f2ffUL, 0x3ffafb4cUL, 0x0f315ecdUL,
+ 0xbc94b2fcUL, 0x298db666UL, 0x3ffb0e07UL, 0x4c80e425UL, 0xbc9bdef5UL,
+ 0x6c9a8952UL, 0x3ffb20ceUL, 0x4a0756ccUL, 0x3c94dd02UL, 0xb84f15fbUL,
+ 0x3ffb33a2UL, 0x3084d708UL, 0xbc62805eUL, 0x15b749b1UL, 0x3ffb4684UL,
+ 0xe9df7c90UL, 0xbc7f763dUL, 0x8de5593aUL, 0x3ffb5972UL, 0xbbba6de3UL,
+ 0xbc9c71dfUL, 0x29f1c52aUL, 0x3ffb6c6eUL, 0x52883f6eUL, 0x3c92a8f3UL,
+ 0xf2fb5e47UL, 0x3ffb7f76UL, 0x7e54ac3bUL, 0xbc75584fUL, 0xf22749e4UL,
+ 0x3ffb928cUL, 0x54cb65c6UL, 0xbc9b7216UL, 0x30a1064aUL, 0x3ffba5b0UL,
+ 0x0e54292eUL, 0xbc9efcd3UL, 0xb79a6f1fUL, 0x3ffbb8e0UL, 0xc9696205UL,
+ 0xbc3f52d1UL, 0x904bc1d2UL, 0x3ffbcc1eUL, 0x7a2d9e84UL, 0x3c823dd0UL,
+ 0xc3f3a207UL, 0x3ffbdf69UL, 0x60ea5b53UL, 0xbc3c2623UL, 0x5bd71e09UL,
+ 0x3ffbf2c2UL, 0x3f6b9c73UL, 0xbc9efdcaUL, 0x6141b33dUL, 0x3ffc0628UL,
+ 0xa1fbca34UL, 0xbc8d8a5aUL, 0xdd85529cUL, 0x3ffc199bUL, 0x895048ddUL,
+ 0x3c811065UL, 0xd9fa652cUL, 0x3ffc2d1cUL, 0x17c8a5d7UL, 0xbc96e516UL,
+ 0x5fffd07aUL, 0x3ffc40abUL, 0xe083c60aUL, 0x3c9b4537UL, 0x78fafb22UL,
+ 0x3ffc5447UL, 0x2493b5afUL, 0x3c912f07UL, 0x2e57d14bUL, 0x3ffc67f1UL,
+ 0xff483cadUL, 0x3c92884dUL, 0x8988c933UL, 0x3ffc7ba8UL, 0xbe255559UL,
+ 0xbc8e76bbUL, 0x9406e7b5UL, 0x3ffc8f6dUL, 0x48805c44UL, 0x3c71acbcUL,
+ 0x5751c4dbUL, 0x3ffca340UL, 0xd10d08f5UL, 0xbc87f2beUL, 0xdcef9069UL,
+ 0x3ffcb720UL, 0xd1e949dbUL, 0x3c7503cbUL, 0x2e6d1675UL, 0x3ffccb0fUL,
+ 0x86009092UL, 0xbc7d220fUL, 0x555dc3faUL, 0x3ffcdf0bUL, 0x53829d72UL,
+ 0xbc8dd83bUL, 0x5b5bab74UL, 0x3ffcf315UL, 0xb86dff57UL, 0xbc9a08e9UL,
+ 0x4a07897cUL, 0x3ffd072dUL, 0x43797a9cUL, 0xbc9cbc37UL, 0x2b08c968UL,
+ 0x3ffd1b53UL, 0x219a36eeUL, 0x3c955636UL, 0x080d89f2UL, 0x3ffd2f87UL,
+ 0x719d8578UL, 0xbc9d487bUL, 0xeacaa1d6UL, 0x3ffd43c8UL, 0xbf5a1614UL,
+ 0x3c93db53UL, 0xdcfba487UL, 0x3ffd5818UL, 0xd75b3707UL, 0x3c82ed02UL,
+ 0xe862e6d3UL, 0x3ffd6c76UL, 0x4a8165a0UL, 0x3c5fe87aUL, 0x16c98398UL,
+ 0x3ffd80e3UL, 0x8beddfe8UL, 0xbc911ec1UL, 0x71ff6075UL, 0x3ffd955dUL,
+ 0xbb9af6beUL, 0x3c9a052dUL, 0x03db3285UL, 0x3ffda9e6UL, 0x696db532UL,
+ 0x3c9c2300UL, 0xd63a8315UL, 0x3ffdbe7cUL, 0x926b8be4UL, 0xbc9b76f1UL,
+ 0xf301b460UL, 0x3ffdd321UL, 0x78f018c3UL, 0x3c92da57UL, 0x641c0658UL,
+ 0x3ffde7d5UL, 0x8e79ba8fUL, 0xbc9ca552UL, 0x337b9b5fUL, 0x3ffdfc97UL,
+ 0x4f184b5cUL, 0xbc91a5cdUL, 0x6b197d17UL, 0x3ffe1167UL, 0xbd5c7f44UL,
+ 0xbc72b529UL, 0x14f5a129UL, 0x3ffe2646UL, 0x817a1496UL, 0xbc97b627UL,
+ 0x3b16ee12UL, 0x3ffe3b33UL, 0x31fdc68bUL, 0xbc99f4a4UL, 0xe78b3ff6UL,
+ 0x3ffe502eUL, 0x80a9cc8fUL, 0x3c839e89UL, 0x24676d76UL, 0x3ffe6539UL,
+ 0x7522b735UL, 0xbc863ff8UL, 0xfbc74c83UL, 0x3ffe7a51UL, 0xca0c8de2UL,
+ 0x3c92d522UL, 0x77cdb740UL, 0x3ffe8f79UL, 0x80b054b1UL, 0xbc910894UL,
+ 0xa2a490daUL, 0x3ffea4afUL, 0x179c2893UL, 0xbc9e9c23UL, 0x867cca6eUL,
+ 0x3ffeb9f4UL, 0x2293e4f2UL, 0x3c94832fUL, 0x2d8e67f1UL, 0x3ffecf48UL,
+ 0xb411ad8cUL, 0xbc9c93f3UL, 0xa2188510UL, 0x3ffee4aaUL, 0xa487568dUL,
+ 0x3c91c68dUL, 0xee615a27UL, 0x3ffefa1bUL, 0x86a4b6b0UL, 0x3c9dc7f4UL,
+ 0x1cb6412aUL, 0x3fff0f9cUL, 0x65181d45UL, 0xbc932200UL, 0x376bba97UL,
+ 0x3fff252bUL, 0xbf0d8e43UL, 0x3c93a1a5UL, 0x48dd7274UL, 0x3fff3ac9UL,
+ 0x3ed837deUL, 0xbc795a5aUL, 0x5b6e4540UL, 0x3fff5076UL, 0x2dd8a18bUL,
+ 0x3c99d3e1UL, 0x798844f8UL, 0x3fff6632UL, 0x3539343eUL, 0x3c9fa37bUL,
+ 0xad9cbe14UL, 0x3fff7bfdUL, 0xd006350aUL, 0xbc9dbb12UL, 0x02243c89UL,
+ 0x3fff91d8UL, 0xa779f689UL, 0xbc612ea8UL, 0x819e90d8UL, 0x3fffa7c1UL,
+ 0xf3a5931eUL, 0x3c874853UL, 0x3692d514UL, 0x3fffbdbaUL, 0x15098eb6UL,
+ 0xbc796773UL, 0x2b8f71f1UL, 0x3fffd3c2UL, 0x966579e7UL, 0x3c62eb74UL,
+ 0x6b2a23d9UL, 0x3fffe9d9UL, 0x7442fde3UL, 0x3c74a603UL
+};
+
+ALIGNED_(16) juint _e_coeff[] =
+{
+ 0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL, 0x6fba4e77UL,
+ 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL, 0xfefa39efUL, 0x3fe62e42UL,
+ 0x00000000UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint _coeff_h[] =
+{
+ 0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
+};
+
+ALIGNED_(16) juint _HIGHMASK_LOG_X[] =
+{
+ 0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xfffff800UL
+};
+
+ALIGNED_(8) juint _HALFMASK[] =
+{
+ 0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL
+};
+
+ALIGNED_(16) juint _coeff_pow[] =
+{
+ 0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL, 0x9f95985aUL,
+ 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL, 0x518775e3UL, 0x3f9004f2UL,
+ 0xac8349bbUL, 0x3fa76c9bUL, 0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL,
+ 0xbf5dabe1UL, 0x9f95985aUL, 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL,
+ 0x486ececbUL, 0x3fc4635eUL, 0x412055ccUL, 0xbdd61bb2UL
+};
+
+ALIGNED_(16) juint _L_tbl_pow[] =
+{
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x20000000UL,
+ 0x3feff00aUL, 0x96621f95UL, 0x3e5b1856UL, 0xe0000000UL, 0x3fefe019UL,
+ 0xe5916f9eUL, 0xbe325278UL, 0x00000000UL, 0x3fefd02fUL, 0x859a1062UL,
+ 0x3e595fb7UL, 0xc0000000UL, 0x3fefc049UL, 0xb245f18fUL, 0xbe529c38UL,
+ 0xe0000000UL, 0x3fefb069UL, 0xad2880a7UL, 0xbe501230UL, 0x60000000UL,
+ 0x3fefa08fUL, 0xc8e72420UL, 0x3e597bd1UL, 0x80000000UL, 0x3fef90baUL,
+ 0xc30c4500UL, 0xbe5d6c75UL, 0xe0000000UL, 0x3fef80eaUL, 0x02c63f43UL,
+ 0x3e2e1318UL, 0xc0000000UL, 0x3fef7120UL, 0xb3d4ccccUL, 0xbe44c52aUL,
+ 0x00000000UL, 0x3fef615cUL, 0xdbd91397UL, 0xbe4e7d6cUL, 0xa0000000UL,
+ 0x3fef519cUL, 0x65c5cd68UL, 0xbe522dc8UL, 0xa0000000UL, 0x3fef41e2UL,
+ 0x46d1306cUL, 0xbe5a840eUL, 0xe0000000UL, 0x3fef322dUL, 0xd2980e94UL,
+ 0x3e5071afUL, 0xa0000000UL, 0x3fef227eUL, 0x773abadeUL, 0xbe5891e5UL,
+ 0xa0000000UL, 0x3fef12d4UL, 0xdc6bf46bUL, 0xbe5cccbeUL, 0xe0000000UL,
+ 0x3fef032fUL, 0xbc7247faUL, 0xbe2bab83UL, 0x80000000UL, 0x3feef390UL,
+ 0xbcaa1e46UL, 0xbe53bb3bUL, 0x60000000UL, 0x3feee3f6UL, 0x5f6c682dUL,
+ 0xbe54c619UL, 0x80000000UL, 0x3feed461UL, 0x5141e368UL, 0xbe4b6d86UL,
+ 0xe0000000UL, 0x3feec4d1UL, 0xec678f76UL, 0xbe369af6UL, 0x80000000UL,
+ 0x3feeb547UL, 0x41301f55UL, 0xbe2d4312UL, 0x60000000UL, 0x3feea5c2UL,
+ 0x676da6bdUL, 0xbe4d8dd0UL, 0x60000000UL, 0x3fee9642UL, 0x57a891c4UL,
+ 0x3e51f991UL, 0xa0000000UL, 0x3fee86c7UL, 0xe4eb491eUL, 0x3e579bf9UL,
+ 0x20000000UL, 0x3fee7752UL, 0xfddc4a2cUL, 0xbe3356e6UL, 0xc0000000UL,
+ 0x3fee67e1UL, 0xd75b5bf1UL, 0xbe449531UL, 0x80000000UL, 0x3fee5876UL,
+ 0xbd423b8eUL, 0x3df54fe4UL, 0x60000000UL, 0x3fee4910UL, 0x330e51b9UL,
+ 0x3e54289cUL, 0x80000000UL, 0x3fee39afUL, 0x8651a95fUL, 0xbe55aad6UL,
+ 0xa0000000UL, 0x3fee2a53UL, 0x5e98c708UL, 0xbe2fc4a9UL, 0xe0000000UL,
+ 0x3fee1afcUL, 0x0989328dUL, 0x3e23958cUL, 0x40000000UL, 0x3fee0babUL,
+ 0xee642abdUL, 0xbe425dd8UL, 0xa0000000UL, 0x3fedfc5eUL, 0xc394d236UL,
+ 0x3e526362UL, 0x20000000UL, 0x3feded17UL, 0xe104aa8eUL, 0x3e4ce247UL,
+ 0xc0000000UL, 0x3fedddd4UL, 0x265a9be4UL, 0xbe5bb77aUL, 0x40000000UL,
+ 0x3fedce97UL, 0x0ecac52fUL, 0x3e4a7cb1UL, 0xe0000000UL, 0x3fedbf5eUL,
+ 0x124cb3b8UL, 0x3e257024UL, 0x80000000UL, 0x3fedb02bUL, 0xe6d4febeUL,
+ 0xbe2033eeUL, 0x20000000UL, 0x3feda0fdUL, 0x39cca00eUL, 0xbe3ddabcUL,
+ 0xc0000000UL, 0x3fed91d3UL, 0xef8a552aUL, 0xbe543390UL, 0x40000000UL,
+ 0x3fed82afUL, 0xb8e85204UL, 0x3e513850UL, 0xe0000000UL, 0x3fed738fUL,
+ 0x3d59fe08UL, 0xbe5db728UL, 0x40000000UL, 0x3fed6475UL, 0x3aa7ead1UL,
+ 0x3e58804bUL, 0xc0000000UL, 0x3fed555fUL, 0xf8a35ba9UL, 0xbe5298b0UL,
+ 0x00000000UL, 0x3fed464fUL, 0x9a88dd15UL, 0x3e5a8cdbUL, 0x40000000UL,
+ 0x3fed3743UL, 0xb0b0a190UL, 0x3e598635UL, 0x80000000UL, 0x3fed283cUL,
+ 0xe2113295UL, 0xbe5c1119UL, 0x80000000UL, 0x3fed193aUL, 0xafbf1728UL,
+ 0xbe492e9cUL, 0x60000000UL, 0x3fed0a3dUL, 0xe4a4ccf3UL, 0x3e19b90eUL,
+ 0x20000000UL, 0x3fecfb45UL, 0xba3cbeb8UL, 0x3e406b50UL, 0xc0000000UL,
+ 0x3fecec51UL, 0x110f7dddUL, 0x3e0d6806UL, 0x40000000UL, 0x3fecdd63UL,
+ 0x7dd7d508UL, 0xbe5a8943UL, 0x80000000UL, 0x3fecce79UL, 0x9b60f271UL,
+ 0xbe50676aUL, 0x80000000UL, 0x3fecbf94UL, 0x0b9ad660UL, 0x3e59174fUL,
+ 0x60000000UL, 0x3fecb0b4UL, 0x00823d9cUL, 0x3e5bbf72UL, 0x20000000UL,
+ 0x3feca1d9UL, 0x38a6ec89UL, 0xbe4d38f9UL, 0x80000000UL, 0x3fec9302UL,
+ 0x3a0b7d8eUL, 0x3e53dbfdUL, 0xc0000000UL, 0x3fec8430UL, 0xc6826b34UL,
+ 0xbe27c5c9UL, 0xc0000000UL, 0x3fec7563UL, 0x0c706381UL, 0xbe593653UL,
+ 0x60000000UL, 0x3fec669bUL, 0x7df34ec7UL, 0x3e461ab5UL, 0xe0000000UL,
+ 0x3fec57d7UL, 0x40e5e7e8UL, 0xbe5c3daeUL, 0x00000000UL, 0x3fec4919UL,
+ 0x5602770fUL, 0xbe55219dUL, 0xc0000000UL, 0x3fec3a5eUL, 0xec7911ebUL,
+ 0x3e5a5d25UL, 0x60000000UL, 0x3fec2ba9UL, 0xb39ea225UL, 0xbe53c00bUL,
+ 0x80000000UL, 0x3fec1cf8UL, 0x967a212eUL, 0x3e5a8ddfUL, 0x60000000UL,
+ 0x3fec0e4cUL, 0x580798bdUL, 0x3e5f53abUL, 0x00000000UL, 0x3febffa5UL,
+ 0xb8282df6UL, 0xbe46b874UL, 0x20000000UL, 0x3febf102UL, 0xe33a6729UL,
+ 0x3e54963fUL, 0x00000000UL, 0x3febe264UL, 0x3b53e88aUL, 0xbe3adce1UL,
+ 0x60000000UL, 0x3febd3caUL, 0xc2585084UL, 0x3e5cde9fUL, 0x80000000UL,
+ 0x3febc535UL, 0xa335c5eeUL, 0xbe39fd9cUL, 0x20000000UL, 0x3febb6a5UL,
+ 0x7325b04dUL, 0x3e42ba15UL, 0x60000000UL, 0x3feba819UL, 0x1564540fUL,
+ 0x3e3a9f35UL, 0x40000000UL, 0x3feb9992UL, 0x83fff592UL, 0xbe5465ceUL,
+ 0xa0000000UL, 0x3feb8b0fUL, 0xb9da63d3UL, 0xbe4b1a0aUL, 0x80000000UL,
+ 0x3feb7c91UL, 0x6d6f1ea4UL, 0x3e557657UL, 0x00000000UL, 0x3feb6e18UL,
+ 0x5e80a1bfUL, 0x3e4ddbb6UL, 0x00000000UL, 0x3feb5fa3UL, 0x1c9eacb5UL,
+ 0x3e592877UL, 0xa0000000UL, 0x3feb5132UL, 0x6d40beb3UL, 0xbe51858cUL,
+ 0xa0000000UL, 0x3feb42c6UL, 0xd740c67bUL, 0x3e427ad2UL, 0x40000000UL,
+ 0x3feb345fUL, 0xa3e0cceeUL, 0xbe5c2fc4UL, 0x40000000UL, 0x3feb25fcUL,
+ 0x8e752b50UL, 0xbe3da3c2UL, 0xc0000000UL, 0x3feb179dUL, 0xa892e7deUL,
+ 0x3e1fb481UL, 0xc0000000UL, 0x3feb0943UL, 0x21ed71e9UL, 0xbe365206UL,
+ 0x20000000UL, 0x3feafaeeUL, 0x0e1380a3UL, 0x3e5c5b7bUL, 0x20000000UL,
+ 0x3feaec9dUL, 0x3c3d640eUL, 0xbe5dbbd0UL, 0x60000000UL, 0x3feade50UL,
+ 0x8f97a715UL, 0x3e3a8ec5UL, 0x20000000UL, 0x3fead008UL, 0x23ab2839UL,
+ 0x3e2fe98aUL, 0x40000000UL, 0x3feac1c4UL, 0xf4bbd50fUL, 0x3e54d8f6UL,
+ 0xe0000000UL, 0x3feab384UL, 0x14757c4dUL, 0xbe48774cUL, 0xc0000000UL,
+ 0x3feaa549UL, 0x7c7b0eeaUL, 0x3e5b51bbUL, 0x20000000UL, 0x3fea9713UL,
+ 0xf56f7013UL, 0x3e386200UL, 0xe0000000UL, 0x3fea88e0UL, 0xbe428ebeUL,
+ 0xbe514af5UL, 0xe0000000UL, 0x3fea7ab2UL, 0x8d0e4496UL, 0x3e4f9165UL,
+ 0x60000000UL, 0x3fea6c89UL, 0xdbacc5d5UL, 0xbe5c063bUL, 0x20000000UL,
+ 0x3fea5e64UL, 0x3f19d970UL, 0xbe5a0c8cUL, 0x20000000UL, 0x3fea5043UL,
+ 0x09ea3e6bUL, 0x3e5065dcUL, 0x80000000UL, 0x3fea4226UL, 0x78df246cUL,
+ 0x3e5e05f6UL, 0x40000000UL, 0x3fea340eUL, 0x4057d4a0UL, 0x3e431b2bUL,
+ 0x40000000UL, 0x3fea25faUL, 0x82867bb5UL, 0x3e4b76beUL, 0xa0000000UL,
+ 0x3fea17eaUL, 0x9436f40aUL, 0xbe5aad39UL, 0x20000000UL, 0x3fea09dfUL,
+ 0x4b5253b3UL, 0x3e46380bUL, 0x00000000UL, 0x3fe9fbd8UL, 0x8fc52466UL,
+ 0xbe386f9bUL, 0x20000000UL, 0x3fe9edd5UL, 0x22d3f344UL, 0xbe538347UL,
+ 0x60000000UL, 0x3fe9dfd6UL, 0x1ac33522UL, 0x3e5dbc53UL, 0x00000000UL,
+ 0x3fe9d1dcUL, 0xeabdff1dUL, 0x3e40fc0cUL, 0xe0000000UL, 0x3fe9c3e5UL,
+ 0xafd30e73UL, 0xbe585e63UL, 0xe0000000UL, 0x3fe9b5f3UL, 0xa52f226aUL,
+ 0xbe43e8f9UL, 0x20000000UL, 0x3fe9a806UL, 0xecb8698dUL, 0xbe515b36UL,
+ 0x80000000UL, 0x3fe99a1cUL, 0xf2b4e89dUL, 0x3e48b62bUL, 0x20000000UL,
+ 0x3fe98c37UL, 0x7c9a88fbUL, 0x3e44414cUL, 0x00000000UL, 0x3fe97e56UL,
+ 0xda015741UL, 0xbe5d13baUL, 0xe0000000UL, 0x3fe97078UL, 0x5fdace06UL,
+ 0x3e51b947UL, 0x00000000UL, 0x3fe962a0UL, 0x956ca094UL, 0x3e518785UL,
+ 0x40000000UL, 0x3fe954cbUL, 0x01164c1dUL, 0x3e5d5b57UL, 0xc0000000UL,
+ 0x3fe946faUL, 0xe63b3767UL, 0xbe4f84e7UL, 0x40000000UL, 0x3fe9392eUL,
+ 0xe57cc2a9UL, 0x3e34eda3UL, 0xe0000000UL, 0x3fe92b65UL, 0x8c75b544UL,
+ 0x3e5766a0UL, 0xc0000000UL, 0x3fe91da1UL, 0x37d1d087UL, 0xbe5e2ab1UL,
+ 0x80000000UL, 0x3fe90fe1UL, 0xa953dc20UL, 0x3e5fa1f3UL, 0x80000000UL,
+ 0x3fe90225UL, 0xdbd3f369UL, 0x3e47d6dbUL, 0xa0000000UL, 0x3fe8f46dUL,
+ 0x1c9be989UL, 0xbe5e2b0aUL, 0xa0000000UL, 0x3fe8e6b9UL, 0x3c93d76aUL,
+ 0x3e5c8618UL, 0xe0000000UL, 0x3fe8d909UL, 0x2182fc9aUL, 0xbe41aa9eUL,
+ 0x20000000UL, 0x3fe8cb5eUL, 0xe6b3539dUL, 0xbe530d19UL, 0x60000000UL,
+ 0x3fe8bdb6UL, 0x49e58cc3UL, 0xbe3bb374UL, 0xa0000000UL, 0x3fe8b012UL,
+ 0xa7cfeb8fUL, 0x3e56c412UL, 0x00000000UL, 0x3fe8a273UL, 0x8d52bc19UL,
+ 0x3e1429b8UL, 0x60000000UL, 0x3fe894d7UL, 0x4dc32c6cUL, 0xbe48604cUL,
+ 0xc0000000UL, 0x3fe8873fUL, 0x0c868e56UL, 0xbe564ee5UL, 0x00000000UL,
+ 0x3fe879acUL, 0x56aee828UL, 0x3e5e2fd8UL, 0x60000000UL, 0x3fe86c1cUL,
+ 0x7ceab8ecUL, 0x3e493365UL, 0xc0000000UL, 0x3fe85e90UL, 0x78d4dadcUL,
+ 0xbe4f7f25UL, 0x00000000UL, 0x3fe85109UL, 0x0ccd8280UL, 0x3e31e7a2UL,
+ 0x40000000UL, 0x3fe84385UL, 0x34ba4e15UL, 0x3e328077UL, 0x80000000UL,
+ 0x3fe83605UL, 0xa670975aUL, 0xbe53eee5UL, 0xa0000000UL, 0x3fe82889UL,
+ 0xf61b77b2UL, 0xbe43a20aUL, 0xa0000000UL, 0x3fe81b11UL, 0x13e6643bUL,
+ 0x3e5e5fe5UL, 0xc0000000UL, 0x3fe80d9dUL, 0x82cc94e8UL, 0xbe5ff1f9UL,
+ 0xa0000000UL, 0x3fe8002dUL, 0x8a0c9c5dUL, 0xbe42b0e7UL, 0x60000000UL,
+ 0x3fe7f2c1UL, 0x22a16f01UL, 0x3e5d9ea0UL, 0x20000000UL, 0x3fe7e559UL,
+ 0xc38cd451UL, 0x3e506963UL, 0xc0000000UL, 0x3fe7d7f4UL, 0x9902bc71UL,
+ 0x3e4503d7UL, 0x40000000UL, 0x3fe7ca94UL, 0xdef2a3c0UL, 0x3e3d98edUL,
+ 0xa0000000UL, 0x3fe7bd37UL, 0xed49abb0UL, 0x3e24c1ffUL, 0xe0000000UL,
+ 0x3fe7afdeUL, 0xe3b0be70UL, 0xbe40c467UL, 0x00000000UL, 0x3fe7a28aUL,
+ 0xaf9f193cUL, 0xbe5dff6cUL, 0xe0000000UL, 0x3fe79538UL, 0xb74cf6b6UL,
+ 0xbe258ed0UL, 0xa0000000UL, 0x3fe787ebUL, 0x1d9127c7UL, 0x3e345fb0UL,
+ 0x40000000UL, 0x3fe77aa2UL, 0x1028c21dUL, 0xbe4619bdUL, 0xa0000000UL,
+ 0x3fe76d5cUL, 0x7cb0b5e4UL, 0x3e40f1a2UL, 0xe0000000UL, 0x3fe7601aUL,
+ 0x2b1bc4adUL, 0xbe32e8bbUL, 0xe0000000UL, 0x3fe752dcUL, 0x6839f64eUL,
+ 0x3e41f57bUL, 0xc0000000UL, 0x3fe745a2UL, 0xc4121f7eUL, 0xbe52c40aUL,
+ 0x60000000UL, 0x3fe7386cUL, 0xd6852d72UL, 0xbe5c4e6bUL, 0xc0000000UL,
+ 0x3fe72b39UL, 0x91d690f7UL, 0xbe57f88fUL, 0xe0000000UL, 0x3fe71e0aUL,
+ 0x627a2159UL, 0xbe4425d5UL, 0xc0000000UL, 0x3fe710dfUL, 0x50a54033UL,
+ 0x3e422b7eUL, 0x60000000UL, 0x3fe703b8UL, 0x3b0b5f91UL, 0x3e5d3857UL,
+ 0xe0000000UL, 0x3fe6f694UL, 0x84d628a2UL, 0xbe51f090UL, 0x00000000UL,
+ 0x3fe6e975UL, 0x306d8894UL, 0xbe414d83UL, 0xe0000000UL, 0x3fe6dc58UL,
+ 0x30bf24aaUL, 0xbe4650caUL, 0x80000000UL, 0x3fe6cf40UL, 0xd4628d69UL,
+ 0xbe5db007UL, 0xc0000000UL, 0x3fe6c22bUL, 0xa2aae57bUL, 0xbe31d279UL,
+ 0xc0000000UL, 0x3fe6b51aUL, 0x860edf7eUL, 0xbe2d4c4aUL, 0x80000000UL,
+ 0x3fe6a80dUL, 0xf3559341UL, 0xbe5f7e98UL, 0xe0000000UL, 0x3fe69b03UL,
+ 0xa885899eUL, 0xbe5c2011UL, 0xe0000000UL, 0x3fe68dfdUL, 0x2bdc6d37UL,
+ 0x3e224a82UL, 0xa0000000UL, 0x3fe680fbUL, 0xc12ad1b9UL, 0xbe40cf56UL,
+ 0x00000000UL, 0x3fe673fdUL, 0x1bcdf659UL, 0xbdf52f2dUL, 0x00000000UL,
+ 0x3fe66702UL, 0x5df10408UL, 0x3e5663e0UL, 0xc0000000UL, 0x3fe65a0aUL,
+ 0xa4070568UL, 0xbe40b12fUL, 0x00000000UL, 0x3fe64d17UL, 0x71c54c47UL,
+ 0x3e5f5e8bUL, 0x00000000UL, 0x3fe64027UL, 0xbd4b7e83UL, 0x3e42ead6UL,
+ 0xa0000000UL, 0x3fe6333aUL, 0x61598bd2UL, 0xbe4c48d4UL, 0xc0000000UL,
+ 0x3fe62651UL, 0x6f538d61UL, 0x3e548401UL, 0xa0000000UL, 0x3fe6196cUL,
+ 0x14344120UL, 0xbe529af6UL, 0x00000000UL, 0x3fe60c8bUL, 0x5982c587UL,
+ 0xbe3e1e4fUL, 0x00000000UL, 0x3fe5ffadUL, 0xfe51d4eaUL, 0xbe4c897aUL,
+ 0x80000000UL, 0x3fe5f2d2UL, 0xfd46ebe1UL, 0x3e552e00UL, 0xa0000000UL,
+ 0x3fe5e5fbUL, 0xa4695699UL, 0x3e5ed471UL, 0x60000000UL, 0x3fe5d928UL,
+ 0x80d118aeUL, 0x3e456b61UL, 0xa0000000UL, 0x3fe5cc58UL, 0x304c330bUL,
+ 0x3e54dc29UL, 0x80000000UL, 0x3fe5bf8cUL, 0x0af2dedfUL, 0xbe3aa9bdUL,
+ 0xe0000000UL, 0x3fe5b2c3UL, 0x15fc9258UL, 0xbe479a37UL, 0xc0000000UL,
+ 0x3fe5a5feUL, 0x9292c7eaUL, 0x3e188650UL, 0x20000000UL, 0x3fe5993dUL,
+ 0x33b4d380UL, 0x3e5d6d93UL, 0x20000000UL, 0x3fe58c7fUL, 0x02fd16c7UL,
+ 0x3e2fe961UL, 0xa0000000UL, 0x3fe57fc4UL, 0x4a05edb6UL, 0xbe4d55b4UL,
+ 0xa0000000UL, 0x3fe5730dUL, 0x3d443abbUL, 0xbe5e6954UL, 0x00000000UL,
+ 0x3fe5665aUL, 0x024acfeaUL, 0x3e50e61bUL, 0x00000000UL, 0x3fe559aaUL,
+ 0xcc9edd09UL, 0xbe325403UL, 0x60000000UL, 0x3fe54cfdUL, 0x1fe26950UL,
+ 0x3e5d500eUL, 0x60000000UL, 0x3fe54054UL, 0x6c5ae164UL, 0xbe4a79b4UL,
+ 0xc0000000UL, 0x3fe533aeUL, 0x154b0287UL, 0xbe401571UL, 0xa0000000UL,
+ 0x3fe5270cUL, 0x0673f401UL, 0xbe56e56bUL, 0xe0000000UL, 0x3fe51a6dUL,
+ 0x751b639cUL, 0x3e235269UL, 0xa0000000UL, 0x3fe50dd2UL, 0x7c7b2bedUL,
+ 0x3ddec887UL, 0xc0000000UL, 0x3fe5013aUL, 0xafab4e17UL, 0x3e5e7575UL,
+ 0x60000000UL, 0x3fe4f4a6UL, 0x2e308668UL, 0x3e59aed6UL, 0x80000000UL,
+ 0x3fe4e815UL, 0xf33e2a76UL, 0xbe51f184UL, 0xe0000000UL, 0x3fe4db87UL,
+ 0x839f3e3eUL, 0x3e57db01UL, 0xc0000000UL, 0x3fe4cefdUL, 0xa9eda7bbUL,
+ 0x3e535e0fUL, 0x00000000UL, 0x3fe4c277UL, 0x2a8f66a5UL, 0x3e5ce451UL,
+ 0xc0000000UL, 0x3fe4b5f3UL, 0x05192456UL, 0xbe4e8518UL, 0xc0000000UL,
+ 0x3fe4a973UL, 0x4aa7cd1dUL, 0x3e46784aUL, 0x40000000UL, 0x3fe49cf7UL,
+ 0x8e23025eUL, 0xbe5749f2UL, 0x00000000UL, 0x3fe4907eUL, 0x18d30215UL,
+ 0x3e360f39UL, 0x20000000UL, 0x3fe48408UL, 0x63dcf2f3UL, 0x3e5e00feUL,
+ 0xc0000000UL, 0x3fe47795UL, 0x46182d09UL, 0xbe5173d9UL, 0xa0000000UL,
+ 0x3fe46b26UL, 0x8f0e62aaUL, 0xbe48f281UL, 0xe0000000UL, 0x3fe45ebaUL,
+ 0x5775c40cUL, 0xbe56aad4UL, 0x60000000UL, 0x3fe45252UL, 0x0fe25f69UL,
+ 0x3e48bd71UL, 0x40000000UL, 0x3fe445edUL, 0xe9989ec5UL, 0x3e590d97UL,
+ 0x80000000UL, 0x3fe4398bUL, 0xb3d9ffe3UL, 0x3e479dbcUL, 0x20000000UL,
+ 0x3fe42d2dUL, 0x388e4d2eUL, 0xbe5eed80UL, 0xe0000000UL, 0x3fe420d1UL,
+ 0x6f797c18UL, 0x3e554b4cUL, 0x20000000UL, 0x3fe4147aUL, 0x31048bb4UL,
+ 0xbe5b1112UL, 0x80000000UL, 0x3fe40825UL, 0x2efba4f9UL, 0x3e48ebc7UL,
+ 0x40000000UL, 0x3fe3fbd4UL, 0x50201119UL, 0x3e40b701UL, 0x40000000UL,
+ 0x3fe3ef86UL, 0x0a4db32cUL, 0x3e551de8UL, 0xa0000000UL, 0x3fe3e33bUL,
+ 0x0c9c148bUL, 0xbe50c1f6UL, 0x20000000UL, 0x3fe3d6f4UL, 0xc9129447UL,
+ 0x3e533fa0UL, 0x00000000UL, 0x3fe3cab0UL, 0xaae5b5a0UL, 0xbe22b68eUL,
+ 0x20000000UL, 0x3fe3be6fUL, 0x02305e8aUL, 0xbe54fc08UL, 0x60000000UL,
+ 0x3fe3b231UL, 0x7f908258UL, 0x3e57dc05UL, 0x00000000UL, 0x3fe3a5f7UL,
+ 0x1a09af78UL, 0x3e08038bUL, 0xe0000000UL, 0x3fe399bfUL, 0x490643c1UL,
+ 0xbe5dbe42UL, 0xe0000000UL, 0x3fe38d8bUL, 0x5e8ad724UL, 0xbe3c2b72UL,
+ 0x20000000UL, 0x3fe3815bUL, 0xc67196b6UL, 0x3e1713cfUL, 0xa0000000UL,
+ 0x3fe3752dUL, 0x6182e429UL, 0xbe3ec14cUL, 0x40000000UL, 0x3fe36903UL,
+ 0xab6eb1aeUL, 0x3e5a2cc5UL, 0x40000000UL, 0x3fe35cdcUL, 0xfe5dc064UL,
+ 0xbe5c5878UL, 0x40000000UL, 0x3fe350b8UL, 0x0ba6b9e4UL, 0x3e51619bUL,
+ 0x80000000UL, 0x3fe34497UL, 0x857761aaUL, 0x3e5fff53UL, 0x00000000UL,
+ 0x3fe3387aUL, 0xf872d68cUL, 0x3e484f4dUL, 0xa0000000UL, 0x3fe32c5fUL,
+ 0x087e97c2UL, 0x3e52842eUL, 0x80000000UL, 0x3fe32048UL, 0x73d6d0c0UL,
+ 0xbe503edfUL, 0x80000000UL, 0x3fe31434UL, 0x0c1456a1UL, 0xbe5f72adUL,
+ 0xa0000000UL, 0x3fe30823UL, 0x83a1a4d5UL, 0xbe5e65ccUL, 0xe0000000UL,
+ 0x3fe2fc15UL, 0x855a7390UL, 0xbe506438UL, 0x40000000UL, 0x3fe2f00bUL,
+ 0xa2898287UL, 0x3e3d22a2UL, 0xe0000000UL, 0x3fe2e403UL, 0x8b56f66fUL,
+ 0xbe5aa5fdUL, 0x80000000UL, 0x3fe2d7ffUL, 0x52db119aUL, 0x3e3a2e3dUL,
+ 0x60000000UL, 0x3fe2cbfeUL, 0xe2ddd4c0UL, 0xbe586469UL, 0x40000000UL,
+ 0x3fe2c000UL, 0x6b01bf10UL, 0x3e352b9dUL, 0x40000000UL, 0x3fe2b405UL,
+ 0xb07a1cdfUL, 0x3e5c5cdaUL, 0x80000000UL, 0x3fe2a80dUL, 0xc7b5f868UL,
+ 0xbe5668b3UL, 0xc0000000UL, 0x3fe29c18UL, 0x185edf62UL, 0xbe563d66UL,
+ 0x00000000UL, 0x3fe29027UL, 0xf729e1ccUL, 0x3e59a9a0UL, 0x80000000UL,
+ 0x3fe28438UL, 0x6433c727UL, 0xbe43cc89UL, 0x00000000UL, 0x3fe2784dUL,
+ 0x41782631UL, 0xbe30750cUL, 0xa0000000UL, 0x3fe26c64UL, 0x914911b7UL,
+ 0xbe58290eUL, 0x40000000UL, 0x3fe2607fUL, 0x3dcc73e1UL, 0xbe4269cdUL,
+ 0x00000000UL, 0x3fe2549dUL, 0x2751bf70UL, 0xbe5a6998UL, 0xc0000000UL,
+ 0x3fe248bdUL, 0x4248b9fbUL, 0xbe4ddb00UL, 0x80000000UL, 0x3fe23ce1UL,
+ 0xf35cf82fUL, 0x3e561b71UL, 0x60000000UL, 0x3fe23108UL, 0x8e481a2dUL,
+ 0x3e518fb9UL, 0x60000000UL, 0x3fe22532UL, 0x5ab96edcUL, 0xbe5fafc5UL,
+ 0x40000000UL, 0x3fe2195fUL, 0x80943911UL, 0xbe07f819UL, 0x40000000UL,
+ 0x3fe20d8fUL, 0x386f2d6cUL, 0xbe54ba8bUL, 0x40000000UL, 0x3fe201c2UL,
+ 0xf29664acUL, 0xbe5eb815UL, 0x20000000UL, 0x3fe1f5f8UL, 0x64f03390UL,
+ 0x3e5e320cUL, 0x20000000UL, 0x3fe1ea31UL, 0x747ff696UL, 0x3e5ef0a5UL,
+ 0x40000000UL, 0x3fe1de6dUL, 0x3e9ceb51UL, 0xbe5f8d27UL, 0x20000000UL,
+ 0x3fe1d2acUL, 0x4ae0b55eUL, 0x3e5faa21UL, 0x20000000UL, 0x3fe1c6eeUL,
+ 0x28569a5eUL, 0x3e598a4fUL, 0x20000000UL, 0x3fe1bb33UL, 0x54b33e07UL,
+ 0x3e46130aUL, 0x20000000UL, 0x3fe1af7bUL, 0x024f1078UL, 0xbe4dbf93UL,
+ 0x00000000UL, 0x3fe1a3c6UL, 0xb0783bfaUL, 0x3e419248UL, 0xe0000000UL,
+ 0x3fe19813UL, 0x2f02b836UL, 0x3e4e02b7UL, 0xc0000000UL, 0x3fe18c64UL,
+ 0x28dec9d4UL, 0x3e09064fUL, 0x80000000UL, 0x3fe180b8UL, 0x45cbf406UL,
+ 0x3e5b1f46UL, 0x40000000UL, 0x3fe1750fUL, 0x03d9964cUL, 0x3e5b0a79UL,
+ 0x00000000UL, 0x3fe16969UL, 0x8b5b882bUL, 0xbe238086UL, 0xa0000000UL,
+ 0x3fe15dc5UL, 0x73bad6f8UL, 0xbdf1fca4UL, 0x20000000UL, 0x3fe15225UL,
+ 0x5385769cUL, 0x3e5e8d76UL, 0xa0000000UL, 0x3fe14687UL, 0x1676dc6bUL,
+ 0x3e571d08UL, 0x20000000UL, 0x3fe13aedUL, 0xa8c41c7fUL, 0xbe598a25UL,
+ 0x60000000UL, 0x3fe12f55UL, 0xc4e1aaf0UL, 0x3e435277UL, 0xa0000000UL,
+ 0x3fe123c0UL, 0x403638e1UL, 0xbe21aa7cUL, 0xc0000000UL, 0x3fe1182eUL,
+ 0x557a092bUL, 0xbdd0116bUL, 0xc0000000UL, 0x3fe10c9fUL, 0x7d779f66UL,
+ 0x3e4a61baUL, 0xc0000000UL, 0x3fe10113UL, 0x2b09c645UL, 0xbe5d586eUL,
+ 0x20000000UL, 0x3fe0ea04UL, 0xea2cad46UL, 0x3e5aa97cUL, 0x20000000UL,
+ 0x3fe0d300UL, 0x23190e54UL, 0x3e50f1a7UL, 0xa0000000UL, 0x3fe0bc07UL,
+ 0x1379a5a6UL, 0xbe51619dUL, 0x60000000UL, 0x3fe0a51aUL, 0x926a3d4aUL,
+ 0x3e5cf019UL, 0xa0000000UL, 0x3fe08e38UL, 0xa8c24358UL, 0x3e35241eUL,
+ 0x20000000UL, 0x3fe07762UL, 0x24317e7aUL, 0x3e512cfaUL, 0x00000000UL,
+ 0x3fe06097UL, 0xfd9cf274UL, 0xbe55bef3UL, 0x00000000UL, 0x3fe049d7UL,
+ 0x3689b49dUL, 0xbe36d26dUL, 0x40000000UL, 0x3fe03322UL, 0xf72ef6c4UL,
+ 0xbe54cd08UL, 0xa0000000UL, 0x3fe01c78UL, 0x23702d2dUL, 0xbe5900bfUL,
+ 0x00000000UL, 0x3fe005daUL, 0x3f59c14cUL, 0x3e57d80bUL, 0x40000000UL,
+ 0x3fdfde8dUL, 0xad67766dUL, 0xbe57fad4UL, 0x40000000UL, 0x3fdfb17cUL,
+ 0x644f4ae7UL, 0x3e1ee43bUL, 0x40000000UL, 0x3fdf8481UL, 0x903234d2UL,
+ 0x3e501a86UL, 0x40000000UL, 0x3fdf579cUL, 0xafe9e509UL, 0xbe267c3eUL,
+ 0x00000000UL, 0x3fdf2acdUL, 0xb7dfda0bUL, 0xbe48149bUL, 0x40000000UL,
+ 0x3fdefe13UL, 0x3b94305eUL, 0x3e5f4ea7UL, 0x80000000UL, 0x3fded16fUL,
+ 0x5d95da61UL, 0xbe55c198UL, 0x00000000UL, 0x3fdea4e1UL, 0x406960c9UL,
+ 0xbdd99a19UL, 0x00000000UL, 0x3fde7868UL, 0xd22f3539UL, 0x3e470c78UL,
+ 0x80000000UL, 0x3fde4c04UL, 0x83eec535UL, 0xbe3e1232UL, 0x40000000UL,
+ 0x3fde1fb6UL, 0x3dfbffcbUL, 0xbe4b7d71UL, 0x40000000UL, 0x3fddf37dUL,
+ 0x7e1be4e0UL, 0xbe5b8f8fUL, 0x40000000UL, 0x3fddc759UL, 0x46dae887UL,
+ 0xbe350458UL, 0x80000000UL, 0x3fdd9b4aUL, 0xed6ecc49UL, 0xbe5f0045UL,
+ 0x80000000UL, 0x3fdd6f50UL, 0x2e9e883cUL, 0x3e2915daUL, 0x80000000UL,
+ 0x3fdd436bUL, 0xf0bccb32UL, 0x3e4a68c9UL, 0x80000000UL, 0x3fdd179bUL,
+ 0x9bbfc779UL, 0xbe54a26aUL, 0x00000000UL, 0x3fdcebe0UL, 0x7cea33abUL,
+ 0x3e43c6b7UL, 0x40000000UL, 0x3fdcc039UL, 0xe740fd06UL, 0x3e5526c2UL,
+ 0x40000000UL, 0x3fdc94a7UL, 0x9eadeb1aUL, 0xbe396d8dUL, 0xc0000000UL,
+ 0x3fdc6929UL, 0xf0a8f95aUL, 0xbe5c0ab2UL, 0x80000000UL, 0x3fdc3dc0UL,
+ 0x6ee2693bUL, 0x3e0992e6UL, 0xc0000000UL, 0x3fdc126bUL, 0x5ac6b581UL,
+ 0xbe2834b6UL, 0x40000000UL, 0x3fdbe72bUL, 0x8cc226ffUL, 0x3e3596a6UL,
+ 0x00000000UL, 0x3fdbbbffUL, 0xf92a74bbUL, 0x3e3c5813UL, 0x00000000UL,
+ 0x3fdb90e7UL, 0x479664c0UL, 0xbe50d644UL, 0x00000000UL, 0x3fdb65e3UL,
+ 0x5004975bUL, 0xbe55258fUL, 0x00000000UL, 0x3fdb3af3UL, 0xe4b23194UL,
+ 0xbe588407UL, 0xc0000000UL, 0x3fdb1016UL, 0xe65d4d0aUL, 0x3e527c26UL,
+ 0x80000000UL, 0x3fdae54eUL, 0x814fddd6UL, 0x3e5962a2UL, 0x40000000UL,
+ 0x3fdaba9aUL, 0xe19d0913UL, 0xbe562f4eUL, 0x80000000UL, 0x3fda8ff9UL,
+ 0x43cfd006UL, 0xbe4cfdebUL, 0x40000000UL, 0x3fda656cUL, 0x686f0a4eUL,
+ 0x3e5e47a8UL, 0xc0000000UL, 0x3fda3af2UL, 0x7200d410UL, 0x3e5e1199UL,
+ 0xc0000000UL, 0x3fda108cUL, 0xabd2266eUL, 0x3e5ee4d1UL, 0x40000000UL,
+ 0x3fd9e63aUL, 0x396f8f2cUL, 0x3e4dbffbUL, 0x00000000UL, 0x3fd9bbfbUL,
+ 0xe32b25ddUL, 0x3e5c3a54UL, 0x40000000UL, 0x3fd991cfUL, 0x431e4035UL,
+ 0xbe457925UL, 0x80000000UL, 0x3fd967b6UL, 0x7bed3dd3UL, 0x3e40c61dUL,
+ 0x00000000UL, 0x3fd93db1UL, 0xd7449365UL, 0x3e306419UL, 0x80000000UL,
+ 0x3fd913beUL, 0x1746e791UL, 0x3e56fcfcUL, 0x40000000UL, 0x3fd8e9dfUL,
+ 0xf3a9028bUL, 0xbe5041b9UL, 0xc0000000UL, 0x3fd8c012UL, 0x56840c50UL,
+ 0xbe26e20aUL, 0x40000000UL, 0x3fd89659UL, 0x19763102UL, 0xbe51f466UL,
+ 0x80000000UL, 0x3fd86cb2UL, 0x7032de7cUL, 0xbe4d298aUL, 0x80000000UL,
+ 0x3fd8431eUL, 0xdeb39fabUL, 0xbe4361ebUL, 0x40000000UL, 0x3fd8199dUL,
+ 0x5d01cbe0UL, 0xbe5425b3UL, 0x80000000UL, 0x3fd7f02eUL, 0x3ce99aa9UL,
+ 0x3e146fa8UL, 0x80000000UL, 0x3fd7c6d2UL, 0xd1a262b9UL, 0xbe5a1a69UL,
+ 0xc0000000UL, 0x3fd79d88UL, 0x8606c236UL, 0x3e423a08UL, 0x80000000UL,
+ 0x3fd77451UL, 0x8fd1e1b7UL, 0x3e5a6a63UL, 0xc0000000UL, 0x3fd74b2cUL,
+ 0xe491456aUL, 0x3e42c1caUL, 0x40000000UL, 0x3fd7221aUL, 0x4499a6d7UL,
+ 0x3e36a69aUL, 0x00000000UL, 0x3fd6f91aUL, 0x5237df94UL, 0xbe0f8f02UL,
+ 0x00000000UL, 0x3fd6d02cUL, 0xb6482c6eUL, 0xbe5abcf7UL, 0x00000000UL,
+ 0x3fd6a750UL, 0x1919fd61UL, 0xbe57ade2UL, 0x00000000UL, 0x3fd67e86UL,
+ 0xaa7a994dUL, 0xbe3f3fbdUL, 0x00000000UL, 0x3fd655ceUL, 0x67db014cUL,
+ 0x3e33c550UL, 0x00000000UL, 0x3fd62d28UL, 0xa82856b7UL, 0xbe1409d1UL,
+ 0xc0000000UL, 0x3fd60493UL, 0x1e6a300dUL, 0x3e55d899UL, 0x80000000UL,
+ 0x3fd5dc11UL, 0x1222bd5cUL, 0xbe35bfc0UL, 0xc0000000UL, 0x3fd5b3a0UL,
+ 0x6e8dc2d3UL, 0x3e5d4d79UL, 0x00000000UL, 0x3fd58b42UL, 0xe0e4ace6UL,
+ 0xbe517303UL, 0x80000000UL, 0x3fd562f4UL, 0xb306e0a8UL, 0x3e5edf0fUL,
+ 0xc0000000UL, 0x3fd53ab8UL, 0x6574bc54UL, 0x3e5ee859UL, 0x80000000UL,
+ 0x3fd5128eUL, 0xea902207UL, 0x3e5f6188UL, 0xc0000000UL, 0x3fd4ea75UL,
+ 0x9f911d79UL, 0x3e511735UL, 0x80000000UL, 0x3fd4c26eUL, 0xf9c77397UL,
+ 0xbe5b1643UL, 0x40000000UL, 0x3fd49a78UL, 0x15fc9258UL, 0x3e479a37UL,
+ 0x80000000UL, 0x3fd47293UL, 0xd5a04dd9UL, 0xbe426e56UL, 0xc0000000UL,
+ 0x3fd44abfUL, 0xe04042f5UL, 0x3e56f7c6UL, 0x40000000UL, 0x3fd422fdUL,
+ 0x1d8bf2c8UL, 0x3e5d8810UL, 0x00000000UL, 0x3fd3fb4cUL, 0x88a8ddeeUL,
+ 0xbe311454UL, 0xc0000000UL, 0x3fd3d3abUL, 0x3e3b5e47UL, 0xbe5d1b72UL,
+ 0x40000000UL, 0x3fd3ac1cUL, 0xc2ab5d59UL, 0x3e31b02bUL, 0xc0000000UL,
+ 0x3fd3849dUL, 0xd4e34b9eUL, 0x3e51cb2fUL, 0x40000000UL, 0x3fd35d30UL,
+ 0x177204fbUL, 0xbe2b8cd7UL, 0x80000000UL, 0x3fd335d3UL, 0xfcd38c82UL,
+ 0xbe4356e1UL, 0x80000000UL, 0x3fd30e87UL, 0x64f54accUL, 0xbe4e6224UL,
+ 0x00000000UL, 0x3fd2e74cUL, 0xaa7975d9UL, 0x3e5dc0feUL, 0x80000000UL,
+ 0x3fd2c021UL, 0x516dab3fUL, 0xbe50ffa3UL, 0x40000000UL, 0x3fd29907UL,
+ 0x2bfb7313UL, 0x3e5674a2UL, 0xc0000000UL, 0x3fd271fdUL, 0x0549fc99UL,
+ 0x3e385d29UL, 0xc0000000UL, 0x3fd24b04UL, 0x55b63073UL, 0xbe500c6dUL,
+ 0x00000000UL, 0x3fd2241cUL, 0x3f91953aUL, 0x3e389977UL, 0xc0000000UL,
+ 0x3fd1fd43UL, 0xa1543f71UL, 0xbe3487abUL, 0xc0000000UL, 0x3fd1d67bUL,
+ 0x4ec8867cUL, 0x3df6a2dcUL, 0x00000000UL, 0x3fd1afc4UL, 0x4328e3bbUL,
+ 0x3e41d9c0UL, 0x80000000UL, 0x3fd1891cUL, 0x2e1cda84UL, 0x3e3bdd87UL,
+ 0x40000000UL, 0x3fd16285UL, 0x4b5331aeUL, 0xbe53128eUL, 0x00000000UL,
+ 0x3fd13bfeUL, 0xb9aec164UL, 0xbe52ac98UL, 0xc0000000UL, 0x3fd11586UL,
+ 0xd91e1316UL, 0xbe350630UL, 0x80000000UL, 0x3fd0ef1fUL, 0x7cacc12cUL,
+ 0x3e3f5219UL, 0x40000000UL, 0x3fd0c8c8UL, 0xbce277b7UL, 0x3e3d30c0UL,
+ 0x00000000UL, 0x3fd0a281UL, 0x2a63447dUL, 0xbe541377UL, 0x80000000UL,
+ 0x3fd07c49UL, 0xfac483b5UL, 0xbe5772ecUL, 0xc0000000UL, 0x3fd05621UL,
+ 0x36b8a570UL, 0xbe4fd4bdUL, 0xc0000000UL, 0x3fd03009UL, 0xbae505f7UL,
+ 0xbe450388UL, 0x80000000UL, 0x3fd00a01UL, 0x3e35aeadUL, 0xbe5430fcUL,
+ 0x80000000UL, 0x3fcfc811UL, 0x707475acUL, 0x3e38806eUL, 0x80000000UL,
+ 0x3fcf7c3fUL, 0xc91817fcUL, 0xbe40cceaUL, 0x80000000UL, 0x3fcf308cUL,
+ 0xae05d5e9UL, 0xbe4919b8UL, 0x80000000UL, 0x3fcee4f8UL, 0xae6cc9e6UL,
+ 0xbe530b94UL, 0x00000000UL, 0x3fce9983UL, 0x1efe3e8eUL, 0x3e57747eUL,
+ 0x00000000UL, 0x3fce4e2dUL, 0xda78d9bfUL, 0xbe59a608UL, 0x00000000UL,
+ 0x3fce02f5UL, 0x8abe2c2eUL, 0x3e4a35adUL, 0x00000000UL, 0x3fcdb7dcUL,
+ 0x1495450dUL, 0xbe0872ccUL, 0x80000000UL, 0x3fcd6ce1UL, 0x86ee0ba0UL,
+ 0xbe4f59a0UL, 0x00000000UL, 0x3fcd2205UL, 0xe81ca888UL, 0x3e5402c3UL,
+ 0x00000000UL, 0x3fccd747UL, 0x3b4424b9UL, 0x3e5dfdc3UL, 0x80000000UL,
+ 0x3fcc8ca7UL, 0xd305b56cUL, 0x3e202da6UL, 0x00000000UL, 0x3fcc4226UL,
+ 0x399a6910UL, 0xbe482a1cUL, 0x80000000UL, 0x3fcbf7c2UL, 0x747f7938UL,
+ 0xbe587372UL, 0x80000000UL, 0x3fcbad7cUL, 0x6fc246a0UL, 0x3e50d83dUL,
+ 0x00000000UL, 0x3fcb6355UL, 0xee9e9be5UL, 0xbe5c35bdUL, 0x80000000UL,
+ 0x3fcb194aUL, 0x8416c0bcUL, 0x3e546d4fUL, 0x00000000UL, 0x3fcacf5eUL,
+ 0x49f7f08fUL, 0x3e56da76UL, 0x00000000UL, 0x3fca858fUL, 0x5dc30de2UL,
+ 0x3e5f390cUL, 0x00000000UL, 0x3fca3bdeUL, 0x950583b6UL, 0xbe5e4169UL,
+ 0x80000000UL, 0x3fc9f249UL, 0x33631553UL, 0x3e52aeb1UL, 0x00000000UL,
+ 0x3fc9a8d3UL, 0xde8795a6UL, 0xbe59a504UL, 0x00000000UL, 0x3fc95f79UL,
+ 0x076bf41eUL, 0x3e5122feUL, 0x80000000UL, 0x3fc9163cUL, 0x2914c8e7UL,
+ 0x3e3dd064UL, 0x00000000UL, 0x3fc8cd1dUL, 0x3a30eca3UL, 0xbe21b4aaUL,
+ 0x80000000UL, 0x3fc8841aUL, 0xb2a96650UL, 0xbe575444UL, 0x80000000UL,
+ 0x3fc83b34UL, 0x2376c0cbUL, 0xbe2a74c7UL, 0x80000000UL, 0x3fc7f26bUL,
+ 0xd8a0b653UL, 0xbe5181b6UL, 0x00000000UL, 0x3fc7a9bfUL, 0x32257882UL,
+ 0xbe4a78b4UL, 0x00000000UL, 0x3fc7612fUL, 0x1eee8bd9UL, 0xbe1bfe9dUL,
+ 0x80000000UL, 0x3fc718bbUL, 0x0c603cc4UL, 0x3e36fdc9UL, 0x80000000UL,
+ 0x3fc6d064UL, 0x3728b8cfUL, 0xbe1e542eUL, 0x80000000UL, 0x3fc68829UL,
+ 0xc79a4067UL, 0x3e5c380fUL, 0x00000000UL, 0x3fc6400bUL, 0xf69eac69UL,
+ 0x3e550a84UL, 0x80000000UL, 0x3fc5f808UL, 0xb7a780a4UL, 0x3e5d9224UL,
+ 0x80000000UL, 0x3fc5b022UL, 0xad9dfb1eUL, 0xbe55242fUL, 0x00000000UL,
+ 0x3fc56858UL, 0x659b18beUL, 0xbe4bfda3UL, 0x80000000UL, 0x3fc520a9UL,
+ 0x66ee3631UL, 0xbe57d769UL, 0x80000000UL, 0x3fc4d916UL, 0x1ec62819UL,
+ 0x3e2427f7UL, 0x80000000UL, 0x3fc4919fUL, 0xdec25369UL, 0xbe435431UL,
+ 0x00000000UL, 0x3fc44a44UL, 0xa8acfc4bUL, 0xbe3c62e8UL, 0x00000000UL,
+ 0x3fc40304UL, 0xcf1d3eabUL, 0xbdfba29fUL, 0x80000000UL, 0x3fc3bbdfUL,
+ 0x79aba3eaUL, 0xbdf1b7c8UL, 0x80000000UL, 0x3fc374d6UL, 0xb8d186daUL,
+ 0xbe5130cfUL, 0x80000000UL, 0x3fc32de8UL, 0x9d74f152UL, 0x3e2285b6UL,
+ 0x00000000UL, 0x3fc2e716UL, 0x50ae7ca9UL, 0xbe503920UL, 0x80000000UL,
+ 0x3fc2a05eUL, 0x6caed92eUL, 0xbe533924UL, 0x00000000UL, 0x3fc259c2UL,
+ 0x9cb5034eUL, 0xbe510e31UL, 0x80000000UL, 0x3fc21340UL, 0x12c4d378UL,
+ 0xbe540b43UL, 0x80000000UL, 0x3fc1ccd9UL, 0xcc418706UL, 0x3e59887aUL,
+ 0x00000000UL, 0x3fc1868eUL, 0x921f4106UL, 0xbe528e67UL, 0x80000000UL,
+ 0x3fc1405cUL, 0x3969441eUL, 0x3e5d8051UL, 0x00000000UL, 0x3fc0fa46UL,
+ 0xd941ef5bUL, 0x3e5f9079UL, 0x80000000UL, 0x3fc0b44aUL, 0x5a3e81b2UL,
+ 0xbe567691UL, 0x00000000UL, 0x3fc06e69UL, 0x9d66afe7UL, 0xbe4d43fbUL,
+ 0x00000000UL, 0x3fc028a2UL, 0x0a92a162UL, 0xbe52f394UL, 0x00000000UL,
+ 0x3fbfc5eaUL, 0x209897e5UL, 0x3e529e37UL, 0x00000000UL, 0x3fbf3ac5UL,
+ 0x8458bd7bUL, 0x3e582831UL, 0x00000000UL, 0x3fbeafd5UL, 0xb8d8b4b8UL,
+ 0xbe486b4aUL, 0x00000000UL, 0x3fbe2518UL, 0xe0a3b7b6UL, 0x3e5bafd2UL,
+ 0x00000000UL, 0x3fbd9a90UL, 0x2bf2710eUL, 0x3e383b2bUL, 0x00000000UL,
+ 0x3fbd103cUL, 0x73eb6ab7UL, 0xbe56d78dUL, 0x00000000UL, 0x3fbc861bUL,
+ 0x32ceaff5UL, 0xbe32dc5aUL, 0x00000000UL, 0x3fbbfc2eUL, 0xbee04cb7UL,
+ 0xbe4a71a4UL, 0x00000000UL, 0x3fbb7274UL, 0x35ae9577UL, 0x3e38142fUL,
+ 0x00000000UL, 0x3fbae8eeUL, 0xcbaddab4UL, 0xbe5490f0UL, 0x00000000UL,
+ 0x3fba5f9aUL, 0x95ce1114UL, 0x3e597c71UL, 0x00000000UL, 0x3fb9d67aUL,
+ 0x6d7c0f78UL, 0x3e3abc2dUL, 0x00000000UL, 0x3fb94d8dUL, 0x2841a782UL,
+ 0xbe566cbcUL, 0x00000000UL, 0x3fb8c4d2UL, 0x6ed429c6UL, 0xbe3cfff9UL,
+ 0x00000000UL, 0x3fb83c4aUL, 0xe4a49fbbUL, 0xbe552964UL, 0x00000000UL,
+ 0x3fb7b3f4UL, 0x2193d81eUL, 0xbe42fa72UL, 0x00000000UL, 0x3fb72bd0UL,
+ 0xdd70c122UL, 0x3e527a8cUL, 0x00000000UL, 0x3fb6a3dfUL, 0x03108a54UL,
+ 0xbe450393UL, 0x00000000UL, 0x3fb61c1fUL, 0x30ff7954UL, 0x3e565840UL,
+ 0x00000000UL, 0x3fb59492UL, 0xdedd460cUL, 0xbe5422b5UL, 0x00000000UL,
+ 0x3fb50d36UL, 0x950f9f45UL, 0xbe5313f6UL, 0x00000000UL, 0x3fb4860bUL,
+ 0x582cdcb1UL, 0x3e506d39UL, 0x00000000UL, 0x3fb3ff12UL, 0x7216d3a6UL,
+ 0x3e4aa719UL, 0x00000000UL, 0x3fb3784aUL, 0x57a423fdUL, 0x3e5a9b9fUL,
+ 0x00000000UL, 0x3fb2f1b4UL, 0x7a138b41UL, 0xbe50b418UL, 0x00000000UL,
+ 0x3fb26b4eUL, 0x2fbfd7eaUL, 0x3e23a53eUL, 0x00000000UL, 0x3fb1e519UL,
+ 0x18913ccbUL, 0x3e465fc1UL, 0x00000000UL, 0x3fb15f15UL, 0x7ea24e21UL,
+ 0x3e042843UL, 0x00000000UL, 0x3fb0d941UL, 0x7c6d9c77UL, 0x3e59f61eUL,
+ 0x00000000UL, 0x3fb0539eUL, 0x114efd44UL, 0x3e4ccab7UL, 0x00000000UL,
+ 0x3faf9c56UL, 0x1777f657UL, 0x3e552f65UL, 0x00000000UL, 0x3fae91d2UL,
+ 0xc317b86aUL, 0xbe5a61e0UL, 0x00000000UL, 0x3fad87acUL, 0xb7664efbUL,
+ 0xbe41f64eUL, 0x00000000UL, 0x3fac7de6UL, 0x5d3d03a9UL, 0x3e0807a0UL,
+ 0x00000000UL, 0x3fab7480UL, 0x743c38ebUL, 0xbe3726e1UL, 0x00000000UL,
+ 0x3faa6b78UL, 0x06a253f1UL, 0x3e5ad636UL, 0x00000000UL, 0x3fa962d0UL,
+ 0xa35f541bUL, 0x3e5a187aUL, 0x00000000UL, 0x3fa85a88UL, 0x4b86e446UL,
+ 0xbe508150UL, 0x00000000UL, 0x3fa7529cUL, 0x2589cacfUL, 0x3e52938aUL,
+ 0x00000000UL, 0x3fa64b10UL, 0xaf6b11f2UL, 0xbe3454cdUL, 0x00000000UL,
+ 0x3fa543e2UL, 0x97506fefUL, 0xbe5fdec5UL, 0x00000000UL, 0x3fa43d10UL,
+ 0xe75f7dd9UL, 0xbe388dd3UL, 0x00000000UL, 0x3fa3369cUL, 0xa4139632UL,
+ 0xbdea5177UL, 0x00000000UL, 0x3fa23086UL, 0x352d6f1eUL, 0xbe565ad6UL,
+ 0x00000000UL, 0x3fa12accUL, 0x77449eb7UL, 0xbe50d5c7UL, 0x00000000UL,
+ 0x3fa0256eUL, 0x7478da78UL, 0x3e404724UL, 0x00000000UL, 0x3f9e40dcUL,
+ 0xf59cef7fUL, 0xbe539d0aUL, 0x00000000UL, 0x3f9c3790UL, 0x1511d43cUL,
+ 0x3e53c2c8UL, 0x00000000UL, 0x3f9a2f00UL, 0x9b8bff3cUL, 0xbe43b3e1UL,
+ 0x00000000UL, 0x3f982724UL, 0xad1e22a5UL, 0x3e46f0bdUL, 0x00000000UL,
+ 0x3f962000UL, 0x130d9356UL, 0x3e475ba0UL, 0x00000000UL, 0x3f941994UL,
+ 0x8f86f883UL, 0xbe513d0bUL, 0x00000000UL, 0x3f9213dcUL, 0x914d0dc8UL,
+ 0xbe534335UL, 0x00000000UL, 0x3f900ed8UL, 0x2d73e5e7UL, 0xbe22ba75UL,
+ 0x00000000UL, 0x3f8c1510UL, 0xc5b7d70eUL, 0x3e599c5dUL, 0x00000000UL,
+ 0x3f880de0UL, 0x8a27857eUL, 0xbe3d28c8UL, 0x00000000UL, 0x3f840810UL,
+ 0xda767328UL, 0x3e531b3dUL, 0x00000000UL, 0x3f8003b0UL, 0x77bacaf3UL,
+ 0xbe5f04e3UL, 0x00000000UL, 0x3f780150UL, 0xdf4b0720UL, 0x3e5a8bffUL,
+ 0x00000000UL, 0x3f6ffc40UL, 0x34c48e71UL, 0xbe3fcd99UL, 0x00000000UL,
+ 0x3f5ff6c0UL, 0x1ad218afUL, 0xbe4c78a7UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x80000000UL
+};
+
+ALIGNED_(8) juint _log2_pow[] =
+{
+ 0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
+};
+
+//registers,
+// input: xmm0, xmm1
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// rax, rdx, rcx, r8, r11
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, L_2TAG_PACKET_14_0_2, L_2TAG_PACKET_15_0_2;
+ Label L_2TAG_PACKET_16_0_2, L_2TAG_PACKET_17_0_2, L_2TAG_PACKET_18_0_2, L_2TAG_PACKET_19_0_2;
+ Label L_2TAG_PACKET_20_0_2, L_2TAG_PACKET_21_0_2, L_2TAG_PACKET_22_0_2, L_2TAG_PACKET_23_0_2;
+ Label L_2TAG_PACKET_24_0_2, L_2TAG_PACKET_25_0_2, L_2TAG_PACKET_26_0_2, L_2TAG_PACKET_27_0_2;
+ Label L_2TAG_PACKET_28_0_2, L_2TAG_PACKET_29_0_2, L_2TAG_PACKET_30_0_2, L_2TAG_PACKET_31_0_2;
+ Label L_2TAG_PACKET_32_0_2, L_2TAG_PACKET_33_0_2, L_2TAG_PACKET_34_0_2, L_2TAG_PACKET_35_0_2;
+ Label L_2TAG_PACKET_36_0_2, L_2TAG_PACKET_37_0_2, L_2TAG_PACKET_38_0_2, L_2TAG_PACKET_39_0_2;
+ Label L_2TAG_PACKET_40_0_2, L_2TAG_PACKET_41_0_2, L_2TAG_PACKET_42_0_2, L_2TAG_PACKET_43_0_2;
+ Label L_2TAG_PACKET_44_0_2, L_2TAG_PACKET_45_0_2, L_2TAG_PACKET_46_0_2, L_2TAG_PACKET_47_0_2;
+ Label L_2TAG_PACKET_48_0_2, L_2TAG_PACKET_49_0_2, L_2TAG_PACKET_50_0_2, L_2TAG_PACKET_51_0_2;
+ Label L_2TAG_PACKET_52_0_2, L_2TAG_PACKET_53_0_2, L_2TAG_PACKET_54_0_2, L_2TAG_PACKET_55_0_2;
+ Label L_2TAG_PACKET_56_0_2;
+ Label B1_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp1, tmp2, eax, ecx, edx);
+ jmp(start);
+ address HIGHSIGMASK = (address)_HIGHSIGMASK;
+ address LOG2_E = (address)_LOG2_E;
+ address coeff = (address)_coeff_pow;
+ address L_tbl = (address)_L_tbl_pow;
+ address HIGHMASK_Y = (address)_HIGHMASK_Y;
+ address T_exp = (address)_T_exp;
+ address e_coeff = (address)_e_coeff;
+ address coeff_h = (address)_coeff_h;
+ address HIGHMASK_LOG_X = (address)_HIGHMASK_LOG_X;
+ address HALFMASK = (address)_HALFMASK;
+ address log2 = (address)_log2_pow;
+
+
+ bind(start);
+ subq(rsp, 40);
+ movsd(Address(rsp, 8), xmm0);
+ movsd(Address(rsp, 16), xmm1);
+
+ bind(B1_2);
+ pextrw(eax, xmm0, 3);
+ xorpd(xmm2, xmm2);
+ mov64(tmp2, 0x3ff0000000000000);
+ movdq(xmm2, tmp2);
+ movl(tmp1, 1069088768);
+ movdq(xmm7, tmp1);
+ xorpd(xmm1, xmm1);
+ mov64(tmp3, 0x77f0000000000000);
+ movdq(xmm1, tmp3);
+ movdqu(xmm3, xmm0);
+ movl(edx, 32752);
+ andl(edx, eax);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ por(xmm0, xmm2);
+ movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
+ psrlq(xmm0, 27);
+ movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+ psrld(xmm0, 2);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ rcpps(xmm0, xmm0);
+ psllq(xmm3, 12);
+ movl(tmp4, 8192);
+ movdq(xmm4, tmp4);
+ psrlq(xmm3, 12);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+ movl(tmp1, 0);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ mulss(xmm0, xmm7);
+ movl(edx, -1);
+ subl(ecx, 4);
+ shll(edx);
+ shlq(edx, 32);
+ movdq(xmm5, edx);
+ por(xmm3, xmm1);
+ subl(eax, 16351);
+ cmpl(eax, 1);
+ jcc(Assembler::belowEqual, L_2TAG_PACKET_2_0_2);
+ paddd(xmm0, xmm4);
+ pand(xmm5, xmm3);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ subsd(xmm3, xmm5);
+ pand(xmm0, xmm6);
+ subl(eax, 1);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ mulsd(xmm3, xmm0);
+ movdqu(xmm1, ExternalAddress(coeff)); //0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL
+ lea(tmp4, ExternalAddress(L_tbl));
+ subsd(xmm5, xmm2);
+ movdqu(xmm4, ExternalAddress(16 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL
+ movl(ecx, eax);
+ sarl(eax, 31);
+ addl(ecx, eax);
+ xorl(eax, ecx);
+ addl(eax, 1);
+ bsrl(eax, eax);
+ unpcklpd(xmm5, xmm3);
+ movdqu(xmm6, ExternalAddress(32 + coeff)); //0x518775e3UL, 0x3f9004f2UL, 0xac8349bbUL, 0x3fa76c9bUL
+ addsd(xmm3, xmm5);
+ andl(edx, 16760832);
+ shrl(edx, 10);
+ addpd(xmm5, Address(tmp4, edx, Address::times_1, -3648));
+ movdqu(xmm0, ExternalAddress(48 + coeff)); //0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL
+ pshufd(xmm2, xmm3, 68);
+ mulsd(xmm3, xmm3);
+ mulpd(xmm1, xmm2);
+ mulpd(xmm4, xmm2);
+ addsd(xmm5, xmm7);
+ mulsd(xmm2, xmm3);
+ addpd(xmm6, xmm1);
+ mulsd(xmm3, xmm3);
+ addpd(xmm0, xmm4);
+ movq(xmm1, Address(rsp, 16));
+ movw(ecx, Address(rsp, 22));
+ pshufd(xmm7, xmm5, 238);
+ movq(xmm4, ExternalAddress(HIGHMASK_Y)); //0x00000000UL, 0xfffffff8UL, 0x00000000UL, 0xffffffffUL
+ mulpd(xmm6, xmm2);
+ pshufd(xmm3, xmm3, 68);
+ mulpd(xmm0, xmm2);
+ shll(eax, 4);
+ subl(eax, 15872);
+ andl(ecx, 32752);
+ addl(eax, ecx);
+ mulpd(xmm3, xmm6);
+ cmpl(eax, 624);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
+ xorpd(xmm6, xmm6);
+ movl(edx, 17080);
+ pinsrw(xmm6, edx, 3);
+ movdqu(xmm2, xmm1);
+ pand(xmm4, xmm1);
+ subsd(xmm1, xmm4);
+ mulsd(xmm4, xmm5);
+ addsd(xmm0, xmm7);
+ mulsd(xmm1, xmm5);
+ movdqu(xmm7, xmm6);
+ addsd(xmm6, xmm4);
+ lea(tmp4, ExternalAddress(T_exp));
+ addpd(xmm3, xmm0);
+ movdl(edx, xmm6);
+ subsd(xmm6, xmm7);
+ pshufd(xmm0, xmm3, 238);
+ subsd(xmm4, xmm6);
+ addsd(xmm0, xmm3);
+ movl(ecx, edx);
+ andl(edx, 255);
+ addl(edx, edx);
+ movdqu(xmm5, Address(tmp4, edx, Address::times_8, 0));
+ addsd(xmm4, xmm1);
+ mulsd(xmm2, xmm0);
+ movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
+ movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
+ shll(ecx, 12);
+ xorl(ecx, tmp1);
+ andl(rcx, -1048576);
+ movdq(xmm6, rcx);
+ addsd(xmm2, xmm4);
+ mov64(tmp2, 0x3fe62e42fefa39ef);
+ movdq(xmm1, tmp2);
+ pshufd(xmm0, xmm2, 68);
+ pshufd(xmm4, xmm2, 68);
+ mulsd(xmm1, xmm2);
+ pshufd(xmm6, xmm6, 17);
+ mulpd(xmm0, xmm0);
+ mulpd(xmm7, xmm4);
+ paddd(xmm5, xmm6);
+ mulsd(xmm1, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulsd(xmm0, xmm0);
+ addpd(xmm3, xmm7);
+ addsd(xmm1, xmm6);
+ mulpd(xmm0, xmm3);
+ pshufd(xmm3, xmm0, 238);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm3);
+ addsd(xmm0, xmm5);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ addl(eax, 16);
+ movl(edx, 32752);
+ andl(edx, eax);
+ cmpl(edx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_6_0_2);
+ testl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_7_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ movq(xmm0, Address(rsp, 8));
+ movq(xmm3, Address(rsp, 8));
+ movdl(edx, xmm3);
+ psrlq(xmm3, 32);
+ movdl(ecx, xmm3);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
+ xorpd(xmm3, xmm3);
+ movl(eax, 18416);
+ pinsrw(xmm3, eax, 3);
+ mulsd(xmm0, xmm3);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm3, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psrlq(xmm0, 27);
+ movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm3, 12);
+ movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
+ psrlq(xmm3, 12);
+ mulss(xmm0, xmm7);
+ movl(edx, -1024);
+ movdl(xmm5, edx);
+ por(xmm3, xmm1);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm3);
+ movl(tmp1, 0);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ andl(eax, 32752);
+ subl(eax, 18416);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ jmp(L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movq(xmm0, Address(rsp, 8));
+ movq(xmm3, Address(rsp, 8));
+ movdl(edx, xmm3);
+ psrlq(xmm3, 32);
+ movdl(ecx, xmm3);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
+ xorpd(xmm3, xmm3);
+ movl(eax, 18416);
+ pinsrw(xmm3, eax, 3);
+ mulsd(xmm0, xmm3);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm3, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psrlq(xmm0, 27);
+ movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+ psrld(xmm0, 2);
+ rcpps(xmm0, xmm0);
+ psllq(xmm3, 12);
+ movdqu(xmm6, ExternalAddress(HIGHSIGMASK)); //0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL
+ psrlq(xmm3, 12);
+ mulss(xmm0, xmm7);
+ movl(edx, -1024);
+ movdl(xmm5, edx);
+ por(xmm3, xmm1);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm3);
+ movl(tmp1, INT_MIN);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ andl(eax, 32752);
+ subl(eax, 18416);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ jmp(L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ cmpl(eax, 0);
+ jcc(Assembler::less, L_2TAG_PACKET_11_0_2);
+ cmpl(eax, 752);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_12_0_2);
+ addsd(xmm0, xmm7);
+ movq(xmm2, ExternalAddress(HALFMASK)); //0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL
+ addpd(xmm3, xmm0);
+ xorpd(xmm6, xmm6);
+ movl(eax, 17080);
+ pinsrw(xmm6, eax, 3);
+ pshufd(xmm0, xmm3, 238);
+ addsd(xmm0, xmm3);
+ movdqu(xmm3, xmm5);
+ addsd(xmm5, xmm0);
+ movdqu(xmm4, xmm2);
+ subsd(xmm3, xmm5);
+ movdqu(xmm7, xmm5);
+ pand(xmm5, xmm2);
+ movdqu(xmm2, xmm1);
+ pand(xmm4, xmm1);
+ subsd(xmm7, xmm5);
+ addsd(xmm0, xmm3);
+ subsd(xmm1, xmm4);
+ mulsd(xmm4, xmm5);
+ addsd(xmm0, xmm7);
+ mulsd(xmm2, xmm0);
+ movdqu(xmm7, xmm6);
+ mulsd(xmm1, xmm5);
+ addsd(xmm6, xmm4);
+ movdl(eax, xmm6);
+ subsd(xmm6, xmm7);
+ lea(tmp4, ExternalAddress(T_exp));
+ addsd(xmm2, xmm1);
+ movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
+ movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
+ subsd(xmm4, xmm6);
+ pextrw(edx, xmm6, 3);
+ movl(ecx, eax);
+ andl(eax, 255);
+ addl(eax, eax);
+ movdqu(xmm5, Address(tmp4, rax, Address::times_8, 0));
+ addsd(xmm2, xmm4);
+ sarl(ecx, 8);
+ movl(eax, ecx);
+ sarl(ecx, 1);
+ subl(eax, ecx);
+ shll(ecx, 20);
+ xorl(ecx, tmp1);
+ movdl(xmm6, ecx);
+ movq(xmm1, ExternalAddress(32 + e_coeff)); //0xfefa39efUL, 0x3fe62e42UL, 0x00000000UL, 0x00000000UL
+ andl(edx, 32767);
+ cmpl(edx, 16529);
+ jcc(Assembler::above, L_2TAG_PACKET_12_0_2);
+ pshufd(xmm0, xmm2, 68);
+ pshufd(xmm4, xmm2, 68);
+ mulpd(xmm0, xmm0);
+ mulpd(xmm7, xmm4);
+ pshufd(xmm6, xmm6, 17);
+ mulsd(xmm1, xmm2);
+ mulsd(xmm0, xmm0);
+ paddd(xmm5, xmm6);
+ addpd(xmm3, xmm7);
+ mulsd(xmm1, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulpd(xmm0, xmm3);
+ addsd(xmm1, xmm6);
+ pshufd(xmm3, xmm0, 238);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ shll(eax, 4);
+ xorpd(xmm4, xmm4);
+ addl(eax, 16368);
+ pinsrw(xmm4, eax, 3);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm3);
+ movdqu(xmm1, xmm0);
+ addsd(xmm0, xmm5);
+ mulsd(xmm0, xmm4);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_13_0_2);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_14_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movq(xmm0, Address(rsp, 8));
+ movdqu(xmm2, xmm0);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_15_0_2);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
+ addsd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_16_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ movl(Address(rsp, 0), 29);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_18_0_2);
+ movq(xmm0, Address(rsp, 16));
+ addpd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_15_0_2);
+ movdl(eax, xmm1);
+ movdqu(xmm2, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_19_0_2);
+ pextrw(eax, xmm2, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_20_0_2);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_20_0_2);
+ pextrw(eax, xmm0, 3);
+ testl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_21_0_2);
+ testl(ecx, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_23_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
+ testl(eax, 2);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_25_0_2);
+ jmp(L_2TAG_PACKET_24_0_2);
+
+ bind(L_2TAG_PACKET_21_0_2);
+ shrl(ecx, 20);
+ andl(ecx, 2047);
+ cmpl(ecx, 1075);
+ jcc(Assembler::above, L_2TAG_PACKET_24_0_2);
+ jcc(Assembler::equal, L_2TAG_PACKET_26_0_2);
+ cmpl(ecx, 1074);
+ jcc(Assembler::above, L_2TAG_PACKET_23_0_2);
+ cmpl(ecx, 1023);
+ jcc(Assembler::below, L_2TAG_PACKET_24_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movl(eax, 17208);
+ xorpd(xmm3, xmm3);
+ pinsrw(xmm3, eax, 3);
+ movdqu(xmm4, xmm3);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
+ movdl(eax, xmm3);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_24_0_2);
+
+ bind(L_2TAG_PACKET_25_0_2);
+ movq(xmm1, Address(rsp, 16));
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_27_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_27_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32768);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_24_0_2);
+ movq(xmm1, Address(rsp, 16));
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_26_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_24_0_2);
+ jmp(L_2TAG_PACKET_25_0_2);
+
+ bind(L_2TAG_PACKET_28_0_2);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 20);
+ movdl(edx, xmm1);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_29_0_2);
+ movq(xmm0, Address(rsp, 16));
+ addsd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_29_0_2);
+ movq(xmm0, Address(rsp, 8));
+ pextrw(eax, xmm0, 3);
+ cmpl(eax, 49136);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_30_0_2);
+ movdl(ecx, xmm0);
+ psrlq(xmm0, 20);
+ movdl(edx, xmm0);
+ orl(ecx, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_30_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32760);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_30_0_2);
+ movq(xmm1, Address(rsp, 16));
+ andl(eax, 32752);
+ subl(eax, 16368);
+ pextrw(edx, xmm1, 3);
+ xorpd(xmm0, xmm0);
+ xorl(eax, edx);
+ andl(eax, 32768);
+ jcc(Assembler::equal, L_2TAG_PACKET_31_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_31_0_2);
+ movl(ecx, 32752);
+ pinsrw(xmm0, ecx, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_32_0_2);
+ movdl(eax, xmm1);
+ cmpl(edx, 17184);
+ jcc(Assembler::above, L_2TAG_PACKET_33_0_2);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
+ testl(eax, 2);
+ jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
+ jmp(L_2TAG_PACKET_36_0_2);
+
+ bind(L_2TAG_PACKET_33_0_2);
+ testl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
+ jmp(L_2TAG_PACKET_36_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ movq(xmm2, Address(rsp, 8));
+ movdl(eax, xmm2);
+ psrlq(xmm2, 31);
+ movdl(ecx, xmm2);
+ orl(eax, ecx);
+ jcc(Assembler::equal, L_2TAG_PACKET_9_0_2);
+ movq(xmm1, Address(rsp, 16));
+ pextrw(edx, xmm1, 3);
+ movdl(eax, xmm1);
+ movdqu(xmm2, xmm1);
+ psrlq(xmm2, 32);
+ movdl(ecx, xmm2);
+ addl(ecx, ecx);
+ orl(ecx, eax);
+ jcc(Assembler::equal, L_2TAG_PACKET_37_0_2);
+ andl(edx, 32752);
+ cmpl(edx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
+ cmpl(edx, 17200);
+ jcc(Assembler::above, L_2TAG_PACKET_35_0_2);
+ cmpl(edx, 17184);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_32_0_2);
+ cmpl(edx, 16368);
+ jcc(Assembler::below, L_2TAG_PACKET_34_0_2);
+ movl(eax, 17208);
+ xorpd(xmm2, xmm2);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm4, xmm2);
+ addsd(xmm2, xmm1);
+ subsd(xmm4, xmm2);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32767);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
+ movdl(eax, xmm2);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_35_0_2);
+
+ bind(L_2TAG_PACKET_36_0_2);
+ xorpd(xmm1, xmm1);
+ movl(edx, 30704);
+ pinsrw(xmm1, edx, 3);
+ movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+ movq(xmm4, Address(rsp, 8));
+ pextrw(eax, xmm4, 3);
+ movl(edx, 8192);
+ movdl(xmm4, edx);
+ andl(eax, 32767);
+ subl(eax, 16);
+ jcc(Assembler::less, L_2TAG_PACKET_10_0_2);
+ movl(edx, eax);
+ andl(edx, 32752);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ movl(tmp1, INT_MIN);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_34_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ xorpd(xmm0, xmm0);
+ mulsd(xmm0, xmm1);
+ movl(Address(rsp, 0), 28);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_35_0_2);
+ xorpd(xmm1, xmm1);
+ movl(edx, 30704);
+ pinsrw(xmm1, edx, 3);
+ movq(xmm2, ExternalAddress(LOG2_E)); //0x00000000UL, 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL
+ movq(xmm4, Address(rsp, 8));
+ pextrw(eax, xmm4, 3);
+ movl(edx, 8192);
+ movdl(xmm4, edx);
+ andl(eax, 32767);
+ subl(eax, 16);
+ jcc(Assembler::less, L_2TAG_PACKET_8_0_2);
+ movl(edx, eax);
+ andl(edx, 32752);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ movl(tmp1, 0);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_19_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_22_0_2);
+ xorpd(xmm0, xmm0);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_11_0_2);
+ addl(eax, 384);
+ cmpl(eax, 0);
+ jcc(Assembler::less, L_2TAG_PACKET_38_0_2);
+ mulsd(xmm5, xmm1);
+ addsd(xmm0, xmm7);
+ shrl(tmp1, 31);
+ addpd(xmm3, xmm0);
+ pshufd(xmm0, xmm3, 238);
+ addsd(xmm3, xmm0);
+ lea(tmp4, ExternalAddress(log2)); //0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL, 0xbfe62e42UL
+ movq(xmm4, Address(tmp4, tmp1, Address::times_8, 0));
+ mulsd(xmm1, xmm3);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ shll(tmp1, 15);
+ orl(eax, tmp1);
+ pinsrw(xmm0, eax, 3);
+ addsd(xmm5, xmm1);
+ mulsd(xmm5, xmm4);
+ addsd(xmm0, xmm5);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_38_0_2);
+
+ bind(L_2TAG_PACKET_37_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_39_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ movl(Address(rsp, 0), 26);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movdqu(xmm2, xmm1);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_40_0_2);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_40_0_2);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_39_0_2);
+ shrl(edx, 21);
+ cmpl(edx, 1075);
+ jcc(Assembler::above, L_2TAG_PACKET_41_0_2);
+ jcc(Assembler::equal, L_2TAG_PACKET_42_0_2);
+ cmpl(edx, 1023);
+ jcc(Assembler::below, L_2TAG_PACKET_41_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movl(eax, 17208);
+ xorpd(xmm3, xmm3);
+ pinsrw(xmm3, eax, 3);
+ movdqu(xmm4, xmm3);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_41_0_2);
+ movdl(eax, xmm3);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_41_0_2);
+
+ bind(L_2TAG_PACKET_43_0_2);
+ movq(xmm0, Address(rsp, 8));
+ testl(ecx, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_44_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_42_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_43_0_2);
+
+ bind(L_2TAG_PACKET_41_0_2);
+ testl(ecx, INT_MIN);
+ jcc(Assembler::equal, L_2TAG_PACKET_22_0_2);
+ xorpd(xmm0, xmm0);
+
+ bind(L_2TAG_PACKET_44_0_2);
+ movl(eax, 16368);
+ xorpd(xmm1, xmm1);
+ pinsrw(xmm1, eax, 3);
+ divsd(xmm1, xmm0);
+ movdqu(xmm0, xmm1);
+ movl(Address(rsp, 0), 27);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_12_0_2);
+ movq(xmm2, Address(rsp, 8));
+ movq(xmm6, Address(rsp, 16));
+ pextrw(eax, xmm2, 3);
+ pextrw(edx, xmm6, 3);
+ movl(ecx, 32752);
+ andl(ecx, edx);
+ cmpl(ecx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
+ andl(eax, 32752);
+ subl(eax, 16368);
+ xorl(edx, eax);
+ testl(edx, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_46_0_2);
+
+ bind(L_2TAG_PACKET_47_0_2);
+ movl(eax, 32736);
+ pinsrw(xmm0, eax, 3);
+ shrl(tmp1, 16);
+ orl(eax, tmp1);
+ pinsrw(xmm1, eax, 3);
+ mulsd(xmm0, xmm1);
+
+ bind(L_2TAG_PACKET_14_0_2);
+ movl(Address(rsp, 0), 24);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_46_0_2);
+ movl(eax, 16);
+ pinsrw(xmm0, eax, 3);
+ mulsd(xmm0, xmm0);
+ testl(tmp1, INT_MIN);
+ jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
+ mov64(tmp2, 0x8000000000000000);
+ movdq(xmm2, tmp2);
+ xorpd(xmm0, xmm2);
+
+ bind(L_2TAG_PACKET_48_0_2);
+ movl(Address(rsp, 0), 25);
+ jmp(L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_13_0_2);
+ pextrw(ecx, xmm5, 3);
+ pextrw(edx, xmm4, 3);
+ movl(eax, -1);
+ andl(ecx, 32752);
+ subl(ecx, 16368);
+ andl(edx, 32752);
+ addl(edx, ecx);
+ movl(ecx, -31);
+ sarl(edx, 4);
+ subl(ecx, edx);
+ jcc(Assembler::lessEqual, L_2TAG_PACKET_49_0_2);
+ cmpl(ecx, 20);
+ jcc(Assembler::above, L_2TAG_PACKET_50_0_2);
+ shll(eax);
+
+ bind(L_2TAG_PACKET_49_0_2);
+ movdl(xmm0, eax);
+ psllq(xmm0, 32);
+ pand(xmm0, xmm5);
+ subsd(xmm5, xmm0);
+ addsd(xmm5, xmm1);
+ mulsd(xmm0, xmm4);
+ mulsd(xmm5, xmm4);
+ addsd(xmm0, xmm5);
+
+ bind(L_2TAG_PACKET_50_0_2);
+ jmp(L_2TAG_PACKET_48_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movw(ecx, Address(rsp, 22));
+ movl(edx, INT_MIN);
+ movdl(xmm1, rdx);
+ xorpd(xmm7, xmm7);
+ paddd(xmm0, xmm4);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ paddq(xmm1, xmm3);
+ pand(xmm5, xmm1);
+ andl(ecx, 32752);
+ cmpl(ecx, 16560);
+ jcc(Assembler::less, L_2TAG_PACKET_3_0_2);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ addl(eax, 16351);
+ shrl(eax, 4);
+ subl(eax, 1022);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ lea(r11, ExternalAddress(L_tbl));
+ movq(xmm4, ExternalAddress(coeff_h)); //0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
+ mulsd(xmm3, xmm0);
+ movq(xmm6, ExternalAddress(coeff_h)); //0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL
+ subsd(xmm5, xmm2);
+ movq(xmm1, ExternalAddress(8 + coeff_h)); //0x00000000UL, 0xbf5dabe1UL
+ pshufd(xmm2, xmm3, 68);
+ unpcklpd(xmm5, xmm3);
+ addsd(xmm3, xmm5);
+ movq(xmm0, ExternalAddress(8 + coeff_h)); //0x00000000UL, 0xbf5dabe1UL
+ andl(edx, 16760832);
+ shrl(edx, 10);
+ addpd(xmm7, Address(tmp4, edx, Address::times_1, -3648));
+ mulsd(xmm4, xmm5);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm6, xmm2);
+ mulsd(xmm1, xmm2);
+ movdqu(xmm2, xmm5);
+ mulsd(xmm4, xmm5);
+ addsd(xmm5, xmm0);
+ movdqu(xmm0, xmm7);
+ addsd(xmm2, xmm3);
+ addsd(xmm7, xmm5);
+ mulsd(xmm6, xmm2);
+ subsd(xmm0, xmm7);
+ movdqu(xmm2, xmm7);
+ addsd(xmm7, xmm4);
+ addsd(xmm0, xmm5);
+ subsd(xmm2, xmm7);
+ addsd(xmm4, xmm2);
+ pshufd(xmm2, xmm5, 238);
+ movdqu(xmm5, xmm7);
+ addsd(xmm7, xmm2);
+ addsd(xmm4, xmm0);
+ movdqu(xmm0, ExternalAddress(coeff)); //0x6dc96112UL, 0xbf836578UL, 0xee241472UL, 0xbf9b0301UL
+ subsd(xmm5, xmm7);
+ addsd(xmm6, xmm4);
+ movdqu(xmm4, xmm7);
+ addsd(xmm5, xmm2);
+ addsd(xmm7, xmm1);
+ movdqu(xmm2, ExternalAddress(64 + coeff)); //0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL
+ subsd(xmm4, xmm7);
+ addsd(xmm6, xmm5);
+ addsd(xmm4, xmm1);
+ pshufd(xmm5, xmm7, 238);
+ movapd(xmm1, xmm7);
+ addsd(xmm7, xmm5);
+ subsd(xmm1, xmm7);
+ addsd(xmm1, xmm5);
+ movdqu(xmm5, ExternalAddress(80 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL
+ pshufd(xmm3, xmm3, 68);
+ addsd(xmm6, xmm4);
+ addsd(xmm6, xmm1);
+ movdqu(xmm1, ExternalAddress(32 + coeff)); //0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL, 0xbfd619b6UL
+ mulpd(xmm0, xmm3);
+ mulpd(xmm2, xmm3);
+ pshufd(xmm4, xmm3, 68);
+ mulpd(xmm3, xmm3);
+ addpd(xmm0, xmm1);
+ addpd(xmm5, xmm2);
+ mulsd(xmm4, xmm3);
+ movq(xmm2, ExternalAddress(HIGHMASK_LOG_X)); //0xf8000000UL, 0xffffffffUL, 0x00000000UL, 0xfffff800UL
+ mulpd(xmm3, xmm3);
+ movq(xmm1, Address(rsp, 16));
+ movw(ecx, Address(rsp, 22));
+ mulpd(xmm0, xmm4);
+ pextrw(eax, xmm7, 3);
+ mulpd(xmm5, xmm4);
+ mulpd(xmm0, xmm3);
+ movq(xmm4, ExternalAddress(8 + HIGHMASK_Y)); //0x00000000UL, 0xffffffffUL
+ pand(xmm2, xmm7);
+ addsd(xmm5, xmm6);
+ subsd(xmm7, xmm2);
+ addpd(xmm5, xmm0);
+ andl(eax, 32752);
+ subl(eax, 16368);
+ andl(ecx, 32752);
+ cmpl(ecx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
+ addl(ecx, eax);
+ cmpl(ecx, 16576);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_51_0_2);
+ pshufd(xmm0, xmm5, 238);
+ pand(xmm4, xmm1);
+ movdqu(xmm3, xmm1);
+ addsd(xmm5, xmm0);
+ subsd(xmm1, xmm4);
+ xorpd(xmm6, xmm6);
+ movl(edx, 17080);
+ pinsrw(xmm6, edx, 3);
+ addsd(xmm7, xmm5);
+ mulsd(xmm4, xmm2);
+ mulsd(xmm1, xmm2);
+ movdqu(xmm5, xmm6);
+ mulsd(xmm3, xmm7);
+ addsd(xmm6, xmm4);
+ addsd(xmm1, xmm3);
+ movdqu(xmm7, ExternalAddress(e_coeff)); //0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL
+ movdl(edx, xmm6);
+ subsd(xmm6, xmm5);
+ lea(tmp4, ExternalAddress(T_exp));
+ movdqu(xmm3, ExternalAddress(16 + e_coeff)); //0x6fba4e77UL, 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL
+ movq(xmm2, ExternalAddress(32 + e_coeff)); //0xfefa39efUL, 0x3fe62e42UL, 0x00000000UL, 0x00000000UL
+ subsd(xmm4, xmm6);
+ movl(ecx, edx);
+ andl(edx, 255);
+ addl(edx, edx);
+ movdqu(xmm5, Address(tmp4, edx, Address::times_8, 0));
+ addsd(xmm4, xmm1);
+ pextrw(edx, xmm6, 3);
+ shrl(ecx, 8);
+ movl(eax, ecx);
+ shrl(ecx, 1);
+ subl(eax, ecx);
+ shll(ecx, 20);
+ movdl(xmm6, ecx);
+ pshufd(xmm0, xmm4, 68);
+ pshufd(xmm1, xmm4, 68);
+ mulpd(xmm0, xmm0);
+ mulpd(xmm7, xmm1);
+ pshufd(xmm6, xmm6, 17);
+ mulsd(xmm2, xmm4);
+ andl(edx, 32767);
+ cmpl(edx, 16529);
+ jcc(Assembler::above, L_2TAG_PACKET_12_0_2);
+ mulsd(xmm0, xmm0);
+ paddd(xmm5, xmm6);
+ addpd(xmm3, xmm7);
+ mulsd(xmm2, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulpd(xmm0, xmm3);
+ addsd(xmm2, xmm6);
+ pshufd(xmm3, xmm0, 238);
+ addl(eax, 1023);
+ shll(eax, 20);
+ orl(eax, tmp1);
+ movdl(xmm4, eax);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ addsd(xmm0, xmm2);
+ psllq(xmm4, 32);
+ addsd(xmm0, xmm3);
+ movdqu(xmm1, xmm0);
+ addsd(xmm0, xmm5);
+ mulsd(xmm0, xmm4);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_13_0_2);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_14_0_2);
+
+ bind(L_2TAG_PACKET_52_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_45_0_2);
+ movq(xmm0, Address(rsp, 8));
+ xorpd(xmm2, xmm2);
+ movl(eax, 49136);
+ pinsrw(xmm2, eax, 3);
+ addsd(xmm2, xmm0);
+ pextrw(eax, xmm2, 3);
+ cmpl(eax, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_53_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32760);
+ pinsrw(xmm0, eax, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_53_0_2);
+ movq(xmm1, Address(rsp, 16));
+ movdl(edx, xmm1);
+ movdqu(xmm3, xmm1);
+ psrlq(xmm3, 20);
+ movdl(ecx, xmm3);
+ orl(ecx, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_54_0_2);
+ addsd(xmm1, xmm1);
+ movdqu(xmm0, xmm1);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_51_0_2);
+ pextrw(eax, xmm1, 3);
+ pextrw(ecx, xmm2, 3);
+ xorl(eax, ecx);
+ testl(eax, 32768);
+ jcc(Assembler::equal, L_2TAG_PACKET_47_0_2);
+ jmp(L_2TAG_PACKET_46_0_2);
+
+ bind(L_2TAG_PACKET_54_0_2);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ pextrw(edx, xmm1, 3);
+ xorpd(xmm0, xmm0);
+ subl(eax, 16368);
+ xorl(eax, edx);
+ testl(eax, 32768);
+ jcc(Assembler::equal, L_2TAG_PACKET_55_0_2);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_55_0_2);
+ movl(edx, 32752);
+ pinsrw(xmm0, edx, 3);
+ jmp(B1_5);
+
+ bind(L_2TAG_PACKET_17_0_2);
+ movq(Address(rsp, 24), xmm0);
+
+ bind(B1_3);
+ movq(xmm0, Address(rsp, 24));
+
+ bind(L_2TAG_PACKET_56_0_2);
+
+ bind(B1_5);
+ addq(rsp, 40);
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _static_const_table_pow[] =
+{
+ 0x00000000UL, 0xbfd61a00UL, 0x00000000UL, 0xbf5dabe1UL, 0xf8000000UL,
+ 0xffffffffUL, 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0x00000000UL, 0x20000000UL, 0x3feff00aUL, 0x96621f95UL,
+ 0x3e5b1856UL, 0xe0000000UL, 0x3fefe019UL, 0xe5916f9eUL, 0xbe325278UL,
+ 0x00000000UL, 0x3fefd02fUL, 0x859a1062UL, 0x3e595fb7UL, 0xc0000000UL,
+ 0x3fefc049UL, 0xb245f18fUL, 0xbe529c38UL, 0xe0000000UL, 0x3fefb069UL,
+ 0xad2880a7UL, 0xbe501230UL, 0x60000000UL, 0x3fefa08fUL, 0xc8e72420UL,
+ 0x3e597bd1UL, 0x80000000UL, 0x3fef90baUL, 0xc30c4500UL, 0xbe5d6c75UL,
+ 0xe0000000UL, 0x3fef80eaUL, 0x02c63f43UL, 0x3e2e1318UL, 0xc0000000UL,
+ 0x3fef7120UL, 0xb3d4ccccUL, 0xbe44c52aUL, 0x00000000UL, 0x3fef615cUL,
+ 0xdbd91397UL, 0xbe4e7d6cUL, 0xa0000000UL, 0x3fef519cUL, 0x65c5cd68UL,
+ 0xbe522dc8UL, 0xa0000000UL, 0x3fef41e2UL, 0x46d1306cUL, 0xbe5a840eUL,
+ 0xe0000000UL, 0x3fef322dUL, 0xd2980e94UL, 0x3e5071afUL, 0xa0000000UL,
+ 0x3fef227eUL, 0x773abadeUL, 0xbe5891e5UL, 0xa0000000UL, 0x3fef12d4UL,
+ 0xdc6bf46bUL, 0xbe5cccbeUL, 0xe0000000UL, 0x3fef032fUL, 0xbc7247faUL,
+ 0xbe2bab83UL, 0x80000000UL, 0x3feef390UL, 0xbcaa1e46UL, 0xbe53bb3bUL,
+ 0x60000000UL, 0x3feee3f6UL, 0x5f6c682dUL, 0xbe54c619UL, 0x80000000UL,
+ 0x3feed461UL, 0x5141e368UL, 0xbe4b6d86UL, 0xe0000000UL, 0x3feec4d1UL,
+ 0xec678f76UL, 0xbe369af6UL, 0x80000000UL, 0x3feeb547UL, 0x41301f55UL,
+ 0xbe2d4312UL, 0x60000000UL, 0x3feea5c2UL, 0x676da6bdUL, 0xbe4d8dd0UL,
+ 0x60000000UL, 0x3fee9642UL, 0x57a891c4UL, 0x3e51f991UL, 0xa0000000UL,
+ 0x3fee86c7UL, 0xe4eb491eUL, 0x3e579bf9UL, 0x20000000UL, 0x3fee7752UL,
+ 0xfddc4a2cUL, 0xbe3356e6UL, 0xc0000000UL, 0x3fee67e1UL, 0xd75b5bf1UL,
+ 0xbe449531UL, 0x80000000UL, 0x3fee5876UL, 0xbd423b8eUL, 0x3df54fe4UL,
+ 0x60000000UL, 0x3fee4910UL, 0x330e51b9UL, 0x3e54289cUL, 0x80000000UL,
+ 0x3fee39afUL, 0x8651a95fUL, 0xbe55aad6UL, 0xa0000000UL, 0x3fee2a53UL,
+ 0x5e98c708UL, 0xbe2fc4a9UL, 0xe0000000UL, 0x3fee1afcUL, 0x0989328dUL,
+ 0x3e23958cUL, 0x40000000UL, 0x3fee0babUL, 0xee642abdUL, 0xbe425dd8UL,
+ 0xa0000000UL, 0x3fedfc5eUL, 0xc394d236UL, 0x3e526362UL, 0x20000000UL,
+ 0x3feded17UL, 0xe104aa8eUL, 0x3e4ce247UL, 0xc0000000UL, 0x3fedddd4UL,
+ 0x265a9be4UL, 0xbe5bb77aUL, 0x40000000UL, 0x3fedce97UL, 0x0ecac52fUL,
+ 0x3e4a7cb1UL, 0xe0000000UL, 0x3fedbf5eUL, 0x124cb3b8UL, 0x3e257024UL,
+ 0x80000000UL, 0x3fedb02bUL, 0xe6d4febeUL, 0xbe2033eeUL, 0x20000000UL,
+ 0x3feda0fdUL, 0x39cca00eUL, 0xbe3ddabcUL, 0xc0000000UL, 0x3fed91d3UL,
+ 0xef8a552aUL, 0xbe543390UL, 0x40000000UL, 0x3fed82afUL, 0xb8e85204UL,
+ 0x3e513850UL, 0xe0000000UL, 0x3fed738fUL, 0x3d59fe08UL, 0xbe5db728UL,
+ 0x40000000UL, 0x3fed6475UL, 0x3aa7ead1UL, 0x3e58804bUL, 0xc0000000UL,
+ 0x3fed555fUL, 0xf8a35ba9UL, 0xbe5298b0UL, 0x00000000UL, 0x3fed464fUL,
+ 0x9a88dd15UL, 0x3e5a8cdbUL, 0x40000000UL, 0x3fed3743UL, 0xb0b0a190UL,
+ 0x3e598635UL, 0x80000000UL, 0x3fed283cUL, 0xe2113295UL, 0xbe5c1119UL,
+ 0x80000000UL, 0x3fed193aUL, 0xafbf1728UL, 0xbe492e9cUL, 0x60000000UL,
+ 0x3fed0a3dUL, 0xe4a4ccf3UL, 0x3e19b90eUL, 0x20000000UL, 0x3fecfb45UL,
+ 0xba3cbeb8UL, 0x3e406b50UL, 0xc0000000UL, 0x3fecec51UL, 0x110f7dddUL,
+ 0x3e0d6806UL, 0x40000000UL, 0x3fecdd63UL, 0x7dd7d508UL, 0xbe5a8943UL,
+ 0x80000000UL, 0x3fecce79UL, 0x9b60f271UL, 0xbe50676aUL, 0x80000000UL,
+ 0x3fecbf94UL, 0x0b9ad660UL, 0x3e59174fUL, 0x60000000UL, 0x3fecb0b4UL,
+ 0x00823d9cUL, 0x3e5bbf72UL, 0x20000000UL, 0x3feca1d9UL, 0x38a6ec89UL,
+ 0xbe4d38f9UL, 0x80000000UL, 0x3fec9302UL, 0x3a0b7d8eUL, 0x3e53dbfdUL,
+ 0xc0000000UL, 0x3fec8430UL, 0xc6826b34UL, 0xbe27c5c9UL, 0xc0000000UL,
+ 0x3fec7563UL, 0x0c706381UL, 0xbe593653UL, 0x60000000UL, 0x3fec669bUL,
+ 0x7df34ec7UL, 0x3e461ab5UL, 0xe0000000UL, 0x3fec57d7UL, 0x40e5e7e8UL,
+ 0xbe5c3daeUL, 0x00000000UL, 0x3fec4919UL, 0x5602770fUL, 0xbe55219dUL,
+ 0xc0000000UL, 0x3fec3a5eUL, 0xec7911ebUL, 0x3e5a5d25UL, 0x60000000UL,
+ 0x3fec2ba9UL, 0xb39ea225UL, 0xbe53c00bUL, 0x80000000UL, 0x3fec1cf8UL,
+ 0x967a212eUL, 0x3e5a8ddfUL, 0x60000000UL, 0x3fec0e4cUL, 0x580798bdUL,
+ 0x3e5f53abUL, 0x00000000UL, 0x3febffa5UL, 0xb8282df6UL, 0xbe46b874UL,
+ 0x20000000UL, 0x3febf102UL, 0xe33a6729UL, 0x3e54963fUL, 0x00000000UL,
+ 0x3febe264UL, 0x3b53e88aUL, 0xbe3adce1UL, 0x60000000UL, 0x3febd3caUL,
+ 0xc2585084UL, 0x3e5cde9fUL, 0x80000000UL, 0x3febc535UL, 0xa335c5eeUL,
+ 0xbe39fd9cUL, 0x20000000UL, 0x3febb6a5UL, 0x7325b04dUL, 0x3e42ba15UL,
+ 0x60000000UL, 0x3feba819UL, 0x1564540fUL, 0x3e3a9f35UL, 0x40000000UL,
+ 0x3feb9992UL, 0x83fff592UL, 0xbe5465ceUL, 0xa0000000UL, 0x3feb8b0fUL,
+ 0xb9da63d3UL, 0xbe4b1a0aUL, 0x80000000UL, 0x3feb7c91UL, 0x6d6f1ea4UL,
+ 0x3e557657UL, 0x00000000UL, 0x3feb6e18UL, 0x5e80a1bfUL, 0x3e4ddbb6UL,
+ 0x00000000UL, 0x3feb5fa3UL, 0x1c9eacb5UL, 0x3e592877UL, 0xa0000000UL,
+ 0x3feb5132UL, 0x6d40beb3UL, 0xbe51858cUL, 0xa0000000UL, 0x3feb42c6UL,
+ 0xd740c67bUL, 0x3e427ad2UL, 0x40000000UL, 0x3feb345fUL, 0xa3e0cceeUL,
+ 0xbe5c2fc4UL, 0x40000000UL, 0x3feb25fcUL, 0x8e752b50UL, 0xbe3da3c2UL,
+ 0xc0000000UL, 0x3feb179dUL, 0xa892e7deUL, 0x3e1fb481UL, 0xc0000000UL,
+ 0x3feb0943UL, 0x21ed71e9UL, 0xbe365206UL, 0x20000000UL, 0x3feafaeeUL,
+ 0x0e1380a3UL, 0x3e5c5b7bUL, 0x20000000UL, 0x3feaec9dUL, 0x3c3d640eUL,
+ 0xbe5dbbd0UL, 0x60000000UL, 0x3feade50UL, 0x8f97a715UL, 0x3e3a8ec5UL,
+ 0x20000000UL, 0x3fead008UL, 0x23ab2839UL, 0x3e2fe98aUL, 0x40000000UL,
+ 0x3feac1c4UL, 0xf4bbd50fUL, 0x3e54d8f6UL, 0xe0000000UL, 0x3feab384UL,
+ 0x14757c4dUL, 0xbe48774cUL, 0xc0000000UL, 0x3feaa549UL, 0x7c7b0eeaUL,
+ 0x3e5b51bbUL, 0x20000000UL, 0x3fea9713UL, 0xf56f7013UL, 0x3e386200UL,
+ 0xe0000000UL, 0x3fea88e0UL, 0xbe428ebeUL, 0xbe514af5UL, 0xe0000000UL,
+ 0x3fea7ab2UL, 0x8d0e4496UL, 0x3e4f9165UL, 0x60000000UL, 0x3fea6c89UL,
+ 0xdbacc5d5UL, 0xbe5c063bUL, 0x20000000UL, 0x3fea5e64UL, 0x3f19d970UL,
+ 0xbe5a0c8cUL, 0x20000000UL, 0x3fea5043UL, 0x09ea3e6bUL, 0x3e5065dcUL,
+ 0x80000000UL, 0x3fea4226UL, 0x78df246cUL, 0x3e5e05f6UL, 0x40000000UL,
+ 0x3fea340eUL, 0x4057d4a0UL, 0x3e431b2bUL, 0x40000000UL, 0x3fea25faUL,
+ 0x82867bb5UL, 0x3e4b76beUL, 0xa0000000UL, 0x3fea17eaUL, 0x9436f40aUL,
+ 0xbe5aad39UL, 0x20000000UL, 0x3fea09dfUL, 0x4b5253b3UL, 0x3e46380bUL,
+ 0x00000000UL, 0x3fe9fbd8UL, 0x8fc52466UL, 0xbe386f9bUL, 0x20000000UL,
+ 0x3fe9edd5UL, 0x22d3f344UL, 0xbe538347UL, 0x60000000UL, 0x3fe9dfd6UL,
+ 0x1ac33522UL, 0x3e5dbc53UL, 0x00000000UL, 0x3fe9d1dcUL, 0xeabdff1dUL,
+ 0x3e40fc0cUL, 0xe0000000UL, 0x3fe9c3e5UL, 0xafd30e73UL, 0xbe585e63UL,
+ 0xe0000000UL, 0x3fe9b5f3UL, 0xa52f226aUL, 0xbe43e8f9UL, 0x20000000UL,
+ 0x3fe9a806UL, 0xecb8698dUL, 0xbe515b36UL, 0x80000000UL, 0x3fe99a1cUL,
+ 0xf2b4e89dUL, 0x3e48b62bUL, 0x20000000UL, 0x3fe98c37UL, 0x7c9a88fbUL,
+ 0x3e44414cUL, 0x00000000UL, 0x3fe97e56UL, 0xda015741UL, 0xbe5d13baUL,
+ 0xe0000000UL, 0x3fe97078UL, 0x5fdace06UL, 0x3e51b947UL, 0x00000000UL,
+ 0x3fe962a0UL, 0x956ca094UL, 0x3e518785UL, 0x40000000UL, 0x3fe954cbUL,
+ 0x01164c1dUL, 0x3e5d5b57UL, 0xc0000000UL, 0x3fe946faUL, 0xe63b3767UL,
+ 0xbe4f84e7UL, 0x40000000UL, 0x3fe9392eUL, 0xe57cc2a9UL, 0x3e34eda3UL,
+ 0xe0000000UL, 0x3fe92b65UL, 0x8c75b544UL, 0x3e5766a0UL, 0xc0000000UL,
+ 0x3fe91da1UL, 0x37d1d087UL, 0xbe5e2ab1UL, 0x80000000UL, 0x3fe90fe1UL,
+ 0xa953dc20UL, 0x3e5fa1f3UL, 0x80000000UL, 0x3fe90225UL, 0xdbd3f369UL,
+ 0x3e47d6dbUL, 0xa0000000UL, 0x3fe8f46dUL, 0x1c9be989UL, 0xbe5e2b0aUL,
+ 0xa0000000UL, 0x3fe8e6b9UL, 0x3c93d76aUL, 0x3e5c8618UL, 0xe0000000UL,
+ 0x3fe8d909UL, 0x2182fc9aUL, 0xbe41aa9eUL, 0x20000000UL, 0x3fe8cb5eUL,
+ 0xe6b3539dUL, 0xbe530d19UL, 0x60000000UL, 0x3fe8bdb6UL, 0x49e58cc3UL,
+ 0xbe3bb374UL, 0xa0000000UL, 0x3fe8b012UL, 0xa7cfeb8fUL, 0x3e56c412UL,
+ 0x00000000UL, 0x3fe8a273UL, 0x8d52bc19UL, 0x3e1429b8UL, 0x60000000UL,
+ 0x3fe894d7UL, 0x4dc32c6cUL, 0xbe48604cUL, 0xc0000000UL, 0x3fe8873fUL,
+ 0x0c868e56UL, 0xbe564ee5UL, 0x00000000UL, 0x3fe879acUL, 0x56aee828UL,
+ 0x3e5e2fd8UL, 0x60000000UL, 0x3fe86c1cUL, 0x7ceab8ecUL, 0x3e493365UL,
+ 0xc0000000UL, 0x3fe85e90UL, 0x78d4dadcUL, 0xbe4f7f25UL, 0x00000000UL,
+ 0x3fe85109UL, 0x0ccd8280UL, 0x3e31e7a2UL, 0x40000000UL, 0x3fe84385UL,
+ 0x34ba4e15UL, 0x3e328077UL, 0x80000000UL, 0x3fe83605UL, 0xa670975aUL,
+ 0xbe53eee5UL, 0xa0000000UL, 0x3fe82889UL, 0xf61b77b2UL, 0xbe43a20aUL,
+ 0xa0000000UL, 0x3fe81b11UL, 0x13e6643bUL, 0x3e5e5fe5UL, 0xc0000000UL,
+ 0x3fe80d9dUL, 0x82cc94e8UL, 0xbe5ff1f9UL, 0xa0000000UL, 0x3fe8002dUL,
+ 0x8a0c9c5dUL, 0xbe42b0e7UL, 0x60000000UL, 0x3fe7f2c1UL, 0x22a16f01UL,
+ 0x3e5d9ea0UL, 0x20000000UL, 0x3fe7e559UL, 0xc38cd451UL, 0x3e506963UL,
+ 0xc0000000UL, 0x3fe7d7f4UL, 0x9902bc71UL, 0x3e4503d7UL, 0x40000000UL,
+ 0x3fe7ca94UL, 0xdef2a3c0UL, 0x3e3d98edUL, 0xa0000000UL, 0x3fe7bd37UL,
+ 0xed49abb0UL, 0x3e24c1ffUL, 0xe0000000UL, 0x3fe7afdeUL, 0xe3b0be70UL,
+ 0xbe40c467UL, 0x00000000UL, 0x3fe7a28aUL, 0xaf9f193cUL, 0xbe5dff6cUL,
+ 0xe0000000UL, 0x3fe79538UL, 0xb74cf6b6UL, 0xbe258ed0UL, 0xa0000000UL,
+ 0x3fe787ebUL, 0x1d9127c7UL, 0x3e345fb0UL, 0x40000000UL, 0x3fe77aa2UL,
+ 0x1028c21dUL, 0xbe4619bdUL, 0xa0000000UL, 0x3fe76d5cUL, 0x7cb0b5e4UL,
+ 0x3e40f1a2UL, 0xe0000000UL, 0x3fe7601aUL, 0x2b1bc4adUL, 0xbe32e8bbUL,
+ 0xe0000000UL, 0x3fe752dcUL, 0x6839f64eUL, 0x3e41f57bUL, 0xc0000000UL,
+ 0x3fe745a2UL, 0xc4121f7eUL, 0xbe52c40aUL, 0x60000000UL, 0x3fe7386cUL,
+ 0xd6852d72UL, 0xbe5c4e6bUL, 0xc0000000UL, 0x3fe72b39UL, 0x91d690f7UL,
+ 0xbe57f88fUL, 0xe0000000UL, 0x3fe71e0aUL, 0x627a2159UL, 0xbe4425d5UL,
+ 0xc0000000UL, 0x3fe710dfUL, 0x50a54033UL, 0x3e422b7eUL, 0x60000000UL,
+ 0x3fe703b8UL, 0x3b0b5f91UL, 0x3e5d3857UL, 0xe0000000UL, 0x3fe6f694UL,
+ 0x84d628a2UL, 0xbe51f090UL, 0x00000000UL, 0x3fe6e975UL, 0x306d8894UL,
+ 0xbe414d83UL, 0xe0000000UL, 0x3fe6dc58UL, 0x30bf24aaUL, 0xbe4650caUL,
+ 0x80000000UL, 0x3fe6cf40UL, 0xd4628d69UL, 0xbe5db007UL, 0xc0000000UL,
+ 0x3fe6c22bUL, 0xa2aae57bUL, 0xbe31d279UL, 0xc0000000UL, 0x3fe6b51aUL,
+ 0x860edf7eUL, 0xbe2d4c4aUL, 0x80000000UL, 0x3fe6a80dUL, 0xf3559341UL,
+ 0xbe5f7e98UL, 0xe0000000UL, 0x3fe69b03UL, 0xa885899eUL, 0xbe5c2011UL,
+ 0xe0000000UL, 0x3fe68dfdUL, 0x2bdc6d37UL, 0x3e224a82UL, 0xa0000000UL,
+ 0x3fe680fbUL, 0xc12ad1b9UL, 0xbe40cf56UL, 0x00000000UL, 0x3fe673fdUL,
+ 0x1bcdf659UL, 0xbdf52f2dUL, 0x00000000UL, 0x3fe66702UL, 0x5df10408UL,
+ 0x3e5663e0UL, 0xc0000000UL, 0x3fe65a0aUL, 0xa4070568UL, 0xbe40b12fUL,
+ 0x00000000UL, 0x3fe64d17UL, 0x71c54c47UL, 0x3e5f5e8bUL, 0x00000000UL,
+ 0x3fe64027UL, 0xbd4b7e83UL, 0x3e42ead6UL, 0xa0000000UL, 0x3fe6333aUL,
+ 0x61598bd2UL, 0xbe4c48d4UL, 0xc0000000UL, 0x3fe62651UL, 0x6f538d61UL,
+ 0x3e548401UL, 0xa0000000UL, 0x3fe6196cUL, 0x14344120UL, 0xbe529af6UL,
+ 0x00000000UL, 0x3fe60c8bUL, 0x5982c587UL, 0xbe3e1e4fUL, 0x00000000UL,
+ 0x3fe5ffadUL, 0xfe51d4eaUL, 0xbe4c897aUL, 0x80000000UL, 0x3fe5f2d2UL,
+ 0xfd46ebe1UL, 0x3e552e00UL, 0xa0000000UL, 0x3fe5e5fbUL, 0xa4695699UL,
+ 0x3e5ed471UL, 0x60000000UL, 0x3fe5d928UL, 0x80d118aeUL, 0x3e456b61UL,
+ 0xa0000000UL, 0x3fe5cc58UL, 0x304c330bUL, 0x3e54dc29UL, 0x80000000UL,
+ 0x3fe5bf8cUL, 0x0af2dedfUL, 0xbe3aa9bdUL, 0xe0000000UL, 0x3fe5b2c3UL,
+ 0x15fc9258UL, 0xbe479a37UL, 0xc0000000UL, 0x3fe5a5feUL, 0x9292c7eaUL,
+ 0x3e188650UL, 0x20000000UL, 0x3fe5993dUL, 0x33b4d380UL, 0x3e5d6d93UL,
+ 0x20000000UL, 0x3fe58c7fUL, 0x02fd16c7UL, 0x3e2fe961UL, 0xa0000000UL,
+ 0x3fe57fc4UL, 0x4a05edb6UL, 0xbe4d55b4UL, 0xa0000000UL, 0x3fe5730dUL,
+ 0x3d443abbUL, 0xbe5e6954UL, 0x00000000UL, 0x3fe5665aUL, 0x024acfeaUL,
+ 0x3e50e61bUL, 0x00000000UL, 0x3fe559aaUL, 0xcc9edd09UL, 0xbe325403UL,
+ 0x60000000UL, 0x3fe54cfdUL, 0x1fe26950UL, 0x3e5d500eUL, 0x60000000UL,
+ 0x3fe54054UL, 0x6c5ae164UL, 0xbe4a79b4UL, 0xc0000000UL, 0x3fe533aeUL,
+ 0x154b0287UL, 0xbe401571UL, 0xa0000000UL, 0x3fe5270cUL, 0x0673f401UL,
+ 0xbe56e56bUL, 0xe0000000UL, 0x3fe51a6dUL, 0x751b639cUL, 0x3e235269UL,
+ 0xa0000000UL, 0x3fe50dd2UL, 0x7c7b2bedUL, 0x3ddec887UL, 0xc0000000UL,
+ 0x3fe5013aUL, 0xafab4e17UL, 0x3e5e7575UL, 0x60000000UL, 0x3fe4f4a6UL,
+ 0x2e308668UL, 0x3e59aed6UL, 0x80000000UL, 0x3fe4e815UL, 0xf33e2a76UL,
+ 0xbe51f184UL, 0xe0000000UL, 0x3fe4db87UL, 0x839f3e3eUL, 0x3e57db01UL,
+ 0xc0000000UL, 0x3fe4cefdUL, 0xa9eda7bbUL, 0x3e535e0fUL, 0x00000000UL,
+ 0x3fe4c277UL, 0x2a8f66a5UL, 0x3e5ce451UL, 0xc0000000UL, 0x3fe4b5f3UL,
+ 0x05192456UL, 0xbe4e8518UL, 0xc0000000UL, 0x3fe4a973UL, 0x4aa7cd1dUL,
+ 0x3e46784aUL, 0x40000000UL, 0x3fe49cf7UL, 0x8e23025eUL, 0xbe5749f2UL,
+ 0x00000000UL, 0x3fe4907eUL, 0x18d30215UL, 0x3e360f39UL, 0x20000000UL,
+ 0x3fe48408UL, 0x63dcf2f3UL, 0x3e5e00feUL, 0xc0000000UL, 0x3fe47795UL,
+ 0x46182d09UL, 0xbe5173d9UL, 0xa0000000UL, 0x3fe46b26UL, 0x8f0e62aaUL,
+ 0xbe48f281UL, 0xe0000000UL, 0x3fe45ebaUL, 0x5775c40cUL, 0xbe56aad4UL,
+ 0x60000000UL, 0x3fe45252UL, 0x0fe25f69UL, 0x3e48bd71UL, 0x40000000UL,
+ 0x3fe445edUL, 0xe9989ec5UL, 0x3e590d97UL, 0x80000000UL, 0x3fe4398bUL,
+ 0xb3d9ffe3UL, 0x3e479dbcUL, 0x20000000UL, 0x3fe42d2dUL, 0x388e4d2eUL,
+ 0xbe5eed80UL, 0xe0000000UL, 0x3fe420d1UL, 0x6f797c18UL, 0x3e554b4cUL,
+ 0x20000000UL, 0x3fe4147aUL, 0x31048bb4UL, 0xbe5b1112UL, 0x80000000UL,
+ 0x3fe40825UL, 0x2efba4f9UL, 0x3e48ebc7UL, 0x40000000UL, 0x3fe3fbd4UL,
+ 0x50201119UL, 0x3e40b701UL, 0x40000000UL, 0x3fe3ef86UL, 0x0a4db32cUL,
+ 0x3e551de8UL, 0xa0000000UL, 0x3fe3e33bUL, 0x0c9c148bUL, 0xbe50c1f6UL,
+ 0x20000000UL, 0x3fe3d6f4UL, 0xc9129447UL, 0x3e533fa0UL, 0x00000000UL,
+ 0x3fe3cab0UL, 0xaae5b5a0UL, 0xbe22b68eUL, 0x20000000UL, 0x3fe3be6fUL,
+ 0x02305e8aUL, 0xbe54fc08UL, 0x60000000UL, 0x3fe3b231UL, 0x7f908258UL,
+ 0x3e57dc05UL, 0x00000000UL, 0x3fe3a5f7UL, 0x1a09af78UL, 0x3e08038bUL,
+ 0xe0000000UL, 0x3fe399bfUL, 0x490643c1UL, 0xbe5dbe42UL, 0xe0000000UL,
+ 0x3fe38d8bUL, 0x5e8ad724UL, 0xbe3c2b72UL, 0x20000000UL, 0x3fe3815bUL,
+ 0xc67196b6UL, 0x3e1713cfUL, 0xa0000000UL, 0x3fe3752dUL, 0x6182e429UL,
+ 0xbe3ec14cUL, 0x40000000UL, 0x3fe36903UL, 0xab6eb1aeUL, 0x3e5a2cc5UL,
+ 0x40000000UL, 0x3fe35cdcUL, 0xfe5dc064UL, 0xbe5c5878UL, 0x40000000UL,
+ 0x3fe350b8UL, 0x0ba6b9e4UL, 0x3e51619bUL, 0x80000000UL, 0x3fe34497UL,
+ 0x857761aaUL, 0x3e5fff53UL, 0x00000000UL, 0x3fe3387aUL, 0xf872d68cUL,
+ 0x3e484f4dUL, 0xa0000000UL, 0x3fe32c5fUL, 0x087e97c2UL, 0x3e52842eUL,
+ 0x80000000UL, 0x3fe32048UL, 0x73d6d0c0UL, 0xbe503edfUL, 0x80000000UL,
+ 0x3fe31434UL, 0x0c1456a1UL, 0xbe5f72adUL, 0xa0000000UL, 0x3fe30823UL,
+ 0x83a1a4d5UL, 0xbe5e65ccUL, 0xe0000000UL, 0x3fe2fc15UL, 0x855a7390UL,
+ 0xbe506438UL, 0x40000000UL, 0x3fe2f00bUL, 0xa2898287UL, 0x3e3d22a2UL,
+ 0xe0000000UL, 0x3fe2e403UL, 0x8b56f66fUL, 0xbe5aa5fdUL, 0x80000000UL,
+ 0x3fe2d7ffUL, 0x52db119aUL, 0x3e3a2e3dUL, 0x60000000UL, 0x3fe2cbfeUL,
+ 0xe2ddd4c0UL, 0xbe586469UL, 0x40000000UL, 0x3fe2c000UL, 0x6b01bf10UL,
+ 0x3e352b9dUL, 0x40000000UL, 0x3fe2b405UL, 0xb07a1cdfUL, 0x3e5c5cdaUL,
+ 0x80000000UL, 0x3fe2a80dUL, 0xc7b5f868UL, 0xbe5668b3UL, 0xc0000000UL,
+ 0x3fe29c18UL, 0x185edf62UL, 0xbe563d66UL, 0x00000000UL, 0x3fe29027UL,
+ 0xf729e1ccUL, 0x3e59a9a0UL, 0x80000000UL, 0x3fe28438UL, 0x6433c727UL,
+ 0xbe43cc89UL, 0x00000000UL, 0x3fe2784dUL, 0x41782631UL, 0xbe30750cUL,
+ 0xa0000000UL, 0x3fe26c64UL, 0x914911b7UL, 0xbe58290eUL, 0x40000000UL,
+ 0x3fe2607fUL, 0x3dcc73e1UL, 0xbe4269cdUL, 0x00000000UL, 0x3fe2549dUL,
+ 0x2751bf70UL, 0xbe5a6998UL, 0xc0000000UL, 0x3fe248bdUL, 0x4248b9fbUL,
+ 0xbe4ddb00UL, 0x80000000UL, 0x3fe23ce1UL, 0xf35cf82fUL, 0x3e561b71UL,
+ 0x60000000UL, 0x3fe23108UL, 0x8e481a2dUL, 0x3e518fb9UL, 0x60000000UL,
+ 0x3fe22532UL, 0x5ab96edcUL, 0xbe5fafc5UL, 0x40000000UL, 0x3fe2195fUL,
+ 0x80943911UL, 0xbe07f819UL, 0x40000000UL, 0x3fe20d8fUL, 0x386f2d6cUL,
+ 0xbe54ba8bUL, 0x40000000UL, 0x3fe201c2UL, 0xf29664acUL, 0xbe5eb815UL,
+ 0x20000000UL, 0x3fe1f5f8UL, 0x64f03390UL, 0x3e5e320cUL, 0x20000000UL,
+ 0x3fe1ea31UL, 0x747ff696UL, 0x3e5ef0a5UL, 0x40000000UL, 0x3fe1de6dUL,
+ 0x3e9ceb51UL, 0xbe5f8d27UL, 0x20000000UL, 0x3fe1d2acUL, 0x4ae0b55eUL,
+ 0x3e5faa21UL, 0x20000000UL, 0x3fe1c6eeUL, 0x28569a5eUL, 0x3e598a4fUL,
+ 0x20000000UL, 0x3fe1bb33UL, 0x54b33e07UL, 0x3e46130aUL, 0x20000000UL,
+ 0x3fe1af7bUL, 0x024f1078UL, 0xbe4dbf93UL, 0x00000000UL, 0x3fe1a3c6UL,
+ 0xb0783bfaUL, 0x3e419248UL, 0xe0000000UL, 0x3fe19813UL, 0x2f02b836UL,
+ 0x3e4e02b7UL, 0xc0000000UL, 0x3fe18c64UL, 0x28dec9d4UL, 0x3e09064fUL,
+ 0x80000000UL, 0x3fe180b8UL, 0x45cbf406UL, 0x3e5b1f46UL, 0x40000000UL,
+ 0x3fe1750fUL, 0x03d9964cUL, 0x3e5b0a79UL, 0x00000000UL, 0x3fe16969UL,
+ 0x8b5b882bUL, 0xbe238086UL, 0xa0000000UL, 0x3fe15dc5UL, 0x73bad6f8UL,
+ 0xbdf1fca4UL, 0x20000000UL, 0x3fe15225UL, 0x5385769cUL, 0x3e5e8d76UL,
+ 0xa0000000UL, 0x3fe14687UL, 0x1676dc6bUL, 0x3e571d08UL, 0x20000000UL,
+ 0x3fe13aedUL, 0xa8c41c7fUL, 0xbe598a25UL, 0x60000000UL, 0x3fe12f55UL,
+ 0xc4e1aaf0UL, 0x3e435277UL, 0xa0000000UL, 0x3fe123c0UL, 0x403638e1UL,
+ 0xbe21aa7cUL, 0xc0000000UL, 0x3fe1182eUL, 0x557a092bUL, 0xbdd0116bUL,
+ 0xc0000000UL, 0x3fe10c9fUL, 0x7d779f66UL, 0x3e4a61baUL, 0xc0000000UL,
+ 0x3fe10113UL, 0x2b09c645UL, 0xbe5d586eUL, 0x20000000UL, 0x3fe0ea04UL,
+ 0xea2cad46UL, 0x3e5aa97cUL, 0x20000000UL, 0x3fe0d300UL, 0x23190e54UL,
+ 0x3e50f1a7UL, 0xa0000000UL, 0x3fe0bc07UL, 0x1379a5a6UL, 0xbe51619dUL,
+ 0x60000000UL, 0x3fe0a51aUL, 0x926a3d4aUL, 0x3e5cf019UL, 0xa0000000UL,
+ 0x3fe08e38UL, 0xa8c24358UL, 0x3e35241eUL, 0x20000000UL, 0x3fe07762UL,
+ 0x24317e7aUL, 0x3e512cfaUL, 0x00000000UL, 0x3fe06097UL, 0xfd9cf274UL,
+ 0xbe55bef3UL, 0x00000000UL, 0x3fe049d7UL, 0x3689b49dUL, 0xbe36d26dUL,
+ 0x40000000UL, 0x3fe03322UL, 0xf72ef6c4UL, 0xbe54cd08UL, 0xa0000000UL,
+ 0x3fe01c78UL, 0x23702d2dUL, 0xbe5900bfUL, 0x00000000UL, 0x3fe005daUL,
+ 0x3f59c14cUL, 0x3e57d80bUL, 0x40000000UL, 0x3fdfde8dUL, 0xad67766dUL,
+ 0xbe57fad4UL, 0x40000000UL, 0x3fdfb17cUL, 0x644f4ae7UL, 0x3e1ee43bUL,
+ 0x40000000UL, 0x3fdf8481UL, 0x903234d2UL, 0x3e501a86UL, 0x40000000UL,
+ 0x3fdf579cUL, 0xafe9e509UL, 0xbe267c3eUL, 0x00000000UL, 0x3fdf2acdUL,
+ 0xb7dfda0bUL, 0xbe48149bUL, 0x40000000UL, 0x3fdefe13UL, 0x3b94305eUL,
+ 0x3e5f4ea7UL, 0x80000000UL, 0x3fded16fUL, 0x5d95da61UL, 0xbe55c198UL,
+ 0x00000000UL, 0x3fdea4e1UL, 0x406960c9UL, 0xbdd99a19UL, 0x00000000UL,
+ 0x3fde7868UL, 0xd22f3539UL, 0x3e470c78UL, 0x80000000UL, 0x3fde4c04UL,
+ 0x83eec535UL, 0xbe3e1232UL, 0x40000000UL, 0x3fde1fb6UL, 0x3dfbffcbUL,
+ 0xbe4b7d71UL, 0x40000000UL, 0x3fddf37dUL, 0x7e1be4e0UL, 0xbe5b8f8fUL,
+ 0x40000000UL, 0x3fddc759UL, 0x46dae887UL, 0xbe350458UL, 0x80000000UL,
+ 0x3fdd9b4aUL, 0xed6ecc49UL, 0xbe5f0045UL, 0x80000000UL, 0x3fdd6f50UL,
+ 0x2e9e883cUL, 0x3e2915daUL, 0x80000000UL, 0x3fdd436bUL, 0xf0bccb32UL,
+ 0x3e4a68c9UL, 0x80000000UL, 0x3fdd179bUL, 0x9bbfc779UL, 0xbe54a26aUL,
+ 0x00000000UL, 0x3fdcebe0UL, 0x7cea33abUL, 0x3e43c6b7UL, 0x40000000UL,
+ 0x3fdcc039UL, 0xe740fd06UL, 0x3e5526c2UL, 0x40000000UL, 0x3fdc94a7UL,
+ 0x9eadeb1aUL, 0xbe396d8dUL, 0xc0000000UL, 0x3fdc6929UL, 0xf0a8f95aUL,
+ 0xbe5c0ab2UL, 0x80000000UL, 0x3fdc3dc0UL, 0x6ee2693bUL, 0x3e0992e6UL,
+ 0xc0000000UL, 0x3fdc126bUL, 0x5ac6b581UL, 0xbe2834b6UL, 0x40000000UL,
+ 0x3fdbe72bUL, 0x8cc226ffUL, 0x3e3596a6UL, 0x00000000UL, 0x3fdbbbffUL,
+ 0xf92a74bbUL, 0x3e3c5813UL, 0x00000000UL, 0x3fdb90e7UL, 0x479664c0UL,
+ 0xbe50d644UL, 0x00000000UL, 0x3fdb65e3UL, 0x5004975bUL, 0xbe55258fUL,
+ 0x00000000UL, 0x3fdb3af3UL, 0xe4b23194UL, 0xbe588407UL, 0xc0000000UL,
+ 0x3fdb1016UL, 0xe65d4d0aUL, 0x3e527c26UL, 0x80000000UL, 0x3fdae54eUL,
+ 0x814fddd6UL, 0x3e5962a2UL, 0x40000000UL, 0x3fdaba9aUL, 0xe19d0913UL,
+ 0xbe562f4eUL, 0x80000000UL, 0x3fda8ff9UL, 0x43cfd006UL, 0xbe4cfdebUL,
+ 0x40000000UL, 0x3fda656cUL, 0x686f0a4eUL, 0x3e5e47a8UL, 0xc0000000UL,
+ 0x3fda3af2UL, 0x7200d410UL, 0x3e5e1199UL, 0xc0000000UL, 0x3fda108cUL,
+ 0xabd2266eUL, 0x3e5ee4d1UL, 0x40000000UL, 0x3fd9e63aUL, 0x396f8f2cUL,
+ 0x3e4dbffbUL, 0x00000000UL, 0x3fd9bbfbUL, 0xe32b25ddUL, 0x3e5c3a54UL,
+ 0x40000000UL, 0x3fd991cfUL, 0x431e4035UL, 0xbe457925UL, 0x80000000UL,
+ 0x3fd967b6UL, 0x7bed3dd3UL, 0x3e40c61dUL, 0x00000000UL, 0x3fd93db1UL,
+ 0xd7449365UL, 0x3e306419UL, 0x80000000UL, 0x3fd913beUL, 0x1746e791UL,
+ 0x3e56fcfcUL, 0x40000000UL, 0x3fd8e9dfUL, 0xf3a9028bUL, 0xbe5041b9UL,
+ 0xc0000000UL, 0x3fd8c012UL, 0x56840c50UL, 0xbe26e20aUL, 0x40000000UL,
+ 0x3fd89659UL, 0x19763102UL, 0xbe51f466UL, 0x80000000UL, 0x3fd86cb2UL,
+ 0x7032de7cUL, 0xbe4d298aUL, 0x80000000UL, 0x3fd8431eUL, 0xdeb39fabUL,
+ 0xbe4361ebUL, 0x40000000UL, 0x3fd8199dUL, 0x5d01cbe0UL, 0xbe5425b3UL,
+ 0x80000000UL, 0x3fd7f02eUL, 0x3ce99aa9UL, 0x3e146fa8UL, 0x80000000UL,
+ 0x3fd7c6d2UL, 0xd1a262b9UL, 0xbe5a1a69UL, 0xc0000000UL, 0x3fd79d88UL,
+ 0x8606c236UL, 0x3e423a08UL, 0x80000000UL, 0x3fd77451UL, 0x8fd1e1b7UL,
+ 0x3e5a6a63UL, 0xc0000000UL, 0x3fd74b2cUL, 0xe491456aUL, 0x3e42c1caUL,
+ 0x40000000UL, 0x3fd7221aUL, 0x4499a6d7UL, 0x3e36a69aUL, 0x00000000UL,
+ 0x3fd6f91aUL, 0x5237df94UL, 0xbe0f8f02UL, 0x00000000UL, 0x3fd6d02cUL,
+ 0xb6482c6eUL, 0xbe5abcf7UL, 0x00000000UL, 0x3fd6a750UL, 0x1919fd61UL,
+ 0xbe57ade2UL, 0x00000000UL, 0x3fd67e86UL, 0xaa7a994dUL, 0xbe3f3fbdUL,
+ 0x00000000UL, 0x3fd655ceUL, 0x67db014cUL, 0x3e33c550UL, 0x00000000UL,
+ 0x3fd62d28UL, 0xa82856b7UL, 0xbe1409d1UL, 0xc0000000UL, 0x3fd60493UL,
+ 0x1e6a300dUL, 0x3e55d899UL, 0x80000000UL, 0x3fd5dc11UL, 0x1222bd5cUL,
+ 0xbe35bfc0UL, 0xc0000000UL, 0x3fd5b3a0UL, 0x6e8dc2d3UL, 0x3e5d4d79UL,
+ 0x00000000UL, 0x3fd58b42UL, 0xe0e4ace6UL, 0xbe517303UL, 0x80000000UL,
+ 0x3fd562f4UL, 0xb306e0a8UL, 0x3e5edf0fUL, 0xc0000000UL, 0x3fd53ab8UL,
+ 0x6574bc54UL, 0x3e5ee859UL, 0x80000000UL, 0x3fd5128eUL, 0xea902207UL,
+ 0x3e5f6188UL, 0xc0000000UL, 0x3fd4ea75UL, 0x9f911d79UL, 0x3e511735UL,
+ 0x80000000UL, 0x3fd4c26eUL, 0xf9c77397UL, 0xbe5b1643UL, 0x40000000UL,
+ 0x3fd49a78UL, 0x15fc9258UL, 0x3e479a37UL, 0x80000000UL, 0x3fd47293UL,
+ 0xd5a04dd9UL, 0xbe426e56UL, 0xc0000000UL, 0x3fd44abfUL, 0xe04042f5UL,
+ 0x3e56f7c6UL, 0x40000000UL, 0x3fd422fdUL, 0x1d8bf2c8UL, 0x3e5d8810UL,
+ 0x00000000UL, 0x3fd3fb4cUL, 0x88a8ddeeUL, 0xbe311454UL, 0xc0000000UL,
+ 0x3fd3d3abUL, 0x3e3b5e47UL, 0xbe5d1b72UL, 0x40000000UL, 0x3fd3ac1cUL,
+ 0xc2ab5d59UL, 0x3e31b02bUL, 0xc0000000UL, 0x3fd3849dUL, 0xd4e34b9eUL,
+ 0x3e51cb2fUL, 0x40000000UL, 0x3fd35d30UL, 0x177204fbUL, 0xbe2b8cd7UL,
+ 0x80000000UL, 0x3fd335d3UL, 0xfcd38c82UL, 0xbe4356e1UL, 0x80000000UL,
+ 0x3fd30e87UL, 0x64f54accUL, 0xbe4e6224UL, 0x00000000UL, 0x3fd2e74cUL,
+ 0xaa7975d9UL, 0x3e5dc0feUL, 0x80000000UL, 0x3fd2c021UL, 0x516dab3fUL,
+ 0xbe50ffa3UL, 0x40000000UL, 0x3fd29907UL, 0x2bfb7313UL, 0x3e5674a2UL,
+ 0xc0000000UL, 0x3fd271fdUL, 0x0549fc99UL, 0x3e385d29UL, 0xc0000000UL,
+ 0x3fd24b04UL, 0x55b63073UL, 0xbe500c6dUL, 0x00000000UL, 0x3fd2241cUL,
+ 0x3f91953aUL, 0x3e389977UL, 0xc0000000UL, 0x3fd1fd43UL, 0xa1543f71UL,
+ 0xbe3487abUL, 0xc0000000UL, 0x3fd1d67bUL, 0x4ec8867cUL, 0x3df6a2dcUL,
+ 0x00000000UL, 0x3fd1afc4UL, 0x4328e3bbUL, 0x3e41d9c0UL, 0x80000000UL,
+ 0x3fd1891cUL, 0x2e1cda84UL, 0x3e3bdd87UL, 0x40000000UL, 0x3fd16285UL,
+ 0x4b5331aeUL, 0xbe53128eUL, 0x00000000UL, 0x3fd13bfeUL, 0xb9aec164UL,
+ 0xbe52ac98UL, 0xc0000000UL, 0x3fd11586UL, 0xd91e1316UL, 0xbe350630UL,
+ 0x80000000UL, 0x3fd0ef1fUL, 0x7cacc12cUL, 0x3e3f5219UL, 0x40000000UL,
+ 0x3fd0c8c8UL, 0xbce277b7UL, 0x3e3d30c0UL, 0x00000000UL, 0x3fd0a281UL,
+ 0x2a63447dUL, 0xbe541377UL, 0x80000000UL, 0x3fd07c49UL, 0xfac483b5UL,
+ 0xbe5772ecUL, 0xc0000000UL, 0x3fd05621UL, 0x36b8a570UL, 0xbe4fd4bdUL,
+ 0xc0000000UL, 0x3fd03009UL, 0xbae505f7UL, 0xbe450388UL, 0x80000000UL,
+ 0x3fd00a01UL, 0x3e35aeadUL, 0xbe5430fcUL, 0x80000000UL, 0x3fcfc811UL,
+ 0x707475acUL, 0x3e38806eUL, 0x80000000UL, 0x3fcf7c3fUL, 0xc91817fcUL,
+ 0xbe40cceaUL, 0x80000000UL, 0x3fcf308cUL, 0xae05d5e9UL, 0xbe4919b8UL,
+ 0x80000000UL, 0x3fcee4f8UL, 0xae6cc9e6UL, 0xbe530b94UL, 0x00000000UL,
+ 0x3fce9983UL, 0x1efe3e8eUL, 0x3e57747eUL, 0x00000000UL, 0x3fce4e2dUL,
+ 0xda78d9bfUL, 0xbe59a608UL, 0x00000000UL, 0x3fce02f5UL, 0x8abe2c2eUL,
+ 0x3e4a35adUL, 0x00000000UL, 0x3fcdb7dcUL, 0x1495450dUL, 0xbe0872ccUL,
+ 0x80000000UL, 0x3fcd6ce1UL, 0x86ee0ba0UL, 0xbe4f59a0UL, 0x00000000UL,
+ 0x3fcd2205UL, 0xe81ca888UL, 0x3e5402c3UL, 0x00000000UL, 0x3fccd747UL,
+ 0x3b4424b9UL, 0x3e5dfdc3UL, 0x80000000UL, 0x3fcc8ca7UL, 0xd305b56cUL,
+ 0x3e202da6UL, 0x00000000UL, 0x3fcc4226UL, 0x399a6910UL, 0xbe482a1cUL,
+ 0x80000000UL, 0x3fcbf7c2UL, 0x747f7938UL, 0xbe587372UL, 0x80000000UL,
+ 0x3fcbad7cUL, 0x6fc246a0UL, 0x3e50d83dUL, 0x00000000UL, 0x3fcb6355UL,
+ 0xee9e9be5UL, 0xbe5c35bdUL, 0x80000000UL, 0x3fcb194aUL, 0x8416c0bcUL,
+ 0x3e546d4fUL, 0x00000000UL, 0x3fcacf5eUL, 0x49f7f08fUL, 0x3e56da76UL,
+ 0x00000000UL, 0x3fca858fUL, 0x5dc30de2UL, 0x3e5f390cUL, 0x00000000UL,
+ 0x3fca3bdeUL, 0x950583b6UL, 0xbe5e4169UL, 0x80000000UL, 0x3fc9f249UL,
+ 0x33631553UL, 0x3e52aeb1UL, 0x00000000UL, 0x3fc9a8d3UL, 0xde8795a6UL,
+ 0xbe59a504UL, 0x00000000UL, 0x3fc95f79UL, 0x076bf41eUL, 0x3e5122feUL,
+ 0x80000000UL, 0x3fc9163cUL, 0x2914c8e7UL, 0x3e3dd064UL, 0x00000000UL,
+ 0x3fc8cd1dUL, 0x3a30eca3UL, 0xbe21b4aaUL, 0x80000000UL, 0x3fc8841aUL,
+ 0xb2a96650UL, 0xbe575444UL, 0x80000000UL, 0x3fc83b34UL, 0x2376c0cbUL,
+ 0xbe2a74c7UL, 0x80000000UL, 0x3fc7f26bUL, 0xd8a0b653UL, 0xbe5181b6UL,
+ 0x00000000UL, 0x3fc7a9bfUL, 0x32257882UL, 0xbe4a78b4UL, 0x00000000UL,
+ 0x3fc7612fUL, 0x1eee8bd9UL, 0xbe1bfe9dUL, 0x80000000UL, 0x3fc718bbUL,
+ 0x0c603cc4UL, 0x3e36fdc9UL, 0x80000000UL, 0x3fc6d064UL, 0x3728b8cfUL,
+ 0xbe1e542eUL, 0x80000000UL, 0x3fc68829UL, 0xc79a4067UL, 0x3e5c380fUL,
+ 0x00000000UL, 0x3fc6400bUL, 0xf69eac69UL, 0x3e550a84UL, 0x80000000UL,
+ 0x3fc5f808UL, 0xb7a780a4UL, 0x3e5d9224UL, 0x80000000UL, 0x3fc5b022UL,
+ 0xad9dfb1eUL, 0xbe55242fUL, 0x00000000UL, 0x3fc56858UL, 0x659b18beUL,
+ 0xbe4bfda3UL, 0x80000000UL, 0x3fc520a9UL, 0x66ee3631UL, 0xbe57d769UL,
+ 0x80000000UL, 0x3fc4d916UL, 0x1ec62819UL, 0x3e2427f7UL, 0x80000000UL,
+ 0x3fc4919fUL, 0xdec25369UL, 0xbe435431UL, 0x00000000UL, 0x3fc44a44UL,
+ 0xa8acfc4bUL, 0xbe3c62e8UL, 0x00000000UL, 0x3fc40304UL, 0xcf1d3eabUL,
+ 0xbdfba29fUL, 0x80000000UL, 0x3fc3bbdfUL, 0x79aba3eaUL, 0xbdf1b7c8UL,
+ 0x80000000UL, 0x3fc374d6UL, 0xb8d186daUL, 0xbe5130cfUL, 0x80000000UL,
+ 0x3fc32de8UL, 0x9d74f152UL, 0x3e2285b6UL, 0x00000000UL, 0x3fc2e716UL,
+ 0x50ae7ca9UL, 0xbe503920UL, 0x80000000UL, 0x3fc2a05eUL, 0x6caed92eUL,
+ 0xbe533924UL, 0x00000000UL, 0x3fc259c2UL, 0x9cb5034eUL, 0xbe510e31UL,
+ 0x80000000UL, 0x3fc21340UL, 0x12c4d378UL, 0xbe540b43UL, 0x80000000UL,
+ 0x3fc1ccd9UL, 0xcc418706UL, 0x3e59887aUL, 0x00000000UL, 0x3fc1868eUL,
+ 0x921f4106UL, 0xbe528e67UL, 0x80000000UL, 0x3fc1405cUL, 0x3969441eUL,
+ 0x3e5d8051UL, 0x00000000UL, 0x3fc0fa46UL, 0xd941ef5bUL, 0x3e5f9079UL,
+ 0x80000000UL, 0x3fc0b44aUL, 0x5a3e81b2UL, 0xbe567691UL, 0x00000000UL,
+ 0x3fc06e69UL, 0x9d66afe7UL, 0xbe4d43fbUL, 0x00000000UL, 0x3fc028a2UL,
+ 0x0a92a162UL, 0xbe52f394UL, 0x00000000UL, 0x3fbfc5eaUL, 0x209897e5UL,
+ 0x3e529e37UL, 0x00000000UL, 0x3fbf3ac5UL, 0x8458bd7bUL, 0x3e582831UL,
+ 0x00000000UL, 0x3fbeafd5UL, 0xb8d8b4b8UL, 0xbe486b4aUL, 0x00000000UL,
+ 0x3fbe2518UL, 0xe0a3b7b6UL, 0x3e5bafd2UL, 0x00000000UL, 0x3fbd9a90UL,
+ 0x2bf2710eUL, 0x3e383b2bUL, 0x00000000UL, 0x3fbd103cUL, 0x73eb6ab7UL,
+ 0xbe56d78dUL, 0x00000000UL, 0x3fbc861bUL, 0x32ceaff5UL, 0xbe32dc5aUL,
+ 0x00000000UL, 0x3fbbfc2eUL, 0xbee04cb7UL, 0xbe4a71a4UL, 0x00000000UL,
+ 0x3fbb7274UL, 0x35ae9577UL, 0x3e38142fUL, 0x00000000UL, 0x3fbae8eeUL,
+ 0xcbaddab4UL, 0xbe5490f0UL, 0x00000000UL, 0x3fba5f9aUL, 0x95ce1114UL,
+ 0x3e597c71UL, 0x00000000UL, 0x3fb9d67aUL, 0x6d7c0f78UL, 0x3e3abc2dUL,
+ 0x00000000UL, 0x3fb94d8dUL, 0x2841a782UL, 0xbe566cbcUL, 0x00000000UL,
+ 0x3fb8c4d2UL, 0x6ed429c6UL, 0xbe3cfff9UL, 0x00000000UL, 0x3fb83c4aUL,
+ 0xe4a49fbbUL, 0xbe552964UL, 0x00000000UL, 0x3fb7b3f4UL, 0x2193d81eUL,
+ 0xbe42fa72UL, 0x00000000UL, 0x3fb72bd0UL, 0xdd70c122UL, 0x3e527a8cUL,
+ 0x00000000UL, 0x3fb6a3dfUL, 0x03108a54UL, 0xbe450393UL, 0x00000000UL,
+ 0x3fb61c1fUL, 0x30ff7954UL, 0x3e565840UL, 0x00000000UL, 0x3fb59492UL,
+ 0xdedd460cUL, 0xbe5422b5UL, 0x00000000UL, 0x3fb50d36UL, 0x950f9f45UL,
+ 0xbe5313f6UL, 0x00000000UL, 0x3fb4860bUL, 0x582cdcb1UL, 0x3e506d39UL,
+ 0x00000000UL, 0x3fb3ff12UL, 0x7216d3a6UL, 0x3e4aa719UL, 0x00000000UL,
+ 0x3fb3784aUL, 0x57a423fdUL, 0x3e5a9b9fUL, 0x00000000UL, 0x3fb2f1b4UL,
+ 0x7a138b41UL, 0xbe50b418UL, 0x00000000UL, 0x3fb26b4eUL, 0x2fbfd7eaUL,
+ 0x3e23a53eUL, 0x00000000UL, 0x3fb1e519UL, 0x18913ccbUL, 0x3e465fc1UL,
+ 0x00000000UL, 0x3fb15f15UL, 0x7ea24e21UL, 0x3e042843UL, 0x00000000UL,
+ 0x3fb0d941UL, 0x7c6d9c77UL, 0x3e59f61eUL, 0x00000000UL, 0x3fb0539eUL,
+ 0x114efd44UL, 0x3e4ccab7UL, 0x00000000UL, 0x3faf9c56UL, 0x1777f657UL,
+ 0x3e552f65UL, 0x00000000UL, 0x3fae91d2UL, 0xc317b86aUL, 0xbe5a61e0UL,
+ 0x00000000UL, 0x3fad87acUL, 0xb7664efbUL, 0xbe41f64eUL, 0x00000000UL,
+ 0x3fac7de6UL, 0x5d3d03a9UL, 0x3e0807a0UL, 0x00000000UL, 0x3fab7480UL,
+ 0x743c38ebUL, 0xbe3726e1UL, 0x00000000UL, 0x3faa6b78UL, 0x06a253f1UL,
+ 0x3e5ad636UL, 0x00000000UL, 0x3fa962d0UL, 0xa35f541bUL, 0x3e5a187aUL,
+ 0x00000000UL, 0x3fa85a88UL, 0x4b86e446UL, 0xbe508150UL, 0x00000000UL,
+ 0x3fa7529cUL, 0x2589cacfUL, 0x3e52938aUL, 0x00000000UL, 0x3fa64b10UL,
+ 0xaf6b11f2UL, 0xbe3454cdUL, 0x00000000UL, 0x3fa543e2UL, 0x97506fefUL,
+ 0xbe5fdec5UL, 0x00000000UL, 0x3fa43d10UL, 0xe75f7dd9UL, 0xbe388dd3UL,
+ 0x00000000UL, 0x3fa3369cUL, 0xa4139632UL, 0xbdea5177UL, 0x00000000UL,
+ 0x3fa23086UL, 0x352d6f1eUL, 0xbe565ad6UL, 0x00000000UL, 0x3fa12accUL,
+ 0x77449eb7UL, 0xbe50d5c7UL, 0x00000000UL, 0x3fa0256eUL, 0x7478da78UL,
+ 0x3e404724UL, 0x00000000UL, 0x3f9e40dcUL, 0xf59cef7fUL, 0xbe539d0aUL,
+ 0x00000000UL, 0x3f9c3790UL, 0x1511d43cUL, 0x3e53c2c8UL, 0x00000000UL,
+ 0x3f9a2f00UL, 0x9b8bff3cUL, 0xbe43b3e1UL, 0x00000000UL, 0x3f982724UL,
+ 0xad1e22a5UL, 0x3e46f0bdUL, 0x00000000UL, 0x3f962000UL, 0x130d9356UL,
+ 0x3e475ba0UL, 0x00000000UL, 0x3f941994UL, 0x8f86f883UL, 0xbe513d0bUL,
+ 0x00000000UL, 0x3f9213dcUL, 0x914d0dc8UL, 0xbe534335UL, 0x00000000UL,
+ 0x3f900ed8UL, 0x2d73e5e7UL, 0xbe22ba75UL, 0x00000000UL, 0x3f8c1510UL,
+ 0xc5b7d70eUL, 0x3e599c5dUL, 0x00000000UL, 0x3f880de0UL, 0x8a27857eUL,
+ 0xbe3d28c8UL, 0x00000000UL, 0x3f840810UL, 0xda767328UL, 0x3e531b3dUL,
+ 0x00000000UL, 0x3f8003b0UL, 0x77bacaf3UL, 0xbe5f04e3UL, 0x00000000UL,
+ 0x3f780150UL, 0xdf4b0720UL, 0x3e5a8bffUL, 0x00000000UL, 0x3f6ffc40UL,
+ 0x34c48e71UL, 0xbe3fcd99UL, 0x00000000UL, 0x3f5ff6c0UL, 0x1ad218afUL,
+ 0xbe4c78a7UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL,
+ 0x00000000UL, 0xfffff800UL, 0x00000000UL, 0xfffff800UL, 0x00000000UL,
+ 0x3ff72000UL, 0x161bb241UL, 0xbf5dabe1UL, 0x6dc96112UL, 0xbf836578UL,
+ 0xee241472UL, 0xbf9b0301UL, 0x9f95985aUL, 0xbfb528dbUL, 0xb3841d2aUL,
+ 0xbfd619b6UL, 0x518775e3UL, 0x3f9004f2UL, 0xac8349bbUL, 0x3fa76c9bUL,
+ 0x486ececcUL, 0x3fc4635eUL, 0x161bb241UL, 0xbf5dabe1UL, 0x9f95985aUL,
+ 0xbfb528dbUL, 0xf8b5787dUL, 0x3ef2531eUL, 0x486ececbUL, 0x3fc4635eUL,
+ 0x412055ccUL, 0xbdd61bb2UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
+ 0xffffffffUL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x3b700000UL,
+ 0xfa5abcbfUL, 0x3ff00b1aUL, 0xa7609f71UL, 0xbc84f6b2UL, 0xa9fb3335UL,
+ 0x3ff0163dUL, 0x9ab8cdb7UL, 0x3c9b6129UL, 0x143b0281UL, 0x3ff02168UL,
+ 0x0fc54eb6UL, 0xbc82bf31UL, 0x3e778061UL, 0x3ff02c9aUL, 0x535b085dUL,
+ 0xbc719083UL, 0x2e11bbccUL, 0x3ff037d4UL, 0xeeade11aUL, 0x3c656811UL,
+ 0xe86e7f85UL, 0x3ff04315UL, 0x1977c96eUL, 0xbc90a31cUL, 0x72f654b1UL,
+ 0x3ff04e5fUL, 0x3aa0d08cUL, 0x3c84c379UL, 0xd3158574UL, 0x3ff059b0UL,
+ 0xa475b465UL, 0x3c8d73e2UL, 0x0e3c1f89UL, 0x3ff0650aUL, 0x5799c397UL,
+ 0xbc95cb7bUL, 0x29ddf6deUL, 0x3ff0706bUL, 0xe2b13c27UL, 0xbc8c91dfUL,
+ 0x2b72a836UL, 0x3ff07bd4UL, 0x54458700UL, 0x3c832334UL, 0x18759bc8UL,
+ 0x3ff08745UL, 0x4bb284ffUL, 0x3c6186beUL, 0xf66607e0UL, 0x3ff092bdUL,
+ 0x800a3fd1UL, 0xbc968063UL, 0xcac6f383UL, 0x3ff09e3eUL, 0x18316136UL,
+ 0x3c914878UL, 0x9b1f3919UL, 0x3ff0a9c7UL, 0x873d1d38UL, 0x3c85d16cUL,
+ 0x6cf9890fUL, 0x3ff0b558UL, 0x4adc610bUL, 0x3c98a62eUL, 0x45e46c85UL,
+ 0x3ff0c0f1UL, 0x06d21cefUL, 0x3c94f989UL, 0x2b7247f7UL, 0x3ff0cc92UL,
+ 0x16e24f71UL, 0x3c901edcUL, 0x23395decUL, 0x3ff0d83bUL, 0xe43f316aUL,
+ 0xbc9bc14dUL, 0x32d3d1a2UL, 0x3ff0e3ecUL, 0x27c57b52UL, 0x3c403a17UL,
+ 0x5fdfa9c5UL, 0x3ff0efa5UL, 0xbc54021bUL, 0xbc949db9UL, 0xaffed31bUL,
+ 0x3ff0fb66UL, 0xc44ebd7bUL, 0xbc6b9bedUL, 0x28d7233eUL, 0x3ff10730UL,
+ 0x1692fdd5UL, 0x3c8d46ebUL, 0xd0125b51UL, 0x3ff11301UL, 0x39449b3aUL,
+ 0xbc96c510UL, 0xab5e2ab6UL, 0x3ff11edbUL, 0xf703fb72UL, 0xbc9ca454UL,
+ 0xc06c31ccUL, 0x3ff12abdUL, 0xb36ca5c7UL, 0xbc51b514UL, 0x14f204abUL,
+ 0x3ff136a8UL, 0xba48dcf0UL, 0xbc67108fUL, 0xaea92de0UL, 0x3ff1429aUL,
+ 0x9af1369eUL, 0xbc932fbfUL, 0x934f312eUL, 0x3ff14e95UL, 0x39bf44abUL,
+ 0xbc8b91e8UL, 0xc8a58e51UL, 0x3ff15a98UL, 0xb9eeab0aUL, 0x3c82406aUL,
+ 0x5471c3c2UL, 0x3ff166a4UL, 0x82ea1a32UL, 0x3c58f23bUL, 0x3c7d517bUL,
+ 0x3ff172b8UL, 0xb9d78a76UL, 0xbc819041UL, 0x8695bbc0UL, 0x3ff17ed4UL,
+ 0xe2ac5a64UL, 0x3c709e3fUL, 0x388c8deaUL, 0x3ff18af9UL, 0xd1970f6cUL,
+ 0xbc911023UL, 0x58375d2fUL, 0x3ff19726UL, 0x85f17e08UL, 0x3c94aaddUL,
+ 0xeb6fcb75UL, 0x3ff1a35bUL, 0x7b4968e4UL, 0x3c8e5b4cUL, 0xf8138a1cUL,
+ 0x3ff1af99UL, 0xa4b69280UL, 0x3c97bf85UL, 0x84045cd4UL, 0x3ff1bbe0UL,
+ 0x352ef607UL, 0xbc995386UL, 0x95281c6bUL, 0x3ff1c82fUL, 0x8010f8c9UL,
+ 0x3c900977UL, 0x3168b9aaUL, 0x3ff1d487UL, 0x00a2643cUL, 0x3c9e016eUL,
+ 0x5eb44027UL, 0x3ff1e0e7UL, 0x088cb6deUL, 0xbc96fdd8UL, 0x22fcd91dUL,
+ 0x3ff1ed50UL, 0x027bb78cUL, 0xbc91df98UL, 0x8438ce4dUL, 0x3ff1f9c1UL,
+ 0xa097af5cUL, 0xbc9bf524UL, 0x88628cd6UL, 0x3ff2063bUL, 0x814a8495UL,
+ 0x3c8dc775UL, 0x3578a819UL, 0x3ff212beUL, 0x2cfcaac9UL, 0x3c93592dUL,
+ 0x917ddc96UL, 0x3ff21f49UL, 0x9494a5eeUL, 0x3c82a97eUL, 0xa27912d1UL,
+ 0x3ff22bddUL, 0x5577d69fUL, 0x3c8d34fbUL, 0x6e756238UL, 0x3ff2387aUL,
+ 0xb6c70573UL, 0x3c99b07eUL, 0xfb82140aUL, 0x3ff2451fUL, 0x911ca996UL,
+ 0x3c8acfccUL, 0x4fb2a63fUL, 0x3ff251ceUL, 0xbef4f4a4UL, 0x3c8ac155UL,
+ 0x711ece75UL, 0x3ff25e85UL, 0x4ac31b2cUL, 0x3c93e1a2UL, 0x65e27cddUL,
+ 0x3ff26b45UL, 0x9940e9d9UL, 0x3c82bd33UL, 0x341ddf29UL, 0x3ff2780eUL,
+ 0x05f9e76cUL, 0x3c9e067cUL, 0xe1f56381UL, 0x3ff284dfUL, 0x8c3f0d7eUL,
+ 0xbc9a4c3aUL, 0x7591bb70UL, 0x3ff291baUL, 0x28401cbdUL, 0xbc82cc72UL,
+ 0xf51fdee1UL, 0x3ff29e9dUL, 0xafad1255UL, 0x3c8612e8UL, 0x66d10f13UL,
+ 0x3ff2ab8aUL, 0x191690a7UL, 0xbc995743UL, 0xd0dad990UL, 0x3ff2b87fUL,
+ 0xd6381aa4UL, 0xbc410adcUL, 0x39771b2fUL, 0x3ff2c57eUL, 0xa6eb5124UL,
+ 0xbc950145UL, 0xa6e4030bUL, 0x3ff2d285UL, 0x54db41d5UL, 0x3c900247UL,
+ 0x1f641589UL, 0x3ff2df96UL, 0xfbbce198UL, 0x3c9d16cfUL, 0xa93e2f56UL,
+ 0x3ff2ecafUL, 0x45d52383UL, 0x3c71ca0fUL, 0x4abd886bUL, 0x3ff2f9d2UL,
+ 0x532bda93UL, 0xbc653c55UL, 0x0a31b715UL, 0x3ff306feUL, 0xd23182e4UL,
+ 0x3c86f46aUL, 0xedeeb2fdUL, 0x3ff31432UL, 0xf3f3fcd1UL, 0x3c8959a3UL,
+ 0xfc4cd831UL, 0x3ff32170UL, 0x8e18047cUL, 0x3c8a9ce7UL, 0x3ba8ea32UL,
+ 0x3ff32eb8UL, 0x3cb4f318UL, 0xbc9c45e8UL, 0xb26416ffUL, 0x3ff33c08UL,
+ 0x843659a6UL, 0x3c932721UL, 0x66e3fa2dUL, 0x3ff34962UL, 0x930881a4UL,
+ 0xbc835a75UL, 0x5f929ff1UL, 0x3ff356c5UL, 0x5c4e4628UL, 0xbc8b5ceeUL,
+ 0xa2de883bUL, 0x3ff36431UL, 0xa06cb85eUL, 0xbc8c3144UL, 0x373aa9cbUL,
+ 0x3ff371a7UL, 0xbf42eae2UL, 0xbc963aeaUL, 0x231e754aUL, 0x3ff37f26UL,
+ 0x9eceb23cUL, 0xbc99f5caUL, 0x6d05d866UL, 0x3ff38caeUL, 0x3c9904bdUL,
+ 0xbc9e958dUL, 0x1b7140efUL, 0x3ff39a40UL, 0xfc8e2934UL, 0xbc99a9a5UL,
+ 0x34e59ff7UL, 0x3ff3a7dbUL, 0xd661f5e3UL, 0xbc75e436UL, 0xbfec6cf4UL,
+ 0x3ff3b57fUL, 0xe26fff18UL, 0x3c954c66UL, 0xc313a8e5UL, 0x3ff3c32dUL,
+ 0x375d29c3UL, 0xbc9efff8UL, 0x44ede173UL, 0x3ff3d0e5UL, 0x8c284c71UL,
+ 0x3c7fe8d0UL, 0x4c123422UL, 0x3ff3dea6UL, 0x11f09ebcUL, 0x3c8ada09UL,
+ 0xdf1c5175UL, 0x3ff3ec70UL, 0x7b8c9bcaUL, 0xbc8af663UL, 0x04ac801cUL,
+ 0x3ff3fa45UL, 0xf956f9f3UL, 0xbc97d023UL, 0xc367a024UL, 0x3ff40822UL,
+ 0xb6f4d048UL, 0x3c8bddf8UL, 0x21f72e2aUL, 0x3ff4160aUL, 0x1c309278UL,
+ 0xbc5ef369UL, 0x2709468aUL, 0x3ff423fbUL, 0xc0b314ddUL, 0xbc98462dUL,
+ 0xd950a897UL, 0x3ff431f5UL, 0xe35f7999UL, 0xbc81c7ddUL, 0x3f84b9d4UL,
+ 0x3ff43ffaUL, 0x9704c003UL, 0x3c8880beUL, 0x6061892dUL, 0x3ff44e08UL,
+ 0x04ef80d0UL, 0x3c489b7aUL, 0x42a7d232UL, 0x3ff45c20UL, 0x82fb1f8eUL,
+ 0xbc686419UL, 0xed1d0057UL, 0x3ff46a41UL, 0xd1648a76UL, 0x3c9c944bUL,
+ 0x668b3237UL, 0x3ff4786dUL, 0xed445733UL, 0xbc9c20f0UL, 0xb5c13cd0UL,
+ 0x3ff486a2UL, 0xb69062f0UL, 0x3c73c1a3UL, 0xe192aed2UL, 0x3ff494e1UL,
+ 0x5e499ea0UL, 0xbc83b289UL, 0xf0d7d3deUL, 0x3ff4a32aUL, 0xf3d1be56UL,
+ 0x3c99cb62UL, 0xea6db7d7UL, 0x3ff4b17dUL, 0x7f2897f0UL, 0xbc8125b8UL,
+ 0xd5362a27UL, 0x3ff4bfdaUL, 0xafec42e2UL, 0x3c7d4397UL, 0xb817c114UL,
+ 0x3ff4ce41UL, 0x690abd5dUL, 0x3c905e29UL, 0x99fddd0dUL, 0x3ff4dcb2UL,
+ 0xbc6a7833UL, 0x3c98ecdbUL, 0x81d8abffUL, 0x3ff4eb2dUL, 0x2e5d7a52UL,
+ 0xbc95257dUL, 0x769d2ca7UL, 0x3ff4f9b2UL, 0xd25957e3UL, 0xbc94b309UL,
+ 0x7f4531eeUL, 0x3ff50841UL, 0x49b7465fUL, 0x3c7a249bUL, 0xa2cf6642UL,
+ 0x3ff516daUL, 0x69bd93efUL, 0xbc8f7685UL, 0xe83f4eefUL, 0x3ff5257dUL,
+ 0x43efef71UL, 0xbc7c998dUL, 0x569d4f82UL, 0x3ff5342bUL, 0x1db13cadUL,
+ 0xbc807abeUL, 0xf4f6ad27UL, 0x3ff542e2UL, 0x192d5f7eUL, 0x3c87926dUL,
+ 0xca5d920fUL, 0x3ff551a4UL, 0xefede59bUL, 0xbc8d689cUL, 0xdde910d2UL,
+ 0x3ff56070UL, 0x168eebf0UL, 0xbc90fb6eUL, 0x36b527daUL, 0x3ff56f47UL,
+ 0x011d93adUL, 0x3c99bb2cUL, 0xdbe2c4cfUL, 0x3ff57e27UL, 0x8a57b9c4UL,
+ 0xbc90b98cUL, 0xd497c7fdUL, 0x3ff58d12UL, 0x5b9a1de8UL, 0x3c8295e1UL,
+ 0x27ff07ccUL, 0x3ff59c08UL, 0xe467e60fUL, 0xbc97e2ceUL, 0xdd485429UL,
+ 0x3ff5ab07UL, 0x054647adUL, 0x3c96324cUL, 0xfba87a03UL, 0x3ff5ba11UL,
+ 0x4c233e1aUL, 0xbc9b77a1UL, 0x8a5946b7UL, 0x3ff5c926UL, 0x816986a2UL,
+ 0x3c3c4b1bUL, 0x90998b93UL, 0x3ff5d845UL, 0xa8b45643UL, 0xbc9cd6a7UL,
+ 0x15ad2148UL, 0x3ff5e76fUL, 0x3080e65eUL, 0x3c9ba6f9UL, 0x20dceb71UL,
+ 0x3ff5f6a3UL, 0xe3cdcf92UL, 0xbc89eaddUL, 0xb976dc09UL, 0x3ff605e1UL,
+ 0x9b56de47UL, 0xbc93e242UL, 0xe6cdf6f4UL, 0x3ff6152aUL, 0x4ab84c27UL,
+ 0x3c9e4b3eUL, 0xb03a5585UL, 0x3ff6247eUL, 0x7e40b497UL, 0xbc9383c1UL,
+ 0x1d1929fdUL, 0x3ff633ddUL, 0xbeb964e5UL, 0x3c984710UL, 0x34ccc320UL,
+ 0x3ff64346UL, 0x759d8933UL, 0xbc8c483cUL, 0xfebc8fb7UL, 0x3ff652b9UL,
+ 0xc9a73e09UL, 0xbc9ae3d5UL, 0x82552225UL, 0x3ff66238UL, 0x87591c34UL,
+ 0xbc9bb609UL, 0xc70833f6UL, 0x3ff671c1UL, 0x586c6134UL, 0xbc8e8732UL,
+ 0xd44ca973UL, 0x3ff68155UL, 0x44f73e65UL, 0x3c6038aeUL, 0xb19e9538UL,
+ 0x3ff690f4UL, 0x9aeb445dUL, 0x3c8804bdUL, 0x667f3bcdUL, 0x3ff6a09eUL,
+ 0x13b26456UL, 0xbc9bdd34UL, 0xfa75173eUL, 0x3ff6b052UL, 0x2c9a9d0eUL,
+ 0x3c7a38f5UL, 0x750bdabfUL, 0x3ff6c012UL, 0x67ff0b0dUL, 0xbc728956UL,
+ 0xddd47645UL, 0x3ff6cfdcUL, 0xb6f17309UL, 0x3c9c7aa9UL, 0x3c651a2fUL,
+ 0x3ff6dfb2UL, 0x683c88abUL, 0xbc6bbe3aUL, 0x98593ae5UL, 0x3ff6ef92UL,
+ 0x9e1ac8b2UL, 0xbc90b974UL, 0xf9519484UL, 0x3ff6ff7dUL, 0x25860ef6UL,
+ 0xbc883c0fUL, 0x66f42e87UL, 0x3ff70f74UL, 0xd45aa65fUL, 0x3c59d644UL,
+ 0xe8ec5f74UL, 0x3ff71f75UL, 0x86887a99UL, 0xbc816e47UL, 0x86ead08aUL,
+ 0x3ff72f82UL, 0x2cd62c72UL, 0xbc920aa0UL, 0x48a58174UL, 0x3ff73f9aUL,
+ 0x6c65d53cUL, 0xbc90a8d9UL, 0x35d7cbfdUL, 0x3ff74fbdUL, 0x618a6e1cUL,
+ 0x3c9047fdUL, 0x564267c9UL, 0x3ff75febUL, 0x57316dd3UL, 0xbc902459UL,
+ 0xb1ab6e09UL, 0x3ff77024UL, 0x169147f8UL, 0x3c9b7877UL, 0x4fde5d3fUL,
+ 0x3ff78069UL, 0x0a02162dUL, 0x3c9866b8UL, 0x38ac1cf6UL, 0x3ff790b9UL,
+ 0x62aadd3eUL, 0x3c9349a8UL, 0x73eb0187UL, 0x3ff7a114UL, 0xee04992fUL,
+ 0xbc841577UL, 0x0976cfdbUL, 0x3ff7b17bUL, 0x8468dc88UL, 0xbc9bebb5UL,
+ 0x0130c132UL, 0x3ff7c1edUL, 0xd1164dd6UL, 0x3c9f124cUL, 0x62ff86f0UL,
+ 0x3ff7d26aUL, 0xfb72b8b4UL, 0x3c91bddbUL, 0x36cf4e62UL, 0x3ff7e2f3UL,
+ 0xba15797eUL, 0x3c705d02UL, 0x8491c491UL, 0x3ff7f387UL, 0xcf9311aeUL,
+ 0xbc807f11UL, 0x543e1a12UL, 0x3ff80427UL, 0x626d972bUL, 0xbc927c86UL,
+ 0xadd106d9UL, 0x3ff814d2UL, 0x0d151d4dUL, 0x3c946437UL, 0x994cce13UL,
+ 0x3ff82589UL, 0xd41532d8UL, 0xbc9d4c1dUL, 0x1eb941f7UL, 0x3ff8364cUL,
+ 0x31df2bd5UL, 0x3c999b9aUL, 0x4623c7adUL, 0x3ff8471aUL, 0xa341cdfbUL,
+ 0xbc88d684UL, 0x179f5b21UL, 0x3ff857f4UL, 0xf8b216d0UL, 0xbc5ba748UL,
+ 0x9b4492edUL, 0x3ff868d9UL, 0x9bd4f6baUL, 0xbc9fc6f8UL, 0xd931a436UL,
+ 0x3ff879caUL, 0xd2db47bdUL, 0x3c85d2d7UL, 0xd98a6699UL, 0x3ff88ac7UL,
+ 0xf37cb53aUL, 0x3c9994c2UL, 0xa478580fUL, 0x3ff89bd0UL, 0x4475202aUL,
+ 0x3c9d5395UL, 0x422aa0dbUL, 0x3ff8ace5UL, 0x56864b27UL, 0x3c96e9f1UL,
+ 0xbad61778UL, 0x3ff8be05UL, 0xfc43446eUL, 0x3c9ecb5eUL, 0x16b5448cUL,
+ 0x3ff8cf32UL, 0x32e9e3aaUL, 0xbc70d55eUL, 0x5e0866d9UL, 0x3ff8e06aUL,
+ 0x6fc9b2e6UL, 0xbc97114aUL, 0x99157736UL, 0x3ff8f1aeUL, 0xa2e3976cUL,
+ 0x3c85cc13UL, 0xd0282c8aUL, 0x3ff902feUL, 0x85fe3fd2UL, 0x3c9592caUL,
+ 0x0b91ffc6UL, 0x3ff9145bUL, 0x2e582524UL, 0xbc9dd679UL, 0x53aa2fe2UL,
+ 0x3ff925c3UL, 0xa639db7fUL, 0xbc83455fUL, 0xb0cdc5e5UL, 0x3ff93737UL,
+ 0x81b57ebcUL, 0xbc675fc7UL, 0x2b5f98e5UL, 0x3ff948b8UL, 0x797d2d99UL,
+ 0xbc8dc3d6UL, 0xcbc8520fUL, 0x3ff95a44UL, 0x96a5f039UL, 0xbc764b7cUL,
+ 0x9a7670b3UL, 0x3ff96bddUL, 0x7f19c896UL, 0xbc5ba596UL, 0x9fde4e50UL,
+ 0x3ff97d82UL, 0x7c1b85d1UL, 0xbc9d185bUL, 0xe47a22a2UL, 0x3ff98f33UL,
+ 0xa24c78ecUL, 0x3c7cabdaUL, 0x70ca07baUL, 0x3ff9a0f1UL, 0x91cee632UL,
+ 0xbc9173bdUL, 0x4d53fe0dUL, 0x3ff9b2bbUL, 0x4df6d518UL, 0xbc9dd84eUL,
+ 0x82a3f090UL, 0x3ff9c491UL, 0xb071f2beUL, 0x3c7c7c46UL, 0x194bb8d5UL,
+ 0x3ff9d674UL, 0xa3dd8233UL, 0xbc9516beUL, 0x19e32323UL, 0x3ff9e863UL,
+ 0x78e64c6eUL, 0x3c7824caUL, 0x8d07f29eUL, 0x3ff9fa5eUL, 0xaaf1faceUL,
+ 0xbc84a9ceUL, 0x7b5de565UL, 0x3ffa0c66UL, 0x5d1cd533UL, 0xbc935949UL,
+ 0xed8eb8bbUL, 0x3ffa1e7aUL, 0xee8be70eUL, 0x3c9c6618UL, 0xec4a2d33UL,
+ 0x3ffa309bUL, 0x7ddc36abUL, 0x3c96305cUL, 0x80460ad8UL, 0x3ffa42c9UL,
+ 0x589fb120UL, 0xbc9aa780UL, 0xb23e255dUL, 0x3ffa5503UL, 0xdb8d41e1UL,
+ 0xbc9d2f6eUL, 0x8af46052UL, 0x3ffa674aUL, 0x30670366UL, 0x3c650f56UL,
+ 0x1330b358UL, 0x3ffa799eUL, 0xcac563c7UL, 0x3c9bcb7eUL, 0x53c12e59UL,
+ 0x3ffa8bfeUL, 0xb2ba15a9UL, 0xbc94f867UL, 0x5579fdbfUL, 0x3ffa9e6bUL,
+ 0x0ef7fd31UL, 0x3c90fac9UL, 0x21356ebaUL, 0x3ffab0e5UL, 0xdae94545UL,
+ 0x3c889c31UL, 0xbfd3f37aUL, 0x3ffac36bUL, 0xcae76cd0UL, 0xbc8f9234UL,
+ 0x3a3c2774UL, 0x3ffad5ffUL, 0xb6b1b8e5UL, 0x3c97ef3bUL, 0x995ad3adUL,
+ 0x3ffae89fUL, 0x345dcc81UL, 0x3c97a1cdUL, 0xe622f2ffUL, 0x3ffafb4cUL,
+ 0x0f315ecdUL, 0xbc94b2fcUL, 0x298db666UL, 0x3ffb0e07UL, 0x4c80e425UL,
+ 0xbc9bdef5UL, 0x6c9a8952UL, 0x3ffb20ceUL, 0x4a0756ccUL, 0x3c94dd02UL,
+ 0xb84f15fbUL, 0x3ffb33a2UL, 0x3084d708UL, 0xbc62805eUL, 0x15b749b1UL,
+ 0x3ffb4684UL, 0xe9df7c90UL, 0xbc7f763dUL, 0x8de5593aUL, 0x3ffb5972UL,
+ 0xbbba6de3UL, 0xbc9c71dfUL, 0x29f1c52aUL, 0x3ffb6c6eUL, 0x52883f6eUL,
+ 0x3c92a8f3UL, 0xf2fb5e47UL, 0x3ffb7f76UL, 0x7e54ac3bUL, 0xbc75584fUL,
+ 0xf22749e4UL, 0x3ffb928cUL, 0x54cb65c6UL, 0xbc9b7216UL, 0x30a1064aUL,
+ 0x3ffba5b0UL, 0x0e54292eUL, 0xbc9efcd3UL, 0xb79a6f1fUL, 0x3ffbb8e0UL,
+ 0xc9696205UL, 0xbc3f52d1UL, 0x904bc1d2UL, 0x3ffbcc1eUL, 0x7a2d9e84UL,
+ 0x3c823dd0UL, 0xc3f3a207UL, 0x3ffbdf69UL, 0x60ea5b53UL, 0xbc3c2623UL,
+ 0x5bd71e09UL, 0x3ffbf2c2UL, 0x3f6b9c73UL, 0xbc9efdcaUL, 0x6141b33dUL,
+ 0x3ffc0628UL, 0xa1fbca34UL, 0xbc8d8a5aUL, 0xdd85529cUL, 0x3ffc199bUL,
+ 0x895048ddUL, 0x3c811065UL, 0xd9fa652cUL, 0x3ffc2d1cUL, 0x17c8a5d7UL,
+ 0xbc96e516UL, 0x5fffd07aUL, 0x3ffc40abUL, 0xe083c60aUL, 0x3c9b4537UL,
+ 0x78fafb22UL, 0x3ffc5447UL, 0x2493b5afUL, 0x3c912f07UL, 0x2e57d14bUL,
+ 0x3ffc67f1UL, 0xff483cadUL, 0x3c92884dUL, 0x8988c933UL, 0x3ffc7ba8UL,
+ 0xbe255559UL, 0xbc8e76bbUL, 0x9406e7b5UL, 0x3ffc8f6dUL, 0x48805c44UL,
+ 0x3c71acbcUL, 0x5751c4dbUL, 0x3ffca340UL, 0xd10d08f5UL, 0xbc87f2beUL,
+ 0xdcef9069UL, 0x3ffcb720UL, 0xd1e949dbUL, 0x3c7503cbUL, 0x2e6d1675UL,
+ 0x3ffccb0fUL, 0x86009092UL, 0xbc7d220fUL, 0x555dc3faUL, 0x3ffcdf0bUL,
+ 0x53829d72UL, 0xbc8dd83bUL, 0x5b5bab74UL, 0x3ffcf315UL, 0xb86dff57UL,
+ 0xbc9a08e9UL, 0x4a07897cUL, 0x3ffd072dUL, 0x43797a9cUL, 0xbc9cbc37UL,
+ 0x2b08c968UL, 0x3ffd1b53UL, 0x219a36eeUL, 0x3c955636UL, 0x080d89f2UL,
+ 0x3ffd2f87UL, 0x719d8578UL, 0xbc9d487bUL, 0xeacaa1d6UL, 0x3ffd43c8UL,
+ 0xbf5a1614UL, 0x3c93db53UL, 0xdcfba487UL, 0x3ffd5818UL, 0xd75b3707UL,
+ 0x3c82ed02UL, 0xe862e6d3UL, 0x3ffd6c76UL, 0x4a8165a0UL, 0x3c5fe87aUL,
+ 0x16c98398UL, 0x3ffd80e3UL, 0x8beddfe8UL, 0xbc911ec1UL, 0x71ff6075UL,
+ 0x3ffd955dUL, 0xbb9af6beUL, 0x3c9a052dUL, 0x03db3285UL, 0x3ffda9e6UL,
+ 0x696db532UL, 0x3c9c2300UL, 0xd63a8315UL, 0x3ffdbe7cUL, 0x926b8be4UL,
+ 0xbc9b76f1UL, 0xf301b460UL, 0x3ffdd321UL, 0x78f018c3UL, 0x3c92da57UL,
+ 0x641c0658UL, 0x3ffde7d5UL, 0x8e79ba8fUL, 0xbc9ca552UL, 0x337b9b5fUL,
+ 0x3ffdfc97UL, 0x4f184b5cUL, 0xbc91a5cdUL, 0x6b197d17UL, 0x3ffe1167UL,
+ 0xbd5c7f44UL, 0xbc72b529UL, 0x14f5a129UL, 0x3ffe2646UL, 0x817a1496UL,
+ 0xbc97b627UL, 0x3b16ee12UL, 0x3ffe3b33UL, 0x31fdc68bUL, 0xbc99f4a4UL,
+ 0xe78b3ff6UL, 0x3ffe502eUL, 0x80a9cc8fUL, 0x3c839e89UL, 0x24676d76UL,
+ 0x3ffe6539UL, 0x7522b735UL, 0xbc863ff8UL, 0xfbc74c83UL, 0x3ffe7a51UL,
+ 0xca0c8de2UL, 0x3c92d522UL, 0x77cdb740UL, 0x3ffe8f79UL, 0x80b054b1UL,
+ 0xbc910894UL, 0xa2a490daUL, 0x3ffea4afUL, 0x179c2893UL, 0xbc9e9c23UL,
+ 0x867cca6eUL, 0x3ffeb9f4UL, 0x2293e4f2UL, 0x3c94832fUL, 0x2d8e67f1UL,
+ 0x3ffecf48UL, 0xb411ad8cUL, 0xbc9c93f3UL, 0xa2188510UL, 0x3ffee4aaUL,
+ 0xa487568dUL, 0x3c91c68dUL, 0xee615a27UL, 0x3ffefa1bUL, 0x86a4b6b0UL,
+ 0x3c9dc7f4UL, 0x1cb6412aUL, 0x3fff0f9cUL, 0x65181d45UL, 0xbc932200UL,
+ 0x376bba97UL, 0x3fff252bUL, 0xbf0d8e43UL, 0x3c93a1a5UL, 0x48dd7274UL,
+ 0x3fff3ac9UL, 0x3ed837deUL, 0xbc795a5aUL, 0x5b6e4540UL, 0x3fff5076UL,
+ 0x2dd8a18bUL, 0x3c99d3e1UL, 0x798844f8UL, 0x3fff6632UL, 0x3539343eUL,
+ 0x3c9fa37bUL, 0xad9cbe14UL, 0x3fff7bfdUL, 0xd006350aUL, 0xbc9dbb12UL,
+ 0x02243c89UL, 0x3fff91d8UL, 0xa779f689UL, 0xbc612ea8UL, 0x819e90d8UL,
+ 0x3fffa7c1UL, 0xf3a5931eUL, 0x3c874853UL, 0x3692d514UL, 0x3fffbdbaUL,
+ 0x15098eb6UL, 0xbc796773UL, 0x2b8f71f1UL, 0x3fffd3c2UL, 0x966579e7UL,
+ 0x3c62eb74UL, 0x6b2a23d9UL, 0x3fffe9d9UL, 0x7442fde3UL, 0x3c74a603UL,
+ 0xe78a6731UL, 0x3f55d87fUL, 0xd704a0c0UL, 0x3fac6b08UL, 0x6fba4e77UL,
+ 0x3f83b2abUL, 0xff82c58fUL, 0x3fcebfbdUL, 0xfefa39efUL, 0x3fe62e42UL,
+ 0x00000000UL, 0x00000000UL, 0xfefa39efUL, 0x3fe62e42UL, 0xfefa39efUL,
+ 0xbfe62e42UL, 0xf8000000UL, 0xffffffffUL, 0xf8000000UL, 0xffffffffUL,
+ 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL
+
+};
+
+//registers,
+// input: xmm0, xmm1
+// scratch: xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
+// eax, edx, ecx, ebx
+
+// Code generated by Intel C compiler for LIBM library
+
+void MacroAssembler::fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, L_2TAG_PACKET_14_0_2, L_2TAG_PACKET_15_0_2;
+ Label L_2TAG_PACKET_16_0_2, L_2TAG_PACKET_17_0_2, L_2TAG_PACKET_18_0_2, L_2TAG_PACKET_19_0_2;
+ Label L_2TAG_PACKET_20_0_2, L_2TAG_PACKET_21_0_2, L_2TAG_PACKET_22_0_2, L_2TAG_PACKET_23_0_2;
+ Label L_2TAG_PACKET_24_0_2, L_2TAG_PACKET_25_0_2, L_2TAG_PACKET_26_0_2, L_2TAG_PACKET_27_0_2;
+ Label L_2TAG_PACKET_28_0_2, L_2TAG_PACKET_29_0_2, L_2TAG_PACKET_30_0_2, L_2TAG_PACKET_31_0_2;
+ Label L_2TAG_PACKET_32_0_2, L_2TAG_PACKET_33_0_2, L_2TAG_PACKET_34_0_2, L_2TAG_PACKET_35_0_2;
+ Label L_2TAG_PACKET_36_0_2, L_2TAG_PACKET_37_0_2, L_2TAG_PACKET_38_0_2, L_2TAG_PACKET_39_0_2;
+ Label L_2TAG_PACKET_40_0_2, L_2TAG_PACKET_41_0_2, L_2TAG_PACKET_42_0_2, L_2TAG_PACKET_43_0_2;
+ Label L_2TAG_PACKET_44_0_2, L_2TAG_PACKET_45_0_2, L_2TAG_PACKET_46_0_2, L_2TAG_PACKET_47_0_2;
+ Label L_2TAG_PACKET_48_0_2, L_2TAG_PACKET_49_0_2, L_2TAG_PACKET_50_0_2, L_2TAG_PACKET_51_0_2;
+ Label L_2TAG_PACKET_52_0_2, L_2TAG_PACKET_53_0_2, L_2TAG_PACKET_54_0_2, L_2TAG_PACKET_55_0_2;
+ Label L_2TAG_PACKET_56_0_2, L_2TAG_PACKET_57_0_2, L_2TAG_PACKET_58_0_2, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+
+ address static_const_table_pow = (address)_static_const_table_pow;
+
+ bind(start);
+ subl(rsp, 120);
+ movl(Address(rsp, 64), tmp);
+ lea(tmp, ExternalAddress(static_const_table_pow));
+ movsd(xmm0, Address(rsp, 128));
+ movsd(xmm1, Address(rsp, 136));
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movl(ecx, 1069088768);
+ movdl(xmm7, ecx);
+ movsd(Address(rsp, 16), xmm1);
+ xorpd(xmm1, xmm1);
+ movl(edx, 30704);
+ pinsrw(xmm1, edx, 3);
+ movsd(Address(rsp, 8), xmm0);
+ movdqu(xmm3, xmm0);
+ movl(edx, 8192);
+ movdl(xmm4, edx);
+ movdqu(xmm6, Address(tmp, 8240));
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ psllq(xmm0, 5);
+ movsd(xmm2, Address(tmp, 8256));
+ psrlq(xmm0, 34);
+ movl(edx, eax);
+ andl(edx, 32752);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ rcpss(xmm0, xmm0);
+ psllq(xmm3, 12);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ psrlq(xmm3, 12);
+ movl(Address(rsp, 24), rsi);
+ subl(eax, 16);
+ cmpl(eax, 32736);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_0_0_2);
+ movl(rsi, 0);
+
+ bind(L_2TAG_PACKET_1_0_2);
+ mulss(xmm0, xmm7);
+ movl(edx, -1);
+ subl(ecx, 4);
+ shll(edx);
+ movdl(xmm5, edx);
+ por(xmm3, xmm1);
+ subl(eax, 16351);
+ cmpl(eax, 1);
+ jcc(Assembler::belowEqual, L_2TAG_PACKET_2_0_2);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm3);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ subl(eax, 1);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ mulsd(xmm3, xmm0);
+ movdqu(xmm1, Address(tmp, 8272));
+ subsd(xmm5, xmm2);
+ movdqu(xmm4, Address(tmp, 8288));
+ movl(ecx, eax);
+ sarl(eax, 31);
+ addl(ecx, eax);
+ xorl(eax, ecx);
+ addl(eax, 1);
+ bsrl(eax, eax);
+ unpcklpd(xmm5, xmm3);
+ movdqu(xmm6, Address(tmp, 8304));
+ addsd(xmm3, xmm5);
+ andl(edx, 16760832);
+ shrl(edx, 10);
+ addpd(xmm5, Address(tmp, edx, Address::times_1, -3616));
+ movdqu(xmm0, Address(tmp, 8320));
+ pshufd(xmm2, xmm3, 68);
+ mulsd(xmm3, xmm3);
+ mulpd(xmm1, xmm2);
+ mulpd(xmm4, xmm2);
+ addsd(xmm5, xmm7);
+ mulsd(xmm2, xmm3);
+ addpd(xmm6, xmm1);
+ mulsd(xmm3, xmm3);
+ addpd(xmm0, xmm4);
+ movsd(xmm1, Address(rsp, 16));
+ movzwl(ecx, Address(rsp, 22));
+ pshufd(xmm7, xmm5, 238);
+ movsd(xmm4, Address(tmp, 8368));
+ mulpd(xmm6, xmm2);
+ pshufd(xmm3, xmm3, 68);
+ mulpd(xmm0, xmm2);
+ shll(eax, 4);
+ subl(eax, 15872);
+ andl(ecx, 32752);
+ addl(eax, ecx);
+ mulpd(xmm3, xmm6);
+ cmpl(eax, 624);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_5_0_2);
+ xorpd(xmm6, xmm6);
+ movl(edx, 17080);
+ pinsrw(xmm6, edx, 3);
+ movdqu(xmm2, xmm1);
+ pand(xmm4, xmm1);
+ subsd(xmm1, xmm4);
+ mulsd(xmm4, xmm5);
+ addsd(xmm0, xmm7);
+ mulsd(xmm1, xmm5);
+ movdqu(xmm7, xmm6);
+ addsd(xmm6, xmm4);
+ addpd(xmm3, xmm0);
+ movdl(edx, xmm6);
+ subsd(xmm6, xmm7);
+ pshufd(xmm0, xmm3, 238);
+ subsd(xmm4, xmm6);
+ addsd(xmm0, xmm3);
+ movl(ecx, edx);
+ andl(edx, 255);
+ addl(edx, edx);
+ movdqu(xmm5, Address(tmp, edx, Address::times_8, 8384));
+ addsd(xmm4, xmm1);
+ mulsd(xmm2, xmm0);
+ movdqu(xmm7, Address(tmp, 12480));
+ movdqu(xmm3, Address(tmp, 12496));
+ shll(ecx, 12);
+ xorl(ecx, rsi);
+ andl(ecx, -1048576);
+ movdl(xmm6, ecx);
+ addsd(xmm2, xmm4);
+ movsd(xmm1, Address(tmp, 12512));
+ pshufd(xmm0, xmm2, 68);
+ pshufd(xmm4, xmm2, 68);
+ mulpd(xmm0, xmm0);
+ movl(rsi, Address(rsp, 24));
+ mulpd(xmm7, xmm4);
+ pshufd(xmm6, xmm6, 17);
+ mulsd(xmm1, xmm2);
+ mulsd(xmm0, xmm0);
+ paddd(xmm5, xmm6);
+ addpd(xmm3, xmm7);
+ mulsd(xmm1, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulpd(xmm0, xmm3);
+ addsd(xmm1, xmm6);
+ pshufd(xmm3, xmm0, 238);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ addsd(xmm0, xmm1);
+ addsd(xmm0, xmm3);
+ addsd(xmm0, xmm5);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_7_0_2);
+ movsd(xmm0, Address(rsp, 128));
+ movsd(xmm1, Address(rsp, 136));
+ mulsd(xmm0, xmm1);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ addl(eax, 16);
+ movl(edx, 32752);
+ andl(edx, eax);
+ cmpl(edx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_2);
+ testl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_2);
+
+ bind(L_2TAG_PACKET_10_0_2);
+ movl(ecx, Address(rsp, 16));
+ xorl(edx, edx);
+ testl(ecx, ecx);
+ movl(ecx, 1);
+ cmovl(Assembler::notEqual, edx, ecx);
+ orl(edx, Address(rsp, 20));
+ cmpl(edx, 1072693248);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ movsd(xmm3, Address(rsp, 8));
+ movdl(edx, xmm3);
+ psrlq(xmm3, 32);
+ movdl(ecx, xmm3);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
+ xorpd(xmm3, xmm3);
+ movl(eax, 18416);
+ pinsrw(xmm3, eax, 3);
+ mulsd(xmm0, xmm3);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm3, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psllq(xmm0, 5);
+ movsd(xmm2, Address(tmp, 8256));
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm3, 12);
+ movdqu(xmm6, Address(tmp, 8240));
+ psrlq(xmm3, 12);
+ mulss(xmm0, xmm7);
+ movl(edx, -1024);
+ movdl(xmm5, edx);
+ por(xmm3, xmm1);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm3);
+ movl(rsi, 0);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ andl(eax, 32752);
+ subl(eax, 18416);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ jmp(L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_12_0_2);
+ movl(ecx, Address(rsp, 16));
+ xorl(edx, edx);
+ testl(ecx, ecx);
+ movl(ecx, 1);
+ cmovl(Assembler::notEqual, edx, ecx);
+ orl(edx, Address(rsp, 20));
+ cmpl(edx, 1072693248);
+ jcc(Assembler::equal, L_2TAG_PACKET_7_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ movsd(xmm3, Address(rsp, 8));
+ movdl(edx, xmm3);
+ psrlq(xmm3, 32);
+ movdl(ecx, xmm3);
+ orl(edx, ecx);
+ cmpl(edx, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
+ xorpd(xmm3, xmm3);
+ movl(eax, 18416);
+ pinsrw(xmm3, eax, 3);
+ mulsd(xmm0, xmm3);
+ xorpd(xmm2, xmm2);
+ movl(eax, 16368);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm3, xmm0);
+ pextrw(eax, xmm0, 3);
+ por(xmm0, xmm2);
+ movl(ecx, 18416);
+ psllq(xmm0, 5);
+ movsd(xmm2, Address(tmp, 8256));
+ psrlq(xmm0, 34);
+ rcpss(xmm0, xmm0);
+ psllq(xmm3, 12);
+ movdqu(xmm6, Address(tmp, 8240));
+ psrlq(xmm3, 12);
+ mulss(xmm0, xmm7);
+ movl(edx, -1024);
+ movdl(xmm5, edx);
+ por(xmm3, xmm1);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ pand(xmm5, xmm3);
+ movl(rsi, INT_MIN);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ andl(eax, 32752);
+ subl(eax, 18416);
+ sarl(eax, 4);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ jmp(L_2TAG_PACKET_4_0_2);
+
+ bind(L_2TAG_PACKET_5_0_2);
+ cmpl(eax, 0);
+ jcc(Assembler::less, L_2TAG_PACKET_13_0_2);
+ cmpl(eax, 752);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_14_0_2);
+
+ bind(L_2TAG_PACKET_15_0_2);
+ addsd(xmm0, xmm7);
+ movsd(xmm2, Address(tmp, 12544));
+ addpd(xmm3, xmm0);
+ xorpd(xmm6, xmm6);
+ movl(eax, 17080);
+ pinsrw(xmm6, eax, 3);
+ pshufd(xmm0, xmm3, 238);
+ addsd(xmm0, xmm3);
+ movdqu(xmm3, xmm5);
+ addsd(xmm5, xmm0);
+ movdqu(xmm4, xmm2);
+ subsd(xmm3, xmm5);
+ movdqu(xmm7, xmm5);
+ pand(xmm5, xmm2);
+ movdqu(xmm2, xmm1);
+ pand(xmm4, xmm1);
+ subsd(xmm7, xmm5);
+ addsd(xmm0, xmm3);
+ subsd(xmm1, xmm4);
+ mulsd(xmm4, xmm5);
+ addsd(xmm0, xmm7);
+ mulsd(xmm2, xmm0);
+ movdqu(xmm7, xmm6);
+ mulsd(xmm1, xmm5);
+ addsd(xmm6, xmm4);
+ movdl(eax, xmm6);
+ subsd(xmm6, xmm7);
+ addsd(xmm2, xmm1);
+ movdqu(xmm7, Address(tmp, 12480));
+ movdqu(xmm3, Address(tmp, 12496));
+ subsd(xmm4, xmm6);
+ pextrw(edx, xmm6, 3);
+ movl(ecx, eax);
+ andl(eax, 255);
+ addl(eax, eax);
+ movdqu(xmm5, Address(tmp, eax, Address::times_8, 8384));
+ addsd(xmm2, xmm4);
+ sarl(ecx, 8);
+ movl(eax, ecx);
+ sarl(ecx, 1);
+ subl(eax, ecx);
+ shll(ecx, 20);
+ xorl(ecx, rsi);
+ movdl(xmm6, ecx);
+ movsd(xmm1, Address(tmp, 12512));
+ andl(edx, 32767);
+ cmpl(edx, 16529);
+ jcc(Assembler::above, L_2TAG_PACKET_14_0_2);
+ pshufd(xmm0, xmm2, 68);
+ pshufd(xmm4, xmm2, 68);
+ mulpd(xmm0, xmm0);
+ mulpd(xmm7, xmm4);
+ pshufd(xmm6, xmm6, 17);
+ mulsd(xmm1, xmm2);
+ mulsd(xmm0, xmm0);
+ paddd(xmm5, xmm6);
+ addpd(xmm3, xmm7);
+ mulsd(xmm1, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulpd(xmm0, xmm3);
+ addsd(xmm1, xmm6);
+ pshufd(xmm3, xmm0, 238);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ shll(eax, 4);
+ xorpd(xmm4, xmm4);
+ addl(eax, 16368);
+ pinsrw(xmm4, eax, 3);
+ addsd(xmm0, xmm1);
+ movl(rsi, Address(rsp, 24));
+ addsd(xmm0, xmm3);
+ movdqu(xmm1, xmm0);
+ addsd(xmm0, xmm5);
+ mulsd(xmm0, xmm4);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_18_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_8_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movsd(xmm0, Address(rsp, 8));
+ movdqu(xmm2, xmm0);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_19_0_2);
+ addsd(xmm0, xmm0);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_20_0_2);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_20_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ movl(edx, 29);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_22_0_2);
+ movsd(xmm0, Address(rsp, 16));
+ addpd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_19_0_2);
+ movdl(eax, xmm1);
+ movdqu(xmm2, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_23_0_2);
+ pextrw(eax, xmm2, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_24_0_2);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
+
+ bind(L_2TAG_PACKET_24_0_2);
+ pextrw(eax, xmm0, 3);
+ testl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_25_0_2);
+ testl(ecx, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_26_0_2);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_27_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_28_0_2);
+ testl(eax, 2);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_29_0_2);
+ jmp(L_2TAG_PACKET_28_0_2);
+
+ bind(L_2TAG_PACKET_25_0_2);
+ shrl(ecx, 20);
+ andl(ecx, 2047);
+ cmpl(ecx, 1075);
+ jcc(Assembler::above, L_2TAG_PACKET_28_0_2);
+ jcc(Assembler::equal, L_2TAG_PACKET_30_0_2);
+ cmpl(ecx, 1074);
+ jcc(Assembler::above, L_2TAG_PACKET_27_0_2);
+ cmpl(ecx, 1023);
+ jcc(Assembler::below, L_2TAG_PACKET_28_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movl(eax, 17208);
+ xorpd(xmm3, xmm3);
+ pinsrw(xmm3, eax, 3);
+ movdqu(xmm4, xmm3);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_28_0_2);
+ movdl(eax, xmm3);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
+
+ bind(L_2TAG_PACKET_29_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32768);
+ jcc(Assembler::equal, L_2TAG_PACKET_18_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32768);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_28_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_26_0_2);
+
+ bind(L_2TAG_PACKET_31_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32752);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_30_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_28_0_2);
+ jmp(L_2TAG_PACKET_29_0_2);
+
+ bind(L_2TAG_PACKET_32_0_2);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 20);
+ movdl(edx, xmm1);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_33_0_2);
+ movsd(xmm0, Address(rsp, 16));
+ addsd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_33_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ pextrw(eax, xmm0, 3);
+ cmpl(eax, 49136);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
+ movdl(ecx, xmm0);
+ psrlq(xmm0, 20);
+ movdl(edx, xmm0);
+ orl(ecx, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_34_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32760);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_34_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ andl(eax, 32752);
+ subl(eax, 16368);
+ pextrw(edx, xmm1, 3);
+ xorpd(xmm0, xmm0);
+ xorl(eax, edx);
+ andl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
+ movl(ecx, 32752);
+ pinsrw(xmm0, ecx, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_35_0_2);
+ movdl(eax, xmm1);
+ cmpl(edx, 17184);
+ jcc(Assembler::above, L_2TAG_PACKET_36_0_2);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_37_0_2);
+ testl(eax, 2);
+ jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
+ jmp(L_2TAG_PACKET_39_0_2);
+
+ bind(L_2TAG_PACKET_36_0_2);
+ testl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
+ jmp(L_2TAG_PACKET_39_0_2);
+
+ bind(L_2TAG_PACKET_9_0_2);
+ movsd(xmm2, Address(rsp, 8));
+ movdl(eax, xmm2);
+ psrlq(xmm2, 31);
+ movdl(ecx, xmm2);
+ orl(eax, ecx);
+ jcc(Assembler::equal, L_2TAG_PACKET_11_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ pextrw(edx, xmm1, 3);
+ movdl(eax, xmm1);
+ movdqu(xmm2, xmm1);
+ psrlq(xmm2, 32);
+ movdl(ecx, xmm2);
+ addl(ecx, ecx);
+ orl(ecx, eax);
+ jcc(Assembler::equal, L_2TAG_PACKET_40_0_2);
+ andl(edx, 32752);
+ cmpl(edx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_32_0_2);
+ cmpl(edx, 17200);
+ jcc(Assembler::above, L_2TAG_PACKET_38_0_2);
+ cmpl(edx, 17184);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_35_0_2);
+ cmpl(edx, 16368);
+ jcc(Assembler::below, L_2TAG_PACKET_37_0_2);
+ movl(eax, 17208);
+ xorpd(xmm2, xmm2);
+ pinsrw(xmm2, eax, 3);
+ movdqu(xmm4, xmm2);
+ addsd(xmm2, xmm1);
+ subsd(xmm4, xmm2);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32767);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_37_0_2);
+ movdl(eax, xmm2);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_38_0_2);
+
+ bind(L_2TAG_PACKET_39_0_2);
+ xorpd(xmm1, xmm1);
+ movl(edx, 30704);
+ pinsrw(xmm1, edx, 3);
+ movsd(xmm2, Address(tmp, 8256));
+ movsd(xmm4, Address(rsp, 8));
+ pextrw(eax, xmm4, 3);
+ movl(edx, 8192);
+ movdl(xmm4, edx);
+ andl(eax, 32767);
+ subl(eax, 16);
+ jcc(Assembler::less, L_2TAG_PACKET_12_0_2);
+ movl(edx, eax);
+ andl(edx, 32752);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ movl(rsi, INT_MIN);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_37_0_2);
+ xorpd(xmm1, xmm1);
+ movl(eax, 32752);
+ pinsrw(xmm1, eax, 3);
+ xorpd(xmm0, xmm0);
+ mulsd(xmm0, xmm1);
+ movl(edx, 28);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_38_0_2);
+ xorpd(xmm1, xmm1);
+ movl(edx, 30704);
+ pinsrw(xmm1, edx, 3);
+ movsd(xmm2, Address(tmp, 8256));
+ movsd(xmm4, Address(rsp, 8));
+ pextrw(eax, xmm4, 3);
+ movl(edx, 8192);
+ movdl(xmm4, edx);
+ andl(eax, 32767);
+ subl(eax, 16);
+ jcc(Assembler::less, L_2TAG_PACKET_10_0_2);
+ movl(edx, eax);
+ andl(edx, 32752);
+ subl(edx, 16368);
+ movl(ecx, edx);
+ sarl(edx, 31);
+ addl(ecx, edx);
+ xorl(ecx, edx);
+ addl(ecx, 16);
+ bsrl(ecx, ecx);
+ movl(rsi, 0);
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_23_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_26_0_2);
+ xorpd(xmm0, xmm0);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_13_0_2);
+ addl(eax, 384);
+ cmpl(eax, 0);
+ jcc(Assembler::less, L_2TAG_PACKET_41_0_2);
+ mulsd(xmm5, xmm1);
+ addsd(xmm0, xmm7);
+ shrl(rsi, 31);
+ addpd(xmm3, xmm0);
+ pshufd(xmm0, xmm3, 238);
+ addsd(xmm3, xmm0);
+ movsd(xmm4, Address(tmp, rsi, Address::times_8, 12528));
+ mulsd(xmm1, xmm3);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ shll(rsi, 15);
+ orl(eax, rsi);
+ pinsrw(xmm0, eax, 3);
+ addsd(xmm5, xmm1);
+ movl(rsi, Address(rsp, 24));
+ mulsd(xmm5, xmm4);
+ addsd(xmm0, xmm5);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_41_0_2);
+ movl(rsi, Address(rsp, 24));
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_40_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_42_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 16368);
+ pinsrw(xmm0, eax, 3);
+ movl(edx, 26);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_11_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movdqu(xmm2, xmm1);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_43_0_2);
+ movdl(eax, xmm2);
+ psrlq(xmm2, 20);
+ movdl(edx, xmm2);
+ orl(eax, edx);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_22_0_2);
+
+ bind(L_2TAG_PACKET_43_0_2);
+ movdl(eax, xmm1);
+ psrlq(xmm1, 32);
+ movdl(edx, xmm1);
+ movl(ecx, edx);
+ addl(edx, edx);
+ orl(eax, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_42_0_2);
+ shrl(edx, 21);
+ cmpl(edx, 1075);
+ jcc(Assembler::above, L_2TAG_PACKET_44_0_2);
+ jcc(Assembler::equal, L_2TAG_PACKET_45_0_2);
+ cmpl(edx, 1023);
+ jcc(Assembler::below, L_2TAG_PACKET_44_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movl(eax, 17208);
+ xorpd(xmm3, xmm3);
+ pinsrw(xmm3, eax, 3);
+ movdqu(xmm4, xmm3);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ pextrw(eax, xmm1, 3);
+ andl(eax, 32752);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_44_0_2);
+ movdl(eax, xmm3);
+ andl(eax, 1);
+ jcc(Assembler::equal, L_2TAG_PACKET_44_0_2);
+
+ bind(L_2TAG_PACKET_46_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ testl(ecx, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_47_0_2);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_45_0_2);
+ movsd(xmm1, Address(rsp, 16));
+ movdl(eax, xmm1);
+ testl(eax, 1);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_46_0_2);
+
+ bind(L_2TAG_PACKET_44_0_2);
+ testl(ecx, INT_MIN);
+ jcc(Assembler::equal, L_2TAG_PACKET_26_0_2);
+ xorpd(xmm0, xmm0);
+
+ bind(L_2TAG_PACKET_47_0_2);
+ movl(eax, 16368);
+ xorpd(xmm1, xmm1);
+ pinsrw(xmm1, eax, 3);
+ divsd(xmm1, xmm0);
+ movdqu(xmm0, xmm1);
+ movl(edx, 27);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_14_0_2);
+ movsd(xmm2, Address(rsp, 8));
+ movsd(xmm6, Address(rsp, 16));
+ pextrw(eax, xmm2, 3);
+ pextrw(edx, xmm6, 3);
+ movl(ecx, 32752);
+ andl(ecx, edx);
+ cmpl(ecx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
+ andl(eax, 32752);
+ subl(eax, 16368);
+ xorl(edx, eax);
+ testl(edx, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_49_0_2);
+
+ bind(L_2TAG_PACKET_50_0_2);
+ movl(eax, 32736);
+ pinsrw(xmm0, eax, 3);
+ shrl(rsi, 16);
+ orl(eax, rsi);
+ pinsrw(xmm1, eax, 3);
+ movl(rsi, Address(rsp, 24));
+ mulsd(xmm0, xmm1);
+
+ bind(L_2TAG_PACKET_17_0_2);
+ movl(edx, 24);
+
+ bind(L_2TAG_PACKET_21_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_49_0_2);
+ movl(eax, 16);
+ pinsrw(xmm0, eax, 3);
+ mulsd(xmm0, xmm0);
+ testl(rsi, INT_MIN);
+ jcc(Assembler::equal, L_2TAG_PACKET_51_0_2);
+ movsd(xmm2, Address(tmp, 12560));
+ xorpd(xmm0, xmm2);
+
+ bind(L_2TAG_PACKET_51_0_2);
+ movl(rsi, Address(rsp, 24));
+ movl(edx, 25);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_16_0_2);
+ pextrw(ecx, xmm5, 3);
+ pextrw(edx, xmm4, 3);
+ movl(eax, -1);
+ andl(ecx, 32752);
+ subl(ecx, 16368);
+ andl(edx, 32752);
+ addl(edx, ecx);
+ movl(ecx, -31);
+ sarl(edx, 4);
+ subl(ecx, edx);
+ jcc(Assembler::lessEqual, L_2TAG_PACKET_52_0_2);
+ cmpl(ecx, 20);
+ jcc(Assembler::above, L_2TAG_PACKET_53_0_2);
+ shll(eax);
+
+ bind(L_2TAG_PACKET_52_0_2);
+ movdl(xmm0, eax);
+ psllq(xmm0, 32);
+ pand(xmm0, xmm5);
+ subsd(xmm5, xmm0);
+ addsd(xmm5, xmm1);
+ mulsd(xmm0, xmm4);
+ mulsd(xmm5, xmm4);
+ addsd(xmm0, xmm5);
+
+ bind(L_2TAG_PACKET_53_0_2);
+ movl(edx, 25);
+ jmp(L_2TAG_PACKET_21_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movzwl(ecx, Address(rsp, 22));
+ movl(edx, INT_MIN);
+ movdl(xmm1, edx);
+ xorpd(xmm7, xmm7);
+ paddd(xmm0, xmm4);
+ psllq(xmm5, 32);
+ movdl(edx, xmm0);
+ psllq(xmm0, 29);
+ paddq(xmm1, xmm3);
+ pand(xmm5, xmm1);
+ andl(ecx, 32752);
+ cmpl(ecx, 16560);
+ jcc(Assembler::below, L_2TAG_PACKET_3_0_2);
+ pand(xmm0, xmm6);
+ subsd(xmm3, xmm5);
+ addl(eax, 16351);
+ shrl(eax, 4);
+ subl(eax, 1022);
+ cvtsi2sdl(xmm7, eax);
+ mulpd(xmm5, xmm0);
+ movsd(xmm4, Address(tmp, 0));
+ mulsd(xmm3, xmm0);
+ movsd(xmm6, Address(tmp, 0));
+ subsd(xmm5, xmm2);
+ movsd(xmm1, Address(tmp, 8));
+ pshufd(xmm2, xmm3, 68);
+ unpcklpd(xmm5, xmm3);
+ addsd(xmm3, xmm5);
+ movsd(xmm0, Address(tmp, 8));
+ andl(edx, 16760832);
+ shrl(edx, 10);
+ addpd(xmm7, Address(tmp, edx, Address::times_1, -3616));
+ mulsd(xmm4, xmm5);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm6, xmm2);
+ mulsd(xmm1, xmm2);
+ movdqu(xmm2, xmm5);
+ mulsd(xmm4, xmm5);
+ addsd(xmm5, xmm0);
+ movdqu(xmm0, xmm7);
+ addsd(xmm2, xmm3);
+ addsd(xmm7, xmm5);
+ mulsd(xmm6, xmm2);
+ subsd(xmm0, xmm7);
+ movdqu(xmm2, xmm7);
+ addsd(xmm7, xmm4);
+ addsd(xmm0, xmm5);
+ subsd(xmm2, xmm7);
+ addsd(xmm4, xmm2);
+ pshufd(xmm2, xmm5, 238);
+ movdqu(xmm5, xmm7);
+ addsd(xmm7, xmm2);
+ addsd(xmm4, xmm0);
+ movdqu(xmm0, Address(tmp, 8272));
+ subsd(xmm5, xmm7);
+ addsd(xmm6, xmm4);
+ movdqu(xmm4, xmm7);
+ addsd(xmm5, xmm2);
+ addsd(xmm7, xmm1);
+ movdqu(xmm2, Address(tmp, 8336));
+ subsd(xmm4, xmm7);
+ addsd(xmm6, xmm5);
+ addsd(xmm4, xmm1);
+ pshufd(xmm5, xmm7, 238);
+ movdqu(xmm1, xmm7);
+ addsd(xmm7, xmm5);
+ subsd(xmm1, xmm7);
+ addsd(xmm1, xmm5);
+ movdqu(xmm5, Address(tmp, 8352));
+ pshufd(xmm3, xmm3, 68);
+ addsd(xmm6, xmm4);
+ addsd(xmm6, xmm1);
+ movdqu(xmm1, Address(tmp, 8304));
+ mulpd(xmm0, xmm3);
+ mulpd(xmm2, xmm3);
+ pshufd(xmm4, xmm3, 68);
+ mulpd(xmm3, xmm3);
+ addpd(xmm0, xmm1);
+ addpd(xmm5, xmm2);
+ mulsd(xmm4, xmm3);
+ movsd(xmm2, Address(tmp, 16));
+ mulpd(xmm3, xmm3);
+ movsd(xmm1, Address(rsp, 16));
+ movzwl(ecx, Address(rsp, 22));
+ mulpd(xmm0, xmm4);
+ pextrw(eax, xmm7, 3);
+ mulpd(xmm5, xmm4);
+ mulpd(xmm0, xmm3);
+ movsd(xmm4, Address(tmp, 8376));
+ pand(xmm2, xmm7);
+ addsd(xmm5, xmm6);
+ subsd(xmm7, xmm2);
+ addpd(xmm5, xmm0);
+ andl(eax, 32752);
+ subl(eax, 16368);
+ andl(ecx, 32752);
+ cmpl(ecx, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_48_0_2);
+ addl(ecx, eax);
+ cmpl(ecx, 16576);
+ jcc(Assembler::aboveEqual, L_2TAG_PACKET_54_0_2);
+ pshufd(xmm0, xmm5, 238);
+ pand(xmm4, xmm1);
+ movdqu(xmm3, xmm1);
+ addsd(xmm5, xmm0);
+ subsd(xmm1, xmm4);
+ xorpd(xmm6, xmm6);
+ movl(edx, 17080);
+ pinsrw(xmm6, edx, 3);
+ addsd(xmm7, xmm5);
+ mulsd(xmm4, xmm2);
+ mulsd(xmm1, xmm2);
+ movdqu(xmm5, xmm6);
+ mulsd(xmm3, xmm7);
+ addsd(xmm6, xmm4);
+ addsd(xmm1, xmm3);
+ movdqu(xmm7, Address(tmp, 12480));
+ movdl(edx, xmm6);
+ subsd(xmm6, xmm5);
+ movdqu(xmm3, Address(tmp, 12496));
+ movsd(xmm2, Address(tmp, 12512));
+ subsd(xmm4, xmm6);
+ movl(ecx, edx);
+ andl(edx, 255);
+ addl(edx, edx);
+ movdqu(xmm5, Address(tmp, edx, Address::times_8, 8384));
+ addsd(xmm4, xmm1);
+ pextrw(edx, xmm6, 3);
+ shrl(ecx, 8);
+ movl(eax, ecx);
+ shrl(ecx, 1);
+ subl(eax, ecx);
+ shll(ecx, 20);
+ movdl(xmm6, ecx);
+ pshufd(xmm0, xmm4, 68);
+ pshufd(xmm1, xmm4, 68);
+ mulpd(xmm0, xmm0);
+ mulpd(xmm7, xmm1);
+ pshufd(xmm6, xmm6, 17);
+ mulsd(xmm2, xmm4);
+ andl(edx, 32767);
+ cmpl(edx, 16529);
+ jcc(Assembler::above, L_2TAG_PACKET_14_0_2);
+ mulsd(xmm0, xmm0);
+ paddd(xmm5, xmm6);
+ addpd(xmm3, xmm7);
+ mulsd(xmm2, xmm5);
+ pshufd(xmm6, xmm5, 238);
+ mulpd(xmm0, xmm3);
+ addsd(xmm2, xmm6);
+ pshufd(xmm3, xmm0, 238);
+ addl(eax, 1023);
+ shll(eax, 20);
+ orl(eax, rsi);
+ movdl(xmm4, eax);
+ mulsd(xmm0, xmm5);
+ mulsd(xmm3, xmm5);
+ addsd(xmm0, xmm2);
+ psllq(xmm4, 32);
+ addsd(xmm0, xmm3);
+ movdqu(xmm1, xmm0);
+ addsd(xmm0, xmm5);
+ movl(rsi, Address(rsp, 24));
+ mulsd(xmm0, xmm4);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_16_0_2);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_17_0_2);
+
+ bind(L_2TAG_PACKET_55_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_6_0_2);
+
+ bind(L_2TAG_PACKET_48_0_2);
+ movl(rsi, Address(rsp, 24));
+
+ bind(L_2TAG_PACKET_56_0_2);
+ movsd(xmm0, Address(rsp, 8));
+ movsd(xmm1, Address(rsp, 16));
+ addsd(xmm1, xmm1);
+ xorpd(xmm2, xmm2);
+ movl(eax, 49136);
+ pinsrw(xmm2, eax, 3);
+ addsd(xmm2, xmm0);
+ pextrw(eax, xmm2, 3);
+ cmpl(eax, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_57_0_2);
+ xorpd(xmm0, xmm0);
+ movl(eax, 32760);
+ pinsrw(xmm0, eax, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_57_0_2);
+ movdl(edx, xmm1);
+ movdqu(xmm3, xmm1);
+ psrlq(xmm3, 20);
+ movdl(ecx, xmm3);
+ orl(ecx, edx);
+ jcc(Assembler::equal, L_2TAG_PACKET_58_0_2);
+ addsd(xmm1, xmm1);
+ movdqu(xmm0, xmm1);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_58_0_2);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ pextrw(edx, xmm1, 3);
+ xorpd(xmm0, xmm0);
+ subl(eax, 16368);
+ xorl(eax, edx);
+ testl(eax, 32768);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_18_0_2);
+ movl(edx, 32752);
+ pinsrw(xmm0, edx, 3);
+ jmp(L_2TAG_PACKET_18_0_2);
+
+ bind(L_2TAG_PACKET_54_0_2);
+ pextrw(eax, xmm1, 3);
+ pextrw(ecx, xmm2, 3);
+ xorl(eax, ecx);
+ testl(eax, 32768);
+ jcc(Assembler::equal, L_2TAG_PACKET_50_0_2);
+ jmp(L_2TAG_PACKET_49_0_2);
+
+ bind(L_2TAG_PACKET_6_0_2);
+ movl(tmp, Address(rsp, 64));
+
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_sin.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,2448 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "stubRoutines_x86.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - SIN()
+// ---------------------
+//
+// 1. RANGE REDUCTION
+//
+// We perform an initial range reduction from X to r with
+//
+// X =~= N * pi/32 + r
+//
+// so that |r| <= pi/64 + epsilon. We restrict inputs to those
+// where |N| <= 932560. Beyond this, the range reduction is
+// insufficiently accurate. For extremely small inputs,
+// denormalization can occur internally, impacting performance.
+// This means that the main path is actually only taken for
+// 2^-252 <= |X| < 90112.
+//
+// To avoid branches, we perform the range reduction to full
+// accuracy each time.
+//
+// X - N * (P_1 + P_2 + P_3)
+//
+// where P_1 and P_2 are 32-bit numbers (so multiplication by N
+// is exact) and P_3 is a 53-bit number. Together, these
+// approximate pi well enough for all cases in the restricted
+// range.
+//
+// The main reduction sequence is:
+//
+// y = 32/pi * x
+// N = integer(y)
+// (computed by adding and subtracting off SHIFTER)
+//
+// m_1 = N * P_1
+// m_2 = N * P_2
+// r_1 = x - m_1
+// r = r_1 - m_2
+// (this r can be used for most of the calculation)
+//
+// c_1 = r_1 - r
+// m_3 = N * P_3
+// c_2 = c_1 - m_2
+// c = c_2 - m_3
+//
+// 2. MAIN ALGORITHM
+//
+// The algorithm uses a table lookup based on B = M * pi / 32
+// where M = N mod 64. The stored values are:
+// sigma closest power of 2 to cos(B)
+// C_hl 53-bit cos(B) - sigma
+// S_hi + S_lo 2 * 53-bit sin(B)
+//
+// The computation is organized as follows:
+//
+// sin(B + r + c) = [sin(B) + sigma * r] +
+// r * (cos(B) - sigma) +
+// sin(B) * [cos(r + c) - 1] +
+// cos(B) * [sin(r + c) - r]
+//
+// which is approximately:
+//
+// [S_hi + sigma * r] +
+// C_hl * r +
+// S_lo + S_hi * [(cos(r) - 1) - r * c] +
+// (C_hl + sigma) * [(sin(r) - r) + c]
+//
+// and this is what is actually computed. We separate this sum
+// into four parts:
+//
+// hi + med + pols + corr
+//
+// where
+//
+// hi = S_hi + sigma r
+// med = C_hl * r
+// pols = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+// corr = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+// 3. POLYNOMIAL
+//
+// The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+// (sin(r) - r) can be rearranged freely, since it is quite
+// small, so we exploit parallelism to the fullest.
+//
+// psc4 = SC_4 * r_1
+// msc4 = psc4 * r
+// r2 = r * r
+// msc2 = SC_2 * r2
+// r4 = r2 * r2
+// psc3 = SC_3 + msc4
+// psc1 = SC_1 + msc2
+// msc3 = r4 * psc3
+// sincospols = psc1 + msc3
+// pols = sincospols *
+// <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+// 4. CORRECTION TERM
+//
+// This is where the "c" component of the range reduction is
+// taken into account; recall that just "r" is used for most of
+// the calculation.
+//
+// -c = m_3 - c_2
+// -d = S_hi * r - (C_hl + sigma)
+// corr = -c * -d + S_lo
+//
+// 5. COMPENSATED SUMMATIONS
+//
+// The two successive compensated summations add up the high
+// and medium parts, leaving just the low parts to add up at
+// the end.
+//
+// rs = sigma * r
+// res_int = S_hi + rs
+// k_0 = S_hi - res_int
+// k_2 = k_0 + rs
+// med = C_hl * r
+// res_hi = res_int + med
+// k_1 = res_int - res_hi
+// k_3 = k_1 + med
+//
+// 6. FINAL SUMMATION
+//
+// We now add up all the small parts:
+//
+// res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+// Now the overall result is just:
+//
+// res_hi + res_lo
+//
+// 7. SMALL ARGUMENTS
+//
+// If |x| < SNN (SNN meaning the smallest normal number), we
+// simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
+// do 2^-55 * (2^55 * x - x).
+//
+// Special cases:
+// sin(NaN) = quiet NaN, and raise invalid exception
+// sin(INF) = NaN and raise invalid exception
+// sin(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint StubRoutines::x86::_ONEHALF[] =
+{
+ 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_P_2[] =
+{
+ 0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_SC_4[] =
+{
+ 0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_Ctable[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
+ 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
+ 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
+ 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
+ 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
+ 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
+ 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
+ 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
+ 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
+ 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
+ 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
+ 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
+ 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
+ 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
+ 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
+ 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
+ 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
+ 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
+ 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
+ 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
+ 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
+ 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
+ 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
+ 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
+ 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
+ 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
+ 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
+ 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
+ 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
+ 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
+ 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
+ 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
+ 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
+ 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
+ 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
+ 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
+ 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
+ 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
+ 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
+ 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
+ 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
+ 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
+ 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
+ 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
+ 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
+ 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
+ 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
+ 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
+ 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
+ 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
+ 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
+ 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
+ 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
+ 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
+ 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
+ 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
+ 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
+ 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
+ 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
+ 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
+ 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
+ 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
+ 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
+ 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
+ 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
+ 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
+ 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
+ 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
+ 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
+ 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
+ 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
+ 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
+ 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
+ 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
+ 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0x3ff00000UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_SC_2[] =
+{
+ 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_SC_3[] =
+{
+ 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_SC_1[] =
+{
+ 0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_PI_INV_TABLE[] =
+{
+ 0x00000000UL, 0x00000000UL, 0xa2f9836eUL, 0x4e441529UL, 0xfc2757d1UL,
+ 0xf534ddc0UL, 0xdb629599UL, 0x3c439041UL, 0xfe5163abUL, 0xdebbc561UL,
+ 0xb7246e3aUL, 0x424dd2e0UL, 0x06492eeaUL, 0x09d1921cUL, 0xfe1deb1cUL,
+ 0xb129a73eUL, 0xe88235f5UL, 0x2ebb4484UL, 0xe99c7026UL, 0xb45f7e41UL,
+ 0x3991d639UL, 0x835339f4UL, 0x9c845f8bUL, 0xbdf9283bUL, 0x1ff897ffUL,
+ 0xde05980fUL, 0xef2f118bUL, 0x5a0a6d1fUL, 0x6d367ecfUL, 0x27cb09b7UL,
+ 0x4f463f66UL, 0x9e5fea2dUL, 0x7527bac7UL, 0xebe5f17bUL, 0x3d0739f7UL,
+ 0x8a5292eaUL, 0x6bfb5fb1UL, 0x1f8d5d08UL, 0x56033046UL, 0xfc7b6babUL,
+ 0xf0cfbc21UL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_PI_4[] =
+{
+ 0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_PI32INV[] =
+{
+ 0x6dc9c883UL, 0x40245f30UL
+};
+
+ALIGNED_(8) juint _SHIFTER[] =
+{
+ 0x00000000UL, 0x43380000UL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_SIGN_MASK[] =
+{
+ 0x00000000UL, 0x80000000UL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_P_3[] =
+{
+ 0x2e037073UL, 0x3b63198aUL
+};
+
+ALIGNED_(8) juint _ALL_ONES[] =
+{
+ 0xffffffffUL, 0x3fefffffUL
+};
+
+ALIGNED_(8) juint _TWO_POW_55[] =
+{
+ 0x00000000UL, 0x43600000UL
+};
+
+ALIGNED_(8) juint _TWO_POW_M55[] =
+{
+ 0x00000000UL, 0x3c800000UL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_P_1[] =
+{
+ 0x54400000UL, 0x3fb921fbUL
+};
+
+ALIGNED_(8) juint StubRoutines::x86::_NEG_ZERO[] =
+{
+ 0x00000000UL, 0x3c800000UL
+};
+
+void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register ecx, Register edx, Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
+ Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1;
+ Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1;
+ Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1;
+ Label L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1;
+ Label L_2TAG_PACKET_12_0_1, B1_1, B1_2, B1_4, start;
+
+ assert_different_registers(tmp1, tmp2, tmp3, tmp4, eax, ebx, ecx, edx);
+ address ONEHALF = StubRoutines::x86::_ONEHALF_addr();
+ address P_2 = StubRoutines::x86::_P_2_addr();
+ address SC_4 = StubRoutines::x86::_SC_4_addr();
+ address Ctable = StubRoutines::x86::_Ctable_addr();
+ address SC_2 = StubRoutines::x86::_SC_2_addr();
+ address SC_3 = StubRoutines::x86::_SC_3_addr();
+ address SC_1 = StubRoutines::x86::_SC_1_addr();
+ address PI_INV_TABLE = StubRoutines::x86::_PI_INV_TABLE_addr();
+ address PI_4 = (address)StubRoutines::x86::_PI_4_addr();
+ address PI32INV = (address)StubRoutines::x86::_PI32INV_addr();
+ address SHIFTER = (address)_SHIFTER;
+ address SIGN_MASK = (address)StubRoutines::x86::_SIGN_MASK_addr();
+ address P_3 = (address)StubRoutines::x86::_P_3_addr();
+ address ALL_ONES = (address)_ALL_ONES;
+ address TWO_POW_55 = (address)_TWO_POW_55;
+ address TWO_POW_M55 = (address)_TWO_POW_M55;
+ address P_1 = (address)StubRoutines::x86::_P_1_addr();
+ address NEG_ZERO = (address)StubRoutines::x86::_NEG_ZERO_addr();
+
+ bind(start);
+ push(rbx);
+ subq(rsp, 16);
+ movsd(Address(rsp, 8), xmm0);
+ movl(eax, Address(rsp, 12));
+ movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
+ movq(xmm2, ExternalAddress(SHIFTER)); //0x00000000UL, 0x43380000UL
+ andl(eax, 2147418112);
+ subl(eax, 808452096);
+ cmpl(eax, 281346048);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
+ mulsd(xmm1, xmm0);
+ movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ cvttsd2sil(edx, xmm1);
+ cvtsi2sdl(xmm1, edx);
+ movdqu(xmm6, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
+ mov64(r8, 0x3fb921fb54400000);
+ movdq(xmm3, r8);
+ movdqu(xmm5, ExternalAddress(SC_4)); //0xa556c734UL, 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL
+ pshufd(xmm4, xmm0, 68);
+ mulsd(xmm3, xmm1);
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm1, xmm1);
+ }
+ else {
+ movlhps(xmm1, xmm1);
+ }
+ andl(edx, 63);
+ shll(edx, 5);
+ lea(rax, ExternalAddress(Ctable));
+ addq(rax, rdx);
+ mulpd(xmm6, xmm1);
+ mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
+ subsd(xmm4, xmm3);
+ movq(xmm7, Address(rax, 8));
+ subsd(xmm0, xmm3);
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm3, xmm4);
+ }
+ else {
+ movdqu(xmm3, xmm4);
+ movlhps(xmm3, xmm3);
+ }
+ subsd(xmm4, xmm6);
+ pshufd(xmm0, xmm0, 68);
+ movdqu(xmm2, Address(rax, 0));
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm6);
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm6);
+ movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
+ subsd(xmm1, xmm3);
+ movq(xmm3, Address(rax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
+ mulsd(xmm4, Address(rax, 0));
+ addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
+ mulpd(xmm5, xmm0);
+ movdqu(xmm0, xmm3);
+ addsd(xmm3, Address(rax, 8));
+ mulpd(xmm1, xmm7);
+ movdqu(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movq(xmm5, Address(rax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(rax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm5, xmm0);
+ addsd(xmm3, xmm7);
+ addsd(xmm1, xmm5);
+ addsd(xmm1, xmm3);
+ addsd(xmm1, xmm6);
+ unpckhpd(xmm6, xmm6);
+ movdqu(xmm0, xmm4);
+ addsd(xmm1, xmm6);
+ addsd(xmm0, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_0_0_1);
+ jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
+ shrl(eax, 20);
+ cmpl(eax, 3325);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_2_0_1);
+ mulsd(xmm0, ExternalAddress(ALL_ONES)); //0xffffffffUL, 0x3fefffffUL
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_2_0_1);
+ movq(xmm3, ExternalAddress(TWO_POW_55)); //0x00000000UL, 0x43600000UL
+ mulsd(xmm3, xmm0);
+ subsd(xmm3, xmm0);
+ mulsd(xmm3, ExternalAddress(TWO_POW_M55)); //0x00000000UL, 0x3c800000UL
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_1_0_1);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_3_0_1);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ subl(ecx, 16224);
+ shrl(ecx, 7);
+ andl(ecx, 65532);
+ lea(r11, ExternalAddress(PI_INV_TABLE));
+ addq(rcx, r11);
+ movdq(rax, xmm0);
+ movl(r10, Address(rcx, 20));
+ movl(r8, Address(rcx, 24));
+ movl(edx, eax);
+ shrq(rax, 21);
+ orl(eax, INT_MIN);
+ shrl(eax, 11);
+ movl(r9, r10);
+ imulq(r10, rdx);
+ imulq(r9, rax);
+ imulq(r8, rax);
+ movl(rsi, Address(rcx, 16));
+ movl(rdi, Address(rcx, 12));
+ movl(r11, r10);
+ shrq(r10, 32);
+ addq(r9, r10);
+ addq(r11, r8);
+ movl(r8, r11);
+ shrq(r11, 32);
+ addq(r9, r11);
+ movl(r10, rsi);
+ imulq(rsi, rdx);
+ imulq(r10, rax);
+ movl(r11, rdi);
+ imulq(rdi, rdx);
+ movl(ebx, rsi);
+ shrq(rsi, 32);
+ addq(r9, rbx);
+ movl(ebx, r9);
+ shrq(r9, 32);
+ addq(r10, rsi);
+ addq(r10, r9);
+ shlq(rbx, 32);
+ orq(r8, rbx);
+ imulq(r11, rax);
+ movl(r9, Address(rcx, 8));
+ movl(rsi, Address(rcx, 4));
+ movl(ebx, rdi);
+ shrq(rdi, 32);
+ addq(r10, rbx);
+ movl(ebx, r10);
+ shrq(r10, 32);
+ addq(r11, rdi);
+ addq(r11, r10);
+ movq(rdi, r9);
+ imulq(r9, rdx);
+ imulq(rdi, rax);
+ movl(r10, r9);
+ shrq(r9, 32);
+ addq(r11, r10);
+ movl(r10, r11);
+ shrq(r11, 32);
+ addq(rdi, r9);
+ addq(rdi, r11);
+ movq(r9, rsi);
+ imulq(rsi, rdx);
+ imulq(r9, rax);
+ shlq(r10, 32);
+ orq(r10, rbx);
+ movl(eax, Address(rcx, 0));
+ movl(r11, rsi);
+ shrq(rsi, 32);
+ addq(rdi, r11);
+ movl(r11, rdi);
+ shrq(rdi, 32);
+ addq(r9, rsi);
+ addq(r9, rdi);
+ imulq(rdx, rax);
+ pextrw(ebx, xmm0, 3);
+ lea(rdi, ExternalAddress(PI_INV_TABLE));
+ subq(rcx, rdi);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, 19);
+ movl(rsi, 32768);
+ andl(rsi, ebx);
+ shrl(ebx, 4);
+ andl(ebx, 2047);
+ subl(ebx, 1023);
+ subl(ecx, ebx);
+ addq(r9, rdx);
+ movl(edx, ecx);
+ addl(edx, 32);
+ cmpl(ecx, 1);
+ jcc(Assembler::less, L_2TAG_PACKET_4_0_1);
+ negl(ecx);
+ addl(ecx, 29);
+ shll(r9);
+ movl(rdi, r9);
+ andl(r9, 536870911);
+ testl(r9, 268435456);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_5_0_1);
+ shrl(r9);
+ movl(ebx, 0);
+ shlq(r9, 32);
+ orq(r9, r11);
+
+ bind(L_2TAG_PACKET_6_0_1);
+
+ bind(L_2TAG_PACKET_7_0_1);
+
+ cmpq(r9, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_8_0_1);
+
+ bind(L_2TAG_PACKET_9_0_1);
+ bsrq(r11, r9);
+ movl(ecx, 29);
+ subl(ecx, r11);
+ jcc(Assembler::lessEqual, L_2TAG_PACKET_10_0_1);
+ shlq(r9);
+ movq(rax, r10);
+ shlq(r10);
+ addl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shrq(rax);
+ shrq(r8);
+ orq(r9, rax);
+ orq(r10, r8);
+
+ bind(L_2TAG_PACKET_11_0_1);
+ cvtsi2sdq(xmm0, r9);
+ shrq(r10, 1);
+ cvtsi2sdq(xmm3, r10);
+ xorpd(xmm4, xmm4);
+ shll(edx, 4);
+ negl(edx);
+ addl(edx, 16368);
+ orl(edx, rsi);
+ xorl(edx, ebx);
+ pinsrw(xmm4, edx, 3);
+ movq(xmm2, ExternalAddress(PI_4)); //0x40000000UL, 0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
+ movq(xmm6, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x18469899UL, 0x3e64442dUL
+ xorpd(xmm5, xmm5);
+ subl(edx, 1008);
+ pinsrw(xmm5, edx, 3);
+ mulsd(xmm0, xmm4);
+ shll(rsi, 16);
+ sarl(rsi, 31);
+ mulsd(xmm3, xmm5);
+ movdqu(xmm1, xmm0);
+ mulsd(xmm0, xmm2);
+ shrl(rdi, 29);
+ addsd(xmm1, xmm3);
+ mulsd(xmm3, xmm2);
+ addl(rdi, rsi);
+ xorl(rdi, rsi);
+ mulsd(xmm6, xmm1);
+ movl(eax, rdi);
+ addsd(xmm6, xmm3);
+ movdqu(xmm2, xmm0);
+ addsd(xmm0, xmm6);
+ subsd(xmm2, xmm0);
+ addsd(xmm6, xmm2);
+
+ bind(L_2TAG_PACKET_12_0_1);
+ movq(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x40245f30UL
+ mulsd(xmm1, xmm0);
+ movq(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movq(xmm4, ExternalAddress(SIGN_MASK)); //0x00000000UL, 0x80000000UL
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ cvttsd2sil(edx, xmm1);
+ cvtsi2sdl(xmm1, edx);
+ movq(xmm3, ExternalAddress(P_1)); //0x54400000UL, 0x3fb921fbUL
+ movdqu(xmm2, ExternalAddress(P_2)); //0x1a600000UL, 0x3d90b461UL, 0x1a600000UL, 0x3d90b461UL
+ mulsd(xmm3, xmm1);
+ unpcklpd(xmm1, xmm1);
+ shll(eax, 3);
+ addl(edx, 1865216);
+ movdqu(xmm4, xmm0);
+ addl(edx, eax);
+ andl(edx, 63);
+ movdqu(xmm5, ExternalAddress(SC_4)); //0x54400000UL, 0x3fb921fbUL
+ lea(rax, ExternalAddress(Ctable));
+ shll(edx, 5);
+ addq(rax, rdx);
+ mulpd(xmm2, xmm1);
+ subsd(xmm0, xmm3);
+ mulsd(xmm1, ExternalAddress(P_3)); //0x2e037073UL, 0x3b63198aUL
+ subsd(xmm4, xmm3);
+ movq(xmm7, Address(rax, 8));
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm3, xmm4);
+ subsd(xmm4, xmm2);
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm2);
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm2);
+ movdqu(xmm2, Address(rax, 0));
+ subsd(xmm1, xmm3);
+ movq(xmm3, Address(rax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ subsd(xmm1, xmm6);
+ movdqu(xmm6, ExternalAddress(SC_2)); //0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, ExternalAddress(SC_3)); //0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL
+ mulsd(xmm4, Address(rax, 0));
+ addpd(xmm6, ExternalAddress(SC_1)); //0x55555555UL, 0xbfc55555UL, 0x00000000UL, 0xbfe00000UL
+ mulpd(xmm5, xmm0);
+ movdqu(xmm0, xmm3);
+ addsd(xmm3, Address(rax, 8));
+ mulpd(xmm1, xmm7);
+ movdqu(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movq(xmm5, Address(rax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(rax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm5, xmm0);
+ addsd(xmm3, xmm7);
+ addsd(xmm1, xmm5);
+ addsd(xmm1, xmm3);
+ addsd(xmm1, xmm6);
+ unpckhpd(xmm6, xmm6);
+ movdqu(xmm0, xmm4);
+ addsd(xmm1, xmm6);
+ addsd(xmm0, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_8_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ movl(r8, 0);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_9_0_1);
+ xorpd(xmm0, xmm0);
+ xorpd(xmm6, xmm6);
+ jmp(L_2TAG_PACKET_12_0_1);
+
+ bind(L_2TAG_PACKET_10_0_1);
+ jcc(Assembler::equal, L_2TAG_PACKET_11_0_1);
+ negl(ecx);
+ shrq(r10);
+ movq(rax, r9);
+ shrq(r9);
+ subl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shlq(rax);
+ orq(r10, rax);
+ jmp(L_2TAG_PACKET_11_0_1);
+
+ bind(L_2TAG_PACKET_4_0_1);
+ negl(ecx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(r9);
+ movq(rdi, r9);
+ testl(r9, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_13_0_1);
+ shrl(r9);
+ movl(ebx, 0);
+ shrq(rdi, 3);
+ jmp(L_2TAG_PACKET_7_0_1);
+
+ bind(L_2TAG_PACKET_5_0_1);
+ shrl(r9);
+ movl(ebx, 536870912);
+ shrl(ebx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(rbx, 32);
+ addl(rdi, 536870912);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(ebx, 32768);
+ jmp(L_2TAG_PACKET_6_0_1);
+
+ bind(L_2TAG_PACKET_13_0_1);
+ shrl(r9);
+ mov64(rbx, 0x100000000);
+ shrq(rbx);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(ebx, 32768);
+ shrq(rdi, 3);
+ addl(rdi, 536870912);
+ jmp(L_2TAG_PACKET_7_0_1);
+
+ bind(L_2TAG_PACKET_3_0_1);
+ movq(xmm0, Address(rsp, 8));
+ mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL
+ movq(Address(rsp, 0), xmm0);
+
+ bind(L_2TAG_PACKET_14_0_1);
+
+ bind(B1_4);
+ addq(rsp, 16);
+ pop(rbx);
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(8) juint _zero_none[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL
+};
+
+ALIGNED_(4) juint __4onpi_d[] =
+{
+ 0x6dc9c883UL, 0x3ff45f30UL
+};
+
+ALIGNED_(4) juint _TWO_32H[] =
+{
+ 0x00000000UL, 0x41f80000UL
+};
+
+ALIGNED_(4) juint _pi04_3d[] =
+{
+ 0x54442d00UL, 0x3fe921fbUL, 0x98cc5180UL, 0x3ce84698UL, 0xcbb5bf6cUL,
+ 0xb9dfc8f8UL
+};
+
+ALIGNED_(4) juint _pi04_5d[] =
+{
+ 0x54400000UL, 0x3fe921fbUL, 0x1a600000UL, 0x3dc0b461UL, 0x2e000000UL,
+ 0x3b93198aUL, 0x25200000UL, 0x396b839aUL, 0x533e63a0UL, 0x37027044UL
+};
+
+ALIGNED_(4) juint _SCALE[] =
+{
+ 0x00000000UL, 0x32600000UL
+};
+
+ALIGNED_(4) juint _zeros[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x80000000UL
+};
+
+ALIGNED_(4) juint _pi04_2d[] =
+{
+ 0x54400000UL, 0x3fe921fbUL, 0x1a626331UL, 0x3dc0b461UL
+};
+
+ALIGNED_(4) juint _TWO_12H[] =
+{
+ 0x00000000UL, 0x40b80000UL
+};
+
+ALIGNED_(2) jushort __4onpi_31l[] =
+{
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x836e, 0xa2f9,
+ 0x40d8, 0x0000, 0x0000, 0x0000, 0x2a50, 0x9c88, 0x40b7, 0x0000, 0x0000, 0x0000,
+ 0xabe8, 0xfe13, 0x4099, 0x0000, 0x0000, 0x0000, 0x6ee0, 0xfa9a, 0x4079, 0x0000,
+ 0x0000, 0x0000, 0x9580, 0xdb62, 0x4058, 0x0000, 0x0000, 0x0000, 0x1c82, 0xc9e2,
+ 0x403d, 0x0000, 0x0000, 0x0000, 0xb1c0, 0xff28, 0x4019, 0x0000, 0x0000, 0x0000,
+ 0xef14, 0xaf7a, 0x3ffe, 0x0000, 0x0000, 0x0000, 0x48dc, 0xc36e, 0x3fdf, 0x0000,
+ 0x0000, 0x0000, 0x3740, 0xe909, 0x3fbe, 0x0000, 0x0000, 0x0000, 0x924a, 0xb801,
+ 0x3fa2, 0x0000, 0x0000, 0x0000, 0x3a32, 0xdd41, 0x3f83, 0x0000, 0x0000, 0x0000,
+ 0x8778, 0x873f, 0x3f62, 0x0000, 0x0000, 0x0000, 0x1298, 0xb1cb, 0x3f44, 0x0000,
+ 0x0000, 0x0000, 0xa208, 0x9cfb, 0x3f26, 0x0000, 0x0000, 0x0000, 0xbaec, 0xd7d4,
+ 0x3f06, 0x0000, 0x0000, 0x0000, 0xd338, 0x8909, 0x3ee7, 0x0000, 0x0000, 0x0000,
+ 0x68b8, 0xe04d, 0x3ec7, 0x0000, 0x0000, 0x0000, 0x4e64, 0xdf90, 0x3eaa, 0x0000,
+ 0x0000, 0x0000, 0xc1a8, 0xeb1c, 0x3e89, 0x0000, 0x0000, 0x0000, 0x2720, 0xce7d,
+ 0x3e6a, 0x0000, 0x0000, 0x0000, 0x77b8, 0x8bf1, 0x3e4b, 0x0000, 0x0000, 0x0000,
+ 0xec7e, 0xe4a0, 0x3e2e, 0x0000, 0x0000, 0x0000, 0xffbc, 0xf12f, 0x3e0f, 0x0000,
+ 0x0000, 0x0000, 0xfdc0, 0xb301, 0x3deb, 0x0000, 0x0000, 0x0000, 0xc5ac, 0x9788,
+ 0x3dd1, 0x0000, 0x0000, 0x0000, 0x47da, 0x829b, 0x3db2, 0x0000, 0x0000, 0x0000,
+ 0xd9e4, 0xa6cf, 0x3d93, 0x0000, 0x0000, 0x0000, 0x36e8, 0xf961, 0x3d73, 0x0000,
+ 0x0000, 0x0000, 0xf668, 0xf463, 0x3d54, 0x0000, 0x0000, 0x0000, 0x5168, 0xf2ff,
+ 0x3d35, 0x0000, 0x0000, 0x0000, 0x758e, 0xea4f, 0x3d17, 0x0000, 0x0000, 0x0000,
+ 0xf17a, 0xebe5, 0x3cf8, 0x0000, 0x0000, 0x0000, 0x9cfa, 0x9e83, 0x3cd9, 0x0000,
+ 0x0000, 0x0000, 0xa4ba, 0xe294, 0x3cba, 0x0000, 0x0000, 0x0000, 0xd7ec, 0x9afe,
+ 0x3c9a, 0x0000, 0x0000, 0x0000, 0xae80, 0x8fc6, 0x3c79, 0x0000, 0x0000, 0x0000,
+ 0x3304, 0x8560, 0x3c5c, 0x0000, 0x0000, 0x0000, 0x6d70, 0xdf8f, 0x3c3b, 0x0000,
+ 0x0000, 0x0000, 0x3ef0, 0xafc3, 0x3c1e, 0x0000, 0x0000, 0x0000, 0xd0d8, 0x826b,
+ 0x3bfe, 0x0000, 0x0000, 0x0000, 0x1c80, 0xed4f, 0x3bdd, 0x0000, 0x0000, 0x0000,
+ 0x730c, 0xb0af, 0x3bc1, 0x0000, 0x0000, 0x0000, 0x6660, 0xc219, 0x3ba2, 0x0000,
+ 0x0000, 0x0000, 0x940c, 0xabe2, 0x3b83, 0x0000, 0x0000, 0x0000, 0xdffc, 0x8408,
+ 0x3b64, 0x0000, 0x0000, 0x0000, 0x6b98, 0xc402, 0x3b45, 0x0000, 0x0000, 0x0000,
+ 0x1818, 0x9cc4, 0x3b26, 0x0000, 0x0000, 0x0000, 0x5390, 0xaab6, 0x3b05, 0x0000,
+ 0x0000, 0x0000, 0xb070, 0xd464, 0x3ae9, 0x0000, 0x0000, 0x0000, 0x231a, 0x9ef0,
+ 0x3aca, 0x0000, 0x0000, 0x0000, 0x0670, 0xd1f1, 0x3aaa, 0x0000, 0x0000, 0x0000,
+ 0x7738, 0xd9f3, 0x3a8a, 0x0000, 0x0000, 0x0000, 0xa834, 0x8092, 0x3a6c, 0x0000,
+ 0x0000, 0x0000, 0xb45c, 0xce23, 0x3a4d, 0x0000, 0x0000, 0x0000, 0x36e8, 0xb0e5,
+ 0x3a2d, 0x0000, 0x0000, 0x0000, 0xd156, 0xaf44, 0x3a10, 0x0000, 0x0000, 0x0000,
+ 0x9f52, 0x8c82, 0x39f1, 0x0000, 0x0000, 0x0000, 0x829c, 0xff83, 0x39d1, 0x0000,
+ 0x0000, 0x0000, 0x7d06, 0xefc6, 0x39b3, 0x0000, 0x0000, 0x0000, 0x93e0, 0xb0b7,
+ 0x3992, 0x0000, 0x0000, 0x0000, 0xedde, 0xc193, 0x3975, 0x0000, 0x0000, 0x0000,
+ 0xbbc0, 0xcf49, 0x3952, 0x0000, 0x0000, 0x0000, 0xbdf0, 0xd63c, 0x3937, 0x0000,
+ 0x0000, 0x0000, 0x1f34, 0x9f3a, 0x3918, 0x0000, 0x0000, 0x0000, 0x3f8e, 0xe579,
+ 0x38f9, 0x0000, 0x0000, 0x0000, 0x90c8, 0xc3f8, 0x38d9, 0x0000, 0x0000, 0x0000,
+ 0x48c0, 0xf8f8, 0x38b7, 0x0000, 0x0000, 0x0000, 0xed56, 0xafa6, 0x389c, 0x0000,
+ 0x0000, 0x0000, 0x8218, 0xb969, 0x387d, 0x0000, 0x0000, 0x0000, 0x1852, 0xec57,
+ 0x385e, 0x0000, 0x0000, 0x0000, 0x670c, 0xd674, 0x383e, 0x0000, 0x0000, 0x0000,
+ 0xad40, 0xc2c4, 0x3820, 0x0000, 0x0000, 0x0000, 0x2e80, 0xa696, 0x3801, 0x0000,
+ 0x0000, 0x0000, 0xd800, 0xc467, 0x37dc, 0x0000, 0x0000, 0x0000, 0x3c72, 0xc5ae,
+ 0x37c3, 0x0000, 0x0000, 0x0000, 0xb006, 0xac69, 0x37a4, 0x0000, 0x0000, 0x0000,
+ 0x34a0, 0x8cdf, 0x3782, 0x0000, 0x0000, 0x0000, 0x9ed2, 0xd25e, 0x3766, 0x0000,
+ 0x0000, 0x0000, 0x6fec, 0xaaaa, 0x3747, 0x0000, 0x0000, 0x0000, 0x6040, 0xfb5c,
+ 0x3726, 0x0000, 0x0000, 0x0000, 0x764c, 0xa3fc, 0x3708, 0x0000, 0x0000, 0x0000,
+ 0xb254, 0x954e, 0x36e9, 0x0000, 0x0000, 0x0000, 0x3e1c, 0xf5dc, 0x36ca, 0x0000,
+ 0x0000, 0x0000, 0x7b06, 0xc635, 0x36ac, 0x0000, 0x0000, 0x0000, 0xa8ba, 0xd738,
+ 0x368d, 0x0000, 0x0000, 0x0000, 0x06cc, 0xb24e, 0x366d, 0x0000, 0x0000, 0x0000,
+ 0x7108, 0xac76, 0x364f, 0x0000, 0x0000, 0x0000, 0x2324, 0xa7cb, 0x3630, 0x0000,
+ 0x0000, 0x0000, 0xac40, 0xef15, 0x360f, 0x0000, 0x0000, 0x0000, 0xae46, 0xd516,
+ 0x35f2, 0x0000, 0x0000, 0x0000, 0x615e, 0xe003, 0x35d3, 0x0000, 0x0000, 0x0000,
+ 0x0cf0, 0xefe7, 0x35b1, 0x0000, 0x0000, 0x0000, 0xfb50, 0xf98c, 0x3595, 0x0000,
+ 0x0000, 0x0000, 0x0abc, 0xf333, 0x3575, 0x0000, 0x0000, 0x0000, 0xdd60, 0xca3f,
+ 0x3555, 0x0000, 0x0000, 0x0000, 0x7eb6, 0xd87f, 0x3538, 0x0000, 0x0000, 0x0000,
+ 0x44f4, 0xb291, 0x3519, 0x0000, 0x0000, 0x0000, 0xff80, 0xc982, 0x34f6, 0x0000,
+ 0x0000, 0x0000, 0x9de0, 0xd9b8, 0x34db, 0x0000, 0x0000, 0x0000, 0xcd42, 0x9366,
+ 0x34bc, 0x0000, 0x0000, 0x0000, 0xbef0, 0xfaee, 0x349d, 0x0000, 0x0000, 0x0000,
+ 0xdac4, 0xb6f1, 0x347d, 0x0000, 0x0000, 0x0000, 0xf140, 0x94de, 0x345d, 0x0000,
+ 0x0000, 0x0000, 0xa218, 0x8b4b, 0x343e, 0x0000, 0x0000, 0x0000, 0x6380, 0xa135,
+ 0x341e, 0x0000, 0x0000, 0x0000, 0xb184, 0x8cb2, 0x3402, 0x0000, 0x0000, 0x0000,
+ 0x196e, 0xdc61, 0x33e3, 0x0000, 0x0000, 0x0000, 0x0c00, 0xde05, 0x33c4, 0x0000,
+ 0x0000, 0x0000, 0xef9a, 0xbd38, 0x33a5, 0x0000, 0x0000, 0x0000, 0xc1a0, 0xdf00,
+ 0x3385, 0x0000, 0x0000, 0x0000, 0x1090, 0x9973, 0x3365, 0x0000, 0x0000, 0x0000,
+ 0x4882, 0x8301, 0x3348, 0x0000, 0x0000, 0x0000, 0x7abe, 0xadc7, 0x3329, 0x0000,
+ 0x0000, 0x0000, 0x7cba, 0xec2b, 0x330a, 0x0000, 0x0000, 0x0000, 0xa520, 0x8f21,
+ 0x32e9, 0x0000, 0x0000, 0x0000, 0x710c, 0x8d36, 0x32cc, 0x0000, 0x0000, 0x0000,
+ 0x5212, 0xc6ed, 0x32ad, 0x0000, 0x0000, 0x0000, 0x7308, 0xfd76, 0x328d, 0x0000,
+ 0x0000, 0x0000, 0x5014, 0xd548, 0x326f, 0x0000, 0x0000, 0x0000, 0xd3f2, 0xb499,
+ 0x3250, 0x0000, 0x0000, 0x0000, 0x7f74, 0xa606, 0x3230, 0x0000, 0x0000, 0x0000,
+ 0xf0a8, 0xd720, 0x3212, 0x0000, 0x0000, 0x0000, 0x185c, 0xe20f, 0x31f2, 0x0000,
+ 0x0000, 0x0000, 0xa5a8, 0x8738, 0x31d4, 0x0000, 0x0000, 0x0000, 0xdd74, 0xcafb,
+ 0x31b4, 0x0000, 0x0000, 0x0000, 0x98b6, 0xbd8e, 0x3196, 0x0000, 0x0000, 0x0000,
+ 0xe9de, 0x977f, 0x3177, 0x0000, 0x0000, 0x0000, 0x67c0, 0x818d, 0x3158, 0x0000,
+ 0x0000, 0x0000, 0xe52a, 0x9322, 0x3139, 0x0000, 0x0000, 0x0000, 0xe568, 0x9b6c,
+ 0x3119, 0x0000, 0x0000, 0x0000, 0x2358, 0xaa0a, 0x30fa, 0x0000, 0x0000, 0x0000,
+ 0xe480, 0xe13b, 0x30d9, 0x0000, 0x0000, 0x0000, 0x3024, 0x90a1, 0x30bd, 0x0000,
+ 0x0000, 0x0000, 0x9620, 0xda30, 0x309d, 0x0000, 0x0000, 0x0000, 0x898a, 0xb388,
+ 0x307f, 0x0000, 0x0000, 0x0000, 0xb24c, 0xc891, 0x3060, 0x0000, 0x0000, 0x0000,
+ 0x8056, 0xf98b, 0x3041, 0x0000, 0x0000, 0x0000, 0x72a4, 0xa1ea, 0x3021, 0x0000,
+ 0x0000, 0x0000, 0x6af8, 0x9488, 0x3001, 0x0000, 0x0000, 0x0000, 0xe00c, 0xdfcb,
+ 0x2fe4, 0x0000, 0x0000, 0x0000, 0xeeec, 0xc941, 0x2fc4, 0x0000, 0x0000, 0x0000,
+ 0x53e0, 0xe70f, 0x2fa4, 0x0000, 0x0000, 0x0000, 0x8f60, 0x9c07, 0x2f85, 0x0000,
+ 0x0000, 0x0000, 0xb328, 0xc3e7, 0x2f68, 0x0000, 0x0000, 0x0000, 0x9404, 0xf8c7,
+ 0x2f48, 0x0000, 0x0000, 0x0000, 0x38e0, 0xc99f, 0x2f29, 0x0000, 0x0000, 0x0000,
+ 0x9778, 0xd984, 0x2f09, 0x0000, 0x0000, 0x0000, 0xe700, 0xd142, 0x2eea, 0x0000,
+ 0x0000, 0x0000, 0xd904, 0x9443, 0x2ecd, 0x0000, 0x0000, 0x0000, 0xd4ba, 0xae7e,
+ 0x2eae, 0x0000, 0x0000, 0x0000, 0x8e5e, 0x8524, 0x2e8f, 0x0000, 0x0000, 0x0000,
+ 0xb550, 0xc9ed, 0x2e6e, 0x0000, 0x0000, 0x0000, 0x53b8, 0x8648, 0x2e51, 0x0000,
+ 0x0000, 0x0000, 0xdae4, 0x87f9, 0x2e32, 0x0000, 0x0000, 0x0000, 0x2942, 0xd966,
+ 0x2e13, 0x0000, 0x0000, 0x0000, 0x4f28, 0xcf3c, 0x2df3, 0x0000, 0x0000, 0x0000,
+ 0xfa40, 0xc4ef, 0x2dd1, 0x0000, 0x0000, 0x0000, 0x4424, 0xbca7, 0x2db5, 0x0000,
+ 0x0000, 0x0000, 0x2e62, 0xcdc5, 0x2d97, 0x0000, 0x0000, 0x0000, 0xed88, 0x996b,
+ 0x2d78, 0x0000, 0x0000, 0x0000, 0x7c30, 0xd97d, 0x2d56, 0x0000, 0x0000, 0x0000,
+ 0xed26, 0xbf6e, 0x2d3a, 0x0000, 0x0000, 0x0000, 0x2918, 0x921b, 0x2d1a, 0x0000,
+ 0x0000, 0x0000, 0x4e24, 0xe84e, 0x2cfb, 0x0000, 0x0000, 0x0000, 0x6dc0, 0x92ec,
+ 0x2cdd, 0x0000, 0x0000, 0x0000, 0x4f2c, 0xacf8, 0x2cbd, 0x0000, 0x0000, 0x0000,
+ 0xc634, 0xf094, 0x2c9e, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe5d3, 0x2c7e, 0x0000,
+ 0x0000, 0x0000, 0x2180, 0xa600, 0x2c5b, 0x0000, 0x0000, 0x0000, 0x8480, 0xd680,
+ 0x2c3c, 0x0000, 0x0000, 0x0000, 0x8b24, 0xd63b, 0x2c22, 0x0000, 0x0000, 0x0000,
+ 0x02e0, 0xaa47, 0x2c00, 0x0000, 0x0000, 0x0000, 0x9ad0, 0xee84, 0x2be3, 0x0000,
+ 0x0000, 0x0000, 0xf7dc, 0xf699, 0x2bc6, 0x0000, 0x0000, 0x0000, 0xddde, 0xe490,
+ 0x2ba7, 0x0000, 0x0000, 0x0000, 0x34a0, 0xb4fd, 0x2b85, 0x0000, 0x0000, 0x0000,
+ 0x91b4, 0x8ef6, 0x2b68, 0x0000, 0x0000, 0x0000, 0xa3e0, 0xa2a7, 0x2b47, 0x0000,
+ 0x0000, 0x0000, 0xcce4, 0x82b3, 0x2b2a, 0x0000, 0x0000, 0x0000, 0xe4be, 0x8207,
+ 0x2b0c, 0x0000, 0x0000, 0x0000, 0x1d92, 0xab43, 0x2aed, 0x0000, 0x0000, 0x0000,
+ 0xe818, 0xf9f6, 0x2acd, 0x0000, 0x0000, 0x0000, 0xff12, 0xba80, 0x2aaf, 0x0000,
+ 0x0000, 0x0000, 0x5254, 0x8529, 0x2a90, 0x0000, 0x0000, 0x0000, 0x1b88, 0xe032,
+ 0x2a71, 0x0000, 0x0000, 0x0000, 0x3248, 0xd86d, 0x2a50, 0x0000, 0x0000, 0x0000,
+ 0x3140, 0xc9d5, 0x2a2e, 0x0000, 0x0000, 0x0000, 0x14e6, 0xbd47, 0x2a14, 0x0000,
+ 0x0000, 0x0000, 0x5c10, 0xe544, 0x29f4, 0x0000, 0x0000, 0x0000, 0x9f50, 0x90b6,
+ 0x29d4, 0x0000, 0x0000, 0x0000, 0x9850, 0xab55, 0x29b6, 0x0000, 0x0000, 0x0000,
+ 0x2750, 0x9d07, 0x2998, 0x0000, 0x0000, 0x0000, 0x6700, 0x8bbb, 0x2973, 0x0000,
+ 0x0000, 0x0000, 0x5dba, 0xed31, 0x295a, 0x0000, 0x0000, 0x0000, 0x61dc, 0x85fe,
+ 0x293a, 0x0000, 0x0000, 0x0000, 0x9ba2, 0xd6b4, 0x291c, 0x0000, 0x0000, 0x0000,
+ 0x2d30, 0xe3a5, 0x28fb, 0x0000, 0x0000, 0x0000, 0x6630, 0xb566, 0x28dd, 0x0000,
+ 0x0000, 0x0000, 0x5ad4, 0xa829, 0x28bf, 0x0000, 0x0000, 0x0000, 0x89d8, 0xe290,
+ 0x28a0, 0x0000, 0x0000, 0x0000, 0x3916, 0xc428, 0x2881, 0x0000, 0x0000, 0x0000,
+ 0x0490, 0xbea4, 0x2860, 0x0000, 0x0000, 0x0000, 0xee06, 0x80ee, 0x2843, 0x0000,
+ 0x0000, 0x0000, 0xfc00, 0xf327, 0x2820, 0x0000, 0x0000, 0x0000, 0xea40, 0xa871,
+ 0x2800, 0x0000, 0x0000, 0x0000, 0x63d8, 0x9c26, 0x27e4, 0x0000, 0x0000, 0x0000,
+ 0x07ba, 0xc0c9, 0x27c7, 0x0000, 0x0000, 0x0000, 0x3fa2, 0x9797, 0x27a8, 0x0000,
+ 0x0000, 0x0000, 0x21c6, 0xfeca, 0x2789, 0x0000, 0x0000, 0x0000, 0xde40, 0x860d,
+ 0x2768, 0x0000, 0x0000, 0x0000, 0x9cc8, 0x98ce, 0x2749, 0x0000, 0x0000, 0x0000,
+ 0x3778, 0xa31c, 0x272a, 0x0000, 0x0000, 0x0000, 0xe778, 0xf6e2, 0x270b, 0x0000,
+ 0x0000, 0x0000, 0x59b8, 0xf841, 0x26ed, 0x0000, 0x0000, 0x0000, 0x02e0, 0xad04,
+ 0x26cd, 0x0000, 0x0000, 0x0000, 0x5a92, 0x9380, 0x26b0, 0x0000, 0x0000, 0x0000,
+ 0xc740, 0x8886, 0x268d, 0x0000, 0x0000, 0x0000, 0x0680, 0xfaf8, 0x266c, 0x0000,
+ 0x0000, 0x0000, 0xfb60, 0x897f, 0x2653, 0x0000, 0x0000, 0x0000, 0x8760, 0xf903,
+ 0x2634, 0x0000, 0x0000, 0x0000, 0xad2a, 0xc2c8, 0x2615, 0x0000, 0x0000, 0x0000,
+ 0x2d86, 0x8aef, 0x25f6, 0x0000, 0x0000, 0x0000, 0x1ef4, 0xe627, 0x25d6, 0x0000,
+ 0x0000, 0x0000, 0x09e4, 0x8020, 0x25b7, 0x0000, 0x0000, 0x0000, 0x7548, 0xd227,
+ 0x2598, 0x0000, 0x0000, 0x0000, 0x75dc, 0xfb5b, 0x2579, 0x0000, 0x0000, 0x0000,
+ 0xea84, 0xc8b6, 0x255a, 0x0000, 0x0000, 0x0000, 0xe4d0, 0x8145, 0x253b, 0x0000,
+ 0x0000, 0x0000, 0x3640, 0x9768, 0x251c, 0x0000, 0x0000, 0x0000, 0x246a, 0xccec,
+ 0x24fe, 0x0000, 0x0000, 0x0000, 0x51d0, 0xa075, 0x24dd, 0x0000, 0x0000, 0x0000,
+ 0x4638, 0xa385, 0x24bf, 0x0000, 0x0000, 0x0000, 0xd788, 0xd776, 0x24a1, 0x0000,
+ 0x0000, 0x0000, 0x1370, 0x8997, 0x2482, 0x0000, 0x0000, 0x0000, 0x1e88, 0x9b67,
+ 0x2462, 0x0000, 0x0000, 0x0000, 0x6c08, 0xd975, 0x2444, 0x0000, 0x0000, 0x0000,
+ 0xfdb0, 0xcfc0, 0x2422, 0x0000, 0x0000, 0x0000, 0x3100, 0xc026, 0x2406, 0x0000,
+ 0x0000, 0x0000, 0xc5b4, 0xae64, 0x23e6, 0x0000, 0x0000, 0x0000, 0x2280, 0xf687,
+ 0x23c3, 0x0000, 0x0000, 0x0000, 0x2de0, 0x9006, 0x23a9, 0x0000, 0x0000, 0x0000,
+ 0x24bc, 0xf631, 0x238a, 0x0000, 0x0000, 0x0000, 0xb8d4, 0xa975, 0x236b, 0x0000,
+ 0x0000, 0x0000, 0xd9a4, 0xb949, 0x234b, 0x0000, 0x0000, 0x0000, 0xb54e, 0xbd39,
+ 0x232d, 0x0000, 0x0000, 0x0000, 0x4aac, 0x9a52, 0x230e, 0x0000, 0x0000, 0x0000,
+ 0xbbbc, 0xd085, 0x22ef, 0x0000, 0x0000, 0x0000, 0xdf18, 0xc633, 0x22cf, 0x0000,
+ 0x0000, 0x0000, 0x16d0, 0xeca5, 0x22af, 0x0000, 0x0000, 0x0000, 0xf2a0, 0xdf6f,
+ 0x228e, 0x0000, 0x0000, 0x0000, 0x8c44, 0xe86b, 0x2272, 0x0000, 0x0000, 0x0000,
+ 0x35c0, 0xbbf4, 0x2253, 0x0000, 0x0000, 0x0000, 0x0c40, 0xdafb, 0x2230, 0x0000,
+ 0x0000, 0x0000, 0x92dc, 0x9935, 0x2216, 0x0000, 0x0000, 0x0000, 0x0ca0, 0xbda6,
+ 0x21f3, 0x0000, 0x0000, 0x0000, 0x5958, 0xa6fd, 0x21d6, 0x0000, 0x0000, 0x0000,
+ 0xa3dc, 0x9d7f, 0x21b9, 0x0000, 0x0000, 0x0000, 0x79dc, 0xfcb5, 0x2199, 0x0000,
+ 0x0000, 0x0000, 0xf264, 0xcebb, 0x217b, 0x0000, 0x0000, 0x0000, 0x0abe, 0x8308,
+ 0x215c, 0x0000, 0x0000, 0x0000, 0x30ae, 0xb463, 0x213d, 0x0000, 0x0000, 0x0000,
+ 0x6228, 0xb040, 0x211c, 0x0000, 0x0000, 0x0000, 0xc9b2, 0xf43b, 0x20ff, 0x0000,
+ 0x0000, 0x0000, 0x3d8e, 0xa4b3, 0x20e0, 0x0000, 0x0000, 0x0000, 0x84e6, 0x8dab,
+ 0x20c1, 0x0000, 0x0000, 0x0000, 0xa124, 0x9b74, 0x20a1, 0x0000, 0x0000, 0x0000,
+ 0xc276, 0xd497, 0x2083, 0x0000, 0x0000, 0x0000, 0x6354, 0xa466, 0x2063, 0x0000,
+ 0x0000, 0x0000, 0x8654, 0xaf0a, 0x2044, 0x0000, 0x0000, 0x0000, 0x1d20, 0xfa5c,
+ 0x2024, 0x0000, 0x0000, 0x0000, 0xbcd0, 0xf3f0, 0x2004, 0x0000, 0x0000, 0x0000,
+ 0xedf0, 0xf0b6, 0x1fe7, 0x0000, 0x0000, 0x0000, 0x45bc, 0x9182, 0x1fc9, 0x0000,
+ 0x0000, 0x0000, 0xe254, 0xdc85, 0x1faa, 0x0000, 0x0000, 0x0000, 0xb898, 0xe9b1,
+ 0x1f8a, 0x0000, 0x0000, 0x0000, 0x0ebe, 0xe6f0, 0x1f6c, 0x0000, 0x0000, 0x0000,
+ 0xa9b8, 0xf584, 0x1f4c, 0x0000, 0x0000, 0x0000, 0x12e8, 0xdf6b, 0x1f2e, 0x0000,
+ 0x0000, 0x0000, 0x9f9e, 0xcd55, 0x1f0f, 0x0000, 0x0000, 0x0000, 0x05a0, 0xec3a,
+ 0x1eef, 0x0000, 0x0000, 0x0000, 0xd8e0, 0x96f8, 0x1ed1, 0x0000, 0x0000, 0x0000,
+ 0x3bd4, 0xccc6, 0x1eb1, 0x0000, 0x0000, 0x0000, 0x4910, 0xb87b, 0x1e93, 0x0000,
+ 0x0000, 0x0000, 0xbefc, 0xd40b, 0x1e73, 0x0000, 0x0000, 0x0000, 0x317e, 0xa406,
+ 0x1e55, 0x0000, 0x0000, 0x0000, 0x6bb2, 0xc2b2, 0x1e36, 0x0000, 0x0000, 0x0000,
+ 0xb87e, 0xbb78, 0x1e17, 0x0000, 0x0000, 0x0000, 0xa03c, 0xdbbd, 0x1df7, 0x0000,
+ 0x0000, 0x0000, 0x5b6c, 0xe3c8, 0x1dd9, 0x0000, 0x0000, 0x0000, 0x8968, 0xca8e,
+ 0x1dba, 0x0000, 0x0000, 0x0000, 0xc024, 0xe6ab, 0x1d9a, 0x0000, 0x0000, 0x0000,
+ 0x4110, 0xd4eb, 0x1d7a, 0x0000, 0x0000, 0x0000, 0xa168, 0xbdb5, 0x1d5d, 0x0000,
+ 0x0000, 0x0000, 0x012e, 0xa5fa, 0x1d3e, 0x0000, 0x0000, 0x0000, 0x6838, 0x9c1f,
+ 0x1d1e, 0x0000, 0x0000, 0x0000, 0xa158, 0xaa76, 0x1d00, 0x0000, 0x0000, 0x0000,
+ 0x090a, 0xbd95, 0x1ce1, 0x0000, 0x0000, 0x0000, 0xf73e, 0x8b6d, 0x1cc2, 0x0000,
+ 0x0000, 0x0000, 0x5fda, 0xbcbf, 0x1ca3, 0x0000, 0x0000, 0x0000, 0xdbe8, 0xb89f,
+ 0x1c84, 0x0000, 0x0000, 0x0000, 0x6e4c, 0x96c7, 0x1c64, 0x0000, 0x0000, 0x0000,
+ 0x19c2, 0xf2a4, 0x1c46, 0x0000, 0x0000, 0x0000, 0xb800, 0xf855, 0x1c1e, 0x0000,
+ 0x0000, 0x0000, 0x87fc, 0x85ff, 0x1c08, 0x0000, 0x0000, 0x0000, 0x1418, 0x839f,
+ 0x1be9, 0x0000, 0x0000, 0x0000, 0x6186, 0xd9d8, 0x1bca, 0x0000, 0x0000, 0x0000,
+ 0xf500, 0xabaa, 0x1ba6, 0x0000, 0x0000, 0x0000, 0x7b36, 0xdafe, 0x1b8c, 0x0000,
+ 0x0000, 0x0000, 0xf394, 0xe6d8, 0x1b6c, 0x0000, 0x0000, 0x0000, 0x6efc, 0x9e55,
+ 0x1b4e, 0x0000, 0x0000, 0x0000, 0x5e10, 0xc523, 0x1b2e, 0x0000, 0x0000, 0x0000,
+ 0x8210, 0xb6f9, 0x1b0d, 0x0000, 0x0000, 0x0000, 0x9ab0, 0x96e3, 0x1af1, 0x0000,
+ 0x0000, 0x0000, 0x3864, 0x92e7, 0x1ad1, 0x0000, 0x0000, 0x0000, 0x9878, 0xdc65,
+ 0x1ab1, 0x0000, 0x0000, 0x0000, 0xfa20, 0xd6cb, 0x1a94, 0x0000, 0x0000, 0x0000,
+ 0x6c00, 0xa4e4, 0x1a70, 0x0000, 0x0000, 0x0000, 0xab40, 0xb41b, 0x1a53, 0x0000,
+ 0x0000, 0x0000, 0x43a4, 0x8ede, 0x1a37, 0x0000, 0x0000, 0x0000, 0x22e0, 0x9314,
+ 0x1a15, 0x0000, 0x0000, 0x0000, 0x6170, 0xb949, 0x19f8, 0x0000, 0x0000, 0x0000,
+ 0x6b00, 0xe056, 0x19d8, 0x0000, 0x0000, 0x0000, 0x9ba8, 0xa94c, 0x19b9, 0x0000,
+ 0x0000, 0x0000, 0xfaa0, 0xaa16, 0x199b, 0x0000, 0x0000, 0x0000, 0x899a, 0xf627,
+ 0x197d, 0x0000, 0x0000, 0x0000, 0x9f20, 0xfb70, 0x195d, 0x0000, 0x0000, 0x0000,
+ 0xa4b8, 0xc176, 0x193e, 0x0000, 0x0000, 0x0000, 0xb21c, 0x85c3, 0x1920, 0x0000,
+ 0x0000, 0x0000, 0x50d2, 0x9b19, 0x1901, 0x0000, 0x0000, 0x0000, 0xd4b0, 0xb708,
+ 0x18e0, 0x0000, 0x0000, 0x0000, 0xfb88, 0xf510, 0x18c1, 0x0000, 0x0000, 0x0000,
+ 0x31ec, 0xdc8d, 0x18a3, 0x0000, 0x0000, 0x0000, 0x3c00, 0xbff9, 0x1885, 0x0000,
+ 0x0000, 0x0000, 0x5020, 0xc30b, 0x1862, 0x0000, 0x0000, 0x0000, 0xd4f0, 0xda0c,
+ 0x1844, 0x0000, 0x0000, 0x0000, 0x20d2, 0x99a5, 0x1828, 0x0000, 0x0000, 0x0000,
+ 0x852e, 0xd159, 0x1809, 0x0000, 0x0000, 0x0000, 0x7cd8, 0x97a1, 0x17e9, 0x0000,
+ 0x0000, 0x0000, 0x423a, 0x997b, 0x17cb, 0x0000, 0x0000, 0x0000, 0xc1c0, 0xbe7d,
+ 0x17a8, 0x0000, 0x0000, 0x0000, 0xe8bc, 0xdcdd, 0x178d, 0x0000, 0x0000, 0x0000,
+ 0x8b28, 0xae06, 0x176e, 0x0000, 0x0000, 0x0000, 0x102e, 0xb8d4, 0x174f, 0x0000,
+ 0x0000, 0x0000, 0xaa00, 0xaa5c, 0x172f, 0x0000, 0x0000, 0x0000, 0x51f0, 0x9fc0,
+ 0x170e, 0x0000, 0x0000, 0x0000, 0xf858, 0xe181, 0x16f2, 0x0000, 0x0000, 0x0000,
+ 0x91a8, 0x8162, 0x16d3, 0x0000, 0x0000, 0x0000, 0x5f40, 0xcb6f, 0x16b1, 0x0000,
+ 0x0000, 0x0000, 0xbb50, 0xe55f, 0x1693, 0x0000, 0x0000, 0x0000, 0xacd2, 0xd895,
+ 0x1676, 0x0000, 0x0000, 0x0000, 0xef30, 0x97bf, 0x1654, 0x0000, 0x0000, 0x0000,
+ 0xf700, 0xb3d7, 0x1633, 0x0000, 0x0000, 0x0000, 0x3454, 0xa7b5, 0x1619, 0x0000,
+ 0x0000, 0x0000, 0x6b00, 0xa929, 0x15f6, 0x0000, 0x0000, 0x0000, 0x9f04, 0x89f7,
+ 0x15db, 0x0000, 0x0000, 0x0000, 0xad78, 0xd985, 0x15bc, 0x0000, 0x0000, 0x0000,
+ 0xa46a, 0xae3f, 0x159d, 0x0000, 0x0000, 0x0000, 0x63a0, 0xd0da, 0x157c, 0x0000,
+ 0x0000, 0x0000, 0x5e90, 0x817d, 0x155e, 0x0000, 0x0000, 0x0000, 0x1494, 0xb13f,
+ 0x1540, 0x0000, 0x0000, 0x0000, 0x0090, 0x9c40, 0x1521, 0x0000, 0x0000, 0x0000,
+ 0xdd70, 0xcc86, 0x1500, 0x0000, 0x0000, 0x0000, 0x64f8, 0xdb6f, 0x14e1, 0x0000,
+ 0x0000, 0x0000, 0xe22c, 0xac17, 0x14c3, 0x0000, 0x0000, 0x0000, 0x60e0, 0xa9ad,
+ 0x14a3, 0x0000, 0x0000, 0x0000, 0x4640, 0xd658, 0x1481, 0x0000, 0x0000, 0x0000,
+ 0x6490, 0xa181, 0x1467, 0x0000, 0x0000, 0x0000, 0x1df4, 0xaaa2, 0x1447, 0x0000,
+ 0x0000, 0x0000, 0xb94a, 0x8f61, 0x1429, 0x0000, 0x0000, 0x0000, 0x5198, 0x9d83,
+ 0x1409, 0x0000, 0x0000, 0x0000, 0x0f7a, 0xa818, 0x13eb, 0x0000, 0x0000, 0x0000,
+ 0xc45e, 0xc06c, 0x13cc, 0x0000, 0x0000, 0x0000, 0x4ec0, 0xfa29, 0x13a8, 0x0000,
+ 0x0000, 0x0000, 0x6418, 0x8cad, 0x138c, 0x0000, 0x0000, 0x0000, 0xbcc8, 0xe7d1,
+ 0x136f, 0x0000, 0x0000, 0x0000, 0xc934, 0xf9b0, 0x134f, 0x0000, 0x0000, 0x0000,
+ 0x6ce0, 0x98df, 0x1331, 0x0000, 0x0000, 0x0000, 0x3516, 0xe5e9, 0x1312, 0x0000,
+ 0x0000, 0x0000, 0xc6c0, 0xef8b, 0x12ef, 0x0000, 0x0000, 0x0000, 0xaf02, 0x913d,
+ 0x12d4, 0x0000, 0x0000, 0x0000, 0xd230, 0xe1d5, 0x12b5, 0x0000, 0x0000, 0x0000,
+ 0xfba8, 0xc232, 0x1295, 0x0000, 0x0000, 0x0000, 0x7ba4, 0xabeb, 0x1277, 0x0000,
+ 0x0000, 0x0000, 0x6e5c, 0xc692, 0x1258, 0x0000, 0x0000, 0x0000, 0x76a2, 0x9756,
+ 0x1239, 0x0000, 0x0000, 0x0000, 0xe180, 0xe423, 0x1214, 0x0000, 0x0000, 0x0000,
+ 0x8c3c, 0x90f8, 0x11fb, 0x0000, 0x0000, 0x0000, 0x9f3c, 0x9fd2, 0x11dc, 0x0000,
+ 0x0000, 0x0000, 0x53e0, 0xb73e, 0x11bd, 0x0000, 0x0000, 0x0000, 0x45be, 0x88d6,
+ 0x119e, 0x0000, 0x0000, 0x0000, 0x111a, 0x8bc0, 0x117f, 0x0000, 0x0000, 0x0000,
+ 0xe26a, 0xd7ff, 0x1160, 0x0000, 0x0000, 0x0000, 0xfb60, 0xdd8d, 0x113f, 0x0000,
+ 0x0000, 0x0000, 0x9370, 0xc108, 0x1120, 0x0000, 0x0000, 0x0000, 0x9654, 0x8baf,
+ 0x1103, 0x0000, 0x0000, 0x0000, 0xd6ec, 0xd6b9, 0x10e4, 0x0000, 0x0000, 0x0000,
+ 0x23e4, 0xd7b7, 0x10c4, 0x0000, 0x0000, 0x0000, 0x1aa6, 0xa847, 0x10a6, 0x0000,
+ 0x0000, 0x0000, 0xbee6, 0x9fef, 0x1087, 0x0000, 0x0000, 0x0000, 0x26d0, 0xa6eb,
+ 0x1066, 0x0000, 0x0000, 0x0000, 0x5b86, 0xa880, 0x1049, 0x0000, 0x0000, 0x0000,
+ 0x125c, 0xd971, 0x1029, 0x0000, 0x0000, 0x0000, 0x1f78, 0x9d18, 0x100a, 0x0000,
+ 0x0000, 0x0000, 0x0e84, 0xb15b, 0x0feb, 0x0000, 0x0000, 0x0000, 0xd0c0, 0xc150,
+ 0x0fcc, 0x0000, 0x0000, 0x0000, 0xa330, 0xc40c, 0x0fad, 0x0000, 0x0000, 0x0000,
+ 0x5202, 0xfc2c, 0x0f8f, 0x0000, 0x0000, 0x0000, 0x3f7c, 0xecf5, 0x0f6f, 0x0000,
+ 0x0000, 0x0000, 0xef44, 0xfdfd, 0x0f50, 0x0000, 0x0000, 0x0000, 0x3f6c, 0xab1b,
+ 0x0f31, 0x0000, 0x0000, 0x0000, 0xf658, 0x89ec, 0x0f11, 0x0000, 0x0000, 0x0000,
+ 0xbfc8, 0x9ba8, 0x0ef4, 0x0000, 0x0000, 0x0000, 0x3d40, 0xbe21, 0x0ed5, 0x0000,
+ 0x0000, 0x0000, 0xbbc4, 0xc70d, 0x0eb6, 0x0000, 0x0000, 0x0000, 0x5158, 0xdb16,
+ 0x0e96, 0x0000, 0x0000, 0x0000, 0xb5a8, 0xa8d8, 0x0e78, 0x0000, 0x0000, 0x0000,
+ 0xcccc, 0xb40e, 0x0e58, 0x0000, 0x0000, 0x0000, 0x448c, 0xcb62, 0x0e3a, 0x0000,
+ 0x0000, 0x0000, 0xf12a, 0x8aed, 0x0e1b, 0x0000, 0x0000, 0x0000, 0x79d0, 0xc59c,
+ 0x0dfb, 0x0000, 0x0000, 0x0000, 0x06b4, 0xcdc9, 0x0ddd, 0x0000, 0x0000, 0x0000,
+ 0xae70, 0xa979, 0x0dbe, 0x0000, 0x0000, 0x0000, 0x317c, 0xa8fb, 0x0d9e, 0x0000,
+ 0x0000, 0x0000, 0x5fe0, 0x8a50, 0x0d7d, 0x0000, 0x0000, 0x0000, 0x70b6, 0xfdfa,
+ 0x0d61, 0x0000, 0x0000, 0x0000, 0x1640, 0x9dc7, 0x0d41, 0x0000, 0x0000, 0x0000,
+ 0x9a9c, 0xdc50, 0x0d23, 0x0000, 0x0000, 0x0000, 0x4fcc, 0x9a9b, 0x0d04, 0x0000,
+ 0x0000, 0x0000, 0x7e48, 0x8f77, 0x0ce5, 0x0000, 0x0000, 0x0000, 0x84e4, 0xd4b9,
+ 0x0cc6, 0x0000, 0x0000, 0x0000, 0x84e0, 0xbd10, 0x0ca6, 0x0000, 0x0000, 0x0000,
+ 0x1b0a, 0xc8d9, 0x0c88, 0x0000, 0x0000, 0x0000, 0x6a48, 0xfc81, 0x0c68, 0x0000,
+ 0x0000, 0x0000, 0x070a, 0xbef6, 0x0c4a, 0x0000, 0x0000, 0x0000, 0x8a70, 0xf096,
+ 0x0c2b, 0x0000, 0x0000, 0x0000, 0xecc2, 0xc994, 0x0c0c, 0x0000, 0x0000, 0x0000,
+ 0x1540, 0x9537, 0x0bea, 0x0000, 0x0000, 0x0000, 0x1b02, 0xab5b, 0x0bce, 0x0000,
+ 0x0000, 0x0000, 0x5dc0, 0xb0c8, 0x0bad, 0x0000, 0x0000, 0x0000, 0xc928, 0xe034,
+ 0x0b8f, 0x0000, 0x0000, 0x0000, 0x2d12, 0xb4b0, 0x0b71, 0x0000, 0x0000, 0x0000,
+ 0x8fc2, 0xbb94, 0x0b52, 0x0000, 0x0000, 0x0000, 0xe236, 0xe22f, 0x0b33, 0x0000,
+ 0x0000, 0x0000, 0xb97c, 0xbe9e, 0x0b13, 0x0000, 0x0000, 0x0000, 0xe1a6, 0xe16d,
+ 0x0af5, 0x0000, 0x0000, 0x0000, 0xd330, 0xbaf0, 0x0ad6, 0x0000, 0x0000, 0x0000,
+ 0xc0bc, 0xbbd0, 0x0ab7, 0x0000, 0x0000, 0x0000, 0x8e66, 0xdd9b, 0x0a98, 0x0000,
+ 0x0000, 0x0000, 0xc95c, 0xf799, 0x0a79, 0x0000, 0x0000, 0x0000, 0xdac0, 0xbe4c,
+ 0x0a55, 0x0000, 0x0000, 0x0000, 0xafc0, 0xc378, 0x0a37, 0x0000, 0x0000, 0x0000,
+ 0xa880, 0xe341, 0x0a19, 0x0000, 0x0000, 0x0000, 0xc242, 0x81f6, 0x09fd, 0x0000,
+ 0x0000, 0x0000, 0x7470, 0xc777, 0x09de, 0x0000, 0x0000, 0x0000, 0x62bc, 0xb684,
+ 0x09be, 0x0000, 0x0000, 0x0000, 0x43ac, 0x8c58, 0x099f, 0x0000, 0x0000, 0x0000,
+ 0xcc3c, 0xf9ac, 0x0981, 0x0000, 0x0000, 0x0000, 0x1526, 0xb670, 0x0962, 0x0000,
+ 0x0000, 0x0000, 0xc9fe, 0xdf50, 0x0943, 0x0000, 0x0000, 0x0000, 0x6ae6, 0xc065,
+ 0x0924, 0x0000, 0x0000, 0x0000, 0xb114, 0xcf29, 0x0905, 0x0000, 0x0000, 0x0000,
+ 0xd388, 0x922a, 0x08e4, 0x0000, 0x0000, 0x0000, 0xcf54, 0xb926, 0x08c7, 0x0000,
+ 0x0000, 0x0000, 0x3826, 0xe855, 0x08a8, 0x0000, 0x0000, 0x0000, 0xe7c8, 0x829b,
+ 0x0888, 0x0000, 0x0000, 0x0000, 0x546c, 0xa903, 0x086a, 0x0000, 0x0000, 0x0000,
+ 0x8768, 0x99cc, 0x0849, 0x0000, 0x0000, 0x0000, 0x00ac, 0xf529, 0x082b, 0x0000,
+ 0x0000, 0x0000, 0x2658, 0x9f0b, 0x080c, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x9e21,
+ 0x07ee, 0x0000, 0x0000, 0x0000, 0x6da2, 0x9910, 0x07cf, 0x0000, 0x0000, 0x0000,
+ 0x9220, 0xf9b3, 0x07b0, 0x0000, 0x0000, 0x0000, 0x3d90, 0xa541, 0x0791, 0x0000,
+ 0x0000, 0x0000, 0x6e4c, 0xe7cc, 0x0771, 0x0000, 0x0000, 0x0000, 0xa8fa, 0xe80a,
+ 0x0753, 0x0000, 0x0000, 0x0000, 0x4e14, 0xc3a7, 0x0734, 0x0000, 0x0000, 0x0000,
+ 0xf7e0, 0xbad9, 0x0712, 0x0000, 0x0000, 0x0000, 0xfea0, 0xeff2, 0x06f5, 0x0000,
+ 0x0000, 0x0000, 0xcef6, 0xbd48, 0x06d7, 0x0000, 0x0000, 0x0000, 0x7544, 0xf559,
+ 0x06b7, 0x0000, 0x0000, 0x0000, 0x2388, 0xf655, 0x0698, 0x0000, 0x0000, 0x0000,
+ 0xe900, 0xad56, 0x0676, 0x0000, 0x0000, 0x0000, 0x2cc0, 0x8437, 0x0659, 0x0000,
+ 0x0000, 0x0000, 0x3068, 0xc544, 0x063b, 0x0000, 0x0000, 0x0000, 0xdc70, 0xe73c,
+ 0x061b, 0x0000, 0x0000, 0x0000, 0xee50, 0x9d49, 0x05fc, 0x0000, 0x0000, 0x0000,
+ 0x93d2, 0x81f6, 0x05df, 0x0000, 0x0000, 0x0000, 0x941c, 0xadff, 0x05bf, 0x0000,
+ 0x0000, 0x0000, 0x2ce2, 0x8e45, 0x05a1, 0x0000, 0x0000, 0x0000, 0x4a60, 0x95fd,
+ 0x0581, 0x0000, 0x0000, 0x0000, 0x79f8, 0xb83a, 0x0563, 0x0000, 0x0000, 0x0000,
+ 0xcb58, 0xa1f5, 0x0543, 0x0000, 0x0000, 0x0000, 0x2a3a, 0xdc36, 0x0525, 0x0000,
+ 0x0000, 0x0000, 0x14ee, 0x890e, 0x0506, 0x0000, 0x0000, 0x0000, 0x8f20, 0xc432,
+ 0x04e3, 0x0000, 0x0000, 0x0000, 0x8440, 0xb21d, 0x04c6, 0x0000, 0x0000, 0x0000,
+ 0x5430, 0xf698, 0x04a7, 0x0000, 0x0000, 0x0000, 0x04ae, 0x8b20, 0x048a, 0x0000,
+ 0x0000, 0x0000, 0x04d0, 0xe872, 0x046b, 0x0000, 0x0000, 0x0000, 0xc78e, 0x8893,
+ 0x044c, 0x0000, 0x0000, 0x0000, 0x0f78, 0x9895, 0x042b, 0x0000, 0x0000, 0x0000,
+ 0x11d4, 0xdf2e, 0x040d, 0x0000, 0x0000, 0x0000, 0xe84c, 0x89d5, 0x03ef, 0x0000,
+ 0x0000, 0x0000, 0xf7be, 0x8a67, 0x03d0, 0x0000, 0x0000, 0x0000, 0x95d0, 0xc906,
+ 0x03b1, 0x0000, 0x0000, 0x0000, 0x64ce, 0xd96c, 0x0392, 0x0000, 0x0000, 0x0000,
+ 0x97ba, 0xa16f, 0x0373, 0x0000, 0x0000, 0x0000, 0x463c, 0xc51a, 0x0354, 0x0000,
+ 0x0000, 0x0000, 0xef0a, 0xe93e, 0x0335, 0x0000, 0x0000, 0x0000, 0x526a, 0xa466,
+ 0x0316, 0x0000, 0x0000, 0x0000, 0x4140, 0xa94d, 0x02f5, 0x0000, 0x0000, 0x0000,
+ 0xb4ec, 0xce68, 0x02d8, 0x0000, 0x0000, 0x0000, 0x4fa2, 0x8490, 0x02b9, 0x0000,
+ 0x0000, 0x0000, 0x4e60, 0xca98, 0x0298, 0x0000, 0x0000, 0x0000, 0x08dc, 0xe09c,
+ 0x027a, 0x0000, 0x0000, 0x0000, 0x2b90, 0xc7e3, 0x025c, 0x0000, 0x0000, 0x0000,
+ 0x5a7c, 0xf8ef, 0x023c, 0x0000, 0x0000, 0x0000, 0x5022, 0x9d58, 0x021e, 0x0000,
+ 0x0000, 0x0000, 0x553a, 0xe242, 0x01ff, 0x0000, 0x0000, 0x0000, 0x7e6e, 0xb54d,
+ 0x01e0, 0x0000, 0x0000, 0x0000, 0xd2d4, 0xa88c, 0x01c1, 0x0000, 0x0000, 0x0000,
+ 0x75b6, 0xfe6d, 0x01a2, 0x0000, 0x0000, 0x0000, 0x3bb2, 0xf04c, 0x0183, 0x0000,
+ 0x0000, 0x0000, 0xc2d0, 0xc046, 0x0163, 0x0000, 0x0000, 0x0000, 0x250c, 0xf9d6,
+ 0x0145, 0x0000, 0x0000, 0x0000, 0xb7b4, 0x8a0d, 0x0126, 0x0000, 0x0000, 0x0000,
+ 0x1a72, 0xe4f5, 0x0107, 0x0000, 0x0000, 0x0000, 0x825c, 0xa9b8, 0x00e8, 0x0000,
+ 0x0000, 0x0000, 0x6c90, 0xc9ad, 0x00c6, 0x0000, 0x0000, 0x0000, 0x4d00, 0xd1bb,
+ 0x00aa, 0x0000, 0x0000, 0x0000, 0xa4a0, 0xee01, 0x0087, 0x0000, 0x0000, 0x0000,
+ 0x89a8, 0xbe9f, 0x006b, 0x0000, 0x0000, 0x0000, 0x038e, 0xc80c, 0x004d, 0x0000,
+ 0x0000, 0x0000, 0xfe26, 0x8384, 0x002e, 0x0000, 0x0000, 0x0000, 0xcd90, 0xca57,
+ 0x000e, 0x0000
+};
+
+void MacroAssembler::libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
+ Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12;
+ Label B1_13, B1_14, B1_15;
+
+ assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
+
+ address zero_none = (address)_zero_none;
+ address _4onpi_d = (address)__4onpi_d;
+ address TWO_32H = (address)_TWO_32H;
+ address pi04_3d = (address)_pi04_3d;
+ address pi04_5d = (address)_pi04_5d;
+ address SCALE = (address)_SCALE;
+ address zeros = (address)_zeros;
+ address pi04_2d = (address)_pi04_2d;
+ address TWO_12H = (address)_TWO_12H;
+ address _4onpi_31l = (address)__4onpi_31l;
+
+ bind(B1_1);
+ push(ebp);
+ movl(ebp, esp);
+ andl(esp, -16);
+ push(esi);
+ push(edi);
+ push(ebx);
+ subl(esp, 20);
+ movzwl(ebx, Address(ebp, 16));
+ andl(ebx, 32767);
+ movl(eax, Address(ebp, 20));
+ cmpl(ebx, 16413);
+ movl(esi, Address(ebp, 24));
+ movl(Address(esp, 4), eax);
+ jcc(Assembler::greaterEqual, B1_8);
+
+ bind(B1_2);
+ fld_x(Address(ebp, 8));
+ fld_d(ExternalAddress(_4onpi_d)); //0x6dc9c883UL, 0x3ff45f30UL
+ fmul(1);
+ fstp_x(Address(esp, 8));
+ movzwl(ecx, Address(esp, 16));
+ negl(ecx);
+ addl(ecx, 30);
+ movl(eax, Address(esp, 12));
+ shrl(eax);
+ cmpl(Address(esp, 4), 0);
+ jcc(Assembler::notEqual, B1_4);
+
+ bind(B1_3);
+ lea(ecx, Address(eax, 1));
+ andl(ecx, -2);
+ jmp(B1_5);
+
+ bind(B1_4);
+ movl(ecx, eax);
+ addl(eax, Address(esp, 4));
+ movl(edx, eax);
+ andl(edx, 1);
+ addl(ecx, edx);
+
+ bind(B1_5);
+ fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL
+ cmpl(ebx, 16400);
+ movl(Address(esp, 0), ecx);
+ fild_s(Address(esp, 0));
+ jcc(Assembler::greaterEqual, B1_7);
+
+ bind(B1_6);
+ fld_d(ExternalAddress(pi04_3d)); //0x54442d00UL, 0x3fe921fbUL
+ fmul(1);
+ fsubp(3);
+ fxch(1);
+ fmul(2);
+ fld_s(2);
+ fadd(1);
+ fsubrp(1);
+ fld_s(0);
+ fxch(1);
+ fsuba(3);
+ fld_d(ExternalAddress(8 + pi04_3d)); //0x98cc5180UL, 0x3ce84698UL
+ fmul(3);
+ fsuba(2);
+ fxch(1);
+ fsub(2);
+ fsubrp(1);
+ faddp(3);
+ fld_d(ExternalAddress(16 + pi04_3d)); //0xcbb5bf6cUL, 0xb9dfc8f8UL
+ fmulp(2);
+ fld_s(1);
+ fsubr(1);
+ fsuba(1);
+ fxch(2);
+ fsubp(1);
+ faddp(2);
+ fxch(1);
+ jmp(B1_15);
+
+ bind(B1_7);
+ fld_d(ExternalAddress(pi04_5d)); //0x54400000UL, 0x3fe921fbUL
+ fmul(1);
+ fsubp(3);
+ fxch(1);
+ fmul(2);
+ fld_s(2);
+ fadd(1);
+ fsubrp(1);
+ fld_s(0);
+ fxch(1);
+ fsuba(3);
+ fld_d(ExternalAddress(8 + pi04_5d)); //0x1a600000UL, 0x3dc0b461UL
+ fmul(3);
+ fsuba(2);
+ fxch(1);
+ fsub(2);
+ fsubrp(1);
+ faddp(3);
+ fld_d(ExternalAddress(16 + pi04_5d)); //0x2e000000UL, 0x3b93198aUL
+ fmul(2);
+ fld_s(0);
+ fsubr(2);
+ fsuba(2);
+ fxch(1);
+ fsubp(2);
+ fxch(1);
+ faddp(3);
+ fld_d(ExternalAddress(24 + pi04_5d)); //0x25200000UL, 0x396b839aUL
+ fmul(2);
+ fld_s(0);
+ fsubr(2);
+ fsuba(2);
+ fxch(1);
+ fsubp(2);
+ fxch(1);
+ faddp(3);
+ fld_d(ExternalAddress(32 + pi04_5d)); //0x533e63a0UL, 0x37027044UL
+ fmulp(2);
+ fld_s(1);
+ fsubr(1);
+ fsuba(1);
+ fxch(2);
+ fsubp(1);
+ faddp(2);
+ fxch(1);
+ jmp(B1_15);
+
+ bind(B1_8);
+ fld_x(Address(ebp, 8));
+ addl(ebx, -16417);
+ fmul_d(as_Address(ExternalAddress(SCALE))); //0x00000000UL, 0x32600000UL
+ movl(eax, -2078209981);
+ imull(ebx);
+ addl(edx, ebx);
+ movl(ecx, ebx);
+ sarl(edx, 4);
+ sarl(ecx, 31);
+ subl(edx, ecx);
+ movl(eax, edx);
+ shll(eax, 5);
+ fstp_x(Address(ebp, 8));
+ fld_x(Address(ebp, 8));
+ subl(eax, edx);
+ movl(Address(ebp, 8), 0);
+ subl(ebx, eax);
+ fld_x(Address(ebp, 8));
+ cmpl(ebx, 17);
+ fsuba(1);
+ jcc(Assembler::less, B1_10);
+
+ bind(B1_9);
+ lea(eax, Address(noreg, edx, Address::times_8));
+ lea(ecx, Address(eax, edx, Address::times_4));
+ incl(edx);
+ fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmul(2);
+ fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmul(2);
+ fld_s(0);
+ fadd(2);
+ fsuba(2);
+ fxch(1);
+ faddp(2);
+ fld_s(1);
+ fadd(1);
+ fstp_x(Address(esp, 8));
+ andl(Address(esp, 8), -16777216);
+ fld_x(Address(esp, 8));
+ fsubp(1);
+ jmp(B1_11);
+
+ bind(B1_10);
+ fld_d(ExternalAddress(zeros)); //0x00000000UL, 0x00000000UL
+ fld_s(0);
+
+ bind(B1_11);
+ fld_s(0);
+ lea(eax, Address(noreg, edx, Address::times_8));
+ fld_s(3);
+ lea(edx, Address(eax, edx, Address::times_4));
+ fld_x(Address(_4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
+ fmul(6);
+ movl(Address(esp, 0), edx);
+ fadda(2);
+ fxch(2);
+ fsuba(3);
+ fxch(2);
+ faddp(3);
+ fxch(2);
+ faddp(3);
+ fld_x(Address(12 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
+ fmula(2);
+ fld_s(2);
+ fadd(2);
+ fld_s(0);
+ fxch(1);
+ fsubra(3);
+ fxch(3);
+ fchs();
+ faddp(4);
+ fxch(3);
+ faddp(4);
+ fxch(2);
+ fadd(3);
+ fxch(2);
+ fmul(5);
+ fadda(2);
+ fld_s(4);
+ fld_x(Address(24 + _4onpi_31l, RelocationHolder::none).plus_disp(edx, Address::times_1));
+ fmula(1);
+ fxch(1);
+ fadda(4);
+ fxch(4);
+ fstp_x(Address(esp, 8));
+ movzwl(ebx, Address(esp, 16));
+ andl(ebx, 32767);
+ cmpl(ebx, 16415);
+ jcc(Assembler::greaterEqual, B1_13);
+
+ bind(B1_12);
+ negl(ebx);
+ addl(ebx, 30);
+ movl(ecx, ebx);
+ movl(eax, Address(esp, 12));
+ shrl(eax);
+ shll(eax);
+ movl(Address(esp, 12), eax);
+ movl(Address(esp, 8), 0);
+ shrl(eax);
+ jmp(B1_14);
+
+ bind(B1_13);
+ negl(ebx);
+ addl(ebx, 30);
+ movl(ecx, ebx);
+ movl(edx, Address(esp, 8));
+ shrl(edx);
+ shll(edx);
+ negl(ecx);
+ movl(eax, Address(esp, 12));
+ shll(eax);
+ movl(ecx, ebx);
+ movl(Address(esp, 8), edx);
+ shrl(edx);
+ orl(eax, edx);
+
+ bind(B1_14);
+ fld_x(Address(esp, 8));
+ addl(eax, Address(esp, 4));
+ fsubp(3);
+ fmul(6);
+ fld_s(4);
+ movl(edx, eax);
+ andl(edx, 1);
+ fadd(3);
+ movl(ecx, Address(esp, 0));
+ fsuba(3);
+ fxch(3);
+ faddp(5);
+ fld_s(1);
+ fxch(3);
+ fadd_d(Address(zero_none, RelocationHolder::none).plus_disp(edx, Address::times_8));
+ fadda(3);
+ fsub(3);
+ faddp(2);
+ fxch(1);
+ faddp(4);
+ fld_s(2);
+ fadd(2);
+ fsuba(2);
+ fxch(3);
+ faddp(2);
+ fxch(1);
+ faddp(3);
+ fld_s(0);
+ fadd(2);
+ fsuba(2);
+ fxch(1);
+ faddp(2);
+ fxch(1);
+ faddp(2);
+ fld_s(2);
+ fld_x(Address(36 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmula(1);
+ fld_s(1);
+ fadd(3);
+ fsuba(3);
+ fxch(2);
+ faddp(3);
+ fxch(2);
+ faddp(3);
+ fxch(1);
+ fmul(4);
+ fld_s(0);
+ fadd(2);
+ fsuba(2);
+ fxch(1);
+ faddp(2);
+ fxch(1);
+ faddp(2);
+ fld_s(2);
+ fld_x(Address(48 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmula(1);
+ fld_s(1);
+ fadd(3);
+ fsuba(3);
+ fxch(2);
+ faddp(3);
+ fxch(2);
+ faddp(3);
+ fld_s(3);
+ fxch(2);
+ fmul(5);
+ fld_x(Address(60 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmula(3);
+ fxch(3);
+ faddp(1);
+ fld_s(0);
+ fadd(2);
+ fsuba(2);
+ fxch(1);
+ faddp(2);
+ fxch(1);
+ faddp(3);
+ fld_s(3);
+ fxch(2);
+ fmul(5);
+ fld_x(Address(72 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmula(3);
+ fxch(3);
+ faddp(1);
+ fld_s(0);
+ fadd(2);
+ fsuba(2);
+ fxch(1);
+ faddp(2);
+ fxch(1);
+ faddp(3);
+ fxch(1);
+ fmulp(4);
+ fld_x(Address(84 + _4onpi_31l, RelocationHolder::none).plus_disp(ecx, Address::times_1));
+ fmulp(3);
+ fxch(2);
+ faddp(3);
+ fld_s(2);
+ fadd(2);
+ fld_d(ExternalAddress(TWO_32H)); //0x00000000UL, 0x41f80000UL
+ fmul(1);
+ fadda(1);
+ fsubp(1);
+ fsuba(2);
+ fxch(3);
+ faddp(2);
+ faddp(1);
+ fld_d(ExternalAddress(pi04_2d)); //0x54400000UL, 0x3fe921fbUL
+ fld_s(0);
+ fmul(2);
+ fxch(2);
+ fadd(3);
+ fxch(1);
+ fmulp(3);
+ fmul_d(as_Address(ExternalAddress(8 + pi04_2d))); //0x1a626331UL, 0x3dc0b461UL
+ faddp(1);
+
+ bind(B1_15);
+ fld_d(ExternalAddress(TWO_12H)); //0x00000000UL, 0x40b80000UL
+ fld_s(2);
+ fadd(2);
+ fmula(1);
+ fstp_x(Address(esp, 8));
+ fld_x(Address(esp, 8));
+ fadd(1);
+ fsubrp(1);
+ fst_d(Address(esi, 0));
+ fsubp(2);
+ faddp(1);
+ fstp_d(Address(esi, 8));
+ addl(esp, 20);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+}
+
+ALIGNED_(16) juint StubRoutines::x86::_L_2il0floatpacket_0[] =
+{
+ 0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_Pi4Inv[] =
+{
+ 0x6dc9c883UL, 0x3ff45f30UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_Pi4x3[] =
+{
+ 0x54443000UL, 0xbfe921fbUL, 0x3b39a000UL, 0x3d373dcbUL, 0xe0e68948UL,
+ 0xba845c06UL
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_Pi4x4[] =
+{
+ 0x54400000UL, 0xbfe921fbUL, 0x1a600000UL, 0xbdc0b461UL, 0x2e000000UL,
+ 0xbb93198aUL, 0x252049c1UL, 0xb96b839aUL
+};
+
+ALIGNED_(16) jushort _SP[] =
+{
+ 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffc, 0x0000, 0x8887, 0x8888, 0x8888, 0x8888,
+ 0x3ff8, 0x0000, 0xc527, 0x0d00, 0x00d0, 0xd00d, 0xbff2, 0x0000, 0x45f6, 0xb616,
+ 0x1d2a, 0xb8ef, 0x3fec, 0x0000, 0x825b, 0x3997, 0x2b3f, 0xd732, 0xbfe5, 0x0000,
+ 0xbf33, 0x8bb4, 0x2fda, 0xb092, 0x3fde, 0x0000, 0x44a6, 0xed1a, 0x29ef, 0xd73e,
+ 0xbfd6, 0x0000, 0x8610, 0x307f, 0x62a1, 0xc921, 0x3fce, 0x0000
+};
+
+ALIGNED_(16) jushort _CP[] =
+{
+ 0x0000, 0x0000, 0x0000, 0x8000, 0xbffe, 0x0000, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x3ffa, 0x0000, 0x9c2f, 0x0b60, 0x60b6, 0xb60b, 0xbff5, 0x0000, 0xf024, 0x0cac,
+ 0x00d0, 0xd00d, 0x3fef, 0x0000, 0x03fe, 0x3f65, 0x7dbb, 0x93f2, 0xbfe9, 0x0000,
+ 0xd84d, 0xadee, 0xc698, 0x8f76, 0x3fe2, 0x0000, 0xdaba, 0xfe79, 0xea36, 0xc9c9,
+ 0xbfda, 0x0000, 0x3ac6, 0x0ba0, 0x07ce, 0xd585, 0x3fd2, 0x0000
+};
+
+ALIGNED_(16) juint StubRoutines::x86::_ones[] =
+{
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xbff00000UL
+};
+
+void MacroAssembler::libm_sincos_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
+ Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12;
+ Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
+ Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
+ Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_41, B1_42, B1_43, B1_44, B1_45, B1_46;
+
+ assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
+
+ address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr();
+ address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr();
+ address Pi4x3 = StubRoutines::x86::_Pi4x3_addr();
+ address Pi4x4 = StubRoutines::x86::_Pi4x4_addr();
+ address ones = StubRoutines::x86::_ones_addr();
+ address CP = (address)_CP;
+ address SP = (address)_SP;
+
+ bind(B1_1);
+ push(ebp);
+ movl(ebp, esp);
+ andl(esp, -64);
+ push(esi);
+ push(edi);
+ push(ebx);
+ subl(esp, 52);
+ movl(eax, Address(ebp, 16));
+ movl(edx, Address(ebp, 20));
+ movl(Address(esp, 32), eax);
+ movl(Address(esp, 36), edx);
+
+ bind(B1_2);
+ fnstcw(Address(esp, 30));
+
+ bind(B1_3);
+ movsd(xmm1, Address(ebp, 8));
+ movl(esi, Address(ebp, 12));
+ movl(eax, esi);
+ andl(eax, 2147483647);
+ andps(xmm1, ExternalAddress(L_2il0floatpacket_0)); //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
+ shrl(esi, 31);
+ movl(Address(esp, 40), eax);
+ cmpl(eax, 1104150528);
+ movsd(Address(ebp, 8), xmm1);
+ jcc(Assembler::aboveEqual, B1_11);
+
+ bind(B1_4);
+ movsd(xmm0, ExternalAddress(Pi4Inv)); //0x6dc9c883UL, 0x3ff45f30UL
+ mulsd(xmm0, xmm1);
+ movzwl(edx, Address(esp, 30));
+ movl(eax, edx);
+ andl(eax, 768);
+ movsd(Address(esp, 0), xmm0);
+ cmpl(eax, 768);
+ jcc(Assembler::equal, B1_42);
+
+ bind(B1_5);
+ orl(edx, -64768);
+ movw(Address(esp, 28), edx);
+
+ bind(B1_6);
+ fldcw(Address(esp, 28));
+
+ bind(B1_7);
+ movsd(xmm1, Address(ebp, 8));
+ movl(ebx, 1);
+
+ bind(B1_8);
+ movl(Address(esp, 12), ebx);
+ movl(ebx, Address(esp, 4));
+ movl(eax, ebx);
+ movl(Address(esp, 8), esi);
+ movl(esi, ebx);
+ shrl(esi, 20);
+ andl(eax, 1048575);
+ movl(ecx, esi);
+ orl(eax, 1048576);
+ negl(ecx);
+ movl(edx, eax);
+ addl(ecx, 19);
+ addl(esi, 13);
+ movl(Address(esp, 24), ecx);
+ shrl(edx);
+ movl(ecx, esi);
+ shll(eax);
+ movl(ecx, Address(esp, 24));
+ movl(esi, Address(esp, 0));
+ shrl(esi);
+ orl(eax, esi);
+ cmpl(ebx, 1094713344);
+ movsd(Address(esp, 16), xmm1);
+ fld_d(Address(esp, 16));
+ cmov32(Assembler::below, eax, edx);
+ movl(esi, Address(esp, 8));
+ lea(edx, Address(eax, 1));
+ movl(ebx, edx);
+ andl(ebx, -2);
+ movl(Address(esp, 16), ebx);
+ fild_s(Address(esp, 16));
+ movl(ebx, Address(esp, 12));
+ cmpl(Address(esp, 40), 1094713344);
+ jcc(Assembler::aboveEqual, B1_10);
+
+ bind(B1_9);
+ fld_d(ExternalAddress(Pi4x3)); //0x54443000UL, 0xbfe921fbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(8 + Pi4x3)); //0x3b39a000UL, 0x3d373dcbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(16 + Pi4x3)); //0xe0e68948UL, 0xba845c06UL
+ fmulp(1);
+ faddp(1);
+ jmp(B1_17);
+
+ bind(B1_10);
+ fld_d(ExternalAddress(Pi4x4)); //0x54400000UL, 0xbfe921fbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(8 + Pi4x4)); //0x1a600000UL, 0xbdc0b461UL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(16 + Pi4x4)); //0x2e000000UL, 0xbb93198aUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(24 + Pi4x4)); //0x252049c1UL, 0xb96b839aUL
+ fmulp(1);
+ faddp(1);
+ jmp(B1_17);
+
+ bind(B1_11);
+ movzwl(edx, Address(esp, 30));
+ movl(eax, edx);
+ andl(eax, 768);
+ cmpl(eax, 768);
+ jcc(Assembler::equal, B1_43);
+ bind(B1_12);
+ orl(edx, -64768);
+ movw(Address(esp, 28), edx);
+
+ bind(B1_13);
+ fldcw(Address(esp, 28));
+
+ bind(B1_14);
+ movsd(xmm1, Address(ebp, 8));
+ movl(ebx, 1);
+
+ bind(B1_15);
+ movsd(Address(esp, 16), xmm1);
+ fld_d(Address(esp, 16));
+ addl(esp, -32);
+ lea(eax, Address(esp, 32));
+ fstp_x(Address(esp, 0));
+ movl(Address(esp, 12), 0);
+ movl(Address(esp, 16), eax);
+ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_reduce_pi04l())));
+
+ bind(B1_46);
+ addl(esp, 32);
+
+ bind(B1_16);
+ fld_d(Address(esp, 0));
+ lea(edx, Address(eax, 1));
+ fld_d(Address(esp, 8));
+ faddp(1);
+
+ bind(B1_17);
+ movl(ecx, edx);
+ addl(eax, 3);
+ shrl(ecx, 2);
+ andl(ecx, 1);
+ shrl(eax, 2);
+ xorl(esi, ecx);
+ movl(ecx, Address(esp, 36));
+ andl(eax, 1);
+ andl(ecx, 3);
+ cmpl(ecx, 3);
+ jcc(Assembler::notEqual, B1_25);
+
+ bind(B1_18);
+ fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
+ fld_s(1);
+ fmul((2));
+ testb(edx, 2);
+ fmula((1));
+ fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(2);
+ fmula(1);
+ fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
+ fmul(1);
+ fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(62 + CP)); //0xd84d, 0xadee, 0xc6
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
+ faddp(1);
+ fmulp(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(esi, Address::times_8));
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ jcc(Assembler::equal, B1_22);
+
+ bind(B1_19);
+ fmulp(4);
+ testl(ebx, ebx);
+ fxch(2);
+ fmul(3);
+ movl(eax, Address(esp, 2));
+ faddp(3);
+ fxch(2);
+ fstp_d(Address(eax, 0));
+ fmula(1);
+ faddp(1);
+ fstp_d(Address(eax, 8));
+ jcc(Assembler::equal, B1_21);
+
+ bind(B1_20);
+ fldcw(Address(esp, 30));
+
+ bind(B1_21);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_22);
+ fxch(1);
+ fmulp(4);
+ testl(ebx, ebx);
+ fxch(2);
+ fmul(3);
+ movl(eax, Address(esp, 32));
+ faddp(3);
+ fxch(2);
+ fstp_d(Address(eax, 8));
+ fmula(1);
+ faddp(1);
+ fstp_d(Address(eax, 0));
+ jcc(Assembler::equal, B1_24);
+
+ bind(B1_23);
+ fldcw(Address(esp, 30));
+
+ bind(B1_24);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_25);
+ testb(Address(esp, 36), 2);
+ jcc(Assembler::equal, B1_33);
+
+ bind(B1_26);
+ fld_s(0);
+ testb(edx, 2);
+ fmul(1);
+ fld_s(0);
+ fmul(1);
+ jcc(Assembler::equal, B1_30);
+
+ bind(B1_27);
+ fstp_d(2);
+ fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
+ testl(ebx, ebx);
+ fmul(2);
+ fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
+ fmul(3);
+ fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6
+ movl(eax, Address(rsp, 32));
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
+ faddp(2);
+ fxch(1);
+ fmulp(3);
+ fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
+ faddp(1);
+ fmulp(1);
+ faddp(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8));
+ fmula(1);
+ faddp(1);
+ fstp_d(Address(eax, 8));
+ jcc(Assembler::equal, B1_29);
+
+ bind(B1_28);
+ fldcw(Address(esp, 30));
+
+ bind(B1_29);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_30);
+ fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
+ testl(ebx, ebx);
+ fmul(1);
+ fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
+ fmul(2);
+ fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
+ movl(eax, Address(rsp, 32));
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
+ faddp(2);
+ fxch(1);
+ fmulp(2);
+ fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(1);
+ fmulp(2);
+ faddp(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(rsi, Address::times_8));
+ fmulp(2);
+ fmul(1);
+ faddp(1);
+ fstp_d(Address(eax, 8));
+ jcc(Assembler::equal, B1_32);
+
+ bind(B1_31);
+ fldcw(Address(esp, 30));
+
+ bind(B1_32);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_33);
+ testb(Address(esp, 36), 1);
+ jcc(Assembler::equal, B1_41);
+
+ bind(B1_34);
+ fld_s(0);
+ testb(edx, 2);
+ fmul(1);
+ fld_s(0);
+ fmul(1);
+ jcc(Assembler::equal, B1_38);
+
+ bind(B1_35);
+ fld_x(ExternalAddress(84 + SP)); //0x8610, 0x307f, 0x62
+ testl(ebx, ebx);
+ fmul(1);
+ fld_x(ExternalAddress(72 + SP)); //0x44a6, 0xed1a, 0x29
+ fmul(2);
+ fld_x(ExternalAddress(60 + SP)); //0xbf33, 0x8bb4, 0x2f
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(48 + SP)); //0x825b, 0x3997, 0x2b
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(36 + SP)); //0x45f6, 0xb616, 0x1d
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(24 + SP)); //0xc527, 0x0d00, 0x00
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(12 + SP)); //0x8887, 0x8888, 0x88
+ faddp(2);
+ fxch(1);
+ fmulp(2);
+ fld_x(ExternalAddress(SP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(1);
+ fmulp(2);
+ faddp(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmulp(2);
+ fmul(1);
+ movl(eax, Address(esp, 32));
+ faddp(1);
+ fstp_d(Address(eax, 0));
+ jcc(Assembler::equal, B1_37);
+
+ bind(B1_36);
+ fldcw(Address(esp, 30));
+
+ bind(B1_37);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_38);
+ fstp_d(2);
+ fld_x(ExternalAddress(84 + CP)); //0x3ac6, 0x0ba0, 0x07
+ testl(ebx, ebx);
+ fmul(2);
+ fld_x(ExternalAddress(72 + CP)); //0xdaba, 0xfe79, 0xea
+ fmul(3);
+ fld_x(ExternalAddress(60 + CP)); //0xd84d, 0xadee, 0xc6
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(48 + CP)); //0x03fe, 0x3f65, 0x7d
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(36 + CP)); //0xf024, 0x0cac, 0x00
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(24 + CP)); //0x9c2f, 0x0b60, 0x60
+ faddp(2);
+ fxch(1);
+ fmul(3);
+ fld_x(ExternalAddress(12 + CP)); //0xaaa5, 0xaaaa, 0xaa
+ faddp(2);
+ fxch(1);
+ fmulp(3);
+ fld_x(ExternalAddress(CP)); //0x0000, 0x0000, 0x00
+ faddp(1);
+ fmulp(1);
+ faddp(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(1);
+ movl(eax, Address(esp, 32));
+ faddp(1);
+ fstp_d(Address(eax, 0));
+ jcc(Assembler::equal, B1_40);
+
+ bind(B1_39);
+ fldcw(Address(esp, 30));
+ bind(B1_40);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+ bind(B1_41);
+ fstp_d(0);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+ bind(B1_42);
+ xorl(ebx, ebx);
+ jmp(B1_8);
+ bind(B1_43);
+ xorl(ebx, ebx);
+ jmp(B1_15);
+}
+
+ALIGNED_(16) juint _static_const_table_sin[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL, 0xbf73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL,
+ 0xc0000000UL, 0xbc626d19UL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL,
+ 0xbfa60beaUL, 0x2ed59f06UL, 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL,
+ 0x00000000UL, 0x3ff00000UL, 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL,
+ 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL, 0x00000000UL, 0x3ff00000UL,
+ 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL, 0x20000000UL,
+ 0x3c5e0d89UL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL, 0xbfc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0x3ff00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL,
+ 0x20000000UL, 0x3c68076aUL, 0x00000000UL, 0x3ff00000UL, 0x99fcef32UL,
+ 0x3fca8279UL, 0x667f3bcdUL, 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL,
+ 0x00000000UL, 0x3fe00000UL, 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL,
+ 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL, 0x00000000UL, 0x3fe00000UL,
+ 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL, 0xe0000000UL,
+ 0x3c39f630UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL, 0xbf9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0x3fe00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0x3fed906bUL,
+ 0x20000000UL, 0x3c7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x76acf82dUL,
+ 0x3fa4a031UL, 0x56c62ddaUL, 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL,
+ 0x00000000UL, 0x3fd00000UL, 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL,
+ 0x3fef6297UL, 0x20000000UL, 0x3c756217UL, 0x00000000UL, 0x3fd00000UL,
+ 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL, 0x3fefd88dUL, 0x40000000UL,
+ 0xbc887df6UL, 0x00000000UL, 0x3fc00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0x3fefd88dUL,
+ 0x40000000UL, 0xbc887df6UL, 0x00000000UL, 0xbfc00000UL, 0x0e5967d5UL,
+ 0x3fac1d1fUL, 0xcff75cb0UL, 0x3fef6297UL, 0x20000000UL, 0x3c756217UL,
+ 0x00000000UL, 0xbfd00000UL, 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL,
+ 0x3fee9f41UL, 0xe0000000UL, 0x3c8760b1UL, 0x00000000UL, 0xbfd00000UL,
+ 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL, 0x3fed906bUL, 0x20000000UL,
+ 0x3c7457e6UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL, 0x3f9d4a2cUL,
+ 0xf180bdb1UL, 0x3fec38b2UL, 0x80000000UL, 0xbc76e0b1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0x3fea9b66UL,
+ 0xe0000000UL, 0x3c39f630UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL,
+ 0xbfc133ccUL, 0x6b151741UL, 0x3fe8bc80UL, 0x20000000UL, 0xbc82c5e1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL,
+ 0x3fe6a09eUL, 0x20000000UL, 0xbc8bdd34UL, 0x00000000UL, 0xbfe00000UL,
+ 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL, 0x3fe44cf3UL, 0x20000000UL,
+ 0x3c68076aUL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL, 0x3fc59267UL,
+ 0x39ae68c8UL, 0x3fe1c73bUL, 0x20000000UL, 0x3c8b25ddUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0x3fde2b5dUL,
+ 0x20000000UL, 0x3c5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL,
+ 0x3fb37ca1UL, 0xa6aea963UL, 0x3fd87de2UL, 0xe0000000UL, 0xbc672cedUL,
+ 0x00000000UL, 0xbff00000UL, 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL,
+ 0x3fd29406UL, 0xa0000000UL, 0xbc75d28dUL, 0x00000000UL, 0xbff00000UL,
+ 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL, 0x3fc8f8b8UL, 0xc0000000UL,
+ 0xbc626d19UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL, 0x3f73b92eUL,
+ 0xbc29b42cUL, 0x3fb917a6UL, 0xe0000000UL, 0xbc3e2718UL, 0x00000000UL,
+ 0xbff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x176d6d31UL,
+ 0x3f73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0xbff00000UL, 0x011469fbUL, 0x3f93ad06UL, 0x3c69a60bUL,
+ 0xbfc8f8b8UL, 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0xbff00000UL,
+ 0x939d225aUL, 0x3fa60beaUL, 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL,
+ 0x3c75d28dUL, 0x00000000UL, 0xbff00000UL, 0x866b95cfUL, 0x3fb37ca1UL,
+ 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL, 0x3c672cedUL, 0x00000000UL,
+ 0xbff00000UL, 0x73fa1279UL, 0x3fbe3a68UL, 0x3806f63bUL, 0xbfde2b5dUL,
+ 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0xbff00000UL, 0x5bc57974UL,
+ 0x3fc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0xbff00000UL, 0x53aba2fdUL, 0x3fcd0dfeUL, 0x25091dd6UL,
+ 0xbfe44cf3UL, 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0xbff00000UL,
+ 0x99fcef32UL, 0xbfca8279UL, 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL,
+ 0x3c8bdd34UL, 0x00000000UL, 0xbfe00000UL, 0x94247758UL, 0xbfc133ccUL,
+ 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL, 0x3c82c5e1UL, 0x00000000UL,
+ 0xbfe00000UL, 0x9ae68c87UL, 0xbfac73b3UL, 0x290ea1a3UL, 0xbfea9b66UL,
+ 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0xbfe00000UL, 0x7f909c4eUL,
+ 0x3f9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0xbfe00000UL, 0x65455a75UL, 0x3fbe0875UL, 0xcf328d46UL,
+ 0xbfed906bUL, 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0xbfe00000UL,
+ 0x76acf82dUL, 0xbfa4a031UL, 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL,
+ 0xbc8760b1UL, 0x00000000UL, 0xbfd00000UL, 0x0e5967d5UL, 0x3fac1d1fUL,
+ 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL, 0xbc756217UL, 0x00000000UL,
+ 0xbfd00000UL, 0x0f592f50UL, 0x3f9ba165UL, 0xa3d12526UL, 0xbfefd88dUL,
+ 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0xbfc00000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0xbff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x0f592f50UL, 0xbf9ba165UL, 0xa3d12526UL,
+ 0xbfefd88dUL, 0x40000000UL, 0x3c887df6UL, 0x00000000UL, 0x3fc00000UL,
+ 0x0e5967d5UL, 0xbfac1d1fUL, 0xcff75cb0UL, 0xbfef6297UL, 0x20000000UL,
+ 0xbc756217UL, 0x00000000UL, 0x3fd00000UL, 0x76acf82dUL, 0x3fa4a031UL,
+ 0x56c62ddaUL, 0xbfee9f41UL, 0xe0000000UL, 0xbc8760b1UL, 0x00000000UL,
+ 0x3fd00000UL, 0x65455a75UL, 0xbfbe0875UL, 0xcf328d46UL, 0xbfed906bUL,
+ 0x20000000UL, 0xbc7457e6UL, 0x00000000UL, 0x3fe00000UL, 0x7f909c4eUL,
+ 0xbf9d4a2cUL, 0xf180bdb1UL, 0xbfec38b2UL, 0x80000000UL, 0x3c76e0b1UL,
+ 0x00000000UL, 0x3fe00000UL, 0x9ae68c87UL, 0x3fac73b3UL, 0x290ea1a3UL,
+ 0xbfea9b66UL, 0xe0000000UL, 0xbc39f630UL, 0x00000000UL, 0x3fe00000UL,
+ 0x94247758UL, 0x3fc133ccUL, 0x6b151741UL, 0xbfe8bc80UL, 0x20000000UL,
+ 0x3c82c5e1UL, 0x00000000UL, 0x3fe00000UL, 0x99fcef32UL, 0x3fca8279UL,
+ 0x667f3bcdUL, 0xbfe6a09eUL, 0x20000000UL, 0x3c8bdd34UL, 0x00000000UL,
+ 0x3fe00000UL, 0x53aba2fdUL, 0xbfcd0dfeUL, 0x25091dd6UL, 0xbfe44cf3UL,
+ 0x20000000UL, 0xbc68076aUL, 0x00000000UL, 0x3ff00000UL, 0x5bc57974UL,
+ 0xbfc59267UL, 0x39ae68c8UL, 0xbfe1c73bUL, 0x20000000UL, 0xbc8b25ddUL,
+ 0x00000000UL, 0x3ff00000UL, 0x73fa1279UL, 0xbfbe3a68UL, 0x3806f63bUL,
+ 0xbfde2b5dUL, 0x20000000UL, 0xbc5e0d89UL, 0x00000000UL, 0x3ff00000UL,
+ 0x866b95cfUL, 0xbfb37ca1UL, 0xa6aea963UL, 0xbfd87de2UL, 0xe0000000UL,
+ 0x3c672cedUL, 0x00000000UL, 0x3ff00000UL, 0x939d225aUL, 0xbfa60beaUL,
+ 0x2ed59f06UL, 0xbfd29406UL, 0xa0000000UL, 0x3c75d28dUL, 0x00000000UL,
+ 0x3ff00000UL, 0x011469fbUL, 0xbf93ad06UL, 0x3c69a60bUL, 0xbfc8f8b8UL,
+ 0xc0000000UL, 0x3c626d19UL, 0x00000000UL, 0x3ff00000UL, 0x176d6d31UL,
+ 0xbf73b92eUL, 0xbc29b42cUL, 0xbfb917a6UL, 0xe0000000UL, 0x3c3e2718UL,
+ 0x00000000UL, 0x3ff00000UL, 0x55555555UL, 0xbfc55555UL, 0x00000000UL,
+ 0xbfe00000UL, 0x11111111UL, 0x3f811111UL, 0x55555555UL, 0x3fa55555UL,
+ 0x1a01a01aUL, 0xbf2a01a0UL, 0x16c16c17UL, 0xbf56c16cUL, 0xa556c734UL,
+ 0x3ec71de3UL, 0x1a01a01aUL, 0x3efa01a0UL, 0x1a600000UL, 0x3d90b461UL,
+ 0x1a600000UL, 0x3d90b461UL, 0x54400000UL, 0x3fb921fbUL, 0x00000000UL,
+ 0x00000000UL, 0x2e037073UL, 0x3b63198aUL, 0x00000000UL, 0x00000000UL,
+ 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x43380000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
+ 0x00000000UL, 0xffffffffUL, 0x3fefffffUL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x80000000UL, 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x3fe00000UL,
+ 0x00000000UL, 0x3fe00000UL
+};
+
+void MacroAssembler::fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ebx, Register edx) {
+
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, start;
+ assert_different_registers(eax, ebx, edx);
+ address static_const_table_sin = (address)_static_const_table_sin;
+
+ bind(start);
+ subl(rsp, 120);
+ movl(Address(rsp, 56), ebx);
+ lea(ebx, ExternalAddress(static_const_table_sin));
+ movsd(xmm0, Address(rsp, 128));
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ subl(eax, 12336);
+ cmpl(eax, 4293);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
+ movsd(xmm1, Address(ebx, 2160));
+ mulsd(xmm1, xmm0);
+ movsd(xmm5, Address(ebx, 2272));
+ movdqu(xmm4, Address(ebx, 2256));
+ pand(xmm4, xmm0);
+ por(xmm5, xmm4);
+ movsd(xmm3, Address(ebx, 2128));
+ movdqu(xmm2, Address(ebx, 2112));
+ addpd(xmm1, xmm5);
+ cvttsd2sil(edx, xmm1);
+ cvtsi2sdl(xmm1, edx);
+ mulsd(xmm3, xmm1);
+ unpcklpd(xmm1, xmm1);
+ addl(edx, 1865216);
+ movdqu(xmm4, xmm0);
+ andl(edx, 63);
+ movdqu(xmm5, Address(ebx, 2096));
+ lea(eax, Address(ebx, 0));
+ shll(edx, 5);
+ addl(eax, edx);
+ mulpd(xmm2, xmm1);
+ subsd(xmm0, xmm3);
+ mulsd(xmm1, Address(ebx, 2144));
+ subsd(xmm4, xmm3);
+ movsd(xmm7, Address(eax, 8));
+ unpcklpd(xmm0, xmm0);
+ movapd(xmm3, xmm4);
+ subsd(xmm4, xmm2);
+ mulpd(xmm5, xmm0);
+ subpd(xmm0, xmm2);
+ movdqu(xmm6, Address(ebx, 2064));
+ mulsd(xmm7, xmm4);
+ subsd(xmm3, xmm4);
+ mulpd(xmm5, xmm0);
+ mulpd(xmm0, xmm0);
+ subsd(xmm3, xmm2);
+ movdqu(xmm2, Address(eax, 0));
+ subsd(xmm1, xmm3);
+ movsd(xmm3, Address(eax, 24));
+ addsd(xmm2, xmm3);
+ subsd(xmm7, xmm2);
+ mulsd(xmm2, xmm4);
+ mulpd(xmm6, xmm0);
+ mulsd(xmm3, xmm4);
+ mulpd(xmm2, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm5, Address(ebx, 2080));
+ mulsd(xmm4, Address(eax, 0));
+ addpd(xmm6, Address(ebx, 2048));
+ mulpd(xmm5, xmm0);
+ movapd(xmm0, xmm3);
+ addsd(xmm3, Address(eax, 8));
+ mulpd(xmm1, xmm7);
+ movapd(xmm7, xmm4);
+ addsd(xmm4, xmm3);
+ addpd(xmm6, xmm5);
+ movsd(xmm5, Address(eax, 8));
+ subsd(xmm5, xmm3);
+ subsd(xmm3, xmm4);
+ addsd(xmm1, Address(eax, 16));
+ mulpd(xmm6, xmm2);
+ addsd(xmm5, xmm0);
+ addsd(xmm3, xmm7);
+ addsd(xmm1, xmm5);
+ addsd(xmm1, xmm3);
+ addsd(xmm1, xmm6);
+ unpckhpd(xmm6, xmm6);
+ addsd(xmm1, xmm6);
+ addsd(xmm4, xmm1);
+ movsd(Address(rsp, 0), xmm4);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
+ shrl(eax, 4);
+ cmpl(eax, 268434685);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_3_0_2);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_3_0_2);
+ movsd(xmm3, Address(ebx, 2192));
+ mulsd(xmm3, xmm0);
+ subsd(xmm3, xmm0);
+ mulsd(xmm3, Address(ebx, 2208));
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movl(eax, Address(rsp, 132));
+ andl(eax, 2146435072);
+ cmpl(eax, 2146435072);
+ jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
+ subl(rsp, 32);
+ movsd(Address(rsp, 0), xmm0);
+ lea(eax, Address(rsp, 40));
+ movl(Address(rsp, 8), eax);
+ movl(eax, 2);
+ movl(Address(rsp, 12), eax);
+ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_sin_cos_huge())));
+ addl(rsp, 32);
+ fld_d(Address(rsp, 16));
+ jmp(L_2TAG_PACKET_1_0_2);
+ bind(L_2TAG_PACKET_4_0_2);
+ fld_d(Address(rsp, 128));
+ fmul_d(Address(ebx, 2240));
+ bind(L_2TAG_PACKET_1_0_2);
+ movl(ebx, Address(rsp, 56));
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86_tan.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,2144 @@
+/*
+* Copyright (c) 2016, Intel Corporation.
+* Intel Math Library (LIBM) Source Code
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*
+*/
+
+#include "precompiled.hpp"
+#include "asm/assembler.hpp"
+#include "asm/assembler.inline.hpp"
+#include "runtime/stubRoutines.hpp"
+#include "macroAssembler_x86.hpp"
+
+#ifdef _MSC_VER
+#define ALIGNED_(x) __declspec(align(x))
+#else
+#define ALIGNED_(x) __attribute__ ((aligned(x)))
+#endif
+
+/******************************************************************************/
+// ALGORITHM DESCRIPTION - TAN()
+// ---------------------
+//
+// Polynomials coefficients and other constants.
+//
+// Note that in this algorithm, there is a different polynomial for
+// each breakpoint, so there are 32 sets of polynomial coefficients
+// as well as 32 instances of the other constants.
+//
+// The polynomial coefficients and constants are offset from the start
+// of the main block as follows:
+//
+// 0: c8 | c0
+// 16: c9 | c1
+// 32: c10 | c2
+// 48: c11 | c3
+// 64: c12 | c4
+// 80: c13 | c5
+// 96: c14 | c6
+// 112: c15 | c7
+// 128: T_hi
+// 136: T_lo
+// 144: Sigma
+// 152: T_hl
+// 160: Tau
+// 168: Mask
+// 176: (end of block)
+//
+// The total table size is therefore 5632 bytes.
+//
+// Note that c0 and c1 are always zero. We could try storing
+// other constants here, and just loading the low part of the
+// SIMD register in these cases, after ensuring the high part
+// is zero.
+//
+// The higher terms of the polynomial are computed in the *low*
+// part of the SIMD register. This is so we can overlap the
+// multiplication by r^8 and the unpacking of the other part.
+//
+// The constants are:
+// T_hi + T_lo = accurate constant term in power series
+// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
+// Tau = multiplier for the reciprocal, always -1 or 0
+//
+// The basic reconstruction formula using these constants is:
+//
+// High = tau * recip_hi + t_hi
+// Med = (sgn * r + t_hl * r)_hi
+// Low = (sgn * r + t_hl * r)_lo +
+// tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
+//
+// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
+//
+// (c0 = c1 = 0, but using them keeps SIMD regularity)
+//
+// We then do a compensated sum High + Med, add the low parts together
+// and then do the final sum.
+//
+// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
+// modulo pi/2
+//
+// Special cases:
+// tan(NaN) = quiet NaN, and raise invalid exception
+// tan(INF) = NaN and raise invalid exception
+// tan(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#ifdef _LP64
+// The 64 bit code is at most SSE2 compliant
+ALIGNED_(16) juint _ONEHALF_tan[] =
+{
+ 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+};
+
+ALIGNED_(16) juint _MUL16[] =
+{
+ 0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
+};
+
+ALIGNED_(16) juint _sign_mask_tan[] =
+{
+ 0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
+};
+
+ALIGNED_(16) juint _PI32INV_tan[] =
+{
+ 0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
+};
+
+ALIGNED_(16) juint _P_1_tan[] =
+{
+ 0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
+};
+
+ALIGNED_(16) juint _P_2_tan[] =
+{
+ 0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
+};
+
+ALIGNED_(16) juint _P_3_tan[] =
+{
+ 0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
+};
+
+ALIGNED_(16) juint _Ctable_tan[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x882c10faUL,
+ 0x3f9664f4UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x55e6c23dUL, 0x3f8226e3UL, 0x55555555UL,
+ 0x3fd55555UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x0e157de0UL, 0x3f6d6d3dUL, 0x11111111UL, 0x3fc11111UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x452b75e3UL, 0x3f57da36UL,
+ 0x1ba1ba1cUL, 0x3faba1baUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
+ 0x3f953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
+ 0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0x3f85ad63UL, 0xdc230b9bUL,
+ 0x3fb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
+ 0x77bb08baUL, 0x3f757c85UL, 0xb6247521UL, 0x3fb1381eUL, 0x5922170cUL,
+ 0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0x3f64e391UL,
+ 0x3e666320UL, 0x3fa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
+ 0x3fafa8aeUL, 0x8c5b2da2UL, 0x3fb936bbUL, 0x4e88f7a5UL, 0x3c587d05UL,
+ 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x5a279ea3UL, 0x3faa3407UL,
+ 0x00000000UL, 0x00000000UL, 0x432d65faUL, 0x3fa70153UL, 0x00000000UL,
+ 0x00000000UL, 0x891a4602UL, 0x3f9d03efUL, 0xd62ca5f8UL, 0x3fca77d9UL,
+ 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL, 0x3fd8cf51UL, 0xb58fd909UL,
+ 0x3f8f88e3UL, 0x01771ceaUL, 0x3fc2b154UL, 0xf3562f8eUL, 0x3f888f57UL,
+ 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL, 0x3f80f44cUL, 0x214368e9UL,
+ 0x3fb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL, 0x172dbbf0UL, 0x3fb6cb8eUL,
+ 0xe0553158UL, 0x3fc975f5UL, 0x593fe814UL, 0x3c2ef5d3UL, 0x00000000UL,
+ 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x9314533eUL, 0x3fbb8ec5UL, 0x00000000UL,
+ 0x00000000UL, 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL,
+ 0xdcb427fdUL, 0x3fb13950UL, 0xd87ab0bbUL, 0x3fd5335eUL, 0xce0ae8a5UL,
+ 0x3fabb382UL, 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0x3fa552f1UL,
+ 0x59f21a6dUL, 0x3fd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL,
+ 0x3fd0576cUL, 0x8f2c2950UL, 0x3f9a4898UL, 0xc0b3f22cUL, 0x3fc59462UL,
+ 0x1883a4b8UL, 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL,
+ 0x3fd36a08UL, 0x1dce993dUL, 0xbc6d704dUL, 0x00000000UL, 0x3ff00000UL,
+ 0x2b82ab63UL, 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x56f37042UL, 0x3fccfc56UL, 0x00000000UL, 0x00000000UL,
+ 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL, 0x3d0e7c5dUL,
+ 0x3fc50533UL, 0x9bed9b2eUL, 0x3fdf0ed9UL, 0x5fe7c47cUL, 0x3fc1f250UL,
+ 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0x3fbe5c71UL, 0x86362c20UL,
+ 0x3fda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL, 0x3fd911bdUL,
+ 0xb56658beUL, 0x3fb5e4c7UL, 0x93a2fd76UL, 0x3fd3c092UL, 0xda271794UL,
+ 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL, 0x3fda8279UL,
+ 0xb68c1467UL, 0x3c708b2fUL, 0x00000000UL, 0x3ff00000UL, 0x980c4337UL,
+ 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0xcc03e501UL, 0x3fdff10fUL, 0x00000000UL, 0x00000000UL, 0x44a4e845UL,
+ 0x3fddb63bUL, 0x00000000UL, 0x00000000UL, 0x3768ad9fUL, 0x3fdb72a4UL,
+ 0x3dd01ccaUL, 0x3fe5fdb9UL, 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL,
+ 0x3fe977f9UL, 0xd013b3abUL, 0x3fd78ca3UL, 0xbf0bf914UL, 0x3fe4f192UL,
+ 0x4d53e730UL, 0x3fd5d060UL, 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL,
+ 0x3fd4322aUL, 0x5936a835UL, 0x3fe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL,
+ 0xef478605UL, 0x3fe1659eUL, 0x190834ecUL, 0x3fe11ab7UL, 0xcdb625eaUL,
+ 0xbc8e564bUL, 0x00000000UL, 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
+ 0x3ff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
+ 0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0x3ff3972eUL, 0xe93463bdUL,
+ 0x3feeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
+ 0xa04e8ea3UL, 0x3ff4541aUL, 0x386accd3UL, 0x3ff1369eUL, 0x222a66ddUL,
+ 0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0x3ff5178fUL,
+ 0xddaa0031UL, 0x3ff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
+ 0x3ff29311UL, 0x2ab7f990UL, 0x3fe561b8UL, 0x209c7df1UL, 0x3c87a8c5UL,
+ 0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc7ab4d5aUL, 0x40085e24UL,
+ 0x00000000UL, 0x00000000UL, 0xe93ea75dUL, 0x400b963dUL, 0x00000000UL,
+ 0x00000000UL, 0x94a7f25aUL, 0x400f37e2UL, 0x4b6261cbUL, 0x3ff5f984UL,
+ 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL, 0x3ffaf5a5UL, 0x7f2ce8e3UL,
+ 0x4013fe8bUL, 0xfe8e54faUL, 0x3ffd7334UL, 0x670d618dUL, 0x4016a10cUL,
+ 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL, 0x40199c5fUL, 0x697d6eceUL,
+ 0x4003006eUL, 0x83298b82UL, 0x401cfc4dUL, 0x19d490d6UL, 0x40058c19UL,
+ 0x2ae42850UL, 0x3fea4300UL, 0x118e20e6UL, 0xbc7a6db8UL, 0x00000000UL,
+ 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x65965966UL, 0x40219659UL, 0x00000000UL,
+ 0x00000000UL, 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL,
+ 0x83cd3723UL, 0x402c8342UL, 0x00000000UL, 0x40000000UL, 0x55e6c23dUL,
+ 0x403226e3UL, 0x55555555UL, 0x40055555UL, 0x34451939UL, 0x40371c96UL,
+ 0xaaaaaaabUL, 0x400aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL,
+ 0x40111111UL, 0xa738201fUL, 0x4042bbceUL, 0x05b05b06UL, 0x4015b05bUL,
+ 0x452b75e3UL, 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x4f48b8d3UL, 0xbf33eaf9UL, 0x00000000UL, 0x00000000UL,
+ 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL, 0xd0258911UL,
+ 0xbf0abaf3UL, 0x23e49fe9UL, 0xbfab5a8cUL, 0x2d53222eUL, 0x3ef60d15UL,
+ 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0xbee1d3b5UL, 0xdbf93b8eUL,
+ 0xbf84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL, 0x3f743924UL,
+ 0x794a8297UL, 0xbeb7b7b9UL, 0xe015f797UL, 0xbf5d41f5UL, 0xe41a4a56UL,
+ 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL, 0xbfce49ceUL,
+ 0x8c743719UL, 0x3d1eb860UL, 0x00000000UL, 0x00000000UL, 0x1b4863cfUL,
+ 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x535ad890UL, 0xbf2b9320UL, 0x00000000UL, 0x00000000UL, 0x018fdf1fUL,
+ 0x3f16d61dUL, 0x00000000UL, 0x00000000UL, 0x0359f1beUL, 0xbf0139e4UL,
+ 0xa4317c6dUL, 0xbfa67e17UL, 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL,
+ 0x3f9f455bUL, 0x51ccf238UL, 0xbed55317UL, 0xf437b9acUL, 0xbf804beeUL,
+ 0xc791a2b5UL, 0x3ec0e993UL, 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL,
+ 0xbeaa48a2UL, 0x0a268358UL, 0xbf55a443UL, 0xdfd978e4UL, 0x3e94b61fUL,
+ 0xd7767a58UL, 0x3f431806UL, 0x2aea0000UL, 0xbfc9bbe8UL, 0x7723ea61UL,
+ 0xbd3a2369UL, 0x00000000UL, 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
+ 0xbf231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
+ 0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0xbef66191UL, 0x848a46c6UL,
+ 0xbfa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
+ 0xfdd299efUL, 0xbec9dd1aUL, 0x3f8dbaafUL, 0xbf793363UL, 0x309fc6eaUL,
+ 0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0xbe9dae11UL,
+ 0x3e5c67b3UL, 0xbf4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
+ 0x3f3d1eb1UL, 0x29cfc000UL, 0xbfc549ceUL, 0xbf159358UL, 0xbd397b33UL,
+ 0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x7d98a556UL, 0xbf1a3958UL,
+ 0x00000000UL, 0x00000000UL, 0x9d88dc01UL, 0x3f0704c2UL, 0x00000000UL,
+ 0x00000000UL, 0x73742a2bUL, 0xbeed054aUL, 0x58844587UL, 0xbf9c2a13UL,
+ 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL, 0x3f9a48f4UL, 0xa8dc9888UL,
+ 0xbebf8939UL, 0xaad4b5b8UL, 0xbf72f746UL, 0x9102efa1UL, 0x3ea88f82UL,
+ 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL, 0xbe90f456UL, 0x741fb4edUL,
+ 0xbf46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL, 0xca89ff3fUL, 0x3f36db70UL,
+ 0xa8a2a000UL, 0xbfc0ee13UL, 0x3da24be1UL, 0xbd338b9fUL, 0x00000000UL,
+ 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0x1a154b97UL, 0xbf116b01UL, 0x00000000UL,
+ 0x00000000UL, 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL,
+ 0xb93820c8UL, 0xbee264d4UL, 0xbb6cbb18UL, 0xbf94ab8cUL, 0x888d4d92UL,
+ 0x3ed0568bUL, 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0xbeb2f950UL,
+ 0x22cf9f74UL, 0xbf6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL,
+ 0x3f64aad7UL, 0x637b73afUL, 0xbe83487cUL, 0xe522591aUL, 0xbf3fc092UL,
+ 0xa158e8bcUL, 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL,
+ 0xbfb9477fUL, 0xc2c2d2bcUL, 0xbd135ef9UL, 0x00000000UL, 0x00000000UL,
+ 0xf2fdb123UL, 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0xc41acb64UL, 0xbf05448dUL, 0x00000000UL, 0x00000000UL,
+ 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL, 0x9e42962dUL,
+ 0xbed5aea5UL, 0x2579f8efUL, 0xbf8b2398UL, 0x288a1ed9UL, 0x3ec81441UL,
+ 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0xbea57cd3UL, 0x5766336fUL,
+ 0xbf617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL, 0x3f62c646UL,
+ 0x6b8fb29cUL, 0xbe74e3a3UL, 0xdc4c0409UL, 0xbf33f952UL, 0x9bffe365UL,
+ 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL, 0xbfb0cc62UL,
+ 0x016b907fUL, 0xbd119cbcUL, 0x00000000UL, 0x00000000UL, 0xe6b9d8faUL,
+ 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x5daf22a6UL, 0xbef429d7UL, 0x00000000UL, 0x00000000UL, 0x06bca545UL,
+ 0x3ef7a27dUL, 0x00000000UL, 0x00000000UL, 0x7211c19aUL, 0xbec41c3eUL,
+ 0x956ed53eUL, 0xbf7ae3f4UL, 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL,
+ 0x3f96f713UL, 0x36661e6cUL, 0xbe936e09UL, 0x506f9381UL, 0xbf5122e8UL,
+ 0xcb6dd43fUL, 0x3e9041b9UL, 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL,
+ 0xbe625a8aUL, 0xe5a0e9dcUL, 0xbf23499dUL, 0x110384ddUL, 0x3e5b1c2cUL,
+ 0x68d43db6UL, 0x3f2cb899UL, 0x6ecac000UL, 0xbfa0c414UL, 0xcd7dd58cUL,
+ 0x3d13500fUL, 0x00000000UL, 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2bf70ebeUL, 0x3ef66a8fUL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0xd644267fUL, 0x3ec22805UL, 0x16c16c17UL, 0x3f96c16cUL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc4e09162UL,
+ 0x3e8d6db2UL, 0xbc011567UL, 0x3f61566aUL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x1f79955cUL, 0x3e57da4eUL, 0x9334ef0bUL,
+ 0x3f2bbd77UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x55555555UL, 0x3fd55555UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x5daf22a6UL, 0x3ef429d7UL,
+ 0x00000000UL, 0x00000000UL, 0x06bca545UL, 0x3ef7a27dUL, 0x00000000UL,
+ 0x00000000UL, 0x7211c19aUL, 0x3ec41c3eUL, 0x956ed53eUL, 0x3f7ae3f4UL,
+ 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL, 0x3f96f713UL, 0x36661e6cUL,
+ 0x3e936e09UL, 0x506f9381UL, 0x3f5122e8UL, 0xcb6dd43fUL, 0x3e9041b9UL,
+ 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL, 0x3e625a8aUL, 0xe5a0e9dcUL,
+ 0x3f23499dUL, 0x110384ddUL, 0x3e5b1c2cUL, 0x68d43db6UL, 0x3f2cb899UL,
+ 0x6ecac000UL, 0x3fa0c414UL, 0xcd7dd58cUL, 0xbd13500fUL, 0x00000000UL,
+ 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0xc41acb64UL, 0x3f05448dUL, 0x00000000UL,
+ 0x00000000UL, 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL,
+ 0x9e42962dUL, 0x3ed5aea5UL, 0x2579f8efUL, 0x3f8b2398UL, 0x288a1ed9UL,
+ 0x3ec81441UL, 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0x3ea57cd3UL,
+ 0x5766336fUL, 0x3f617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL,
+ 0x3f62c646UL, 0x6b8fb29cUL, 0x3e74e3a3UL, 0xdc4c0409UL, 0x3f33f952UL,
+ 0x9bffe365UL, 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL,
+ 0x3fb0cc62UL, 0x016b907fUL, 0x3d119cbcUL, 0x00000000UL, 0x00000000UL,
+ 0xe6b9d8faUL, 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0x1a154b97UL, 0x3f116b01UL, 0x00000000UL, 0x00000000UL,
+ 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL, 0xb93820c8UL,
+ 0x3ee264d4UL, 0xbb6cbb18UL, 0x3f94ab8cUL, 0x888d4d92UL, 0x3ed0568bUL,
+ 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0x3eb2f950UL, 0x22cf9f74UL,
+ 0x3f6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL, 0x3f64aad7UL,
+ 0x637b73afUL, 0x3e83487cUL, 0xe522591aUL, 0x3f3fc092UL, 0xa158e8bcUL,
+ 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL, 0x3fb9477fUL,
+ 0xc2c2d2bcUL, 0x3d135ef9UL, 0x00000000UL, 0x00000000UL, 0xf2fdb123UL,
+ 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x7d98a556UL, 0x3f1a3958UL, 0x00000000UL, 0x00000000UL, 0x9d88dc01UL,
+ 0x3f0704c2UL, 0x00000000UL, 0x00000000UL, 0x73742a2bUL, 0x3eed054aUL,
+ 0x58844587UL, 0x3f9c2a13UL, 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL,
+ 0x3f9a48f4UL, 0xa8dc9888UL, 0x3ebf8939UL, 0xaad4b5b8UL, 0x3f72f746UL,
+ 0x9102efa1UL, 0x3ea88f82UL, 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL,
+ 0x3e90f456UL, 0x741fb4edUL, 0x3f46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL,
+ 0xca89ff3fUL, 0x3f36db70UL, 0xa8a2a000UL, 0x3fc0ee13UL, 0x3da24be1UL,
+ 0x3d338b9fUL, 0x00000000UL, 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
+ 0x3f231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
+ 0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0x3ef66191UL, 0x848a46c6UL,
+ 0x3fa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
+ 0xfdd299efUL, 0x3ec9dd1aUL, 0x3f8dbaafUL, 0x3f793363UL, 0x309fc6eaUL,
+ 0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0x3e9dae11UL,
+ 0x3e5c67b3UL, 0x3f4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
+ 0x3f3d1eb1UL, 0x29cfc000UL, 0x3fc549ceUL, 0xbf159358UL, 0x3d397b33UL,
+ 0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x535ad890UL, 0x3f2b9320UL,
+ 0x00000000UL, 0x00000000UL, 0x018fdf1fUL, 0x3f16d61dUL, 0x00000000UL,
+ 0x00000000UL, 0x0359f1beUL, 0x3f0139e4UL, 0xa4317c6dUL, 0x3fa67e17UL,
+ 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL, 0x3f9f455bUL, 0x51ccf238UL,
+ 0x3ed55317UL, 0xf437b9acUL, 0x3f804beeUL, 0xc791a2b5UL, 0x3ec0e993UL,
+ 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL, 0x3eaa48a2UL, 0x0a268358UL,
+ 0x3f55a443UL, 0xdfd978e4UL, 0x3e94b61fUL, 0xd7767a58UL, 0x3f431806UL,
+ 0x2aea0000UL, 0x3fc9bbe8UL, 0x7723ea61UL, 0x3d3a2369UL, 0x00000000UL,
+ 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0x4f48b8d3UL, 0x3f33eaf9UL, 0x00000000UL,
+ 0x00000000UL, 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL,
+ 0xd0258911UL, 0x3f0abaf3UL, 0x23e49fe9UL, 0x3fab5a8cUL, 0x2d53222eUL,
+ 0x3ef60d15UL, 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0x3ee1d3b5UL,
+ 0xdbf93b8eUL, 0x3f84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL,
+ 0x3f743924UL, 0x794a8297UL, 0x3eb7b7b9UL, 0xe015f797UL, 0x3f5d41f5UL,
+ 0xe41a4a56UL, 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL,
+ 0x3fce49ceUL, 0x8c743719UL, 0xbd1eb860UL, 0x00000000UL, 0x00000000UL,
+ 0x1b4863cfUL, 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0x65965966UL, 0xc0219659UL, 0x00000000UL, 0x00000000UL,
+ 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL, 0x83cd3723UL,
+ 0xc02c8342UL, 0x00000000UL, 0xc0000000UL, 0x55e6c23dUL, 0x403226e3UL,
+ 0x55555555UL, 0x40055555UL, 0x34451939UL, 0xc0371c96UL, 0xaaaaaaabUL,
+ 0xc00aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL, 0x40111111UL,
+ 0xa738201fUL, 0xc042bbceUL, 0x05b05b06UL, 0xc015b05bUL, 0x452b75e3UL,
+ 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL, 0xbff00000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0xc7ab4d5aUL, 0xc0085e24UL, 0x00000000UL, 0x00000000UL, 0xe93ea75dUL,
+ 0x400b963dUL, 0x00000000UL, 0x00000000UL, 0x94a7f25aUL, 0xc00f37e2UL,
+ 0x4b6261cbUL, 0xbff5f984UL, 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL,
+ 0x3ffaf5a5UL, 0x7f2ce8e3UL, 0xc013fe8bUL, 0xfe8e54faUL, 0xbffd7334UL,
+ 0x670d618dUL, 0x4016a10cUL, 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL,
+ 0xc0199c5fUL, 0x697d6eceUL, 0xc003006eUL, 0x83298b82UL, 0x401cfc4dUL,
+ 0x19d490d6UL, 0x40058c19UL, 0x2ae42850UL, 0xbfea4300UL, 0x118e20e6UL,
+ 0x3c7a6db8UL, 0x00000000UL, 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
+ 0xbff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
+ 0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0xbff3972eUL, 0xe93463bdUL,
+ 0xbfeeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
+ 0xa04e8ea3UL, 0xbff4541aUL, 0x386accd3UL, 0xbff1369eUL, 0x222a66ddUL,
+ 0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0xbff5178fUL,
+ 0xddaa0031UL, 0xbff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
+ 0x3ff29311UL, 0x2ab7f990UL, 0xbfe561b8UL, 0x209c7df1UL, 0xbc87a8c5UL,
+ 0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xcc03e501UL, 0xbfdff10fUL,
+ 0x00000000UL, 0x00000000UL, 0x44a4e845UL, 0x3fddb63bUL, 0x00000000UL,
+ 0x00000000UL, 0x3768ad9fUL, 0xbfdb72a4UL, 0x3dd01ccaUL, 0xbfe5fdb9UL,
+ 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL, 0x3fe977f9UL, 0xd013b3abUL,
+ 0xbfd78ca3UL, 0xbf0bf914UL, 0xbfe4f192UL, 0x4d53e730UL, 0x3fd5d060UL,
+ 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL, 0xbfd4322aUL, 0x5936a835UL,
+ 0xbfe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL, 0xef478605UL, 0x3fe1659eUL,
+ 0x190834ecUL, 0xbfe11ab7UL, 0xcdb625eaUL, 0x3c8e564bUL, 0x00000000UL,
+ 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x56f37042UL, 0xbfccfc56UL, 0x00000000UL,
+ 0x00000000UL, 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL,
+ 0x3d0e7c5dUL, 0xbfc50533UL, 0x9bed9b2eUL, 0xbfdf0ed9UL, 0x5fe7c47cUL,
+ 0x3fc1f250UL, 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0xbfbe5c71UL,
+ 0x86362c20UL, 0xbfda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL,
+ 0x3fd911bdUL, 0xb56658beUL, 0xbfb5e4c7UL, 0x93a2fd76UL, 0xbfd3c092UL,
+ 0xda271794UL, 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL,
+ 0xbfda8279UL, 0xb68c1467UL, 0xbc708b2fUL, 0x00000000UL, 0x3ff00000UL,
+ 0x980c4337UL, 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x9314533eUL, 0xbfbb8ec5UL, 0x00000000UL, 0x00000000UL,
+ 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL, 0xdcb427fdUL,
+ 0xbfb13950UL, 0xd87ab0bbUL, 0xbfd5335eUL, 0xce0ae8a5UL, 0x3fabb382UL,
+ 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0xbfa552f1UL, 0x59f21a6dUL,
+ 0xbfd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL, 0x3fd0576cUL,
+ 0x8f2c2950UL, 0xbf9a4898UL, 0xc0b3f22cUL, 0xbfc59462UL, 0x1883a4b8UL,
+ 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL, 0xbfd36a08UL,
+ 0x1dce993dUL, 0x3c6d704dUL, 0x00000000UL, 0x3ff00000UL, 0x2b82ab63UL,
+ 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x5a279ea3UL, 0xbfaa3407UL, 0x00000000UL, 0x00000000UL, 0x432d65faUL,
+ 0x3fa70153UL, 0x00000000UL, 0x00000000UL, 0x891a4602UL, 0xbf9d03efUL,
+ 0xd62ca5f8UL, 0xbfca77d9UL, 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL,
+ 0x3fd8cf51UL, 0xb58fd909UL, 0xbf8f88e3UL, 0x01771ceaUL, 0xbfc2b154UL,
+ 0xf3562f8eUL, 0x3f888f57UL, 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL,
+ 0xbf80f44cUL, 0x214368e9UL, 0xbfb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL,
+ 0x172dbbf0UL, 0x3fb6cb8eUL, 0xe0553158UL, 0xbfc975f5UL, 0x593fe814UL,
+ 0xbc2ef5d3UL, 0x00000000UL, 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
+ 0xbf953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
+ 0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0xbf85ad63UL, 0xdc230b9bUL,
+ 0xbfb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
+ 0x77bb08baUL, 0xbf757c85UL, 0xb6247521UL, 0xbfb1381eUL, 0x5922170cUL,
+ 0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0xbf64e391UL,
+ 0x3e666320UL, 0xbfa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
+ 0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
+ 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint _MASK_35_tan[] =
+{
+ 0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
+};
+
+ALIGNED_(16) juint _Q_11_tan[] =
+{
+ 0xb8fe4d77UL, 0x3f82609aUL
+};
+
+ALIGNED_(16) juint _Q_9_tan[] =
+{
+ 0xbf847a43UL, 0x3f9664a0UL
+};
+
+ALIGNED_(16) juint _Q_7_tan[] =
+{
+ 0x52c4c8abUL, 0x3faba1baUL
+};
+
+ALIGNED_(16) juint _Q_5_tan[] =
+{
+ 0x11092746UL, 0x3fc11111UL
+};
+
+ALIGNED_(16) juint _Q_3_tan[] =
+{
+ 0x55555612UL, 0x3fd55555UL
+};
+
+ALIGNED_(16) juint _PI_INV_TABLE_tan[] =
+{
+ 0x00000000UL, 0x00000000UL, 0xa2f9836eUL, 0x4e441529UL, 0xfc2757d1UL,
+ 0xf534ddc0UL, 0xdb629599UL, 0x3c439041UL, 0xfe5163abUL, 0xdebbc561UL,
+ 0xb7246e3aUL, 0x424dd2e0UL, 0x06492eeaUL, 0x09d1921cUL, 0xfe1deb1cUL,
+ 0xb129a73eUL, 0xe88235f5UL, 0x2ebb4484UL, 0xe99c7026UL, 0xb45f7e41UL,
+ 0x3991d639UL, 0x835339f4UL, 0x9c845f8bUL, 0xbdf9283bUL, 0x1ff897ffUL,
+ 0xde05980fUL, 0xef2f118bUL, 0x5a0a6d1fUL, 0x6d367ecfUL, 0x27cb09b7UL,
+ 0x4f463f66UL, 0x9e5fea2dUL, 0x7527bac7UL, 0xebe5f17bUL, 0x3d0739f7UL,
+ 0x8a5292eaUL, 0x6bfb5fb1UL, 0x1f8d5d08UL, 0x56033046UL, 0xfc7b6babUL,
+ 0xf0cfbc21UL
+};
+
+ALIGNED_(8) juint _PI_4_tan[] =
+{
+ 0x00000000UL, 0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
+};
+
+ALIGNED_(8) juint _QQ_2_tan[] =
+{
+ 0x676733afUL, 0x3d32e7b9UL
+};
+
+ALIGNED_(8) juint _ONE_tan[] =
+{
+ 0x00000000UL, 0x3ff00000UL
+};
+
+ALIGNED_(8) juint _TWO_POW_55_tan[] =
+{
+ 0x00000000UL, 0x43600000UL
+};
+
+ALIGNED_(4) juint _TWO_POW_M55_tan[] =
+{
+ 0x00000000UL, 0x3c800000UL
+};
+
+ALIGNED_(4) juint _NEG_ZERO_tan[] =
+{
+ 0x00000000UL, 0x80000000UL
+};
+
+void MacroAssembler::fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register r8, Register r9, Register r10, Register r11) {
+
+ Label L_2TAG_PACKET_0_0_1, L_2TAG_PACKET_1_0_1, L_2TAG_PACKET_2_0_1, L_2TAG_PACKET_3_0_1;
+ Label L_2TAG_PACKET_4_0_1, L_2TAG_PACKET_5_0_1, L_2TAG_PACKET_6_0_1, L_2TAG_PACKET_7_0_1;
+ Label L_2TAG_PACKET_8_0_1, L_2TAG_PACKET_9_0_1, L_2TAG_PACKET_10_0_1, L_2TAG_PACKET_11_0_1;
+ Label L_2TAG_PACKET_12_0_1, L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1, B1_2, B1_3, B1_4, B1_5, start;
+
+ address ONEHALF = (address)_ONEHALF_tan;
+ address MUL16 = (address)_MUL16;
+ address sign_mask = (address)_sign_mask_tan;
+ address PI32INV = (address)_PI32INV_tan;
+ address P_1 = (address)_P_1_tan;
+ address P_2 = (address)_P_2_tan;
+ address P_3 = (address)_P_3_tan;
+ address Ctable = (address)_Ctable_tan;
+ address MASK_35 = (address)_MASK_35_tan;
+ address Q_11 = (address)_Q_11_tan;
+ address Q_9 = (address)_Q_9_tan;
+ address Q_7 = (address)_Q_7_tan;
+ address Q_5 = (address)_Q_5_tan;
+ address Q_3 = (address)_Q_3_tan;
+ address PI_INV_TABLE = (address)_PI_INV_TABLE_tan;
+ address PI_4 = (address)_PI_4_tan;
+ address QQ_2 = (address)_QQ_2_tan;
+ address ONE = (address)_ONE_tan;
+ address TWO_POW_55 = (address)_TWO_POW_55_tan;
+ address TWO_POW_M55 = (address)_TWO_POW_M55_tan;
+ address NEG_ZERO = (address)_NEG_ZERO_tan;
+
+ bind(start);
+ push(rbx);
+ subq(rsp, 16);
+ movsd(Address(rsp, 8), xmm0);
+
+ bind(B1_2);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ subl(eax, 16314);
+ cmpl(eax, 270);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
+ movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movdqu(xmm6, ExternalAddress(MUL16)); //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm4, ExternalAddress(sign_mask)); //0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
+ andpd(xmm4, xmm0);
+ movdqu(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
+ mulpd(xmm1, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ movdqu(xmm7, xmm1);
+ unpckhpd(xmm7, xmm7);
+ cvttsd2sil(edx, xmm7);
+ cvttpd2dq(xmm1, xmm1);
+ cvtdq2pd(xmm1, xmm1);
+ mulpd(xmm1, xmm6);
+ movdqu(xmm3, ExternalAddress(P_1)); //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
+ movq(xmm5, ExternalAddress(QQ_2)); //0x676733afUL, 0x3d32e7b9UL
+ addq(rdx, 469248);
+ movdqu(xmm4, ExternalAddress(P_2)); //0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
+ mulpd(xmm3, xmm1);
+ andq(rdx, 31);
+ mulsd(xmm5, xmm1);
+ movq(rcx, rdx);
+ mulpd(xmm4, xmm1);
+ shlq(rcx, 1);
+ subpd(xmm0, xmm3);
+ mulpd(xmm1, ExternalAddress(P_3)); //0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
+ addq(rdx, rcx);
+ shlq(rcx, 2);
+ addq(rdx, rcx);
+ addsd(xmm5, xmm0);
+ movdqu(xmm2, xmm0);
+ subpd(xmm0, xmm4);
+ movq(xmm6, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
+ shlq(rdx, 4);
+ lea(rax, ExternalAddress(Ctable));
+ andpd(xmm5, ExternalAddress(MASK_35)); //0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
+ movdqu(xmm3, xmm0);
+ addq(rax, rdx);
+ subpd(xmm2, xmm0);
+ unpckhpd(xmm0, xmm0);
+ divsd(xmm6, xmm5);
+ subpd(xmm2, xmm4);
+ movdqu(xmm7, Address(rax, 16));
+ subsd(xmm3, xmm5);
+ mulpd(xmm7, xmm0);
+ subpd(xmm2, xmm1);
+ movdqu(xmm1, Address(rax, 48));
+ mulpd(xmm1, xmm0);
+ movdqu(xmm4, Address(rax, 96));
+ mulpd(xmm4, xmm0);
+ addsd(xmm2, xmm3);
+ movdqu(xmm3, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm7, Address(rax, 0));
+ addpd(xmm1, Address(rax, 32));
+ mulpd(xmm1, xmm0);
+ addpd(xmm4, Address(rax, 80));
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, Address(rax, 112));
+ mulpd(xmm1, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm4, xmm1);
+ movdqu(xmm1, Address(rax, 64));
+ mulpd(xmm1, xmm0);
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, xmm3);
+ mulpd(xmm3, xmm0);
+ mulsd(xmm0, xmm0);
+ mulpd(xmm1, Address(rax, 144));
+ mulpd(xmm4, xmm3);
+ movdqu(xmm3, xmm1);
+ addpd(xmm7, xmm4);
+ movdqu(xmm4, xmm1);
+ mulsd(xmm0, xmm7);
+ unpckhpd(xmm7, xmm7);
+ addsd(xmm0, xmm7);
+ unpckhpd(xmm1, xmm1);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ movdqu(xmm4, xmm2);
+ movq(xmm7, Address(rax, 144));
+ unpckhpd(xmm2, xmm2);
+ addsd(xmm7, Address(rax, 152));
+ mulsd(xmm7, xmm2);
+ addsd(xmm7, Address(rax, 136));
+ addsd(xmm7, xmm1);
+ addsd(xmm0, xmm7);
+ movq(xmm7, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
+ mulsd(xmm4, xmm6);
+ movq(xmm2, Address(rax, 168));
+ andpd(xmm2, xmm6);
+ mulsd(xmm5, xmm2);
+ mulsd(xmm6, Address(rax, 160));
+ subsd(xmm7, xmm5);
+ subsd(xmm2, Address(rax, 128));
+ subsd(xmm7, xmm4);
+ mulsd(xmm7, xmm6);
+ movdqu(xmm4, xmm3);
+ subsd(xmm3, xmm2);
+ addsd(xmm2, xmm3);
+ subsd(xmm4, xmm2);
+ addsd(xmm0, xmm4);
+ subsd(xmm0, xmm7);
+ addsd(xmm0, xmm3);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_0_0_1);
+ jcc(Assembler::greater, L_2TAG_PACKET_1_0_1);
+ pextrw(eax, xmm0, 3);
+ movl(edx, eax);
+ andl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_2_0_1);
+ andl(edx, 32767);
+ cmpl(edx, 15904);
+ jcc(Assembler::below, L_2TAG_PACKET_3_0_1);
+ movdqu(xmm2, xmm0);
+ movdqu(xmm3, xmm0);
+ movq(xmm1, ExternalAddress(Q_11)); //0xb8fe4d77UL, 0x3f82609aUL
+ mulsd(xmm2, xmm0);
+ mulsd(xmm3, xmm2);
+ mulsd(xmm1, xmm2);
+ addsd(xmm1, ExternalAddress(Q_9)); //0xbf847a43UL, 0x3f9664a0UL
+ mulsd(xmm1, xmm2);
+ addsd(xmm1, ExternalAddress(Q_7)); //0x52c4c8abUL, 0x3faba1baUL
+ mulsd(xmm1, xmm2);
+ addsd(xmm1, ExternalAddress(Q_5)); //0x11092746UL, 0x3fc11111UL
+ mulsd(xmm1, xmm2);
+ addsd(xmm1, ExternalAddress(Q_3)); //0x55555612UL, 0x3fd55555UL
+ mulsd(xmm1, xmm3);
+ addsd(xmm0, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_3_0_1);
+ movq(xmm3, ExternalAddress(TWO_POW_55)); //0x00000000UL, 0x43600000UL
+ mulsd(xmm3, xmm0);
+ addsd(xmm0, xmm3);
+ mulsd(xmm0, ExternalAddress(TWO_POW_M55)); //0x00000000UL, 0x3c800000UL
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_2_0_1);
+ movdqu(xmm1, xmm0);
+ mulsd(xmm1, xmm1);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_1_0_1);
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32752);
+ cmpl(eax, 32752);
+ jcc(Assembler::equal, L_2TAG_PACKET_4_0_1);
+ pextrw(ecx, xmm0, 3);
+ andl(ecx, 32752);
+ subl(ecx, 16224);
+ shrl(ecx, 7);
+ andl(ecx, 65532);
+ lea(r11, ExternalAddress(PI_INV_TABLE));
+ addq(rcx, r11);
+ movdq(rax, xmm0);
+ movl(r10, Address(rcx, 20));
+ movl(r8, Address(rcx, 24));
+ movl(edx, eax);
+ shrq(rax, 21);
+ orl(eax, INT_MIN);
+ shrl(eax, 11);
+ movl(r9, r10);
+ imulq(r10, rdx);
+ imulq(r9, rax);
+ imulq(r8, rax);
+ movl(rsi, Address(rcx, 16));
+ movl(rdi, Address(rcx, 12));
+ movl(r11, r10);
+ shrq(r10, 32);
+ addq(r9, r10);
+ addq(r11, r8);
+ movl(r8, r11);
+ shrq(r11, 32);
+ addq(r9, r11);
+ movl(r10, rsi);
+ imulq(rsi, rdx);
+ imulq(r10, rax);
+ movl(r11, rdi);
+ imulq(rdi, rdx);
+ movl(rbx, rsi);
+ shrq(rsi, 32);
+ addq(r9, rbx);
+ movl(rbx, r9);
+ shrq(r9, 32);
+ addq(r10, rsi);
+ addq(r10, r9);
+ shlq(rbx, 32);
+ orq(r8, rbx);
+ imulq(r11, rax);
+ movl(r9, Address(rcx, 8));
+ movl(rsi, Address(rcx, 4));
+ movl(rbx, rdi);
+ shrq(rdi, 32);
+ addq(r10, rbx);
+ movl(rbx, r10);
+ shrq(r10, 32);
+ addq(r11, rdi);
+ addq(r11, r10);
+ movq(rdi, r9);
+ imulq(r9, rdx);
+ imulq(rdi, rax);
+ movl(r10, r9);
+ shrq(r9, 32);
+ addq(r11, r10);
+ movl(r10, r11);
+ shrq(r11, 32);
+ addq(rdi, r9);
+ addq(rdi, r11);
+ movq(r9, rsi);
+ imulq(rsi, rdx);
+ imulq(r9, rax);
+ shlq(r10, 32);
+ orq(r10, rbx);
+ movl(eax, Address(rcx, 0));
+ movl(r11, rsi);
+ shrq(rsi, 32);
+ addq(rdi, r11);
+ movl(r11, rdi);
+ shrq(rdi, 32);
+ addq(r9, rsi);
+ addq(r9, rdi);
+ imulq(rdx, rax);
+ pextrw(rbx, xmm0, 3);
+ lea(rdi, ExternalAddress(PI_INV_TABLE));
+ subq(rcx, rdi);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, ecx);
+ addl(ecx, 19);
+ movl(rsi, 32768);
+ andl(rsi, rbx);
+ shrl(rbx, 4);
+ andl(rbx, 2047);
+ subl(rbx, 1023);
+ subl(ecx, rbx);
+ addq(r9, rdx);
+ movl(edx, ecx);
+ addl(edx, 32);
+ cmpl(ecx, 0);
+ jcc(Assembler::less, L_2TAG_PACKET_5_0_1);
+ negl(ecx);
+ addl(ecx, 29);
+ shll(r9);
+ movl(rdi, r9);
+ andl(r9, 1073741823);
+ testl(r9, 536870912);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_6_0_1);
+ shrl(r9);
+ movl(rbx, 0);
+ shlq(r9, 32);
+ orq(r9, r11);
+
+ bind(L_2TAG_PACKET_7_0_1);
+
+ bind(L_2TAG_PACKET_8_0_1);
+ cmpq(r9, 0);
+ jcc(Assembler::equal, L_2TAG_PACKET_9_0_1);
+
+ bind(L_2TAG_PACKET_10_0_1);
+ bsrq(r11, r9);
+ movl(ecx, 29);
+ subl(ecx, r11);
+ jcc(Assembler::lessEqual, L_2TAG_PACKET_11_0_1);
+ shlq(r9);
+ movq(rax, r10);
+ shlq(r10);
+ addl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shrq(rax);
+ shrq(r8);
+ orq(r9, rax);
+ orq(r10, r8);
+
+ bind(L_2TAG_PACKET_12_0_1);
+ cvtsi2sdq(xmm0, r9);
+ shrq(r10, 1);
+ cvtsi2sdq(xmm3, r10);
+ xorpd(xmm4, xmm4);
+ shll(edx, 4);
+ negl(edx);
+ addl(edx, 16368);
+ orl(edx, rsi);
+ xorl(edx, rbx);
+ pinsrw(xmm4, edx, 3);
+ movq(xmm2, ExternalAddress(PI_4)); //0x00000000UL, 0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
+ movq(xmm7, ExternalAddress(8 + PI_4)); //0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
+ xorpd(xmm5, xmm5);
+ subl(edx, 1008);
+ pinsrw(xmm5, edx, 3);
+ mulsd(xmm0, xmm4);
+ shll(rsi, 16);
+ sarl(rsi, 31);
+ mulsd(xmm3, xmm5);
+ movdqu(xmm1, xmm0);
+ mulsd(xmm0, xmm2);
+ shrl(rdi, 30);
+ addsd(xmm1, xmm3);
+ mulsd(xmm3, xmm2);
+ addl(rdi, rsi);
+ xorl(rdi, rsi);
+ mulsd(xmm7, xmm1);
+ movl(eax, rdi);
+ addsd(xmm7, xmm3);
+ movdqu(xmm2, xmm0);
+ addsd(xmm0, xmm7);
+ subsd(xmm2, xmm0);
+ addsd(xmm7, xmm2);
+ movdqu(xmm1, ExternalAddress(PI32INV)); //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm0, xmm0);
+ }
+ else {
+ movlhps(xmm0, xmm0);
+ }
+ movdqu(xmm4, ExternalAddress(sign_mask)); //0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
+ andpd(xmm4, xmm0);
+ mulpd(xmm1, xmm0);
+ if (VM_Version::supports_sse3()) {
+ movddup(xmm7, xmm7);
+ }
+ else {
+ movlhps(xmm7, xmm7);
+ }
+ movdqu(xmm5, ExternalAddress(ONEHALF)); //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
+ movdqu(xmm6, ExternalAddress(MUL16)); //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ movdqu(xmm5, xmm1);
+ unpckhpd(xmm5, xmm5);
+ cvttsd2sil(edx, xmm5);
+ cvttpd2dq(xmm1, xmm1);
+ cvtdq2pd(xmm1, xmm1);
+ mulpd(xmm1, xmm6);
+ movdqu(xmm3, ExternalAddress(P_1)); //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
+ movq(xmm5, ExternalAddress(QQ_2)); //0x676733afUL, 0x3d32e7b9UL
+ shll(eax, 4);
+ addl(edx, 469248);
+ movdqu(xmm4, ExternalAddress(P_2)); //0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
+ mulpd(xmm3, xmm1);
+ addl(edx, eax);
+ andl(edx, 31);
+ mulsd(xmm5, xmm1);
+ movl(ecx, edx);
+ mulpd(xmm4, xmm1);
+ shll(ecx, 1);
+ subpd(xmm0, xmm3);
+ mulpd(xmm1, ExternalAddress(P_3)); //0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
+ addl(edx, ecx);
+ shll(ecx, 2);
+ addl(edx, ecx);
+ addsd(xmm5, xmm0);
+ movdqu(xmm2, xmm0);
+ subpd(xmm0, xmm4);
+ movq(xmm6, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
+ shll(edx, 4);
+ lea(rax, ExternalAddress(Ctable));
+ andpd(xmm5, ExternalAddress(MASK_35)); //0xfffc0000UL, 0xffffffffUL, 0x00000000UL, 0x00000000UL
+ movdqu(xmm3, xmm0);
+ addq(rax, rdx);
+ subpd(xmm2, xmm0);
+ unpckhpd(xmm0, xmm0);
+ divsd(xmm6, xmm5);
+ subpd(xmm2, xmm4);
+ subsd(xmm3, xmm5);
+ subpd(xmm2, xmm1);
+ movdqu(xmm1, Address(rax, 48));
+ addpd(xmm2, xmm7);
+ movdqu(xmm7, Address(rax, 16));
+ mulpd(xmm7, xmm0);
+ movdqu(xmm4, Address(rax, 96));
+ mulpd(xmm1, xmm0);
+ mulpd(xmm4, xmm0);
+ addsd(xmm2, xmm3);
+ movdqu(xmm3, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm7, Address(rax, 0));
+ addpd(xmm1, Address(rax, 32));
+ mulpd(xmm1, xmm0);
+ addpd(xmm4, Address(rax, 80));
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, Address(rax, 112));
+ mulpd(xmm1, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm4, xmm1);
+ movdqu(xmm1, Address(rax, 64));
+ mulpd(xmm1, xmm0);
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, xmm3);
+ mulpd(xmm3, xmm0);
+ mulsd(xmm0, xmm0);
+ mulpd(xmm1, Address(rax, 144));
+ mulpd(xmm4, xmm3);
+ movdqu(xmm3, xmm1);
+ addpd(xmm7, xmm4);
+ movdqu(xmm4, xmm1);
+ mulsd(xmm0, xmm7);
+ unpckhpd(xmm7, xmm7);
+ addsd(xmm0, xmm7);
+ unpckhpd(xmm1, xmm1);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ movdqu(xmm4, xmm2);
+ movq(xmm7, Address(rax, 144));
+ unpckhpd(xmm2, xmm2);
+ addsd(xmm7, Address(rax, 152));
+ mulsd(xmm7, xmm2);
+ addsd(xmm7, Address(rax, 136));
+ addsd(xmm7, xmm1);
+ addsd(xmm0, xmm7);
+ movq(xmm7, ExternalAddress(ONE)); //0x00000000UL, 0x3ff00000UL
+ mulsd(xmm4, xmm6);
+ movq(xmm2, Address(rax, 168));
+ andpd(xmm2, xmm6);
+ mulsd(xmm5, xmm2);
+ mulsd(xmm6, Address(rax, 160));
+ subsd(xmm7, xmm5);
+ subsd(xmm2, Address(rax, 128));
+ subsd(xmm7, xmm4);
+ mulsd(xmm7, xmm6);
+ movdqu(xmm4, xmm3);
+ subsd(xmm3, xmm2);
+ addsd(xmm2, xmm3);
+ subsd(xmm4, xmm2);
+ addsd(xmm0, xmm4);
+ subsd(xmm0, xmm7);
+ addsd(xmm0, xmm3);
+ jmp(B1_4);
+
+ bind(L_2TAG_PACKET_9_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ movl(r8, 0);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_1);
+ addl(edx, 64);
+ movq(r9, r10);
+ movq(r10, r8);
+ cmpq(r9, 0);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_1);
+ jmp(L_2TAG_PACKET_12_0_1);
+
+ bind(L_2TAG_PACKET_11_0_1);
+ jcc(Assembler::equal, L_2TAG_PACKET_12_0_1);
+ negl(ecx);
+ shrq(r10);
+ movq(rax, r9);
+ shrq(r9);
+ subl(edx, ecx);
+ negl(ecx);
+ addl(ecx, 64);
+ shlq(rax);
+ orq(r10, rax);
+ jmp(L_2TAG_PACKET_12_0_1);
+
+ bind(L_2TAG_PACKET_5_0_1);
+ notl(ecx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(r9);
+ movq(rdi, r9);
+ testl(r9, INT_MIN);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_13_0_1);
+ shrl(r9);
+ movl(rbx, 0);
+ shrq(rdi, 2);
+ jmp(L_2TAG_PACKET_8_0_1);
+
+ bind(L_2TAG_PACKET_6_0_1);
+ shrl(r9);
+ movl(rbx, 1073741824);
+ shrl(rbx);
+ shlq(r9, 32);
+ orq(r9, r11);
+ shlq(rbx, 32);
+ addl(rdi, 1073741824);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(rbx, 32768);
+ jmp(L_2TAG_PACKET_7_0_1);
+
+ bind(L_2TAG_PACKET_13_0_1);
+ shrl(r9);
+ mov64(rbx, 0x100000000);
+ shrq(rbx);
+ movl(rcx, 0);
+ movl(r11, 0);
+ subq(rcx, r8);
+ sbbq(r11, r10);
+ sbbq(rbx, r9);
+ movq(r8, rcx);
+ movq(r10, r11);
+ movq(r9, rbx);
+ movl(rbx, 32768);
+ shrq(rdi, 2);
+ addl(rdi, 1073741824);
+ jmp(L_2TAG_PACKET_8_0_1);
+
+ bind(L_2TAG_PACKET_4_0_1);
+ movq(xmm0, Address(rsp, 8));
+ mulsd(xmm0, ExternalAddress(NEG_ZERO)); //0x00000000UL, 0x80000000UL
+ movq(Address(rsp, 0), xmm0);
+
+ bind(L_2TAG_PACKET_14_0_1);
+
+ bind(B1_4);
+ addq(rsp, 16);
+
+}
+#else
+// The 32 bit code is at most SSE2 compliant
+ALIGNED_(16) jushort _TP[] =
+{
+ 0x4cd6, 0xaf6c, 0xc710, 0xc662, 0xbffd, 0x0000, 0x4b06, 0xb0ac, 0xd3b2, 0xcc2c,
+ 0x3ff9, 0x0000, 0x00e3, 0xc850, 0xaa28, 0x9533, 0xbff3, 0x0000, 0x2ff0, 0x466d,
+ 0x1a3b, 0xb266, 0x3fe5, 0x0000
+};
+
+ALIGNED_(16) jushort _TQ[] =
+{
+ 0x399c, 0x8391, 0x154c, 0x94ca, 0xbfff, 0x0000, 0xb6a3, 0xc36a, 0x44e2, 0x8a2c,
+ 0x3ffe, 0x0000, 0xb70f, 0xd068, 0xa6ce, 0xe9dd, 0xbff9, 0x0000, 0x820f, 0x51ce,
+ 0x7d76, 0x9bff, 0x3ff3, 0x0000
+};
+
+ALIGNED_(16) jushort _GP[] =
+{
+ 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffd, 0x0000, 0xb62f, 0x0b60, 0x60b6, 0xb60b,
+ 0xbff9, 0x0000, 0xdfa7, 0x08aa, 0x55e0, 0x8ab3, 0xbff6, 0x0000, 0x85a0, 0xa819,
+ 0xbc99, 0xddeb, 0xbff2, 0x0000, 0x7065, 0x6a37, 0x795f, 0xb354, 0xbfef, 0x0000,
+ 0xa8f9, 0x83f1, 0x2ec8, 0x9140, 0xbfec, 0x0000, 0xf3ca, 0x8c96, 0x8e0b, 0xeb6d,
+ 0xbfe8, 0x0000, 0x355b, 0xd910, 0x67c9, 0xbed3, 0xbfe5, 0x0000, 0x286b, 0xb49e,
+ 0xb854, 0x9a98, 0xbfe2, 0x0000, 0x0871, 0x1a2f, 0x6477, 0xfcc4, 0xbfde, 0x0000,
+ 0xa559, 0x1da9, 0xaed2, 0xba76, 0xbfdb, 0x0000, 0x00a3, 0x7fea, 0x9bc3, 0xf205,
+ 0xbfd8, 0x0000
+};
+
+void MacroAssembler::libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx, Register edx, Register ebx, Register esi, Register edi, Register ebp, Register esp) {
+ Label B1_1, B1_2, B1_3, B1_4, B1_5, B1_6, B1_7, B1_8, B1_9, B1_10, B1_11, B1_12;
+ Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
+ Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
+ Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_41, B1_42, B1_43, B1_44, B1_45, B1_46;
+
+ assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
+
+ address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr();
+ address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr();
+ address Pi4x3 = StubRoutines::x86::_Pi4x3_addr();
+ address Pi4x4 = StubRoutines::x86::_Pi4x4_addr();
+ address ones = StubRoutines::x86::_ones_addr();
+ address TP = (address)_TP;
+ address TQ = (address)_TQ;
+ address GP = (address)_GP;
+
+ bind(B1_1);
+ push(ebp);
+ movl(ebp, esp);
+ andl(esp, -64);
+ push(esi);
+ push(edi);
+ push(ebx);
+ subl(esp, 52);
+ movl(eax, Address(ebp, 16));
+ movl(ebx, Address(ebp, 20));
+ movl(Address(esp, 40), eax);
+
+ bind(B1_2);
+ fnstcw(Address(esp, 38));
+
+ bind(B1_3);
+ movl(edx, Address(ebp, 12));
+ movl(eax, edx);
+ andl(eax, 2147483647);
+ shrl(edx, 31);
+ movl(Address(esp, 44), edx);
+ cmpl(eax, 1104150528);
+ jcc(Assembler::aboveEqual, B1_11);
+
+ bind(B1_4);
+ movsd(xmm1, Address(ebp, 8));
+ movzwl(ecx, Address(esp, 38));
+ movl(edx, ecx);
+ andl(edx, 768);
+ andps(xmm1, ExternalAddress(L_2il0floatpacket_0)); //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
+ cmpl(edx, 768);
+ movsd(xmm0, ExternalAddress(Pi4Inv)); ////0x6dc9c883UL, 0x3ff45f30UL
+ mulsd(xmm0, xmm1);
+ movsd(Address(ebp, 8), xmm1);
+ movsd(Address(esp, 0), xmm0);
+ jcc(Assembler::equal, B1_39);
+
+ bind(B1_5);
+ orl(ecx, -64768);
+ movw(Address(esp, 36), ecx);
+
+ bind(B1_6);
+ fldcw(Address(esp, 36));
+
+ bind(B1_7);
+ movsd(xmm1, Address(ebp, 8));
+ movl(edi, 1);
+
+ bind(B1_8);
+ movl(Address(esp, 12), esi);
+ movl(esi, Address(esp, 4));
+ movl(edx, esi);
+ movl(Address(esp, 24), edi);
+ movl(edi, esi);
+ shrl(edi, 20);
+ andl(edx, 1048575);
+ movl(ecx, edi);
+ orl(edx, 1048576);
+ negl(ecx);
+ addl(edi, 13);
+ movl(Address(esp, 8), ebx);
+ addl(ecx, 19);
+ movl(ebx, edx);
+ movl(Address(esp, 28), ecx);
+ shrl(ebx);
+ movl(ecx, edi);
+ shll(edx);
+ movl(ecx, Address(esp, 28));
+ movl(edi, Address(esp, 0));
+ shrl(edi);
+ orl(edx, edi);
+ cmpl(esi, 1094713344);
+ movsd(Address(esp, 16), xmm1);
+ fld_d(Address(esp, 16));
+ cmov32(Assembler::below, edx, ebx);
+ movl(edi, Address(esp, 24));
+ movl(esi, Address(esp, 12));
+ lea(ebx, Address(edx, 1));
+ andl(ebx, -2);
+ movl(Address(esp, 16), ebx);
+ cmpl(eax, 1094713344);
+ fild_s(Address(esp, 16));
+ movl(ebx, Address(esp, 8));
+ jcc(Assembler::aboveEqual, B1_10);
+
+ bind(B1_9);
+ fld_d(ExternalAddress(Pi4x3)); //0x54443000UL, 0xbfe921fbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(8 + Pi4x3)); //0x3b39a000UL, 0x3d373dcbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(16 + Pi4x3)); //0xe0e68948UL, 0xba845c06UL
+ fmulp(1);
+ faddp(1);
+ jmp(B1_17);
+
+ bind(B1_10);
+ fld_d(ExternalAddress(Pi4x4)); //0x54400000UL, 0xbfe921fbUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(8 + Pi4x4)); //0x1a600000UL, 0xbdc0b461UL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(16 + Pi4x4)); //0x2e000000UL, 0xbb93198aUL
+ fmul(1);
+ faddp(2);
+ fld_d(ExternalAddress(24 + Pi4x4)); //0x252049c1UL, 0xb96b839aUL
+ fmulp(1);
+ faddp(1);
+ jmp(B1_17);
+
+ bind(B1_11);
+ movzwl(edx, Address(esp, 38));
+ movl(eax, edx);
+ andl(eax, 768);
+ cmpl(eax, 768);
+ jcc(Assembler::equal, B1_40);
+
+ bind(B1_12);
+ orl(edx, -64768);
+ movw(Address(esp, 36), edx);
+
+ bind(B1_13);
+ fldcw(Address(esp, 36));
+
+ bind(B1_14);
+ movl(edi, 1);
+
+ bind(B1_15);
+ movsd(xmm0, Address(ebp, 8));
+ addl(esp, -32);
+ andps(xmm0, ExternalAddress(L_2il0floatpacket_0)); //0xffffffffUL, 0x7fffffffUL, 0x00000000UL, 0x00000000UL
+ lea(eax, Address(esp, 32));
+ movsd(Address(eax, 16), xmm0);
+ fld_d(Address(eax, 16));
+ fstp_x(Address(esp, 0));
+ movl(Address(esp, 12), 0);
+ movl(Address(esp, 16), eax);
+ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_reduce_pi04l())));
+
+ bind(B1_43);
+ movl(edx, eax);
+ addl(esp, 32);
+
+ bind(B1_16);
+ fld_d(Address(esp, 0));
+ fld_d(Address(esp, 8));
+ faddp(1);
+
+ bind(B1_17);
+ movl(eax, ebx);
+ andl(eax, 3);
+ cmpl(eax, 3);
+ jcc(Assembler::notEqual, B1_24);
+
+ bind(B1_18);
+ fld_d(ExternalAddress(ones));
+ incl(edx);
+ fdiv(1);
+ testb(edx, 2);
+ fstp_x(Address(esp, 24));
+ fld_s(0);
+ fmul(1);
+ fld_s(0);
+ fmul(1);
+ fld_x(ExternalAddress(36 + TP)); //0x2ff0, 0x466d, 0x1a
+ fmul(2);
+ fld_x(ExternalAddress(24 + TP)); //0x00e3, 0xc850, 0xaa
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(12 + TP)); //0x4b06, 0xb0ac, 0xd3
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(36 + TQ)); //0x820f, 0x51ce, 0x7d
+ fmul(3);
+ fld_x(ExternalAddress(24 + TQ)); //0xb70f, 0xd068, 0xa6
+ faddp(1);
+ fmul(3);
+ fld_x(ExternalAddress(12 + TQ)); //0xb6a3, 0xc36a, 0x44
+ faddp(1);
+ fmul(3);
+ fld_x(ExternalAddress(TQ)); //0x399c, 0x8391, 0x15
+ faddp(1);
+ fld_x(ExternalAddress(TP)); //0x4cd6, 0xaf6c, 0xc7
+ faddp(2);
+ fld_x(ExternalAddress(132 + GP)); //0x00a3, 0x7fea, 0x9b
+ fmul(3);
+ fld_x(ExternalAddress(120 + GP)); //0xa559, 0x1da9, 0xae
+ fmul(4);
+ fld_x(ExternalAddress(108 + GP)); //0x0871, 0x1a2f, 0x64
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(96 + GP)); //0x286b, 0xb49e, 0xb8
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(84 + GP)); //0x355b, 0xd910, 0x67
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(72 + GP)); //0x8c96, 0x8e0b, 0xeb
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(60 + GP)); //0xa8f9, 0x83f1, 0x2e
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(48 + GP)); //0x7065, 0x6a37, 0x79
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(36 + GP)); //0x85a0, 0xa819, 0xbc
+ faddp(2);
+ fxch(1);
+ fmul(4);
+ fld_x(ExternalAddress(24 + GP)); //0xdfa7, 0x08aa, 0x55
+ faddp(2);
+ fxch(1);
+ fmulp(4);
+ fld_x(ExternalAddress(12 + GP)); //0xb62f, 0x0b60, 0x60
+ faddp(1);
+ fmul(4);
+ fmul(5);
+ fld_x(ExternalAddress(GP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(4);
+ fxch(3);
+ fmul(5);
+ faddp(3);
+ jcc(Assembler::equal, B1_20);
+
+ bind(B1_19);
+ fld_x(Address(esp, 24));
+ fxch(1);
+ fdivrp(2);
+ fxch(1);
+ fmulp(3);
+ movl(eax, Address(esp, 44));
+ xorl(eax, 1);
+ fxch(2);
+ fmul(3);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(2);
+ fmula(3);
+ fxch(3);
+ faddp(2);
+ fxch(1);
+ fstp_d(Address(esp, 16));
+ fmul(1);
+ fxch(1);
+ fmulp(2);
+ movsd(xmm0, Address(esp, 16));
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm1, Address(esp, 16));
+ jmp(B1_21);
+
+ bind(B1_20);
+ fdivrp(1);
+ fmulp(2);
+ fxch(1);
+ fmul(2);
+ movl(eax, Address(esp, 44));
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(1);
+ fmula(3);
+ fxch(3);
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ fmul(1);
+ fld_x(Address(esp, 24));
+ fmulp(2);
+ movsd(xmm0, Address(esp, 16));
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm1, Address(esp, 16));
+
+ bind(B1_21);
+ testl(edi, edi);
+ jcc(Assembler::equal, B1_23);
+
+ bind(B1_22);
+ fldcw(Address(esp, 38));
+
+ bind(B1_23);
+ movl(eax, Address(esp, 40));
+ movsd(Address(eax, 0), xmm0);
+ movsd(Address(eax, 8), xmm1);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_24);
+ testb(ebx, 2);
+ jcc(Assembler::equal, B1_31);
+
+ bind(B1_25);
+ incl(edx);
+ fld_s(0);
+ fmul(1);
+ testb(edx, 2);
+ jcc(Assembler::equal, B1_27);
+
+ bind(B1_26);
+ fld_d(ExternalAddress(ones));
+ fdiv(2);
+ fld_s(1);
+ fmul(2);
+ fld_x(ExternalAddress(132 + GP)); //0x00a3, 0x7fea, 0x9b
+ fmul(1);
+ fld_x(ExternalAddress(120 + GP)); //0xa559, 0x1da9, 0xae
+ fmul(2);
+ fld_x(ExternalAddress(108 + GP)); //0x67c9, 0xbed3, 0xbf
+ movl(eax, Address(esp, 44));
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ xorl(eax, 1);
+ fld_x(ExternalAddress(96 + GP)); //0x286b, 0xb49e, 0xb8
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(84 + GP)); //0x355b, 0xd910, 0x67
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(72 + GP)); //0xf3ca, 0x8c96, 0x8e
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(60 + GP)); //0xa8f9, 0x83f1, 0x2e
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(48 + GP)); //0x7065, 0x6a37, 0x79
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(36 + GP)); //0x85a0, 0xa819, 0xbc
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(24 + GP)); //0xdfa7, 0x08aa, 0x55
+ faddp(2);
+ fxch(1);
+ fmulp(2);
+ fld_x(ExternalAddress(12 + GP)); //0xb62f, 0x0b60, 0x60
+ faddp(1);
+ fmulp(3);
+ fld_x(ExternalAddress(GP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(1);
+ fmul(3);
+ fxch(2);
+ fmulp(3);
+ fxch(1);
+ faddp(2);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(2);
+ fmulp(1);
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm0, Address(esp, 16));
+ jmp(B1_28);
+
+ bind(B1_27);
+ fld_x(ExternalAddress(36 + TP)); //0x2ff0, 0x466d, 0x1a
+ fmul(1);
+ fld_x(ExternalAddress(24 + TP)); //0x00e3, 0xc850, 0xaa
+ movl(eax, Address(esp, 44));
+ faddp(1);
+ fmul(1);
+ fld_x(ExternalAddress(36 + TQ)); //0x820f, 0x51ce, 0x7d
+ fmul(2);
+ fld_x(ExternalAddress(24 + TQ)); //0xb70f, 0xd068, 0xa6
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(12 + TQ)); //0xb6a3, 0xc36a, 0x44
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(TQ)); //0x399c, 0x8391, 0x15
+ faddp(1);
+ fld_x(ExternalAddress(12 + TP)); //0x4b06, 0xb0ac, 0xd3
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(TP)); //0x4cd6, 0xaf6c, 0xc7
+ faddp(1);
+ fdivrp(1);
+ fmulp(1);
+ fmul(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(1);
+ fmulp(2);
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm0, Address(esp, 16));
+
+ bind(B1_28);
+ testl(edi, edi);
+ jcc(Assembler::equal, B1_30);
+
+ bind(B1_29);
+ fldcw(Address(esp, 38));
+
+ bind(B1_30);
+ movl(eax, Address(esp, 40));
+ movsd(Address(eax, 0), xmm0);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ movl(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_31);
+ testb(ebx, 1);
+ jcc(Assembler::equal, B1_38);
+
+ bind(B1_32);
+ incl(edx);
+ fld_s(0);
+ fmul(1);
+ testb(edx, 2);
+ jcc(Assembler::equal, B1_34);
+
+ bind(B1_33);
+ fld_x(ExternalAddress(36 + TP)); //0x2ff0, 0x466d, 0x1a
+ fmul(1);
+ fld_x(ExternalAddress(24 + TP)); //0x00e3, 0xc850, 0xaa
+ movl(eax, Address(esp, 44));
+ faddp(1);
+ fmul(1);
+ xorl(eax, 1);
+ fld_x(ExternalAddress(36 + TQ)); //0x820f, 0x51ce, 0x7d
+ fmul(2);
+ fld_x(ExternalAddress(24 + TQ)); //0xb70f, 0xd068, 0xa6
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(12 + TQ)); //0xb6a3, 0xc36a, 0x44
+ faddp(1);
+ fmul(2);
+ fld_x(ExternalAddress(TQ)); //0x399c, 0x8391, 0x15
+ faddp(1);
+ fld_x(ExternalAddress(12 + TP)); //0x4b06, 0xb0ac, 0xd3
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(TP)); //0x4cd6, 0xaf6c, 0xc7
+ faddp(1);
+ fdivrp(1);
+ fmulp(1);
+ fmul(1);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(1);
+ fmulp(2);
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm0, Address(esp, 16));
+ jmp(B1_35);
+
+ bind(B1_34);
+ fld_d(ExternalAddress(ones));
+ fdiv(2);
+ fld_s(1);
+ fmul(2);
+ fld_x(ExternalAddress(132 + GP)); //0x00a3, 0x7fea, 0x9b
+ fmul(1);
+ fld_x(ExternalAddress(120 + GP)); //0xa559, 0x1da9, 0xae
+ fmul(2);
+ fld_x(ExternalAddress(108 + GP)); //0x67c9, 0xbed3, 0xbf
+ movl(eax, Address(esp, 44));
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(96 + GP)); //0x286b, 0xb49e, 0xb8
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(84 + GP)); //0x355b, 0xd910, 0x67
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(72 + GP)); //0xf3ca, 0x8c96, 0x8e
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(60 + GP)); //0xa8f9, 0x83f1, 0x2e
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(48 + GP)); //0x7065, 0x6a37, 0x79
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(36 + GP)); //0x85a0, 0xa819, 0xbc
+ faddp(2);
+ fxch(1);
+ fmul(2);
+ fld_x(ExternalAddress(24 + GP)); //0xdfa7, 0x08aa, 0x55
+ faddp(2);
+ fxch(1);
+ fmulp(2);
+ fld_x(ExternalAddress(12 + GP)); //0xb62f, 0x0b60, 0x60
+ faddp(1);
+ fmulp(3);
+ fld_x(ExternalAddress(GP)); //0xaaab, 0xaaaa, 0xaa
+ faddp(1);
+ fmul(3);
+ fxch(2);
+ fmulp(3);
+ fxch(1);
+ faddp(2);
+ fld_d(Address(ones, RelocationHolder::none).plus_disp(eax, Address::times_8));
+ fmula(2);
+ fmulp(1);
+ faddp(1);
+ fstp_d(Address(esp, 16));
+ movsd(xmm0, Address(esp, 16));
+
+ bind(B1_35);
+ testl(edi, edi);
+ jcc(Assembler::equal, B1_37);
+
+ bind(B1_36);
+ fldcw(Address(esp, 38));
+
+ bind(B1_37);
+ movl(eax, Address(esp, 40));
+ movsd(Address(eax, 8), xmm0);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ mov(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_38);
+ fstp_d(0);
+ addl(esp, 52);
+ pop(ebx);
+ pop(edi);
+ pop(esi);
+ mov(esp, ebp);
+ pop(ebp);
+ ret(0);
+
+ bind(B1_39);
+ xorl(edi, edi);
+ jmp(B1_8);
+
+ bind(B1_40);
+ xorl(edi, edi);
+ jmp(B1_15);
+}
+
+ALIGNED_(16) juint _static_const_table_tan[] =
+{
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x882c10faUL,
+ 0x3f9664f4UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x55e6c23dUL, 0x3f8226e3UL, 0x55555555UL,
+ 0x3fd55555UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x0e157de0UL, 0x3f6d6d3dUL, 0x11111111UL, 0x3fc11111UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x452b75e3UL, 0x3f57da36UL,
+ 0x1ba1ba1cUL, 0x3faba1baUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
+ 0x3f953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
+ 0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0x3f85ad63UL, 0xdc230b9bUL,
+ 0x3fb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
+ 0x77bb08baUL, 0x3f757c85UL, 0xb6247521UL, 0x3fb1381eUL, 0x5922170cUL,
+ 0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0x3f64e391UL,
+ 0x3e666320UL, 0x3fa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
+ 0x3fafa8aeUL, 0x8c5b2da2UL, 0x3fb936bbUL, 0x4e88f7a5UL, 0x3c587d05UL,
+ 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x5a279ea3UL, 0x3faa3407UL,
+ 0x00000000UL, 0x00000000UL, 0x432d65faUL, 0x3fa70153UL, 0x00000000UL,
+ 0x00000000UL, 0x891a4602UL, 0x3f9d03efUL, 0xd62ca5f8UL, 0x3fca77d9UL,
+ 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL, 0x3fd8cf51UL, 0xb58fd909UL,
+ 0x3f8f88e3UL, 0x01771ceaUL, 0x3fc2b154UL, 0xf3562f8eUL, 0x3f888f57UL,
+ 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL, 0x3f80f44cUL, 0x214368e9UL,
+ 0x3fb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL, 0x172dbbf0UL, 0x3fb6cb8eUL,
+ 0xe0553158UL, 0x3fc975f5UL, 0x593fe814UL, 0x3c2ef5d3UL, 0x00000000UL,
+ 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x9314533eUL, 0x3fbb8ec5UL, 0x00000000UL,
+ 0x00000000UL, 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL,
+ 0xdcb427fdUL, 0x3fb13950UL, 0xd87ab0bbUL, 0x3fd5335eUL, 0xce0ae8a5UL,
+ 0x3fabb382UL, 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0x3fa552f1UL,
+ 0x59f21a6dUL, 0x3fd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL,
+ 0x3fd0576cUL, 0x8f2c2950UL, 0x3f9a4898UL, 0xc0b3f22cUL, 0x3fc59462UL,
+ 0x1883a4b8UL, 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL,
+ 0x3fd36a08UL, 0x1dce993dUL, 0xbc6d704dUL, 0x00000000UL, 0x3ff00000UL,
+ 0x2b82ab63UL, 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x56f37042UL, 0x3fccfc56UL, 0x00000000UL, 0x00000000UL,
+ 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL, 0x3d0e7c5dUL,
+ 0x3fc50533UL, 0x9bed9b2eUL, 0x3fdf0ed9UL, 0x5fe7c47cUL, 0x3fc1f250UL,
+ 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0x3fbe5c71UL, 0x86362c20UL,
+ 0x3fda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL, 0x3fd911bdUL,
+ 0xb56658beUL, 0x3fb5e4c7UL, 0x93a2fd76UL, 0x3fd3c092UL, 0xda271794UL,
+ 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL, 0x3fda8279UL,
+ 0xb68c1467UL, 0x3c708b2fUL, 0x00000000UL, 0x3ff00000UL, 0x980c4337UL,
+ 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0xcc03e501UL, 0x3fdff10fUL, 0x00000000UL, 0x00000000UL, 0x44a4e845UL,
+ 0x3fddb63bUL, 0x00000000UL, 0x00000000UL, 0x3768ad9fUL, 0x3fdb72a4UL,
+ 0x3dd01ccaUL, 0x3fe5fdb9UL, 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL,
+ 0x3fe977f9UL, 0xd013b3abUL, 0x3fd78ca3UL, 0xbf0bf914UL, 0x3fe4f192UL,
+ 0x4d53e730UL, 0x3fd5d060UL, 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL,
+ 0x3fd4322aUL, 0x5936a835UL, 0x3fe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL,
+ 0xef478605UL, 0x3fe1659eUL, 0x190834ecUL, 0x3fe11ab7UL, 0xcdb625eaUL,
+ 0xbc8e564bUL, 0x00000000UL, 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
+ 0x3ff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
+ 0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0x3ff3972eUL, 0xe93463bdUL,
+ 0x3feeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
+ 0xa04e8ea3UL, 0x3ff4541aUL, 0x386accd3UL, 0x3ff1369eUL, 0x222a66ddUL,
+ 0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0x3ff5178fUL,
+ 0xddaa0031UL, 0x3ff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
+ 0x3ff29311UL, 0x2ab7f990UL, 0x3fe561b8UL, 0x209c7df1UL, 0x3c87a8c5UL,
+ 0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc7ab4d5aUL, 0x40085e24UL,
+ 0x00000000UL, 0x00000000UL, 0xe93ea75dUL, 0x400b963dUL, 0x00000000UL,
+ 0x00000000UL, 0x94a7f25aUL, 0x400f37e2UL, 0x4b6261cbUL, 0x3ff5f984UL,
+ 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL, 0x3ffaf5a5UL, 0x7f2ce8e3UL,
+ 0x4013fe8bUL, 0xfe8e54faUL, 0x3ffd7334UL, 0x670d618dUL, 0x4016a10cUL,
+ 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL, 0x40199c5fUL, 0x697d6eceUL,
+ 0x4003006eUL, 0x83298b82UL, 0x401cfc4dUL, 0x19d490d6UL, 0x40058c19UL,
+ 0x2ae42850UL, 0x3fea4300UL, 0x118e20e6UL, 0xbc7a6db8UL, 0x00000000UL,
+ 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x65965966UL, 0x40219659UL, 0x00000000UL,
+ 0x00000000UL, 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL,
+ 0x83cd3723UL, 0x402c8342UL, 0x00000000UL, 0x40000000UL, 0x55e6c23dUL,
+ 0x403226e3UL, 0x55555555UL, 0x40055555UL, 0x34451939UL, 0x40371c96UL,
+ 0xaaaaaaabUL, 0x400aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL,
+ 0x40111111UL, 0xa738201fUL, 0x4042bbceUL, 0x05b05b06UL, 0x4015b05bUL,
+ 0x452b75e3UL, 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x4f48b8d3UL, 0xbf33eaf9UL, 0x00000000UL, 0x00000000UL,
+ 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL, 0xd0258911UL,
+ 0xbf0abaf3UL, 0x23e49fe9UL, 0xbfab5a8cUL, 0x2d53222eUL, 0x3ef60d15UL,
+ 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0xbee1d3b5UL, 0xdbf93b8eUL,
+ 0xbf84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL, 0x3f743924UL,
+ 0x794a8297UL, 0xbeb7b7b9UL, 0xe015f797UL, 0xbf5d41f5UL, 0xe41a4a56UL,
+ 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL, 0xbfce49ceUL,
+ 0x8c743719UL, 0x3d1eb860UL, 0x00000000UL, 0x00000000UL, 0x1b4863cfUL,
+ 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x535ad890UL, 0xbf2b9320UL, 0x00000000UL, 0x00000000UL, 0x018fdf1fUL,
+ 0x3f16d61dUL, 0x00000000UL, 0x00000000UL, 0x0359f1beUL, 0xbf0139e4UL,
+ 0xa4317c6dUL, 0xbfa67e17UL, 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL,
+ 0x3f9f455bUL, 0x51ccf238UL, 0xbed55317UL, 0xf437b9acUL, 0xbf804beeUL,
+ 0xc791a2b5UL, 0x3ec0e993UL, 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL,
+ 0xbeaa48a2UL, 0x0a268358UL, 0xbf55a443UL, 0xdfd978e4UL, 0x3e94b61fUL,
+ 0xd7767a58UL, 0x3f431806UL, 0x2aea0000UL, 0xbfc9bbe8UL, 0x7723ea61UL,
+ 0xbd3a2369UL, 0x00000000UL, 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
+ 0xbf231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
+ 0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0xbef66191UL, 0x848a46c6UL,
+ 0xbfa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
+ 0xfdd299efUL, 0xbec9dd1aUL, 0x3f8dbaafUL, 0xbf793363UL, 0x309fc6eaUL,
+ 0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0xbe9dae11UL,
+ 0x3e5c67b3UL, 0xbf4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
+ 0x3f3d1eb1UL, 0x29cfc000UL, 0xbfc549ceUL, 0xbf159358UL, 0xbd397b33UL,
+ 0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x7d98a556UL, 0xbf1a3958UL,
+ 0x00000000UL, 0x00000000UL, 0x9d88dc01UL, 0x3f0704c2UL, 0x00000000UL,
+ 0x00000000UL, 0x73742a2bUL, 0xbeed054aUL, 0x58844587UL, 0xbf9c2a13UL,
+ 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL, 0x3f9a48f4UL, 0xa8dc9888UL,
+ 0xbebf8939UL, 0xaad4b5b8UL, 0xbf72f746UL, 0x9102efa1UL, 0x3ea88f82UL,
+ 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL, 0xbe90f456UL, 0x741fb4edUL,
+ 0xbf46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL, 0xca89ff3fUL, 0x3f36db70UL,
+ 0xa8a2a000UL, 0xbfc0ee13UL, 0x3da24be1UL, 0xbd338b9fUL, 0x00000000UL,
+ 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0x1a154b97UL, 0xbf116b01UL, 0x00000000UL,
+ 0x00000000UL, 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL,
+ 0xb93820c8UL, 0xbee264d4UL, 0xbb6cbb18UL, 0xbf94ab8cUL, 0x888d4d92UL,
+ 0x3ed0568bUL, 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0xbeb2f950UL,
+ 0x22cf9f74UL, 0xbf6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL,
+ 0x3f64aad7UL, 0x637b73afUL, 0xbe83487cUL, 0xe522591aUL, 0xbf3fc092UL,
+ 0xa158e8bcUL, 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL,
+ 0xbfb9477fUL, 0xc2c2d2bcUL, 0xbd135ef9UL, 0x00000000UL, 0x00000000UL,
+ 0xf2fdb123UL, 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0xc41acb64UL, 0xbf05448dUL, 0x00000000UL, 0x00000000UL,
+ 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL, 0x9e42962dUL,
+ 0xbed5aea5UL, 0x2579f8efUL, 0xbf8b2398UL, 0x288a1ed9UL, 0x3ec81441UL,
+ 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0xbea57cd3UL, 0x5766336fUL,
+ 0xbf617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL, 0x3f62c646UL,
+ 0x6b8fb29cUL, 0xbe74e3a3UL, 0xdc4c0409UL, 0xbf33f952UL, 0x9bffe365UL,
+ 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL, 0xbfb0cc62UL,
+ 0x016b907fUL, 0xbd119cbcUL, 0x00000000UL, 0x00000000UL, 0xe6b9d8faUL,
+ 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x5daf22a6UL, 0xbef429d7UL, 0x00000000UL, 0x00000000UL, 0x06bca545UL,
+ 0x3ef7a27dUL, 0x00000000UL, 0x00000000UL, 0x7211c19aUL, 0xbec41c3eUL,
+ 0x956ed53eUL, 0xbf7ae3f4UL, 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL,
+ 0x3f96f713UL, 0x36661e6cUL, 0xbe936e09UL, 0x506f9381UL, 0xbf5122e8UL,
+ 0xcb6dd43fUL, 0x3e9041b9UL, 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL,
+ 0xbe625a8aUL, 0xe5a0e9dcUL, 0xbf23499dUL, 0x110384ddUL, 0x3e5b1c2cUL,
+ 0x68d43db6UL, 0x3f2cb899UL, 0x6ecac000UL, 0xbfa0c414UL, 0xcd7dd58cUL,
+ 0x3d13500fUL, 0x00000000UL, 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2bf70ebeUL, 0x3ef66a8fUL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0xd644267fUL, 0x3ec22805UL, 0x16c16c17UL, 0x3f96c16cUL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xc4e09162UL,
+ 0x3e8d6db2UL, 0xbc011567UL, 0x3f61566aUL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x1f79955cUL, 0x3e57da4eUL, 0x9334ef0bUL,
+ 0x3f2bbd77UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x55555555UL, 0x3fd55555UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x5daf22a6UL, 0x3ef429d7UL,
+ 0x00000000UL, 0x00000000UL, 0x06bca545UL, 0x3ef7a27dUL, 0x00000000UL,
+ 0x00000000UL, 0x7211c19aUL, 0x3ec41c3eUL, 0x956ed53eUL, 0x3f7ae3f4UL,
+ 0xee750e72UL, 0x3ec3901bUL, 0x91d443f5UL, 0x3f96f713UL, 0x36661e6cUL,
+ 0x3e936e09UL, 0x506f9381UL, 0x3f5122e8UL, 0xcb6dd43fUL, 0x3e9041b9UL,
+ 0x6698b2ffUL, 0x3f61b0c7UL, 0x576bf12bUL, 0x3e625a8aUL, 0xe5a0e9dcUL,
+ 0x3f23499dUL, 0x110384ddUL, 0x3e5b1c2cUL, 0x68d43db6UL, 0x3f2cb899UL,
+ 0x6ecac000UL, 0x3fa0c414UL, 0xcd7dd58cUL, 0xbd13500fUL, 0x00000000UL,
+ 0x00000000UL, 0x85a2c8fbUL, 0x3fd55fe0UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0xc41acb64UL, 0x3f05448dUL, 0x00000000UL,
+ 0x00000000UL, 0xdbb03d6fUL, 0x3efb7ad2UL, 0x00000000UL, 0x00000000UL,
+ 0x9e42962dUL, 0x3ed5aea5UL, 0x2579f8efUL, 0x3f8b2398UL, 0x288a1ed9UL,
+ 0x3ec81441UL, 0xb0198dc5UL, 0x3f979a3aUL, 0x2fdfe253UL, 0x3ea57cd3UL,
+ 0x5766336fUL, 0x3f617caaUL, 0x600944c3UL, 0x3e954ed6UL, 0xa4e0aaf8UL,
+ 0x3f62c646UL, 0x6b8fb29cUL, 0x3e74e3a3UL, 0xdc4c0409UL, 0x3f33f952UL,
+ 0x9bffe365UL, 0x3e6301ecUL, 0xb8869e44UL, 0x3f2fc566UL, 0xe1e04000UL,
+ 0x3fb0cc62UL, 0x016b907fUL, 0x3d119cbcUL, 0x00000000UL, 0x00000000UL,
+ 0xe6b9d8faUL, 0x3fd57fb3UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0x1a154b97UL, 0x3f116b01UL, 0x00000000UL, 0x00000000UL,
+ 0x2d427630UL, 0x3f0147bfUL, 0x00000000UL, 0x00000000UL, 0xb93820c8UL,
+ 0x3ee264d4UL, 0xbb6cbb18UL, 0x3f94ab8cUL, 0x888d4d92UL, 0x3ed0568bUL,
+ 0x60730f7cUL, 0x3f98b19bUL, 0xe4b1fb11UL, 0x3eb2f950UL, 0x22cf9f74UL,
+ 0x3f6b21cdUL, 0x4a3ff0a6UL, 0x3e9f499eUL, 0xfd2b83ceUL, 0x3f64aad7UL,
+ 0x637b73afUL, 0x3e83487cUL, 0xe522591aUL, 0x3f3fc092UL, 0xa158e8bcUL,
+ 0x3e6e3aaeUL, 0xe5e82ffaUL, 0x3f329d2fUL, 0xd636a000UL, 0x3fb9477fUL,
+ 0xc2c2d2bcUL, 0x3d135ef9UL, 0x00000000UL, 0x00000000UL, 0xf2fdb123UL,
+ 0x3fd5b566UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL,
+ 0x7d98a556UL, 0x3f1a3958UL, 0x00000000UL, 0x00000000UL, 0x9d88dc01UL,
+ 0x3f0704c2UL, 0x00000000UL, 0x00000000UL, 0x73742a2bUL, 0x3eed054aUL,
+ 0x58844587UL, 0x3f9c2a13UL, 0x55688a79UL, 0x3ed7a326UL, 0xee33f1d6UL,
+ 0x3f9a48f4UL, 0xa8dc9888UL, 0x3ebf8939UL, 0xaad4b5b8UL, 0x3f72f746UL,
+ 0x9102efa1UL, 0x3ea88f82UL, 0xdabc29cfUL, 0x3f678228UL, 0x9289afb8UL,
+ 0x3e90f456UL, 0x741fb4edUL, 0x3f46f3a3UL, 0xa97f6663UL, 0x3e79b4bfUL,
+ 0xca89ff3fUL, 0x3f36db70UL, 0xa8a2a000UL, 0x3fc0ee13UL, 0x3da24be1UL,
+ 0x3d338b9fUL, 0x00000000UL, 0x00000000UL, 0x11cd6c69UL, 0x3fd601fdUL,
+ 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0xb9ff07ceUL,
+ 0x3f231c78UL, 0x00000000UL, 0x00000000UL, 0xa5517182UL, 0x3f0ff0e0UL,
+ 0x00000000UL, 0x00000000UL, 0x790b4cbcUL, 0x3ef66191UL, 0x848a46c6UL,
+ 0x3fa21ac0UL, 0xb16435faUL, 0x3ee1d3ecUL, 0x2a1aa832UL, 0x3f9c71eaUL,
+ 0xfdd299efUL, 0x3ec9dd1aUL, 0x3f8dbaafUL, 0x3f793363UL, 0x309fc6eaUL,
+ 0x3eb415d6UL, 0xbee60471UL, 0x3f6b83baUL, 0x94a0a697UL, 0x3e9dae11UL,
+ 0x3e5c67b3UL, 0x3f4fd07bUL, 0x9a8f3e3eUL, 0x3e86bd75UL, 0xa4beb7a4UL,
+ 0x3f3d1eb1UL, 0x29cfc000UL, 0x3fc549ceUL, 0xbf159358UL, 0x3d397b33UL,
+ 0x00000000UL, 0x00000000UL, 0x871fee6cUL, 0x3fd666f0UL, 0x00000000UL,
+ 0x3ff00000UL, 0x00000000UL, 0xfffffff8UL, 0x535ad890UL, 0x3f2b9320UL,
+ 0x00000000UL, 0x00000000UL, 0x018fdf1fUL, 0x3f16d61dUL, 0x00000000UL,
+ 0x00000000UL, 0x0359f1beUL, 0x3f0139e4UL, 0xa4317c6dUL, 0x3fa67e17UL,
+ 0x82672d0fUL, 0x3eebb405UL, 0x2f1b621eUL, 0x3f9f455bUL, 0x51ccf238UL,
+ 0x3ed55317UL, 0xf437b9acUL, 0x3f804beeUL, 0xc791a2b5UL, 0x3ec0e993UL,
+ 0x919a1db2UL, 0x3f7080c2UL, 0x336a5b0eUL, 0x3eaa48a2UL, 0x0a268358UL,
+ 0x3f55a443UL, 0xdfd978e4UL, 0x3e94b61fUL, 0xd7767a58UL, 0x3f431806UL,
+ 0x2aea0000UL, 0x3fc9bbe8UL, 0x7723ea61UL, 0x3d3a2369UL, 0x00000000UL,
+ 0x00000000UL, 0xdf7796ffUL, 0x3fd6e642UL, 0x00000000UL, 0x3ff00000UL,
+ 0x00000000UL, 0xfffffff8UL, 0x4f48b8d3UL, 0x3f33eaf9UL, 0x00000000UL,
+ 0x00000000UL, 0x0cf7586fUL, 0x3f20b8eaUL, 0x00000000UL, 0x00000000UL,
+ 0xd0258911UL, 0x3f0abaf3UL, 0x23e49fe9UL, 0x3fab5a8cUL, 0x2d53222eUL,
+ 0x3ef60d15UL, 0x21169451UL, 0x3fa172b2UL, 0xbb254dbcUL, 0x3ee1d3b5UL,
+ 0xdbf93b8eUL, 0x3f84c7dbUL, 0x05b4630bUL, 0x3ecd3364UL, 0xee9aada7UL,
+ 0x3f743924UL, 0x794a8297UL, 0x3eb7b7b9UL, 0xe015f797UL, 0x3f5d41f5UL,
+ 0xe41a4a56UL, 0x3ea35dfbUL, 0xe4c2a251UL, 0x3f49a2abUL, 0x5af9e000UL,
+ 0x3fce49ceUL, 0x8c743719UL, 0xbd1eb860UL, 0x00000000UL, 0x00000000UL,
+ 0x1b4863cfUL, 0x3fd78294UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL,
+ 0xfffffff8UL, 0x65965966UL, 0xc0219659UL, 0x00000000UL, 0x00000000UL,
+ 0x882c10faUL, 0x402664f4UL, 0x00000000UL, 0x00000000UL, 0x83cd3723UL,
+ 0xc02c8342UL, 0x00000000UL, 0xc0000000UL, 0x55e6c23dUL, 0x403226e3UL,
+ 0x55555555UL, 0x40055555UL, 0x34451939UL, 0xc0371c96UL, 0xaaaaaaabUL,
+ 0xc00aaaaaUL, 0x0e157de0UL, 0x403d6d3dUL, 0x11111111UL, 0x40111111UL,
+ 0xa738201fUL, 0xc042bbceUL, 0x05b05b06UL, 0xc015b05bUL, 0x452b75e3UL,
+ 0x4047da36UL, 0x1ba1ba1cUL, 0x401ba1baUL, 0x00000000UL, 0xbff00000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x40000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0xc7ab4d5aUL, 0xc0085e24UL, 0x00000000UL, 0x00000000UL, 0xe93ea75dUL,
+ 0x400b963dUL, 0x00000000UL, 0x00000000UL, 0x94a7f25aUL, 0xc00f37e2UL,
+ 0x4b6261cbUL, 0xbff5f984UL, 0x5a9dd812UL, 0x4011aab0UL, 0x74c30018UL,
+ 0x3ffaf5a5UL, 0x7f2ce8e3UL, 0xc013fe8bUL, 0xfe8e54faUL, 0xbffd7334UL,
+ 0x670d618dUL, 0x4016a10cUL, 0x4db97058UL, 0x4000e012UL, 0x24df44ddUL,
+ 0xc0199c5fUL, 0x697d6eceUL, 0xc003006eUL, 0x83298b82UL, 0x401cfc4dUL,
+ 0x19d490d6UL, 0x40058c19UL, 0x2ae42850UL, 0xbfea4300UL, 0x118e20e6UL,
+ 0x3c7a6db8UL, 0x00000000UL, 0x40000000UL, 0xe33345b8UL, 0xbfd4e526UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x2b2c49d0UL,
+ 0xbff2de9cUL, 0x00000000UL, 0x00000000UL, 0x2655bc98UL, 0x3ff33e58UL,
+ 0x00000000UL, 0x00000000UL, 0xff691fa2UL, 0xbff3972eUL, 0xe93463bdUL,
+ 0xbfeeed87UL, 0x070e10a0UL, 0x3ff3f5b2UL, 0xf4d790a4UL, 0x3ff20c10UL,
+ 0xa04e8ea3UL, 0xbff4541aUL, 0x386accd3UL, 0xbff1369eUL, 0x222a66ddUL,
+ 0x3ff4b521UL, 0x22a9777eUL, 0x3ff20817UL, 0x52a04a6eUL, 0xbff5178fUL,
+ 0xddaa0031UL, 0xbff22137UL, 0x4447d47cUL, 0x3ff57c01UL, 0x1e9c7f1dUL,
+ 0x3ff29311UL, 0x2ab7f990UL, 0xbfe561b8UL, 0x209c7df1UL, 0xbc87a8c5UL,
+ 0x00000000UL, 0x3ff00000UL, 0x4170bcc6UL, 0x3fdc92d8UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xcc03e501UL, 0xbfdff10fUL,
+ 0x00000000UL, 0x00000000UL, 0x44a4e845UL, 0x3fddb63bUL, 0x00000000UL,
+ 0x00000000UL, 0x3768ad9fUL, 0xbfdb72a4UL, 0x3dd01ccaUL, 0xbfe5fdb9UL,
+ 0xa61d2811UL, 0x3fd972b2UL, 0x5645ad0bUL, 0x3fe977f9UL, 0xd013b3abUL,
+ 0xbfd78ca3UL, 0xbf0bf914UL, 0xbfe4f192UL, 0x4d53e730UL, 0x3fd5d060UL,
+ 0x3f8b9000UL, 0x3fe49933UL, 0xe2b82f08UL, 0xbfd4322aUL, 0x5936a835UL,
+ 0xbfe27ae1UL, 0xb1c61c9bUL, 0x3fd2b3fbUL, 0xef478605UL, 0x3fe1659eUL,
+ 0x190834ecUL, 0xbfe11ab7UL, 0xcdb625eaUL, 0x3c8e564bUL, 0x00000000UL,
+ 0x3ff00000UL, 0xb07217e3UL, 0x3fd248f1UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x56f37042UL, 0xbfccfc56UL, 0x00000000UL,
+ 0x00000000UL, 0xaa563951UL, 0x3fc90125UL, 0x00000000UL, 0x00000000UL,
+ 0x3d0e7c5dUL, 0xbfc50533UL, 0x9bed9b2eUL, 0xbfdf0ed9UL, 0x5fe7c47cUL,
+ 0x3fc1f250UL, 0x96c125e5UL, 0x3fe2edd9UL, 0x5a02bbd8UL, 0xbfbe5c71UL,
+ 0x86362c20UL, 0xbfda08b7UL, 0x4b4435edUL, 0x3fb9d342UL, 0x4b494091UL,
+ 0x3fd911bdUL, 0xb56658beUL, 0xbfb5e4c7UL, 0x93a2fd76UL, 0xbfd3c092UL,
+ 0xda271794UL, 0x3fb29910UL, 0x3303df2bUL, 0x3fd189beUL, 0x99fcef32UL,
+ 0xbfda8279UL, 0xb68c1467UL, 0xbc708b2fUL, 0x00000000UL, 0x3ff00000UL,
+ 0x980c4337UL, 0x3fc5f619UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x9314533eUL, 0xbfbb8ec5UL, 0x00000000UL, 0x00000000UL,
+ 0x09aa36d0UL, 0x3fb6d3f4UL, 0x00000000UL, 0x00000000UL, 0xdcb427fdUL,
+ 0xbfb13950UL, 0xd87ab0bbUL, 0xbfd5335eUL, 0xce0ae8a5UL, 0x3fabb382UL,
+ 0x79143126UL, 0x3fddba41UL, 0x5f2b28d4UL, 0xbfa552f1UL, 0x59f21a6dUL,
+ 0xbfd015abUL, 0x22c27d95UL, 0x3fa0e984UL, 0xe19fc6aaUL, 0x3fd0576cUL,
+ 0x8f2c2950UL, 0xbf9a4898UL, 0xc0b3f22cUL, 0xbfc59462UL, 0x1883a4b8UL,
+ 0x3f94b61cUL, 0x3f838640UL, 0x3fc30eb8UL, 0x355c63dcUL, 0xbfd36a08UL,
+ 0x1dce993dUL, 0x3c6d704dUL, 0x00000000UL, 0x3ff00000UL, 0x2b82ab63UL,
+ 0x3fb78e92UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
+ 0x5a279ea3UL, 0xbfaa3407UL, 0x00000000UL, 0x00000000UL, 0x432d65faUL,
+ 0x3fa70153UL, 0x00000000UL, 0x00000000UL, 0x891a4602UL, 0xbf9d03efUL,
+ 0xd62ca5f8UL, 0xbfca77d9UL, 0xb35f4628UL, 0x3f97a265UL, 0x433258faUL,
+ 0x3fd8cf51UL, 0xb58fd909UL, 0xbf8f88e3UL, 0x01771ceaUL, 0xbfc2b154UL,
+ 0xf3562f8eUL, 0x3f888f57UL, 0xc028a723UL, 0x3fc7370fUL, 0x20b7f9f0UL,
+ 0xbf80f44cUL, 0x214368e9UL, 0xbfb6dfaaUL, 0x28891863UL, 0x3f79b4b6UL,
+ 0x172dbbf0UL, 0x3fb6cb8eUL, 0xe0553158UL, 0xbfc975f5UL, 0x593fe814UL,
+ 0xbc2ef5d3UL, 0x00000000UL, 0x3ff00000UL, 0x03dec550UL, 0x3fa44203UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x4e435f9bUL,
+ 0xbf953f83UL, 0x00000000UL, 0x00000000UL, 0x3c6e8e46UL, 0x3f9b74eaUL,
+ 0x00000000UL, 0x00000000UL, 0xda5b7511UL, 0xbf85ad63UL, 0xdc230b9bUL,
+ 0xbfb97558UL, 0x26cb3788UL, 0x3f881308UL, 0x76fc4985UL, 0x3fd62ac9UL,
+ 0x77bb08baUL, 0xbf757c85UL, 0xb6247521UL, 0xbfb1381eUL, 0x5922170cUL,
+ 0x3f754e95UL, 0x8746482dUL, 0x3fc27f83UL, 0x11055b30UL, 0xbf64e391UL,
+ 0x3e666320UL, 0xbfa3e609UL, 0x0de9dae3UL, 0x3f6301dfUL, 0x1f1dca06UL,
+ 0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
+ 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x6dc9c883UL, 0x3fe45f30UL,
+ 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x43780000UL, 0x00000000UL,
+ 0x43380000UL, 0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL,
+ 0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL, 0x3707344aUL,
+ 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL, 0x00000000UL, 0x80000000UL,
+ 0x00000000UL, 0x80000000UL, 0x676733afUL, 0x3d32e7b9UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x7ff00000UL, 0x00000000UL, 0x00000000UL, 0xfffc0000UL,
+ 0xffffffffUL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
+ 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
+ 0x00000000UL, 0x00000000UL, 0x3ca00000UL, 0x00000000UL, 0x00000000UL,
+ 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL, 0x00000000UL,
+ 0x40300000UL, 0x00000000UL, 0x3ff00000UL
+};
+
+void MacroAssembler::fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register eax, Register ecx, Register edx, Register tmp) {
+
+ Label L_2TAG_PACKET_0_0_2, L_2TAG_PACKET_1_0_2, L_2TAG_PACKET_2_0_2, L_2TAG_PACKET_3_0_2;
+ Label L_2TAG_PACKET_4_0_2, L_2TAG_PACKET_5_0_2, L_2TAG_PACKET_6_0_2, L_2TAG_PACKET_7_0_2;
+ Label L_2TAG_PACKET_8_0_2, L_2TAG_PACKET_9_0_2, L_2TAG_PACKET_10_0_2, L_2TAG_PACKET_11_0_2;
+ Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
+
+ assert_different_registers(tmp, eax, ecx, edx);
+
+ address static_const_table_tan = (address)_static_const_table_tan;
+
+ bind(start);
+ subl(rsp, 120);
+ movl(Address(rsp, 56), tmp);
+ lea(tmp, ExternalAddress(static_const_table_tan));
+ movsd(xmm0, Address(rsp, 128));
+ pextrw(eax, xmm0, 3);
+ andl(eax, 32767);
+ subl(eax, 14368);
+ cmpl(eax, 2216);
+ jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
+ movdqu(xmm5, Address(tmp, 5840));
+ movdqu(xmm6, Address(tmp, 5856));
+ unpcklpd(xmm0, xmm0);
+ movdqu(xmm4, Address(tmp, 5712));
+ andpd(xmm4, xmm0);
+ movdqu(xmm1, Address(tmp, 5632));
+ mulpd(xmm1, xmm0);
+ por(xmm5, xmm4);
+ addpd(xmm1, xmm5);
+ movdqu(xmm7, xmm1);
+ unpckhpd(xmm7, xmm7);
+ cvttsd2sil(edx, xmm7);
+ cvttpd2dq(xmm1, xmm1);
+ cvtdq2pd(xmm1, xmm1);
+ mulpd(xmm1, xmm6);
+ movdqu(xmm3, Address(tmp, 5664));
+ movsd(xmm5, Address(tmp, 5728));
+ addl(edx, 469248);
+ movdqu(xmm4, Address(tmp, 5680));
+ mulpd(xmm3, xmm1);
+ andl(edx, 31);
+ mulsd(xmm5, xmm1);
+ movl(ecx, edx);
+ mulpd(xmm4, xmm1);
+ shll(ecx, 1);
+ subpd(xmm0, xmm3);
+ mulpd(xmm1, Address(tmp, 5696));
+ addl(edx, ecx);
+ shll(ecx, 2);
+ addl(edx, ecx);
+ addsd(xmm5, xmm0);
+ movdqu(xmm2, xmm0);
+ subpd(xmm0, xmm4);
+ movsd(xmm6, Address(tmp, 5744));
+ shll(edx, 4);
+ lea(eax, Address(tmp, 0));
+ andpd(xmm5, Address(tmp, 5776));
+ movdqu(xmm3, xmm0);
+ addl(eax, edx);
+ subpd(xmm2, xmm0);
+ unpckhpd(xmm0, xmm0);
+ divsd(xmm6, xmm5);
+ subpd(xmm2, xmm4);
+ movdqu(xmm7, Address(eax, 16));
+ subsd(xmm3, xmm5);
+ mulpd(xmm7, xmm0);
+ subpd(xmm2, xmm1);
+ movdqu(xmm1, Address(eax, 48));
+ mulpd(xmm1, xmm0);
+ movdqu(xmm4, Address(eax, 96));
+ mulpd(xmm4, xmm0);
+ addsd(xmm2, xmm3);
+ movdqu(xmm3, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm7, Address(eax, 0));
+ addpd(xmm1, Address(eax, 32));
+ mulpd(xmm1, xmm0);
+ addpd(xmm4, Address(eax, 80));
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, Address(eax, 112));
+ mulpd(xmm1, xmm0);
+ mulpd(xmm0, xmm0);
+ addpd(xmm4, xmm1);
+ movdqu(xmm1, Address(eax, 64));
+ mulpd(xmm1, xmm0);
+ addpd(xmm7, xmm1);
+ movdqu(xmm1, xmm3);
+ mulpd(xmm3, xmm0);
+ mulsd(xmm0, xmm0);
+ mulpd(xmm1, Address(eax, 144));
+ mulpd(xmm4, xmm3);
+ movdqu(xmm3, xmm1);
+ addpd(xmm7, xmm4);
+ movdqu(xmm4, xmm1);
+ mulsd(xmm0, xmm7);
+ unpckhpd(xmm7, xmm7);
+ addsd(xmm0, xmm7);
+ unpckhpd(xmm1, xmm1);
+ addsd(xmm3, xmm1);
+ subsd(xmm4, xmm3);
+ addsd(xmm1, xmm4);
+ movdqu(xmm4, xmm2);
+ movsd(xmm7, Address(eax, 144));
+ unpckhpd(xmm2, xmm2);
+ addsd(xmm7, Address(eax, 152));
+ mulsd(xmm7, xmm2);
+ addsd(xmm7, Address(eax, 136));
+ addsd(xmm7, xmm1);
+ addsd(xmm0, xmm7);
+ movsd(xmm7, Address(tmp, 5744));
+ mulsd(xmm4, xmm6);
+ movsd(xmm2, Address(eax, 168));
+ andpd(xmm2, xmm6);
+ mulsd(xmm5, xmm2);
+ mulsd(xmm6, Address(eax, 160));
+ subsd(xmm7, xmm5);
+ subsd(xmm2, Address(eax, 128));
+ subsd(xmm7, xmm4);
+ mulsd(xmm7, xmm6);
+ movdqu(xmm4, xmm3);
+ subsd(xmm3, xmm2);
+ addsd(xmm2, xmm3);
+ subsd(xmm4, xmm2);
+ addsd(xmm0, xmm4);
+ subsd(xmm0, xmm7);
+ addsd(xmm0, xmm3);
+ movsd(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_0_0_2);
+ jcc(Assembler::greater, L_2TAG_PACKET_2_0_2);
+ shrl(eax, 4);
+ cmpl(eax, 268434558);
+ jcc(Assembler::notEqual, L_2TAG_PACKET_3_0_2);
+ movdqu(xmm3, xmm0);
+ mulsd(xmm3, Address(tmp, 5808));
+
+ bind(L_2TAG_PACKET_3_0_2);
+ movsd(xmm3, Address(tmp, 5792));
+ mulsd(xmm3, xmm0);
+ addsd(xmm3, xmm0);
+ mulsd(xmm3, Address(tmp, 5808));
+ movsd(Address(rsp, 0), xmm3);
+ fld_d(Address(rsp, 0));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_2_0_2);
+ movq(xmm7, Address(tmp, 5712));
+ andpd(xmm7, xmm0);
+ xorpd(xmm7, xmm0);
+ ucomisd(xmm7, Address(tmp, 5760));
+ jcc(Assembler::equal, L_2TAG_PACKET_4_0_2);
+ subl(rsp, 32);
+ movsd(Address(rsp, 0), xmm0);
+ lea(eax, Address(rsp, 40));
+ movl(Address(rsp, 8), eax);
+ movl(eax, 2);
+ movl(Address(rsp, 12), eax);
+ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlibm_tan_cot_huge())));
+ addl(rsp, 32);
+ fld_d(Address(rsp, 8));
+ jmp(L_2TAG_PACKET_1_0_2);
+
+ bind(L_2TAG_PACKET_4_0_2);
+ movq(Address(rsp, 0), xmm0);
+ fld_d(Address(rsp, 0));
+ fsub_d(Address(rsp, 0));
+
+ bind(L_2TAG_PACKET_1_0_2);
+ movl(tmp, Address(rsp, 56));
+}
+#endif
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2093,25 +2093,6 @@
entry_checkcast_arraycopy);
}
- void generate_math_stubs() {
- {
- StubCodeMark mark(this, "StubRoutines", "log10");
- StubRoutines::_intrinsic_log10 = (double (*)(double)) __ pc();
-
- __ fld_d(Address(rsp, 4));
- __ flog10();
- __ ret(0);
- }
- {
- StubCodeMark mark(this, "StubRoutines", "tan");
- StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc();
-
- __ fld_d(Address(rsp, 4));
- __ trigfunc('t');
- __ ret(0);
- }
- }
-
// AES intrinsic stubs
enum {AESBlockSize = 16};
@@ -3534,6 +3515,31 @@
}
+ address generate_libmLog10() {
+ address start = __ pc();
+
+ const XMMRegister x0 = xmm0;
+ const XMMRegister x1 = xmm1;
+ const XMMRegister x2 = xmm2;
+ const XMMRegister x3 = xmm3;
+
+ const XMMRegister x4 = xmm4;
+ const XMMRegister x5 = xmm5;
+ const XMMRegister x6 = xmm6;
+ const XMMRegister x7 = xmm7;
+
+ const Register tmp = rbx;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+ __ fast_log10(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp);
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+
+ }
+
address generate_libmPow() {
address start = __ pc();
@@ -3630,6 +3636,44 @@
}
+ address generate_libm_tan_cot_huge() {
+ address start = __ pc();
+
+ const XMMRegister x0 = xmm0;
+ const XMMRegister x1 = xmm1;
+
+ BLOCK_COMMENT("Entry:");
+ __ libm_tancot_huge(x0, x1, rax, rcx, rdx, rbx, rsi, rdi, rbp, rsp);
+
+ return start;
+
+ }
+
+ address generate_libmTan() {
+ address start = __ pc();
+
+ const XMMRegister x0 = xmm0;
+ const XMMRegister x1 = xmm1;
+ const XMMRegister x2 = xmm2;
+ const XMMRegister x3 = xmm3;
+
+ const XMMRegister x4 = xmm4;
+ const XMMRegister x5 = xmm5;
+ const XMMRegister x6 = xmm6;
+ const XMMRegister x7 = xmm7;
+
+ const Register tmp = rbx;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+ __ fast_tan(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp);
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+
+ }
+
// Safefetch stubs.
void generate_safefetch(const char* name, int size, address* entry,
address* fault_pc, address* continuation_pc) {
@@ -3853,24 +3897,25 @@
StubRoutines::_crc32c_table_addr = (address)StubRoutines::x86::_crc32c_table;
StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C(supports_clmul);
}
- if (VM_Version::supports_sse2()) {
+ if (VM_Version::supports_sse2() && UseLibmIntrinsic) {
+ StubRoutines::x86::_L_2il0floatpacket_0_adr = (address)StubRoutines::x86::_L_2il0floatpacket_0;
+ StubRoutines::x86::_Pi4Inv_adr = (address)StubRoutines::x86::_Pi4Inv;
+ StubRoutines::x86::_Pi4x3_adr = (address)StubRoutines::x86::_Pi4x3;
+ StubRoutines::x86::_Pi4x4_adr = (address)StubRoutines::x86::_Pi4x4;
+ StubRoutines::x86::_ones_adr = (address)StubRoutines::x86::_ones;
StubRoutines::_dexp = generate_libmExp();
StubRoutines::_dlog = generate_libmLog();
+ StubRoutines::_dlog10 = generate_libmLog10();
StubRoutines::_dpow = generate_libmPow();
- if (UseLibmSinIntrinsic || UseLibmCosIntrinsic) {
- StubRoutines::_dlibm_reduce_pi04l = generate_libm_reduce_pi04l();
- StubRoutines::_dlibm_sin_cos_huge = generate_libm_sin_cos_huge();
- }
- if (UseLibmSinIntrinsic) {
- StubRoutines::_dsin = generate_libmSin();
- }
- if (UseLibmCosIntrinsic) {
- StubRoutines::_dcos = generate_libmCos();
- }
+ StubRoutines::_dlibm_reduce_pi04l = generate_libm_reduce_pi04l();
+ StubRoutines::_dlibm_sin_cos_huge = generate_libm_sin_cos_huge();
+ StubRoutines::_dsin = generate_libmSin();
+ StubRoutines::_dcos = generate_libmCos();
+ StubRoutines::_dlibm_tan_cot_huge = generate_libm_tan_cot_huge();
+ StubRoutines::_dtan = generate_libmTan();
}
}
-
void generate_all() {
// Generates all stubs and initializes the entry points
@@ -3889,8 +3934,6 @@
// arraycopy stubs used by compilers
generate_arraycopy_stubs();
- generate_math_stubs();
-
// don't bother generating these AES intrinsic stubs unless global flag is set
if (UseAESIntrinsics) {
StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // might be needed by the others
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2972,35 +2972,6 @@
StubRoutines::_arrayof_oop_arraycopy_uninit = StubRoutines::_oop_arraycopy_uninit;
}
- void generate_math_stubs() {
- {
- StubCodeMark mark(this, "StubRoutines", "log10");
- StubRoutines::_intrinsic_log10 = (double (*)(double)) __ pc();
-
- __ subq(rsp, 8);
- __ movdbl(Address(rsp, 0), xmm0);
- __ fld_d(Address(rsp, 0));
- __ flog10();
- __ fstp_d(Address(rsp, 0));
- __ movdbl(xmm0, Address(rsp, 0));
- __ addq(rsp, 8);
- __ ret(0);
- }
- {
- StubCodeMark mark(this, "StubRoutines", "tan");
- StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc();
-
- __ subq(rsp, 8);
- __ movdbl(Address(rsp, 0), xmm0);
- __ fld_d(Address(rsp, 0));
- __ trigfunc('t');
- __ fstp_d(Address(rsp, 0));
- __ movdbl(xmm0, Address(rsp, 0));
- __ addq(rsp, 8);
- __ ret(0);
- }
- }
-
// AES intrinsic stubs
enum {AESBlockSize = 16};
@@ -4745,6 +4716,46 @@
}
+ address generate_libmLog10() {
+ address start = __ pc();
+
+ const XMMRegister x0 = xmm0;
+ const XMMRegister x1 = xmm1;
+ const XMMRegister x2 = xmm2;
+ const XMMRegister x3 = xmm3;
+
+ const XMMRegister x4 = xmm4;
+ const XMMRegister x5 = xmm5;
+ const XMMRegister x6 = xmm6;
+ const XMMRegister x7 = xmm7;
+
+ const Register tmp = r11;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+#ifdef _WIN64
+ // save the xmm registers which must be preserved 6-7
+ __ subptr(rsp, 4 * wordSize);
+ __ movdqu(Address(rsp, 0), xmm6);
+ __ movdqu(Address(rsp, 2 * wordSize), xmm7);
+#endif
+ __ fast_log10(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp);
+
+#ifdef _WIN64
+ // restore xmm regs belonging to calling function
+ __ movdqu(xmm6, Address(rsp, 0));
+ __ movdqu(xmm7, Address(rsp, 2 * wordSize));
+ __ addptr(rsp, 4 * wordSize);
+#endif
+
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+
+ }
+
address generate_libmPow() {
address start = __ pc();
@@ -4810,6 +4821,8 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
#ifdef _WIN64
+ __ push(rsi);
+ __ push(rdi);
// save the xmm registers which must be preserved 6-7
__ subptr(rsp, 4 * wordSize);
__ movdqu(Address(rsp, 0), xmm6);
@@ -4822,6 +4835,8 @@
__ movdqu(xmm6, Address(rsp, 0));
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
__ addptr(rsp, 4 * wordSize);
+ __ pop(rdi);
+ __ pop(rsi);
#endif
__ leave(); // required for proper stackwalking of RuntimeStub frame
@@ -4853,6 +4868,8 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
#ifdef _WIN64
+ __ push(rsi);
+ __ push(rdi);
// save the xmm registers which must be preserved 6-7
__ subptr(rsp, 4 * wordSize);
__ movdqu(Address(rsp, 0), xmm6);
@@ -4865,6 +4882,55 @@
__ movdqu(xmm6, Address(rsp, 0));
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
__ addptr(rsp, 4 * wordSize);
+ __ pop(rdi);
+ __ pop(rsi);
+#endif
+
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+
+ }
+
+ address generate_libmTan() {
+ address start = __ pc();
+
+ const XMMRegister x0 = xmm0;
+ const XMMRegister x1 = xmm1;
+ const XMMRegister x2 = xmm2;
+ const XMMRegister x3 = xmm3;
+
+ const XMMRegister x4 = xmm4;
+ const XMMRegister x5 = xmm5;
+ const XMMRegister x6 = xmm6;
+ const XMMRegister x7 = xmm7;
+
+ const Register tmp1 = r8;
+ const Register tmp2 = r9;
+ const Register tmp3 = r10;
+ const Register tmp4 = r11;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+#ifdef _WIN64
+ __ push(rsi);
+ __ push(rdi);
+ // save the xmm registers which must be preserved 6-7
+ __ subptr(rsp, 4 * wordSize);
+ __ movdqu(Address(rsp, 0), xmm6);
+ __ movdqu(Address(rsp, 2 * wordSize), xmm7);
+#endif
+ __ fast_tan(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4);
+
+#ifdef _WIN64
+ // restore xmm regs belonging to calling function
+ __ movdqu(xmm6, Address(rsp, 0));
+ __ movdqu(xmm7, Address(rsp, 2 * wordSize));
+ __ addptr(rsp, 4 * wordSize);
+ __ pop(rdi);
+ __ pop(rsi);
#endif
__ leave(); // required for proper stackwalking of RuntimeStub frame
@@ -5065,16 +5131,28 @@
StubRoutines::_crc32c_table_addr = (address)StubRoutines::x86::_crc32c_table;
StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C(supports_clmul);
}
- if (VM_Version::supports_sse2()) {
+ if (VM_Version::supports_sse2() && UseLibmIntrinsic) {
+ StubRoutines::x86::_ONEHALF_adr = (address)StubRoutines::x86::_ONEHALF;
+ StubRoutines::x86::_P_2_adr = (address)StubRoutines::x86::_P_2;
+ StubRoutines::x86::_SC_4_adr = (address)StubRoutines::x86::_SC_4;
+ StubRoutines::x86::_Ctable_adr = (address)StubRoutines::x86::_Ctable;
+ StubRoutines::x86::_SC_2_adr = (address)StubRoutines::x86::_SC_2;
+ StubRoutines::x86::_SC_3_adr = (address)StubRoutines::x86::_SC_3;
+ StubRoutines::x86::_SC_1_adr = (address)StubRoutines::x86::_SC_1;
+ StubRoutines::x86::_PI_INV_TABLE_adr = (address)StubRoutines::x86::_PI_INV_TABLE;
+ StubRoutines::x86::_PI_4_adr = (address)StubRoutines::x86::_PI_4;
+ StubRoutines::x86::_PI32INV_adr = (address)StubRoutines::x86::_PI32INV;
+ StubRoutines::x86::_SIGN_MASK_adr = (address)StubRoutines::x86::_SIGN_MASK;
+ StubRoutines::x86::_P_1_adr = (address)StubRoutines::x86::_P_1;
+ StubRoutines::x86::_P_3_adr = (address)StubRoutines::x86::_P_3;
+ StubRoutines::x86::_NEG_ZERO_adr = (address)StubRoutines::x86::_NEG_ZERO;
StubRoutines::_dexp = generate_libmExp();
StubRoutines::_dlog = generate_libmLog();
+ StubRoutines::_dlog10 = generate_libmLog10();
StubRoutines::_dpow = generate_libmPow();
- if (UseLibmSinIntrinsic) {
- StubRoutines::_dsin = generate_libmSin();
- }
- if (UseLibmCosIntrinsic) {
- StubRoutines::_dcos = generate_libmCos();
- }
+ StubRoutines::_dtan = generate_libmTan();
+ StubRoutines::_dsin = generate_libmSin();
+ StubRoutines::_dcos = generate_libmCos();
}
}
@@ -5119,8 +5197,6 @@
// arraycopy stubs used by compilers
generate_arraycopy_stubs();
- generate_math_stubs();
-
// don't bother generating these AES intrinsic stubs unless global flag is set
if (UseAESIntrinsics) {
StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // needed by the others
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -48,6 +48,29 @@
address StubRoutines::x86::_k256_adr = NULL;
address StubRoutines::x86::_pshuffle_byte_flip_mask_addr = NULL;
+//tables common for sin and cos
+address StubRoutines::x86::_ONEHALF_adr = NULL;
+address StubRoutines::x86::_P_2_adr = NULL;
+address StubRoutines::x86::_SC_4_adr = NULL;
+address StubRoutines::x86::_Ctable_adr = NULL;
+address StubRoutines::x86::_SC_2_adr = NULL;
+address StubRoutines::x86::_SC_3_adr = NULL;
+address StubRoutines::x86::_SC_1_adr = NULL;
+address StubRoutines::x86::_PI_INV_TABLE_adr = NULL;
+address StubRoutines::x86::_PI_4_adr = NULL;
+address StubRoutines::x86::_PI32INV_adr = NULL;
+address StubRoutines::x86::_SIGN_MASK_adr = NULL;
+address StubRoutines::x86::_P_1_adr = NULL;
+address StubRoutines::x86::_P_3_adr = NULL;
+address StubRoutines::x86::_NEG_ZERO_adr = NULL;
+
+//tables common for sincos and tancot
+address StubRoutines::x86::_L_2il0floatpacket_0_adr = NULL;
+address StubRoutines::x86::_Pi4Inv_adr = NULL;
+address StubRoutines::x86::_Pi4x3_adr = NULL;
+address StubRoutines::x86::_Pi4x4_adr = NULL;
+address StubRoutines::x86::_ones_adr = NULL;
+
uint64_t StubRoutines::x86::_crc_by128_masks[] =
{
/* The fields in this structure are arranged so that they can be
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -57,6 +57,48 @@
// byte flip mask for sha256
static address _pshuffle_byte_flip_mask_addr;
+ //tables common for LIBM sin and cos
+ static juint _ONEHALF[];
+ static address _ONEHALF_adr;
+ static juint _P_2[];
+ static address _P_2_adr;
+ static juint _SC_4[];
+ static address _SC_4_adr;
+ static juint _Ctable[];
+ static address _Ctable_adr;
+ static juint _SC_2[];
+ static address _SC_2_adr;
+ static juint _SC_3[];
+ static address _SC_3_adr;
+ static juint _SC_1[];
+ static address _SC_1_adr;
+ static juint _PI_INV_TABLE[];
+ static address _PI_INV_TABLE_adr;
+ static juint _PI_4[];
+ static address _PI_4_adr;
+ static juint _PI32INV[];
+ static address _PI32INV_adr;
+ static juint _SIGN_MASK[];
+ static address _SIGN_MASK_adr;
+ static juint _P_1[];
+ static address _P_1_adr;
+ static juint _P_3[];
+ static address _P_3_adr;
+ static juint _NEG_ZERO[];
+ static address _NEG_ZERO_adr;
+
+ //tables common for LIBM sincos and tancot
+ static juint _L_2il0floatpacket_0[];
+ static address _L_2il0floatpacket_0_adr;
+ static juint _Pi4Inv[];
+ static address _Pi4Inv_adr;
+ static juint _Pi4x3[];
+ static address _Pi4x3_adr;
+ static juint _Pi4x4[];
+ static address _Pi4x4_adr;
+ static juint _ones[];
+ static address _ones_adr;
+
public:
static address verify_mxcsr_entry() { return _verify_mxcsr_entry; }
static address key_shuffle_mask_addr() { return _key_shuffle_mask_addr; }
@@ -69,4 +111,24 @@
static address k256_addr() { return _k256_adr; }
static address pshuffle_byte_flip_mask_addr() { return _pshuffle_byte_flip_mask_addr; }
static void generate_CRC32C_table(bool is_pclmulqdq_supported);
+ static address _ONEHALF_addr() { return _ONEHALF_adr; }
+ static address _P_2_addr() { return _P_2_adr; }
+ static address _SC_4_addr() { return _SC_4_adr; }
+ static address _Ctable_addr() { return _Ctable_adr; }
+ static address _SC_2_addr() { return _SC_2_adr; }
+ static address _SC_3_addr() { return _SC_3_adr; }
+ static address _SC_1_addr() { return _SC_1_adr; }
+ static address _PI_INV_TABLE_addr() { return _PI_INV_TABLE_adr; }
+ static address _PI_4_addr() { return _PI_4_adr; }
+ static address _PI32INV_addr() { return _PI32INV_adr; }
+ static address _SIGN_MASK_addr() { return _SIGN_MASK_adr; }
+ static address _P_1_addr() { return _P_1_adr; }
+ static address _P_3_addr() { return _P_3_adr; }
+ static address _NEG_ZERO_addr() { return _NEG_ZERO_adr; }
+ static address _L_2il0floatpacket_0_addr() { return _L_2il0floatpacket_0_adr; }
+ static address _Pi4Inv_addr() { return _Pi4Inv_adr; }
+ static address _Pi4x3_addr() { return _Pi4x3_adr; }
+ static address _Pi4x4_addr() { return _Pi4x4_adr; }
+ static address _ones_addr() { return _ones_adr; }
+
#endif // CPU_X86_VM_STUBROUTINES_X86_32_HPP
--- a/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86_32.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86_32.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -345,13 +345,34 @@
__ fld_d(Address(rsp, 1*wordSize));
switch (kind) {
case Interpreter::java_lang_math_sin :
- __ trigfunc('s');
+ __ subptr(rsp, 2 * wordSize);
+ __ fstp_d(Address(rsp, 0));
+ if (VM_Version::supports_sse2() && StubRoutines::dsin() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dsin())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dsin)));
+ }
+ __ addptr(rsp, 2 * wordSize);
break;
case Interpreter::java_lang_math_cos :
- __ trigfunc('c');
+ __ subptr(rsp, 2 * wordSize);
+ __ fstp_d(Address(rsp, 0));
+ if (VM_Version::supports_sse2() && StubRoutines::dcos() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcos())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dcos)));
+ }
+ __ addptr(rsp, 2 * wordSize);
break;
case Interpreter::java_lang_math_tan :
- __ trigfunc('t');
+ __ subptr(rsp, 2 * wordSize);
+ __ fstp_d(Address(rsp, 0));
+ if (StubRoutines::dtan() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dtan())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtan)));
+ }
+ __ addptr(rsp, 2 * wordSize);
break;
case Interpreter::java_lang_math_sqrt:
__ fsqrt();
@@ -362,26 +383,29 @@
case Interpreter::java_lang_math_log:
__ subptr(rsp, 2 * wordSize);
__ fstp_d(Address(rsp, 0));
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dlog() != NULL) {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog())));
- }
- else {
+ } else {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dlog)));
}
__ addptr(rsp, 2 * wordSize);
break;
case Interpreter::java_lang_math_log10:
- __ flog10();
- // Store to stack to convert 80bit precision back to 64bits
- __ push_fTOS();
- __ pop_fTOS();
+ __ subptr(rsp, 2 * wordSize);
+ __ fstp_d(Address(rsp, 0));
+ if (StubRoutines::dlog10() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog10())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10)));
+ }
+ __ addptr(rsp, 2 * wordSize);
break;
case Interpreter::java_lang_math_pow:
__ fld_d(Address(rsp, 3*wordSize)); // second argument
__ subptr(rsp, 4 * wordSize);
__ fstp_d(Address(rsp, 0));
__ fstp_d(Address(rsp, 2 * wordSize));
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dpow() != NULL) {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dpow())));
} else {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dpow)));
@@ -391,7 +415,7 @@
case Interpreter::java_lang_math_exp:
__ subptr(rsp, 2*wordSize);
__ fstp_d(Address(rsp, 0));
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dexp() != NULL) {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dexp())));
} else {
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dexp)));
--- a/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86_64.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86_64.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -29,6 +29,7 @@
#include "interpreter/interpreterRuntime.hpp"
#include "interpreter/templateInterpreterGenerator.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/sharedRuntime.hpp"
#define __ _masm->
@@ -373,32 +374,60 @@
__ sqrtsd(xmm0, Address(rsp, wordSize));
} else if (kind == Interpreter::java_lang_math_exp) {
__ movdbl(xmm0, Address(rsp, wordSize));
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dexp())));
+ if (StubRoutines::dexp() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dexp())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dexp)));
+ }
} else if (kind == Interpreter::java_lang_math_log) {
__ movdbl(xmm0, Address(rsp, wordSize));
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog())));
+ if (StubRoutines::dlog() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dlog)));
+ }
+ } else if (kind == Interpreter::java_lang_math_log10) {
+ __ movdbl(xmm0, Address(rsp, wordSize));
+ if (StubRoutines::dlog10() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog10())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10)));
+ }
+ } else if (kind == Interpreter::java_lang_math_sin) {
+ __ movdbl(xmm0, Address(rsp, wordSize));
+ if (StubRoutines::dsin() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dsin())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dsin)));
+ }
+ } else if (kind == Interpreter::java_lang_math_cos) {
+ __ movdbl(xmm0, Address(rsp, wordSize));
+ if (StubRoutines::dcos() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcos())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dcos)));
+ }
} else if (kind == Interpreter::java_lang_math_pow) {
__ movdbl(xmm1, Address(rsp, wordSize));
__ movdbl(xmm0, Address(rsp, 3 * wordSize));
- __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dpow())));
+ if (StubRoutines::dpow() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dpow())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dpow)));
+ }
+ } else if (kind == Interpreter::java_lang_math_tan) {
+ __ movdbl(xmm0, Address(rsp, wordSize));
+ if (StubRoutines::dtan() != NULL) {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dtan())));
+ } else {
+ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtan)));
+ }
} else {
__ fld_d(Address(rsp, wordSize));
switch (kind) {
- case Interpreter::java_lang_math_sin :
- __ trigfunc('s');
- break;
- case Interpreter::java_lang_math_cos :
- __ trigfunc('c');
- break;
- case Interpreter::java_lang_math_tan :
- __ trigfunc('t');
- break;
case Interpreter::java_lang_math_abs:
__ fabs();
break;
- case Interpreter::java_lang_math_log10:
- __ flog10();
- break;
default :
ShouldNotReachHere();
}
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -844,6 +844,11 @@
static uint32_t get_xsave_header_upper_segment() {
return _cpuid_info.xem_xcr0_edx;
}
+
+ // SSE2 and later processors implement a 'pause' instruction
+ // that can be used for efficient implementation of
+ // the intrinsic for java.lang.Thread.onSpinWait()
+ static bool supports_on_spin_wait() { return supports_sse2(); }
};
#endif // CPU_X86_VM_VM_VERSION_X86_HPP
--- a/hotspot/src/cpu/x86/vm/x86.ad Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/x86.ad Tue Apr 12 14:17:42 2016 -0400
@@ -1719,6 +1719,10 @@
if (!(UseSSE > 4))
ret_value = false;
break;
+ case Op_OnSpinWait:
+ if (VM_Version::supports_on_spin_wait() == false)
+ ret_value = false;
+ break;
}
return ret_value; // Per default match rules are supported.
@@ -2996,6 +3000,24 @@
ins_pipe(pipe_slow);
%}
+instruct onspinwait() %{
+ match(OnSpinWait);
+ ins_cost(200);
+
+ format %{
+ $$template
+ if (os::is_MP()) {
+ $$emit$$"pause\t! membar_onspinwait"
+ } else {
+ $$emit$$"MEMBAR-onspinwait ! (empty encoding)"
+ }
+ %}
+ ins_encode %{
+ __ pause();
+ %}
+ ins_pipe(pipe_slow);
+%}
+
// ====================VECTOR INSTRUCTIONS=====================================
// Load vectors (4 bytes long)
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Tue Apr 12 14:17:42 2016 -0400
@@ -9828,27 +9828,6 @@
ins_pipe( pipe_slow );
%}
-instruct tanDPR_reg(regDPR1 dst, regDPR1 src) %{
- predicate (UseSSE<=1);
- match(Set dst(TanD src));
- format %{ "DTAN $dst" %}
- ins_encode( Opcode(0xD9), Opcode(0xF2), // fptan
- Opcode(0xDD), Opcode(0xD8)); // fstp st
- ins_pipe( pipe_slow );
-%}
-
-instruct tanD_reg(regD dst, eFlagsReg cr) %{
- predicate (UseSSE>=2);
- match(Set dst(TanD dst));
- effect(KILL cr); // Push_{Src|Result}D() uses "{SUB|ADD} ESP,8"
- format %{ "DTAN $dst" %}
- ins_encode( Push_SrcD(dst),
- Opcode(0xD9), Opcode(0xF2), // fptan
- Opcode(0xDD), Opcode(0xD8), // fstp st
- Push_ResultD(dst) );
- ins_pipe( pipe_slow );
-%}
-
instruct atanDPR_reg(regDPR dst, regDPR src) %{
predicate (UseSSE<=1);
match(Set dst(AtanD dst src));
@@ -9880,41 +9859,6 @@
ins_pipe( pipe_slow );
%}
-instruct log10DPR_reg(regDPR1 dst, regDPR1 src) %{
- predicate (UseSSE<=1);
- // The source Double operand on FPU stack
- match(Set dst (Log10D src));
- // fldlg2 ; push log_10(2) on the FPU stack; full 80-bit number
- // fxch ; swap ST(0) with ST(1)
- // fyl2x ; compute log_10(2) * log_2(x)
- format %{ "FLDLG2 \t\t\t#Log10\n\t"
- "FXCH \n\t"
- "FYL2X \t\t\t# Q=Log10*Log_2(x)"
- %}
- ins_encode( Opcode(0xD9), Opcode(0xEC), // fldlg2
- Opcode(0xD9), Opcode(0xC9), // fxch
- Opcode(0xD9), Opcode(0xF1)); // fyl2x
-
- ins_pipe( pipe_slow );
-%}
-
-instruct log10D_reg(regD dst, regD src, eFlagsReg cr) %{
- predicate (UseSSE>=2);
- effect(KILL cr);
- match(Set dst (Log10D src));
- // fldlg2 ; push log_10(2) on the FPU stack; full 80-bit number
- // fyl2x ; compute log_10(2) * log_2(x)
- format %{ "FLDLG2 \t\t\t#Log10\n\t"
- "FYL2X \t\t\t# Q=Log10*Log_2(x)"
- %}
- ins_encode( Opcode(0xD9), Opcode(0xEC), // fldlg2
- Push_SrcD(src),
- Opcode(0xD9), Opcode(0xF1), // fyl2x
- Push_ResultD(dst));
-
- ins_pipe( pipe_slow );
-%}
-
//-------------Float Instructions-------------------------------
// Float Math
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Tue Apr 12 14:17:42 2016 -0400
@@ -9897,34 +9897,6 @@
ins_pipe(pipe_slow);
%}
-// -----------Trig and Trancendental Instructions------------------------------
-instruct tanD_reg(regD dst) %{
- match(Set dst (TanD dst));
-
- format %{ "dtan $dst\n\t" %}
- ins_encode( Push_SrcXD(dst),
- Opcode(0xD9), Opcode(0xF2), //fptan
- Opcode(0xDD), Opcode(0xD8), //fstp st
- Push_ResultXD(dst) );
- ins_pipe( pipe_slow );
-%}
-
-instruct log10D_reg(regD dst) %{
- // The source and result Double operands in XMM registers
- match(Set dst (Log10D dst));
- // fldlg2 ; push log_10(2) on the FPU stack; full 80-bit number
- // fyl2x ; compute log_10(2) * log_2(x)
- format %{ "fldlg2\t\t\t#Log10\n\t"
- "fyl2x\t\t\t# Q=Log10*Log_2(x)\n\t"
- %}
- ins_encode(Opcode(0xD9), Opcode(0xEC), // fldlg2
- Push_SrcXD(dst),
- Opcode(0xD9), Opcode(0xF1), // fyl2x
- Push_ResultXD(dst));
-
- ins_pipe( pipe_slow );
-%}
-
//----------Arithmetic Conversion Instructions---------------------------------
instruct roundFloat_nop(regF dst)
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCodeCacheProvider.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotCodeCacheProvider.java Tue Apr 12 14:17:42 2016 -0400
@@ -120,7 +120,9 @@
resultInstalledCode = installedCode;
}
- int result = runtime.getCompilerToVM().installCode(target, (HotSpotCompiledCode) compiledCode, resultInstalledCode, (HotSpotSpeculationLog) log);
+ HotSpotSpeculationLog speculationLog = (log != null && log.hasSpeculations()) ? (HotSpotSpeculationLog) log : null;
+
+ int result = runtime.getCompilerToVM().installCode(target, (HotSpotCompiledCode) compiledCode, resultInstalledCode, speculationLog);
if (result != config.codeInstallResultOk) {
String resultDesc = config.getCodeInstallResultDescription(result);
if (compiledCode instanceof HotSpotCompiledNmethod) {
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotSpeculationLog.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotSpeculationLog.java Tue Apr 12 14:17:42 2016 -0400
@@ -38,7 +38,7 @@
/** All speculations that have been a deoptimization reason. */
private Set<SpeculationReason> failedSpeculations;
- /** Strong references to all reasons embededded in the current nmethod. */
+ /** Strong references to all reasons embedded in the current nmethod. */
private volatile Collection<SpeculationReason> speculations;
@Override
@@ -81,4 +81,9 @@
return HotSpotObjectConstantImpl.forObject(reason);
}
+
+ @Override
+ public synchronized boolean hasSpeculations() {
+ return speculations != null && !speculations.isEmpty();
+ }
}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/SpeculationLog.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/SpeculationLog.java Tue Apr 12 14:17:42 2016 -0400
@@ -56,4 +56,11 @@
* argument to the deoptimization function.
*/
JavaConstant speculate(SpeculationReason reason);
+
+ /**
+ * Returns if this log has speculations.
+ *
+ * @return true if there are speculations, false otherwise
+ */
+ boolean hasSpeculations();
}
--- a/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -247,7 +247,7 @@
} else if ((lf = x->array()->as_LoadField()) != NULL) {
ciField* field = lf->field();
- if (field->is_constant() && field->is_static()) {
+ if (field->is_static_constant()) {
assert(PatchALot || ScavengeRootsInCode < 2, "Constant field loads are folded during parsing");
ciObject* c = field->constant_value().as_object();
if (!c->is_null_object()) {
--- a/hotspot/src/share/vm/c1/c1_CodeStubs.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_CodeStubs.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -77,17 +77,13 @@
}
};
-
-define_array(CodeStubArray, CodeStub*)
-define_stack(_CodeStubList, CodeStubArray)
-
-class CodeStubList: public _CodeStubList {
+class CodeStubList: public GrowableArray<CodeStub*> {
public:
- CodeStubList(): _CodeStubList() {}
+ CodeStubList(): GrowableArray<CodeStub*>() {}
void append(CodeStub* stub) {
if (!contains(stub)) {
- _CodeStubList::append(stub);
+ GrowableArray<CodeStub*>::append(stub);
}
}
};
--- a/hotspot/src/share/vm/c1/c1_Compilation.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Compilation.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,12 +53,9 @@
class CFGPrinter;
typedef LIR_OprDesc* LIR_Opr;
-
-define_array(BasicTypeArray, BasicType)
-define_stack(BasicTypeList, BasicTypeArray)
-
-define_array(ExceptionInfoArray, ExceptionInfo*)
-define_stack(ExceptionInfoList, ExceptionInfoArray)
+typedef GrowableArray<BasicType> BasicTypeArray;
+typedef GrowableArray<BasicType> BasicTypeList;
+typedef GrowableArray<ExceptionInfo*> ExceptionInfoList;
class Compilation: public StackObj {
friend class CompilationResourceObj;
--- a/hotspot/src/share/vm/c1/c1_Compiler.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Compiler.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -131,6 +131,9 @@
if (!VM_Version::supports_atomic_getset4()) return false;
#endif
break;
+ case vmIntrinsics::_onSpinWait:
+ if (!VM_Version::supports_on_spin_wait()) return false;
+ break;
case vmIntrinsics::_arraycopy:
case vmIntrinsics::_currentTimeMillis:
case vmIntrinsics::_nanoTime:
--- a/hotspot/src/share/vm/c1/c1_FrameMap.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_FrameMap.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -164,7 +164,7 @@
_reserved_argument_area_size = MAX2(4, reserved_argument_area_size) * BytesPerWord;
_argcount = method->arg_size();
- _argument_locations = new intArray(_argcount, -1);
+ _argument_locations = new intArray(_argcount, _argcount, -1);
_incoming_arguments = java_calling_convention(signature_type_array_for(method), false);
_oop_map_arg_count = _incoming_arguments->reserved_stack_slots();
--- a/hotspot/src/share/vm/c1/c1_FrameMap.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_FrameMap.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,8 +36,6 @@
class ciMethod;
class CallingConvention;
-class BasicTypeArray;
-class BasicTypeList;
//--------------------------------------------------------
// FrameMap
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -357,7 +357,7 @@
_active = BitMap(BlockBegin::number_of_blocks()); _active.clear();
_visited = BitMap(BlockBegin::number_of_blocks()); _visited.clear();
- _loop_map = intArray(BlockBegin::number_of_blocks(), 0);
+ _loop_map = intArray(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), 0);
_next_loop_index = 0;
_next_block_number = _blocks.length();
@@ -1354,7 +1354,7 @@
} else {
// collect successors & keys
BlockList* sux = new BlockList(l + 1, NULL);
- intArray* keys = new intArray(l, 0);
+ intArray* keys = new intArray(l, l, 0);
int i;
bool has_bb = false;
for (i = 0; i < l; i++) {
@@ -1521,6 +1521,8 @@
}
Value GraphBuilder::make_constant(ciConstant field_value, ciField* field) {
+ if (!field_value.is_valid()) return NULL;
+
BasicType field_type = field_value.basic_type();
ValueType* value = as_ValueType(field_value);
@@ -1588,9 +1590,8 @@
case Bytecodes::_getstatic: {
// check for compile-time constants, i.e., initialized static final fields
Value constant = NULL;
- if (field->is_constant() && !PatchALot) {
+ if (field->is_static_constant() && !PatchALot) {
ciConstant field_value = field->constant_value();
- // Stable static fields are checked for non-default values in ciField::initialize_from().
assert(!field->is_stable() || !field_value.is_null_or_zero(),
"stable static w/ default value shouldn't be a constant");
constant = make_constant(field_value, field);
@@ -1619,31 +1620,18 @@
Value constant = NULL;
obj = apop();
ObjectType* obj_type = obj->type()->as_ObjectType();
- if (obj_type->is_constant() && !PatchALot) {
+ if (field->is_constant() && obj_type->is_constant() && !PatchALot) {
ciObject* const_oop = obj_type->constant_value();
if (!const_oop->is_null_object() && const_oop->is_loaded()) {
- if (field->is_constant()) {
- ciConstant field_value = field->constant_value_of(const_oop);
- if (FoldStableValues && field->is_stable() && field_value.is_null_or_zero()) {
- // Stable field with default value can't be constant.
- constant = NULL;
- } else {
- constant = make_constant(field_value, field);
- }
- } else {
- // For CallSite objects treat the target field as a compile time constant.
- if (const_oop->is_call_site()) {
+ ciConstant field_value = field->constant_value_of(const_oop);
+ if (field_value.is_valid()) {
+ constant = make_constant(field_value, field);
+ // For CallSite objects add a dependency for invalidation of the optimization.
+ if (field->is_call_site_target()) {
ciCallSite* call_site = const_oop->as_call_site();
- if (field->is_call_site_target()) {
- ciMethodHandle* target = call_site->get_target();
- if (target != NULL) { // just in case
- ciConstant field_val(T_OBJECT, target);
- constant = new Constant(as_ValueType(field_val));
- // Add a dependence for invalidation of the optimization.
- if (!call_site->is_constant_call_site()) {
- dependency_recorder()->assert_call_site_target_value(call_site, target);
- }
- }
+ if (!call_site->is_constant_call_site()) {
+ ciMethodHandle* target = field_value.as_object()->as_method_handle();
+ dependency_recorder()->assert_call_site_target_value(call_site, target);
}
}
}
@@ -1722,7 +1710,7 @@
bool ignored_will_link;
ciSignature* declared_signature = NULL;
ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature);
- assert(expected == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?");
+ assert(expected == obj_args->max_length() || real_target->is_method_handle_intrinsic(), "missed on arg?");
#endif
}
@@ -1733,7 +1721,7 @@
if (obj_args == NULL) {
return NULL;
}
- int s = obj_args->size();
+ int s = obj_args->max_length();
// if called through method handle invoke, some arguments may have been popped
for (int i = start, j = 0; j < s && i < args->length(); i++) {
if (args->at(i)->type()->is_object_kind()) {
@@ -2170,7 +2158,7 @@
ciKlass* klass = stream()->get_klass(will_link);
ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
- Values* dims = new Values(dimensions, NULL);
+ Values* dims = new Values(dimensions, dimensions, NULL);
// fill in all dimensions
int i = dimensions;
while (i-- > 0) dims->at_put(i, ipop());
@@ -3773,9 +3761,9 @@
int start = 0;
Values* obj_args = args_list_for_profiling(callee, start, has_receiver);
if (obj_args != NULL) {
- int s = obj_args->size();
+ int s = obj_args->max_length();
// if called through method handle invoke, some arguments may have been popped
- for (int i = args_base+start, j = 0; j < obj_args->size() && i < state()->stack_size(); ) {
+ for (int i = args_base+start, j = 0; j < obj_args->max_length() && i < state()->stack_size(); ) {
Value v = state()->stack_at_inc(i);
if (v->type()->is_object_kind()) {
obj_args->push(v);
@@ -4092,7 +4080,7 @@
// properly clone all blocks in jsr region as well as exception
// handlers containing rets
BlockList* new_bci2block = new BlockList(bci2block()->length());
- new_bci2block->push_all(bci2block());
+ new_bci2block->appendAll(bci2block());
data->set_bci2block(new_bci2block);
data->set_scope(scope());
data->setup_jsr_xhandlers();
--- a/hotspot/src/share/vm/c1/c1_IR.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_IR.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -531,7 +531,7 @@
_visited_blocks(_max_block_id),
_active_blocks(_max_block_id),
_dominator_blocks(_max_block_id),
- _forward_branches(_max_block_id, 0),
+ _forward_branches(_max_block_id, _max_block_id, 0),
_loop_end_blocks(8),
_work_list(8),
_linear_scan_order(NULL), // initialized later with correct size
@@ -849,13 +849,13 @@
return false;
}
- assert(_linear_scan_order->index_of(cur) == -1, "block already processed (block can be ready only once)");
- assert(_work_list.index_of(cur) == -1, "block already in work-list (block can be ready only once)");
+ assert(_linear_scan_order->find(cur) == -1, "block already processed (block can be ready only once)");
+ assert(_work_list.find(cur) == -1, "block already in work-list (block can be ready only once)");
return true;
}
void ComputeLinearScanOrder::sort_into_work_list(BlockBegin* cur) {
- assert(_work_list.index_of(cur) == -1, "block already in work list");
+ assert(_work_list.find(cur) == -1, "block already in work list");
int cur_weight = compute_weight(cur);
@@ -891,7 +891,7 @@
void ComputeLinearScanOrder::append_block(BlockBegin* cur) {
TRACE_LINEAR_SCAN(3, tty->print_cr("appending block B%d (weight 0x%6x) to linear-scan order", cur->block_id(), cur->linear_scan_number()));
- assert(_linear_scan_order->index_of(cur) == -1, "cannot add the same block twice");
+ assert(_linear_scan_order->find(cur) == -1, "cannot add the same block twice");
// currently, the linear scan order and code emit order are equal.
// therefore the linear_scan_number and the weight of a block must also
@@ -1116,13 +1116,13 @@
BlockBegin* cur = _linear_scan_order->at(i);
assert(cur->linear_scan_number() == i, "incorrect linear_scan_number");
- assert(cur->linear_scan_number() >= 0 && cur->linear_scan_number() == _linear_scan_order->index_of(cur), "incorrect linear_scan_number");
+ assert(cur->linear_scan_number() >= 0 && cur->linear_scan_number() == _linear_scan_order->find(cur), "incorrect linear_scan_number");
int j;
for (j = cur->number_of_sux() - 1; j >= 0; j--) {
BlockBegin* sux = cur->sux_at(j);
- assert(sux->linear_scan_number() >= 0 && sux->linear_scan_number() == _linear_scan_order->index_of(sux), "incorrect linear_scan_number");
+ assert(sux->linear_scan_number() >= 0 && sux->linear_scan_number() == _linear_scan_order->find(sux), "incorrect linear_scan_number");
if (!sux->is_set(BlockBegin::backward_branch_target_flag)) {
assert(cur->linear_scan_number() < sux->linear_scan_number(), "invalid order");
}
@@ -1134,7 +1134,7 @@
for (j = cur->number_of_preds() - 1; j >= 0; j--) {
BlockBegin* pred = cur->pred_at(j);
- assert(pred->linear_scan_number() >= 0 && pred->linear_scan_number() == _linear_scan_order->index_of(pred), "incorrect linear_scan_number");
+ assert(pred->linear_scan_number() >= 0 && pred->linear_scan_number() == _linear_scan_order->find(pred), "incorrect linear_scan_number");
if (!cur->is_set(BlockBegin::backward_branch_target_flag)) {
assert(cur->linear_scan_number() > pred->linear_scan_number(), "invalid order");
}
@@ -1256,8 +1256,7 @@
}
-define_array(BlockListArray, BlockList*)
-define_stack(BlockListList, BlockListArray)
+typedef GrowableArray<BlockList*> BlockListList;
class PredecessorValidator : public BlockClosure {
private:
@@ -1271,7 +1270,7 @@
public:
PredecessorValidator(IR* hir) {
ResourceMark rm;
- _predecessors = new BlockListList(BlockBegin::number_of_blocks(), NULL);
+ _predecessors = new BlockListList(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), NULL);
_blocks = new BlockList();
int i;
--- a/hotspot/src/share/vm/c1/c1_IR.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_IR.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -104,9 +104,7 @@
bool equals(XHandler* other) const;
};
-define_array(_XHandlerArray, XHandler*)
-define_stack(_XHandlerList, _XHandlerArray)
-
+typedef GrowableArray<XHandler*> _XHandlerList;
// XHandlers is the C1 internal list of exception handlers for a method
class XHandlers: public CompilationResourceObj {
@@ -132,8 +130,7 @@
class IRScope;
-define_array(IRScopeArray, IRScope*)
-define_stack(IRScopeList, IRScopeArray)
+typedef GrowableArray<IRScope*> IRScopeList;
class Compilation;
class IRScope: public CompilationResourceObj {
--- a/hotspot/src/share/vm/c1/c1_Instruction.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -564,7 +564,7 @@
for (int s = 0; s < from->number_of_sux();) {
BlockBegin* sux = from->sux_at(s);
if (sux == to) {
- int index = sux->_predecessors.index_of(from);
+ int index = sux->_predecessors.find(from);
if (index >= 0) {
sux->_predecessors.remove_at(index);
}
@@ -664,7 +664,7 @@
void BlockBegin::remove_successor(BlockBegin* pred) {
int idx;
- while ((idx = _successors.index_of(pred)) >= 0) {
+ while ((idx = _successors.find(pred)) >= 0) {
_successors.remove_at(idx);
}
}
@@ -677,7 +677,7 @@
void BlockBegin::remove_predecessor(BlockBegin* pred) {
int idx;
- while ((idx = _predecessors.index_of(pred)) >= 0) {
+ while ((idx = _predecessors.find(pred)) >= 0) {
_predecessors.remove_at(idx);
}
}
@@ -722,13 +722,15 @@
void BlockBegin::iterate_preorder(BlockClosure* closure) {
- boolArray mark(number_of_blocks(), false);
+ int mark_len = number_of_blocks();
+ boolArray mark(mark_len, mark_len, false);
iterate_preorder(mark, closure);
}
void BlockBegin::iterate_postorder(BlockClosure* closure) {
- boolArray mark(number_of_blocks(), false);
+ int mark_len = number_of_blocks();
+ boolArray mark(mark_len, mark_len, false);
iterate_postorder(mark, closure);
}
--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -115,11 +115,8 @@
// A Value is a reference to the instruction creating the value
typedef Instruction* Value;
-define_array(ValueArray, Value)
-define_stack(Values, ValueArray)
-
-define_array(ValueStackArray, ValueStack*)
-define_stack(ValueStackStack, ValueStackArray)
+typedef GrowableArray<Value> Values;
+typedef GrowableArray<ValueStack*> ValueStackStack;
// BlockClosure is the base class for block traversal/iteration.
@@ -137,14 +134,13 @@
// Some array and list classes
-define_array(BlockBeginArray, BlockBegin*)
-define_stack(_BlockList, BlockBeginArray)
-
-class BlockList: public _BlockList {
+typedef GrowableArray<BlockBegin*> BlockBeginArray;
+
+class BlockList: public GrowableArray<BlockBegin*> {
public:
- BlockList(): _BlockList() {}
- BlockList(const int size): _BlockList(size) {}
- BlockList(const int size, BlockBegin* init): _BlockList(size, init) {}
+ BlockList(): GrowableArray<BlockBegin*>() {}
+ BlockList(const int size): GrowableArray<BlockBegin*>(size) {}
+ BlockList(const int size, BlockBegin* init): GrowableArray<BlockBegin*>(size, size, init) {}
void iterate_forward(BlockClosure* closure);
void iterate_backward(BlockClosure* closure);
@@ -1744,7 +1740,7 @@
void remove_predecessor(BlockBegin* pred);
bool is_predecessor(BlockBegin* pred) const { return _predecessors.contains(pred); }
int number_of_preds() const { return _predecessors.length(); }
- BlockBegin* pred_at(int i) const { return _predecessors[i]; }
+ BlockBegin* pred_at(int i) const { return _predecessors.at(i); }
// exception handlers potentially invoked by this block
void add_exception_handler(BlockBegin* b);
@@ -2609,10 +2605,7 @@
void set_from(BlockBegin* b) { _from = b; }
};
-
-define_array(BlockPairArray, BlockPair*)
-define_stack(BlockPairList, BlockPairArray)
-
+typedef GrowableArray<BlockPair*> BlockPairList;
inline int BlockBegin::number_of_sux() const { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); }
inline BlockBegin* BlockBegin::sux_at(int i) const { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch"); return _successors.at(i); }
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -483,6 +483,7 @@
case lir_membar_storestore: // result and info always invalid
case lir_membar_loadstore: // result and info always invalid
case lir_membar_storeload: // result and info always invalid
+ case lir_on_spin_wait:
{
assert(op->as_Op0() != NULL, "must be");
assert(op->_info == NULL, "info not used by this instruction");
@@ -727,31 +728,6 @@
break;
}
-
- case lir_tan:
- case lir_log10: {
- assert(op->as_Op2() != NULL, "must be");
- LIR_Op2* op2 = (LIR_Op2*)op;
-
- // On x86 tan/sin/cos need two temporary fpu stack slots and
- // log/log10 need one so handle opr2 and tmp as temp inputs.
- // Register input operand as temp to guarantee that it doesn't
- // overlap with the input.
- assert(op2->_info == NULL, "not used");
- assert(op2->_tmp5->is_illegal(), "not used");
- assert(op2->_opr1->is_valid(), "used");
- do_input(op2->_opr1); do_temp(op2->_opr1);
-
- if (op2->_opr2->is_valid()) do_temp(op2->_opr2);
- if (op2->_tmp1->is_valid()) do_temp(op2->_tmp1);
- if (op2->_tmp2->is_valid()) do_temp(op2->_tmp2);
- if (op2->_tmp3->is_valid()) do_temp(op2->_tmp3);
- if (op2->_tmp4->is_valid()) do_temp(op2->_tmp4);
- if (op2->_result->is_valid()) do_output(op2->_result);
-
- break;
- }
-
// LIR_Op3
case lir_idiv:
case lir_irem: {
@@ -1691,6 +1667,7 @@
case lir_word_align: s = "word_align"; break;
case lir_label: s = "label"; break;
case lir_nop: s = "nop"; break;
+ case lir_on_spin_wait: s = "on_spin_wait"; break;
case lir_backwardbranch_target: s = "backbranch"; break;
case lir_std_entry: s = "std_entry"; break;
case lir_osr_entry: s = "osr_entry"; break;
@@ -1738,8 +1715,6 @@
case lir_rem: s = "rem"; break;
case lir_abs: s = "abs"; break;
case lir_sqrt: s = "sqrt"; break;
- case lir_tan: s = "tan"; break;
- case lir_log10: s = "log10"; break;
case lir_logic_and: s = "logic_and"; break;
case lir_logic_or: s = "logic_or"; break;
case lir_logic_xor: s = "logic_xor"; break;
--- a/hotspot/src/share/vm/c1/c1_LIR.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIR.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -59,17 +59,9 @@
typedef LIR_OprDesc* LIR_Opr;
typedef int RegNr;
-define_array(LIR_OprArray, LIR_Opr)
-define_stack(LIR_OprList, LIR_OprArray)
-
-define_array(LIR_OprRefArray, LIR_Opr*)
-define_stack(LIR_OprRefList, LIR_OprRefArray)
-
-define_array(CodeEmitInfoArray, CodeEmitInfo*)
-define_stack(CodeEmitInfoList, CodeEmitInfoArray)
-
-define_array(LIR_OpArray, LIR_Op*)
-define_stack(LIR_OpList, LIR_OpArray)
+typedef GrowableArray<LIR_Opr> LIR_OprList;
+typedef GrowableArray<LIR_Op*> LIR_OpArray;
+typedef GrowableArray<LIR_Op*> LIR_OpList;
// define LIR_OprPtr early so LIR_OprDesc can refer to it
class LIR_OprPtr: public CompilationResourceObj {
@@ -920,6 +912,7 @@
, lir_membar_loadstore
, lir_membar_storeload
, lir_get_thread
+ , lir_on_spin_wait
, end_op0
, begin_op1
, lir_fxch
@@ -2101,6 +2094,8 @@
void std_entry(LIR_Opr receiver) { append(new LIR_Op0(lir_std_entry, receiver)); }
void osr_entry(LIR_Opr osrPointer) { append(new LIR_Op0(lir_osr_entry, osrPointer)); }
+ void on_spin_wait() { append(new LIR_Op0(lir_on_spin_wait)); }
+
void branch_destination(Label* lbl) { append(new LIR_OpLabel(lbl)); }
void negate(LIR_Opr from, LIR_Opr to) { append(new LIR_Op1(lir_neg, from, to)); }
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -127,7 +127,7 @@
void LIR_Assembler::emit_stubs(CodeStubList* stub_list) {
for (int m = 0; m < stub_list->length(); m++) {
- CodeStub* s = (*stub_list)[m];
+ CodeStub* s = stub_list->at(m);
check_codespace();
CHECK_BAILOUT();
@@ -678,6 +678,10 @@
get_thread(op->result_opr());
break;
+ case lir_on_spin_wait:
+ on_spin_wait();
+ break;
+
default:
ShouldNotReachHere();
break;
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -251,6 +251,7 @@
void membar_storestore();
void membar_loadstore();
void membar_storeload();
+ void on_spin_wait();
void get_thread(LIR_Opr result);
void verify_oop_map(CodeEmitInfo* info);
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -150,7 +150,7 @@
int i;
// resolve any cycles in moves from and to virtual registers
for (i = virtual_operands().length() - 1; i >= 0; i --) {
- ResolveNode* node = virtual_operands()[i];
+ ResolveNode* node = virtual_operands().at(i);
if (!node->visited()) {
_loop = NULL;
move(NULL, node);
@@ -161,7 +161,7 @@
// generate move for move from non virtual register to abitrary destination
for (i = other_operands().length() - 1; i >= 0; i --) {
- ResolveNode* node = other_operands()[i];
+ ResolveNode* node = other_operands().at(i);
for (int j = node->no_of_destinations() - 1; j >= 0; j --) {
emit_move(node->operand(), node->destination_at(j)->operand());
}
@@ -177,7 +177,7 @@
assert(node == NULL || node->operand() == opr, "");
if (node == NULL) {
node = new ResolveNode(opr);
- vreg_table()[vreg_num] = node;
+ vreg_table().at_put(vreg_num, node);
}
// Make sure that all virtual operands show up in the list when
// they are used as the source of a move.
@@ -3161,7 +3161,9 @@
case vmIntrinsics::_fullFence :
if (os::is_MP()) __ membar();
break;
-
+ case vmIntrinsics::_onSpinWait:
+ __ on_spin_wait();
+ break;
case vmIntrinsics::_Reference_get:
do_Reference_get(x);
break;
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,8 +39,7 @@
class SwitchRange;
class LIRItem;
-define_array(LIRItemArray, LIRItem*)
-define_stack(LIRItemList, LIRItemArray)
+typedef GrowableArray<LIRItem*> LIRItemList;
class SwitchRange: public CompilationResourceObj {
private:
@@ -56,15 +55,12 @@
BlockBegin* sux() const { return _sux; }
};
-define_array(SwitchRangeArray, SwitchRange*)
-define_stack(SwitchRangeList, SwitchRangeArray)
-
+typedef GrowableArray<SwitchRange*> SwitchRangeArray;
+typedef GrowableArray<SwitchRange*> SwitchRangeList;
class ResolveNode;
-define_array(NodeArray, ResolveNode*);
-define_stack(NodeList, NodeArray);
-
+typedef GrowableArray<ResolveNode*> NodeList;
// Node objects form a directed graph of LIR_Opr
// Edges between Nodes represent moves from one Node to its destinations
@@ -86,7 +82,7 @@
// accessors
LIR_Opr operand() const { return _operand; }
int no_of_destinations() const { return _destinations.length(); }
- ResolveNode* destination_at(int i) { return _destinations[i]; }
+ ResolveNode* destination_at(int i) { return _destinations.at(i); }
bool assigned() const { return _assigned; }
bool visited() const { return _visited; }
bool start_node() const { return _start_node; }
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -496,8 +496,8 @@
}
// initialize with correct length
- _lir_ops = LIR_OpArray(num_instructions);
- _block_of_op = BlockBeginArray(num_instructions);
+ _lir_ops = LIR_OpArray(num_instructions, num_instructions, NULL);
+ _block_of_op = BlockBeginArray(num_instructions, num_instructions, NULL);
int op_id = 0;
int idx = 0;
@@ -2507,7 +2507,8 @@
void LinearScan::init_compute_debug_info() {
// cache for frequently used scope values
// (cpu registers and stack slots)
- _scope_value_cache = ScopeValueArray((LinearScan::nof_cpu_regs + frame_map()->argcount() + max_spills()) * 2, NULL);
+ int cache_size = (LinearScan::nof_cpu_regs + frame_map()->argcount() + max_spills()) * 2;
+ _scope_value_cache = ScopeValueArray(cache_size, cache_size, NULL);
}
MonitorValue* LinearScan::location_for_monitor_index(int monitor_index) {
@@ -3042,7 +3043,7 @@
insert_point++;
}
}
- instructions->truncate(insert_point);
+ instructions->trunc_to(insert_point);
}
}
@@ -3446,7 +3447,7 @@
RegisterVerifier(LinearScan* allocator)
: _allocator(allocator)
, _work_list(16)
- , _saved_states(BlockBegin::number_of_blocks(), NULL)
+ , _saved_states(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), NULL)
{ }
void verify(BlockBegin* start);
@@ -4452,7 +4453,7 @@
new_use_pos_and_kinds.append(_use_pos_and_kinds.at(i));
}
- _use_pos_and_kinds.truncate(start_idx + 2);
+ _use_pos_and_kinds.trunc_to(start_idx + 2);
result->_use_pos_and_kinds = _use_pos_and_kinds;
_use_pos_and_kinds = new_use_pos_and_kinds;
@@ -5540,7 +5541,7 @@
IntervalList* processed = _spill_intervals[reg];
for (int i = 0; i < _spill_intervals[regHi]->length(); i++) {
Interval* it = _spill_intervals[regHi]->at(i);
- if (processed->find_from_end(it) == -1) {
+ if (processed->find(it) == -1) {
remove_from_list(it);
split_and_spill_interval(it);
}
@@ -6211,7 +6212,7 @@
_original_preds.clear();
for (j = block->number_of_preds() - 1; j >= 0; j--) {
BlockBegin* pred = block->pred_at(j);
- if (_original_preds.index_of(pred) == -1) {
+ if (_original_preds.find(pred) == -1) {
_original_preds.append(pred);
}
}
@@ -6231,7 +6232,7 @@
}
old_pos++;
}
- code->truncate(new_pos);
+ code->trunc_to(new_pos);
DEBUG_ONLY(verify(code));
}
@@ -6256,7 +6257,7 @@
TRACE_LINEAR_SCAN(3, tty->print_cr("Deleting unconditional branch at end of block B%d", block->block_id()));
// delete last branch instruction
- instructions->truncate(instructions->length() - 1);
+ instructions->trunc_to(instructions->length() - 1);
} else {
LIR_Op* prev_op = instructions->at(instructions->length() - 2);
@@ -6295,7 +6296,7 @@
prev_branch->change_block(last_branch->block());
prev_branch->negate_cond();
prev_cmp->set_condition(prev_branch->cond());
- instructions->truncate(instructions->length() - 1);
+ instructions->trunc_to(instructions->length() - 1);
// if we do change the condition, we have to change the cmove as well
if (prev_cmove != NULL) {
prev_cmove->set_condition(prev_branch->cond());
@@ -6378,19 +6379,19 @@
LIR_OpBranch* op_branch = instructions->at(j)->as_OpBranch();
if (op_branch != NULL) {
- assert(op_branch->block() == NULL || code->index_of(op_branch->block()) != -1, "branch target not valid");
- assert(op_branch->ublock() == NULL || code->index_of(op_branch->ublock()) != -1, "branch target not valid");
+ assert(op_branch->block() == NULL || code->find(op_branch->block()) != -1, "branch target not valid");
+ assert(op_branch->ublock() == NULL || code->find(op_branch->ublock()) != -1, "branch target not valid");
}
}
for (j = 0; j < block->number_of_sux() - 1; j++) {
BlockBegin* sux = block->sux_at(j);
- assert(code->index_of(sux) != -1, "successor not valid");
+ assert(code->find(sux) != -1, "successor not valid");
}
for (j = 0; j < block->number_of_preds() - 1; j++) {
BlockBegin* pred = block->pred_at(j);
- assert(code->index_of(pred) != -1, "successor not valid");
+ assert(code->find(pred) != -1, "successor not valid");
}
}
}
--- a/hotspot/src/share/vm/c1/c1_LinearScan.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -44,18 +44,9 @@
typedef GrowableArray<Interval*> IntervalArray;
typedef GrowableArray<Interval*> IntervalList;
-
-define_array(IntervalsArray, IntervalList*)
-define_stack(IntervalsList, IntervalsArray)
-
-define_array(OopMapArray, OopMap*)
-define_stack(OopMapList, OopMapArray)
-
-define_array(ScopeValueArray, ScopeValue*)
-
-define_array(LIR_OpListArray, LIR_OpList*);
-define_stack(LIR_OpListStack, LIR_OpListArray);
-
+typedef GrowableArray<IntervalList*> IntervalsList;
+typedef GrowableArray<ScopeValue*> ScopeValueArray;
+typedef GrowableArray<LIR_OpList*> LIR_OpListStack;
enum IntervalUseKind {
// priority of use kinds must be ascending
@@ -67,9 +58,6 @@
firstValidKind = 1,
lastValidKind = 3
};
-define_array(UseKindArray, IntervalUseKind)
-define_stack(UseKindStack, UseKindArray)
-
enum IntervalKind {
fixedKind = 0, // interval pre-colored by LIR_Generator
@@ -619,7 +607,7 @@
void add_range(int from, int to);
Interval* split(int split_pos);
Interval* split_from_start(int split_pos);
- void remove_first_use_pos() { _use_pos_and_kinds.truncate(_use_pos_and_kinds.length() - 2); }
+ void remove_first_use_pos() { _use_pos_and_kinds.trunc_to(_use_pos_and_kinds.length() - 2); }
// test intersection
bool covers(int op_id, LIR_OpVisitState::OprMode mode) const;
--- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -32,9 +32,7 @@
#include "utilities/bitMap.inline.hpp"
#include "compiler/compileLog.hpp"
-define_array(ValueSetArray, ValueSet*);
-define_stack(ValueSetList, ValueSetArray);
-
+typedef GrowableArray<ValueSet*> ValueSetList;
Optimizer::Optimizer(IR* ir) {
assert(ir->is_valid(), "IR must be valid");
@@ -584,8 +582,8 @@
ValueSet* state() { return _set; }
void set_state_from (ValueSet* state) { _set->set_from(state); }
- ValueSet* state_for (BlockBegin* block) { return _block_states[block->block_id()]; }
- void set_state_for (BlockBegin* block, ValueSet* stack) { _block_states[block->block_id()] = stack; }
+ ValueSet* state_for (BlockBegin* block) { return _block_states.at(block->block_id()); }
+ void set_state_for (BlockBegin* block, ValueSet* stack) { _block_states.at_put(block->block_id(), stack); }
// Returns true if caused a change in the block's state.
bool merge_state_for(BlockBegin* block,
ValueSet* incoming_state);
@@ -596,7 +594,7 @@
: _opt(opt)
, _set(new ValueSet())
, _last_explicit_null_check(NULL)
- , _block_states(BlockBegin::number_of_blocks(), NULL)
+ , _block_states(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), NULL)
, _work_list(new BlockList()) {
_visitable_instructions = new ValueSet();
_visitor.set_eliminator(this);
@@ -1165,19 +1163,19 @@
// handlers and iterate over them as well
int nblocks = BlockBegin::number_of_blocks();
BlockList blocks(nblocks);
- boolArray visited_block(nblocks, false);
+ boolArray visited_block(nblocks, nblocks, false);
blocks.push(ir()->start());
- visited_block[ir()->start()->block_id()] = true;
+ visited_block.at_put(ir()->start()->block_id(), true);
for (int i = 0; i < blocks.length(); i++) {
- BlockBegin* b = blocks[i];
+ BlockBegin* b = blocks.at(i);
// exception handlers need to be treated as additional roots
for (int e = b->number_of_exception_handlers(); e-- > 0; ) {
BlockBegin* excp = b->exception_handler_at(e);
int id = excp->block_id();
- if (!visited_block[id]) {
+ if (!visited_block.at(id)) {
blocks.push(excp);
- visited_block[id] = true;
+ visited_block.at_put(id, true);
nce.iterate(excp);
}
}
@@ -1186,9 +1184,9 @@
for (int s = end->number_of_sux(); s-- > 0; ) {
BlockBegin* next = end->sux_at(s);
int id = next->block_id();
- if (!visited_block[id]) {
+ if (!visited_block.at(id)) {
blocks.push(next);
- visited_block[id] = true;
+ visited_block.at_put(id, true);
}
}
}
--- a/hotspot/src/share/vm/c1/c1_RangeCheckElimination.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_RangeCheckElimination.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,8 +53,8 @@
// Constructor
RangeCheckEliminator::RangeCheckEliminator(IR *ir) :
- _bounds(Instruction::number_of_instructions(), NULL),
- _access_indexed_info(Instruction::number_of_instructions(), NULL)
+ _bounds(Instruction::number_of_instructions(), Instruction::number_of_instructions(), NULL),
+ _access_indexed_info(Instruction::number_of_instructions(), Instruction::number_of_instructions(), NULL)
{
_visitor.set_range_check_eliminator(this);
_ir = ir;
@@ -303,28 +303,28 @@
// Wrong type or NULL -> No bound
if (!v || (!v->type()->as_IntType() && !v->type()->as_ObjectType())) return NULL;
- if (!_bounds[v->id()]) {
+ if (!_bounds.at(v->id())) {
// First (default) bound is calculated
// Create BoundStack
- _bounds[v->id()] = new BoundStack();
+ _bounds.at_put(v->id(), new BoundStack());
_visitor.clear_bound();
Value visit_value = v;
visit_value->visit(&_visitor);
Bound *bound = _visitor.bound();
if (bound) {
- _bounds[v->id()]->push(bound);
+ _bounds.at(v->id())->push(bound);
}
- if (_bounds[v->id()]->length() == 0) {
+ if (_bounds.at(v->id())->length() == 0) {
assert(!(v->as_Constant() && v->type()->as_IntConstant()), "constants not handled here");
- _bounds[v->id()]->push(new Bound());
+ _bounds.at(v->id())->push(new Bound());
}
- } else if (_bounds[v->id()]->length() == 0) {
+ } else if (_bounds.at(v->id())->length() == 0) {
// To avoid endless loops, bound is currently in calculation -> nothing known about it
return new Bound();
}
// Return bound
- return _bounds[v->id()]->top();
+ return _bounds.at(v->id())->top();
}
// Update bound
@@ -353,28 +353,28 @@
// No bound update for constants
return;
}
- if (!_bounds[v->id()]) {
+ if (!_bounds.at(v->id())) {
get_bound(v);
- assert(_bounds[v->id()], "Now Stack must exist");
+ assert(_bounds.at(v->id()), "Now Stack must exist");
}
Bound *top = NULL;
- if (_bounds[v->id()]->length() > 0) {
- top = _bounds[v->id()]->top();
+ if (_bounds.at(v->id())->length() > 0) {
+ top = _bounds.at(v->id())->top();
}
if (top) {
bound->and_op(top);
}
- _bounds[v->id()]->push(bound);
+ _bounds.at(v->id())->push(bound);
pushed.append(v->id());
}
// Add instruction + idx for in block motion
void RangeCheckEliminator::add_access_indexed_info(InstructionList &indices, int idx, Value instruction, AccessIndexed *ai) {
int id = instruction->id();
- AccessIndexedInfo *aii = _access_indexed_info[id];
+ AccessIndexedInfo *aii = _access_indexed_info.at(id);
if (aii == NULL) {
aii = new AccessIndexedInfo();
- _access_indexed_info[id] = aii;
+ _access_indexed_info.at_put(id, aii);
indices.append(instruction);
aii->_min = idx;
aii->_max = idx;
@@ -461,7 +461,7 @@
if (_optimistic) {
for (int i = 0; i < indices.length(); i++) {
Instruction *index_instruction = indices.at(i);
- AccessIndexedInfo *info = _access_indexed_info[index_instruction->id()];
+ AccessIndexedInfo *info = _access_indexed_info.at(index_instruction->id());
assert(info != NULL, "Info must not be null");
// if idx < 0, max > 0, max + idx may fall between 0 and
@@ -562,7 +562,7 @@
// Clear data structures for next array
for (int i = 0; i < indices.length(); i++) {
Instruction *index_instruction = indices.at(i);
- _access_indexed_info[index_instruction->id()] = NULL;
+ _access_indexed_info.at_put(index_instruction->id(), NULL);
}
indices.clear();
}
@@ -1005,7 +1005,7 @@
// Reset stack
for (int i=0; i<pushed.length(); i++) {
- _bounds[pushed[i]]->pop();
+ _bounds.at(pushed.at(i))->pop();
}
}
@@ -1051,7 +1051,7 @@
#endif
// Verification or the IR
-RangeCheckEliminator::Verification::Verification(IR *ir) : _used(BlockBegin::number_of_blocks(), false) {
+RangeCheckEliminator::Verification::Verification(IR *ir) : _used(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), false) {
this->_ir = ir;
ir->iterate_linear_scan_order(this);
}
@@ -1146,14 +1146,14 @@
if (start == end) return start != dont_use;
// Simple BSF from start to end
// BlockBeginList _current;
- for (int i=0; i<_used.length(); i++) {
- _used[i] = false;
+ for (int i=0; i < _used.length(); i++) {
+ _used.at_put(i, false);
}
- _current.truncate(0);
- _successors.truncate(0);
+ _current.trunc_to(0);
+ _successors.trunc_to(0);
if (start != dont_use) {
_current.push(start);
- _used[start->block_id()] = true;
+ _used.at_put(start->block_id(), true);
}
// BlockBeginList _successors;
@@ -1180,17 +1180,17 @@
}
}
for (int i=0; i<_successors.length(); i++) {
- BlockBegin *sux = _successors[i];
+ BlockBegin *sux = _successors.at(i);
assert(sux != NULL, "Successor must not be NULL!");
if (sux == end) {
return true;
}
- if (sux != dont_use && !_used[sux->block_id()]) {
- _used[sux->block_id()] = true;
+ if (sux != dont_use && !_used.at(sux->block_id())) {
+ _used.at_put(sux->block_id(), true);
_current.push(sux);
}
}
- _successors.truncate(0);
+ _successors.trunc_to(0);
}
return false;
--- a/hotspot/src/share/vm/c1/c1_RangeCheckElimination.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_RangeCheckElimination.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,10 +40,8 @@
bool _optimistic; // Insert predicates and deoptimize when they fail
IR *_ir;
- define_array(BlockBeginArray, BlockBegin*)
- define_stack(BlockBeginList, BlockBeginArray)
- define_stack(IntegerStack, intArray)
- define_array(IntegerMap, IntegerStack*)
+ typedef GrowableArray<BlockBegin*> BlockBeginList;
+ typedef GrowableArray<int> IntegerStack;
class Verification : public BlockClosure {
// RangeCheckEliminator::Verification should never get instatiated on the heap.
@@ -180,13 +178,10 @@
void add_assertions(Bound *bound, Instruction *instruction, Instruction *position);
#endif
- define_array(BoundArray, Bound *)
- define_stack(BoundStack, BoundArray)
- define_array(BoundMap, BoundStack *)
- define_array(AccessIndexedArray, AccessIndexed *)
- define_stack(AccessIndexedList, AccessIndexedArray)
- define_array(InstructionArray, Instruction *)
- define_stack(InstructionList, InstructionArray)
+ typedef GrowableArray<Bound*> BoundStack;
+ typedef GrowableArray<BoundStack*> BoundMap;
+ typedef GrowableArray<AccessIndexed*> AccessIndexedList;
+ typedef GrowableArray<Instruction*> InstructionList;
class AccessIndexedInfo : public CompilationResourceObj {
public:
@@ -195,7 +190,7 @@
int _max;
};
- define_array(AccessIndexedInfoArray, AccessIndexedInfo *)
+ typedef GrowableArray<AccessIndexedInfo*> AccessIndexedInfoArray;
BoundMap _bounds; // Mapping from Instruction's id to current bound
AccessIndexedInfoArray _access_indexed_info; // Mapping from Instruction's id to AccessIndexedInfo for in block motion
Visitor _visitor;
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -320,9 +320,11 @@
FUNCTION_CASE(entry, StubRoutines::updateBytesCRC32());
FUNCTION_CASE(entry, StubRoutines::dexp());
FUNCTION_CASE(entry, StubRoutines::dlog());
+ FUNCTION_CASE(entry, StubRoutines::dlog10());
FUNCTION_CASE(entry, StubRoutines::dpow());
FUNCTION_CASE(entry, StubRoutines::dsin());
FUNCTION_CASE(entry, StubRoutines::dcos());
+ FUNCTION_CASE(entry, StubRoutines::dtan());
#undef FUNCTION_CASE
--- a/hotspot/src/share/vm/c1/c1_ValueMap.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
ValueMap::ValueMap()
: _nesting(0)
- , _entries(ValueMapInitialSize, NULL)
+ , _entries(ValueMapInitialSize, ValueMapInitialSize, NULL)
, _killed_values()
, _entry_count(0)
{
@@ -56,7 +56,7 @@
ValueMap::ValueMap(ValueMap* old)
: _nesting(old->_nesting + 1)
- , _entries(old->_entries.length())
+ , _entries(old->_entries.length(), old->_entries.length(), NULL)
, _killed_values()
, _entry_count(old->_entry_count)
{
@@ -72,7 +72,7 @@
int new_size = old_size * 2 + 1;
ValueMapEntryList worklist(8);
- ValueMapEntryArray new_entries(new_size, NULL);
+ ValueMapEntryArray new_entries(new_size, new_size, NULL);
int new_entry_count = 0;
TRACE_VALUE_NUMBERING(tty->print_cr("increasing table size from %d to %d", old_size, new_size));
@@ -486,7 +486,7 @@
GlobalValueNumbering::GlobalValueNumbering(IR* ir)
: _current_map(NULL)
- , _value_maps(ir->linear_scan_order()->length(), NULL)
+ , _value_maps(ir->linear_scan_order()->length(), ir->linear_scan_order()->length(), NULL)
, _compilation(ir->compilation())
{
TRACE_VALUE_NUMBERING(tty->print_cr("****** start of global value numbering"));
--- a/hotspot/src/share/vm/c1/c1_ValueMap.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,8 +53,8 @@
void set_next(ValueMapEntry* next) { _next = next; }
};
-define_array(ValueMapEntryArray, ValueMapEntry*)
-define_stack(ValueMapEntryList, ValueMapEntryArray)
+typedef GrowableArray<ValueMapEntry*> ValueMapEntryArray;
+typedef GrowableArray<ValueMapEntry*> ValueMapEntryList;
// ValueMap implements nested hash tables for value numbering. It
// maintains a set _killed_values which represents the instructions
@@ -129,8 +129,7 @@
#endif
};
-define_array(ValueMapArray, ValueMap*)
-
+typedef GrowableArray<ValueMap*> ValueMapArray;
class ValueNumberingVisitor: public InstructionVisitor {
protected:
--- a/hotspot/src/share/vm/c1/c1_ValueStack.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_ValueStack.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,7 @@
, _caller_state(caller_state)
, _bci(-99)
, _kind(Parsing)
-, _locals(scope->method()->max_locals(), NULL)
+, _locals(scope->method()->max_locals(), scope->method()->max_locals(), NULL)
, _stack(scope->method()->max_stack())
, _locks()
{
@@ -178,7 +178,7 @@
ValueType* t = stack_at(index)->type();
Value phi = new Phi(t, b, -index - 1);
- _stack[index] = phi;
+ _stack.at_put(index, phi);
assert(!t->is_double_word() || _stack.at(index + 1) == NULL, "hi-word of doubleword value must be NULL");
}
@@ -225,7 +225,7 @@
if (locals_size() > 0) {
InstructionPrinter ip;
for (int i = 0; i < locals_size();) {
- Value l = _locals[i];
+ Value l = _locals.at(i);
tty->print("local %d ", i);
if (l == NULL) {
tty->print("null");
--- a/hotspot/src/share/vm/ci/ciConstant.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciConstant.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -124,6 +124,9 @@
}
}
+ bool is_valid() const {
+ return basic_type() != T_ILLEGAL;
+ }
// Debugging output
void print();
};
--- a/hotspot/src/share/vm/ci/ciField.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciField.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -235,94 +235,75 @@
_holder = CURRENT_ENV->get_instance_klass(fd->field_holder());
// Check to see if the field is constant.
- bool is_final = this->is_final();
- bool is_stable = FoldStableValues && this->is_stable();
- if (_holder->is_initialized() && (is_final || is_stable)) {
- if (!this->is_static()) {
- // A field can be constant if it's a final static field or if
+ Klass* k = _holder->get_Klass();
+ bool is_stable_field = FoldStableValues && is_stable();
+ if (is_final() || is_stable_field) {
+ if (is_static()) {
+ // This field just may be constant. The only case where it will
+ // not be constant is when the field is a *special* static & final field
+ // whose value may change. The three examples are java.lang.System.in,
+ // java.lang.System.out, and java.lang.System.err.
+ assert(SystemDictionary::System_klass() != NULL, "Check once per vm");
+ if (k == SystemDictionary::System_klass()) {
+ // Check offsets for case 2: System.in, System.out, or System.err
+ if( _offset == java_lang_System::in_offset_in_bytes() ||
+ _offset == java_lang_System::out_offset_in_bytes() ||
+ _offset == java_lang_System::err_offset_in_bytes() ) {
+ _is_constant = false;
+ return;
+ }
+ }
+ _is_constant = true;
+ } else {
+ // An instance field can be constant if it's a final static field or if
// it's a final non-static field of a trusted class (classes in
// java.lang.invoke and sun.invoke packages and subpackages).
- if (is_stable || trust_final_non_static_fields(_holder)) {
- _is_constant = true;
- return;
- }
- _is_constant = false;
- return;
- }
-
- // This field just may be constant. The only case where it will
- // not be constant is when the field is a *special* static&final field
- // whose value may change. The three examples are java.lang.System.in,
- // java.lang.System.out, and java.lang.System.err.
-
- KlassHandle k = _holder->get_Klass();
- assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
- if( k() == SystemDictionary::System_klass() ) {
- // Check offsets for case 2: System.in, System.out, or System.err
- if( _offset == java_lang_System::in_offset_in_bytes() ||
- _offset == java_lang_System::out_offset_in_bytes() ||
- _offset == java_lang_System::err_offset_in_bytes() ) {
- _is_constant = false;
- return;
- }
- }
-
- Handle mirror = k->java_mirror();
-
- switch(type()->basic_type()) {
- case T_BYTE:
- _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset));
- break;
- case T_CHAR:
- _constant_value = ciConstant(type()->basic_type(), mirror->char_field(_offset));
- break;
- case T_SHORT:
- _constant_value = ciConstant(type()->basic_type(), mirror->short_field(_offset));
- break;
- case T_BOOLEAN:
- _constant_value = ciConstant(type()->basic_type(), mirror->bool_field(_offset));
- break;
- case T_INT:
- _constant_value = ciConstant(type()->basic_type(), mirror->int_field(_offset));
- break;
- case T_FLOAT:
- _constant_value = ciConstant(mirror->float_field(_offset));
- break;
- case T_DOUBLE:
- _constant_value = ciConstant(mirror->double_field(_offset));
- break;
- case T_LONG:
- _constant_value = ciConstant(mirror->long_field(_offset));
- break;
- case T_OBJECT:
- case T_ARRAY:
- {
- oop o = mirror->obj_field(_offset);
-
- // A field will be "constant" if it is known always to be
- // a non-null reference to an instance of a particular class,
- // or to a particular array. This can happen even if the instance
- // or array is not perm. In such a case, an "unloaded" ciArray
- // or ciInstance is created. The compiler may be able to use
- // information about the object's class (which is exact) or length.
-
- if (o == NULL) {
- _constant_value = ciConstant(type()->basic_type(), ciNullObject::make());
- } else {
- _constant_value = ciConstant(type()->basic_type(), CURRENT_ENV->get_object(o));
- assert(_constant_value.as_object() == CURRENT_ENV->get_object(o), "check interning");
- }
- }
- }
- if (is_stable && _constant_value.is_null_or_zero()) {
- // It is not a constant after all; treat it as uninitialized.
- _is_constant = false;
- } else {
- _is_constant = true;
+ _is_constant = is_stable_field || trust_final_non_static_fields(_holder);
}
} else {
- _is_constant = false;
+ // For CallSite objects treat the target field as a compile time constant.
+ assert(SystemDictionary::CallSite_klass() != NULL, "should be already initialized");
+ if (k == SystemDictionary::CallSite_klass() &&
+ _offset == java_lang_invoke_CallSite::target_offset_in_bytes()) {
+ _is_constant = true;
+ } else {
+ // Non-final & non-stable fields are not constants.
+ _is_constant = false;
+ }
+ }
+}
+
+// ------------------------------------------------------------------
+// ciField::constant_value
+// Get the constant value of a this static field.
+ciConstant ciField::constant_value() {
+ assert(is_static() && is_constant(), "illegal call to constant_value()");
+ if (!_holder->is_initialized()) {
+ return ciConstant(); // Not initialized yet
}
+ if (_constant_value.basic_type() == T_ILLEGAL) {
+ // Static fields are placed in mirror objects.
+ VM_ENTRY_MARK;
+ ciInstance* mirror = CURRENT_ENV->get_instance(_holder->get_Klass()->java_mirror());
+ _constant_value = mirror->field_value_impl(type()->basic_type(), offset());
+ }
+ if (FoldStableValues && is_stable() && _constant_value.is_null_or_zero()) {
+ return ciConstant();
+ }
+ return _constant_value;
+}
+
+// ------------------------------------------------------------------
+// ciField::constant_value_of
+// Get the constant value of non-static final field in the given object.
+ciConstant ciField::constant_value_of(ciObject* object) {
+ assert(!is_static() && is_constant(), "only if field is non-static constant");
+ assert(object->is_instance(), "must be instance");
+ ciConstant field_value = object->as_instance()->field_value(this);
+ if (FoldStableValues && is_stable() && field_value.is_null_or_zero()) {
+ return ciConstant();
+ }
+ return field_value;
}
// ------------------------------------------------------------------
--- a/hotspot/src/share/vm/ci/ciField.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciField.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -62,7 +62,7 @@
void initialize_from(fieldDescriptor* fd);
public:
- ciFlags flags() { return _flags; }
+ ciFlags flags() const { return _flags; }
// Of which klass is this field a member?
//
@@ -89,13 +89,13 @@
//
// In that case the declared holder of f would be B and
// the canonical holder of f would be A.
- ciInstanceKlass* holder() { return _holder; }
+ ciInstanceKlass* holder() const { return _holder; }
// Name of this field?
- ciSymbol* name() { return _name; }
+ ciSymbol* name() const { return _name; }
// Signature of this field?
- ciSymbol* signature() { return _signature; }
+ ciSymbol* signature() const { return _signature; }
// Of what type is this field?
ciType* type() { return (_type == NULL) ? compute_type() : _type; }
@@ -107,13 +107,13 @@
int size_in_bytes() { return type2aelembytes(layout_type()); }
// What is the offset of this field?
- int offset() {
+ int offset() const {
assert(_offset >= 1, "illegal call to offset()");
return _offset;
}
// Same question, explicit units. (Fields are aligned to the byte level.)
- int offset_in_bytes() {
+ int offset_in_bytes() const {
return offset();
}
@@ -127,31 +127,27 @@
//
// Clarification: A field is considered constant if:
// 1. The field is both static and final
- // 2. The canonical holder of the field has undergone
- // static initialization.
- // 3. The field is not one of the special static/final
+ // 2. The field is not one of the special static/final
// non-constant fields. These are java.lang.System.in
// and java.lang.System.out. Abomination.
//
// A field is also considered constant if it is marked @Stable
// and is non-null (or non-zero, if a primitive).
- // For non-static fields, the null/zero check must be
- // arranged by the user, as constant_value().is_null_or_zero().
- bool is_constant() { return _is_constant; }
+ //
+ // A user should also check the field value (constant_value().is_valid()), since
+ // constant fields of non-initialized classes don't have values yet.
+ bool is_constant() const { return _is_constant; }
- // Get the constant value of this field.
- ciConstant constant_value() {
- assert(is_static() && is_constant(), "illegal call to constant_value()");
- return _constant_value;
+ // Get the constant value of the static field.
+ ciConstant constant_value();
+
+ bool is_static_constant() {
+ return is_static() && is_constant() && constant_value().is_valid();
}
// Get the constant value of non-static final field in the given
// object.
- ciConstant constant_value_of(ciObject* object) {
- assert(!is_static() && is_constant(), "only if field is non-static constant");
- assert(object->is_instance(), "must be instance");
- return object->as_instance()->field_value(this);
- }
+ ciConstant constant_value_of(ciObject* object);
// Check for link time errors. Accessing a field from a
// certain class via a certain bytecode may or may not be legal.
@@ -165,14 +161,14 @@
Bytecodes::Code bc);
// Java access flags
- bool is_public () { return flags().is_public(); }
- bool is_private () { return flags().is_private(); }
- bool is_protected () { return flags().is_protected(); }
- bool is_static () { return flags().is_static(); }
- bool is_final () { return flags().is_final(); }
- bool is_stable () { return flags().is_stable(); }
- bool is_volatile () { return flags().is_volatile(); }
- bool is_transient () { return flags().is_transient(); }
+ bool is_public () const { return flags().is_public(); }
+ bool is_private () const { return flags().is_private(); }
+ bool is_protected () const { return flags().is_protected(); }
+ bool is_static () const { return flags().is_static(); }
+ bool is_final () const { return flags().is_final(); }
+ bool is_stable () const { return flags().is_stable(); }
+ bool is_volatile () const { return flags().is_volatile(); }
+ bool is_transient () const { return flags().is_transient(); }
bool is_call_site_target() {
ciInstanceKlass* callsite_klass = CURRENT_ENV->CallSite_klass();
--- a/hotspot/src/share/vm/ci/ciInstance.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciInstance.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -56,49 +56,21 @@
}
// ------------------------------------------------------------------
-// ciInstance::field_value
-//
-// Constant value of a field.
-ciConstant ciInstance::field_value(ciField* field) {
- assert(is_loaded(), "invalid access - must be loaded");
- assert(field->holder()->is_loaded(), "invalid access - holder must be loaded");
- assert(klass()->is_subclass_of(field->holder()), "invalid access - must be subclass");
-
- VM_ENTRY_MARK;
- ciConstant result;
+// ciInstance::field_value_impl
+ciConstant ciInstance::field_value_impl(BasicType field_btype, int offset) {
Handle obj = get_oop();
assert(!obj.is_null(), "bad oop");
- BasicType field_btype = field->type()->basic_type();
- int offset = field->offset();
-
switch(field_btype) {
- case T_BYTE:
- return ciConstant(field_btype, obj->byte_field(offset));
- break;
- case T_CHAR:
- return ciConstant(field_btype, obj->char_field(offset));
- break;
- case T_SHORT:
- return ciConstant(field_btype, obj->short_field(offset));
- break;
- case T_BOOLEAN:
- return ciConstant(field_btype, obj->bool_field(offset));
- break;
- case T_INT:
- return ciConstant(field_btype, obj->int_field(offset));
- break;
- case T_FLOAT:
- return ciConstant(obj->float_field(offset));
- break;
- case T_DOUBLE:
- return ciConstant(obj->double_field(offset));
- break;
- case T_LONG:
- return ciConstant(obj->long_field(offset));
- break;
- case T_OBJECT:
- case T_ARRAY:
- {
+ case T_BYTE: return ciConstant(field_btype, obj->byte_field(offset));
+ case T_CHAR: return ciConstant(field_btype, obj->char_field(offset));
+ case T_SHORT: return ciConstant(field_btype, obj->short_field(offset));
+ case T_BOOLEAN: return ciConstant(field_btype, obj->bool_field(offset));
+ case T_INT: return ciConstant(field_btype, obj->int_field(offset));
+ case T_FLOAT: return ciConstant(obj->float_field(offset));
+ case T_DOUBLE: return ciConstant(obj->double_field(offset));
+ case T_LONG: return ciConstant(obj->long_field(offset));
+ case T_OBJECT: // fall through
+ case T_ARRAY: {
oop o = obj->obj_field(offset);
// A field will be "constant" if it is known always to be
@@ -115,12 +87,23 @@
}
}
}
- ShouldNotReachHere();
- // to shut up the compiler
+ fatal("no field value: %s", type2name(field_btype));
return ciConstant();
}
// ------------------------------------------------------------------
+// ciInstance::field_value
+//
+// Constant value of a field.
+ciConstant ciInstance::field_value(ciField* field) {
+ assert(is_loaded(), "invalid access - must be loaded");
+ assert(field->holder()->is_loaded(), "invalid access - holder must be loaded");
+ assert(field->is_static() || klass()->is_subclass_of(field->holder()), "invalid access - must be subclass");
+
+ GUARDED_VM_ENTRY(return field_value_impl(field->type()->basic_type(), field->offset());)
+}
+
+// ------------------------------------------------------------------
// ciInstance::field_value_by_offset
//
// Constant value of a field at the specified offset.
--- a/hotspot/src/share/vm/ci/ciInstance.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciInstance.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -36,6 +36,7 @@
// instance of java.lang.Object.
class ciInstance : public ciObject {
CI_PACKAGE_ACCESS
+ friend class ciField;
protected:
ciInstance(instanceHandle h_i) : ciObject(h_i) {
@@ -50,6 +51,8 @@
void print_impl(outputStream* st);
+ ciConstant field_value_impl(BasicType field_btype, int offset);
+
public:
// If this object is a java mirror, return the corresponding type.
// Otherwise, return NULL.
--- a/hotspot/src/share/vm/ci/ciKlass.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciKlass.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -88,12 +88,7 @@
assert(this->is_loaded(), "must be loaded: %s", this->name()->as_quoted_ascii());
assert(that->is_loaded(), "must be loaded: %s", that->name()->as_quoted_ascii());
- VM_ENTRY_MARK;
- Klass* this_klass = get_Klass();
- Klass* that_klass = that->get_Klass();
- bool result = this_klass->is_subclass_of(that_klass);
-
- return result;
+ GUARDED_VM_ENTRY(return get_Klass()->is_subclass_of(that->get_Klass());)
}
// ------------------------------------------------------------------
--- a/hotspot/src/share/vm/ci/ciSymbol.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/ci/ciSymbol.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -58,9 +58,7 @@
//
// The text of the symbol as a null-terminated C string.
const char* ciSymbol::as_utf8() {
- VM_QUICK_ENTRY_MARK;
- Symbol* s = get_symbol();
- return s->as_utf8();
+ GUARDED_VM_QUICK_ENTRY(return get_symbol()->as_utf8();)
}
// The text of the symbol as a null-terminated C string.
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -2927,7 +2927,7 @@
// If JVMTI original method ordering or sharing is enabled construct int
// array remembering the original ordering
if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
- method_ordering = new intArray(length);
+ method_ordering = new intArray(length, length, -1);
for (int index = 0; index < length; index++) {
Method* const m = methods->at(index);
const int old_index = m->vtable_index();
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,6 @@
template <typename T>
class GrowableArray;
class InstanceKlass;
-class intArray;
class Symbol;
class TempNewSymbol;
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -882,6 +882,10 @@
do_name( newArray_name, "newArray") \
do_signature(newArray_signature, "(Ljava/lang/Class;I)Ljava/lang/Object;") \
\
+ do_intrinsic(_onSpinWait, java_lang_Thread, onSpinWait_name, onSpinWait_signature, F_S) \
+ do_name( onSpinWait_name, "onSpinWait") \
+ do_alias( onSpinWait_signature, void_method_signature) \
+ \
do_intrinsic(_copyOf, java_util_Arrays, copyOf_name, copyOf_signature, F_S) \
do_name( copyOf_name, "copyOf") \
do_signature(copyOf_signature, "([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;") \
--- a/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -287,7 +287,7 @@
}
}
-class ParScanThreadStateSet: private ResourceArray {
+class ParScanThreadStateSet: StackObj {
public:
// Initializes states for the specified number of threads;
ParScanThreadStateSet(int num_threads,
@@ -322,8 +322,10 @@
ParallelTaskTerminator& _term;
ParNewGeneration& _young_gen;
Generation& _old_gen;
+ ParScanThreadState* _per_thread_states;
+ const int _num_threads;
public:
- bool is_valid(int id) const { return id < length(); }
+ bool is_valid(int id) const { return id < _num_threads; }
ParallelTaskTerminator* terminator() { return &_term; }
};
@@ -336,30 +338,31 @@
PreservedMarksSet& preserved_marks_set,
size_t desired_plab_sz,
ParallelTaskTerminator& term)
- : ResourceArray(sizeof(ParScanThreadState), num_threads),
- _young_gen(young_gen),
+ : _young_gen(young_gen),
_old_gen(old_gen),
- _term(term)
+ _term(term),
+ _per_thread_states(NEW_RESOURCE_ARRAY(ParScanThreadState, num_threads)),
+ _num_threads(num_threads)
{
assert(num_threads > 0, "sanity check!");
assert(ParGCUseLocalOverflow == (overflow_stacks != NULL),
"overflow_stack allocation mismatch");
// Initialize states.
for (int i = 0; i < num_threads; ++i) {
- new ((ParScanThreadState*)_data + i)
- ParScanThreadState(&to_space, &young_gen, &old_gen, i, &queue_set,
- overflow_stacks, preserved_marks_set.get(i),
- desired_plab_sz, term);
+ new(_per_thread_states + i)
+ ParScanThreadState(&to_space, &young_gen, &old_gen, i, &queue_set,
+ overflow_stacks, preserved_marks_set.get(i),
+ desired_plab_sz, term);
}
}
inline ParScanThreadState& ParScanThreadStateSet::thread_state(int i) {
- assert(i >= 0 && i < length(), "sanity check!");
- return ((ParScanThreadState*)_data)[i];
+ assert(i >= 0 && i < _num_threads, "sanity check!");
+ return _per_thread_states[i];
}
void ParScanThreadStateSet::trace_promotion_failed(const YoungGCTracer* gc_tracer) {
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
if (thread_state(i).promotion_failed()) {
gc_tracer->report_promotion_failed(thread_state(i).promotion_failed_info());
thread_state(i).promotion_failed_info().reset();
@@ -370,7 +373,7 @@
void ParScanThreadStateSet::reset(uint active_threads, bool promotion_failed) {
_term.reset_for_reuse(active_threads);
if (promotion_failed) {
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
thread_state(i).print_promotion_failure_size();
}
}
@@ -385,7 +388,7 @@
}
void ParScanThreadStateSet::reset_stats() {
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
thread_state(i).reset_stats();
}
}
@@ -408,7 +411,7 @@
print_termination_stats_hdr(st);
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
const ParScanThreadState & pss = thread_state(i);
const double elapsed_ms = pss.elapsed_time() * 1000.0;
const double s_roots_ms = pss.strong_roots_time() * 1000.0;
@@ -436,7 +439,7 @@
print_taskqueue_stats_hdr(st);
TaskQueueStats totals;
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
const ParScanThreadState & pss = thread_state(i);
const TaskQueueStats & stats = pss.taskqueue_stats();
st->print("%3d ", i); stats.print(st); st->cr();
@@ -459,7 +462,7 @@
// possible since this might otherwise become a bottleneck
// to scaling. Should we add heavy-weight work into this
// loop, consider parallelizing the loop into the worker threads.
- for (int i = 0; i < length(); ++i) {
+ for (int i = 0; i < _num_threads; ++i) {
ParScanThreadState& par_scan_state = thread_state(i);
// Flush stats related to To-space PLAB activity and
--- a/hotspot/src/share/vm/interpreter/rewriter.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/interpreter/rewriter.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -65,11 +65,12 @@
// Record limits of resolved reference map for constant pool cache indices
record_map_limits();
- guarantee((int)_cp_cache_map.length()-1 <= (int)((u2)-1),
+ guarantee((int) _cp_cache_map.length() - 1 <= (int) ((u2)-1),
"all cp cache indexes fit in a u2");
- if (saw_mh_symbol)
- _method_handle_invokers.initialize(length, (int)0);
+ if (saw_mh_symbol) {
+ _method_handle_invokers.at_grow(length, 0);
+ }
}
// Unrewrite the bytecodes if an error occurs.
@@ -193,7 +194,7 @@
assert(_pool->tag_at(cp_index).is_method(), "wrong index");
// Determine whether this is a signature-polymorphic method.
if (cp_index >= _method_handle_invokers.length()) return;
- int status = _method_handle_invokers[cp_index];
+ int status = _method_handle_invokers.at(cp_index);
assert(status >= -1 && status <= 1, "oob tri-state");
if (status == 0) {
if (_pool->klass_ref_at_noresolve(cp_index) == vmSymbols::java_lang_invoke_MethodHandle() &&
@@ -211,7 +212,7 @@
} else {
status = -1;
}
- _method_handle_invokers[cp_index] = status;
+ _method_handle_invokers.at(cp_index) = status;
}
// We use a special internal bytecode for such methods (if non-static).
// The basic reason for this is that such methods need an extra "appendix" argument
@@ -287,7 +288,7 @@
// add delta to each.
int resolved_index = _patch_invokedynamic_refs->at(i);
for (int entry = 0; entry < ConstantPoolCacheEntry::_indy_resolved_references_entries; entry++) {
- assert(_invokedynamic_references_map[resolved_index+entry] == cache_index,
+ assert(_invokedynamic_references_map.at(resolved_index + entry) == cache_index,
"should be the same index");
_invokedynamic_references_map.at_put(resolved_index+entry,
cache_index + delta);
@@ -520,7 +521,14 @@
Rewriter::Rewriter(instanceKlassHandle klass, const constantPoolHandle& cpool, Array<Method*>* methods, TRAPS)
: _klass(klass),
_pool(cpool),
- _methods(methods)
+ _methods(methods),
+ _cp_map(cpool->length()),
+ _cp_cache_map(cpool->length() / 2),
+ _reference_map(cpool->length()),
+ _resolved_references_map(cpool->length() / 2),
+ _invokedynamic_references_map(cpool->length() / 2),
+ _method_handle_invokers(cpool->length()),
+ _invokedynamic_cp_cache_map(cpool->length() / 4)
{
// Rewrite bytecodes - exception here exits.
--- a/hotspot/src/share/vm/interpreter/rewriter.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/interpreter/rewriter.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -37,13 +37,13 @@
instanceKlassHandle _klass;
constantPoolHandle _pool;
Array<Method*>* _methods;
- intArray _cp_map;
- intStack _cp_cache_map; // for Methodref, Fieldref,
- // InterfaceMethodref and InvokeDynamic
- intArray _reference_map; // maps from cp index to resolved_refs index (or -1)
- intStack _resolved_references_map; // for strings, methodHandle, methodType
- intStack _invokedynamic_references_map; // for invokedynamic resolved refs
- intArray _method_handle_invokers;
+ GrowableArray<int> _cp_map;
+ GrowableArray<int> _cp_cache_map; // for Methodref, Fieldref,
+ // InterfaceMethodref and InvokeDynamic
+ GrowableArray<int> _reference_map; // maps from cp index to resolved_refs index (or -1)
+ GrowableArray<int> _resolved_references_map; // for strings, methodHandle, methodType
+ GrowableArray<int> _invokedynamic_references_map; // for invokedynamic resolved refs
+ GrowableArray<int> _method_handle_invokers;
int _resolved_reference_limit;
// For mapping invokedynamic bytecodes, which are discovered during method
@@ -51,28 +51,31 @@
// If there are any invokespecial/InterfaceMethodref special case bytecodes,
// these entries are added before invokedynamic entries so that the
// invokespecial bytecode 16 bit index doesn't overflow.
- intStack _invokedynamic_cp_cache_map;
+ GrowableArray<int> _invokedynamic_cp_cache_map;
// For patching.
GrowableArray<address>* _patch_invokedynamic_bcps;
GrowableArray<int>* _patch_invokedynamic_refs;
void init_maps(int length) {
- _cp_map.initialize(length, -1);
- // Choose an initial value large enough that we don't get frequent
- // calls to grow().
- _cp_cache_map.initialize(length/2);
+ _cp_map.trunc_to(0);
+ _cp_map.at_grow(length, -1);
+
+ _cp_cache_map.trunc_to(0);
// Also cache resolved objects, in another different cache.
- _reference_map.initialize(length, -1);
- _resolved_references_map.initialize(length/2);
- _invokedynamic_references_map.initialize(length/2);
+ _reference_map.trunc_to(0);
+ _reference_map.at_grow(length, -1);
+
+ _method_handle_invokers.trunc_to(0);
+ _resolved_references_map.trunc_to(0);
+ _invokedynamic_references_map.trunc_to(0);
_resolved_reference_limit = -1;
_first_iteration_cp_cache_limit = -1;
// invokedynamic specific fields
- _invokedynamic_cp_cache_map.initialize(length/4);
- _patch_invokedynamic_bcps = new GrowableArray<address>(length/4);
- _patch_invokedynamic_refs = new GrowableArray<int>(length/4);
+ _invokedynamic_cp_cache_map.trunc_to(0);
+ _patch_invokedynamic_bcps = new GrowableArray<address>(length / 4);
+ _patch_invokedynamic_refs = new GrowableArray<int>(length / 4);
}
int _first_iteration_cp_cache_limit;
@@ -90,10 +93,10 @@
return _cp_cache_map.length() - _first_iteration_cp_cache_limit;
}
- int cp_entry_to_cp_cache(int i) { assert(has_cp_cache(i), "oob"); return _cp_map[i]; }
- bool has_cp_cache(int i) { return (uint)i < (uint)_cp_map.length() && _cp_map[i] >= 0; }
+ int cp_entry_to_cp_cache(int i) { assert(has_cp_cache(i), "oob"); return _cp_map.at(i); }
+ bool has_cp_cache(int i) { return (uint) i < (uint) _cp_map.length() && _cp_map.at(i) >= 0; }
- int add_map_entry(int cp_index, intArray* cp_map, intStack* cp_cache_map) {
+ int add_map_entry(int cp_index, GrowableArray<int>* cp_map, GrowableArray<int>* cp_cache_map) {
assert(cp_map->at(cp_index) == -1, "not twice on same cp_index");
int cache_index = cp_cache_map->append(cp_index);
cp_map->at_put(cp_index, cache_index);
@@ -121,7 +124,7 @@
}
int invokedynamic_cp_cache_entry_pool_index(int cache_index) {
- int cp_index = _invokedynamic_cp_cache_map[cache_index];
+ int cp_index = _invokedynamic_cp_cache_map.at(cache_index);
return cp_index;
}
@@ -131,9 +134,9 @@
assert(_first_iteration_cp_cache_limit >= 0, "add these special cache entries after first iteration");
// Don't add InterfaceMethodref if it already exists at the end.
for (int i = _first_iteration_cp_cache_limit; i < _cp_cache_map.length(); i++) {
- if (cp_cache_entry_pool_index(i) == cp_index) {
- return i;
- }
+ if (cp_cache_entry_pool_index(i) == cp_index) {
+ return i;
+ }
}
int cache_index = _cp_cache_map.append(cp_index);
assert(cache_index >= _first_iteration_cp_cache_limit, "");
@@ -144,10 +147,10 @@
int cp_entry_to_resolved_references(int cp_index) const {
assert(has_entry_in_resolved_references(cp_index), "oob");
- return _reference_map[cp_index];
+ return _reference_map.at(cp_index);
}
bool has_entry_in_resolved_references(int cp_index) const {
- return (uint)cp_index < (uint)_reference_map.length() && _reference_map[cp_index] >= 0;
+ return (uint) cp_index < (uint) _reference_map.length() && _reference_map.at(cp_index) >= 0;
}
// add a new entry to the resolved_references map
@@ -174,13 +177,13 @@
}
int resolved_references_entry_to_pool_index(int ref_index) {
- int cp_index = _resolved_references_map[ref_index];
+ int cp_index = _resolved_references_map.at(ref_index);
return cp_index;
}
// Access the contents of _cp_cache_map to determine CP cache layout.
int cp_cache_entry_pool_index(int cache_index) {
- int cp_index = _cp_cache_map[cache_index];
+ int cp_index = _cp_cache_map.at(cache_index);
return cp_index;
}
--- a/hotspot/src/share/vm/libadt/vectset.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/libadt/vectset.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -31,7 +31,7 @@
// BitsInByte is a lookup table which tells the number of bits that
// are in the looked-up number. It is very useful in VectorSet_Size.
-uint8_t bitsInByte[256] = {
+uint8_t bitsInByte[BITS_IN_BYTE_ARRAY_SIZE] = {
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
--- a/hotspot/src/share/vm/libadt/vectset.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/libadt/vectset.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -27,6 +27,8 @@
#include "libadt/set.hpp"
+#define BITS_IN_BYTE_ARRAY_SIZE 256
+
// Vector Sets - An Abstract Data Type
//INTERFACE
--- a/hotspot/src/share/vm/oops/cpCache.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/oops/cpCache.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -569,7 +569,7 @@
const intArray& invokedynamic_references_map) {
for (int i = 0; i < inverse_index_map.length(); i++) {
ConstantPoolCacheEntry* e = entry_at(i);
- int original_index = inverse_index_map[i];
+ int original_index = inverse_index_map.at(i);
e->initialize_entry(original_index);
assert(entry_at(i) == e, "sanity");
}
@@ -579,19 +579,19 @@
for (int i = 0; i < invokedynamic_inverse_index_map.length(); i++) {
int offset = i + invokedynamic_offset;
ConstantPoolCacheEntry* e = entry_at(offset);
- int original_index = invokedynamic_inverse_index_map[i];
+ int original_index = invokedynamic_inverse_index_map.at(i);
e->initialize_entry(original_index);
assert(entry_at(offset) == e, "sanity");
}
for (int ref = 0; ref < invokedynamic_references_map.length(); ref++) {
- const int cpci = invokedynamic_references_map[ref];
+ const int cpci = invokedynamic_references_map.at(ref);
if (cpci >= 0) {
#ifdef ASSERT
// invokedynamic and invokehandle have more entries; check if they
// all point to the same constant pool cache entry.
for (int entry = 1; entry < ConstantPoolCacheEntry::_indy_resolved_references_entries; entry++) {
- const int cpci_next = invokedynamic_references_map[ref + entry];
+ const int cpci_next = invokedynamic_references_map.at(ref + entry);
assert(cpci == cpci_next, "%d == %d", cpci, cpci_next);
}
#endif
--- a/hotspot/src/share/vm/opto/c2compiler.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/c2compiler.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -361,6 +361,9 @@
case vmIntrinsics::_getCallerClass:
if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
break;
+ case vmIntrinsics::_onSpinWait:
+ if (!Matcher::match_rule_supported(Op_OnSpinWait)) return false;
+ break;
case vmIntrinsics::_hashCode:
case vmIntrinsics::_identityHashCode:
case vmIntrinsics::_getClass:
--- a/hotspot/src/share/vm/opto/classes.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/classes.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -171,7 +171,6 @@
macro(LoadRange)
macro(LoadS)
macro(Lock)
-macro(Log10D)
macro(Loop)
macro(LoopLimit)
macro(Mach)
@@ -205,6 +204,7 @@
macro(NegD)
macro(NegF)
macro(NeverBranch)
+macro(OnSpinWait)
macro(Opaque1)
macro(Opaque2)
macro(Opaque3)
@@ -264,7 +264,6 @@
macro(SubL)
macro(TailCall)
macro(TailJump)
-macro(TanD)
macro(ThreadLocal)
macro(Unlock)
macro(URShiftI)
--- a/hotspot/src/share/vm/opto/graphKit.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -4467,6 +4467,25 @@
set_memory(st, TypeAryPtr::BYTES);
}
+Node* GraphKit::make_constant_from_field(ciField* field, Node* obj) {
+ if (!field->is_constant()) {
+ return NULL; // Field not marked as constant.
+ }
+ ciInstance* holder = NULL;
+ if (!field->is_static()) {
+ ciObject* const_oop = obj->bottom_type()->is_oopptr()->const_oop();
+ if (const_oop != NULL && const_oop->is_instance()) {
+ holder = const_oop->as_instance();
+ }
+ }
+ const Type* con_type = Type::make_constant_from_field(field, holder, field->layout_type(),
+ /*is_unsigned_load=*/false);
+ if (con_type != NULL) {
+ return makecon(con_type);
+ }
+ return NULL;
+}
+
Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) {
// Reify the property as a CastPP node in Ideal graph to comply with monotonicity
// assumption of CCP analysis.
--- a/hotspot/src/share/vm/opto/graphKit.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -910,6 +910,8 @@
void add_predicate(int nargs = 0);
void add_predicate_impl(Deoptimization::DeoptReason reason, int nargs);
+ Node* make_constant_from_field(ciField* field, Node* obj);
+
// Produce new array node of stable type
Node* cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type);
};
--- a/hotspot/src/share/vm/opto/library_call.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -281,6 +281,7 @@
MemNode::MemOrd access_kind_to_memord(AccessKind access_kind);
bool inline_unsafe_load_store(BasicType type, LoadStoreKind kind, AccessKind access_kind);
bool inline_unsafe_fence(vmIntrinsics::ID id);
+ bool inline_onspinwait();
bool inline_fp_conversions(vmIntrinsics::ID id);
bool inline_number_methods(vmIntrinsics::ID id);
bool inline_reference_get();
@@ -696,6 +697,8 @@
case vmIntrinsics::_storeFence:
case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id());
+ case vmIntrinsics::_onSpinWait: return inline_onspinwait();
+
case vmIntrinsics::_currentThread: return inline_native_currentThread();
case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted();
@@ -1677,7 +1680,6 @@
switch (id) {
case vmIntrinsics::_dabs: n = new AbsDNode( arg); break;
case vmIntrinsics::_dsqrt: n = new SqrtDNode(C, control(), arg); break;
- case vmIntrinsics::_dlog10: n = new Log10DNode(C, control(), arg); break;
default: fatal_unexpected_iid(id); break;
}
set_result(_gvn.transform(n));
@@ -1691,10 +1693,6 @@
Node* arg = round_double_node(argument(0));
Node* n = NULL;
- switch (id) {
- case vmIntrinsics::_dtan: n = new TanDNode(C, control(), arg); break;
- default: fatal_unexpected_iid(id); break;
- }
n = _gvn.transform(n);
// Rounding required? Check for argument reduction!
@@ -1812,15 +1810,18 @@
return StubRoutines::dcos() != NULL ?
runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dcos(), "dcos") :
runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dcos), "COS");
- case vmIntrinsics::_dtan: return Matcher::has_match_rule(Op_TanD) ? inline_trig(id) :
- runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dtan), "TAN");
-
+ case vmIntrinsics::_dtan:
+ return StubRoutines::dtan() != NULL ?
+ runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dtan(), "dtan") :
+ runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dtan), "TAN");
case vmIntrinsics::_dlog:
return StubRoutines::dlog() != NULL ?
runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dlog(), "dlog") :
runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog), "LOG");
- case vmIntrinsics::_dlog10: return Matcher::has_match_rule(Op_Log10D) ? inline_math(id) :
- runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog10), "LOG10");
+ case vmIntrinsics::_dlog10:
+ return StubRoutines::dlog10() != NULL ?
+ runtime_math(OptoRuntime::Math_D_D_Type(), StubRoutines::dlog10(), "dlog10") :
+ runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog10), "LOG10");
// These intrinsics are supported on all hardware
case vmIntrinsics::_dsqrt: return Matcher::match_rule_supported(Op_SqrtD) ? inline_math(id) : false;
@@ -2550,13 +2551,9 @@
Node* p = NULL;
// Try to constant fold a load from a constant field
ciField* field = alias_type->field();
- if (heap_base_oop != top() &&
- field != NULL && field->is_constant() && !mismatched) {
+ if (heap_base_oop != top() && field != NULL && field->is_constant() && !mismatched) {
// final or stable field
- const Type* con_type = Type::make_constant(alias_type->field(), heap_base_oop);
- if (con_type != NULL) {
- p = makecon(con_type);
- }
+ p = make_constant_from_field(field, heap_base_oop);
}
if (p == NULL) {
// To be valid, unsafe loads may depend on other conditions than
@@ -3127,6 +3124,11 @@
}
}
+bool LibraryCallKit::inline_onspinwait() {
+ insert_mem_bar(Op_OnSpinWait);
+ return true;
+}
+
bool LibraryCallKit::klass_needs_init_guard(Node* kls) {
if (!kls->is_Con()) {
return true;
--- a/hotspot/src/share/vm/opto/macro.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/macro.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -860,7 +860,7 @@
if (basic_elem_type == T_OBJECT || basic_elem_type == T_ARRAY) {
if (!elem_type->is_loaded()) {
field_type = TypeInstPtr::BOTTOM;
- } else if (field != NULL && field->is_constant() && field->is_static()) {
+ } else if (field != NULL && field->is_static_constant()) {
// This can happen if the constant oop is non-perm.
ciObject* con = field->constant_value().as_object();
// Do not "join" in the previous type; it doesn't add value,
--- a/hotspot/src/share/vm/opto/matcher.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -944,6 +944,7 @@
case Op_MemBarCPUOrder: // %%% these ideals should have narrower adr_type?
case Op_StrInflatedCopy:
case Op_StrCompressedCopy:
+ case Op_OnSpinWait:
case Op_EncodeISOArray:
nidx = Compile::AliasIdxTop;
nat = NULL;
--- a/hotspot/src/share/vm/opto/memnode.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -797,7 +797,7 @@
#endif
{
assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
- load = new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo, control_dependency);
+ load = new LoadPNode(ctl, mem, adr, adr_type, rt->is_ptr(), mo, control_dependency);
}
break;
}
@@ -1621,72 +1621,6 @@
return NULL;
}
-static ciConstant check_mismatched_access(ciConstant con, BasicType loadbt, bool is_unsigned) {
- BasicType conbt = con.basic_type();
- switch (conbt) {
- case T_BOOLEAN: conbt = T_BYTE; break;
- case T_ARRAY: conbt = T_OBJECT; break;
- }
- switch (loadbt) {
- case T_BOOLEAN: loadbt = T_BYTE; break;
- case T_NARROWOOP: loadbt = T_OBJECT; break;
- case T_ARRAY: loadbt = T_OBJECT; break;
- case T_ADDRESS: loadbt = T_OBJECT; break;
- }
- if (conbt == loadbt) {
- if (is_unsigned && conbt == T_BYTE) {
- // LoadB (T_BYTE) with a small mask (<=8-bit) is converted to LoadUB (T_BYTE).
- return ciConstant(T_INT, con.as_int() & 0xFF);
- } else {
- return con;
- }
- }
- if (conbt == T_SHORT && loadbt == T_CHAR) {
- // LoadS (T_SHORT) with a small mask (<=16-bit) is converted to LoadUS (T_CHAR).
- return ciConstant(T_INT, con.as_int() & 0xFFFF);
- }
- return ciConstant(); // T_ILLEGAL
-}
-
-// Try to constant-fold a stable array element.
-static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, bool is_unsigned_load, BasicType loadbt) {
- assert(ary->const_oop(), "array should be constant");
- assert(ary->is_stable(), "array should be stable");
-
- // Decode the results of GraphKit::array_element_address.
- ciArray* aobj = ary->const_oop()->as_array();
- ciConstant element_value = aobj->element_value_by_offset(off);
- if (element_value.basic_type() == T_ILLEGAL) {
- return NULL; // wrong offset
- }
- ciConstant con = check_mismatched_access(element_value, loadbt, is_unsigned_load);
- assert(con.basic_type() != T_ILLEGAL, "elembt=%s; loadbt=%s; unsigned=%d",
- type2name(element_value.basic_type()), type2name(loadbt), is_unsigned_load);
-
- if (con.basic_type() != T_ILLEGAL && // not a mismatched access
- !con.is_null_or_zero()) { // not a default value
- const Type* con_type = Type::make_from_constant(con);
- if (con_type != NULL) {
- if (con_type->isa_aryptr()) {
- // Join with the array element type, in case it is also stable.
- int dim = ary->stable_dimension();
- con_type = con_type->is_aryptr()->cast_to_stable(true, dim-1);
- }
- if (loadbt == T_NARROWOOP && con_type->isa_oopptr()) {
- con_type = con_type->make_narrowoop();
- }
-#ifndef PRODUCT
- if (TraceIterativeGVN) {
- tty->print("FoldStableValues: array element [off=%d]: con_type=", off);
- con_type->dump(); tty->cr();
- }
-#endif //PRODUCT
- return con_type;
- }
- }
- return NULL;
-}
-
//------------------------------Value-----------------------------------------
const Type* LoadNode::Value(PhaseGVN* phase) const {
// Either input is TOP ==> the result is TOP
@@ -1715,10 +1649,14 @@
const bool off_beyond_header = ((uint)off >= (uint)min_base_off);
// Try to constant-fold a stable array element.
- if (FoldStableValues && !is_mismatched_access() && ary->is_stable() && ary->const_oop() != NULL) {
+ if (FoldStableValues && !is_mismatched_access() && ary->is_stable()) {
// Make sure the reference is not into the header and the offset is constant
- if (off_beyond_header && adr->is_AddP() && off != Type::OffsetBot) {
- const Type* con_type = fold_stable_ary_elem(ary, off, is_unsigned(), memory_type());
+ ciObject* aobj = ary->const_oop();
+ if (aobj != NULL && off_beyond_header && adr->is_AddP() && off != Type::OffsetBot) {
+ int stable_dimension = (ary->stable_dimension() > 0 ? ary->stable_dimension() - 1 : 0);
+ const Type* con_type = Type::make_constant_from_array_element(aobj->as_array(), off,
+ stable_dimension,
+ memory_type(), is_unsigned());
if (con_type != NULL) {
return con_type;
}
@@ -1785,28 +1723,10 @@
// For oop loads, we expect the _type to be precise.
// Optimizations for constant objects
ciObject* const_oop = tinst->const_oop();
- if (const_oop != NULL) {
- // For constant CallSites treat the target field as a compile time constant.
- if (const_oop->is_call_site()) {
- ciCallSite* call_site = const_oop->as_call_site();
- ciField* field = call_site->klass()->as_instance_klass()->get_field_by_offset(off, /*is_static=*/ false);
- if (field != NULL && field->is_call_site_target()) {
- ciMethodHandle* target = call_site->get_target();
- if (target != NULL) { // just in case
- ciConstant constant(T_OBJECT, target);
- const Type* t;
- if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- t = TypeNarrowOop::make_from_constant(constant.as_object(), true);
- } else {
- t = TypeOopPtr::make_from_constant(constant.as_object(), true);
- }
- // Add a dependence for invalidation of the optimization.
- if (!call_site->is_constant_call_site()) {
- C->dependencies()->assert_call_site_target_value(call_site, target);
- }
- return t;
- }
- }
+ if (const_oop != NULL && const_oop->is_instance()) {
+ const Type* con_type = Type::make_constant_from_field(const_oop->as_instance(), off, is_unsigned(), memory_type());
+ if (con_type != NULL) {
+ return con_type;
}
}
} else if (tp->base() == Type::KlassPtr) {
@@ -2979,6 +2899,7 @@
case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
case Op_MemBarVolatile: return new MemBarVolatileNode(C, atp, pn);
case Op_MemBarCPUOrder: return new MemBarCPUOrderNode(C, atp, pn);
+ case Op_OnSpinWait: return new OnSpinWaitNode(C, atp, pn);
case Op_Initialize: return new InitializeNode(C, atp, pn);
case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn);
default: ShouldNotReachHere(); return NULL;
--- a/hotspot/src/share/vm/opto/memnode.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/memnode.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1186,6 +1186,13 @@
virtual uint ideal_reg() const { return 0; } // not matched in the AD file
};
+class OnSpinWaitNode: public MemBarNode {
+public:
+ OnSpinWaitNode(Compile* C, int alias_idx, Node* precedent)
+ : MemBarNode(C, alias_idx, precedent) {}
+ virtual int Opcode() const;
+};
+
// Isolation of object setup after an AllocateNode and before next safepoint.
// (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.)
class InitializeNode: public MemBarNode {
--- a/hotspot/src/share/vm/opto/output.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/output.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1483,8 +1483,6 @@
// Compute the size of the first block
_first_block_size = blk_labels[1].loc_pos() - blk_labels[0].loc_pos();
- assert(cb->insts_size() < 500000, "method is unreasonably large");
-
#ifdef ASSERT
for (uint i = 0; i < nblocks; i++) { // For all blocks
if (jmp_target[i] != 0) {
--- a/hotspot/src/share/vm/opto/parse3.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/parse3.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -149,9 +149,9 @@
// Does this field have a constant value? If so, just push the value.
if (field->is_constant()) {
// final or stable field
- const Type* con_type = Type::make_constant(field, obj);
- if (con_type != NULL) {
- push_node(con_type->basic_type(), makecon(con_type));
+ Node* con = make_constant_from_field(field, obj);
+ if (con != NULL) {
+ push_node(field->layout_type(), con);
return;
}
}
@@ -174,12 +174,16 @@
if (!field->type()->is_loaded()) {
type = TypeInstPtr::BOTTOM;
must_assert_null = true;
- } else if (field->is_constant() && field->is_static()) {
+ } else if (field->is_static_constant()) {
// This can happen if the constant oop is non-perm.
ciObject* con = field->constant_value().as_object();
// Do not "join" in the previous type; it doesn't add value,
// and may yield a vacuous result if the field is of interface type.
- type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
+ if (con->is_null_object()) {
+ type = TypePtr::NULL_PTR;
+ } else {
+ type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
+ }
assert(type != NULL, "field singleton type must be consistent");
} else {
type = TypeOopPtr::make_from_klass(field_klass->as_klass());
--- a/hotspot/src/share/vm/opto/regmask.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/regmask.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -389,7 +389,7 @@
//------------------------------Size-------------------------------------------
// Compute size of register mask in bits
uint RegMask::Size() const {
- extern uint8_t bitsInByte[512];
+ extern uint8_t bitsInByte[BITS_IN_BYTE_ARRAY_SIZE];
uint sum = 0;
for( int i = 0; i < RM_SIZE; i++ )
sum +=
--- a/hotspot/src/share/vm/opto/stringopts.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/stringopts.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1112,7 +1112,7 @@
if( bt == T_OBJECT ) {
if (!field->type()->is_loaded()) {
type = TypeInstPtr::BOTTOM;
- } else if (field->is_constant()) {
+ } else if (field->is_static_constant()) {
// This can happen if the constant oop is non-perm.
ciObject* con = field->constant_value().as_object();
// Do not "join" in the previous type; it doesn't add value,
--- a/hotspot/src/share/vm/opto/subnode.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/subnode.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1533,25 +1533,3 @@
if( d < 0.0 ) return Type::DOUBLE;
return TypeD::make( sqrt( d ) );
}
-
-//=============================================================================
-//------------------------------Value------------------------------------------
-// Compute tan
-const Type* TanDNode::Value(PhaseGVN* phase) const {
- const Type *t1 = phase->type( in(1) );
- if( t1 == Type::TOP ) return Type::TOP;
- if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
- double d = t1->getd();
- return TypeD::make( StubRoutines::intrinsic_tan( d ) );
-}
-
-//=============================================================================
-//------------------------------Value------------------------------------------
-// Compute log10
-const Type* Log10DNode::Value(PhaseGVN* phase) const {
- const Type *t1 = phase->type( in(1) );
- if( t1 == Type::TOP ) return Type::TOP;
- if( t1->base() != Type::DoubleCon ) return Type::DOUBLE;
- double d = t1->getd();
- return TypeD::make( StubRoutines::intrinsic_log10( d ) );
-}
--- a/hotspot/src/share/vm/opto/subnode.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/subnode.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -408,21 +408,6 @@
virtual uint ideal_reg() const { return Op_RegD; }
};
-//------------------------------TanDNode---------------------------------------
-// tangens of a double
-class TanDNode : public Node {
-public:
- TanDNode(Compile* C, Node *c,Node *in1) : Node(c, in1) {
- init_flags(Flag_is_expensive);
- C->add_expensive_node(this);
- }
- virtual int Opcode() const;
- const Type *bottom_type() const { return Type::DOUBLE; }
- virtual uint ideal_reg() const { return Op_RegD; }
- virtual const Type* Value(PhaseGVN* phase) const;
-};
-
-
//------------------------------AtanDNode--------------------------------------
// arcus tangens of a double
class AtanDNode : public Node {
@@ -448,20 +433,6 @@
virtual const Type* Value(PhaseGVN* phase) const;
};
-//------------------------------Log10DNode---------------------------------------
-// Log_10 of a double
-class Log10DNode : public Node {
-public:
- Log10DNode(Compile* C, Node *c, Node *in1) : Node(c, in1) {
- init_flags(Flag_is_expensive);
- C->add_expensive_node(this);
- }
- virtual int Opcode() const;
- const Type *bottom_type() const { return Type::DOUBLE; }
- virtual uint ideal_reg() const { return Op_RegD; }
- virtual const Type* Value(PhaseGVN* phase) const;
-};
-
//-------------------------------ReverseBytesINode--------------------------------
// reverse bytes of an integer
class ReverseBytesINode : public Node {
--- a/hotspot/src/share/vm/opto/type.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/type.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -225,74 +225,156 @@
//-----------------------make_from_constant------------------------------------
-const Type* Type::make_from_constant(ciConstant constant, bool require_constant) {
+const Type* Type::make_from_constant(ciConstant constant, bool require_constant,
+ int stable_dimension, bool is_narrow_oop,
+ bool is_autobox_cache) {
switch (constant.basic_type()) {
- case T_BOOLEAN: return TypeInt::make(constant.as_boolean());
- case T_CHAR: return TypeInt::make(constant.as_char());
- case T_BYTE: return TypeInt::make(constant.as_byte());
- case T_SHORT: return TypeInt::make(constant.as_short());
- case T_INT: return TypeInt::make(constant.as_int());
- case T_LONG: return TypeLong::make(constant.as_long());
- case T_FLOAT: return TypeF::make(constant.as_float());
- case T_DOUBLE: return TypeD::make(constant.as_double());
- case T_ARRAY:
- case T_OBJECT:
- {
- // cases:
- // can_be_constant = (oop not scavengable || ScavengeRootsInCode != 0)
- // should_be_constant = (oop not scavengable || ScavengeRootsInCode >= 2)
- // An oop is not scavengable if it is in the perm gen.
- ciObject* oop_constant = constant.as_object();
- if (oop_constant->is_null_object()) {
- return Type::get_zero_type(T_OBJECT);
- } else if (require_constant || oop_constant->should_be_constant()) {
- return TypeOopPtr::make_from_constant(oop_constant, require_constant);
+ case T_BOOLEAN: return TypeInt::make(constant.as_boolean());
+ case T_CHAR: return TypeInt::make(constant.as_char());
+ case T_BYTE: return TypeInt::make(constant.as_byte());
+ case T_SHORT: return TypeInt::make(constant.as_short());
+ case T_INT: return TypeInt::make(constant.as_int());
+ case T_LONG: return TypeLong::make(constant.as_long());
+ case T_FLOAT: return TypeF::make(constant.as_float());
+ case T_DOUBLE: return TypeD::make(constant.as_double());
+ case T_ARRAY:
+ case T_OBJECT: {
+ // cases:
+ // can_be_constant = (oop not scavengable || ScavengeRootsInCode != 0)
+ // should_be_constant = (oop not scavengable || ScavengeRootsInCode >= 2)
+ // An oop is not scavengable if it is in the perm gen.
+ const Type* con_type = NULL;
+ ciObject* oop_constant = constant.as_object();
+ if (oop_constant->is_null_object()) {
+ con_type = Type::get_zero_type(T_OBJECT);
+ } else if (require_constant || oop_constant->should_be_constant()) {
+ con_type = TypeOopPtr::make_from_constant(oop_constant, require_constant);
+ if (con_type != NULL) {
+ if (Compile::current()->eliminate_boxing() && is_autobox_cache) {
+ con_type = con_type->is_aryptr()->cast_to_autobox_cache(true);
+ }
+ if (stable_dimension > 0) {
+ assert(FoldStableValues, "sanity");
+ assert(!con_type->is_zero_type(), "default value for stable field");
+ con_type = con_type->is_aryptr()->cast_to_stable(true, stable_dimension);
+ }
+ }
+ }
+ if (is_narrow_oop) {
+ con_type = con_type->make_narrowoop();
+ }
+ return con_type;
}
- }
- case T_ILLEGAL:
- // Invalid ciConstant returned due to OutOfMemoryError in the CI
- assert(Compile::current()->env()->failing(), "otherwise should not see this");
- return NULL;
+ case T_ILLEGAL:
+ // Invalid ciConstant returned due to OutOfMemoryError in the CI
+ assert(Compile::current()->env()->failing(), "otherwise should not see this");
+ return NULL;
}
// Fall through to failure
return NULL;
}
-
-const Type* Type::make_constant(ciField* field, Node* obj) {
- if (!field->is_constant()) return NULL;
-
- const Type* con_type = NULL;
+static ciConstant check_mismatched_access(ciConstant con, BasicType loadbt, bool is_unsigned) {
+ BasicType conbt = con.basic_type();
+ switch (conbt) {
+ case T_BOOLEAN: conbt = T_BYTE; break;
+ case T_ARRAY: conbt = T_OBJECT; break;
+ }
+ switch (loadbt) {
+ case T_BOOLEAN: loadbt = T_BYTE; break;
+ case T_NARROWOOP: loadbt = T_OBJECT; break;
+ case T_ARRAY: loadbt = T_OBJECT; break;
+ case T_ADDRESS: loadbt = T_OBJECT; break;
+ }
+ if (conbt == loadbt) {
+ if (is_unsigned && conbt == T_BYTE) {
+ // LoadB (T_BYTE) with a small mask (<=8-bit) is converted to LoadUB (T_BYTE).
+ return ciConstant(T_INT, con.as_int() & 0xFF);
+ } else {
+ return con;
+ }
+ }
+ if (conbt == T_SHORT && loadbt == T_CHAR) {
+ // LoadS (T_SHORT) with a small mask (<=16-bit) is converted to LoadUS (T_CHAR).
+ return ciConstant(T_INT, con.as_int() & 0xFFFF);
+ }
+ return ciConstant(); // T_ILLEGAL
+}
+
+// Try to constant-fold a stable array element.
+const Type* Type::make_constant_from_array_element(ciArray* array, int off, int stable_dimension,
+ BasicType loadbt, bool is_unsigned_load) {
+ // Decode the results of GraphKit::array_element_address.
+ ciConstant element_value = array->element_value_by_offset(off);
+ if (element_value.basic_type() == T_ILLEGAL) {
+ return NULL; // wrong offset
+ }
+ ciConstant con = check_mismatched_access(element_value, loadbt, is_unsigned_load);
+
+ assert(con.basic_type() != T_ILLEGAL, "elembt=%s; loadbt=%s; unsigned=%d",
+ type2name(element_value.basic_type()), type2name(loadbt), is_unsigned_load);
+
+ if (con.is_valid() && // not a mismatched access
+ !con.is_null_or_zero()) { // not a default value
+ bool is_narrow_oop = (loadbt == T_NARROWOOP);
+ return Type::make_from_constant(con, /*require_constant=*/true, stable_dimension, is_narrow_oop, /*is_autobox_cache=*/false);
+ }
+ return NULL;
+}
+
+const Type* Type::make_constant_from_field(ciInstance* holder, int off, bool is_unsigned_load, BasicType loadbt) {
+ ciField* field;
+ ciType* type = holder->java_mirror_type();
+ if (type != NULL && type->is_instance_klass() && off >= InstanceMirrorKlass::offset_of_static_fields()) {
+ // Static field
+ field = type->as_instance_klass()->get_field_by_offset(off, /*is_static=*/true);
+ } else {
+ // Instance field
+ field = holder->klass()->as_instance_klass()->get_field_by_offset(off, /*is_static=*/false);
+ }
+ if (field == NULL) {
+ return NULL; // Wrong offset
+ }
+ return Type::make_constant_from_field(field, holder, loadbt, is_unsigned_load);
+}
+
+const Type* Type::make_constant_from_field(ciField* field, ciInstance* holder,
+ BasicType loadbt, bool is_unsigned_load) {
+ if (!field->is_constant()) {
+ return NULL; // Non-constant field
+ }
+ ciConstant field_value;
if (field->is_static()) {
// final static field
- con_type = Type::make_from_constant(field->constant_value(), /*require_const=*/true);
- if (Compile::current()->eliminate_boxing() && field->is_autobox_cache() && con_type != NULL) {
- con_type = con_type->is_aryptr()->cast_to_autobox_cache(true);
- }
- } else {
+ field_value = field->constant_value();
+ } else if (holder != NULL) {
// final or stable non-static field
// Treat final non-static fields of trusted classes (classes in
// java.lang.invoke and sun.invoke packages and subpackages) as
// compile time constants.
- if (obj->is_Con()) {
- const TypeOopPtr* oop_ptr = obj->bottom_type()->isa_oopptr();
- ciObject* constant_oop = oop_ptr->const_oop();
- ciConstant constant = field->constant_value_of(constant_oop);
- con_type = Type::make_from_constant(constant, /*require_const=*/true);
- }
+ field_value = field->constant_value_of(holder);
+ }
+ if (!field_value.is_valid()) {
+ return NULL; // Not a constant
}
- if (FoldStableValues && field->is_stable() && con_type != NULL) {
- if (con_type->is_zero_type()) {
- return NULL; // the field hasn't been initialized yet
- } else if (con_type->isa_oopptr()) {
- const Type* stable_type = Type::get_const_type(field->type());
- if (field->type()->is_array_klass()) {
- int stable_dimension = field->type()->as_array_klass()->dimension();
- stable_type = stable_type->is_aryptr()->cast_to_stable(true, stable_dimension);
- }
- if (stable_type != NULL) {
- con_type = con_type->join_speculative(stable_type);
- }
+
+ ciConstant con = check_mismatched_access(field_value, loadbt, is_unsigned_load);
+
+ assert(con.is_valid(), "elembt=%s; loadbt=%s; unsigned=%d",
+ type2name(field_value.basic_type()), type2name(loadbt), is_unsigned_load);
+
+ bool is_stable_array = FoldStableValues && field->is_stable() && field->type()->is_array_klass();
+ int stable_dimension = (is_stable_array ? field->type()->as_array_klass()->dimension() : 0);
+ bool is_narrow_oop = (loadbt == T_NARROWOOP);
+
+ const Type* con_type = make_from_constant(con, /*require_constant=*/ true,
+ stable_dimension, is_narrow_oop,
+ field->is_autobox_cache());
+ if (con_type != NULL && field->is_call_site_target()) {
+ ciCallSite* call_site = holder->as_call_site();
+ if (!call_site->is_constant_call_site()) {
+ ciMethodHandle* target = call_site->get_target();
+ Compile::current()->dependencies()->assert_call_site_target_value(call_site, target);
}
}
return con_type;
--- a/hotspot/src/share/vm/opto/type.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/opto/type.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -417,9 +417,26 @@
static const Type* get_typeflow_type(ciType* type);
static const Type* make_from_constant(ciConstant constant,
- bool require_constant = false);
+ bool require_constant = false,
+ int stable_dimension = 0,
+ bool is_narrow = false,
+ bool is_autobox_cache = false);
+
+ static const Type* make_constant_from_field(ciInstance* holder,
+ int off,
+ bool is_unsigned_load,
+ BasicType loadbt);
- static const Type* make_constant(ciField* field, Node* obj);
+ static const Type* make_constant_from_field(ciField* field,
+ ciInstance* holder,
+ BasicType loadbt,
+ bool is_unsigned_load);
+
+ static const Type* make_constant_from_array_element(ciArray* array,
+ int off,
+ int stable_dimension,
+ BasicType loadbt,
+ bool is_unsigned_load);
// Speculative type helper methods. See TypePtr.
virtual const TypePtr* speculative() const { return NULL; }
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -693,7 +693,7 @@
if (JvmtiExport::can_maintain_original_method_order()) {
int index;
int original_index;
- intArray method_order(num_methods, 0);
+ intArray method_order(num_methods, num_methods, 0);
// invert the method order mapping
for (index = 0; index < num_methods; index++) {
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -1448,12 +1448,12 @@
ResourceMark rm(THREAD);
_index_map_count = 0;
- _index_map_p = new intArray(scratch_cp->length(), -1);
+ _index_map_p = new intArray(scratch_cp->length(), scratch_cp->length(), -1);
_operands_cur_length = ConstantPool::operand_array_length(old_cp->operands());
_operands_index_map_count = 0;
- _operands_index_map_p = new intArray(
- ConstantPool::operand_array_length(scratch_cp->operands()), -1);
+ int operands_index_map_len = ConstantPool::operand_array_length(scratch_cp->operands());
+ _operands_index_map_p = new intArray(operands_index_map_len, operands_index_map_len, -1);
// reference to the cp holder is needed for copy_operands()
merge_cp->set_pool_holder(scratch_class());
--- a/hotspot/src/share/vm/prims/whitebox.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -639,17 +639,26 @@
return result;
WB_END
-WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
- // Screen for unavailable/bad comp level
- if (CompileBroker::compiler(comp_level) == NULL) {
+bool WhiteBox::compile_method(Method* method, int comp_level, int bci, Thread* THREAD) {
+ // Screen for unavailable/bad comp level or null method
+ if (method == NULL || CompileBroker::compiler(comp_level) == NULL) {
return false;
}
- jmethodID jmid = reflected_method_to_jmid(thread, env, method);
- CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
- methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ methodHandle mh(THREAD, method);
nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
MutexLockerEx mu(Compile_lock);
return (mh->queued_for_compilation() || nm != NULL);
+}
+
+WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
+ return WhiteBox::compile_method(Method::checked_resolve_jmethod_id(jmid), comp_level, bci, THREAD);
+WB_END
+
+WB_ENTRY(jboolean, WB_EnqueueInitializerForCompilation(JNIEnv* env, jobject o, jclass klass, jint comp_level))
+ instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
+ return WhiteBox::compile_method(ikh->class_initializer(), comp_level, InvocationEntryBci, THREAD);
WB_END
WB_ENTRY(jboolean, WB_ShouldPrintAssembly(JNIEnv* env, jobject o, jobject method, jint comp_level))
@@ -1640,6 +1649,8 @@
CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod},
{CC"enqueueMethodForCompilation0",
CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
+ {CC"enqueueInitializerForCompilation0",
+ CC"(Ljava/lang/Class;I)Z", (void*)&WB_EnqueueInitializerForCompilation},
{CC"clearMethodState0",
CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
{CC"lockCompilation", CC"()V", (void*)&WB_LockCompilation},
--- a/hotspot/src/share/vm/prims/whitebox.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -77,6 +77,7 @@
static void register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread,
JNINativeMethod* method_array, int method_count);
static void register_extended(JNIEnv* env, jclass wbclass, JavaThread* thread);
+ static bool compile_method(Method* method, int comp_level, int bci, Thread* THREAD);
};
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -154,11 +154,14 @@
address StubRoutines::_dexp = NULL;
address StubRoutines::_dlog = NULL;
+address StubRoutines::_dlog10 = NULL;
address StubRoutines::_dpow = NULL;
address StubRoutines::_dsin = NULL;
address StubRoutines::_dcos = NULL;
address StubRoutines::_dlibm_sin_cos_huge = NULL;
address StubRoutines::_dlibm_reduce_pi04l = NULL;
+address StubRoutines::_dlibm_tan_cot_huge = NULL;
+address StubRoutines::_dtan = NULL;
double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
double (* StubRoutines::_intrinsic_sin )(double) = NULL;
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -213,11 +213,14 @@
static address _dexp;
static address _dlog;
+ static address _dlog10;
static address _dpow;
static address _dsin;
static address _dcos;
static address _dlibm_sin_cos_huge;
static address _dlibm_reduce_pi04l;
+ static address _dlibm_tan_cot_huge;
+ static address _dtan;
// These are versions of the java.lang.Math methods which perform
// the same operations as the intrinsic version. They are used for
@@ -391,11 +394,14 @@
static address dexp() { return _dexp; }
static address dlog() { return _dlog; }
+ static address dlog10() { return _dlog10; }
static address dpow() { return _dpow; }
static address dsin() { return _dsin; }
static address dcos() { return _dcos; }
static address dlibm_reduce_pi04l() { return _dlibm_reduce_pi04l; }
static address dlibm_sin_cos_huge() { return _dlibm_sin_cos_huge; }
+ static address dlibm_tan_cot_huge() { return _dlibm_tan_cot_huge; }
+ static address dtan() { return _dtan; }
static address select_fill_function(BasicType t, bool aligned, const char* &name);
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Apr 12 14:17:42 2016 -0400
@@ -860,9 +860,11 @@
static_field(StubRoutines, _mulAdd, address) \
static_field(StubRoutines, _dexp, address) \
static_field(StubRoutines, _dlog, address) \
+ static_field(StubRoutines, _dlog10, address) \
static_field(StubRoutines, _dpow, address) \
static_field(StubRoutines, _dsin, address) \
static_field(StubRoutines, _dcos, address) \
+ static_field(StubRoutines, _dtan, address) \
static_field(StubRoutines, _vectorizedMismatch, address) \
static_field(StubRoutines, _jbyte_arraycopy, address) \
static_field(StubRoutines, _jshort_arraycopy, address) \
@@ -1928,6 +1930,7 @@
declare_c2_type(StoreFenceNode, MemBarNode) \
declare_c2_type(MemBarVolatileNode, MemBarNode) \
declare_c2_type(MemBarCPUOrderNode, MemBarNode) \
+ declare_c2_type(OnSpinWaitNode, MemBarNode) \
declare_c2_type(InitializeNode, MemBarNode) \
declare_c2_type(ThreadLocalNode, Node) \
declare_c2_type(Opaque1Node, Node) \
@@ -2067,10 +2070,8 @@
declare_c2_type(NegNode, Node) \
declare_c2_type(NegFNode, NegNode) \
declare_c2_type(NegDNode, NegNode) \
- declare_c2_type(TanDNode, Node) \
declare_c2_type(AtanDNode, Node) \
declare_c2_type(SqrtDNode, Node) \
- declare_c2_type(Log10DNode, Node) \
declare_c2_type(ReverseBytesINode, Node) \
declare_c2_type(ReverseBytesLNode, Node) \
declare_c2_type(ReductionNode, Node) \
--- a/hotspot/src/share/vm/runtime/vm_version.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/runtime/vm_version.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -162,6 +162,9 @@
// Calculates and returns the number of parallel threads. May
// be VM version specific.
static unsigned int calc_parallel_worker_threads();
+
+ // Does this CPU support spin wait instruction?
+ static bool supports_on_spin_wait() { return false; }
};
#ifdef TARGET_ARCH_x86
--- a/hotspot/src/share/vm/utilities/array.cpp Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-#include "memory/resourceArea.hpp"
-#include "runtime/thread.inline.hpp"
-#include "utilities/array.hpp"
-
-
-#ifdef ASSERT
-void ResourceArray::init_nesting() {
- _nesting = Thread::current()->resource_area()->nesting();
-}
-#endif
-
-
-void ResourceArray::sort(size_t esize, ftype f) {
- if (!is_empty()) qsort(_data, length(), esize, f);
-}
-template <MEMFLAGS F> void CHeapArray<F>::sort(size_t esize, ftype f) {
- if (!is_empty()) qsort(_data, length(), esize, f);
-}
-
-
-void ResourceArray::expand(size_t esize, int i, int& size) {
- // make sure we are expanding within the original resource mark
- assert(
- _nesting == Thread::current()->resource_area()->nesting(),
- "allocating outside original resource mark"
- );
- // determine new size
- if (size == 0) size = 4; // prevent endless loop
- while (i >= size) size *= 2;
- // allocate and initialize new data section
- void* data = resource_allocate_bytes(esize * size);
- memcpy(data, _data, esize * length());
- _data = data;
-}
-
-
-template <MEMFLAGS F> void CHeapArray<F>::expand(size_t esize, int i, int& size) {
- // determine new size
- if (size == 0) size = 4; // prevent endless loop
- while (i >= size) size *= 2;
- // allocate and initialize new data section
- void* data = NEW_C_HEAP_ARRAY(char*, esize * size, F);
- memcpy(data, _data, esize * length());
- FREE_C_HEAP_ARRAY(char*, _data);
- _data = data;
-}
-
-
-void ResourceArray::remove_at(size_t esize, int i) {
- assert(0 <= i && i < length(), "index out of bounds");
- _length--;
- void* dst = (char*)_data + i*esize;
- void* src = (char*)dst + esize;
- size_t cnt = (length() - i)*esize;
- memmove(dst, src, cnt);
-}
-
-template <MEMFLAGS F> void CHeapArray<F>::remove_at(size_t esize, int i) {
- assert(0 <= i && i < length(), "index out of bounds");
- _length--;
- void* dst = (char*)_data + i*esize;
- void* src = (char*)dst + esize;
- size_t cnt = (length() - i)*esize;
- memmove(dst, src, cnt);
-}
--- a/hotspot/src/share/vm/utilities/array.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/utilities/array.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,273 +30,11 @@
#include "memory/metaspace.hpp"
#include "runtime/orderAccess.hpp"
-// correct linkage required to compile w/o warnings
-// (must be on file level - cannot be local)
-extern "C" { typedef int (*ftype)(const void*, const void*); }
-
-
-class ResourceArray: public ResourceObj {
- protected:
- int _length; // the number of array elements
- void* _data; // the array memory
-#ifdef ASSERT
- int _nesting; // the resource area nesting level
-#endif
-
- // creation
- ResourceArray() {
- _length = 0;
- _data = NULL;
- DEBUG_ONLY(init_nesting();)
- // client may call initialize, at most once
- }
-
-
- ResourceArray(size_t esize, int length) {
- DEBUG_ONLY(_data = NULL);
- initialize(esize, length);
- }
-
- void initialize(size_t esize, int length) {
- assert(length >= 0, "illegal length");
- assert(StressRewriter || _data == NULL, "must be new object");
- _length = length;
- _data = resource_allocate_bytes(esize * length);
- DEBUG_ONLY(init_nesting();)
- }
-
-#ifdef ASSERT
- void init_nesting();
-#endif
-
- // helper functions
- void sort (size_t esize, ftype f); // sort the array
- void expand (size_t esize, int i, int& size);// expand the array to include slot i
- void remove_at(size_t esize, int i); // remove the element in slot i
-
- public:
- // standard operations
- int length() const { return _length; }
- bool is_empty() const { return length() == 0; }
-};
-
-
-template <MEMFLAGS F>class CHeapArray: public CHeapObj<F> {
- protected:
- int _length; // the number of array elements
- void* _data; // the array memory
-
- // creation
- CHeapArray() {
- _length = 0;
- _data = NULL;
- }
-
-
- CHeapArray(size_t esize, int length) {
- assert(length >= 0, "illegal length");
- _length = length;
- _data = (void*) NEW_C_HEAP_ARRAY(char *, esize * length, F);
- }
-
- void initialize(size_t esize, int length) {
- // In debug set array to 0?
- }
-
-#ifdef ASSERT
- void init_nesting();
-#endif
-
- // helper functions
- void sort (size_t esize, ftype f); // sort the array
- void expand (size_t esize, int i, int& size);// expand the array to include slot i
- void remove_at(size_t esize, int i); // remove the element in slot i
-
- public:
- // standard operations
- int length() const { return _length; }
- bool is_empty() const { return length() == 0; }
-};
-
-#define define_generic_array(array_name,element_type, base_class) \
- class array_name: public base_class { \
- protected: \
- typedef element_type etype; \
- enum { esize = sizeof(etype) }; \
- \
- void base_remove_at(size_t size, int i) { base_class::remove_at(size, i); } \
- \
- public: \
- /* creation */ \
- array_name() : base_class() {} \
- explicit array_name(const int length) : base_class(esize, length) {} \
- array_name(const int length, const etype fx) { initialize(length, fx); } \
- void initialize(const int length) { base_class::initialize(esize, length); } \
- void initialize(const int length, const etype fx) { \
- initialize(length); \
- for (int i = 0; i < length; i++) ((etype*)_data)[i] = fx; \
- } \
- \
- /* standard operations */ \
- etype& operator [] (const int i) const { \
- assert(0 <= i && i < length(), "index out of bounds"); \
- return ((etype*)_data)[i]; \
- } \
- \
- int index_of(const etype x) const { \
- int i = length(); \
- while (i-- > 0 && ((etype*)_data)[i] != x) ; \
- /* i < 0 || ((etype*)_data)_data[i] == x */ \
- return i; \
- } \
- \
- void sort(int f(etype*, etype*)) { base_class::sort(esize, (ftype)f); } \
- bool contains(const etype x) const { return index_of(x) >= 0; } \
- \
- /* deprecated operations - for compatibility with GrowableArray only */ \
- etype at(const int i) const { return (*this)[i]; } \
- void at_put(const int i, const etype x) { (*this)[i] = x; } \
- etype* adr_at(const int i) { return &(*this)[i]; } \
- int find(const etype x) { return index_of(x); } \
- }; \
-
-
-#define define_array(array_name,element_type) \
- define_generic_array(array_name, element_type, ResourceArray)
-
-
-#define define_stack(stack_name,array_name) \
- class stack_name: public array_name { \
- protected: \
- int _size; \
- \
- void grow(const int i, const etype fx) { \
- assert(i >= length(), "index too small"); \
- if (i >= size()) expand(esize, i, _size); \
- for (int j = length(); j <= i; j++) ((etype*)_data)[j] = fx; \
- _length = i+1; \
- } \
- \
- public: \
- /* creation */ \
- stack_name() : array_name() { _size = 0; } \
- stack_name(const int size) { initialize(size); } \
- stack_name(const int size, const etype fx) { initialize(size, fx); } \
- void initialize(const int size, const etype fx) { \
- _size = size; \
- array_name::initialize(size, fx); \
- /* _length == size, allocation and size are the same */ \
- } \
- void initialize(const int size) { \
- _size = size; \
- array_name::initialize(size); \
- _length = 0; /* reset length to zero; _size records the allocation */ \
- } \
- \
- /* standard operations */ \
- int size() const { return _size; } \
- \
- int push(const etype x) { \
- int len = length(); \
- if (len >= size()) expand(esize, len, _size); \
- ((etype*)_data)[len] = x; \
- _length = len+1; \
- return len; \
- } \
- \
- etype pop() { \
- assert(!is_empty(), "stack is empty"); \
- return ((etype*)_data)[--_length]; \
- } \
- \
- etype top() const { \
- assert(!is_empty(), "stack is empty"); \
- return ((etype*)_data)[length() - 1]; \
- } \
- \
- void push_all(const stack_name* stack) { \
- const int l = stack->length(); \
- for (int i = 0; i < l; i++) push(((etype*)(stack->_data))[i]); \
- } \
- \
- etype at_grow(const int i, const etype fx) { \
- if (i >= length()) grow(i, fx); \
- return ((etype*)_data)[i]; \
- } \
- \
- void at_put_grow(const int i, const etype x, const etype fx) { \
- if (i >= length()) grow(i, fx); \
- ((etype*)_data)[i] = x; \
- } \
- \
- void truncate(const int length) { \
- assert(0 <= length && length <= this->length(), "illegal length"); \
- _length = length; \
- } \
- \
- void remove_at(int i) { base_remove_at(esize, i); } \
- void remove(etype x) { remove_at(index_of(x)); } \
- \
- /* inserts the given element before the element at index i */ \
- void insert_before(const int i, const etype el) { \
- int len = length(); \
- int new_length = len + 1; \
- if (new_length >= size()) expand(esize, new_length, _size); \
- for (int j = len - 1; j >= i; j--) { \
- ((etype*)_data)[j + 1] = ((etype*)_data)[j]; \
- } \
- _length = new_length; \
- at_put(i, el); \
- } \
- \
- /* inserts contents of the given stack before the element at index i */ \
- void insert_before(const int i, const stack_name *st) { \
- if (st->length() == 0) return; \
- int len = length(); \
- int st_len = st->length(); \
- int new_length = len + st_len; \
- if (new_length >= size()) expand(esize, new_length, _size); \
- int j; \
- for (j = len - 1; j >= i; j--) { \
- ((etype*)_data)[j + st_len] = ((etype*)_data)[j]; \
- } \
- for (j = 0; j < st_len; j++) { \
- ((etype*)_data)[i + j] = ((etype*)st->_data)[j]; \
- } \
- _length = new_length; \
- } \
- \
- /* deprecated operations - for compatibility with GrowableArray only */ \
- int capacity() const { return size(); } \
- void clear() { truncate(0); } \
- void trunc_to(const int length) { truncate(length); } \
- int append(const etype x) { return push(x); } \
- void appendAll(const stack_name* stack) { push_all(stack); } \
- etype last() const { return top(); } \
- }; \
-
-
-#define define_resource_list(element_type) \
- define_generic_array(element_type##Array, element_type, ResourceArray) \
- define_stack(element_type##List, element_type##Array)
-
-#define define_resource_pointer_list(element_type) \
- define_generic_array(element_type##Array, element_type *, ResourceArray) \
- define_stack(element_type##List, element_type##Array)
-
-#define define_c_heap_list(element_type) \
- define_generic_array(element_type##Array, element_type, CHeapArray) \
- define_stack(element_type##List, element_type##Array)
-
-#define define_c_heap_pointer_list(element_type) \
- define_generic_array(element_type##Array, element_type *, CHeapArray) \
- define_stack(element_type##List, element_type##Array)
-
-
// Arrays for basic types
-
-define_array(boolArray, bool) define_stack(boolStack, boolArray)
-define_array(intArray , int ) define_stack(intStack , intArray )
+typedef GrowableArray<int> intArray;
+typedef GrowableArray<int> intStack;
+typedef GrowableArray<bool> boolArray;
+typedef GrowableArray<bool> boolStack;
// Array for metadata allocation
--- a/hotspot/src/share/vm/utilities/growableArray.hpp Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/src/share/vm/utilities/growableArray.hpp Tue Apr 12 14:17:42 2016 -0400
@@ -250,6 +250,10 @@
return _data[_len-1];
}
+ E last() const {
+ return top();
+ }
+
GrowableArrayIterator<E> begin() const {
return GrowableArrayIterator<E>(this, 0);
}
@@ -363,6 +367,24 @@
_data[idx] = elem;
}
+ void insert_before(const int idx, const GrowableArray<E>* array) {
+ assert(0 <= idx && idx <= _len, "illegal index");
+ check_nesting();
+ int array_len = array->length();
+ int new_len = _len + array_len;
+ if (new_len >= _max) grow(new_len);
+
+ for (int j = _len - 1; j >= idx; j--) {
+ _data[j + array_len] = _data[j];
+ }
+
+ for (int j = 0; j < array_len; j++) {
+ _data[idx + j] = array->_data[j];
+ }
+
+ _len += array_len;
+ }
+
void appendAll(const GrowableArray<E>* l) {
for (int i = 0; i < l->_len; i++) {
raw_at_put_grow(_len, l->_data[i], E());
--- a/hotspot/test/compiler/jvmci/code/CodeInstallationTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package compiler.jvmci.code;
-
-import java.lang.reflect.Method;
-
-import jdk.vm.ci.amd64.AMD64;
-import jdk.vm.ci.code.Architecture;
-import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.InstalledCode;
-import jdk.vm.ci.code.TargetDescription;
-import jdk.vm.ci.hotspot.HotSpotCompiledCode;
-import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.meta.ConstantReflectionProvider;
-import jdk.vm.ci.meta.MetaAccessProvider;
-import jdk.vm.ci.runtime.JVMCI;
-import jdk.vm.ci.runtime.JVMCIBackend;
-import jdk.vm.ci.sparc.SPARC;
-
-import org.junit.Assert;
-
-import compiler.jvmci.code.amd64.AMD64TestAssembler;
-import compiler.jvmci.code.sparc.SPARCTestAssembler;
-
-/**
- * Base class for code installation tests.
- */
-public class CodeInstallationTest {
-
- protected final MetaAccessProvider metaAccess;
- protected final CodeCacheProvider codeCache;
- protected final TargetDescription target;
- protected final ConstantReflectionProvider constantReflection;
-
- public CodeInstallationTest() {
- JVMCIBackend backend = JVMCI.getRuntime().getHostJVMCIBackend();
- metaAccess = backend.getMetaAccess();
- codeCache = backend.getCodeCache();
- target = backend.getTarget();
- constantReflection = backend.getConstantReflection();
- }
-
- protected interface TestCompiler {
-
- void compile(TestAssembler asm);
- }
-
- private TestAssembler createAssembler() {
- Architecture arch = codeCache.getTarget().arch;
- if (arch instanceof AMD64) {
- return new AMD64TestAssembler(codeCache);
- } else if (arch instanceof SPARC) {
- return new SPARCTestAssembler(codeCache);
- } else {
- Assert.fail("unsupported architecture");
- return null;
- }
- }
-
- protected Method getMethod(String name, Class<?>... args) {
- try {
- return getClass().getMethod(name, args);
- } catch (NoSuchMethodException e) {
- Assert.fail("method not found");
- return null;
- }
- }
-
- protected void test(TestCompiler compiler, Method method, Object... args) {
- HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
- TestAssembler asm = createAssembler();
-
- asm.emitPrologue();
- compiler.compile(asm);
- asm.emitEpilogue();
-
- HotSpotCompiledCode code = asm.finish(resolvedMethod);
- InstalledCode installed = codeCache.addCode(resolvedMethod, code, null, null);
-
- try {
- Object expected = method.invoke(null, args);
- Object actual = installed.executeVarargs(args);
- Assert.assertEquals(expected, actual);
- } catch (Exception e) {
- e.printStackTrace();
- Assert.fail(e.toString());
- }
- }
-}
--- a/hotspot/test/compiler/jvmci/code/DataPatchTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,189 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
- * @library /
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * jdk.vm.ci/jdk.vm.ci.meta
- * jdk.vm.ci/jdk.vm.ci.code
- * jdk.vm.ci/jdk.vm.ci.code.site
- * jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.amd64
- * jdk.vm.ci/jdk.vm.ci.sparc
- * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.DataPatchTest
- */
-
-package compiler.jvmci.code;
-
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.site.DataSectionReference;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.hotspot.HotSpotMetaAccessProvider;
-import jdk.vm.ci.hotspot.HotSpotSymbol;
-import jdk.vm.ci.hotspot.HotSpotVMConfig;
-import jdk.vm.ci.meta.ResolvedJavaType;
-
-import org.junit.Assume;
-import org.junit.Test;
-
-/**
- * Test code installation with data patches.
- */
-public class DataPatchTest extends CodeInstallationTest {
-
- public static Class<?> getConstClass() {
- return DataPatchTest.class;
- }
-
- private void test(TestCompiler compiler) {
- test(compiler, getMethod("getConstClass"));
- }
-
- @Test
- public void testInlineObject() {
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
- Register ret = asm.emitLoadPointer(c);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testInlineNarrowObject() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
- Register compressed = asm.emitLoadPointer((HotSpotConstant) c.compress());
- Register ret = asm.emitUncompressPointer(compressed, HotSpotVMConfig.config().narrowOopBase, HotSpotVMConfig.config().narrowOopShift);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testDataSectionReference() {
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
- DataSectionReference ref = asm.emitDataItem(c);
- Register ret = asm.emitLoadPointer(ref);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testNarrowDataSectionReference() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
- HotSpotConstant cCompressed = (HotSpotConstant) c.compress();
- DataSectionReference ref = asm.emitDataItem(cCompressed);
- Register compressed = asm.emitLoadNarrowPointer(ref);
- Register ret = asm.emitUncompressPointer(compressed, HotSpotVMConfig.config().narrowOopBase, HotSpotVMConfig.config().narrowOopShift);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testInlineMetadata() {
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- Register klass = asm.emitLoadPointer((HotSpotConstant) constantReflection.asObjectHub(type));
- Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testInlineNarrowMetadata() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedClassPointers);
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
- Register narrowKlass = asm.emitLoadPointer((HotSpotConstant) hub.compress());
- Register klass = asm.emitUncompressPointer(narrowKlass, HotSpotVMConfig.config().narrowKlassBase, HotSpotVMConfig.config().narrowKlassShift);
- Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testMetadataInDataSection() {
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
- DataSectionReference ref = asm.emitDataItem(hub);
- Register klass = asm.emitLoadPointer(ref);
- Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testNarrowMetadataInDataSection() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedClassPointers);
- test(asm -> {
- ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
- HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
- HotSpotConstant narrowHub = (HotSpotConstant) hub.compress();
- DataSectionReference ref = asm.emitDataItem(narrowHub);
- Register narrowKlass = asm.emitLoadNarrowPointer(ref);
- Register klass = asm.emitUncompressPointer(narrowKlass, HotSpotVMConfig.config().narrowKlassBase, HotSpotVMConfig.config().narrowKlassShift);
- Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
- asm.emitPointerRet(ret);
- });
- }
-
-
- public static long getConstSymbol(HotSpotMetaAccessProvider meta) {
- HotSpotSymbol symbol = meta.lookupSymbol("java/lang/Object");
- return symbol.getMetaspacePointer();
- }
-
- private void testSymbol(TestCompiler compiler) {
- test(compiler, getMethod("getConstSymbol", HotSpotMetaAccessProvider.class), (HotSpotMetaAccessProvider) metaAccess);
- }
-
- @Test
- public void testInlineSymbol() {
- testSymbol(asm -> {
- HotSpotSymbol symbol = ((HotSpotMetaAccessProvider) metaAccess).lookupSymbol("java/lang/Object");
- Register ret = asm.emitLoadPointer((HotSpotConstant) symbol.asConstant());
- asm.emitPointerRet(ret);
- });
- }
-
- @Test
- public void testSymbolInDataSection() {
- testSymbol(asm -> {
- HotSpotSymbol symbol = ((HotSpotMetaAccessProvider) metaAccess).lookupSymbol("java/lang/Object");
- DataSectionReference ref = asm.emitDataItem((HotSpotConstant) symbol.asConstant());
- Register ret = asm.emitLoadPointer(ref);
- asm.emitPointerRet(ret);
- });
- }
-}
--- a/hotspot/test/compiler/jvmci/code/DebugInfoTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package compiler.jvmci.code;
-
-import java.lang.reflect.Method;
-
-import jdk.vm.ci.code.BytecodeFrame;
-import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.Location;
-import jdk.vm.ci.code.VirtualObject;
-import jdk.vm.ci.hotspot.HotSpotReferenceMap;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.JavaValue;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-
-/**
- * Test code installation with debug information.
- */
-public class DebugInfoTest extends CodeInstallationTest {
-
- protected interface DebugInfoCompiler {
-
- VirtualObject[] compile(TestAssembler asm, JavaValue[] frameValues);
- }
-
- protected void test(DebugInfoCompiler compiler, Method method, int bci, JavaKind... slotKinds) {
- ResolvedJavaMethod resolvedMethod = metaAccess.lookupJavaMethod(method);
-
- int numLocals = resolvedMethod.getMaxLocals();
- int numStack = slotKinds.length - numLocals;
- JavaValue[] values = new JavaValue[slotKinds.length];
- test(asm -> {
- VirtualObject[] vobjs = compiler.compile(asm, values);
-
- BytecodeFrame frame = new BytecodeFrame(null, resolvedMethod, bci, false, false, values, slotKinds, numLocals, numStack, 0);
- DebugInfo info = new DebugInfo(frame, vobjs);
- info.setReferenceMap(new HotSpotReferenceMap(new Location[0], new Location[0], new int[0], 8));
-
- asm.emitTrap(info);
- }, method);
- }
-}
--- a/hotspot/test/compiler/jvmci/code/InterpreterFrameSizeTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * jdk.vm.ci/jdk.vm.ci.code
- * jdk.vm.ci/jdk.vm.ci.code.site
- * jdk.vm.ci/jdk.vm.ci.meta
- * jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.common
- * jdk.vm.ci/jdk.vm.ci.amd64
- * jdk.vm.ci/jdk.vm.ci.sparc
- * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
- * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.InterpreterFrameSizeTest
- */
-
-package compiler.jvmci.code;
-
-import java.lang.reflect.Method;
-
-import jdk.vm.ci.code.BytecodeFrame;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.JavaValue;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-
-import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class InterpreterFrameSizeTest extends CodeInstallationTest {
-
- HotSpotCodeCacheProvider hotspotCodeCache() {
- return (HotSpotCodeCacheProvider) codeCache;
- }
-
- @Test
- public void testNull() {
- try {
- hotspotCodeCache().interpreterFrameSize(null);
- } catch (NullPointerException npe) {
- System.out.println("threw NPE as expected");
- return;
- }
- Assert.fail("expected NullPointerException");
- }
-
- @Test
- public void test() {
- ResolvedJavaMethod resolvedMethod = metaAccess.lookupJavaMethod(getMethod("testNull"));
-
- int bci = 0;
- int numLocals = resolvedMethod.getMaxLocals();
- int numStack = 0;
- JavaValue[] values = new JavaValue[numLocals];
- JavaKind[] slotKinds = new JavaKind[numLocals];
- BytecodeFrame frame = new BytecodeFrame(null, resolvedMethod, bci, false, false, values, slotKinds, numLocals, numStack, 0);
- int size = hotspotCodeCache().interpreterFrameSize(frame);
- System.out.println("Frame size is " + size + " bytes");
- if (size <= 0) {
- Assert.fail("expected non-zero result");
- }
- }
-}
--- a/hotspot/test/compiler/jvmci/code/SimpleCodeInstallationTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
- * @library /
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * jdk.vm.ci/jdk.vm.ci.meta
- * jdk.vm.ci/jdk.vm.ci.code
- * jdk.vm.ci/jdk.vm.ci.code.site
- * jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.amd64
- * jdk.vm.ci/jdk.vm.ci.sparc
- * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.SimpleCodeInstallationTest
- */
-
-package compiler.jvmci.code;
-
-import jdk.vm.ci.code.Register;
-
-import org.junit.Test;
-
-/**
- * Test simple code installation.
- */
-public class SimpleCodeInstallationTest extends CodeInstallationTest {
-
- public static int add(int a, int b) {
- return a + b;
- }
-
- private static void compileAdd(TestAssembler asm) {
- Register arg0 = asm.emitIntArg0();
- Register arg1 = asm.emitIntArg1();
- Register ret = asm.emitIntAdd(arg0, arg1);
- asm.emitIntRet(ret);
- }
-
- @Test
- public void test() {
- test(SimpleCodeInstallationTest::compileAdd, getMethod("add", int.class, int.class), 5, 7);
- }
-}
--- a/hotspot/test/compiler/jvmci/code/SimpleDebugInfoTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
- * @library /
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * jdk.vm.ci/jdk.vm.ci.meta
- * jdk.vm.ci/jdk.vm.ci.code
- * jdk.vm.ci/jdk.vm.ci.code.site
- * jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.amd64
- * jdk.vm.ci/jdk.vm.ci.sparc
- * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.SimpleDebugInfoTest
- */
-
-package compiler.jvmci.code;
-
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.hotspot.HotSpotVMConfig;
-import jdk.vm.ci.meta.JavaConstant;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.ResolvedJavaType;
-import jdk.vm.ci.meta.Value;
-
-import org.junit.Assume;
-import org.junit.Test;
-
-public class SimpleDebugInfoTest extends DebugInfoTest {
-
- public static int intOnStack() {
- return 42;
- }
-
- private void testIntOnStack(DebugInfoCompiler compiler) {
- test(compiler, getMethod("intOnStack"), 2, JavaKind.Int);
- }
-
- public static int intInLocal() {
- int local = 42;
- return local;
- }
-
- public void testIntInLocal(DebugInfoCompiler compiler) {
- test(compiler, getMethod("intInLocal"), 3, JavaKind.Int);
- }
-
- @Test
- public void testConstInt() {
- DebugInfoCompiler compiler = (asm, values) -> {
- values[0] = JavaConstant.forInt(42);
- return null;
- };
- testIntOnStack(compiler);
- testIntInLocal(compiler);
- }
-
- @Test
- public void testRegInt() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadInt(42);
- values[0] = reg.asValue(target.getLIRKind(JavaKind.Int));
- return null;
- };
- testIntOnStack(compiler);
- testIntInLocal(compiler);
- }
-
- @Test
- public void testStackInt() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadInt(42);
- values[0] = asm.emitIntToStack(reg);
- return null;
- };
- testIntOnStack(compiler);
- testIntInLocal(compiler);
- }
-
-
- public static float floatOnStack() {
- return 42.0f;
- }
-
- private void testFloatOnStack(DebugInfoCompiler compiler) {
- test(compiler, getMethod("floatOnStack"), 2, JavaKind.Float);
- }
-
- public static float floatInLocal() {
- float local = 42.0f;
- return local;
- }
-
- private void testFloatInLocal(DebugInfoCompiler compiler) {
- test(compiler, getMethod("floatInLocal"), 3, JavaKind.Float);
- }
-
- @Test
- public void testConstFloat() {
- DebugInfoCompiler compiler = (asm, values) -> {
- values[0] = JavaConstant.forFloat(42.0f);
- return null;
- };
- testFloatOnStack(compiler);
- testFloatInLocal(compiler);
- }
-
- @Test
- public void testRegFloat() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadFloat(42.0f);
- values[0] = reg.asValue(target.getLIRKind(JavaKind.Float));
- return null;
- };
- testFloatOnStack(compiler);
- testFloatInLocal(compiler);
- }
-
- @Test
- public void testStackFloat() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadFloat(42.0f);
- values[0] = asm.emitFloatToStack(reg);
- return null;
- };
- testFloatOnStack(compiler);
- testFloatInLocal(compiler);
- }
-
-
- public static long longOnStack() {
- return 42;
- }
-
- private void testLongOnStack(DebugInfoCompiler compiler) {
- test(compiler, getMethod("longOnStack"), 3, JavaKind.Long, JavaKind.Illegal);
- }
-
- public static long longInLocal() {
- long local = 42;
- return local;
- }
-
- private void testLongInLocal(DebugInfoCompiler compiler) {
- test(compiler, getMethod("longInLocal"), 4, JavaKind.Long, JavaKind.Illegal);
- }
-
- @Test
- public void testConstLong() {
- DebugInfoCompiler compiler = (asm, values) -> {
- values[0] = JavaConstant.forLong(42);
- values[1] = Value.ILLEGAL;
- return null;
- };
- testLongOnStack(compiler);
- testLongInLocal(compiler);
- }
-
- @Test
- public void testRegLong() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadLong(42);
- values[0] = reg.asValue(target.getLIRKind(JavaKind.Long));
- values[1] = Value.ILLEGAL;
- return null;
- };
- testLongOnStack(compiler);
- testLongInLocal(compiler);
- }
-
- @Test
- public void testStackLong() {
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadLong(42);
- values[0] = asm.emitLongToStack(reg);
- values[1] = Value.ILLEGAL;
- return null;
- };
- testLongOnStack(compiler);
- testLongInLocal(compiler);
- }
-
-
- public static Class<?> objectOnStack() {
- return SimpleDebugInfoTest.class;
- }
-
- private void testObjectOnStack(DebugInfoCompiler compiler) {
- test(compiler, getMethod("objectOnStack"), 2, JavaKind.Object);
- }
-
- public static Class<?> objectInLocal() {
- Class<?> local = SimpleDebugInfoTest.class;
- return local;
- }
-
- private void testObjectInLocal(DebugInfoCompiler compiler) {
- test(compiler, getMethod("objectInLocal"), 3, JavaKind.Object);
- }
-
- @Test
- public void testConstObject() {
- ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
- DebugInfoCompiler compiler = (asm, values) -> {
- values[0] = constantReflection.asJavaClass(type);
- return null;
- };
- testObjectOnStack(compiler);
- testObjectInLocal(compiler);
- }
-
- @Test
- public void testRegObject() {
- ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type));
- values[0] = reg.asValue(target.getLIRKind(JavaKind.Object));
- return null;
- };
- testObjectOnStack(compiler);
- testObjectInLocal(compiler);
- }
-
- @Test
- public void testStackObject() {
- ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
- DebugInfoCompiler compiler = (asm, values) -> {
- Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type));
- values[0] = asm.emitPointerToStack(reg);
- return null;
- };
- testObjectOnStack(compiler);
- testObjectInLocal(compiler);
- }
-
- @Test
- public void testRegNarrowObject() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
- ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
- DebugInfoCompiler compiler = (asm, values) -> {
- HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type);
- Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress());
- values[0] = reg.asValue(asm.narrowOopKind);
- return null;
- };
- testObjectOnStack(compiler);
- testObjectInLocal(compiler);
- }
-
- @Test
- public void testStackNarrowObject() {
- Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
- ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
- DebugInfoCompiler compiler = (asm, values) -> {
- HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type);
- Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress());
- values[0] = asm.emitNarrowPointerToStack(reg);
- return null;
- };
- testObjectOnStack(compiler);
- testObjectInLocal(compiler);
- }
-}
--- a/hotspot/test/compiler/jvmci/code/TestAssembler.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,333 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.jvmci.code;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.StackSlot;
-import jdk.vm.ci.code.site.Call;
-import jdk.vm.ci.code.site.ConstantReference;
-import jdk.vm.ci.code.site.DataPatch;
-import jdk.vm.ci.code.site.DataSectionReference;
-import jdk.vm.ci.code.site.Infopoint;
-import jdk.vm.ci.code.site.InfopointReason;
-import jdk.vm.ci.code.site.Mark;
-import jdk.vm.ci.code.site.Reference;
-import jdk.vm.ci.code.site.Site;
-import jdk.vm.ci.hotspot.HotSpotCompiledCode;
-import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
-import jdk.vm.ci.hotspot.HotSpotCompiledNmethod;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.meta.Assumptions.Assumption;
-import jdk.vm.ci.meta.InvokeTarget;
-import jdk.vm.ci.meta.LIRKind;
-import jdk.vm.ci.meta.PlatformKind;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.VMConstant;
-
-/**
- * Simple assembler used by the code installation tests.
- */
-public abstract class TestAssembler {
-
- /**
- * Emit the method prologue code (e.g. building the new stack frame).
- */
- public abstract void emitPrologue();
-
- /**
- * Emit the method epilogue code (e.g. the deopt handler).
- */
- public abstract void emitEpilogue();
-
- /**
- * Emit code to grow the stack frame.
- *
- * @param size the size in bytes that the stack should grow
- */
- public abstract void emitGrowStack(int size);
-
- /**
- * Get the register containing the first 32-bit integer argument.
- */
- public abstract Register emitIntArg0();
-
- /**
- * Get the register containing the second 32-bit integer argument.
- */
- public abstract Register emitIntArg1();
-
- /**
- * Emit code to add two 32-bit integer registers. May reuse one of the argument registers.
- */
- public abstract Register emitIntAdd(Register a, Register b);
-
- /**
- * Emit code to load a constant 32-bit integer to a register.
- */
- public abstract Register emitLoadInt(int value);
-
- /**
- * Emit code to load a constant 64-bit integer to a register.
- */
- public abstract Register emitLoadLong(long value);
-
- /**
- * Emit code to load a constant single-precision float to a register.
- */
- public abstract Register emitLoadFloat(float value);
-
- /**
- * Emit code to load a constant oop or metaspace pointer to a register. The pointer may be wide
- * or narrow, depending on {@link HotSpotConstant#isCompressed() c.isCompressed()}.
- */
- public abstract Register emitLoadPointer(HotSpotConstant c);
-
- /**
- * Emit code to load a wide pointer from the {@link HotSpotCompiledCode#dataSection} to a
- * register.
- */
- public abstract Register emitLoadPointer(DataSectionReference ref);
-
- /**
- * Emit code to load a narrow pointer from the {@link HotSpotCompiledCode#dataSection} to a
- * register.
- */
- public abstract Register emitLoadNarrowPointer(DataSectionReference ref);
-
- /**
- * Emit code to load a (wide) pointer from a memory location to a register.
- */
- public abstract Register emitLoadPointer(Register base, int offset);
-
- /**
- * Emit code to store a 32-bit integer from a register to a new stack slot.
- */
- public abstract StackSlot emitIntToStack(Register a);
-
- /**
- * Emit code to store a 64-bit integer from a register to a new stack slot.
- */
- public abstract StackSlot emitLongToStack(Register a);
-
- /**
- * Emit code to store a single-precision float from a register to a new stack slot.
- */
- public abstract StackSlot emitFloatToStack(Register a);
-
- /**
- * Emit code to store a wide pointer from a register to a new stack slot.
- */
- public abstract StackSlot emitPointerToStack(Register a);
-
- /**
- * Emit code to store a narrow pointer from a register to a new stack slot.
- */
- public abstract StackSlot emitNarrowPointerToStack(Register a);
-
- /**
- * Emit code to uncompress a narrow pointer. The input pointer is guaranteed to be non-null.
- */
- public abstract Register emitUncompressPointer(Register compressed, long base, int shift);
-
- /**
- * Emit code to return from a function, returning a 32-bit integer.
- */
- public abstract void emitIntRet(Register a);
-
- /**
- * Emit code to return from a function, returning a wide oop pointer.
- */
- public abstract void emitPointerRet(Register a);
-
- /**
- * Emit code that traps, forcing a deoptimization.
- */
- public abstract void emitTrap(DebugInfo info);
-
- public final LIRKind narrowOopKind;
-
- protected final Buffer code;
- protected final Buffer data;
- private final ArrayList<Site> sites;
- private final ArrayList<DataPatch> dataPatches;
-
- protected final CodeCacheProvider codeCache;
-
- private final Register[] registers;
- private int nextRegister;
-
- protected int frameSize;
- private int stackAlignment;
- private int curStackSlot;
-
- private StackSlot deoptRescue;
-
- protected TestAssembler(CodeCacheProvider codeCache, int initialFrameSize, int stackAlignment, PlatformKind narrowOopKind, Register... registers) {
- this.narrowOopKind = LIRKind.reference(narrowOopKind);
-
- this.code = new Buffer();
- this.data = new Buffer();
- this.sites = new ArrayList<>();
- this.dataPatches = new ArrayList<>();
-
- this.codeCache = codeCache;
-
- this.registers = registers;
- this.nextRegister = 0;
-
- this.frameSize = initialFrameSize;
- this.stackAlignment = stackAlignment;
- this.curStackSlot = initialFrameSize;
- }
-
- protected Register newRegister() {
- return registers[nextRegister++];
- }
-
- protected StackSlot newStackSlot(LIRKind kind) {
- curStackSlot += kind.getPlatformKind().getSizeInBytes();
- if (curStackSlot > frameSize) {
- int newFrameSize = curStackSlot;
- if (newFrameSize % stackAlignment != 0) {
- newFrameSize += stackAlignment - (newFrameSize % stackAlignment);
- }
- emitGrowStack(newFrameSize - frameSize);
- frameSize = newFrameSize;
- }
- return StackSlot.get(kind, -curStackSlot, true);
- }
-
- protected void setDeoptRescueSlot(StackSlot deoptRescue) {
- this.deoptRescue = deoptRescue;
- }
-
- protected void recordCall(InvokeTarget target, int size, boolean direct, DebugInfo debugInfo) {
- sites.add(new Call(target, code.position(), size, direct, debugInfo));
- }
-
- protected void recordMark(Object id) {
- sites.add(new Mark(code.position(), id));
- }
-
- protected void recordImplicitException(DebugInfo info) {
- sites.add(new Infopoint(code.position(), info, InfopointReason.IMPLICIT_EXCEPTION));
- }
-
- protected void recordDataPatchInCode(Reference ref) {
- sites.add(new DataPatch(code.position(), ref));
- }
-
- protected void recordDataPatchInData(Reference ref) {
- dataPatches.add(new DataPatch(data.position(), ref));
- }
-
- public DataSectionReference emitDataItem(HotSpotConstant c) {
- DataSectionReference ref = new DataSectionReference();
- ref.setOffset(data.position());
-
- recordDataPatchInData(new ConstantReference((VMConstant) c));
- if (c.isCompressed()) {
- data.emitInt(0xDEADDEAD);
- } else {
- data.emitLong(0xDEADDEADDEADDEADL);
- }
-
- return ref;
- }
-
- public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
- int id = method.allocateCompileId(0);
- byte[] finishedCode = code.finish();
- Site[] finishedSites = sites.toArray(new Site[0]);
- byte[] finishedData = data.finish();
- DataPatch[] finishedDataPatches = dataPatches.toArray(new DataPatch[0]);
- return new HotSpotCompiledNmethod(method.getName(), finishedCode, finishedCode.length, finishedSites, new Assumption[0], new ResolvedJavaMethod[]{method}, new Comment[0], finishedData, 16,
- finishedDataPatches, false, frameSize, deoptRescue, method, 0, id, 0L, false);
- }
-
- protected static class Buffer {
-
- private ByteBuffer data = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder());
-
- private void ensureSize(int length) {
- if (length >= data.limit()) {
- byte[] newBuf = Arrays.copyOf(data.array(), length * 4);
- ByteBuffer newData = ByteBuffer.wrap(newBuf);
- newData.order(data.order());
- newData.position(data.position());
- data = newData;
- }
- }
-
- public int position() {
- return data.position();
- }
-
- public void emitByte(int b) {
- ensureSize(data.position() + 1);
- data.put((byte) (b & 0xFF));
- }
-
- public void emitShort(int b) {
- ensureSize(data.position() + 2);
- data.putShort((short) b);
- }
-
- public void emitInt(int b) {
- ensureSize(data.position() + 4);
- data.putInt(b);
- }
-
- public void emitLong(long b) {
- ensureSize(data.position() + 8);
- data.putLong(b);
- }
-
- public void emitFloat(float f) {
- ensureSize(data.position() + 4);
- data.putFloat(f);
- }
-
- public void align(int alignment) {
- int pos = data.position();
- int misaligned = pos % alignment;
- if (misaligned != 0) {
- pos += alignment - misaligned;
- data.position(pos);
- }
- }
-
- private byte[] finish() {
- return Arrays.copyOf(data.array(), data.position());
- }
- }
-}
--- a/hotspot/test/compiler/jvmci/code/VirtualObjectDebugInfoTest.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
- * @library /
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * jdk.vm.ci/jdk.vm.ci.meta
- * jdk.vm.ci/jdk.vm.ci.code
- * jdk.vm.ci/jdk.vm.ci.code.site
- * jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.amd64
- * jdk.vm.ci/jdk.vm.ci.sparc
- * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.VirtualObjectDebugInfoTest
- */
-
-package compiler.jvmci.code;
-
-import java.util.ArrayList;
-import java.util.Objects;
-
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.VirtualObject;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.meta.JavaConstant;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.JavaValue;
-import jdk.vm.ci.meta.ResolvedJavaField;
-import jdk.vm.ci.meta.ResolvedJavaType;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class VirtualObjectDebugInfoTest extends DebugInfoTest {
-
- private static class TestClass {
-
- private long longField;
- private int intField;
- private float floatField;
- private Object[] arrayField;
-
- public TestClass() {
- this.longField = 8472;
- this.intField = 42;
- this.floatField = 3.14f;
- this.arrayField = new Object[] { Integer.valueOf(58), this, null, Integer.valueOf(17), "Hello, World!" };
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof TestClass)) {
- return false;
- }
-
- TestClass other = (TestClass) o;
- if (this.longField != other.longField
- || this.intField != other.intField
- || this.floatField != other.floatField
- || this.arrayField.length != other.arrayField.length) {
- return false;
- }
-
- for (int i = 0; i < this.arrayField.length; i++) {
- // break cycle
- if (this.arrayField[i] == this && other.arrayField[i] == other) {
- continue;
- }
-
- if (!Objects.equals(this.arrayField[i], other.arrayField[i])) {
- return false;
- }
- }
-
- return true;
- }
- }
-
- public static TestClass buildObject() {
- return new TestClass();
- }
-
- private VirtualObject[] compileBuildObject(TestAssembler asm, JavaValue[] values) {
- TestClass template = new TestClass();
- ArrayList<VirtualObject> vobjs = new ArrayList<>();
-
- ResolvedJavaType retType = metaAccess.lookupJavaType(TestClass.class);
- VirtualObject ret = VirtualObject.get(retType, vobjs.size());
- vobjs.add(ret);
- values[0] = ret;
-
- ResolvedJavaType arrayType = metaAccess.lookupJavaType(Object[].class);
- VirtualObject array = VirtualObject.get(arrayType, vobjs.size());
- vobjs.add(array);
-
- // build array for ret.arrayField
- ResolvedJavaType integerType = metaAccess.lookupJavaType(Integer.class);
- JavaValue[] arrayContent = new JavaValue[template.arrayField.length];
- JavaKind[] arrayKind = new JavaKind[template.arrayField.length];
- for (int i = 0; i < arrayContent.length; i++) {
- arrayKind[i] = JavaKind.Object;
- if (template.arrayField[i] == null) {
- arrayContent[i] = JavaConstant.NULL_POINTER;
- } else if (template.arrayField[i] == template) {
- arrayContent[i] = ret;
- } else if (template.arrayField[i] instanceof Integer) {
- int value = (Integer) template.arrayField[i];
- VirtualObject boxed = VirtualObject.get(integerType, vobjs.size());
- vobjs.add(boxed);
- arrayContent[i] = boxed;
- boxed.setValues(new JavaValue[]{JavaConstant.forInt(value)}, new JavaKind[]{JavaKind.Int});
- } else if (template.arrayField[i] instanceof String) {
- String value = (String) template.arrayField[i];
- Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.forString(value));
- arrayContent[i] = reg.asValue(target.getLIRKind(JavaKind.Object));
- } else {
- Assert.fail("unexpected value");
- }
- }
- array.setValues(arrayContent, arrayKind);
-
- // build return object
- ResolvedJavaField[] fields = retType.getInstanceFields(true);
- JavaValue[] retContent = new JavaValue[fields.length];
- JavaKind[] retKind = new JavaKind[fields.length];
- for (int i = 0; i < fields.length; i++) {
- retKind[i] = fields[i].getJavaKind();
- switch (retKind[i]) {
- case Long: // template.longField
- retContent[i] = JavaConstant.forLong(template.longField);
- break;
- case Int: // template.intField
- Register intReg = asm.emitLoadInt(template.intField);
- retContent[i] = asm.emitIntToStack(intReg);
- break;
- case Float: // template.floatField
- Register fReg = asm.emitLoadFloat(template.floatField);
- retContent[i] = fReg.asValue(target.getLIRKind(JavaKind.Float));
- break;
- case Object: // template.arrayField
- retContent[i] = array;
- break;
- default:
- Assert.fail("unexpected field");
- }
- }
- ret.setValues(retContent, retKind);
-
- return vobjs.toArray(new VirtualObject[0]);
- }
-
- @Test
- public void testBuildObject() {
- test(this::compileBuildObject, getMethod("buildObject"), 7, JavaKind.Object);
- }
-}
--- a/hotspot/test/compiler/jvmci/code/amd64/AMD64TestAssembler.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,287 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.jvmci.code.amd64;
-
-import jdk.vm.ci.amd64.AMD64;
-import jdk.vm.ci.amd64.AMD64Kind;
-import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.StackSlot;
-import jdk.vm.ci.code.site.ConstantReference;
-import jdk.vm.ci.code.site.DataSectionReference;
-import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.hotspot.HotSpotForeignCallTarget;
-import jdk.vm.ci.hotspot.HotSpotVMConfig;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.LIRKind;
-import jdk.vm.ci.meta.VMConstant;
-
-import compiler.jvmci.code.TestAssembler;
-
-public class AMD64TestAssembler extends TestAssembler {
-
- public AMD64TestAssembler(CodeCacheProvider codeCache) {
- super(codeCache, 16, 16, AMD64Kind.DWORD, AMD64.rax, AMD64.rcx, AMD64.rdi, AMD64.r8, AMD64.r9, AMD64.r10);
- }
-
- private void emitFatNop() {
- // 5 byte NOP:
- // NOP DWORD ptr [EAX + EAX*1 + 00H]
- code.emitByte(0x0F);
- code.emitByte(0x1F);
- code.emitByte(0x44);
- code.emitByte(0x00);
- code.emitByte(0x00);
- }
-
- @Override
- public void emitPrologue() {
- // WARNING: Initial instruction MUST be 5 bytes or longer so that
- // NativeJump::patch_verified_entry will be able to patch out the entry
- // code safely.
- emitFatNop();
- code.emitByte(0x50 | AMD64.rbp.encoding); // PUSH rbp
- emitMove(true, AMD64.rbp, AMD64.rsp); // MOV rbp, rsp
- setDeoptRescueSlot(newStackSlot(LIRKind.value(AMD64Kind.QWORD)));
- }
-
- @Override
- public void emitEpilogue() {
- HotSpotVMConfig config = HotSpotVMConfig.config();
- recordMark(config.MARKID_DEOPT_HANDLER_ENTRY);
- recordCall(new HotSpotForeignCallTarget(config.handleDeoptStub), 5, true, null);
- code.emitByte(0xE8); // CALL rel32
- code.emitInt(0xDEADDEAD);
- }
-
- @Override
- public void emitGrowStack(int size) {
- // SUB rsp, size
- code.emitByte(0x48);
- code.emitByte(0x81);
- code.emitByte(0xEC);
- code.emitInt(size);
- }
-
- @Override
- public Register emitIntArg0() {
- return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, JavaKind.Int)[0];
- }
-
- @Override
- public Register emitIntArg1() {
- return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, JavaKind.Int)[1];
- }
-
- private void emitREX(boolean w, int r, int x, int b) {
- int wrxb = (w ? 0x08 : 0) | ((r >> 3) << 2) | ((x >> 3) << 1) | (b >> 3);
- if (wrxb != 0) {
- code.emitByte(0x40 | wrxb);
- }
- }
-
- private void emitModRMReg(boolean w, int opcode, int r, int m) {
- emitREX(w, r, 0, m);
- code.emitByte((byte) opcode);
- code.emitByte((byte) 0xC0 | ((r & 0x7) << 3) | (m & 0x7));
- }
-
- private void emitModRMMemory(boolean w, int opcode, int r, int b, int offset) {
- emitREX(w, r, 0, b);
- code.emitByte((byte) opcode);
- code.emitByte((byte) 0x80 | ((r & 0x7) << 3) | (b & 0x7));
- code.emitInt(offset);
- }
-
- @Override
- public Register emitLoadInt(int c) {
- Register ret = newRegister();
- emitREX(false, 0, 0, ret.encoding);
- code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
- code.emitInt(c);
- return ret;
- }
-
- @Override
- public Register emitLoadLong(long c) {
- Register ret = newRegister();
- emitREX(true, 0, 0, ret.encoding);
- code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r64, imm64
- code.emitLong(c);
- return ret;
- }
-
- @Override
- public Register emitLoadFloat(float c) {
- DataSectionReference ref = new DataSectionReference();
- ref.setOffset(data.position());
- data.emitFloat(c);
-
- recordDataPatchInCode(ref);
- Register ret = AMD64.xmm0;
- emitREX(false, ret.encoding, 0, 0);
- code.emitByte(0xF3);
- code.emitByte(0x0F);
- code.emitByte(0x10); // MOVSS xmm1, xmm2/m32
- code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // xmm, [rip+offset]
- code.emitInt(0xDEADDEAD);
- return ret;
- }
-
- @Override
- public Register emitLoadPointer(HotSpotConstant c) {
- recordDataPatchInCode(new ConstantReference((VMConstant) c));
- if (c.isCompressed()) {
- Register ret = newRegister();
- emitREX(false, 0, 0, ret.encoding);
- code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
- code.emitInt(0xDEADDEAD);
- return ret;
- } else {
- return emitLoadLong(0xDEADDEADDEADDEADl);
- }
- }
-
- private Register emitLoadPointer(DataSectionReference ref, boolean narrow) {
- recordDataPatchInCode(ref);
- Register ret = newRegister();
- emitREX(!narrow, ret.encoding, 0, 0);
- code.emitByte(0x8B); // MOV r64,r/m64
- code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // r64, [rip+offset]
- code.emitInt(0xDEADDEAD);
- return ret;
- }
-
- @Override
- public Register emitLoadPointer(DataSectionReference ref) {
- return emitLoadPointer(ref, false);
- }
-
- @Override
- public Register emitLoadNarrowPointer(DataSectionReference ref) {
- return emitLoadPointer(ref, true);
- }
-
- @Override
- public Register emitLoadPointer(Register b, int offset) {
- Register ret = newRegister();
- emitModRMMemory(true, 0x8B, ret.encoding, b.encoding, offset); // MOV r64,r/m64
- return ret;
- }
-
- @Override
- public StackSlot emitIntToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.DWORD));
- emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
- return ret;
- }
-
- @Override
- public StackSlot emitLongToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.QWORD));
- emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
- return ret;
- }
-
- @Override
- public StackSlot emitFloatToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.SINGLE));
- emitREX(false, a.encoding, 0, 0);
- code.emitByte(0xF3);
- code.emitByte(0x0F);
- code.emitByte(0x11); // MOVSS xmm2/m32, xmm1
- code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
- code.emitInt(ret.getRawOffset() + 16);
- return ret;
- }
-
- @Override
- public StackSlot emitPointerToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.QWORD));
- emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
- return ret;
- }
-
- @Override
- public StackSlot emitNarrowPointerToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.DWORD));
- emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
- return ret;
- }
-
- @Override
- public Register emitUncompressPointer(Register compressed, long base, int shift) {
- if (shift > 0) {
- emitModRMReg(true, 0xC1, 4, compressed.encoding);
- code.emitByte(shift);
- }
- if (base == 0) {
- return compressed;
- } else {
- Register tmp = emitLoadLong(base);
- emitModRMReg(true, 0x03, tmp.encoding, compressed.encoding);
- return tmp;
- }
- }
-
- @Override
- public Register emitIntAdd(Register a, Register b) {
- emitModRMReg(false, 0x03, a.encoding, b.encoding);
- return a;
- }
-
- private void emitMove(boolean w, Register to, Register from) {
- if (to != from) {
- emitModRMReg(w, 0x8B, to.encoding, from.encoding);
- }
- }
-
- @Override
- public void emitIntRet(Register a) {
- emitMove(false, AMD64.rax, a); // MOV eax, ...
- emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
- code.emitByte(0x58 | AMD64.rbp.encoding); // POP rbp
- code.emitByte(0xC3); // RET
- }
-
- @Override
- public void emitPointerRet(Register a) {
- emitMove(true, AMD64.rax, a); // MOV rax, ...
- emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
- code.emitByte(0x58 | AMD64.rbp.encoding); // POP rbp
- code.emitByte(0xC3); // RET
- }
-
- @Override
- public void emitTrap(DebugInfo info) {
- recordImplicitException(info);
- // MOV rax, [0]
- code.emitByte(0x8B);
- code.emitByte(0x04);
- code.emitByte(0x25);
- code.emitInt(0);
- }
-}
--- a/hotspot/test/compiler/jvmci/code/sparc/SPARCTestAssembler.java Mon Apr 11 20:38:38 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,288 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.jvmci.code.sparc;
-
-import jdk.vm.ci.code.CodeCacheProvider;
-import jdk.vm.ci.code.DebugInfo;
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.StackSlot;
-import jdk.vm.ci.code.site.ConstantReference;
-import jdk.vm.ci.code.site.DataSectionReference;
-import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
-import jdk.vm.ci.hotspot.HotSpotCompiledCode;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.hotspot.HotSpotForeignCallTarget;
-import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.hotspot.HotSpotVMConfig;
-import jdk.vm.ci.meta.JavaKind;
-import jdk.vm.ci.meta.LIRKind;
-import jdk.vm.ci.meta.VMConstant;
-import jdk.vm.ci.sparc.SPARC;
-import jdk.vm.ci.sparc.SPARCKind;
-
-import compiler.jvmci.code.TestAssembler;
-
-public class SPARCTestAssembler extends TestAssembler {
-
- private static final int MASK13 = (1 << 13) - 1;
-
- public SPARCTestAssembler(CodeCacheProvider codeCache) {
- super(codeCache, 0, 16, SPARCKind.WORD, SPARC.l0, SPARC.l1, SPARC.l2, SPARC.l3, SPARC.l4, SPARC.l5, SPARC.l6, SPARC.l7);
- }
-
- private void emitOp2(Register rd, int op2, int imm22) {
- code.emitInt((0b00 << 30) | (rd.encoding << 25) | (op2 << 22) | imm22);
- }
-
- private void emitOp3(int op, Register rd, int op3, Register rs1, Register rs2) {
- code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | rs2.encoding);
- }
-
- private void emitOp3(int op, Register rd, int op3, Register rs1, int simm13) {
- code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | (1 << 13) | (simm13 & MASK13));
- }
-
- private void emitNop() {
- code.emitInt(1 << 24);
- }
-
- @Override
- public void emitPrologue() {
- emitOp3(0b10, SPARC.sp, 0b111100, SPARC.sp, -SPARC.REGISTER_SAFE_AREA_SIZE); // SAVE sp, -128, sp
- setDeoptRescueSlot(newStackSlot(LIRKind.value(SPARCKind.XWORD)));
- }
-
- @Override
- public void emitEpilogue() {
- HotSpotVMConfig config = HotSpotVMConfig.config();
- recordMark(config.MARKID_DEOPT_HANDLER_ENTRY);
- recordCall(new HotSpotForeignCallTarget(config.handleDeoptStub), 4, true, null);
- code.emitInt(1 << 30); // CALL
- }
-
- @Override
- public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
- frameSize += SPARC.REGISTER_SAFE_AREA_SIZE;
- return super.finish(method);
- }
-
- @Override
- public void emitGrowStack(int size) {
- emitOp3(0b10, SPARC.sp, 0b000100, SPARC.sp, size); // SUB sp, size, sp
- }
-
- @Override
- public Register emitIntArg0() {
- return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCallee, JavaKind.Int)[0];
- }
-
- @Override
- public Register emitIntArg1() {
- return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCallee, JavaKind.Int)[1];
- }
-
- @Override
- public Register emitLoadInt(int c) {
- Register ret = newRegister();
- int hi = c >>> 10;
- int lo = c & ((1 << 10) - 1);
- if (hi == 0) {
- emitOp3(0b10, ret, 0b000010, SPARC.g0, lo); // OR g0, lo, ret
- } else {
- emitOp2(ret, 0b100, hi); // SETHI hi, ret
- if (lo != 0) {
- emitOp3(0b10, ret, 0b000010, ret, lo); // OR ret, lo, ret
- }
- }
- return ret;
- }
-
- @Override
- public Register emitLoadLong(long c) {
- if ((c & 0xFFFF_FFFFL) == c) {
- return emitLoadInt((int) c);
- } else {
- DataSectionReference ref = new DataSectionReference();
- data.align(8);
- ref.setOffset(data.position());
- data.emitLong(c);
- return emitLoadPointer(ref);
- }
- }
-
- private void emitPatchableSethi(Register ret, boolean wide) {
- int startPos = code.position();
- emitOp2(ret, 0b100, 0); // SETHI 0, ret
- if (wide) {
- // pad for later patching
- while (code.position() < (startPos + 28)) {
- emitNop();
- }
- }
- }
-
- @Override
- public Register emitLoadFloat(float c) {
- DataSectionReference ref = new DataSectionReference();
- data.align(4);
- ref.setOffset(data.position());
- data.emitFloat(c);
-
- Register ptr = newRegister();
- recordDataPatchInCode(ref);
- emitPatchableSethi(ptr, true);
- emitOp3(0b11, SPARC.f0, 0b100000, ptr, 0); // LDF [ptr+0], f0
- return SPARC.f0;
- }
-
- @Override
- public Register emitLoadPointer(HotSpotConstant c) {
- Register ret = newRegister();
- recordDataPatchInCode(new ConstantReference((VMConstant) c));
-
- emitPatchableSethi(ret, !c.isCompressed());
- emitOp3(0b10, ret, 0b000010, ret, 0); // OR ret, 0, ret
-
- return ret;
- }
-
- @Override
- public Register emitLoadPointer(DataSectionReference ref) {
- Register ret = newRegister();
- recordDataPatchInCode(ref);
- emitPatchableSethi(ret, true);
- emitOp3(0b11, ret, 0b001011, ret, 0); // LDX [ret+0], ret
- return ret;
- }
-
- @Override
- public Register emitLoadNarrowPointer(DataSectionReference ref) {
- Register ret = newRegister();
- recordDataPatchInCode(ref);
- emitPatchableSethi(ret, true);
- emitOp3(0b11, ret, 0b000000, ret, 0); // LDUW [ret+0], ret
- return ret;
- }
-
- @Override
- public Register emitLoadPointer(Register b, int offset) {
- Register ret = newRegister();
- emitOp3(0b11, ret, 0b001011, b, offset); // LDX [b+offset], ret
- return ret;
- }
-
- @Override
- public StackSlot emitIntToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.WORD));
- emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
- return ret;
- }
-
- @Override
- public StackSlot emitLongToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.XWORD));
- emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
- return ret;
- }
-
- @Override
- public StackSlot emitFloatToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.SINGLE));
- emitOp3(0b11, a, 0b100100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STF a, [fp+offset]
- return ret;
- }
-
- @Override
- public StackSlot emitPointerToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.XWORD));
- emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
- return ret;
- }
-
- @Override
- public StackSlot emitNarrowPointerToStack(Register a) {
- StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.WORD));
- emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
- return ret;
- }
-
- @Override
- public Register emitUncompressPointer(Register compressed, long base, int shift) {
- Register ret;
- if (shift > 0) {
- ret = newRegister();
- emitOp3(0b10, ret, 0b100101, compressed, shift); // SLL compressed, shift, ret
- } else {
- ret = compressed;
- }
- if (base == 0) {
- return ret;
- } else {
- Register b = emitLoadLong(base);
- emitOp3(0b10, b, 0b00000, ret, b); // ADD b, ret, b
- return b;
- }
- }
-
- @Override
- public Register emitIntAdd(Register a, Register b) {
- Register ret = newRegister();
- emitOp3(0b10, ret, 0b00000, a, b); // ADD a, b, ret
- return ret;
- }
-
- private void emitMove(Register to, Register from) {
- if (to != from) {
- emitOp3(0b10, to, 0b000010, from, SPARC.g0); // OR from, g0, to
- }
- }
-
- @Override
- public void emitIntRet(Register a) {
- emitPointerRet(a);
- }
-
- @Override
- public void emitPointerRet(Register a) {
- emitMove(SPARC.i0, a);
- emitOp3(0b10, SPARC.g0, 0b111000, SPARC.i7, 8); // JMPL [i7+8], g0
- emitOp3(0b10, SPARC.g0, 0b111101, SPARC.g0, SPARC.g0); // RESTORE g0, g0, g0
- }
-
- @Override
- public void emitTrap(DebugInfo info) {
- recordImplicitException(info);
- emitOp3(0b11, SPARC.g0, 0b001011, SPARC.g0, 0); // LDX [g0+0], g0
- }
-
- @Override
- public DataSectionReference emitDataItem(HotSpotConstant c) {
- if (c.isCompressed()) {
- data.align(4);
- } else {
- data.align(8);
- }
- return super.emitDataItem(c);
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/CodeInstallationTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.test;
+
+import java.lang.reflect.Method;
+
+import org.junit.Assert;
+
+import jdk.vm.ci.amd64.AMD64;
+import jdk.vm.ci.code.Architecture;
+import jdk.vm.ci.code.CodeCacheProvider;
+import jdk.vm.ci.code.InstalledCode;
+import jdk.vm.ci.code.TargetDescription;
+import jdk.vm.ci.code.test.amd64.AMD64TestAssembler;
+import jdk.vm.ci.code.test.sparc.SPARCTestAssembler;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
+import jdk.vm.ci.meta.ConstantReflectionProvider;
+import jdk.vm.ci.meta.MetaAccessProvider;
+import jdk.vm.ci.runtime.JVMCI;
+import jdk.vm.ci.runtime.JVMCIBackend;
+import jdk.vm.ci.sparc.SPARC;
+
+/**
+ * Base class for code installation tests.
+ */
+public class CodeInstallationTest {
+
+ protected final MetaAccessProvider metaAccess;
+ protected final CodeCacheProvider codeCache;
+ protected final TargetDescription target;
+ protected final ConstantReflectionProvider constantReflection;
+
+ public CodeInstallationTest() {
+ JVMCIBackend backend = JVMCI.getRuntime().getHostJVMCIBackend();
+ metaAccess = backend.getMetaAccess();
+ codeCache = backend.getCodeCache();
+ target = backend.getTarget();
+ constantReflection = backend.getConstantReflection();
+ }
+
+ protected interface TestCompiler {
+
+ void compile(TestAssembler asm);
+ }
+
+ private TestAssembler createAssembler() {
+ Architecture arch = codeCache.getTarget().arch;
+ if (arch instanceof AMD64) {
+ return new AMD64TestAssembler(codeCache);
+ } else if (arch instanceof SPARC) {
+ return new SPARCTestAssembler(codeCache);
+ } else {
+ Assert.fail("unsupported architecture");
+ return null;
+ }
+ }
+
+ protected Method getMethod(String name, Class<?>... args) {
+ try {
+ return getClass().getMethod(name, args);
+ } catch (NoSuchMethodException e) {
+ Assert.fail("method not found");
+ return null;
+ }
+ }
+
+ protected void test(TestCompiler compiler, Method method, Object... args) {
+ HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
+ TestAssembler asm = createAssembler();
+
+ asm.emitPrologue();
+ compiler.compile(asm);
+ asm.emitEpilogue();
+
+ HotSpotCompiledCode code = asm.finish(resolvedMethod);
+ InstalledCode installed = codeCache.addCode(resolvedMethod, code, null, null);
+
+ try {
+ Object expected = method.invoke(null, args);
+ Object actual = installed.executeVarargs(args);
+ Assert.assertEquals(expected, actual);
+ } catch (Exception e) {
+ e.printStackTrace();
+ Assert.fail(e.toString());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/DataPatchTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @library /
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.code.site
+ * jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.vm.ci/jdk.vm.ci.amd64
+ * jdk.vm.ci/jdk.vm.ci.sparc
+ * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
+ * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.DataPatchTest
+ */
+
+package jdk.vm.ci.code.test;
+
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotMetaAccessProvider;
+import jdk.vm.ci.hotspot.HotSpotSymbol;
+import jdk.vm.ci.hotspot.HotSpotVMConfig;
+import jdk.vm.ci.meta.ResolvedJavaType;
+
+import org.junit.Assume;
+import org.junit.Test;
+
+/**
+ * Test code installation with data patches.
+ */
+public class DataPatchTest extends CodeInstallationTest {
+
+ public static Class<?> getConstClass() {
+ return DataPatchTest.class;
+ }
+
+ private void test(TestCompiler compiler) {
+ test(compiler, getMethod("getConstClass"));
+ }
+
+ @Test
+ public void testInlineObject() {
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
+ Register ret = asm.emitLoadPointer(c);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testInlineNarrowObject() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
+ Register compressed = asm.emitLoadPointer((HotSpotConstant) c.compress());
+ Register ret = asm.emitUncompressPointer(compressed, HotSpotVMConfig.config().narrowOopBase, HotSpotVMConfig.config().narrowOopShift);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testDataSectionReference() {
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
+ DataSectionReference ref = asm.emitDataItem(c);
+ Register ret = asm.emitLoadPointer(ref);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testNarrowDataSectionReference() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant c = (HotSpotConstant) constantReflection.asJavaClass(type);
+ HotSpotConstant cCompressed = (HotSpotConstant) c.compress();
+ DataSectionReference ref = asm.emitDataItem(cCompressed);
+ Register compressed = asm.emitLoadNarrowPointer(ref);
+ Register ret = asm.emitUncompressPointer(compressed, HotSpotVMConfig.config().narrowOopBase, HotSpotVMConfig.config().narrowOopShift);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testInlineMetadata() {
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ Register klass = asm.emitLoadPointer((HotSpotConstant) constantReflection.asObjectHub(type));
+ Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testInlineNarrowMetadata() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedClassPointers);
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
+ Register narrowKlass = asm.emitLoadPointer((HotSpotConstant) hub.compress());
+ Register klass = asm.emitUncompressPointer(narrowKlass, HotSpotVMConfig.config().narrowKlassBase, HotSpotVMConfig.config().narrowKlassShift);
+ Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testMetadataInDataSection() {
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
+ DataSectionReference ref = asm.emitDataItem(hub);
+ Register klass = asm.emitLoadPointer(ref);
+ Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testNarrowMetadataInDataSection() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedClassPointers);
+ test(asm -> {
+ ResolvedJavaType type = metaAccess.lookupJavaType(getConstClass());
+ HotSpotConstant hub = (HotSpotConstant) constantReflection.asObjectHub(type);
+ HotSpotConstant narrowHub = (HotSpotConstant) hub.compress();
+ DataSectionReference ref = asm.emitDataItem(narrowHub);
+ Register narrowKlass = asm.emitLoadNarrowPointer(ref);
+ Register klass = asm.emitUncompressPointer(narrowKlass, HotSpotVMConfig.config().narrowKlassBase, HotSpotVMConfig.config().narrowKlassShift);
+ Register ret = asm.emitLoadPointer(klass, HotSpotVMConfig.config().classMirrorOffset);
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ public static long getConstSymbol(HotSpotMetaAccessProvider meta) {
+ HotSpotSymbol symbol = meta.lookupSymbol("java/lang/Object");
+ return symbol.getMetaspacePointer();
+ }
+
+ private void testSymbol(TestCompiler compiler) {
+ test(compiler, getMethod("getConstSymbol", HotSpotMetaAccessProvider.class), (HotSpotMetaAccessProvider) metaAccess);
+ }
+
+ @Test
+ public void testInlineSymbol() {
+ testSymbol(asm -> {
+ HotSpotSymbol symbol = ((HotSpotMetaAccessProvider) metaAccess).lookupSymbol("java/lang/Object");
+ Register ret = asm.emitLoadPointer((HotSpotConstant) symbol.asConstant());
+ asm.emitPointerRet(ret);
+ });
+ }
+
+ @Test
+ public void testSymbolInDataSection() {
+ testSymbol(asm -> {
+ HotSpotSymbol symbol = ((HotSpotMetaAccessProvider) metaAccess).lookupSymbol("java/lang/Object");
+ DataSectionReference ref = asm.emitDataItem((HotSpotConstant) symbol.asConstant());
+ Register ret = asm.emitLoadPointer(ref);
+ asm.emitPointerRet(ret);
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/DebugInfoTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.code.test;
+
+import java.lang.reflect.Method;
+
+import jdk.vm.ci.code.BytecodeFrame;
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.code.Location;
+import jdk.vm.ci.code.VirtualObject;
+import jdk.vm.ci.hotspot.HotSpotReferenceMap;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.JavaValue;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
+/**
+ * Test code installation with debug information.
+ */
+public class DebugInfoTest extends CodeInstallationTest {
+
+ protected interface DebugInfoCompiler {
+
+ VirtualObject[] compile(TestAssembler asm, JavaValue[] frameValues);
+ }
+
+ protected void test(DebugInfoCompiler compiler, Method method, int bci, JavaKind... slotKinds) {
+ ResolvedJavaMethod resolvedMethod = metaAccess.lookupJavaMethod(method);
+
+ int numLocals = resolvedMethod.getMaxLocals();
+ int numStack = slotKinds.length - numLocals;
+ JavaValue[] values = new JavaValue[slotKinds.length];
+ test(asm -> {
+ VirtualObject[] vobjs = compiler.compile(asm, values);
+
+ BytecodeFrame frame = new BytecodeFrame(null, resolvedMethod, bci, false, false, values, slotKinds, numLocals, numStack, 0);
+ DebugInfo info = new DebugInfo(frame, vobjs);
+ info.setReferenceMap(new HotSpotReferenceMap(new Location[0], new Location[0], new int[0], 8));
+
+ asm.emitTrap(info);
+ }, method);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/InterpreterFrameSizeTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.code.site
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.vm.ci/jdk.vm.ci.common
+ * jdk.vm.ci/jdk.vm.ci.amd64
+ * jdk.vm.ci/jdk.vm.ci.sparc
+ * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
+ * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.InterpreterFrameSizeTest
+ */
+
+package jdk.vm.ci.code.test;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import jdk.vm.ci.code.BytecodeFrame;
+import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.JavaValue;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
+public class InterpreterFrameSizeTest extends CodeInstallationTest {
+
+ HotSpotCodeCacheProvider hotspotCodeCache() {
+ return (HotSpotCodeCacheProvider) codeCache;
+ }
+
+ @Test
+ public void testNull() {
+ try {
+ hotspotCodeCache().interpreterFrameSize(null);
+ } catch (NullPointerException npe) {
+ // Threw NPE as expected.
+ return;
+ }
+ Assert.fail("expected NullPointerException");
+ }
+
+ @Test
+ public void test() {
+ ResolvedJavaMethod resolvedMethod = metaAccess.lookupJavaMethod(getMethod("testNull"));
+
+ int bci = 0;
+ int numLocals = resolvedMethod.getMaxLocals();
+ int numStack = 0;
+ JavaValue[] values = new JavaValue[numLocals];
+ JavaKind[] slotKinds = new JavaKind[numLocals];
+ BytecodeFrame frame = new BytecodeFrame(null, resolvedMethod, bci, false, false, values, slotKinds, numLocals, numStack, 0);
+ int size = hotspotCodeCache().interpreterFrameSize(frame);
+ if (size <= 0) {
+ Assert.fail("expected non-zero result");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/SimpleCodeInstallationTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @library /
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.code.site
+ * jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.vm.ci/jdk.vm.ci.amd64
+ * jdk.vm.ci/jdk.vm.ci.sparc
+ * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
+ * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.SimpleCodeInstallationTest
+ */
+
+package jdk.vm.ci.code.test;
+
+import org.junit.Test;
+
+import jdk.vm.ci.code.Register;
+
+/**
+ * Test simple code installation.
+ */
+public class SimpleCodeInstallationTest extends CodeInstallationTest {
+
+ public static int add(int a, int b) {
+ return a + b;
+ }
+
+ private static void compileAdd(TestAssembler asm) {
+ Register arg0 = asm.emitIntArg0();
+ Register arg1 = asm.emitIntArg1();
+ Register ret = asm.emitIntAdd(arg0, arg1);
+ asm.emitIntRet(ret);
+ }
+
+ @Test
+ public void test() {
+ test(SimpleCodeInstallationTest::compileAdd, getMethod("add", int.class, int.class), 5, 7);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/SimpleDebugInfoTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @library /
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.code.site
+ * jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.vm.ci/jdk.vm.ci.amd64
+ * jdk.vm.ci/jdk.vm.ci.sparc
+ * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
+ * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.SimpleDebugInfoTest
+ */
+
+package jdk.vm.ci.code.test;
+
+import org.junit.Assume;
+import org.junit.Test;
+
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotVMConfig;
+import jdk.vm.ci.meta.JavaConstant;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.ResolvedJavaType;
+import jdk.vm.ci.meta.Value;
+
+public class SimpleDebugInfoTest extends DebugInfoTest {
+
+ public static int intOnStack() {
+ return 42;
+ }
+
+ private void testIntOnStack(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("intOnStack"), 2, JavaKind.Int);
+ }
+
+ public static int intInLocal() {
+ int local = 42;
+ return local;
+ }
+
+ public void testIntInLocal(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("intInLocal"), 3, JavaKind.Int);
+ }
+
+ @Test
+ public void testConstInt() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ values[0] = JavaConstant.forInt(42);
+ return null;
+ };
+ testIntOnStack(compiler);
+ testIntInLocal(compiler);
+ }
+
+ @Test
+ public void testRegInt() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadInt(42);
+ values[0] = reg.asValue(target.getLIRKind(JavaKind.Int));
+ return null;
+ };
+ testIntOnStack(compiler);
+ testIntInLocal(compiler);
+ }
+
+ @Test
+ public void testStackInt() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadInt(42);
+ values[0] = asm.emitIntToStack(reg);
+ return null;
+ };
+ testIntOnStack(compiler);
+ testIntInLocal(compiler);
+ }
+
+ public static float floatOnStack() {
+ return 42.0f;
+ }
+
+ private void testFloatOnStack(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("floatOnStack"), 2, JavaKind.Float);
+ }
+
+ public static float floatInLocal() {
+ float local = 42.0f;
+ return local;
+ }
+
+ private void testFloatInLocal(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("floatInLocal"), 3, JavaKind.Float);
+ }
+
+ @Test
+ public void testConstFloat() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ values[0] = JavaConstant.forFloat(42.0f);
+ return null;
+ };
+ testFloatOnStack(compiler);
+ testFloatInLocal(compiler);
+ }
+
+ @Test
+ public void testRegFloat() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadFloat(42.0f);
+ values[0] = reg.asValue(target.getLIRKind(JavaKind.Float));
+ return null;
+ };
+ testFloatOnStack(compiler);
+ testFloatInLocal(compiler);
+ }
+
+ @Test
+ public void testStackFloat() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadFloat(42.0f);
+ values[0] = asm.emitFloatToStack(reg);
+ return null;
+ };
+ testFloatOnStack(compiler);
+ testFloatInLocal(compiler);
+ }
+
+ public static long longOnStack() {
+ return 42;
+ }
+
+ private void testLongOnStack(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("longOnStack"), 3, JavaKind.Long, JavaKind.Illegal);
+ }
+
+ public static long longInLocal() {
+ long local = 42;
+ return local;
+ }
+
+ private void testLongInLocal(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("longInLocal"), 4, JavaKind.Long, JavaKind.Illegal);
+ }
+
+ @Test
+ public void testConstLong() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ values[0] = JavaConstant.forLong(42);
+ values[1] = Value.ILLEGAL;
+ return null;
+ };
+ testLongOnStack(compiler);
+ testLongInLocal(compiler);
+ }
+
+ @Test
+ public void testRegLong() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadLong(42);
+ values[0] = reg.asValue(target.getLIRKind(JavaKind.Long));
+ values[1] = Value.ILLEGAL;
+ return null;
+ };
+ testLongOnStack(compiler);
+ testLongInLocal(compiler);
+ }
+
+ @Test
+ public void testStackLong() {
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadLong(42);
+ values[0] = asm.emitLongToStack(reg);
+ values[1] = Value.ILLEGAL;
+ return null;
+ };
+ testLongOnStack(compiler);
+ testLongInLocal(compiler);
+ }
+
+ public static Class<?> objectOnStack() {
+ return SimpleDebugInfoTest.class;
+ }
+
+ private void testObjectOnStack(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("objectOnStack"), 2, JavaKind.Object);
+ }
+
+ public static Class<?> objectInLocal() {
+ Class<?> local = SimpleDebugInfoTest.class;
+ return local;
+ }
+
+ private void testObjectInLocal(DebugInfoCompiler compiler) {
+ test(compiler, getMethod("objectInLocal"), 3, JavaKind.Object);
+ }
+
+ @Test
+ public void testConstObject() {
+ ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
+ DebugInfoCompiler compiler = (asm, values) -> {
+ values[0] = constantReflection.asJavaClass(type);
+ return null;
+ };
+ testObjectOnStack(compiler);
+ testObjectInLocal(compiler);
+ }
+
+ @Test
+ public void testRegObject() {
+ ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type));
+ values[0] = reg.asValue(target.getLIRKind(JavaKind.Object));
+ return null;
+ };
+ testObjectOnStack(compiler);
+ testObjectInLocal(compiler);
+ }
+
+ @Test
+ public void testStackObject() {
+ ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
+ DebugInfoCompiler compiler = (asm, values) -> {
+ Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.asJavaClass(type));
+ values[0] = asm.emitPointerToStack(reg);
+ return null;
+ };
+ testObjectOnStack(compiler);
+ testObjectInLocal(compiler);
+ }
+
+ @Test
+ public void testRegNarrowObject() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
+ ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
+ DebugInfoCompiler compiler = (asm, values) -> {
+ HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type);
+ Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress());
+ values[0] = reg.asValue(asm.narrowOopKind);
+ return null;
+ };
+ testObjectOnStack(compiler);
+ testObjectInLocal(compiler);
+ }
+
+ @Test
+ public void testStackNarrowObject() {
+ Assume.assumeTrue(HotSpotVMConfig.config().useCompressedOops);
+ ResolvedJavaType type = metaAccess.lookupJavaType(objectOnStack());
+ DebugInfoCompiler compiler = (asm, values) -> {
+ HotSpotConstant wide = (HotSpotConstant) constantReflection.asJavaClass(type);
+ Register reg = asm.emitLoadPointer((HotSpotConstant) wide.compress());
+ values[0] = asm.emitNarrowPointerToStack(reg);
+ return null;
+ };
+ testObjectOnStack(compiler);
+ testObjectInLocal(compiler);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/TestAssembler.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.vm.ci.code.test;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import jdk.vm.ci.code.CodeCacheProvider;
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.StackSlot;
+import jdk.vm.ci.code.site.Call;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataPatch;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.code.site.Infopoint;
+import jdk.vm.ci.code.site.InfopointReason;
+import jdk.vm.ci.code.site.Mark;
+import jdk.vm.ci.code.site.Reference;
+import jdk.vm.ci.code.site.Site;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
+import jdk.vm.ci.hotspot.HotSpotCompiledNmethod;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
+import jdk.vm.ci.meta.Assumptions.Assumption;
+import jdk.vm.ci.meta.InvokeTarget;
+import jdk.vm.ci.meta.LIRKind;
+import jdk.vm.ci.meta.PlatformKind;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+import jdk.vm.ci.meta.VMConstant;
+
+/**
+ * Simple assembler used by the code installation tests.
+ */
+public abstract class TestAssembler {
+
+ /**
+ * Emit the method prologue code (e.g. building the new stack frame).
+ */
+ public abstract void emitPrologue();
+
+ /**
+ * Emit the method epilogue code (e.g. the deopt handler).
+ */
+ public abstract void emitEpilogue();
+
+ /**
+ * Emit code to grow the stack frame.
+ *
+ * @param size the size in bytes that the stack should grow
+ */
+ public abstract void emitGrowStack(int size);
+
+ /**
+ * Get the register containing the first 32-bit integer argument.
+ */
+ public abstract Register emitIntArg0();
+
+ /**
+ * Get the register containing the second 32-bit integer argument.
+ */
+ public abstract Register emitIntArg1();
+
+ /**
+ * Emit code to add two 32-bit integer registers. May reuse one of the argument registers.
+ */
+ public abstract Register emitIntAdd(Register a, Register b);
+
+ /**
+ * Emit code to load a constant 32-bit integer to a register.
+ */
+ public abstract Register emitLoadInt(int value);
+
+ /**
+ * Emit code to load a constant 64-bit integer to a register.
+ */
+ public abstract Register emitLoadLong(long value);
+
+ /**
+ * Emit code to load a constant single-precision float to a register.
+ */
+ public abstract Register emitLoadFloat(float value);
+
+ /**
+ * Emit code to load a constant oop or metaspace pointer to a register. The pointer may be wide
+ * or narrow, depending on {@link HotSpotConstant#isCompressed() c.isCompressed()}.
+ */
+ public abstract Register emitLoadPointer(HotSpotConstant c);
+
+ /**
+ * Emit code to load a wide pointer from the {@link HotSpotCompiledCode#dataSection} to a
+ * register.
+ */
+ public abstract Register emitLoadPointer(DataSectionReference ref);
+
+ /**
+ * Emit code to load a narrow pointer from the {@link HotSpotCompiledCode#dataSection} to a
+ * register.
+ */
+ public abstract Register emitLoadNarrowPointer(DataSectionReference ref);
+
+ /**
+ * Emit code to load a (wide) pointer from a memory location to a register.
+ */
+ public abstract Register emitLoadPointer(Register base, int offset);
+
+ /**
+ * Emit code to store a 32-bit integer from a register to a new stack slot.
+ */
+ public abstract StackSlot emitIntToStack(Register a);
+
+ /**
+ * Emit code to store a 64-bit integer from a register to a new stack slot.
+ */
+ public abstract StackSlot emitLongToStack(Register a);
+
+ /**
+ * Emit code to store a single-precision float from a register to a new stack slot.
+ */
+ public abstract StackSlot emitFloatToStack(Register a);
+
+ /**
+ * Emit code to store a wide pointer from a register to a new stack slot.
+ */
+ public abstract StackSlot emitPointerToStack(Register a);
+
+ /**
+ * Emit code to store a narrow pointer from a register to a new stack slot.
+ */
+ public abstract StackSlot emitNarrowPointerToStack(Register a);
+
+ /**
+ * Emit code to uncompress a narrow pointer. The input pointer is guaranteed to be non-null.
+ */
+ public abstract Register emitUncompressPointer(Register compressed, long base, int shift);
+
+ /**
+ * Emit code to return from a function, returning a 32-bit integer.
+ */
+ public abstract void emitIntRet(Register a);
+
+ /**
+ * Emit code to return from a function, returning a wide oop pointer.
+ */
+ public abstract void emitPointerRet(Register a);
+
+ /**
+ * Emit code that traps, forcing a deoptimization.
+ */
+ public abstract void emitTrap(DebugInfo info);
+
+ public final LIRKind narrowOopKind;
+
+ protected final Buffer code;
+ protected final Buffer data;
+ private final ArrayList<Site> sites;
+ private final ArrayList<DataPatch> dataPatches;
+
+ protected final CodeCacheProvider codeCache;
+
+ private final Register[] registers;
+ private int nextRegister;
+
+ protected int frameSize;
+ private int stackAlignment;
+ private int curStackSlot;
+
+ private StackSlot deoptRescue;
+
+ protected TestAssembler(CodeCacheProvider codeCache, int initialFrameSize, int stackAlignment, PlatformKind narrowOopKind, Register... registers) {
+ this.narrowOopKind = LIRKind.reference(narrowOopKind);
+
+ this.code = new Buffer();
+ this.data = new Buffer();
+ this.sites = new ArrayList<>();
+ this.dataPatches = new ArrayList<>();
+
+ this.codeCache = codeCache;
+
+ this.registers = registers;
+ this.nextRegister = 0;
+
+ this.frameSize = initialFrameSize;
+ this.stackAlignment = stackAlignment;
+ this.curStackSlot = initialFrameSize;
+ }
+
+ protected Register newRegister() {
+ return registers[nextRegister++];
+ }
+
+ protected StackSlot newStackSlot(LIRKind kind) {
+ curStackSlot += kind.getPlatformKind().getSizeInBytes();
+ if (curStackSlot > frameSize) {
+ int newFrameSize = curStackSlot;
+ if (newFrameSize % stackAlignment != 0) {
+ newFrameSize += stackAlignment - (newFrameSize % stackAlignment);
+ }
+ emitGrowStack(newFrameSize - frameSize);
+ frameSize = newFrameSize;
+ }
+ return StackSlot.get(kind, -curStackSlot, true);
+ }
+
+ protected void setDeoptRescueSlot(StackSlot deoptRescue) {
+ this.deoptRescue = deoptRescue;
+ }
+
+ protected void recordCall(InvokeTarget target, int size, boolean direct, DebugInfo debugInfo) {
+ sites.add(new Call(target, code.position(), size, direct, debugInfo));
+ }
+
+ protected void recordMark(Object id) {
+ sites.add(new Mark(code.position(), id));
+ }
+
+ protected void recordImplicitException(DebugInfo info) {
+ sites.add(new Infopoint(code.position(), info, InfopointReason.IMPLICIT_EXCEPTION));
+ }
+
+ protected void recordDataPatchInCode(Reference ref) {
+ sites.add(new DataPatch(code.position(), ref));
+ }
+
+ protected void recordDataPatchInData(Reference ref) {
+ dataPatches.add(new DataPatch(data.position(), ref));
+ }
+
+ public DataSectionReference emitDataItem(HotSpotConstant c) {
+ DataSectionReference ref = new DataSectionReference();
+ ref.setOffset(data.position());
+
+ recordDataPatchInData(new ConstantReference((VMConstant) c));
+ if (c.isCompressed()) {
+ data.emitInt(0xDEADDEAD);
+ } else {
+ data.emitLong(0xDEADDEADDEADDEADL);
+ }
+
+ return ref;
+ }
+
+ public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
+ int id = method.allocateCompileId(0);
+ byte[] finishedCode = code.finish();
+ Site[] finishedSites = sites.toArray(new Site[0]);
+ byte[] finishedData = data.finish();
+ DataPatch[] finishedDataPatches = dataPatches.toArray(new DataPatch[0]);
+ return new HotSpotCompiledNmethod(method.getName(), finishedCode, finishedCode.length, finishedSites, new Assumption[0], new ResolvedJavaMethod[]{method}, new Comment[0], finishedData, 16,
+ finishedDataPatches, false, frameSize, deoptRescue, method, 0, id, 0L, false);
+ }
+
+ protected static class Buffer {
+
+ private ByteBuffer data = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder());
+
+ private void ensureSize(int length) {
+ if (length >= data.limit()) {
+ byte[] newBuf = Arrays.copyOf(data.array(), length * 4);
+ ByteBuffer newData = ByteBuffer.wrap(newBuf);
+ newData.order(data.order());
+ newData.position(data.position());
+ data = newData;
+ }
+ }
+
+ public int position() {
+ return data.position();
+ }
+
+ public void emitByte(int b) {
+ ensureSize(data.position() + 1);
+ data.put((byte) (b & 0xFF));
+ }
+
+ public void emitShort(int b) {
+ ensureSize(data.position() + 2);
+ data.putShort((short) b);
+ }
+
+ public void emitInt(int b) {
+ ensureSize(data.position() + 4);
+ data.putInt(b);
+ }
+
+ public void emitLong(long b) {
+ ensureSize(data.position() + 8);
+ data.putLong(b);
+ }
+
+ public void emitFloat(float f) {
+ ensureSize(data.position() + 4);
+ data.putFloat(f);
+ }
+
+ public void align(int alignment) {
+ int pos = data.position();
+ int misaligned = pos % alignment;
+ if (misaligned != 0) {
+ pos += alignment - misaligned;
+ data.position(pos);
+ }
+ }
+
+ private byte[] finish() {
+ return Arrays.copyOf(data.array(), data.position());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/VirtualObjectDebugInfoTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @library /
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
+ * jdk.vm.ci/jdk.vm.ci.code.site
+ * jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.vm.ci/jdk.vm.ci.amd64
+ * jdk.vm.ci/jdk.vm.ci.sparc
+ * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
+ * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.VirtualObjectDebugInfoTest
+ */
+
+package jdk.vm.ci.code.test;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.VirtualObject;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.meta.JavaConstant;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.JavaValue;
+import jdk.vm.ci.meta.ResolvedJavaField;
+import jdk.vm.ci.meta.ResolvedJavaType;
+
+public class VirtualObjectDebugInfoTest extends DebugInfoTest {
+
+ private static class TestClass {
+
+ private long longField;
+ private int intField;
+ private float floatField;
+ private Object[] arrayField;
+
+ TestClass() {
+ this.longField = 8472;
+ this.intField = 42;
+ this.floatField = 3.14f;
+ this.arrayField = new Object[]{Integer.valueOf(58), this, null, Integer.valueOf(17), "Hello, World!"};
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof TestClass)) {
+ return false;
+ }
+
+ TestClass other = (TestClass) o;
+ if (this.longField != other.longField || this.intField != other.intField || this.floatField != other.floatField || this.arrayField.length != other.arrayField.length) {
+ return false;
+ }
+
+ for (int i = 0; i < this.arrayField.length; i++) {
+ // break cycle
+ if (this.arrayField[i] == this && other.arrayField[i] == other) {
+ continue;
+ }
+
+ if (!Objects.equals(this.arrayField[i], other.arrayField[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+ }
+
+ public static TestClass buildObject() {
+ return new TestClass();
+ }
+
+ private VirtualObject[] compileBuildObject(TestAssembler asm, JavaValue[] values) {
+ TestClass template = new TestClass();
+ ArrayList<VirtualObject> vobjs = new ArrayList<>();
+
+ ResolvedJavaType retType = metaAccess.lookupJavaType(TestClass.class);
+ VirtualObject ret = VirtualObject.get(retType, vobjs.size());
+ vobjs.add(ret);
+ values[0] = ret;
+
+ ResolvedJavaType arrayType = metaAccess.lookupJavaType(Object[].class);
+ VirtualObject array = VirtualObject.get(arrayType, vobjs.size());
+ vobjs.add(array);
+
+ // build array for ret.arrayField
+ ResolvedJavaType integerType = metaAccess.lookupJavaType(Integer.class);
+ JavaValue[] arrayContent = new JavaValue[template.arrayField.length];
+ JavaKind[] arrayKind = new JavaKind[template.arrayField.length];
+ for (int i = 0; i < arrayContent.length; i++) {
+ arrayKind[i] = JavaKind.Object;
+ if (template.arrayField[i] == null) {
+ arrayContent[i] = JavaConstant.NULL_POINTER;
+ } else if (template.arrayField[i] == template) {
+ arrayContent[i] = ret;
+ } else if (template.arrayField[i] instanceof Integer) {
+ int value = (Integer) template.arrayField[i];
+ VirtualObject boxed = VirtualObject.get(integerType, vobjs.size());
+ vobjs.add(boxed);
+ arrayContent[i] = boxed;
+ boxed.setValues(new JavaValue[]{JavaConstant.forInt(value)}, new JavaKind[]{JavaKind.Int});
+ } else if (template.arrayField[i] instanceof String) {
+ String value = (String) template.arrayField[i];
+ Register reg = asm.emitLoadPointer((HotSpotConstant) constantReflection.forString(value));
+ arrayContent[i] = reg.asValue(target.getLIRKind(JavaKind.Object));
+ } else {
+ Assert.fail("unexpected value");
+ }
+ }
+ array.setValues(arrayContent, arrayKind);
+
+ // build return object
+ ResolvedJavaField[] fields = retType.getInstanceFields(true);
+ JavaValue[] retContent = new JavaValue[fields.length];
+ JavaKind[] retKind = new JavaKind[fields.length];
+ for (int i = 0; i < fields.length; i++) {
+ retKind[i] = fields[i].getJavaKind();
+ switch (retKind[i]) {
+ case Long: // template.longField
+ retContent[i] = JavaConstant.forLong(template.longField);
+ break;
+ case Int: // template.intField
+ Register intReg = asm.emitLoadInt(template.intField);
+ retContent[i] = asm.emitIntToStack(intReg);
+ break;
+ case Float: // template.floatField
+ Register fReg = asm.emitLoadFloat(template.floatField);
+ retContent[i] = fReg.asValue(target.getLIRKind(JavaKind.Float));
+ break;
+ case Object: // template.arrayField
+ retContent[i] = array;
+ break;
+ default:
+ Assert.fail("unexpected field");
+ }
+ }
+ ret.setValues(retContent, retKind);
+
+ return vobjs.toArray(new VirtualObject[0]);
+ }
+
+ @Test
+ public void testBuildObject() {
+ test(this::compileBuildObject, getMethod("buildObject"), 7, JavaKind.Object);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/amd64/AMD64TestAssembler.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.vm.ci.code.test.amd64;
+
+import jdk.vm.ci.amd64.AMD64;
+import jdk.vm.ci.amd64.AMD64Kind;
+import jdk.vm.ci.code.CodeCacheProvider;
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.StackSlot;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.code.test.TestAssembler;
+import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotForeignCallTarget;
+import jdk.vm.ci.hotspot.HotSpotVMConfig;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.LIRKind;
+import jdk.vm.ci.meta.VMConstant;
+
+public class AMD64TestAssembler extends TestAssembler {
+
+ public AMD64TestAssembler(CodeCacheProvider codeCache) {
+ super(codeCache, 16, 16, AMD64Kind.DWORD, AMD64.rax, AMD64.rcx, AMD64.rdi, AMD64.r8, AMD64.r9, AMD64.r10);
+ }
+
+ private void emitFatNop() {
+ // 5 byte NOP:
+ // NOP DWORD ptr [EAX + EAX*1 + 00H]
+ code.emitByte(0x0F);
+ code.emitByte(0x1F);
+ code.emitByte(0x44);
+ code.emitByte(0x00);
+ code.emitByte(0x00);
+ }
+
+ @Override
+ public void emitPrologue() {
+ // WARNING: Initial instruction MUST be 5 bytes or longer so that
+ // NativeJump::patch_verified_entry will be able to patch out the entry
+ // code safely.
+ emitFatNop();
+ code.emitByte(0x50 | AMD64.rbp.encoding); // PUSH rbp
+ emitMove(true, AMD64.rbp, AMD64.rsp); // MOV rbp, rsp
+ setDeoptRescueSlot(newStackSlot(LIRKind.value(AMD64Kind.QWORD)));
+ }
+
+ @Override
+ public void emitEpilogue() {
+ HotSpotVMConfig config = HotSpotVMConfig.config();
+ recordMark(config.MARKID_DEOPT_HANDLER_ENTRY);
+ recordCall(new HotSpotForeignCallTarget(config.handleDeoptStub), 5, true, null);
+ code.emitByte(0xE8); // CALL rel32
+ code.emitInt(0xDEADDEAD);
+ }
+
+ @Override
+ public void emitGrowStack(int size) {
+ // SUB rsp, size
+ code.emitByte(0x48);
+ code.emitByte(0x81);
+ code.emitByte(0xEC);
+ code.emitInt(size);
+ }
+
+ @Override
+ public Register emitIntArg0() {
+ return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, JavaKind.Int)[0];
+ }
+
+ @Override
+ public Register emitIntArg1() {
+ return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, JavaKind.Int)[1];
+ }
+
+ private void emitREX(boolean w, int r, int x, int b) {
+ int wrxb = (w ? 0x08 : 0) | ((r >> 3) << 2) | ((x >> 3) << 1) | (b >> 3);
+ if (wrxb != 0) {
+ code.emitByte(0x40 | wrxb);
+ }
+ }
+
+ private void emitModRMReg(boolean w, int opcode, int r, int m) {
+ emitREX(w, r, 0, m);
+ code.emitByte((byte) opcode);
+ code.emitByte((byte) 0xC0 | ((r & 0x7) << 3) | (m & 0x7));
+ }
+
+ private void emitModRMMemory(boolean w, int opcode, int r, int b, int offset) {
+ emitREX(w, r, 0, b);
+ code.emitByte((byte) opcode);
+ code.emitByte((byte) 0x80 | ((r & 0x7) << 3) | (b & 0x7));
+ code.emitInt(offset);
+ }
+
+ @Override
+ public Register emitLoadInt(int c) {
+ Register ret = newRegister();
+ emitREX(false, 0, 0, ret.encoding);
+ code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
+ code.emitInt(c);
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadLong(long c) {
+ Register ret = newRegister();
+ emitREX(true, 0, 0, ret.encoding);
+ code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r64, imm64
+ code.emitLong(c);
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadFloat(float c) {
+ DataSectionReference ref = new DataSectionReference();
+ ref.setOffset(data.position());
+ data.emitFloat(c);
+
+ recordDataPatchInCode(ref);
+ Register ret = AMD64.xmm0;
+ emitREX(false, ret.encoding, 0, 0);
+ code.emitByte(0xF3);
+ code.emitByte(0x0F);
+ code.emitByte(0x10); // MOVSS xmm1, xmm2/m32
+ code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // xmm, [rip+offset]
+ code.emitInt(0xDEADDEAD);
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadPointer(HotSpotConstant c) {
+ recordDataPatchInCode(new ConstantReference((VMConstant) c));
+ if (c.isCompressed()) {
+ Register ret = newRegister();
+ emitREX(false, 0, 0, ret.encoding);
+ code.emitByte(0xB8 | (ret.encoding & 0x7)); // MOV r32, imm32
+ code.emitInt(0xDEADDEAD);
+ return ret;
+ } else {
+ return emitLoadLong(0xDEADDEADDEADDEADL);
+ }
+ }
+
+ private Register emitLoadPointer(DataSectionReference ref, boolean narrow) {
+ recordDataPatchInCode(ref);
+ Register ret = newRegister();
+ emitREX(!narrow, ret.encoding, 0, 0);
+ code.emitByte(0x8B); // MOV r64,r/m64
+ code.emitByte(0x05 | ((ret.encoding & 0x7) << 3)); // r64, [rip+offset]
+ code.emitInt(0xDEADDEAD);
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadPointer(DataSectionReference ref) {
+ return emitLoadPointer(ref, false);
+ }
+
+ @Override
+ public Register emitLoadNarrowPointer(DataSectionReference ref) {
+ return emitLoadPointer(ref, true);
+ }
+
+ @Override
+ public Register emitLoadPointer(Register b, int offset) {
+ Register ret = newRegister();
+ emitModRMMemory(true, 0x8B, ret.encoding, b.encoding, offset); // MOV r64,r/m64
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitIntToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.DWORD));
+ // MOV r/m32,r32
+ emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitLongToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.QWORD));
+ // MOV r/m64,r64
+ emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitFloatToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.SINGLE));
+ emitREX(false, a.encoding, 0, 0);
+ code.emitByte(0xF3);
+ code.emitByte(0x0F);
+ code.emitByte(0x11); // MOVSS xmm2/m32, xmm1
+ code.emitByte(0x85 | ((a.encoding & 0x7) << 3)); // [rbp+offset]
+ code.emitInt(ret.getRawOffset() + 16);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitPointerToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.QWORD));
+ // MOV r/m64,r64
+ emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitNarrowPointerToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.DWORD));
+ // MOV r/m32,r32
+ emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
+ return ret;
+ }
+
+ @Override
+ public Register emitUncompressPointer(Register compressed, long base, int shift) {
+ if (shift > 0) {
+ emitModRMReg(true, 0xC1, 4, compressed.encoding);
+ code.emitByte(shift);
+ }
+ if (base == 0) {
+ return compressed;
+ } else {
+ Register tmp = emitLoadLong(base);
+ emitModRMReg(true, 0x03, tmp.encoding, compressed.encoding);
+ return tmp;
+ }
+ }
+
+ @Override
+ public Register emitIntAdd(Register a, Register b) {
+ emitModRMReg(false, 0x03, a.encoding, b.encoding);
+ return a;
+ }
+
+ private void emitMove(boolean w, Register to, Register from) {
+ if (to != from) {
+ emitModRMReg(w, 0x8B, to.encoding, from.encoding);
+ }
+ }
+
+ @Override
+ public void emitIntRet(Register a) {
+ emitMove(false, AMD64.rax, a); // MOV eax, ...
+ emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
+ code.emitByte(0x58 | AMD64.rbp.encoding); // POP rbp
+ code.emitByte(0xC3); // RET
+ }
+
+ @Override
+ public void emitPointerRet(Register a) {
+ emitMove(true, AMD64.rax, a); // MOV rax, ...
+ emitMove(true, AMD64.rsp, AMD64.rbp); // MOV rsp, rbp
+ code.emitByte(0x58 | AMD64.rbp.encoding); // POP rbp
+ code.emitByte(0xC3); // RET
+ }
+
+ @Override
+ public void emitTrap(DebugInfo info) {
+ recordImplicitException(info);
+ // MOV rax, [0]
+ code.emitByte(0x8B);
+ code.emitByte(0x04);
+ code.emitByte(0x25);
+ code.emitInt(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/sparc/SPARCTestAssembler.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.vm.ci.code.test.sparc;
+
+import jdk.vm.ci.code.CodeCacheProvider;
+import jdk.vm.ci.code.DebugInfo;
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.StackSlot;
+import jdk.vm.ci.code.site.ConstantReference;
+import jdk.vm.ci.code.site.DataSectionReference;
+import jdk.vm.ci.code.test.TestAssembler;
+import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.hotspot.HotSpotConstant;
+import jdk.vm.ci.hotspot.HotSpotForeignCallTarget;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
+import jdk.vm.ci.hotspot.HotSpotVMConfig;
+import jdk.vm.ci.meta.JavaKind;
+import jdk.vm.ci.meta.LIRKind;
+import jdk.vm.ci.meta.VMConstant;
+import jdk.vm.ci.sparc.SPARC;
+import jdk.vm.ci.sparc.SPARCKind;
+
+public class SPARCTestAssembler extends TestAssembler {
+
+ private static final int MASK13 = (1 << 13) - 1;
+
+ public SPARCTestAssembler(CodeCacheProvider codeCache) {
+ super(codeCache, 0, 16, SPARCKind.WORD, SPARC.l0, SPARC.l1, SPARC.l2, SPARC.l3, SPARC.l4, SPARC.l5, SPARC.l6, SPARC.l7);
+ }
+
+ private void emitOp2(Register rd, int op2, int imm22) {
+ code.emitInt((0b00 << 30) | (rd.encoding << 25) | (op2 << 22) | imm22);
+ }
+
+ private void emitOp3(int op, Register rd, int op3, Register rs1, Register rs2) {
+ code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | rs2.encoding);
+ }
+
+ private void emitOp3(int op, Register rd, int op3, Register rs1, int simm13) {
+ code.emitInt((op << 30) | (rd.encoding << 25) | (op3 << 19) | (rs1.encoding << 14) | (1 << 13) | (simm13 & MASK13));
+ }
+
+ private void emitNop() {
+ code.emitInt(1 << 24);
+ }
+
+ @Override
+ public void emitPrologue() {
+ // SAVE sp, -128, sp
+ emitOp3(0b10, SPARC.sp, 0b111100, SPARC.sp, -SPARC.REGISTER_SAFE_AREA_SIZE);
+ setDeoptRescueSlot(newStackSlot(LIRKind.value(SPARCKind.XWORD)));
+ }
+
+ @Override
+ public void emitEpilogue() {
+ HotSpotVMConfig config = HotSpotVMConfig.config();
+ recordMark(config.MARKID_DEOPT_HANDLER_ENTRY);
+ recordCall(new HotSpotForeignCallTarget(config.handleDeoptStub), 4, true, null);
+ code.emitInt(1 << 30); // CALL
+ }
+
+ @Override
+ public HotSpotCompiledCode finish(HotSpotResolvedJavaMethod method) {
+ frameSize += SPARC.REGISTER_SAFE_AREA_SIZE;
+ return super.finish(method);
+ }
+
+ @Override
+ public void emitGrowStack(int size) {
+ emitOp3(0b10, SPARC.sp, 0b000100, SPARC.sp, size); // SUB sp, size, sp
+ }
+
+ @Override
+ public Register emitIntArg0() {
+ return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCallee, JavaKind.Int)[0];
+ }
+
+ @Override
+ public Register emitIntArg1() {
+ return codeCache.getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCallee, JavaKind.Int)[1];
+ }
+
+ @Override
+ public Register emitLoadInt(int c) {
+ Register ret = newRegister();
+ int hi = c >>> 10;
+ int lo = c & ((1 << 10) - 1);
+ if (hi == 0) {
+ emitOp3(0b10, ret, 0b000010, SPARC.g0, lo); // OR g0, lo, ret
+ } else {
+ emitOp2(ret, 0b100, hi); // SETHI hi, ret
+ if (lo != 0) {
+ emitOp3(0b10, ret, 0b000010, ret, lo); // OR ret, lo, ret
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadLong(long c) {
+ if ((c & 0xFFFF_FFFFL) == c) {
+ return emitLoadInt((int) c);
+ } else {
+ DataSectionReference ref = new DataSectionReference();
+ data.align(8);
+ ref.setOffset(data.position());
+ data.emitLong(c);
+ return emitLoadPointer(ref);
+ }
+ }
+
+ private void emitPatchableSethi(Register ret, boolean wide) {
+ int startPos = code.position();
+ emitOp2(ret, 0b100, 0); // SETHI 0, ret
+ if (wide) {
+ // pad for later patching
+ while (code.position() < (startPos + 28)) {
+ emitNop();
+ }
+ }
+ }
+
+ @Override
+ public Register emitLoadFloat(float c) {
+ DataSectionReference ref = new DataSectionReference();
+ data.align(4);
+ ref.setOffset(data.position());
+ data.emitFloat(c);
+
+ Register ptr = newRegister();
+ recordDataPatchInCode(ref);
+ emitPatchableSethi(ptr, true);
+ emitOp3(0b11, SPARC.f0, 0b100000, ptr, 0); // LDF [ptr+0], f0
+ return SPARC.f0;
+ }
+
+ @Override
+ public Register emitLoadPointer(HotSpotConstant c) {
+ Register ret = newRegister();
+ recordDataPatchInCode(new ConstantReference((VMConstant) c));
+
+ emitPatchableSethi(ret, !c.isCompressed());
+ emitOp3(0b10, ret, 0b000010, ret, 0); // OR ret, 0, ret
+
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadPointer(DataSectionReference ref) {
+ Register ret = newRegister();
+ recordDataPatchInCode(ref);
+ emitPatchableSethi(ret, true);
+ emitOp3(0b11, ret, 0b001011, ret, 0); // LDX [ret+0], ret
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadNarrowPointer(DataSectionReference ref) {
+ Register ret = newRegister();
+ recordDataPatchInCode(ref);
+ emitPatchableSethi(ret, true);
+ emitOp3(0b11, ret, 0b000000, ret, 0); // LDUW [ret+0], ret
+ return ret;
+ }
+
+ @Override
+ public Register emitLoadPointer(Register b, int offset) {
+ Register ret = newRegister();
+ emitOp3(0b11, ret, 0b001011, b, offset); // LDX [b+offset], ret
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitIntToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.WORD));
+ // STW a, [fp+offset]
+ emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitLongToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.XWORD));
+ // STX a, [fp+offset]
+ emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitFloatToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.SINGLE));
+ // STF a, [fp+offset]
+ emitOp3(0b11, a, 0b100100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitPointerToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.XWORD));
+ // STX a, [fp+offset]
+ emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
+ return ret;
+ }
+
+ @Override
+ public StackSlot emitNarrowPointerToStack(Register a) {
+ StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.WORD));
+ // STW a, [fp+offset]
+ emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
+ return ret;
+ }
+
+ @Override
+ public Register emitUncompressPointer(Register compressed, long base, int shift) {
+ Register ret;
+ if (shift > 0) {
+ ret = newRegister();
+ emitOp3(0b10, ret, 0b100101, compressed, shift); // SLL compressed, shift, ret
+ } else {
+ ret = compressed;
+ }
+ if (base == 0) {
+ return ret;
+ } else {
+ Register b = emitLoadLong(base);
+ emitOp3(0b10, b, 0b00000, ret, b); // ADD b, ret, b
+ return b;
+ }
+ }
+
+ @Override
+ public Register emitIntAdd(Register a, Register b) {
+ Register ret = newRegister();
+ emitOp3(0b10, ret, 0b00000, a, b); // ADD a, b, ret
+ return ret;
+ }
+
+ private void emitMove(Register to, Register from) {
+ if (to != from) {
+ emitOp3(0b10, to, 0b000010, from, SPARC.g0); // OR from, g0, to
+ }
+ }
+
+ @Override
+ public void emitIntRet(Register a) {
+ emitPointerRet(a);
+ }
+
+ @Override
+ public void emitPointerRet(Register a) {
+ emitMove(SPARC.i0, a);
+ emitOp3(0b10, SPARC.g0, 0b111000, SPARC.i7, 8); // JMPL [i7+8], g0
+ emitOp3(0b10, SPARC.g0, 0b111101, SPARC.g0, SPARC.g0); // RESTORE g0, g0, g0
+ }
+
+ @Override
+ public void emitTrap(DebugInfo info) {
+ recordImplicitException(info);
+ emitOp3(0b11, SPARC.g0, 0b001011, SPARC.g0, 0); // LDX [g0+0], g0
+ }
+
+ @Override
+ public DataSectionReference emitDataItem(HotSpotConstant c) {
+ if (c.isCompressed()) {
+ data.align(4);
+ } else {
+ data.align(8);
+ }
+ return super.emitDataItem(c);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/onSpinWait/TestOnSpinWait.java Tue Apr 12 14:17:42 2016 -0400
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2016 Azul Systems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test TestOnSpinWait
+ * @summary (x86 only) checks that java.lang.Thread.onSpinWait is intrinsified
+ * @bug 8147844
+ * @library /testlibrary
+ * @requires os.arch=="x86" | os.arch=="amd64" | os.arch=="x86_64"
+ * @run main TestOnSpinWait
+ */
+
+import java.lang.invoke.*;
+import jdk.test.lib.*;
+import static jdk.test.lib.Asserts.*;
+
+public class TestOnSpinWait {
+
+ public static void main(String[] args) throws Exception {
+
+ // Test C1 compiler
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+IgnoreUnrecognizedVMOptions", "-showversion",
+ "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xbatch",
+ "-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+PrintInlining", "TestOnSpinWait$Launcher");
+
+ OutputAnalyzer analyzer = new OutputAnalyzer(pb.start());
+
+ analyzer.shouldHaveExitValue(0);
+
+ // The test is applicable only to C1 (present in Server VM).
+ analyzer.shouldContain("java.lang.Thread::onSpinWait (1 bytes) intrinsic");
+
+ // Test C2 compiler
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+IgnoreUnrecognizedVMOptions", "-showversion",
+ "-XX:-TieredCompilation", "-Xbatch",
+ "-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+PrintInlining", "TestOnSpinWait$Launcher");
+
+ analyzer = new OutputAnalyzer(pb.start());
+
+ analyzer.shouldHaveExitValue(0);
+
+ // The test is applicable only to C2 (present in Server VM).
+ if (analyzer.getStderr().contains("Server VM")) {
+ analyzer.shouldContain("java.lang.Thread::onSpinWait (1 bytes) (intrinsic)");
+ }
+ }
+
+ static class Launcher {
+
+ public static void main(final String[] args) throws Exception {
+ int end = 20_000;
+
+ for (int i=0; i < end; i++) {
+ test();
+ }
+ }
+ static void test() {
+ java.lang.Thread.onSpinWait();
+ }
+ }
+}
--- a/hotspot/test/compiler/tiered/ConstantGettersTransitionsTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/tiered/ConstantGettersTransitionsTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -31,9 +31,9 @@
* @modules java.base/jdk.internal.misc
* java.management
* @build TransitionsTestExecutor ConstantGettersTransitionsTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm/timeout=240 -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -XX:+TieredCompilation
+ * -XX:+WhiteBoxAPI -XX:+TieredCompilation -XX:-UseCounterDecay
* -XX:CompileCommand=compileonly,ConstantGettersTestCase$TrivialMethods::*
* TransitionsTestExecutor ConstantGettersTransitionsTest
* @summary Test the correctness of compilation level transitions for constant getters methods
--- a/hotspot/test/compiler/tiered/LevelTransitionTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/tiered/LevelTransitionTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -38,7 +38,7 @@
* @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm/timeout=240 -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -XX:+TieredCompilation
- * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::*
* -XX:CompileCommand=compileonly,ExtendedTestCase$CompileMethodHolder::*
* TransitionsTestExecutor LevelTransitionTest
* @summary Test the correctness of compilation level transitions for different methods
@@ -80,7 +80,7 @@
/**
* Makes and verifies transitions between compilation levels
*/
- protected void checkTransitions() {
+ protected void checkTransitions() throws Exception {
checkNotCompiled();
boolean finish = false;
while (!finish) {
--- a/hotspot/test/compiler/tiered/NonTieredLevelsTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/tiered/NonTieredLevelsTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,11 +29,11 @@
* @library /testlibrary /test/lib /compiler/whitebox /
* @modules java.management
* @build NonTieredLevelsTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:-TieredCompilation
- * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
+ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::*
* NonTieredLevelsTest
* @summary Verify that only one level can be used
* @author igor.ignatyev@oracle.com
--- a/hotspot/test/compiler/tiered/TieredLevelsTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/tiered/TieredLevelsTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -28,11 +28,11 @@
* @library /testlibrary /test/lib /compiler/whitebox /
* @modules java.management
* @build TieredLevelsTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+TieredCompilation
- * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
+ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::*
* TieredLevelsTest
* @summary Verify that all levels < 'TieredStopAtLevel' can be used
* @author igor.ignatyev@oracle.com
--- a/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java Tue Apr 12 14:17:42 2016 -0400
@@ -33,6 +33,7 @@
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.vm.annotation
* java.base/jdk.internal.misc
+ *
* @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions
* -Xbatch -XX:-TieredCompilation
* -XX:+FoldStableValues
@@ -63,7 +64,6 @@
import jdk.internal.misc.Unsafe;
import java.io.IOException;
-import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
--- a/hotspot/test/compiler/unsafe/UnsafeGetStableArrayElement.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/unsafe/UnsafeGetStableArrayElement.java Tue Apr 12 14:17:42 2016 -0400
@@ -26,24 +26,28 @@
/*
* @test
* @summary tests on constant folding of unsafe get operations from stable arrays
- * @library /testlibrary /test/lib
- * @ignore 8151137
+ * @library /testlibrary
*
* @requires vm.flavor != "client"
*
+ * @modules java.base/jdk.internal.vm.annotation
+ * java.base/jdk.internal.misc
+
* @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions
* -Xbatch -XX:-TieredCompilation
* -XX:+FoldStableValues
* -XX:CompileCommand=dontinline,*Test::test*
- * UnsafeGetStableArrayElement
+ * compiler.unsafe.UnsafeGetStableArrayElement
*/
+package compiler.unsafe;
+
import jdk.internal.misc.Unsafe;
import jdk.internal.vm.annotation.Stable;
import java.util.concurrent.Callable;
+import jdk.test.lib.Platform;
import static jdk.internal.misc.Unsafe.*;
import static jdk.test.lib.Asserts.*;
-import static jdk.test.lib.Platform;
public class UnsafeGetStableArrayElement {
@Stable static final boolean[] STABLE_BOOLEAN_ARRAY = new boolean[16];
@@ -219,13 +223,7 @@
Setter.reset();
}
- public static void main(String[] args) throws Exception {
- if (Platform.isServer()) {
- test();
- }
- }
-
- static void test() throws Exception {
+ static void testUnsafeAccess() throws Exception {
// boolean[], aligned accesses
testMatched( Test::testZ_Z, Test::changeZ);
testMismatched(Test::testZ_B, Test::changeZ);
@@ -329,4 +327,11 @@
run(Test::testL_I);
run(Test::testL_F);
}
+
+ public static void main(String[] args) throws Exception {
+ if (Platform.isServer()) {
+ testUnsafeAccess();
+ }
+ System.out.println("TEST PASSED");
+ }
}
--- a/hotspot/test/compiler/whitebox/ClearMethodStateTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/ClearMethodStateTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -31,9 +31,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build ClearMethodStateTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ClearMethodStateTest
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+PrintCompilation -XX:-UseCounterDecay ClearMethodStateTest
* @summary testing of WB::clearMethodState()
* @author igor.ignatyev@oracle.com
*/
@@ -41,8 +41,8 @@
public static void main(String[] args) throws Exception {
String directive =
- "[{ match:\"*SimpleTestCase$Helper.*\", BackgroundCompilation: false }, " +
- " { match:\"*.*\", inline:\"-*SimpleTestCase$Helper.*\"}]";
+ "[{ match:\"*SimpleTestCaseHelper.*\", BackgroundCompilation: false }, " +
+ " { match:\"*.*\", inline:\"-*SimpleTestCaseHelper.*\"}]";
if (WHITE_BOX.addCompilerDirective(directive) != 2) {
throw new RuntimeException("Could not add directive");
}
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -24,6 +24,7 @@
import sun.hotspot.WhiteBox;
import sun.hotspot.code.NMethod;
+
import java.lang.reflect.Executable;
import java.util.Objects;
import java.util.concurrent.Callable;
@@ -58,6 +59,8 @@
/** Value of {@code -XX:BackgroundCompilation} */
protected static final boolean BACKGROUND_COMPILATION
= Boolean.valueOf(getVMOption("BackgroundCompilation", "true"));
+ protected static final boolean USE_COUNTER_DECAY
+ = Boolean.valueOf(getVMOption("UseCounterDecay", "true"));
/** Value of {@code -XX:TieredCompilation} */
protected static final boolean TIERED_COMPILATION
= Boolean.valueOf(getVMOption("TieredCompilation", "false"));
@@ -370,7 +373,10 @@
* @return accumulated result
* @see #compile(int)
*/
- protected final int compile() {
+ protected final int compile() throws Exception {
+ if (USE_COUNTER_DECAY) {
+ throw new Exception("Tests using compile method must turn off counter decay for reliability");
+ }
if (testCase.isOsr()) {
return compile(1);
} else {
--- a/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,9 +29,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build DeoptimizeAllTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* DeoptimizeAllTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* DeoptimizeAllTest
* @summary testing of WB::deoptimizeAll()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,15 +29,15 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build DeoptimizeFramesTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -Xmixed
+ * -XX:+WhiteBoxAPI -Xmixed -XX:-UseCounterDecay
* -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method
* -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom -XX:-DeoptimizeALot
* DeoptimizeFramesTest true
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -Xmixed
+ * -XX:+WhiteBoxAPI -Xmixed -XX:-UseCounterDecay
* -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method
* -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom -XX:-DeoptimizeALot
* DeoptimizeFramesTest false
--- a/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,9 +29,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build DeoptimizeMethodTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* DeoptimizeMethodTest
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* DeoptimizeMethodTest
* @summary testing of WB::deoptimizeMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,9 +29,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build EnqueueMethodForCompilationTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI EnqueueMethodForCompilationTest
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+PrintCompilation -XX:-UseCounterDecay EnqueueMethodForCompilationTest
* @summary testing of WB::enqueueMethodForCompilation()
* @author igor.ignatyev@oracle.com
*/
@@ -39,8 +39,8 @@
public static void main(String[] args) throws Exception {
String directive =
- "[{ match:\"*SimpleTestCase$Helper.*\", BackgroundCompilation: false }, " +
- " { match:\"*.*\", inline:\"-*SimpleTestCase$Helper.*\"}]";
+ "[{ match:\"*SimpleTestCaseHelper.*\", BackgroundCompilation: false }, " +
+ " { match:\"*.*\", inline:\"-*SimpleTestCaseHelper.*\"}]";
if (WHITE_BOX.addCompilerDirective(directive) != 2) {
throw new RuntimeException("Could not add directive");
}
@@ -86,7 +86,10 @@
checkNotCompiled();
WHITE_BOX.clearMethodState(method);
- WHITE_BOX.enqueueMethodForCompilation(method, compLevel, bci);
+ if (!WHITE_BOX.enqueueMethodForCompilation(method, compLevel, bci)) {
+ throw new RuntimeException(method
+ + " could not be enqueued for compilation");
+ }
checkCompiled();
deoptimize();
checkNotCompiled();
--- a/hotspot/test/compiler/whitebox/ForceNMethodSweepTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/ForceNMethodSweepTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -34,16 +34,16 @@
/*
* @test
- * @bug 8059624 8064669
+ * @bug 8059624 8064669 8153265
* @library /testlibrary /test/lib /
* @modules java.management
* @build ForceNMethodSweepTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:-TieredCompilation -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
- * -XX:-BackgroundCompilation ForceNMethodSweepTest
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::*
+ * -XX:-BackgroundCompilation -XX:-UseCounterDecay ForceNMethodSweepTest
* @summary testing of WB::forceNMethodSweep
*/
public class ForceNMethodSweepTest extends CompilerWhiteBoxTest {
@@ -60,6 +60,12 @@
@Override
protected void test() throws Exception {
+ // prime the asserts: get their bytecodes loaded, any lazy computation
+ // resolved, and executed once
+ Asserts.assertGT(1, 0, "message");
+ Asserts.assertLTE(0, 0, "message");
+ Asserts.assertLT(-1, 0, "message");
+
checkNotCompiled();
guaranteedSweep();
int usage = getTotalUsage();
--- a/hotspot/test/compiler/whitebox/GetNMethodTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/GetNMethodTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -33,9 +33,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build GetNMethodTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* GetNMethodTest
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* GetNMethodTest
* @summary testing of WB::getNMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -27,12 +27,13 @@
* @library /testlibrary /test/lib /
* @modules java.base/jdk.internal.misc
* java.management
- * @build jdk.test.lib.* sun.hotspot.WhiteBox
+ * @build jdk.test.lib.*
+ * sun.hotspot.WhiteBox
* @build IsMethodCompilableTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main ClassFileInstaller jdk.test.lib.Platform
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* IsMethodCompilableTest
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * jdk.test.lib.Platform
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:-UseCounterDecay -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* IsMethodCompilableTest
* @summary testing of WB::isMethodCompilable()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/LockCompilationTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/LockCompilationTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,7 +29,7 @@
* @build LockCompilationTest
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI LockCompilationTest
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-UseCounterDecay LockCompilationTest
* @summary testing of WB::lock/unlockCompilation()
*/
@@ -47,10 +47,10 @@
// This case waits for 5 seconds and verifies that the method hasn't been
// compiled during that time. Only do that for one of the test cases.
- // Only compile SimpleTestCase$Helper.method and exclude all other to ensure no
+ // Only compile SimpleTestCaseHelper.method and exclude all other to ensure no
// contention on the compile queue causes problems.
String directive =
- "[{ match:\"*SimpleTestCase$Helper.method\", Exclude:false}, " +
+ "[{ match:\"*SimpleTestCaseHelper.method\", Exclude:false}, " +
" { match:\"*.*\", Exclude:true}]";
if (WHITE_BOX.addCompilerDirective(directive) != 2) {
throw new RuntimeException("Could not add directive");
--- a/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -29,9 +29,9 @@
* @library /testlibrary /test/lib /
* @modules java.management
* @build MakeMethodNotCompilableTest
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmixed MakeMethodNotCompilableTest
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmixed -XX:-UseCounterDecay MakeMethodNotCompilableTest
* @summary testing of WB::makeMethodNotCompilable()
* @author igor.ignatyev@oracle.com
*/
@@ -39,8 +39,8 @@
private int bci;
public static void main(String[] args) throws Exception {
String directive =
- "[{ match:\"*SimpleTestCase$Helper.*\", BackgroundCompilation: false }, " +
- " { match:\"*.*\", inline:\"-*SimpleTestCase$Helper.*\"}]";
+ "[{ match:\"*SimpleTestCaseHelper.*\", BackgroundCompilation: false }, " +
+ " { match:\"*.*\", inline:\"-*SimpleTestCaseHelper.*\"}]";
if (WHITE_BOX.addCompilerDirective(directive) != 2) {
throw new RuntimeException("Could not add directive");
}
@@ -227,7 +227,7 @@
return false;
}
- private int getBci() {
+ private int getBci() throws Exception {
compile();
checkCompiled();
int result = WHITE_BOX.getMethodEntryBci(method);
--- a/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -31,7 +31,7 @@
* @build SetDontInlineMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* SetDontInlineMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* SetDontInlineMethodTest
* @summary testing of WB::testSetDontInlineMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Tue Apr 12 14:17:42 2016 -0400
@@ -31,7 +31,7 @@
* @build SetForceInlineMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* SetForceInlineMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCaseHelper::* SetForceInlineMethodTest
* @summary testing of WB::testSetForceInlineMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/SimpleTestCase.java Mon Apr 11 20:38:38 2016 -0700
+++ b/hotspot/test/compiler/whitebox/SimpleTestCase.java Tue Apr 12 14:17:42 2016 -0400
@@ -31,18 +31,17 @@
public enum SimpleTestCase implements CompilerWhiteBoxTest.TestCase {
/** constructor test case */
- CONSTRUCTOR_TEST(Helper.CONSTRUCTOR, Helper.CONSTRUCTOR_CALLABLE, false),
+ CONSTRUCTOR_TEST(SimpleTestCaseHelper.CONSTRUCTOR, SimpleTestCaseHelper.CONSTRUCTOR_CALLABLE, false),
/** method test case */
- METHOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false),
+ METHOD_TEST(SimpleTestCaseHelper.METHOD, SimpleTestCaseHelper.METHOD_CALLABLE, false),
/** static method test case */
- STATIC_TEST(Helper.STATIC, Helper.STATIC_CALLABLE, false),
+ STATIC_TEST(SimpleTestCaseHelper.STATIC, SimpleTestCaseHelper.STATIC_CALLABLE, false),
/** OSR constructor test case */
- OSR_CONSTRUCTOR_TEST(Helper.OSR_CONSTRUCTOR,
- Helper.OSR_CONSTRUCTOR_CALLABLE, true),
+ OSR_CONSTRUCTOR_TEST(SimpleTestCaseHelper.OSR_CONSTRUCTOR, SimpleTestCaseHelper.OSR_CONSTRUCTOR_CALLABLE, true),
/** OSR method test case */
- OSR_METHOD_TEST(Helper.OSR_METHOD, Helper.OSR_METHOD_CALLABLE, true),
+ OSR_METHOD_TEST(SimpleTestCaseHelper.OSR_METHOD, SimpleTestCaseHelper.OSR_METHOD_CALLABLE, true),
/** OSR static method test case */
- OSR_STATIC_TEST(Helper.OSR_STATIC, Helper.OSR_STATIC_CALLABLE, true);
+ OSR_STATIC_TEST(SimpleTestCaseHelper.OSR_STATIC, SimpleTestCaseHelper.OSR_STATIC_CALLABLE, true);
private final Executable executable;
private final Callable<Integer> callable;
@@ -69,20 +68,21 @@
public boolean isOsr() {
return isOsr;
}
+}
- private static class Helper {
+ class SimpleTestCaseHelper {
- private static final Callable<Integer> CONSTRUCTOR_CALLABLE
+ public static final Callable<Integer> CONSTRUCTOR_CALLABLE
= new Callable<Integer>() {
@Override
public Integer call() throws Exception {
- return new Helper(1337).hashCode();
+ return new SimpleTestCaseHelper(1337).hashCode();
}
};
- private static final Callable<Integer> METHOD_CALLABLE
+ public static final Callable<Integer> METHOD_CALLABLE
= new Callable<Integer>() {
- private final Helper helper = new Helper();
+ private final SimpleTestCaseHelper helper = new SimpleTestCaseHelper();
@Override
public Integer call() throws Exception {
@@ -90,7 +90,7 @@
}
};
- private static final Callable<Integer> STATIC_CALLABLE
+ public static final Callable<Integer> STATIC_CALLABLE
= new Callable<Integer>() {
@Override
public Integer call() throws Exception {
@@ -98,17 +98,17 @@
}
};
- private static final Callable<Integer> OSR_CONSTRUCTOR_CALLABLE
+ public static final Callable<Integer> OSR_CONSTRUCTOR_CALLABLE
= new Callable<Integer>() {
@Override
public Integer call() throws Exception {
- return new Helper(null, CompilerWhiteBoxTest.BACKEDGE_THRESHOLD).hashCode();
+ return new SimpleTestCaseHelper(null, CompilerWhiteBoxTest.BACKEDGE_THRESHOLD).hashCode();
}
};
- private static final Callable<Integer> OSR_METHOD_CALLABLE
+ public static final Callable<Integer> OSR_METHOD_CALLABLE
= new Callable<Integer>() {
- private final Helper helper = new Helper();
+ private final SimpleTestCaseHelper helper = new SimpleTestCaseHelper();
@Override
public Integer call() throws Exception {
@@ -116,7 +116,7 @@
}
};
- private static final Callable<Integer> OSR_STATIC_CALLABLE
+ public static final Callable<Integer> OSR_STATIC_CALLABLE
= new Callable<Integer>() {
@Override
public Integer call() throws Exception {
@@ -124,22 +124,22 @@
}
};
- private static final Constructor CONSTRUCTOR;
- private static final Constructor OSR_CONSTRUCTOR;
- private static final Method METHOD;
- private static final Method STATIC;
- private static final Method OSR_METHOD;
- private static final Method OSR_STATIC;
+ public static final Constructor CONSTRUCTOR;
+ public static final Constructor OSR_CONSTRUCTOR;
+ public static final Method METHOD;
+ public static final Method STATIC;
+ public static final Method OSR_METHOD;
+ public static final Method OSR_STATIC;
static {
try {
- CONSTRUCTOR = Helper.class.getDeclaredConstructor(int.class);
+ CONSTRUCTOR = SimpleTestCaseHelper.class.getDeclaredConstructor(int.class);
} catch (NoSuchMethodException | SecurityException e) {
throw new RuntimeException(
"exception on getting method Helper.<init>(int)", e);
}
try {
- OSR_CONSTRUCTOR = Helper.class.getDeclaredConstructor(
+ OSR_CONSTRUCTOR = SimpleTestCaseHelper.class.getDeclaredConstructor(
Object.class, long.class);
} catch (NoSuchMethodException | SecurityException e) {
throw new RuntimeException(
@@ -153,7 +153,7 @@
private static Method getMethod(String name, Class<?>... parameterTypes) {
try {
- return Helper.class.getDeclaredMethod(name, parameterTypes);
+ return SimpleTestCaseHelper.class.getDeclaredMethod(name, parameterTypes);
} catch (NoSuchMethodException | SecurityException e) {
throw new RuntimeException(
"exception on getting method Helper." + name, e);
@@ -195,7 +195,7 @@
*/
private static int warmup(Method m) throws Exception {
waitAndDeoptimize(m);
- Helper helper = new Helper();
+ SimpleTestCaseHelper helper = new SimpleTestCaseHelper();
int result = 0;
for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
result += (int)m.invoke(helper, 1);
@@ -254,12 +254,12 @@
private final int x;
// for method and OSR method test case
- public Helper() {
+ public SimpleTestCaseHelper() {
x = 0;
}
// for OSR constructor test case
- private Helper(Object o, long limit) throws Exception {
+ private SimpleTestCaseHelper(Object o, long limit) throws Exception {
int result = 0;
if (limit != 1) {
result = warmup(OSR_CONSTRUCTOR);
@@ -272,7 +272,7 @@
}
// for constructor test case
- private Helper(int x) {
+ private SimpleTestCaseHelper(int x) {
this.x = x;
}
@@ -281,4 +281,4 @@
return x;
}
}
-}
+