484 ATTRIBUTE_ALIGNED(8) juint _TWO_POW_55_tan[] =
485 {
486 0x00000000UL, 0x43600000UL
487 };
488
489 ATTRIBUTE_ALIGNED(4) juint _TWO_POW_M55_tan[] =
490 {
491 0x00000000UL, 0x3c800000UL
492 };
493
494 ATTRIBUTE_ALIGNED(4) juint _NEG_ZERO_tan[] =
495 {
496 0x00000000UL, 0x80000000UL
497 };
498
499 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) {
500
501 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;
502 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;
503 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;
504 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;
505
506 address ONEHALF = (address)_ONEHALF_tan;
507 address MUL16 = (address)_MUL16;
508 address sign_mask = (address)_sign_mask_tan;
509 address PI32INV = (address)_PI32INV_tan;
510 address P_1 = (address)_P_1_tan;
511 address P_2 = (address)_P_2_tan;
512 address P_3 = (address)_P_3_tan;
513 address Ctable = (address)_Ctable_tan;
514 address MASK_35 = (address)_MASK_35_tan;
515 address Q_11 = (address)_Q_11_tan;
516 address Q_9 = (address)_Q_9_tan;
517 address Q_7 = (address)_Q_7_tan;
518 address Q_5 = (address)_Q_5_tan;
519 address Q_3 = (address)_Q_3_tan;
520 address PI_INV_TABLE = (address)_PI_INV_TABLE_tan;
521 address PI_4 = (address)_PI_4_tan;
522 address QQ_2 = (address)_QQ_2_tan;
523 address ONE = (address)_ONE_tan;
524 address TWO_POW_55 = (address)_TWO_POW_55_tan;
1072 0x3ffe, 0x0000, 0xb70f, 0xd068, 0xa6ce, 0xe9dd, 0xbff9, 0x0000, 0x820f, 0x51ce,
1073 0x7d76, 0x9bff, 0x3ff3, 0x0000
1074 };
1075
1076 ATTRIBUTE_ALIGNED(16) jushort _GP[] =
1077 {
1078 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffd, 0x0000, 0xb62f, 0x0b60, 0x60b6, 0xb60b,
1079 0xbff9, 0x0000, 0xdfa7, 0x08aa, 0x55e0, 0x8ab3, 0xbff6, 0x0000, 0x85a0, 0xa819,
1080 0xbc99, 0xddeb, 0xbff2, 0x0000, 0x7065, 0x6a37, 0x795f, 0xb354, 0xbfef, 0x0000,
1081 0xa8f9, 0x83f1, 0x2ec8, 0x9140, 0xbfec, 0x0000, 0xf3ca, 0x8c96, 0x8e0b, 0xeb6d,
1082 0xbfe8, 0x0000, 0x355b, 0xd910, 0x67c9, 0xbed3, 0xbfe5, 0x0000, 0x286b, 0xb49e,
1083 0xb854, 0x9a98, 0xbfe2, 0x0000, 0x0871, 0x1a2f, 0x6477, 0xfcc4, 0xbfde, 0x0000,
1084 0xa559, 0x1da9, 0xaed2, 0xba76, 0xbfdb, 0x0000, 0x00a3, 0x7fea, 0x9bc3, 0xf205,
1085 0xbfd8, 0x0000
1086 };
1087
1088 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) {
1089 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;
1090 Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
1091 Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
1092 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;
1093
1094 assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
1095
1096 address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr();
1097 address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr();
1098 address Pi4x3 = StubRoutines::x86::_Pi4x3_addr();
1099 address Pi4x4 = StubRoutines::x86::_Pi4x4_addr();
1100 address ones = StubRoutines::x86::_ones_addr();
1101 address TP = (address)_TP;
1102 address TQ = (address)_TQ;
1103 address GP = (address)_GP;
1104
1105 bind(B1_1);
1106 push(ebp);
1107 movl(ebp, esp);
1108 andl(esp, -64);
1109 push(esi);
1110 push(edi);
1111 push(ebx);
1112 subl(esp, 52);
1949 0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
1950 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
1951 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x6dc9c883UL, 0x3fe45f30UL,
1952 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x43780000UL, 0x00000000UL,
1953 0x43380000UL, 0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL,
1954 0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL, 0x3707344aUL,
1955 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL, 0x00000000UL, 0x80000000UL,
1956 0x00000000UL, 0x80000000UL, 0x676733afUL, 0x3d32e7b9UL, 0x00000000UL,
1957 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
1958 0x00000000UL, 0x7ff00000UL, 0x00000000UL, 0x00000000UL, 0xfffc0000UL,
1959 0xffffffffUL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
1960 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
1961 0x00000000UL, 0x00000000UL, 0x3ca00000UL, 0x00000000UL, 0x00000000UL,
1962 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL, 0x00000000UL,
1963 0x40300000UL, 0x00000000UL, 0x3ff00000UL
1964 };
1965
1966 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) {
1967
1968 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;
1969 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;
1970 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;
1971 Label L_2TAG_PACKET_12_0_2, L_2TAG_PACKET_13_0_2, B1_3, B1_5, start;
1972
1973 assert_different_registers(tmp, eax, ecx, edx);
1974
1975 address static_const_table_tan = (address)_static_const_table_tan;
1976
1977 bind(start);
1978 subl(rsp, 120);
1979 movl(Address(rsp, 56), tmp);
1980 lea(tmp, ExternalAddress(static_const_table_tan));
1981 movsd(xmm0, Address(rsp, 128));
1982 pextrw(eax, xmm0, 3);
1983 andl(eax, 32767);
1984 subl(eax, 14368);
1985 cmpl(eax, 2216);
1986 jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
1987 movdqu(xmm5, Address(tmp, 5840));
1988 movdqu(xmm6, Address(tmp, 5856));
1989 unpcklpd(xmm0, xmm0);
1990 movdqu(xmm4, Address(tmp, 5712));
1991 andpd(xmm4, xmm0);
|
484 ATTRIBUTE_ALIGNED(8) juint _TWO_POW_55_tan[] =
485 {
486 0x00000000UL, 0x43600000UL
487 };
488
489 ATTRIBUTE_ALIGNED(4) juint _TWO_POW_M55_tan[] =
490 {
491 0x00000000UL, 0x3c800000UL
492 };
493
494 ATTRIBUTE_ALIGNED(4) juint _NEG_ZERO_tan[] =
495 {
496 0x00000000UL, 0x80000000UL
497 };
498
499 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) {
500
501 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;
502 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;
503 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;
504 Label L_2TAG_PACKET_12_0_1, L_2TAG_PACKET_13_0_1, L_2TAG_PACKET_14_0_1, B1_2, B1_4, start;
505
506 address ONEHALF = (address)_ONEHALF_tan;
507 address MUL16 = (address)_MUL16;
508 address sign_mask = (address)_sign_mask_tan;
509 address PI32INV = (address)_PI32INV_tan;
510 address P_1 = (address)_P_1_tan;
511 address P_2 = (address)_P_2_tan;
512 address P_3 = (address)_P_3_tan;
513 address Ctable = (address)_Ctable_tan;
514 address MASK_35 = (address)_MASK_35_tan;
515 address Q_11 = (address)_Q_11_tan;
516 address Q_9 = (address)_Q_9_tan;
517 address Q_7 = (address)_Q_7_tan;
518 address Q_5 = (address)_Q_5_tan;
519 address Q_3 = (address)_Q_3_tan;
520 address PI_INV_TABLE = (address)_PI_INV_TABLE_tan;
521 address PI_4 = (address)_PI_4_tan;
522 address QQ_2 = (address)_QQ_2_tan;
523 address ONE = (address)_ONE_tan;
524 address TWO_POW_55 = (address)_TWO_POW_55_tan;
1072 0x3ffe, 0x0000, 0xb70f, 0xd068, 0xa6ce, 0xe9dd, 0xbff9, 0x0000, 0x820f, 0x51ce,
1073 0x7d76, 0x9bff, 0x3ff3, 0x0000
1074 };
1075
1076 ATTRIBUTE_ALIGNED(16) jushort _GP[] =
1077 {
1078 0xaaab, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffd, 0x0000, 0xb62f, 0x0b60, 0x60b6, 0xb60b,
1079 0xbff9, 0x0000, 0xdfa7, 0x08aa, 0x55e0, 0x8ab3, 0xbff6, 0x0000, 0x85a0, 0xa819,
1080 0xbc99, 0xddeb, 0xbff2, 0x0000, 0x7065, 0x6a37, 0x795f, 0xb354, 0xbfef, 0x0000,
1081 0xa8f9, 0x83f1, 0x2ec8, 0x9140, 0xbfec, 0x0000, 0xf3ca, 0x8c96, 0x8e0b, 0xeb6d,
1082 0xbfe8, 0x0000, 0x355b, 0xd910, 0x67c9, 0xbed3, 0xbfe5, 0x0000, 0x286b, 0xb49e,
1083 0xb854, 0x9a98, 0xbfe2, 0x0000, 0x0871, 0x1a2f, 0x6477, 0xfcc4, 0xbfde, 0x0000,
1084 0xa559, 0x1da9, 0xaed2, 0xba76, 0xbfdb, 0x0000, 0x00a3, 0x7fea, 0x9bc3, 0xf205,
1085 0xbfd8, 0x0000
1086 };
1087
1088 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) {
1089 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;
1090 Label B1_13, B1_14, B1_15, B1_16, B1_17, B1_18, B1_19, B1_20, B1_21, B1_22, B1_23;
1091 Label B1_24, B1_25, B1_26, B1_27, B1_28, B1_29, B1_30, B1_31, B1_32, B1_33, B1_34;
1092 Label B1_35, B1_36, B1_37, B1_38, B1_39, B1_40, B1_43;
1093
1094 assert_different_registers(ebx, eax, ecx, edx, esi, edi, ebp, esp);
1095
1096 address L_2il0floatpacket_0 = StubRoutines::x86::_L_2il0floatpacket_0_addr();
1097 address Pi4Inv = StubRoutines::x86::_Pi4Inv_addr();
1098 address Pi4x3 = StubRoutines::x86::_Pi4x3_addr();
1099 address Pi4x4 = StubRoutines::x86::_Pi4x4_addr();
1100 address ones = StubRoutines::x86::_ones_addr();
1101 address TP = (address)_TP;
1102 address TQ = (address)_TQ;
1103 address GP = (address)_GP;
1104
1105 bind(B1_1);
1106 push(ebp);
1107 movl(ebp, esp);
1108 andl(esp, -64);
1109 push(esi);
1110 push(edi);
1111 push(ebx);
1112 subl(esp, 52);
1949 0x3fafa8aeUL, 0x8c5b2da2UL, 0xbfb936bbUL, 0x4e88f7a5UL, 0xbc587d05UL,
1950 0x00000000UL, 0x3ff00000UL, 0xa8935dd9UL, 0x3f83dde2UL, 0x00000000UL,
1951 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x6dc9c883UL, 0x3fe45f30UL,
1952 0x6dc9c883UL, 0x40245f30UL, 0x00000000UL, 0x43780000UL, 0x00000000UL,
1953 0x43380000UL, 0x54444000UL, 0x3fb921fbUL, 0x54440000UL, 0x3fb921fbUL,
1954 0x67674000UL, 0xbd32e7b9UL, 0x4c4c0000UL, 0x3d468c23UL, 0x3707344aUL,
1955 0x3aa8a2e0UL, 0x03707345UL, 0x3ae98a2eUL, 0x00000000UL, 0x80000000UL,
1956 0x00000000UL, 0x80000000UL, 0x676733afUL, 0x3d32e7b9UL, 0x00000000UL,
1957 0x00000000UL, 0x00000000UL, 0x3ff00000UL, 0x00000000UL, 0x00000000UL,
1958 0x00000000UL, 0x7ff00000UL, 0x00000000UL, 0x00000000UL, 0xfffc0000UL,
1959 0xffffffffUL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x43600000UL,
1960 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x3c800000UL, 0x00000000UL,
1961 0x00000000UL, 0x00000000UL, 0x3ca00000UL, 0x00000000UL, 0x00000000UL,
1962 0x00000000UL, 0x3fe00000UL, 0x00000000UL, 0x3fe00000UL, 0x00000000UL,
1963 0x40300000UL, 0x00000000UL, 0x3ff00000UL
1964 };
1965
1966 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) {
1967
1968 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;
1969 Label L_2TAG_PACKET_4_0_2;
1970 Label start;
1971
1972 assert_different_registers(tmp, eax, ecx, edx);
1973
1974 address static_const_table_tan = (address)_static_const_table_tan;
1975
1976 bind(start);
1977 subl(rsp, 120);
1978 movl(Address(rsp, 56), tmp);
1979 lea(tmp, ExternalAddress(static_const_table_tan));
1980 movsd(xmm0, Address(rsp, 128));
1981 pextrw(eax, xmm0, 3);
1982 andl(eax, 32767);
1983 subl(eax, 14368);
1984 cmpl(eax, 2216);
1985 jcc(Assembler::above, L_2TAG_PACKET_0_0_2);
1986 movdqu(xmm5, Address(tmp, 5840));
1987 movdqu(xmm6, Address(tmp, 5856));
1988 unpcklpd(xmm0, xmm0);
1989 movdqu(xmm4, Address(tmp, 5712));
1990 andpd(xmm4, xmm0);
|