src/cpu/mips/vm/macroAssembler_mips.cpp

changeset 9228
617b86d17edb
parent 9227
f1560009a081
child 9242
133e3e9881b9
equal deleted inserted replaced
9227:f1560009a081 9228:617b86d17edb
270 } 270 }
271 271
272 void MacroAssembler::beq_far(Register rs, Register rt, address entry) { 272 void MacroAssembler::beq_far(Register rs, Register rt, address entry) {
273 u_char * cur_pc = pc(); 273 u_char * cur_pc = pc();
274 274
275 /* Jin: Near/Far jump */ 275 // Near/Far jump
276 if(is_simm16((entry - pc() - 4) / 4)) { 276 if(is_simm16((entry - pc() - 4) / 4)) {
277 Assembler::beq(rs, rt, offset(entry)); 277 Assembler::beq(rs, rt, offset(entry));
278 } else { 278 } else {
279 Label not_jump; 279 Label not_jump;
280 bne(rs, rt, not_jump); 280 bne(rs, rt, not_jump);
306 } 306 }
307 307
308 void MacroAssembler::bne_far(Register rs, Register rt, address entry) { 308 void MacroAssembler::bne_far(Register rs, Register rt, address entry) {
309 u_char * cur_pc = pc(); 309 u_char * cur_pc = pc();
310 310
311 /* Jin: Near/Far jump */ 311 //Near/Far jump
312 if(is_simm16((entry - pc() - 4) / 4)) { 312 if(is_simm16((entry - pc() - 4) / 4)) {
313 Assembler::bne(rs, rt, offset(entry)); 313 Assembler::bne(rs, rt, offset(entry));
314 } else { 314 } else {
315 Label not_jump; 315 Label not_jump;
316 beq(rs, rt, not_jump); 316 beq(rs, rt, not_jump);
415 } 415 }
416 416
417 void MacroAssembler::b_far(address entry) { 417 void MacroAssembler::b_far(address entry) {
418 u_char * cur_pc = pc(); 418 u_char * cur_pc = pc();
419 419
420 /* Jin: Near/Far jump */ 420 // Near/Far jump
421 if(is_simm16((entry - pc() - 4) / 4)) { 421 if(is_simm16((entry - pc() - 4) / 4)) {
422 b(offset(entry)); 422 b(offset(entry));
423 } else { 423 } else {
424 /* address must be bounded */ 424 // address must be bounded
425 move(AT, RA); 425 move(AT, RA);
426 emit_long(insn_ORRI(regimm_op, 0, bgezal_op, 1)); 426 emit_long(insn_ORRI(regimm_op, 0, bgezal_op, 1));
427 nop(); 427 nop();
428 li32(T9, entry - pc()); 428 li32(T9, entry - pc());
429 daddu(T9, T9, RA); 429 daddu(T9, T9, RA);
972 972
973 973
974 void MacroAssembler::stop(const char* msg) { 974 void MacroAssembler::stop(const char* msg) {
975 li(A0, (long)msg); 975 li(A0, (long)msg);
976 #ifndef _LP64 976 #ifndef _LP64
977 //reserver space for argument. added by yjl 7/10/2005 977 //reserver space for argument.
978 addiu(SP, SP, - 1 * wordSize); 978 addiu(SP, SP, - 1 * wordSize);
979 #endif 979 #endif
980 call(CAST_FROM_FN_PTR(address, MacroAssembler::debug), relocInfo::runtime_call_type); 980 call(CAST_FROM_FN_PTR(address, MacroAssembler::debug), relocInfo::runtime_call_type);
981 delayed()->nop(); 981 delayed()->nop();
982 #ifndef _LP64 982 #ifndef _LP64
1815 1815
1816 ld_ptr(obj, thread, in_bytes(JavaThread::tlab_top_offset())); 1816 ld_ptr(obj, thread, in_bytes(JavaThread::tlab_top_offset()));
1817 1817
1818 if (var_size_in_bytes == NOREG) { 1818 if (var_size_in_bytes == NOREG) {
1819 // i dont think we need move con_size_in_bytes to a register first. 1819 // i dont think we need move con_size_in_bytes to a register first.
1820 // by yjl 8/17/2005
1821 assert(is_simm16(con_size_in_bytes), "fixme by moving imm to a register first"); 1820 assert(is_simm16(con_size_in_bytes), "fixme by moving imm to a register first");
1822 addi(end, obj, con_size_in_bytes); 1821 addi(end, obj, con_size_in_bytes);
1823 } else { 1822 } else {
1824 add(end, obj, var_size_in_bytes); 1823 add(end, obj, var_size_in_bytes);
1825 } 1824 }
1830 delayed()->nop(); 1829 delayed()->nop();
1831 1830
1832 1831
1833 // update the tlab top pointer 1832 // update the tlab top pointer
1834 st_ptr(end, thread, in_bytes(JavaThread::tlab_top_offset())); 1833 st_ptr(end, thread, in_bytes(JavaThread::tlab_top_offset()));
1835
1836 // recover var_size_in_bytes if necessary
1837 /*if (var_size_in_bytes == end) {
1838 sub(var_size_in_bytes, end, obj);
1839 }*/
1840 1834
1841 verify_tlab(t1, t2); 1835 verify_tlab(t1, t2);
1842 } 1836 }
1843 1837
1844 // Defines obj, preserves var_size_in_bytes 1838 // Defines obj, preserves var_size_in_bytes
1845 void MacroAssembler::eden_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes, 1839 void MacroAssembler::eden_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes,
1846 Register t1, Register t2, Label& slow_case) { 1840 Register t1, Register t2, Label& slow_case) {
1847 assert_different_registers(obj, var_size_in_bytes, t1, AT); 1841 assert_different_registers(obj, var_size_in_bytes, t1, AT);
1848 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) { //by yyq 1842 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
1849 // No allocation in the shared eden. 1843 // No allocation in the shared eden.
1850 b_far(slow_case); 1844 b_far(slow_case);
1851 delayed()->nop(); 1845 delayed()->nop();
1852 } else { 1846 } else {
1853 1847
1888 // sync(); 1882 // sync();
1889 //} 1883 //}
1890 1884
1891 // if someone beat us on the allocation, try again, otherwise continue 1885 // if someone beat us on the allocation, try again, otherwise continue
1892 cmpxchg(end, heap_top, obj); 1886 cmpxchg(end, heap_top, obj);
1893 beq_far(AT, R0, retry); //by yyq 1887 beq_far(AT, R0, retry);
1894 delayed()->nop(); 1888 delayed()->nop();
1895 } 1889 }
1896 } 1890 }
1897 1891
1898 // C2 doesn't invoke this one. 1892 // C2 doesn't invoke this one.
1903 Register t3 = T3; 1897 Register t3 = T3;
1904 Register thread_reg = T8; 1898 Register thread_reg = T8;
1905 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ T2, A4); 1899 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ T2, A4);
1906 Label do_refill, discard_tlab; 1900 Label do_refill, discard_tlab;
1907 1901
1908 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) { //by yyq 1902 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
1909 // No allocation in the shared eden. 1903 // No allocation in the shared eden.
1910 b(slow_case); 1904 b(slow_case);
1911 delayed()->nop(); 1905 delayed()->nop();
1912 } 1906 }
1913 1907
2045 static const double pi_4 = 0.7853981633974483; 2039 static const double pi_4 = 0.7853981633974483;
2046 2040
2047 // the x86 version is to clumsy, i dont think we need that fuss. maybe i'm wrong, FIXME 2041 // the x86 version is to clumsy, i dont think we need that fuss. maybe i'm wrong, FIXME
2048 // must get argument(a double) in F12/F13 2042 // must get argument(a double) in F12/F13
2049 //void MacroAssembler::trigfunc(char trig, bool preserve_cpu_regs, int num_fpu_regs_in_use) { 2043 //void MacroAssembler::trigfunc(char trig, bool preserve_cpu_regs, int num_fpu_regs_in_use) {
2050 //We need to preseve the register which maybe modified during the Call @Jerome 2044 //We need to preseve the register which maybe modified during the Call
2051 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { 2045 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) {
2052 //save all modified register here 2046 //save all modified register here
2053 // if (preserve_cpu_regs) {
2054 // }
2055 //FIXME, in the disassembly of tirgfunc, only used V0,V1,T9, SP,RA,so we ony save V0,V1,T9 2047 //FIXME, in the disassembly of tirgfunc, only used V0,V1,T9, SP,RA,so we ony save V0,V1,T9
2056 pushad(); 2048 pushad();
2057 //we should preserve the stack space before we call 2049 //we should preserve the stack space before we call
2058 addi(SP, SP, -wordSize * 2); 2050 addi(SP, SP, -wordSize * 2);
2059 switch (trig){ 2051 switch (trig){
2074 2066
2075 } 2067 }
2076 2068
2077 addi(SP, SP, wordSize * 2); 2069 addi(SP, SP, wordSize * 2);
2078 popad(); 2070 popad();
2079 // if (preserve_cpu_regs) {
2080 // }
2081 } 2071 }
2082 2072
2083 #ifdef _LP64 2073 #ifdef _LP64
2084 void MacroAssembler::li(Register rd, long imm) { 2074 void MacroAssembler::li(Register rd, long imm) {
2085 if (imm <= max_jint && imm >= min_jint) { 2075 if (imm <= max_jint && imm >= min_jint) {
2088 assert_not_delayed(); 2078 assert_not_delayed();
2089 // lui sign-extends, so we can't use that. 2079 // lui sign-extends, so we can't use that.
2090 ori(rd, R0, julong(imm) >> 16); 2080 ori(rd, R0, julong(imm) >> 16);
2091 dsll(rd, rd, 16); 2081 dsll(rd, rd, 16);
2092 ori(rd, rd, split_low(imm)); 2082 ori(rd, rd, split_low(imm));
2093 //aoqi_test
2094 //} else if ((imm > 0) && ((imm >> 48) == 0)) {
2095 } else if ((imm > 0) && is_simm16(imm >> 32)) { 2083 } else if ((imm > 0) && is_simm16(imm >> 32)) {
2096 /* A 48-bit address */ 2084 /* A 48-bit address */
2097 li48(rd, imm); 2085 li48(rd, imm);
2098 } else { 2086 } else {
2099 li64(rd, imm); 2087 li64(rd, imm);
2105 } 2093 }
2106 #endif 2094 #endif
2107 2095
2108 void MacroAssembler::li32(Register reg, int imm) { 2096 void MacroAssembler::li32(Register reg, int imm) {
2109 if (is_simm16(imm)) { 2097 if (is_simm16(imm)) {
2110 /* Jin: for imm < 0, we should use addi instead of addiu. 2098 /* for imm < 0, we should use addi instead of addiu.
2111 * 2099 *
2112 * java.lang.StringCoding$StringDecoder.decode(jobject, jint, jint) 2100 * java.lang.StringCoding$StringDecoder.decode(jobject, jint, jint)
2113 * 2101 *
2114 * 78 move [int:-1|I] [a0|I] 2102 * 78 move [int:-1|I] [a0|I]
2115 * : daddi a0, zero, 0xffffffff (correct) 2103 * : daddi a0, zero, 0xffffffff (correct)
2626 2614
2627 #ifdef _LP64 2615 #ifdef _LP64
2628 2616
2629 /* do 32-bit CAS using MIPS64 lld/scd 2617 /* do 32-bit CAS using MIPS64 lld/scd
2630 2618
2631 Jin: cas_int should only compare 32-bits of the memory value. 2619 cas_int should only compare 32-bits of the memory value.
2632 However, lld/scd will do 64-bit operation, which violates the intention of cas_int. 2620 However, lld/scd will do 64-bit operation, which violates the intention of cas_int.
2633 To simulate a 32-bit atomic operation, the value loaded with LLD should be split into 2621 To simulate a 32-bit atomic operation, the value loaded with LLD should be split into
2634 tow halves, and only the low-32 bits is compared. If equals, the low-32 bits of newval, 2622 tow halves, and only the low-32 bits is compared. If equals, the low-32 bits of newval,
2635 plus the high-32 bits or memory value, are stored togethor with SCD. 2623 plus the high-32 bits or memory value, are stored togethor with SCD.
2636 2624
2637 Example: 2625 Example:
2638 2626
2639 double d = 3.1415926; 2627 double d = 3.1415926;
2640 System.err.println("hello" + d); 2628 System.err.println("hello" + d);
2671 0x00000055647f45a8: dadd at, zero, zero 2659 0x00000055647f45a8: dadd at, zero, zero
2672 done: 2660 done:
2673 */ 2661 */
2674 2662
2675 void MacroAssembler::cmpxchg32(Register x_reg, Address dest, Register c_reg) { 2663 void MacroAssembler::cmpxchg32(Register x_reg, Address dest, Register c_reg) {
2676 /* 2012/11/11 Jin: MIPS64 can use ll/sc for 32-bit atomic memory access */ 2664 /* MIPS64 can use ll/sc for 32-bit atomic memory access */
2677 Label done, again, nequal; 2665 Label done, again, nequal;
2678 2666
2679 bind(again); 2667 bind(again);
2680 2668
2681 if(UseSyncLevel >= 3000 || UseSyncLevel < 2000) sync(); 2669 if(UseSyncLevel >= 3000 || UseSyncLevel < 2000) sync();
3201 3189
3202 #ifdef _LP64 3190 #ifdef _LP64
3203 Register caller_saved_registers[] = {AT, V0, V1, A0, A1, A2, A3, A4, A5, A6, A7, T0, T1, T2, T3, T8, T9, GP, RA, FP}; 3191 Register caller_saved_registers[] = {AT, V0, V1, A0, A1, A2, A3, A4, A5, A6, A7, T0, T1, T2, T3, T8, T9, GP, RA, FP};
3204 Register caller_saved_registers_except_v0[] = {AT, V1, A0, A1, A2, A3, A4, A5, A6, A7, T0, T1, T2, T3, T8, T9, GP, RA, FP}; 3192 Register caller_saved_registers_except_v0[] = {AT, V1, A0, A1, A2, A3, A4, A5, A6, A7, T0, T1, T2, T3, T8, T9, GP, RA, FP};
3205 3193
3206 /* FIXME: Jin: In MIPS64, F0~23 are all caller-saved registers */ 3194 //In MIPS64, F0~23 are all caller-saved registers
3207 FloatRegister caller_saved_fpu_registers[] = {F0, F12, F13}; 3195 FloatRegister caller_saved_fpu_registers[] = {F0, F12, F13};
3208 #else 3196 #else
3209 Register caller_saved_registers[] = {AT, V0, V1, A0, A1, A2, A3, T4, T5, T6, T7, T0, T1, T2, T3, T8, T9, GP, RA, FP}; 3197 Register caller_saved_registers[] = {AT, V0, V1, A0, A1, A2, A3, T4, T5, T6, T7, T0, T1, T2, T3, T8, T9, GP, RA, FP};
3210 Register caller_saved_registers_except_v0[] = {AT, V1, A0, A1, A2, A3, T4, T5, T6, T7, T0, T1, T2, T3, T8, T9, GP, RA, FP}; 3198 Register caller_saved_registers_except_v0[] = {AT, V1, A0, A1, A2, A3, T4, T5, T6, T7, T0, T1, T2, T3, T8, T9, GP, RA, FP};
3211 3199
3926 // Set NZ/Z based on last compare. 3914 // Set NZ/Z based on last compare.
3927 // Z flag value will not be set by 'repne' if RCX == 0 since 'repne' does 3915 // Z flag value will not be set by 'repne' if RCX == 0 since 'repne' does
3928 // not change flags (only scas instruction which is repeated sets flags). 3916 // not change flags (only scas instruction which is repeated sets flags).
3929 // Set Z = 0 (not equal) before 'repne' to indicate that class was not found. 3917 // Set Z = 0 (not equal) before 'repne' to indicate that class was not found.
3930 3918
3931 /* 2013/4/3 Jin: OpenJDK8 never compresses klass pointers in secondary-super array. */ 3919 // OpenJDK8 never compresses klass pointers in secondary-super array.
3932 Label Loop, subtype; 3920 Label Loop, subtype;
3933 bind(Loop); 3921 bind(Loop);
3934 beq(temp2_reg, R0, *L_failure); 3922 beq(temp2_reg, R0, *L_failure);
3935 delayed()->nop(); 3923 delayed()->nop();
3936 ld(AT, temp_reg, 0); 3924 ld(AT, temp_reg, 0);
3978 offset += arg_slot.as_constant() * stackElementSize; 3966 offset += arg_slot.as_constant() * stackElementSize;
3979 } else { 3967 } else {
3980 scale_reg = arg_slot.as_register(); 3968 scale_reg = arg_slot.as_register();
3981 scale_factor = Address::times_8; 3969 scale_factor = Address::times_8;
3982 } 3970 }
3983 // 2014/07/31 Fu: We don't push RA on stack in prepare_invoke. 3971 // We don't push RA on stack in prepare_invoke.
3984 // offset += wordSize; // return PC is on stack 3972 // offset += wordSize; // return PC is on stack
3985 if(scale_reg==NOREG) return Address(SP, offset); 3973 if(scale_reg==NOREG) return Address(SP, offset);
3986 else { 3974 else {
3987 dsll(scale_reg, scale_reg, scale_factor); 3975 dsll(scale_reg, scale_reg, scale_factor);
3988 daddu(scale_reg, SP, scale_reg); 3976 daddu(scale_reg, SP, scale_reg);

mercurial