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