comparison src/cpu/x86/vm/sharedRuntime_x86_64.cpp @ 21737:c85c89f6b2d1

Reduce delta relative to hotspot for ymm register maps
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 04 Jun 2015 12:31:54 -0700
parents b3d5463a8362
children 0dfd3ea90d33
comparison
equal deleted inserted replaced
21736:b3d5463a8362 21737:c85c89f6b2d1
138 static void restore_result_registers(MacroAssembler* masm); 138 static void restore_result_registers(MacroAssembler* masm);
139 }; 139 };
140 140
141 OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) { 141 OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) {
142 int vect_words = 0; 142 int vect_words = 0;
143 #ifdef COMPILER2 143 int ymmhi_offset = -1;
144 #if defined(COMPILER2) || defined(JVMCI)
144 if (save_vectors) { 145 if (save_vectors) {
145 assert(UseAVX > 0, "256bit vectors are supported only with AVX"); 146 assert(UseAVX > 0, "256bit vectors are supported only with AVX");
146 assert(MaxVectorSize == 32, "only 256bit vectors are supported now"); 147 assert(MaxVectorSize == 32, "only 256bit vectors are supported now");
147 // Save upper half of YMM registes 148 // Save upper half of YMM registes
148 vect_words = 16 * 16 / wordSize; 149 vect_words = 16 * 16 / wordSize;
150 ymmhi_offset = additional_frame_words;
149 additional_frame_words += vect_words; 151 additional_frame_words += vect_words;
150 } 152 }
151 #else 153 #else
152 assert(!save_vectors, "vectors are generated only by C2"); 154 assert(!save_vectors, "vectors are generated only by C2 and JVMCI");
153 #endif 155 #endif
154 156
155 // Always make the frame size 16-byte aligned 157 // Always make the frame size 16-byte aligned
156 int frame_size_in_bytes = round_to(additional_frame_words*wordSize + 158 int frame_size_in_bytes = round_to(additional_frame_words*wordSize +
157 reg_save_size*BytesPerInt, 16); 159 reg_save_size*BytesPerInt, 16);
204 206
205 OopMapSet *oop_maps = new OopMapSet(); 207 OopMapSet *oop_maps = new OopMapSet();
206 OopMap* map = new OopMap(frame_size_in_slots, 0); 208 OopMap* map = new OopMap(frame_size_in_slots, 0);
207 209
208 #define STACK_OFFSET(x) VMRegImpl::stack2reg((x) + additional_frame_slots) 210 #define STACK_OFFSET(x) VMRegImpl::stack2reg((x) + additional_frame_slots)
211 #define YMMHI_STACK_OFFSET(x) VMRegImpl::stack2reg((x) + ymmhi_offset)
209 212
210 map->set_callee_saved(STACK_OFFSET( rax_off ), rax->as_VMReg()); 213 map->set_callee_saved(STACK_OFFSET( rax_off ), rax->as_VMReg());
211 map->set_callee_saved(STACK_OFFSET( rcx_off ), rcx->as_VMReg()); 214 map->set_callee_saved(STACK_OFFSET( rcx_off ), rcx->as_VMReg());
212 map->set_callee_saved(STACK_OFFSET( rdx_off ), rdx->as_VMReg()); 215 map->set_callee_saved(STACK_OFFSET( rdx_off ), rdx->as_VMReg());
213 map->set_callee_saved(STACK_OFFSET( rbx_off ), rbx->as_VMReg()); 216 map->set_callee_saved(STACK_OFFSET( rbx_off ), rbx->as_VMReg());
237 map->set_callee_saved(STACK_OFFSET(xmm11_off), xmm11->as_VMReg()); 240 map->set_callee_saved(STACK_OFFSET(xmm11_off), xmm11->as_VMReg());
238 map->set_callee_saved(STACK_OFFSET(xmm12_off), xmm12->as_VMReg()); 241 map->set_callee_saved(STACK_OFFSET(xmm12_off), xmm12->as_VMReg());
239 map->set_callee_saved(STACK_OFFSET(xmm13_off), xmm13->as_VMReg()); 242 map->set_callee_saved(STACK_OFFSET(xmm13_off), xmm13->as_VMReg());
240 map->set_callee_saved(STACK_OFFSET(xmm14_off), xmm14->as_VMReg()); 243 map->set_callee_saved(STACK_OFFSET(xmm14_off), xmm14->as_VMReg());
241 map->set_callee_saved(STACK_OFFSET(xmm15_off), xmm15->as_VMReg()); 244 map->set_callee_saved(STACK_OFFSET(xmm15_off), xmm15->as_VMReg());
245
246
247 #if defined(COMPILER2) || defined(JVMCI)
248 if (save_vectors) {
249 assert(ymmhi_offset != -1, "save area must exist");
250 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm0_off ), xmm0->as_VMReg()->next()->next()->next()->next());
251 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm1_off ), xmm1->as_VMReg()->next()->next()->next()->next());
252 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm2_off ), xmm2->as_VMReg()->next()->next()->next()->next());
253 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm3_off ), xmm3->as_VMReg()->next()->next()->next()->next());
254 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm4_off ), xmm4->as_VMReg()->next()->next()->next()->next());
255 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm5_off ), xmm5->as_VMReg()->next()->next()->next()->next());
256 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm6_off ), xmm6->as_VMReg()->next()->next()->next()->next());
257 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm7_off ), xmm7->as_VMReg()->next()->next()->next()->next());
258 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm8_off ), xmm8->as_VMReg()->next()->next()->next()->next());
259 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm9_off ), xmm9->as_VMReg()->next()->next()->next()->next());
260 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm10_off), xmm10->as_VMReg()->next()->next()->next()->next());
261 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm11_off), xmm11->as_VMReg()->next()->next()->next()->next());
262 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm12_off), xmm12->as_VMReg()->next()->next()->next()->next());
263 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm13_off), xmm13->as_VMReg()->next()->next()->next()->next());
264 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm14_off), xmm14->as_VMReg()->next()->next()->next()->next());
265 map->set_callee_saved(YMMHI_STACK_OFFSET(xmm15_off), xmm15->as_VMReg()->next()->next()->next()->next());
266 }
267 #endif
242 268
243 // %%% These should all be a waste but we'll keep things as they were for now 269 // %%% These should all be a waste but we'll keep things as they were for now
244 if (true) { 270 if (true) {
245 map->set_callee_saved(STACK_OFFSET( raxH_off ), rax->as_VMReg()->next()); 271 map->set_callee_saved(STACK_OFFSET( raxH_off ), rax->as_VMReg()->next());
246 map->set_callee_saved(STACK_OFFSET( rcxH_off ), rcx->as_VMReg()->next()); 272 map->set_callee_saved(STACK_OFFSET( rcxH_off ), rcx->as_VMReg()->next());
281 void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) { 307 void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) {
282 if (frame::arg_reg_save_area_bytes != 0) { 308 if (frame::arg_reg_save_area_bytes != 0) {
283 // Pop arg register save area 309 // Pop arg register save area
284 __ addptr(rsp, frame::arg_reg_save_area_bytes); 310 __ addptr(rsp, frame::arg_reg_save_area_bytes);
285 } 311 }
286 #ifdef COMPILER2 312 #if defined(COMPILER2) || defined(JVMCI)
287 if (restore_vectors) { 313 if (restore_vectors) {
288 // Restore upper half of YMM registes. 314 // Restore upper half of YMM registes.
289 assert(UseAVX > 0, "256bit vectors are supported only with AVX"); 315 assert(UseAVX > 0, "256bit vectors are supported only with AVX");
290 assert(MaxVectorSize == 32, "only 256bit vectors are supported now"); 316 assert(MaxVectorSize == 32, "only 256bit vectors are supported now");
291 __ vinsertf128h(xmm0, Address(rsp, 0)); 317 __ vinsertf128h(xmm0, Address(rsp, 0));
305 __ vinsertf128h(xmm14, Address(rsp,224)); 331 __ vinsertf128h(xmm14, Address(rsp,224));
306 __ vinsertf128h(xmm15, Address(rsp,240)); 332 __ vinsertf128h(xmm15, Address(rsp,240));
307 __ addptr(rsp, 256); 333 __ addptr(rsp, 256);
308 } 334 }
309 #else 335 #else
310 assert(!restore_vectors, "vectors are generated only by C2"); 336 assert(!restore_vectors, "vectors are generated only by C2 and JVMCI");
311 #endif 337 #endif
312 // Recover CPU state 338 // Recover CPU state
313 __ pop_CPU_state(); 339 __ pop_CPU_state();
314 // Get the rbp described implicitly by the calling convention (no oopMap) 340 // Get the rbp described implicitly by the calling convention (no oopMap)
315 __ pop(rbp); 341 __ pop(rbp);