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