Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 2891:75a99b4f1c98
Rebranded C++ part from C1X to Graal.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 08 Jun 2011 14:01:51 +0200 |
parents | 440ceca8e3d7 |
children | 28ba2439034f |
comparison
equal
deleted
inserted
replaced
2890:c23d45daff9b | 2891:75a99b4f1c98 |
---|---|
590 // target: the entry point of the method that creates and posts the exception oop | 590 // target: the entry point of the method that creates and posts the exception oop |
591 // has_argument: true if the exception needs an argument (passed on stack because registers must be preserved) | 591 // has_argument: true if the exception needs an argument (passed on stack because registers must be preserved) |
592 | 592 |
593 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) { | 593 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) { |
594 OopMapSet* oop_maps = new OopMapSet(); | 594 OopMapSet* oop_maps = new OopMapSet(); |
595 if (UseC1X) { | 595 if (UseGraal) { |
596 // c1x passes the argument in r10 | 596 // graal passes the argument in r10 |
597 OopMap* oop_map = save_live_registers(sasm, 1); | 597 OopMap* oop_map = save_live_registers(sasm, 1); |
598 | 598 |
599 // now all registers are saved and can be used freely | 599 // now all registers are saved and can be used freely |
600 // verify that no old value is used accidentally | 600 // verify that no old value is used accidentally |
601 __ invalidate_registers(true, true, true, true, true, true); | 601 __ invalidate_registers(true, true, true, true, true, true); |
770 } | 770 } |
771 | 771 |
772 return oop_maps; | 772 return oop_maps; |
773 } | 773 } |
774 | 774 |
775 void Runtime1::c1x_generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_maps, OopMap* oop_map) { | 775 void Runtime1::graal_generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_maps, OopMap* oop_map) { |
776 NOT_LP64(fatal("64 bit only")); | 776 NOT_LP64(fatal("64 bit only")); |
777 // incoming parameters | 777 // incoming parameters |
778 const Register exception_oop = j_rarg0; | 778 const Register exception_oop = j_rarg0; |
779 // other registers used in this stub | 779 // other registers used in this stub |
780 const Register exception_pc = j_rarg1; | 780 const Register exception_pc = j_rarg1; |
781 const Register thread = r15_thread; | 781 const Register thread = r15_thread; |
782 | 782 |
783 __ block_comment("c1x_generate_handle_exception"); | 783 __ block_comment("graal_generate_handle_exception"); |
784 | 784 |
785 // verify that rax, contains a valid exception | 785 // verify that rax, contains a valid exception |
786 __ verify_not_null_oop(exception_oop); | 786 __ verify_not_null_oop(exception_oop); |
787 | 787 |
788 #ifdef ASSERT | 788 #ifdef ASSERT |
1045 __ ret(0); | 1045 __ ret(0); |
1046 | 1046 |
1047 return oop_maps; | 1047 return oop_maps; |
1048 } | 1048 } |
1049 | 1049 |
1050 JRT_ENTRY(void, c1x_create_null_exception(JavaThread* thread)) | 1050 JRT_ENTRY(void, graal_create_null_exception(JavaThread* thread)) |
1051 thread->set_vm_result(Exceptions::new_exception(thread, vmSymbols::java_lang_NullPointerException(), NULL)()); | 1051 thread->set_vm_result(Exceptions::new_exception(thread, vmSymbols::java_lang_NullPointerException(), NULL)()); |
1052 JRT_END | 1052 JRT_END |
1053 | 1053 |
1054 | 1054 |
1055 | 1055 |
1344 | 1344 |
1345 // This is called via call_runtime so the arguments | 1345 // This is called via call_runtime so the arguments |
1346 // will be place in C abi locations | 1346 // will be place in C abi locations |
1347 | 1347 |
1348 #ifdef _LP64 | 1348 #ifdef _LP64 |
1349 __ verify_oop((UseC1X) ? j_rarg0 : c_rarg0); | 1349 __ verify_oop((UseGraal) ? j_rarg0 : c_rarg0); |
1350 __ mov(rax, (UseC1X) ? j_rarg0 : c_rarg0); | 1350 __ mov(rax, (UseGraal) ? j_rarg0 : c_rarg0); |
1351 #else | 1351 #else |
1352 // The object is passed on the stack and we haven't pushed a | 1352 // The object is passed on the stack and we haven't pushed a |
1353 // frame yet so it's one work away from top of stack. | 1353 // frame yet so it's one work away from top of stack. |
1354 __ movptr(rax, Address(rsp, 1 * BytesPerWord)); | 1354 __ movptr(rax, Address(rsp, 1 * BytesPerWord)); |
1355 __ verify_oop(rax); | 1355 __ verify_oop(rax); |
1478 __ movptr(rsi, Address(rsp, (klass_off) * VMRegImpl::stack_slot_size)); // subclass | 1478 __ movptr(rsi, Address(rsp, (klass_off) * VMRegImpl::stack_slot_size)); // subclass |
1479 __ movptr(rax, Address(rsp, (sup_k_off) * VMRegImpl::stack_slot_size)); // superclass | 1479 __ movptr(rax, Address(rsp, (sup_k_off) * VMRegImpl::stack_slot_size)); // superclass |
1480 | 1480 |
1481 Label success; | 1481 Label success; |
1482 Label miss; | 1482 Label miss; |
1483 if (UseC1X) { | 1483 if (UseGraal) { |
1484 // TODO this should really be within the XirSnippets | 1484 // TODO this should really be within the XirSnippets |
1485 __ check_klass_subtype_fast_path(rsi, rax, rcx, &success, &miss, NULL); | 1485 __ check_klass_subtype_fast_path(rsi, rax, rcx, &success, &miss, NULL); |
1486 }; | 1486 }; |
1487 | 1487 |
1488 __ check_klass_subtype_slow_path(rsi, rax, rcx, rdi, NULL, &miss); | 1488 __ check_klass_subtype_slow_path(rsi, rax, rcx, rdi, NULL, &miss); |
1884 | 1884 |
1885 } | 1885 } |
1886 break; | 1886 break; |
1887 #endif // !SERIALGC | 1887 #endif // !SERIALGC |
1888 | 1888 |
1889 case c1x_unwind_exception_call_id: { | 1889 case graal_unwind_exception_call_id: { |
1890 // remove the frame from the stack | 1890 // remove the frame from the stack |
1891 __ movptr(rsp, rbp); | 1891 __ movptr(rsp, rbp); |
1892 __ pop(rbp); | 1892 __ pop(rbp); |
1893 // exception_oop is passed using ordinary java calling conventions | 1893 // exception_oop is passed using ordinary java calling conventions |
1894 __ movptr(rax, j_rarg0); | 1894 __ movptr(rax, j_rarg0); |
1898 __ jcc(Assembler::notZero, nonNullExceptionOop); | 1898 __ jcc(Assembler::notZero, nonNullExceptionOop); |
1899 { | 1899 { |
1900 __ enter(); | 1900 __ enter(); |
1901 oop_maps = new OopMapSet(); | 1901 oop_maps = new OopMapSet(); |
1902 OopMap* oop_map = save_live_registers(sasm, 0); | 1902 OopMap* oop_map = save_live_registers(sasm, 0); |
1903 int call_offset = __ call_RT(rax, noreg, (address)c1x_create_null_exception, 0); | 1903 int call_offset = __ call_RT(rax, noreg, (address)graal_create_null_exception, 0); |
1904 oop_maps->add_gc_map(call_offset, oop_map); | 1904 oop_maps->add_gc_map(call_offset, oop_map); |
1905 __ leave(); | 1905 __ leave(); |
1906 } | 1906 } |
1907 __ bind(nonNullExceptionOop); | 1907 __ bind(nonNullExceptionOop); |
1908 | 1908 |
1912 generate_unwind_exception(sasm); | 1912 generate_unwind_exception(sasm); |
1913 __ should_not_reach_here(); | 1913 __ should_not_reach_here(); |
1914 break; | 1914 break; |
1915 } | 1915 } |
1916 | 1916 |
1917 case c1x_handle_exception_id: { | 1917 case graal_handle_exception_id: { |
1918 StubFrame f(sasm, "c1x_handle_exception", dont_gc_arguments); | 1918 StubFrame f(sasm, "graal_handle_exception", dont_gc_arguments); |
1919 oop_maps = new OopMapSet(); | 1919 oop_maps = new OopMapSet(); |
1920 OopMap* oop_map = save_live_registers(sasm, 1, false); | 1920 OopMap* oop_map = save_live_registers(sasm, 1, false); |
1921 c1x_generate_handle_exception(sasm, oop_maps, oop_map); | 1921 graal_generate_handle_exception(sasm, oop_maps, oop_map); |
1922 break; | 1922 break; |
1923 } | 1923 } |
1924 | 1924 |
1925 case c1x_slow_subtype_check_id: { | 1925 case graal_slow_subtype_check_id: { |
1926 Label success; | 1926 Label success; |
1927 Label miss; | 1927 Label miss; |
1928 | 1928 |
1929 // TODO this should really be within the XirSnippets | 1929 // TODO this should really be within the XirSnippets |
1930 __ check_klass_subtype_fast_path(j_rarg0, j_rarg1, j_rarg2, &success, &miss, NULL); | 1930 __ check_klass_subtype_fast_path(j_rarg0, j_rarg1, j_rarg2, &success, &miss, NULL); |
1939 __ movptr(rax, NULL_WORD); | 1939 __ movptr(rax, NULL_WORD); |
1940 __ ret(0); | 1940 __ ret(0); |
1941 break; | 1941 break; |
1942 } | 1942 } |
1943 | 1943 |
1944 case c1x_verify_pointer_id: { | 1944 case graal_verify_pointer_id: { |
1945 __ verify_oop(r13, "c1x verify pointer"); | 1945 __ verify_oop(r13, "graal verify pointer"); |
1946 __ ret(0); | 1946 __ ret(0); |
1947 break; | 1947 break; |
1948 } | 1948 } |
1949 | 1949 |
1950 case c1x_arithmetic_frem_id: { | 1950 case graal_arithmetic_frem_id: { |
1951 __ subptr(rsp, 8); | 1951 __ subptr(rsp, 8); |
1952 __ movflt(Address(rsp, 0), xmm1); | 1952 __ movflt(Address(rsp, 0), xmm1); |
1953 __ fld_s(Address(rsp, 0)); | 1953 __ fld_s(Address(rsp, 0)); |
1954 __ movflt(Address(rsp, 0), xmm0); | 1954 __ movflt(Address(rsp, 0), xmm0); |
1955 __ fld_s(Address(rsp, 0)); | 1955 __ fld_s(Address(rsp, 0)); |
1966 __ movflt(xmm0, Address(rsp, 0)); | 1966 __ movflt(xmm0, Address(rsp, 0)); |
1967 __ addptr(rsp, 8); | 1967 __ addptr(rsp, 8); |
1968 __ ret(0); | 1968 __ ret(0); |
1969 break; | 1969 break; |
1970 } | 1970 } |
1971 case c1x_arithmetic_drem_id: { | 1971 case graal_arithmetic_drem_id: { |
1972 __ subptr(rsp, 8); | 1972 __ subptr(rsp, 8); |
1973 __ movdbl(Address(rsp, 0), xmm1); | 1973 __ movdbl(Address(rsp, 0), xmm1); |
1974 __ fld_d(Address(rsp, 0)); | 1974 __ fld_d(Address(rsp, 0)); |
1975 __ movdbl(Address(rsp, 0), xmm0); | 1975 __ movdbl(Address(rsp, 0), xmm0); |
1976 __ fld_d(Address(rsp, 0)); | 1976 __ fld_d(Address(rsp, 0)); |
1987 __ movdbl(xmm0, Address(rsp, 0)); | 1987 __ movdbl(xmm0, Address(rsp, 0)); |
1988 __ addptr(rsp, 8); | 1988 __ addptr(rsp, 8); |
1989 __ ret(0); | 1989 __ ret(0); |
1990 break; | 1990 break; |
1991 } | 1991 } |
1992 case c1x_monitorenter_id: { | 1992 case graal_monitorenter_id: { |
1993 Label slow_case; | 1993 Label slow_case; |
1994 | 1994 |
1995 Register obj = j_rarg0; | 1995 Register obj = j_rarg0; |
1996 Register lock = j_rarg1; | 1996 Register lock = j_rarg1; |
1997 | 1997 |
2006 __ ret(0); | 2006 __ ret(0); |
2007 } | 2007 } |
2008 | 2008 |
2009 __ bind(slow_case); | 2009 __ bind(slow_case); |
2010 { | 2010 { |
2011 StubFrame f(sasm, "c1x_monitorenter", dont_gc_arguments); | 2011 StubFrame f(sasm, "graal_monitorenter", dont_gc_arguments); |
2012 OopMap* map = save_live_registers(sasm, 1, save_fpu_registers); | 2012 OopMap* map = save_live_registers(sasm, 1, save_fpu_registers); |
2013 | 2013 |
2014 // Called with store_parameter and not C abi | 2014 // Called with store_parameter and not C abi |
2015 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorenter), obj, lock); | 2015 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorenter), obj, lock); |
2016 | 2016 |
2019 restore_live_registers(sasm, save_fpu_registers); | 2019 restore_live_registers(sasm, save_fpu_registers); |
2020 } | 2020 } |
2021 __ ret(0); | 2021 __ ret(0); |
2022 break; | 2022 break; |
2023 } | 2023 } |
2024 case c1x_monitorexit_id: { | 2024 case graal_monitorexit_id: { |
2025 Label slow_case; | 2025 Label slow_case; |
2026 | 2026 |
2027 Register obj = j_rarg0; | 2027 Register obj = j_rarg0; |
2028 Register lock = j_rarg1; | 2028 Register lock = j_rarg1; |
2029 | 2029 |
2040 __ ret(0); | 2040 __ ret(0); |
2041 } | 2041 } |
2042 | 2042 |
2043 __ bind(slow_case); | 2043 __ bind(slow_case); |
2044 { | 2044 { |
2045 StubFrame f(sasm, "c1x_monitorexit", dont_gc_arguments); | 2045 StubFrame f(sasm, "graal_monitorexit", dont_gc_arguments); |
2046 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); | 2046 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); |
2047 | 2047 |
2048 // note: really a leaf routine but must setup last java sp | 2048 // note: really a leaf routine but must setup last java sp |
2049 // => use call_RT for now (speed can be improved by | 2049 // => use call_RT for now (speed can be improved by |
2050 // doing last java sp setup manually) | 2050 // doing last java sp setup manually) |