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