Mercurial > hg > truffle
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, |