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)