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