1 /*
2  * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
3  * Copyright (c) 2012, 2017, SAP SE. All rights reserved.
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This code is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 only, as
8  * published by the Free Software Foundation.
9  *
10  * This code is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13  * version 2 for more details (a copy is included in the LICENSE file that
14  * accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License version
17  * 2 along with this work; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19  *
20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21  * or visit www.oracle.com if you need additional information or have any
22  * questions.
23  *
24  */
25 
26 #include "precompiled.hpp"
27 #include "asm/macroAssembler.inline.hpp"
28 #include "c1/c1_Compilation.hpp"
29 #include "c1/c1_FrameMap.hpp"
30 #include "c1/c1_Instruction.hpp"
31 #include "c1/c1_LIRAssembler.hpp"
32 #include "c1/c1_LIRGenerator.hpp"
33 #include "c1/c1_Runtime1.hpp"
34 #include "c1/c1_ValueStack.hpp"
35 #include "ci/ciArray.hpp"
36 #include "ci/ciObjArrayKlass.hpp"
37 #include "ci/ciTypeArrayKlass.hpp"
38 #include "runtime/sharedRuntime.hpp"
39 #include "runtime/stubRoutines.hpp"
40 #include "vmreg_ppc.inline.hpp"
41 
42 #ifdef ASSERT
43 #define __ gen()->lir(__FILE__, __LINE__)->
44 #else
45 #define __ gen()->lir()->
46 #endif
47 
load_byte_item()48 void LIRItem::load_byte_item() {
49   // Byte loads use same registers as other loads.
50   load_item();
51 }
52 
53 
load_nonconstant()54 void LIRItem::load_nonconstant() {
55   LIR_Opr r = value()->operand();
56   if (_gen->can_inline_as_constant(value())) {
57     if (!r->is_constant()) {
58       r = LIR_OprFact::value_type(value()->type());
59     }
60     _result = r;
61   } else {
62     load_item();
63   }
64 }
65 
66 
67 //--------------------------------------------------------------
68 //               LIRGenerator
69 //--------------------------------------------------------------
70 
exceptionOopOpr()71 LIR_Opr LIRGenerator::exceptionOopOpr()              { return FrameMap::R3_oop_opr; }
exceptionPcOpr()72 LIR_Opr LIRGenerator::exceptionPcOpr()               { return FrameMap::R4_opr; }
syncLockOpr()73 LIR_Opr LIRGenerator::syncLockOpr()                  { return FrameMap::R5_opr; }     // Need temp effect for MonitorEnterStub.
syncTempOpr()74 LIR_Opr LIRGenerator::syncTempOpr()                  { return FrameMap::R4_oop_opr; } // Need temp effect for MonitorEnterStub.
getThreadTemp()75 LIR_Opr LIRGenerator::getThreadTemp()                { return LIR_OprFact::illegalOpr; } // not needed
76 
result_register_for(ValueType * type,bool callee)77 LIR_Opr LIRGenerator::result_register_for(ValueType* type, bool callee) {
78   LIR_Opr opr;
79   switch (type->tag()) {
80   case intTag:     opr = FrameMap::R3_opr;         break;
81   case objectTag:  opr = FrameMap::R3_oop_opr;     break;
82   case longTag:    opr = FrameMap::R3_long_opr;    break;
83   case floatTag:   opr = FrameMap::F1_opr;         break;
84   case doubleTag:  opr = FrameMap::F1_double_opr;  break;
85 
86   case addressTag:
87   default: ShouldNotReachHere(); return LIR_OprFact::illegalOpr;
88   }
89 
90   assert(opr->type_field() == as_OprType(as_BasicType(type)), "type mismatch");
91   return opr;
92 }
93 
rlock_callee_saved(BasicType type)94 LIR_Opr LIRGenerator::rlock_callee_saved(BasicType type) {
95   ShouldNotReachHere();
96   return LIR_OprFact::illegalOpr;
97 }
98 
99 
rlock_byte(BasicType type)100 LIR_Opr LIRGenerator::rlock_byte(BasicType type) {
101   return new_register(T_INT);
102 }
103 
104 
105 //--------- loading items into registers --------------------------------
106 
107 // PPC cannot inline all constants.
can_store_as_constant(Value v,BasicType type) const108 bool LIRGenerator::can_store_as_constant(Value v, BasicType type) const {
109   if (v->type()->as_IntConstant() != NULL) {
110     return Assembler::is_simm16(v->type()->as_IntConstant()->value());
111   } else if (v->type()->as_LongConstant() != NULL) {
112     return Assembler::is_simm16(v->type()->as_LongConstant()->value());
113   } else if (v->type()->as_ObjectConstant() != NULL) {
114     return v->type()->as_ObjectConstant()->value()->is_null_object();
115   } else {
116     return false;
117   }
118 }
119 
120 
121 // Only simm16 constants can be inlined.
can_inline_as_constant(Value i) const122 bool LIRGenerator::can_inline_as_constant(Value i) const {
123   return can_store_as_constant(i, as_BasicType(i->type()));
124 }
125 
126 
can_inline_as_constant(LIR_Const * c) const127 bool LIRGenerator::can_inline_as_constant(LIR_Const* c) const {
128   if (c->type() == T_INT) {
129     return Assembler::is_simm16(c->as_jint());
130   }
131   if (c->type() == T_LONG) {
132     return Assembler::is_simm16(c->as_jlong());
133   }
134   if (c->type() == T_OBJECT) {
135     return c->as_jobject() == NULL;
136   }
137   return false;
138 }
139 
140 
safepoint_poll_register()141 LIR_Opr LIRGenerator::safepoint_poll_register() {
142   return new_register(T_INT);
143 }
144 
145 
generate_address(LIR_Opr base,LIR_Opr index,int shift,int disp,BasicType type)146 LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
147                                             int shift, int disp, BasicType type) {
148   assert(base->is_register(), "must be");
149   intx large_disp = disp;
150 
151   // Accumulate fixed displacements.
152   if (index->is_constant()) {
153     LIR_Const *constant = index->as_constant_ptr();
154     if (constant->type() == T_LONG) {
155       large_disp += constant->as_jlong() << shift;
156     } else {
157       large_disp += (intx)(constant->as_jint()) << shift;
158     }
159     index = LIR_OprFact::illegalOpr;
160   }
161 
162   if (index->is_register()) {
163     // Apply the shift and accumulate the displacement.
164     if (shift > 0) {
165       LIR_Opr tmp = new_pointer_register();
166       __ shift_left(index, shift, tmp);
167       index = tmp;
168     }
169     if (large_disp != 0) {
170       LIR_Opr tmp = new_pointer_register();
171       if (Assembler::is_simm16(large_disp)) {
172         __ add(index, LIR_OprFact::intptrConst(large_disp), tmp);
173         index = tmp;
174       } else {
175         __ move(LIR_OprFact::intptrConst(large_disp), tmp);
176         __ add(tmp, index, tmp);
177         index = tmp;
178       }
179       large_disp = 0;
180     }
181   } else if (!Assembler::is_simm16(large_disp)) {
182     // Index is illegal so replace it with the displacement loaded into a register.
183     index = new_pointer_register();
184     __ move(LIR_OprFact::intptrConst(large_disp), index);
185     large_disp = 0;
186   }
187 
188   // At this point we either have base + index or base + displacement.
189   if (large_disp == 0) {
190     return new LIR_Address(base, index, type);
191   } else {
192     assert(Assembler::is_simm16(large_disp), "must be");
193     return new LIR_Address(base, large_disp, type);
194   }
195 }
196 
197 
emit_array_address(LIR_Opr array_opr,LIR_Opr index_opr,BasicType type)198 LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr,
199                                               BasicType type) {
200   int elem_size = type2aelembytes(type);
201   int shift = exact_log2(elem_size);
202 
203   LIR_Opr base_opr;
204   intx offset = arrayOopDesc::base_offset_in_bytes(type);
205 
206   if (index_opr->is_constant()) {
207     intx i = index_opr->as_constant_ptr()->as_jint();
208     intx array_offset = i * elem_size;
209     if (Assembler::is_simm16(array_offset + offset)) {
210       base_opr = array_opr;
211       offset = array_offset + offset;
212     } else {
213       base_opr = new_pointer_register();
214       if (Assembler::is_simm16(array_offset)) {
215         __ add(array_opr, LIR_OprFact::intptrConst(array_offset), base_opr);
216       } else {
217         __ move(LIR_OprFact::intptrConst(array_offset), base_opr);
218         __ add(base_opr, array_opr, base_opr);
219       }
220     }
221   } else {
222 #ifdef _LP64
223     if (index_opr->type() == T_INT) {
224       LIR_Opr tmp = new_register(T_LONG);
225       __ convert(Bytecodes::_i2l, index_opr, tmp);
226       index_opr = tmp;
227     }
228 #endif
229 
230     base_opr = new_pointer_register();
231     assert (index_opr->is_register(), "Must be register");
232     if (shift > 0) {
233       __ shift_left(index_opr, shift, base_opr);
234       __ add(base_opr, array_opr, base_opr);
235     } else {
236       __ add(index_opr, array_opr, base_opr);
237     }
238   }
239   return new LIR_Address(base_opr, offset, type);
240 }
241 
242 
load_immediate(int x,BasicType type)243 LIR_Opr LIRGenerator::load_immediate(int x, BasicType type) {
244   LIR_Opr r = NULL;
245   if (type == T_LONG) {
246     r = LIR_OprFact::longConst(x);
247   } else if (type == T_INT) {
248     r = LIR_OprFact::intConst(x);
249   } else {
250     ShouldNotReachHere();
251   }
252   if (!Assembler::is_simm16(x)) {
253     LIR_Opr tmp = new_register(type);
254     __ move(r, tmp);
255     return tmp;
256   }
257   return r;
258 }
259 
260 
increment_counter(address counter,BasicType type,int step)261 void LIRGenerator::increment_counter(address counter, BasicType type, int step) {
262   LIR_Opr pointer = new_pointer_register();
263   __ move(LIR_OprFact::intptrConst(counter), pointer);
264   LIR_Address* addr = new LIR_Address(pointer, type);
265   increment_counter(addr, step);
266 }
267 
268 
increment_counter(LIR_Address * addr,int step)269 void LIRGenerator::increment_counter(LIR_Address* addr, int step) {
270   LIR_Opr temp = new_register(addr->type());
271   __ move(addr, temp);
272   __ add(temp, load_immediate(step, addr->type()), temp);
273   __ move(temp, addr);
274 }
275 
276 
cmp_mem_int(LIR_Condition condition,LIR_Opr base,int disp,int c,CodeEmitInfo * info)277 void LIRGenerator::cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info) {
278   LIR_Opr tmp = FrameMap::R0_opr;
279   __ load(new LIR_Address(base, disp, T_INT), tmp, info);
280   __ cmp(condition, tmp, c);
281 }
282 
283 
cmp_reg_mem(LIR_Condition condition,LIR_Opr reg,LIR_Opr base,int disp,BasicType type,CodeEmitInfo * info)284 void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base,
285                                int disp, BasicType type, CodeEmitInfo* info) {
286   LIR_Opr tmp = FrameMap::R0_opr;
287   __ load(new LIR_Address(base, disp, type), tmp, info);
288   __ cmp(condition, reg, tmp);
289 }
290 
291 
strength_reduce_multiply(LIR_Opr left,int c,LIR_Opr result,LIR_Opr tmp)292 bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
293   assert(left != result, "should be different registers");
294   if (is_power_of_2(c + 1)) {
295     __ shift_left(left, log2_int(c + 1), result);
296     __ sub(result, left, result);
297     return true;
298   } else if (is_power_of_2(c - 1)) {
299     __ shift_left(left, log2_int(c - 1), result);
300     __ add(result, left, result);
301     return true;
302   }
303   return false;
304 }
305 
306 
store_stack_parameter(LIR_Opr item,ByteSize offset_from_sp)307 void LIRGenerator::store_stack_parameter(LIR_Opr item, ByteSize offset_from_sp) {
308   BasicType t = item->type();
309   LIR_Opr sp_opr = FrameMap::SP_opr;
310   if ((t == T_LONG || t == T_DOUBLE) &&
311       ((in_bytes(offset_from_sp) - STACK_BIAS) % 8 != 0)) {
312     __ unaligned_move(item, new LIR_Address(sp_opr, in_bytes(offset_from_sp), t));
313   } else {
314     __ move(item, new LIR_Address(sp_opr, in_bytes(offset_from_sp), t));
315   }
316 }
317 
318 
319 //----------------------------------------------------------------------
320 //             visitor functions
321 //----------------------------------------------------------------------
322 
array_store_check(LIR_Opr value,LIR_Opr array,CodeEmitInfo * store_check_info,ciMethod * profiled_method,int profiled_bci)323 void LIRGenerator::array_store_check(LIR_Opr value, LIR_Opr array, CodeEmitInfo* store_check_info, ciMethod* profiled_method, int profiled_bci) {
324   // Following registers are used by slow_subtype_check:
325   LIR_Opr tmp1 = FrameMap::R4_opr; // super_klass
326   LIR_Opr tmp2 = FrameMap::R5_opr; // sub_klass
327   LIR_Opr tmp3 = FrameMap::R6_opr; // temp
328   __ store_check(value, array, tmp1, tmp2, tmp3, store_check_info, profiled_method, profiled_bci);
329 }
330 
331 
do_MonitorEnter(MonitorEnter * x)332 void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
333   assert(x->is_pinned(),"");
334   LIRItem obj(x->obj(), this);
335   obj.load_item();
336 
337   set_no_result(x);
338 
339   // We use R4+R5 in order to get a temp effect. These regs are used in slow path (MonitorEnterStub).
340   LIR_Opr lock    = FrameMap::R5_opr;
341   LIR_Opr scratch = FrameMap::R4_opr;
342   LIR_Opr hdr     = FrameMap::R6_opr;
343 
344   CodeEmitInfo* info_for_exception = NULL;
345   if (x->needs_null_check()) {
346     info_for_exception = state_for(x);
347   }
348 
349   // This CodeEmitInfo must not have the xhandlers because here the
350   // object is already locked (xhandlers expects object to be unlocked).
351   CodeEmitInfo* info = state_for(x, x->state(), true);
352   monitor_enter(obj.result(), lock, hdr, scratch, x->monitor_no(), info_for_exception, info);
353 }
354 
355 
do_MonitorExit(MonitorExit * x)356 void LIRGenerator::do_MonitorExit(MonitorExit* x) {
357   assert(x->is_pinned(),"");
358   LIRItem obj(x->obj(), this);
359   obj.dont_load_item();
360 
361   set_no_result(x);
362   LIR_Opr lock     = FrameMap::R5_opr;
363   LIR_Opr hdr      = FrameMap::R4_opr; // Used for slow path (MonitorExitStub).
364   LIR_Opr obj_temp = FrameMap::R6_opr;
365   monitor_exit(obj_temp, lock, hdr, LIR_OprFact::illegalOpr, x->monitor_no());
366 }
367 
368 
369 // _ineg, _lneg, _fneg, _dneg
do_NegateOp(NegateOp * x)370 void LIRGenerator::do_NegateOp(NegateOp* x) {
371   LIRItem value(x->x(), this);
372   value.load_item();
373   LIR_Opr reg = rlock_result(x);
374   __ negate(value.result(), reg);
375 }
376 
377 
378 // for  _fadd, _fmul, _fsub, _fdiv, _frem
379 //      _dadd, _dmul, _dsub, _ddiv, _drem
do_ArithmeticOp_FPU(ArithmeticOp * x)380 void LIRGenerator::do_ArithmeticOp_FPU(ArithmeticOp* x) {
381   switch (x->op()) {
382   case Bytecodes::_fadd:
383   case Bytecodes::_fmul:
384   case Bytecodes::_fsub:
385   case Bytecodes::_fdiv:
386   case Bytecodes::_dadd:
387   case Bytecodes::_dmul:
388   case Bytecodes::_dsub:
389   case Bytecodes::_ddiv: {
390     LIRItem left(x->x(), this);
391     LIRItem right(x->y(), this);
392     left.load_item();
393     right.load_item();
394     rlock_result(x);
395     arithmetic_op_fpu(x->op(), x->operand(), left.result(), right.result(), x->is_strictfp());
396   }
397   break;
398 
399   case Bytecodes::_frem:
400   case Bytecodes::_drem: {
401     address entry = NULL;
402     switch (x->op()) {
403     case Bytecodes::_frem:
404       entry = CAST_FROM_FN_PTR(address, SharedRuntime::frem);
405       break;
406     case Bytecodes::_drem:
407       entry = CAST_FROM_FN_PTR(address, SharedRuntime::drem);
408       break;
409     default:
410       ShouldNotReachHere();
411     }
412     LIR_Opr result = call_runtime(x->x(), x->y(), entry, x->type(), NULL);
413     set_result(x, result);
414   }
415   break;
416 
417   default: ShouldNotReachHere();
418   }
419 }
420 
421 
422 // for  _ladd, _lmul, _lsub, _ldiv, _lrem
do_ArithmeticOp_Long(ArithmeticOp * x)423 void LIRGenerator::do_ArithmeticOp_Long(ArithmeticOp* x) {
424   bool is_div_rem = x->op() == Bytecodes::_ldiv || x->op() == Bytecodes::_lrem;
425 
426   LIRItem right(x->y(), this);
427   // Missing test if instr is commutative and if we should swap.
428   if (right.value()->type()->as_LongConstant() &&
429       (x->op() == Bytecodes::_lsub && right.value()->type()->as_LongConstant()->value() == ((-1)<<15)) ) {
430     // Sub is implemented by addi and can't support min_simm16 as constant..
431     right.load_item();
432   } else {
433     right.load_nonconstant();
434   }
435   assert(right.is_constant() || right.is_register(), "wrong state of right");
436 
437   if (is_div_rem) {
438     LIR_Opr divisor = right.result();
439     if (divisor->is_register()) {
440       CodeEmitInfo* null_check_info = state_for(x);
441       __ cmp(lir_cond_equal, divisor, LIR_OprFact::longConst(0));
442       __ branch(lir_cond_equal, T_LONG, new DivByZeroStub(null_check_info));
443     } else {
444       jlong const_divisor = divisor->as_constant_ptr()->as_jlong();
445       if (const_divisor == 0) {
446         CodeEmitInfo* null_check_info = state_for(x);
447         __ jump(new DivByZeroStub(null_check_info));
448         rlock_result(x);
449         __ move(LIR_OprFact::longConst(0), x->operand()); // dummy
450         return;
451       }
452       if (x->op() == Bytecodes::_lrem && !is_power_of_2(const_divisor) && const_divisor != -1) {
453         // Remainder computation would need additional tmp != R0.
454         right.load_item();
455       }
456     }
457   }
458 
459   LIRItem left(x->x(), this);
460   left.load_item();
461   rlock_result(x);
462   if (is_div_rem) {
463     CodeEmitInfo* info = NULL; // Null check already done above.
464     LIR_Opr tmp = FrameMap::R0_opr;
465     if (x->op() == Bytecodes::_lrem) {
466       __ irem(left.result(), right.result(), x->operand(), tmp, info);
467     } else if (x->op() == Bytecodes::_ldiv) {
468       __ idiv(left.result(), right.result(), x->operand(), tmp, info);
469     }
470   } else {
471     arithmetic_op_long(x->op(), x->operand(), left.result(), right.result(), NULL);
472   }
473 }
474 
475 
476 // for: _iadd, _imul, _isub, _idiv, _irem
do_ArithmeticOp_Int(ArithmeticOp * x)477 void LIRGenerator::do_ArithmeticOp_Int(ArithmeticOp* x) {
478   bool is_div_rem = x->op() == Bytecodes::_idiv || x->op() == Bytecodes::_irem;
479 
480   LIRItem right(x->y(), this);
481   // Missing test if instr is commutative and if we should swap.
482   if (right.value()->type()->as_IntConstant() &&
483       (x->op() == Bytecodes::_isub && right.value()->type()->as_IntConstant()->value() == ((-1)<<15)) ) {
484     // Sub is implemented by addi and can't support min_simm16 as constant.
485     right.load_item();
486   } else {
487     right.load_nonconstant();
488   }
489   assert(right.is_constant() || right.is_register(), "wrong state of right");
490 
491   if (is_div_rem) {
492     LIR_Opr divisor = right.result();
493     if (divisor->is_register()) {
494       CodeEmitInfo* null_check_info = state_for(x);
495       __ cmp(lir_cond_equal, divisor, LIR_OprFact::intConst(0));
496       __ branch(lir_cond_equal, T_INT, new DivByZeroStub(null_check_info));
497     } else {
498       jint const_divisor = divisor->as_constant_ptr()->as_jint();
499       if (const_divisor == 0) {
500         CodeEmitInfo* null_check_info = state_for(x);
501         __ jump(new DivByZeroStub(null_check_info));
502         rlock_result(x);
503         __ move(LIR_OprFact::intConst(0), x->operand()); // dummy
504         return;
505       }
506       if (x->op() == Bytecodes::_irem && !is_power_of_2(const_divisor) && const_divisor != -1) {
507         // Remainder computation would need additional tmp != R0.
508         right.load_item();
509       }
510     }
511   }
512 
513   LIRItem left(x->x(), this);
514   left.load_item();
515   rlock_result(x);
516   if (is_div_rem) {
517     CodeEmitInfo* info = NULL; // Null check already done above.
518     LIR_Opr tmp = FrameMap::R0_opr;
519     if (x->op() == Bytecodes::_irem) {
520       __ irem(left.result(), right.result(), x->operand(), tmp, info);
521     } else if (x->op() == Bytecodes::_idiv) {
522       __ idiv(left.result(), right.result(), x->operand(), tmp, info);
523     }
524   } else {
525     arithmetic_op_int(x->op(), x->operand(), left.result(), right.result(), FrameMap::R0_opr);
526   }
527 }
528 
529 
do_ArithmeticOp(ArithmeticOp * x)530 void LIRGenerator::do_ArithmeticOp(ArithmeticOp* x) {
531   ValueTag tag = x->type()->tag();
532   assert(x->x()->type()->tag() == tag && x->y()->type()->tag() == tag, "wrong parameters");
533   switch (tag) {
534     case floatTag:
535     case doubleTag: do_ArithmeticOp_FPU(x);  return;
536     case longTag:   do_ArithmeticOp_Long(x); return;
537     case intTag:    do_ArithmeticOp_Int(x);  return;
538     default: ShouldNotReachHere();
539   }
540 }
541 
542 
543 // _ishl, _lshl, _ishr, _lshr, _iushr, _lushr
do_ShiftOp(ShiftOp * x)544 void LIRGenerator::do_ShiftOp(ShiftOp* x) {
545   LIRItem value(x->x(), this);
546   LIRItem count(x->y(), this);
547   value.load_item();
548   LIR_Opr reg = rlock_result(x);
549   LIR_Opr mcount;
550   if (count.result()->is_register()) {
551     mcount = FrameMap::R0_opr;
552   } else {
553     mcount = LIR_OprFact::illegalOpr;
554   }
555   shift_op(x->op(), reg, value.result(), count.result(), mcount);
556 }
557 
558 
can_handle_logic_op_as_uimm(ValueType * type,Bytecodes::Code bc)559 inline bool can_handle_logic_op_as_uimm(ValueType *type, Bytecodes::Code bc) {
560   jlong int_or_long_const;
561   if (type->as_IntConstant()) {
562     int_or_long_const = type->as_IntConstant()->value();
563   } else if (type->as_LongConstant()) {
564     int_or_long_const = type->as_LongConstant()->value();
565   } else if (type->as_ObjectConstant()) {
566     return type->as_ObjectConstant()->value()->is_null_object();
567   } else {
568     return false;
569   }
570 
571   if (Assembler::is_uimm(int_or_long_const, 16)) return true;
572   if ((int_or_long_const & 0xFFFF) == 0 &&
573       Assembler::is_uimm((jlong)((julong)int_or_long_const >> 16), 16)) return true;
574 
575   // see Assembler::andi
576   if (bc == Bytecodes::_iand &&
577       (is_power_of_2_long(int_or_long_const+1) ||
578        is_power_of_2_long(int_or_long_const) ||
579        is_power_of_2_long(-int_or_long_const))) return true;
580   if (bc == Bytecodes::_land &&
581       (is_power_of_2_long(int_or_long_const+1) ||
582        (Assembler::is_uimm(int_or_long_const, 32) && is_power_of_2_long(int_or_long_const)) ||
583        (int_or_long_const != min_jlong && is_power_of_2_long(-int_or_long_const)))) return true;
584 
585   // special case: xor -1
586   if ((bc == Bytecodes::_ixor || bc == Bytecodes::_lxor) &&
587       int_or_long_const == -1) return true;
588   return false;
589 }
590 
591 
592 // _iand, _land, _ior, _lor, _ixor, _lxor
do_LogicOp(LogicOp * x)593 void LIRGenerator::do_LogicOp(LogicOp* x) {
594   LIRItem left(x->x(), this);
595   LIRItem right(x->y(), this);
596 
597   left.load_item();
598 
599   Value rval = right.value();
600   LIR_Opr r = rval->operand();
601   ValueType *type = rval->type();
602   // Logic instructions use unsigned immediate values.
603   if (can_handle_logic_op_as_uimm(type, x->op())) {
604     if (!r->is_constant()) {
605       r = LIR_OprFact::value_type(type);
606       rval->set_operand(r);
607     }
608     right.set_result(r);
609   } else {
610     right.load_item();
611   }
612 
613   LIR_Opr reg = rlock_result(x);
614 
615   logic_op(x->op(), reg, left.result(), right.result());
616 }
617 
618 
619 // _lcmp, _fcmpl, _fcmpg, _dcmpl, _dcmpg
do_CompareOp(CompareOp * x)620 void LIRGenerator::do_CompareOp(CompareOp* x) {
621   LIRItem left(x->x(), this);
622   LIRItem right(x->y(), this);
623   left.load_item();
624   right.load_item();
625   LIR_Opr reg = rlock_result(x);
626   if (x->x()->type()->is_float_kind()) {
627     Bytecodes::Code code = x->op();
628     __ fcmp2int(left.result(), right.result(), reg, (code == Bytecodes::_fcmpl || code == Bytecodes::_dcmpl));
629   } else if (x->x()->type()->tag() == longTag) {
630     __ lcmp2int(left.result(), right.result(), reg);
631   } else {
632     Unimplemented();
633   }
634 }
635 
636 
atomic_cmpxchg(BasicType type,LIR_Opr addr,LIRItem & cmp_value,LIRItem & new_value)637 LIR_Opr LIRGenerator::atomic_cmpxchg(BasicType type, LIR_Opr addr, LIRItem& cmp_value, LIRItem& new_value) {
638   LIR_Opr result = new_register(T_INT);
639   LIR_Opr t1 = LIR_OprFact::illegalOpr;
640   LIR_Opr t2 = LIR_OprFact::illegalOpr;
641   cmp_value.load_item();
642   new_value.load_item();
643 
644   // Volatile load may be followed by Unsafe CAS.
645   if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
646     __ membar();
647   } else {
648     __ membar_release();
649   }
650 
651   if (type == T_OBJECT || type == T_ARRAY) {
652     if (UseCompressedOops) {
653       t1 = new_register(T_OBJECT);
654       t2 = new_register(T_OBJECT);
655     }
656     __ cas_obj(addr->as_address_ptr()->base(), cmp_value.result(), new_value.result(), t1, t2);
657   } else if (type == T_INT) {
658     __ cas_int(addr->as_address_ptr()->base(), cmp_value.result(), new_value.result(), t1, t2);
659   } else if (type == T_LONG) {
660     __ cas_long(addr->as_address_ptr()->base(), cmp_value.result(), new_value.result(), t1, t2);
661   } else {
662     Unimplemented();
663   }
664   __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0),
665            result, type);
666   return result;
667 }
668 
669 
atomic_xchg(BasicType type,LIR_Opr addr,LIRItem & value)670 LIR_Opr LIRGenerator::atomic_xchg(BasicType type, LIR_Opr addr, LIRItem& value) {
671   LIR_Opr result = new_register(type);
672   LIR_Opr tmp = FrameMap::R0_opr;
673 
674   value.load_item();
675 
676   // Volatile load may be followed by Unsafe CAS.
677   if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
678     __ membar();
679   } else {
680     __ membar_release();
681   }
682 
683   __ xchg(addr, value.result(), result, tmp);
684 
685   if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
686     __ membar_acquire();
687   } else {
688     __ membar();
689   }
690   return result;
691 }
692 
693 
atomic_add(BasicType type,LIR_Opr addr,LIRItem & value)694 LIR_Opr LIRGenerator::atomic_add(BasicType type, LIR_Opr addr, LIRItem& value) {
695   LIR_Opr result = new_register(type);
696   LIR_Opr tmp = FrameMap::R0_opr;
697 
698   value.load_item();
699 
700   // Volatile load may be followed by Unsafe CAS.
701   if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
702     __ membar(); // To be safe. Unsafe semantics are unclear.
703   } else {
704     __ membar_release();
705   }
706 
707   __ xadd(addr, value.result(), result, tmp);
708 
709   if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
710     __ membar_acquire();
711   } else {
712     __ membar();
713   }
714   return result;
715 }
716 
717 
do_MathIntrinsic(Intrinsic * x)718 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
719   switch (x->id()) {
720     case vmIntrinsics::_dabs: {
721       assert(x->number_of_arguments() == 1, "wrong type");
722       LIRItem value(x->argument_at(0), this);
723       value.load_item();
724       LIR_Opr dst = rlock_result(x);
725       __ abs(value.result(), dst, LIR_OprFact::illegalOpr);
726       break;
727     }
728     case vmIntrinsics::_dsqrt: {
729       if (VM_Version::has_fsqrt()) {
730         assert(x->number_of_arguments() == 1, "wrong type");
731         LIRItem value(x->argument_at(0), this);
732         value.load_item();
733         LIR_Opr dst = rlock_result(x);
734         __ sqrt(value.result(), dst, LIR_OprFact::illegalOpr);
735         break;
736       } // else fallthru
737     }
738     case vmIntrinsics::_dsin:   // fall through
739     case vmIntrinsics::_dcos:   // fall through
740     case vmIntrinsics::_dtan:   // fall through
741     case vmIntrinsics::_dlog:   // fall through
742     case vmIntrinsics::_dlog10: // fall through
743     case vmIntrinsics::_dexp: {
744       assert(x->number_of_arguments() == 1, "wrong type");
745 
746       address runtime_entry = NULL;
747       switch (x->id()) {
748         case vmIntrinsics::_dsqrt:
749           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt);
750           break;
751         case vmIntrinsics::_dsin:
752           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin);
753           break;
754         case vmIntrinsics::_dcos:
755           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos);
756           break;
757         case vmIntrinsics::_dtan:
758           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan);
759           break;
760         case vmIntrinsics::_dlog:
761           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog);
762           break;
763         case vmIntrinsics::_dlog10:
764           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10);
765           break;
766         case vmIntrinsics::_dexp:
767           runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp);
768           break;
769         default:
770           ShouldNotReachHere();
771       }
772 
773       LIR_Opr result = call_runtime(x->argument_at(0), runtime_entry, x->type(), NULL);
774       set_result(x, result);
775       break;
776     }
777     case vmIntrinsics::_dpow: {
778       assert(x->number_of_arguments() == 2, "wrong type");
779       address runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow);
780       LIR_Opr result = call_runtime(x->argument_at(0), x->argument_at(1), runtime_entry, x->type(), NULL);
781       set_result(x, result);
782       break;
783     }
784     default:
785       break;
786   }
787 }
788 
789 
do_ArrayCopy(Intrinsic * x)790 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
791   assert(x->number_of_arguments() == 5, "wrong type");
792 
793   // Make all state_for calls early since they can emit code.
794   CodeEmitInfo* info = state_for(x, x->state());
795 
796   LIRItem src     (x->argument_at(0), this);
797   LIRItem src_pos (x->argument_at(1), this);
798   LIRItem dst     (x->argument_at(2), this);
799   LIRItem dst_pos (x->argument_at(3), this);
800   LIRItem length  (x->argument_at(4), this);
801 
802   // Load all values in callee_save_registers (C calling convention),
803   // as this makes the parameter passing to the fast case simpler.
804   src.load_item_force     (FrameMap::R14_oop_opr);
805   src_pos.load_item_force (FrameMap::R15_opr);
806   dst.load_item_force     (FrameMap::R17_oop_opr);
807   dst_pos.load_item_force (FrameMap::R18_opr);
808   length.load_item_force  (FrameMap::R19_opr);
809   LIR_Opr tmp =            FrameMap::R20_opr;
810 
811   int flags;
812   ciArrayKlass* expected_type;
813   arraycopy_helper(x, &flags, &expected_type);
814 
815   __ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(),
816                length.result(), tmp,
817                expected_type, flags, info);
818   set_no_result(x);
819 }
820 
821 
822 // _i2l, _i2f, _i2d, _l2i, _l2f, _l2d, _f2i, _f2l, _f2d, _d2i, _d2l, _d2f
823 // _i2b, _i2c, _i2s
do_Convert(Convert * x)824 void LIRGenerator::do_Convert(Convert* x) {
825   if (!VM_Version::has_mtfprd()) {
826     switch (x->op()) {
827 
828       // int -> float: force spill
829       case Bytecodes::_l2f: {
830         if (!VM_Version::has_fcfids()) { // fcfids is >= Power7 only
831           // fcfid+frsp needs fixup code to avoid rounding incompatibility.
832           address entry = CAST_FROM_FN_PTR(address, SharedRuntime::l2f);
833           LIR_Opr result = call_runtime(x->value(), entry, x->type(), NULL);
834           set_result(x, result);
835           return;
836         } // else fallthru
837       }
838       case Bytecodes::_l2d: {
839         LIRItem value(x->value(), this);
840         LIR_Opr reg = rlock_result(x);
841         value.load_item();
842         LIR_Opr tmp = force_to_spill(value.result(), T_DOUBLE);
843         __ convert(x->op(), tmp, reg);
844         return;
845       }
846       case Bytecodes::_i2f:
847       case Bytecodes::_i2d: {
848         LIRItem value(x->value(), this);
849         LIR_Opr reg = rlock_result(x);
850         value.load_item();
851         // Convert i2l first.
852         LIR_Opr tmp1 = new_register(T_LONG);
853         __ convert(Bytecodes::_i2l, value.result(), tmp1);
854         LIR_Opr tmp2 = force_to_spill(tmp1, T_DOUBLE);
855         __ convert(x->op(), tmp2, reg);
856         return;
857       }
858 
859       // float -> int: result will be stored
860       case Bytecodes::_f2l:
861       case Bytecodes::_d2l: {
862         LIRItem value(x->value(), this);
863         LIR_Opr reg = rlock_result(x);
864         value.set_destroys_register(); // USE_KILL
865         value.load_item();
866         set_vreg_flag(reg, must_start_in_memory);
867         __ convert(x->op(), value.result(), reg);
868         return;
869       }
870       case Bytecodes::_f2i:
871       case Bytecodes::_d2i: {
872         LIRItem value(x->value(), this);
873         LIR_Opr reg = rlock_result(x);
874         value.set_destroys_register(); // USE_KILL
875         value.load_item();
876         // Convert l2i afterwards.
877         LIR_Opr tmp1 = new_register(T_LONG);
878         set_vreg_flag(tmp1, must_start_in_memory);
879         __ convert(x->op(), value.result(), tmp1);
880         __ convert(Bytecodes::_l2i, tmp1, reg);
881         return;
882       }
883 
884       // Within same category: just register conversions.
885       case Bytecodes::_i2b:
886       case Bytecodes::_i2c:
887       case Bytecodes::_i2s:
888       case Bytecodes::_i2l:
889       case Bytecodes::_l2i:
890       case Bytecodes::_f2d:
891       case Bytecodes::_d2f:
892         break;
893 
894       default: ShouldNotReachHere();
895     }
896   }
897 
898   // Register conversion.
899   LIRItem value(x->value(), this);
900   LIR_Opr reg = rlock_result(x);
901   value.load_item();
902   switch (x->op()) {
903     case Bytecodes::_f2l:
904     case Bytecodes::_d2l:
905     case Bytecodes::_f2i:
906     case Bytecodes::_d2i: value.set_destroys_register(); break; // USE_KILL
907     default: break;
908   }
909   __ convert(x->op(), value.result(), reg);
910 }
911 
912 
do_NewInstance(NewInstance * x)913 void LIRGenerator::do_NewInstance(NewInstance* x) {
914   // This instruction can be deoptimized in the slow path.
915   const LIR_Opr reg = result_register_for(x->type());
916 #ifndef PRODUCT
917   if (PrintNotLoaded && !x->klass()->is_loaded()) {
918     tty->print_cr("   ###class not loaded at new bci %d", x->printable_bci());
919   }
920 #endif
921   CodeEmitInfo* info = state_for(x, x->state());
922   LIR_Opr klass_reg = FrameMap::R4_metadata_opr; // Used by slow path (NewInstanceStub).
923   LIR_Opr tmp1 = FrameMap::R5_oop_opr;
924   LIR_Opr tmp2 = FrameMap::R6_oop_opr;
925   LIR_Opr tmp3 = FrameMap::R7_oop_opr;
926   LIR_Opr tmp4 = FrameMap::R8_oop_opr;
927   new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
928 
929   // Must prevent reordering of stores for object initialization
930   // with stores that publish the new object.
931   __ membar_storestore();
932   LIR_Opr result = rlock_result(x);
933   __ move(reg, result);
934 }
935 
936 
do_NewTypeArray(NewTypeArray * x)937 void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
938   // Evaluate state_for early since it may emit code.
939   CodeEmitInfo* info = state_for(x, x->state());
940 
941   LIRItem length(x->length(), this);
942   length.load_item();
943 
944   LIR_Opr reg = result_register_for(x->type());
945   LIR_Opr klass_reg = FrameMap::R4_metadata_opr; // Used by slow path (NewTypeArrayStub).
946   // We use R5 in order to get a temp effect. This reg is used in slow path (NewTypeArrayStub).
947   LIR_Opr tmp1 = FrameMap::R5_oop_opr;
948   LIR_Opr tmp2 = FrameMap::R6_oop_opr;
949   LIR_Opr tmp3 = FrameMap::R7_oop_opr;
950   LIR_Opr tmp4 = FrameMap::R8_oop_opr;
951   LIR_Opr len = length.result();
952   BasicType elem_type = x->elt_type();
953 
954   __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
955 
956   CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
957   __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
958 
959   // Must prevent reordering of stores for object initialization
960   // with stores that publish the new object.
961   __ membar_storestore();
962   LIR_Opr result = rlock_result(x);
963   __ move(reg, result);
964 }
965 
966 
do_NewObjectArray(NewObjectArray * x)967 void LIRGenerator::do_NewObjectArray(NewObjectArray* x) {
968   // Evaluate state_for early since it may emit code.
969   CodeEmitInfo* info = state_for(x, x->state());
970   // In case of patching (i.e., object class is not yet loaded),
971   // we need to reexecute the instruction and therefore provide
972   // the state before the parameters have been consumed.
973   CodeEmitInfo* patching_info = NULL;
974   if (!x->klass()->is_loaded() || PatchALot) {
975     patching_info = state_for(x, x->state_before());
976   }
977 
978   LIRItem length(x->length(), this);
979   length.load_item();
980 
981   const LIR_Opr reg = result_register_for(x->type());
982   LIR_Opr klass_reg = FrameMap::R4_metadata_opr; // Used by slow path (NewObjectArrayStub).
983   // We use R5 in order to get a temp effect. This reg is used in slow path (NewObjectArrayStub).
984   LIR_Opr tmp1 = FrameMap::R5_oop_opr;
985   LIR_Opr tmp2 = FrameMap::R6_oop_opr;
986   LIR_Opr tmp3 = FrameMap::R7_oop_opr;
987   LIR_Opr tmp4 = FrameMap::R8_oop_opr;
988   LIR_Opr len = length.result();
989 
990   CodeStub* slow_path = new NewObjectArrayStub(klass_reg, len, reg, info);
991   ciMetadata* obj = ciObjArrayKlass::make(x->klass());
992   if (obj == ciEnv::unloaded_ciobjarrayklass()) {
993     BAILOUT("encountered unloaded_ciobjarrayklass due to out of memory error");
994   }
995   klass2reg_with_patching(klass_reg, obj, patching_info);
996   __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, T_OBJECT, klass_reg, slow_path);
997 
998   // Must prevent reordering of stores for object initialization
999   // with stores that publish the new object.
1000   __ membar_storestore();
1001   LIR_Opr result = rlock_result(x);
1002   __ move(reg, result);
1003 }
1004 
1005 
do_NewMultiArray(NewMultiArray * x)1006 void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
1007   Values* dims = x->dims();
1008   int i = dims->length();
1009   LIRItemList* items = new LIRItemList(i, i, NULL);
1010   while (i-- > 0) {
1011     LIRItem* size = new LIRItem(dims->at(i), this);
1012     items->at_put(i, size);
1013   }
1014 
1015   // Evaluate state_for early since it may emit code.
1016   CodeEmitInfo* patching_info = NULL;
1017   if (!x->klass()->is_loaded() || PatchALot) {
1018     patching_info = state_for(x, x->state_before());
1019 
1020     // Cannot re-use same xhandlers for multiple CodeEmitInfos, so
1021     // clone all handlers (NOTE: Usually this is handled transparently
1022     // by the CodeEmitInfo cloning logic in CodeStub constructors but
1023     // is done explicitly here because a stub isn't being used).
1024     x->set_exception_handlers(new XHandlers(x->exception_handlers()));
1025   }
1026   CodeEmitInfo* info = state_for(x, x->state());
1027 
1028   i = dims->length();
1029   while (i-- > 0) {
1030     LIRItem* size = items->at(i);
1031     size->load_nonconstant();
1032     // FrameMap::_reserved_argument_area_size includes the dimensions
1033     // varargs, because it's initialized to hir()->max_stack() when the
1034     // FrameMap is created.
1035     store_stack_parameter(size->result(), in_ByteSize(i*sizeof(jint) + FrameMap::first_available_sp_in_frame));
1036   }
1037 
1038   const LIR_Opr klass_reg = FrameMap::R4_metadata_opr; // Used by slow path.
1039   klass2reg_with_patching(klass_reg, x->klass(), patching_info);
1040 
1041   LIR_Opr rank = FrameMap::R5_opr; // Used by slow path.
1042   __ move(LIR_OprFact::intConst(x->rank()), rank);
1043 
1044   LIR_Opr varargs = FrameMap::as_pointer_opr(R6); // Used by slow path.
1045   __ leal(LIR_OprFact::address(new LIR_Address(FrameMap::SP_opr, FrameMap::first_available_sp_in_frame, T_INT)),
1046           varargs);
1047 
1048   // Note: This instruction can be deoptimized in the slow path.
1049   LIR_OprList* args = new LIR_OprList(3);
1050   args->append(klass_reg);
1051   args->append(rank);
1052   args->append(varargs);
1053   const LIR_Opr reg = result_register_for(x->type());
1054   __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id),
1055                   LIR_OprFact::illegalOpr,
1056                   reg, args, info);
1057 
1058   // Must prevent reordering of stores for object initialization
1059   // with stores that publish the new object.
1060   __ membar_storestore();
1061   LIR_Opr result = rlock_result(x);
1062   __ move(reg, result);
1063 }
1064 
1065 
do_BlockBegin(BlockBegin * x)1066 void LIRGenerator::do_BlockBegin(BlockBegin* x) {
1067   // nothing to do for now
1068 }
1069 
1070 
do_CheckCast(CheckCast * x)1071 void LIRGenerator::do_CheckCast(CheckCast* x) {
1072   LIRItem obj(x->obj(), this);
1073   CodeEmitInfo* patching_info = NULL;
1074   if (!x->klass()->is_loaded() || (PatchALot && !x->is_incompatible_class_change_check() && !x->is_invokespecial_receiver_check())) {
1075     // Must do this before locking the destination register as
1076     // an oop register, and before the obj is loaded (so x->obj()->item()
1077     // is valid for creating a debug info location).
1078     patching_info = state_for(x, x->state_before());
1079   }
1080   obj.load_item();
1081   LIR_Opr out_reg = rlock_result(x);
1082   CodeStub* stub;
1083   CodeEmitInfo* info_for_exception =
1084       (x->needs_exception_state() ? state_for(x) :
1085                                     state_for(x, x->state_before(), true /*ignore_xhandler*/));
1086 
1087   if (x->is_incompatible_class_change_check()) {
1088     assert(patching_info == NULL, "can't patch this");
1089     stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id,
1090                                    LIR_OprFact::illegalOpr, info_for_exception);
1091   } else if (x->is_invokespecial_receiver_check()) {
1092     assert(patching_info == NULL, "can't patch this");
1093     stub = new DeoptimizeStub(info_for_exception,
1094                               Deoptimization::Reason_class_check,
1095                               Deoptimization::Action_none);
1096   } else {
1097     stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
1098   }
1099   // Following registers are used by slow_subtype_check:
1100   LIR_Opr tmp1 = FrameMap::R4_oop_opr; // super_klass
1101   LIR_Opr tmp2 = FrameMap::R5_oop_opr; // sub_klass
1102   LIR_Opr tmp3 = FrameMap::R6_oop_opr; // temp
1103   __ checkcast(out_reg, obj.result(), x->klass(), tmp1, tmp2, tmp3,
1104                x->direct_compare(), info_for_exception, patching_info, stub,
1105                x->profiled_method(), x->profiled_bci());
1106 }
1107 
1108 
do_InstanceOf(InstanceOf * x)1109 void LIRGenerator::do_InstanceOf(InstanceOf* x) {
1110   LIRItem obj(x->obj(), this);
1111   CodeEmitInfo* patching_info = NULL;
1112   if (!x->klass()->is_loaded() || PatchALot) {
1113     patching_info = state_for(x, x->state_before());
1114   }
1115   // Ensure the result register is not the input register because the
1116   // result is initialized before the patching safepoint.
1117   obj.load_item();
1118   LIR_Opr out_reg = rlock_result(x);
1119   // Following registers are used by slow_subtype_check:
1120   LIR_Opr tmp1 = FrameMap::R4_oop_opr; // super_klass
1121   LIR_Opr tmp2 = FrameMap::R5_oop_opr; // sub_klass
1122   LIR_Opr tmp3 = FrameMap::R6_oop_opr; // temp
1123   __ instanceof(out_reg, obj.result(), x->klass(), tmp1, tmp2, tmp3,
1124                 x->direct_compare(), patching_info,
1125                 x->profiled_method(), x->profiled_bci());
1126 }
1127 
1128 
do_If(If * x)1129 void LIRGenerator::do_If(If* x) {
1130   assert(x->number_of_sux() == 2, "inconsistency");
1131   ValueTag tag = x->x()->type()->tag();
1132   LIRItem xitem(x->x(), this);
1133   LIRItem yitem(x->y(), this);
1134   LIRItem* xin = &xitem;
1135   LIRItem* yin = &yitem;
1136   If::Condition cond = x->cond();
1137 
1138   LIR_Opr left = LIR_OprFact::illegalOpr;
1139   LIR_Opr right = LIR_OprFact::illegalOpr;
1140 
1141   xin->load_item();
1142   left = xin->result();
1143 
1144   if (yin->result()->is_constant() && yin->result()->type() == T_INT &&
1145       Assembler::is_simm16(yin->result()->as_constant_ptr()->as_jint())) {
1146     // Inline int constants which are small enough to be immediate operands.
1147     right = LIR_OprFact::value_type(yin->value()->type());
1148   } else if (tag == longTag && yin->is_constant() && yin->get_jlong_constant() == 0 &&
1149              (cond == If::eql || cond == If::neq)) {
1150     // Inline long zero.
1151     right = LIR_OprFact::value_type(yin->value()->type());
1152   } else if (tag == objectTag && yin->is_constant() && (yin->get_jobject_constant()->is_null_object())) {
1153     right = LIR_OprFact::value_type(yin->value()->type());
1154   } else {
1155     yin->load_item();
1156     right = yin->result();
1157   }
1158   set_no_result(x);
1159 
1160   // Add safepoint before generating condition code so it can be recomputed.
1161   if (x->is_safepoint()) {
1162     // Increment backedge counter if needed.
1163     increment_backedge_counter_conditionally(lir_cond(cond), left, right, state_for(x, x->state_before()),
1164         x->tsux()->bci(), x->fsux()->bci(), x->profiled_bci());
1165     __ safepoint(safepoint_poll_register(), state_for(x, x->state_before()));
1166   }
1167 
1168   __ cmp(lir_cond(cond), left, right);
1169   // Generate branch profiling. Profiling code doesn't kill flags.
1170   profile_branch(x, cond);
1171   move_to_phi(x->state());
1172   if (x->x()->type()->is_float_kind()) {
1173     __ branch(lir_cond(cond), right->type(), x->tsux(), x->usux());
1174   } else {
1175     __ branch(lir_cond(cond), right->type(), x->tsux());
1176   }
1177   assert(x->default_sux() == x->fsux(), "wrong destination above");
1178   __ jump(x->default_sux());
1179 }
1180 
1181 
getThreadPointer()1182 LIR_Opr LIRGenerator::getThreadPointer() {
1183   return FrameMap::as_pointer_opr(R16_thread);
1184 }
1185 
1186 
trace_block_entry(BlockBegin * block)1187 void LIRGenerator::trace_block_entry(BlockBegin* block) {
1188   LIR_Opr arg1 = FrameMap::R3_opr; // ARG1
1189   __ move(LIR_OprFact::intConst(block->block_id()), arg1);
1190   LIR_OprList* args = new LIR_OprList(1);
1191   args->append(arg1);
1192   address func = CAST_FROM_FN_PTR(address, Runtime1::trace_block_entry);
1193   __ call_runtime_leaf(func, LIR_OprFact::illegalOpr, LIR_OprFact::illegalOpr, args);
1194 }
1195 
1196 
volatile_field_store(LIR_Opr value,LIR_Address * address,CodeEmitInfo * info)1197 void LIRGenerator::volatile_field_store(LIR_Opr value, LIR_Address* address,
1198                                         CodeEmitInfo* info) {
1199 #ifdef _LP64
1200   __ store(value, address, info);
1201 #else
1202   Unimplemented();
1203 //  __ volatile_store_mem_reg(value, address, info);
1204 #endif
1205 }
1206 
volatile_field_load(LIR_Address * address,LIR_Opr result,CodeEmitInfo * info)1207 void LIRGenerator::volatile_field_load(LIR_Address* address, LIR_Opr result,
1208                                        CodeEmitInfo* info) {
1209 #ifdef _LP64
1210   __ load(address, result, info);
1211 #else
1212   Unimplemented();
1213 //  __ volatile_load_mem_reg(address, result, info);
1214 #endif
1215 }
1216 
1217 
do_update_CRC32(Intrinsic * x)1218 void LIRGenerator::do_update_CRC32(Intrinsic* x) {
1219   assert(UseCRC32Intrinsics, "or should not be here");
1220   LIR_Opr result = rlock_result(x);
1221 
1222   switch (x->id()) {
1223     case vmIntrinsics::_updateCRC32: {
1224       LIRItem crc(x->argument_at(0), this);
1225       LIRItem val(x->argument_at(1), this);
1226       // Registers destroyed by update_crc32.
1227       crc.set_destroys_register();
1228       val.set_destroys_register();
1229       crc.load_item();
1230       val.load_item();
1231       __ update_crc32(crc.result(), val.result(), result);
1232       break;
1233     }
1234     case vmIntrinsics::_updateBytesCRC32:
1235     case vmIntrinsics::_updateByteBufferCRC32: {
1236       bool is_updateBytes = (x->id() == vmIntrinsics::_updateBytesCRC32);
1237 
1238       LIRItem crc(x->argument_at(0), this);
1239       LIRItem buf(x->argument_at(1), this);
1240       LIRItem off(x->argument_at(2), this);
1241       LIRItem len(x->argument_at(3), this);
1242       buf.load_item();
1243       off.load_nonconstant();
1244 
1245       LIR_Opr index = off.result();
1246       int offset = is_updateBytes ? arrayOopDesc::base_offset_in_bytes(T_BYTE) : 0;
1247       if (off.result()->is_constant()) {
1248         index = LIR_OprFact::illegalOpr;
1249         offset += off.result()->as_jint();
1250       }
1251       LIR_Opr base_op = buf.result();
1252       LIR_Address* a = NULL;
1253 
1254       if (index->is_valid()) {
1255         LIR_Opr tmp = new_register(T_LONG);
1256         __ convert(Bytecodes::_i2l, index, tmp);
1257         index = tmp;
1258         __ add(index, LIR_OprFact::intptrConst(offset), index);
1259         a = new LIR_Address(base_op, index, T_BYTE);
1260       } else {
1261         a = new LIR_Address(base_op, offset, T_BYTE);
1262       }
1263 
1264       BasicTypeList signature(3);
1265       signature.append(T_INT);
1266       signature.append(T_ADDRESS);
1267       signature.append(T_INT);
1268       CallingConvention* cc = frame_map()->c_calling_convention(&signature);
1269       const LIR_Opr result_reg = result_register_for(x->type());
1270 
1271       LIR_Opr arg1 = cc->at(0),
1272               arg2 = cc->at(1),
1273               arg3 = cc->at(2);
1274 
1275       crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32 stub doesn't care about high bits.
1276       __ leal(LIR_OprFact::address(a), arg2);
1277       len.load_item_force(arg3); // We skip int->long conversion here, , because CRC32 stub expects int.
1278 
1279       __ call_runtime_leaf(StubRoutines::updateBytesCRC32(), LIR_OprFact::illegalOpr, result_reg, cc->args());
1280       __ move(result_reg, result);
1281       break;
1282     }
1283     default: {
1284       ShouldNotReachHere();
1285     }
1286   }
1287 }
1288 
do_update_CRC32C(Intrinsic * x)1289 void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
1290   assert(UseCRC32CIntrinsics, "or should not be here");
1291   LIR_Opr result = rlock_result(x);
1292 
1293   switch (x->id()) {
1294     case vmIntrinsics::_updateBytesCRC32C:
1295     case vmIntrinsics::_updateDirectByteBufferCRC32C: {
1296       bool is_updateBytes = (x->id() == vmIntrinsics::_updateBytesCRC32C);
1297 
1298       LIRItem crc(x->argument_at(0), this);
1299       LIRItem buf(x->argument_at(1), this);
1300       LIRItem off(x->argument_at(2), this);
1301       LIRItem end(x->argument_at(3), this);
1302       buf.load_item();
1303       off.load_nonconstant();
1304       end.load_nonconstant();
1305 
1306       // len = end - off
1307       LIR_Opr len  = end.result();
1308       LIR_Opr tmpA = new_register(T_INT);
1309       LIR_Opr tmpB = new_register(T_INT);
1310       __ move(end.result(), tmpA);
1311       __ move(off.result(), tmpB);
1312       __ sub(tmpA, tmpB, tmpA);
1313       len = tmpA;
1314 
1315       LIR_Opr index = off.result();
1316       int offset = is_updateBytes ? arrayOopDesc::base_offset_in_bytes(T_BYTE) : 0;
1317       if (off.result()->is_constant()) {
1318         index = LIR_OprFact::illegalOpr;
1319         offset += off.result()->as_jint();
1320       }
1321       LIR_Opr base_op = buf.result();
1322       LIR_Address* a = NULL;
1323 
1324       if (index->is_valid()) {
1325         LIR_Opr tmp = new_register(T_LONG);
1326         __ convert(Bytecodes::_i2l, index, tmp);
1327         index = tmp;
1328         __ add(index, LIR_OprFact::intptrConst(offset), index);
1329         a = new LIR_Address(base_op, index, T_BYTE);
1330       } else {
1331         a = new LIR_Address(base_op, offset, T_BYTE);
1332       }
1333 
1334       BasicTypeList signature(3);
1335       signature.append(T_INT);
1336       signature.append(T_ADDRESS);
1337       signature.append(T_INT);
1338       CallingConvention* cc = frame_map()->c_calling_convention(&signature);
1339       const LIR_Opr result_reg = result_register_for(x->type());
1340 
1341       LIR_Opr arg1 = cc->at(0),
1342               arg2 = cc->at(1),
1343               arg3 = cc->at(2);
1344 
1345       crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32C stub doesn't care about high bits.
1346       __ leal(LIR_OprFact::address(a), arg2);
1347       __ move(len, cc->at(2));   // We skip int->long conversion here, because CRC32C stub expects int.
1348 
1349       __ call_runtime_leaf(StubRoutines::updateBytesCRC32C(), LIR_OprFact::illegalOpr, result_reg, cc->args());
1350       __ move(result_reg, result);
1351       break;
1352     }
1353     default: {
1354       ShouldNotReachHere();
1355     }
1356   }
1357 }
1358 
do_FmaIntrinsic(Intrinsic * x)1359 void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
1360   assert(x->number_of_arguments() == 3, "wrong type");
1361   assert(UseFMA, "Needs FMA instructions support.");
1362   LIRItem value(x->argument_at(0), this);
1363   LIRItem value1(x->argument_at(1), this);
1364   LIRItem value2(x->argument_at(2), this);
1365 
1366   value.load_item();
1367   value1.load_item();
1368   value2.load_item();
1369 
1370   LIR_Opr calc_input = value.result();
1371   LIR_Opr calc_input1 = value1.result();
1372   LIR_Opr calc_input2 = value2.result();
1373   LIR_Opr calc_result = rlock_result(x);
1374 
1375   switch (x->id()) {
1376   case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
1377   case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
1378   default:                  ShouldNotReachHere();
1379   }
1380 }
1381 
do_vectorizedMismatch(Intrinsic * x)1382 void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
1383   fatal("vectorizedMismatch intrinsic is not implemented on this platform");
1384 }
1385