comparison src/cpu/sparc/vm/macroAssembler_sparc.hpp @ 11006:b88209cf98c0

Merge
author kvn
date Thu, 20 Jun 2013 16:08:11 -0700
parents 87a6f2df28e2
children 740e263c80c6
comparison
equal deleted inserted replaced
10994:9f9c0a163cc5 11006:b88209cf98c0
1 /* 1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
961 // Note: offset is added to s2. 961 // Note: offset is added to s2.
962 using Assembler::sub; 962 using Assembler::sub;
963 inline void sub(Register s1, RegisterOrConstant s2, Register d, int offset = 0); 963 inline void sub(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
964 964
965 using Assembler::swap; 965 using Assembler::swap;
966 inline void swap(Address& a, Register d, int offset = 0); 966 inline void swap(const Address& a, Register d, int offset = 0);
967 967
968 // address pseudos: make these names unlike instruction names to avoid confusion 968 // address pseudos: make these names unlike instruction names to avoid confusion
969 inline intptr_t load_pc_address( Register reg, int bytes_to_skip ); 969 inline intptr_t load_pc_address( Register reg, int bytes_to_skip );
970 inline void load_contents(const AddressLiteral& addrlit, Register d, int offset = 0); 970 inline void load_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
971 inline void load_bool_contents(const AddressLiteral& addrlit, Register d, int offset = 0); 971 inline void load_bool_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
1054 public: 1054 public:
1055 // traps as per trap.h (SPARC ABI?) 1055 // traps as per trap.h (SPARC ABI?)
1056 1056
1057 void breakpoint_trap(); 1057 void breakpoint_trap();
1058 void breakpoint_trap(Condition c, CC cc); 1058 void breakpoint_trap(Condition c, CC cc);
1059 void flush_windows_trap();
1060 void clean_windows_trap();
1061 void get_psr_trap();
1062 void set_psr_trap();
1063
1064 // V8/V9 flush_windows
1065 void flush_windows();
1066 1059
1067 // Support for serializing memory accesses between threads 1060 // Support for serializing memory accesses between threads
1068 void serialize_memory(Register thread, Register tmp1, Register tmp2); 1061 void serialize_memory(Register thread, Register tmp1, Register tmp2);
1069 1062
1070 // Stack frame creation/removal 1063 // Stack frame creation/removal
1071 void enter(); 1064 void enter();
1072 void leave(); 1065 void leave();
1073
1074 // V8/V9 integer multiply
1075 void mult(Register s1, Register s2, Register d);
1076 void mult(Register s1, int simm13a, Register d);
1077
1078 // V8/V9 read and write of condition codes.
1079 void read_ccr(Register d);
1080 void write_ccr(Register s);
1081 1066
1082 // Manipulation of C++ bools 1067 // Manipulation of C++ bools
1083 // These are idioms to flag the need for care with accessing bools but on 1068 // These are idioms to flag the need for care with accessing bools but on
1084 // this platform we assume byte size 1069 // this platform we assume byte size
1085 1070
1159 void ic_call(address entry, bool emit_delay = true); 1144 void ic_call(address entry, bool emit_delay = true);
1160 1145
1161 // if call_VM_base was called with check_exceptions=false, then call 1146 // if call_VM_base was called with check_exceptions=false, then call
1162 // check_and_forward_exception to handle exceptions when it is safe 1147 // check_and_forward_exception to handle exceptions when it is safe
1163 void check_and_forward_exception(Register scratch_reg); 1148 void check_and_forward_exception(Register scratch_reg);
1164
1165 private:
1166 // For V8
1167 void read_ccr_trap(Register ccr_save);
1168 void write_ccr_trap(Register ccr_save1, Register scratch1, Register scratch2);
1169
1170 #ifdef ASSERT
1171 // For V8 debugging. Uses V8 instruction sequence and checks
1172 // result with V9 insturctions rdccr and wrccr.
1173 // Uses Gscatch and Gscatch2
1174 void read_ccr_v8_assert(Register ccr_save);
1175 void write_ccr_v8_assert(Register ccr_save);
1176 #endif // ASSERT
1177
1178 public:
1179 1149
1180 // Write to card table for - register is destroyed afterwards. 1150 // Write to card table for - register is destroyed afterwards.
1181 void card_table_write(jbyte* byte_map_base, Register tmp, Register obj); 1151 void card_table_write(jbyte* byte_map_base, Register tmp, Register obj);
1182 1152
1183 void card_write_barrier_post(Register store_addr, Register new_val, Register tmp); 1153 void card_write_barrier_post(Register store_addr, Register new_val, Register tmp);
1312 1282
1313 void float_cmp( bool is_float, int unordered_result, 1283 void float_cmp( bool is_float, int unordered_result,
1314 FloatRegister Fa, FloatRegister Fb, 1284 FloatRegister Fa, FloatRegister Fb,
1315 Register Rresult); 1285 Register Rresult);
1316 1286
1317 void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
1318 void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { Assembler::fneg(w, sd); }
1319 void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
1320 void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
1321
1322 void save_all_globals_into_locals(); 1287 void save_all_globals_into_locals();
1323 void restore_globals_from_locals(); 1288 void restore_globals_from_locals();
1324
1325 void casx_under_lock(Register top_ptr_reg, Register top_reg, Register ptr_reg,
1326 address lock_addr=0, bool use_call_vm=false);
1327 void cas_under_lock(Register top_ptr_reg, Register top_reg, Register ptr_reg,
1328 address lock_addr=0, bool use_call_vm=false);
1329 void casn (Register addr_reg, Register cmp_reg, Register set_reg) ;
1330 1289
1331 // These set the icc condition code to equal if the lock succeeded 1290 // These set the icc condition code to equal if the lock succeeded
1332 // and notEqual if it failed and requires a slow case 1291 // and notEqual if it failed and requires a slow case
1333 void compiler_lock_object(Register Roop, Register Rmark, Register Rbox, 1292 void compiler_lock_object(Register Roop, Register Rmark, Register Rbox,
1334 Register Rscratch, 1293 Register Rscratch,