Mercurial > hg > graal-jvmci-8
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); |