address StubGenerator::generate_libmTan()

in src/hotspot/cpu/x86/stubGenerator_x86_64_tan.cpp [457:1029]


address StubGenerator::generate_libmTan() {
  StubId stub_id = StubId::stubgen_dtan_id;
  StubCodeMark mark(this, stub_id);
  address start = __ pc();

  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_4;

  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_4      = (address)_PI_4_tan;
  address QQ_2      = (address)_QQ_2_tan;

  __ enter(); // required for proper stackwalking of RuntimeStub frame

#ifdef _WIN64
  __ push_ppx(rsi);
  __ push_ppx(rdi);
#endif

  __ push_ppx(rbx);
  __ subq(rsp, 16);
  __ movsd(Address(rsp, 8), xmm0);

  __ bind(B1_2);
  __ pextrw(rax, xmm0, 3);
  __ andl(rax, 32767);
  __ subl(rax, 16314);
  __ cmpl(rax, 270);
  __ jcc(Assembler::above, L_2TAG_PACKET_0_0_1);
  __ movdqu(xmm5, ExternalAddress(ONEHALF), rbx /*rscratch*/);    //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
  __ movdqu(xmm6, ExternalAddress(MUL16), rbx /*rscratch*/);    //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
  __ unpcklpd(xmm0, xmm0);
  __ movdqu(xmm4, ExternalAddress(sign_mask), rbx /*rscratch*/);    //0x00000000UL, 0x80000000UL, 0x00000000UL, 0x80000000UL
  __ andpd(xmm4, xmm0);
  __ movdqu(xmm1, ExternalAddress(PI32INV), rbx /*rscratch*/);    //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
  __ mulpd(xmm1, xmm0);
  __ por(xmm5, xmm4);
  __ addpd(xmm1, xmm5);
  __ movdqu(xmm7, xmm1);
  __ unpckhpd(xmm7, xmm7);
  __ cvttsd2sil(rdx, xmm7);
  __ cvttpd2dq(xmm1, xmm1);
  __ cvtdq2pd(xmm1, xmm1);
  __ mulpd(xmm1, xmm6);
  __ movdqu(xmm3, ExternalAddress(P_1), rbx /*rscratch*/);    //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
  __ movq(xmm5, ExternalAddress(QQ_2), rbx /*rscratch*/);    //0x676733afUL, 0x3d32e7b9UL
  __ addq(rdx, 469248);
  __ movdqu(xmm4, ExternalAddress(P_2), rbx /*rscratch*/);    //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), rbx /*rscratch*/);    //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), rbx /*rscratch*/);    //0x00000000UL, 0x3ff00000UL
  __ shlq(rdx, 4);
  __ lea(rax, ExternalAddress(Ctable));
  __ andpd(xmm5, ExternalAddress(MASK_35), rbx /*rscratch*/);    //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), rbx /*rscratch*/);    //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(rax, xmm0, 3);
  __ movl(rdx, rax);
  __ andl(rax, 32752);
  __ jcc(Assembler::equal, L_2TAG_PACKET_2_0_1);
  __ andl(rdx, 32767);
  __ cmpl(rdx, 15904);
  __ jcc(Assembler::below, L_2TAG_PACKET_3_0_1);
  __ movdqu(xmm2, xmm0);
  __ movdqu(xmm3, xmm0);
  __ movq(xmm1, ExternalAddress(Q_11), rbx /*rscratch*/);    //0xb8fe4d77UL, 0x3f82609aUL
  __ mulsd(xmm2, xmm0);
  __ mulsd(xmm3, xmm2);
  __ mulsd(xmm1, xmm2);
  __ addsd(xmm1, ExternalAddress(Q_9), rbx /*rscratch*/);    //0xbf847a43UL, 0x3f9664a0UL
  __ mulsd(xmm1, xmm2);
  __ addsd(xmm1, ExternalAddress(Q_7), rbx /*rscratch*/);    //0x52c4c8abUL, 0x3faba1baUL
  __ mulsd(xmm1, xmm2);
  __ addsd(xmm1, ExternalAddress(Q_5), rbx /*rscratch*/);    //0x11092746UL, 0x3fc11111UL
  __ mulsd(xmm1, xmm2);
  __ addsd(xmm1, ExternalAddress(Q_3), rbx /*rscratch*/);    //0x55555612UL, 0x3fd55555UL
  __ mulsd(xmm1, xmm3);
  __ addsd(xmm0, xmm1);
  __ jmp(B1_4);

  __ bind(L_2TAG_PACKET_3_0_1);
  __ movq(xmm3, ExternalAddress(TWO_POW_55), rbx /*rscratch*/);    //0x00000000UL, 0x43600000UL
  __ mulsd(xmm3, xmm0);
  __ addsd(xmm0, xmm3);
  __ mulsd(xmm0, ExternalAddress(TWO_POW_M55), rbx /*rscratch*/);    //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(rax, xmm0, 3);
  __ andl(rax, 32752);
  __ cmpl(rax, 32752);
  __ jcc(Assembler::equal, L_2TAG_PACKET_4_0_1);
  __ pextrw(rcx, xmm0, 3);
  __ andl(rcx, 32752);
  __ subl(rcx, 16224);
  __ shrl(rcx, 7);
  __ andl(rcx, 65532);
  __ lea(r11, ExternalAddress(PI_INV_TABLE));
  __ addq(rcx, r11);
  __ movdq(rax, xmm0);
  __ movl(r10, Address(rcx, 20));
  __ movl(r8, Address(rcx, 24));
  __ movl(rdx, rax);
  __ shrq(rax, 21);
  __ orl(rax, INT_MIN);
  __ shrl(rax, 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(rax, 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(rcx, rcx);
  __ addl(rcx, rcx);
  __ addl(rcx, rcx);
  __ addl(rcx, 19);
  __ movl(rsi, 32768);
  __ andl(rsi, rbx);
  __ shrl(rbx, 4);
  __ andl(rbx, 2047);
  __ subl(rbx, 1023);
  __ subl(rcx, rbx);
  __ addq(r9, rdx);
  __ movl(rdx, rcx);
  __ addl(rdx, 32);
  __ cmpl(rcx, 0);
  __ jcc(Assembler::less, L_2TAG_PACKET_5_0_1);
  __ negl(rcx);
  __ addl(rcx, 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(rcx, 29);
  __ subl(rcx, r11);
  __ jcc(Assembler::lessEqual, L_2TAG_PACKET_11_0_1);
  __ shlq(r9);
  __ movq(rax, r10);
  __ shlq(r10);
  __ addl(rdx, rcx);
  __ negl(rcx);
  __ addl(rcx, 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(rdx, 4);
  __ negl(rdx);
  __ addl(rdx, 16368);
  __ orl(rdx, rsi);
  __ xorl(rdx, rbx);
  __ pinsrw(xmm4, rdx, 3);
  __ movq(xmm2, ExternalAddress(PI_4),     rbx /*rscratch*/);    //0x00000000UL, 0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
  __ movq(xmm7, ExternalAddress(PI_4 + 8), rbx /*rscratch*/);    //0x3fe921fbUL, 0x4611a626UL, 0x3e85110bUL
  __ xorpd(xmm5, xmm5);
  __ subl(rdx, 1008);
  __ pinsrw(xmm5, rdx, 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(rax, rdi);
  __ addsd(xmm7, xmm3);
  __ movdqu(xmm2, xmm0);
  __ addsd(xmm0, xmm7);
  __ subsd(xmm2, xmm0);
  __ addsd(xmm7, xmm2);
  __ movdqu(xmm1, ExternalAddress(PI32INV), rbx /*rscratch*/);    //0x6dc9c883UL, 0x3fe45f30UL, 0x6dc9c883UL, 0x40245f30UL
  if (VM_Version::supports_sse3()) {
    __ movddup(xmm0, xmm0);
  } else {
    __ movlhps(xmm0, xmm0);
  }
  __ movdqu(xmm4, ExternalAddress(sign_mask), rbx /*rscratch*/);    //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), rbx /*rscratch*/);    //0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL
  __ movdqu(xmm6, ExternalAddress(MUL16), rbx /*rscratch*/);    //0x00000000UL, 0x40300000UL, 0x00000000UL, 0x3ff00000UL
  __ por(xmm5, xmm4);
  __ addpd(xmm1, xmm5);
  __ movdqu(xmm5, xmm1);
  __ unpckhpd(xmm5, xmm5);
  __ cvttsd2sil(rdx, xmm5);
  __ cvttpd2dq(xmm1, xmm1);
  __ cvtdq2pd(xmm1, xmm1);
  __ mulpd(xmm1, xmm6);
  __ movdqu(xmm3, ExternalAddress(P_1), rbx /*rscratch*/);    //0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL
  __ movq(xmm5, ExternalAddress(QQ_2), rbx /*rscratch*/);    //0x676733afUL, 0x3d32e7b9UL
  __ shll(rax, 4);
  __ addl(rdx, 469248);
  __ movdqu(xmm4, ExternalAddress(P_2), rbx /*rscratch*/);    //0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL
  __ mulpd(xmm3, xmm1);
  __ addl(rdx, rax);
  __ andl(rdx, 31);
  __ mulsd(xmm5, xmm1);
  __ movl(rcx, rdx);
  __ mulpd(xmm4, xmm1);
  __ shll(rcx, 1);
  __ subpd(xmm0, xmm3);
  __ mulpd(xmm1, ExternalAddress(P_3), rbx /*rscratch*/);    //0x3707344aUL, 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL
  __ addl(rdx, rcx);
  __ shll(rcx, 2);
  __ addl(rdx, rcx);
  __ addsd(xmm5, xmm0);
  __ movdqu(xmm2, xmm0);
  __ subpd(xmm0, xmm4);
  __ movq(xmm6, ExternalAddress(ONE), rbx /*rscratch*/);    //0x00000000UL, 0x3ff00000UL
  __ shll(rdx, 4);
  __ lea(rax, ExternalAddress(Ctable));
  __ andpd(xmm5, ExternalAddress(MASK_35), rbx /*rscratch*/);    //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), rbx /*rscratch*/);    //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(rdx, 64);
  __ movq(r9, r10);
  __ movq(r10, r8);
  __ movl(r8, 0);
  __ cmpq(r9, 0);
  __ jcc(Assembler::notEqual, L_2TAG_PACKET_10_0_1);
  __ addl(rdx, 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(rcx);
  __ shrq(r10);
  __ movq(rax, r9);
  __ shrq(r9);
  __ subl(rdx, rcx);
  __ negl(rcx);
  __ addl(rcx, 64);
  __ shlq(rax);
  __ orq(r10, rax);
  __ jmp(L_2TAG_PACKET_12_0_1);

  __ bind(L_2TAG_PACKET_5_0_1);
  __ notl(rcx);
  __ 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), rbx /*rscratch*/);    //0x00000000UL, 0x80000000UL
  __ movq(Address(rsp, 0), xmm0);

  __ bind(L_2TAG_PACKET_14_0_1);

  __ bind(B1_4);
  __ addq(rsp, 16);
  __ pop_ppx(rbx);

#ifdef _WIN64
  __ pop_ppx(rdi);
  __ pop_ppx(rsi);
#endif

  __ leave(); // required for proper stackwalking of RuntimeStub frame
  __ ret(0);

  return start;
}