7146 %{
7147 predicate(!UseCompactObjectHeaders);
7148 match(Set dst (LoadNKlass mem));
7149
7150 ins_cost(125); // XXX
7151 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
7152 ins_encode %{
7153 __ movl($dst$$Register, $mem$$Address);
7154 %}
7155 ins_pipe(ialu_reg_mem); // XXX
7156 %}
7157
7158 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
7159 %{
7160 predicate(UseCompactObjectHeaders);
7161 match(Set dst (LoadNKlass mem));
7162 effect(KILL cr);
7163 ins_cost(125);
7164 format %{
7165 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
7166 "shrl $dst, markWord::klass_shift_at_offset"
7167 %}
7168 ins_encode %{
7169 if (UseAPX) {
7170 __ eshrl($dst$$Register, $mem$$Address, markWord::klass_shift_at_offset, false);
7171 }
7172 else {
7173 __ movl($dst$$Register, $mem$$Address);
7174 __ shrl($dst$$Register, markWord::klass_shift_at_offset);
7175 }
7176 %}
7177 ins_pipe(ialu_reg_mem);
7178 %}
7179
7180 // Load Float
7181 instruct loadF(regF dst, memory mem)
7182 %{
7183 match(Set dst (LoadF mem));
7184
7185 ins_cost(145); // XXX
7186 format %{ "movss $dst, $mem\t# float" %}
7187 ins_encode %{
7188 __ movflt($dst$$XMMRegister, $mem$$Address);
7189 %}
7190 ins_pipe(pipe_slow); // XXX
7191 %}
7192
7193 // Load Double
7194 instruct loadD_partial(regD dst, memory mem)
|
7146 %{
7147 predicate(!UseCompactObjectHeaders);
7148 match(Set dst (LoadNKlass mem));
7149
7150 ins_cost(125); // XXX
7151 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
7152 ins_encode %{
7153 __ movl($dst$$Register, $mem$$Address);
7154 %}
7155 ins_pipe(ialu_reg_mem); // XXX
7156 %}
7157
7158 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
7159 %{
7160 predicate(UseCompactObjectHeaders);
7161 match(Set dst (LoadNKlass mem));
7162 effect(KILL cr);
7163 ins_cost(125);
7164 format %{
7165 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
7166 "shrl $dst, markWord::klass_shift"
7167 %}
7168 ins_encode %{
7169 // The incoming address is pointing into obj-start + Type::klass_offset(). We need to extract
7170 // obj-start, so that we can load from the object's mark-word instead.
7171 Register d = $dst$$Register;
7172 Address s = ($mem$$Address).plus_disp(-Type::klass_offset());
7173 if (UseAPX) {
7174 __ eshrl(d, s, markWord::klass_shift, false);
7175 } else {
7176 __ movl(d, s);
7177 __ shrl(d, markWord::klass_shift);
7178 }
7179 %}
7180 ins_pipe(ialu_reg_mem);
7181 %}
7182
7183 // Load Float
7184 instruct loadF(regF dst, memory mem)
7185 %{
7186 match(Set dst (LoadF mem));
7187
7188 ins_cost(145); // XXX
7189 format %{ "movss $dst, $mem\t# float" %}
7190 ins_encode %{
7191 __ movflt($dst$$XMMRegister, $mem$$Address);
7192 %}
7193 ins_pipe(pipe_slow); // XXX
7194 %}
7195
7196 // Load Double
7197 instruct loadD_partial(regD dst, memory mem)
|