4353 %{
4354 predicate(!UseCompactObjectHeaders);
4355 match(Set dst (LoadNKlass mem));
4356
4357 ins_cost(125); // XXX
4358 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
4359 ins_encode %{
4360 __ movl($dst$$Register, $mem$$Address);
4361 %}
4362 ins_pipe(ialu_reg_mem); // XXX
4363 %}
4364
4365 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
4366 %{
4367 predicate(UseCompactObjectHeaders);
4368 match(Set dst (LoadNKlass mem));
4369 effect(KILL cr);
4370 ins_cost(125); // XXX
4371 format %{
4372 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
4373 "shrl $dst, markWord::klass_shift_at_offset"
4374 %}
4375 ins_encode %{
4376 __ movl($dst$$Register, $mem$$Address);
4377 __ shrl($dst$$Register, markWord::klass_shift_at_offset);
4378 %}
4379 ins_pipe(ialu_reg_mem); // XXX
4380 %}
4381
4382 // Load Float
4383 instruct loadF(regF dst, memory mem)
4384 %{
4385 match(Set dst (LoadF mem));
4386
4387 ins_cost(145); // XXX
4388 format %{ "movss $dst, $mem\t# float" %}
4389 ins_encode %{
4390 __ movflt($dst$$XMMRegister, $mem$$Address);
4391 %}
4392 ins_pipe(pipe_slow); // XXX
4393 %}
4394
4395 // Load Double
4396 instruct loadD_partial(regD dst, memory mem)
4397 %{
|
4353 %{
4354 predicate(!UseCompactObjectHeaders);
4355 match(Set dst (LoadNKlass mem));
4356
4357 ins_cost(125); // XXX
4358 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
4359 ins_encode %{
4360 __ movl($dst$$Register, $mem$$Address);
4361 %}
4362 ins_pipe(ialu_reg_mem); // XXX
4363 %}
4364
4365 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
4366 %{
4367 predicate(UseCompactObjectHeaders);
4368 match(Set dst (LoadNKlass mem));
4369 effect(KILL cr);
4370 ins_cost(125); // XXX
4371 format %{
4372 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
4373 "shrl $dst, markWord::klass_shift"
4374 %}
4375 ins_encode %{
4376 // The incoming address is pointing into obj-start + klass_offset_in_bytes. We need to extract
4377 // obj-start, so that we can load from the object's mark-word instead. Usually the address
4378 // comes as obj-start in obj and klass_offset_in_bytes in disp.
4379 Register d = $dst$$Register;
4380 Address s = $mem$$Address;
4381 __ movl(d, s.plus_disp(-Type::klass_offset()));
4382 __ shrl(d, markWord::klass_shift);
4383 %}
4384 ins_pipe(ialu_reg_mem); // XXX
4385 %}
4386
4387 // Load Float
4388 instruct loadF(regF dst, memory mem)
4389 %{
4390 match(Set dst (LoadF mem));
4391
4392 ins_cost(145); // XXX
4393 format %{ "movss $dst, $mem\t# float" %}
4394 ins_encode %{
4395 __ movflt($dst$$XMMRegister, $mem$$Address);
4396 %}
4397 ins_pipe(pipe_slow); // XXX
4398 %}
4399
4400 // Load Double
4401 instruct loadD_partial(regD dst, memory mem)
4402 %{
|