5129
5130
5131 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
5132 Register tmp,
5133 int offset) {
5134 intptr_t value = *delayed_value_addr;
5135 if (value != 0)
5136 return RegisterOrConstant(value + offset);
5137
5138 // load indirectly to solve generation ordering problem
5139 movptr(tmp, ExternalAddress((address) delayed_value_addr));
5140
5141 #ifdef ASSERT
5142 { Label L;
5143 testptr(tmp, tmp);
5144 if (WizardMode) {
5145 const char* buf = NULL;
5146 {
5147 ResourceMark rm;
5148 stringStream ss;
5149 ss.print("DelayedValue="INTPTR_FORMAT, delayed_value_addr[1]);
5150 buf = code_string(ss.as_string());
5151 }
5152 jcc(Assembler::notZero, L);
5153 STOP(buf);
5154 } else {
5155 jccb(Assembler::notZero, L);
5156 hlt();
5157 }
5158 bind(L);
5159 }
5160 #endif
5161
5162 if (offset != 0)
5163 addptr(tmp, offset);
5164
5165 return RegisterOrConstant(tmp);
5166 }
5167
5168
5169 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
|
5129
5130
5131 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
5132 Register tmp,
5133 int offset) {
5134 intptr_t value = *delayed_value_addr;
5135 if (value != 0)
5136 return RegisterOrConstant(value + offset);
5137
5138 // load indirectly to solve generation ordering problem
5139 movptr(tmp, ExternalAddress((address) delayed_value_addr));
5140
5141 #ifdef ASSERT
5142 { Label L;
5143 testptr(tmp, tmp);
5144 if (WizardMode) {
5145 const char* buf = NULL;
5146 {
5147 ResourceMark rm;
5148 stringStream ss;
5149 ss.print("DelayedValue=" INTPTR_FORMAT, delayed_value_addr[1]);
5150 buf = code_string(ss.as_string());
5151 }
5152 jcc(Assembler::notZero, L);
5153 STOP(buf);
5154 } else {
5155 jccb(Assembler::notZero, L);
5156 hlt();
5157 }
5158 bind(L);
5159 }
5160 #endif
5161
5162 if (offset != 0)
5163 addptr(tmp, offset);
5164
5165 return RegisterOrConstant(tmp);
5166 }
5167
5168
5169 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
|