7276 %{
7277 predicate(!UseCompactObjectHeaders);
7278 match(Set dst (LoadNKlass mem));
7279
7280 ins_cost(125); // XXX
7281 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
7282 ins_encode %{
7283 __ movl($dst$$Register, $mem$$Address);
7284 %}
7285 ins_pipe(ialu_reg_mem); // XXX
7286 %}
7287
7288 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
7289 %{
7290 predicate(UseCompactObjectHeaders);
7291 match(Set dst (LoadNKlass mem));
7292 effect(KILL cr);
7293 ins_cost(125);
7294 format %{
7295 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
7296 "shrl $dst, markWord::klass_shift_at_offset"
7297 %}
7298 ins_encode %{
7299 if (UseAPX) {
7300 __ eshrl($dst$$Register, $mem$$Address, markWord::klass_shift_at_offset, false);
7301 }
7302 else {
7303 __ movl($dst$$Register, $mem$$Address);
7304 __ shrl($dst$$Register, markWord::klass_shift_at_offset);
7305 }
7306 %}
7307 ins_pipe(ialu_reg_mem);
7308 %}
7309
7310 // Load Float
7311 instruct loadF(regF dst, memory mem)
7312 %{
7313 match(Set dst (LoadF mem));
7314
7315 ins_cost(145); // XXX
7316 format %{ "movss $dst, $mem\t# float" %}
7317 ins_encode %{
7318 __ movflt($dst$$XMMRegister, $mem$$Address);
7319 %}
7320 ins_pipe(pipe_slow); // XXX
7321 %}
7322
7323 // Load Double
7324 instruct loadD_partial(regD dst, memory mem)
|
7276 %{
7277 predicate(!UseCompactObjectHeaders);
7278 match(Set dst (LoadNKlass mem));
7279
7280 ins_cost(125); // XXX
7281 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
7282 ins_encode %{
7283 __ movl($dst$$Register, $mem$$Address);
7284 %}
7285 ins_pipe(ialu_reg_mem); // XXX
7286 %}
7287
7288 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
7289 %{
7290 predicate(UseCompactObjectHeaders);
7291 match(Set dst (LoadNKlass mem));
7292 effect(KILL cr);
7293 ins_cost(125);
7294 format %{
7295 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
7296 "shrl $dst, markWord::klass_shift"
7297 %}
7298 ins_encode %{
7299 // The incoming address is pointing into obj-start + Type::klass_offset(). We need to extract
7300 // obj-start, so that we can load from the object's mark-word instead.
7301 Register d = $dst$$Register;
7302 Address s = ($mem$$Address).plus_disp(-Type::klass_offset());
7303 if (UseAPX) {
7304 __ eshrl(d, s, markWord::klass_shift, false);
7305 } else {
7306 __ movl(d, s);
7307 __ shrl(d, markWord::klass_shift);
7308 }
7309 %}
7310 ins_pipe(ialu_reg_mem);
7311 %}
7312
7313 // Load Float
7314 instruct loadF(regF dst, memory mem)
7315 %{
7316 match(Set dst (LoadF mem));
7317
7318 ins_cost(145); // XXX
7319 format %{ "movss $dst, $mem\t# float" %}
7320 ins_encode %{
7321 __ movflt($dst$$XMMRegister, $mem$$Address);
7322 %}
7323 ins_pipe(pipe_slow); // XXX
7324 %}
7325
7326 // Load Double
7327 instruct loadD_partial(regD dst, memory mem)
|