Mercurial > hg > truffle
comparison src/cpu/x86/vm/stubGenerator_x86_64.cpp @ 11167:46a90f83df31
Merge
author | morris |
---|---|
date | Fri, 19 Jul 2013 13:59:25 -0700 |
parents | 980532a806a5 0f57ccdb9084 |
children | 6b0fd0964b87 740e263c80c6 |
comparison
equal
deleted
inserted
replaced
11135:2285b4a0a4e6 | 11167:46a90f83df31 |
---|---|
277 { | 277 { |
278 Label skip_ldmx; | 278 Label skip_ldmx; |
279 __ stmxcsr(mxcsr_save); | 279 __ stmxcsr(mxcsr_save); |
280 __ movl(rax, mxcsr_save); | 280 __ movl(rax, mxcsr_save); |
281 __ andl(rax, MXCSR_MASK); // Only check control and mask bits | 281 __ andl(rax, MXCSR_MASK); // Only check control and mask bits |
282 ExternalAddress mxcsr_std(StubRoutines::x86::mxcsr_std()); | 282 ExternalAddress mxcsr_std(StubRoutines::addr_mxcsr_std()); |
283 __ cmp32(rax, mxcsr_std); | 283 __ cmp32(rax, mxcsr_std); |
284 __ jcc(Assembler::equal, skip_ldmx); | 284 __ jcc(Assembler::equal, skip_ldmx); |
285 __ ldmxcsr(mxcsr_std); | 285 __ ldmxcsr(mxcsr_std); |
286 __ bind(skip_ldmx); | 286 __ bind(skip_ldmx); |
287 } | 287 } |
727 | 727 |
728 const Address mxcsr_save(rsp, 0); | 728 const Address mxcsr_save(rsp, 0); |
729 | 729 |
730 if (CheckJNICalls) { | 730 if (CheckJNICalls) { |
731 Label ok_ret; | 731 Label ok_ret; |
732 ExternalAddress mxcsr_std(StubRoutines::addr_mxcsr_std()); | |
732 __ push(rax); | 733 __ push(rax); |
733 __ subptr(rsp, wordSize); // allocate a temp location | 734 __ subptr(rsp, wordSize); // allocate a temp location |
734 __ stmxcsr(mxcsr_save); | 735 __ stmxcsr(mxcsr_save); |
735 __ movl(rax, mxcsr_save); | 736 __ movl(rax, mxcsr_save); |
736 __ andl(rax, MXCSR_MASK); // Only check control and mask bits | 737 __ andl(rax, MXCSR_MASK); // Only check control and mask bits |
737 __ cmpl(rax, *(int *)(StubRoutines::x86::mxcsr_std())); | 738 __ cmp32(rax, mxcsr_std); |
738 __ jcc(Assembler::equal, ok_ret); | 739 __ jcc(Assembler::equal, ok_ret); |
739 | 740 |
740 __ warn("MXCSR changed by native JNI code, use -XX:+RestoreMXCSROnJNICall"); | 741 __ warn("MXCSR changed by native JNI code, use -XX:+RestoreMXCSROnJNICall"); |
741 | 742 |
742 __ ldmxcsr(ExternalAddress(StubRoutines::x86::mxcsr_std())); | 743 __ ldmxcsr(mxcsr_std); |
743 | 744 |
744 __ bind(ok_ret); | 745 __ bind(ok_ret); |
745 __ addptr(rsp, wordSize); | 746 __ addptr(rsp, wordSize); |
746 __ pop(rax); | 747 __ pop(rax); |
747 } | 748 } |
3765 (framesize >> (LogBytesPerWord - LogBytesPerInt)), | 3766 (framesize >> (LogBytesPerWord - LogBytesPerInt)), |
3766 oop_maps, false); | 3767 oop_maps, false); |
3767 return stub->entry_point(); | 3768 return stub->entry_point(); |
3768 } | 3769 } |
3769 | 3770 |
3771 void create_control_words() { | |
3772 // Round to nearest, 53-bit mode, exceptions masked | |
3773 StubRoutines::_fpu_cntrl_wrd_std = 0x027F; | |
3774 // Round to zero, 53-bit mode, exception mased | |
3775 StubRoutines::_fpu_cntrl_wrd_trunc = 0x0D7F; | |
3776 // Round to nearest, 24-bit mode, exceptions masked | |
3777 StubRoutines::_fpu_cntrl_wrd_24 = 0x007F; | |
3778 // Round to nearest, 64-bit mode, exceptions masked | |
3779 StubRoutines::_fpu_cntrl_wrd_64 = 0x037F; | |
3780 // Round to nearest, 64-bit mode, exceptions masked | |
3781 StubRoutines::_mxcsr_std = 0x1F80; | |
3782 // Note: the following two constants are 80-bit values | |
3783 // layout is critical for correct loading by FPU. | |
3784 // Bias for strict fp multiply/divide | |
3785 StubRoutines::_fpu_subnormal_bias1[0]= 0x00000000; // 2^(-15360) == 0x03ff 8000 0000 0000 0000 | |
3786 StubRoutines::_fpu_subnormal_bias1[1]= 0x80000000; | |
3787 StubRoutines::_fpu_subnormal_bias1[2]= 0x03ff; | |
3788 // Un-Bias for strict fp multiply/divide | |
3789 StubRoutines::_fpu_subnormal_bias2[0]= 0x00000000; // 2^(+15360) == 0x7bff 8000 0000 0000 0000 | |
3790 StubRoutines::_fpu_subnormal_bias2[1]= 0x80000000; | |
3791 StubRoutines::_fpu_subnormal_bias2[2]= 0x7bff; | |
3792 } | |
3793 | |
3770 // Initialization | 3794 // Initialization |
3771 void generate_initial() { | 3795 void generate_initial() { |
3772 // Generates all stubs and initializes the entry points | 3796 // Generates all stubs and initializes the entry points |
3773 | 3797 |
3774 // This platform-specific stub is needed by generate_call_stub() | 3798 // This platform-specific settings are needed by generate_call_stub() |
3775 StubRoutines::x86::_mxcsr_std = generate_fp_mask("mxcsr_std", 0x0000000000001F80); | 3799 create_control_words(); |
3776 | 3800 |
3777 // entry points that exist in all platforms Note: This is code | 3801 // entry points that exist in all platforms Note: This is code |
3778 // that could be shared among different platforms - however the | 3802 // that could be shared among different platforms - however the |
3779 // benefit seems to be smaller than the disadvantage of having a | 3803 // benefit seems to be smaller than the disadvantage of having a |
3780 // much more complicated generator structure. See also comment in | 3804 // much more complicated generator structure. See also comment in |