4379 %{
4380 predicate(!UseCompactObjectHeaders);
4381 match(Set dst (LoadNKlass mem));
4382
4383 ins_cost(125); // XXX
4384 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
4385 ins_encode %{
4386 __ movl($dst$$Register, $mem$$Address);
4387 %}
4388 ins_pipe(ialu_reg_mem); // XXX
4389 %}
4390
4391 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
4392 %{
4393 predicate(UseCompactObjectHeaders);
4394 match(Set dst (LoadNKlass mem));
4395 effect(KILL cr);
4396 ins_cost(125);
4397 format %{
4398 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
4399 "shrl $dst, markWord::klass_shift_at_offset"
4400 %}
4401 ins_encode %{
4402 if (UseAPX) {
4403 __ eshrl($dst$$Register, $mem$$Address, markWord::klass_shift_at_offset, false);
4404 }
4405 else {
4406 __ movl($dst$$Register, $mem$$Address);
4407 __ shrl($dst$$Register, markWord::klass_shift_at_offset);
4408 }
4409 %}
4410 ins_pipe(ialu_reg_mem);
4411 %}
4412
4413 // Load Float
4414 instruct loadF(regF dst, memory mem)
4415 %{
4416 match(Set dst (LoadF mem));
4417
4418 ins_cost(145); // XXX
4419 format %{ "movss $dst, $mem\t# float" %}
4420 ins_encode %{
4421 __ movflt($dst$$XMMRegister, $mem$$Address);
4422 %}
4423 ins_pipe(pipe_slow); // XXX
4424 %}
4425
4426 // Load Double
4427 instruct loadD_partial(regD dst, memory mem)
|
4379 %{
4380 predicate(!UseCompactObjectHeaders);
4381 match(Set dst (LoadNKlass mem));
4382
4383 ins_cost(125); // XXX
4384 format %{ "movl $dst, $mem\t# compressed klass ptr" %}
4385 ins_encode %{
4386 __ movl($dst$$Register, $mem$$Address);
4387 %}
4388 ins_pipe(ialu_reg_mem); // XXX
4389 %}
4390
4391 instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr)
4392 %{
4393 predicate(UseCompactObjectHeaders);
4394 match(Set dst (LoadNKlass mem));
4395 effect(KILL cr);
4396 ins_cost(125);
4397 format %{
4398 "movl $dst, $mem\t# compressed klass ptr, shifted\n\t"
4399 "shrl $dst, markWord::klass_shift"
4400 %}
4401 ins_encode %{
4402 // The incoming address is pointing into obj-start + Type::klass_offset(). We need to extract
4403 // obj-start, so that we can load from the object's mark-word instead.
4404 Register d = $dst$$Register;
4405 Address s = ($mem$$Address).plus_disp(-Type::klass_offset());
4406 if (UseAPX) {
4407 __ eshrl(d, s, markWord::klass_shift, false);
4408 } else {
4409 __ movl(d, s);
4410 __ shrl(d, markWord::klass_shift);
4411 }
4412 %}
4413 ins_pipe(ialu_reg_mem);
4414 %}
4415
4416 // Load Float
4417 instruct loadF(regF dst, memory mem)
4418 %{
4419 match(Set dst (LoadF mem));
4420
4421 ins_cost(145); // XXX
4422 format %{ "movss $dst, $mem\t# float" %}
4423 ins_encode %{
4424 __ movflt($dst$$XMMRegister, $mem$$Address);
4425 %}
4426 ins_pipe(pipe_slow); // XXX
4427 %}
4428
4429 // Load Double
4430 instruct loadD_partial(regD dst, memory mem)
|