comparison src/cpu/x86/vm/x86_64.ad @ 163:885ed790ecf0

6695810: null oop passed to encode_heap_oop_not_null Summary: fix several problems in C2 related to Escape Analysis and Compressed Oops. Reviewed-by: never, jrose
author kvn
date Wed, 21 May 2008 10:45:07 -0700
parents f3de1255b035
children c436414a719e
comparison
equal deleted inserted replaced
162:8aa010f60e0f 163:885ed790ecf0
6042 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 6042 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem));
6043 ins_pipe(ialu_reg_mem); // XXX 6043 ins_pipe(ialu_reg_mem); // XXX
6044 %} 6044 %}
6045 6045
6046 // Load Compressed Pointer 6046 // Load Compressed Pointer
6047 instruct loadN(rRegN dst, memory mem, rFlagsReg cr) 6047 instruct loadN(rRegN dst, memory mem)
6048 %{ 6048 %{
6049 match(Set dst (LoadN mem)); 6049 match(Set dst (LoadN mem));
6050 effect(KILL cr);
6051 6050
6052 ins_cost(125); // XXX 6051 ins_cost(125); // XXX
6053 format %{ "movl $dst, $mem\t# compressed ptr" %} 6052 format %{ "movl $dst, $mem\t# compressed ptr" %}
6054 ins_encode %{ 6053 ins_encode %{
6055 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 6054 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);
6062 6061
6063 // Load Klass Pointer 6062 // Load Klass Pointer
6064 instruct loadKlass(rRegP dst, memory mem) 6063 instruct loadKlass(rRegP dst, memory mem)
6065 %{ 6064 %{
6066 match(Set dst (LoadKlass mem)); 6065 match(Set dst (LoadKlass mem));
6067 predicate(!n->in(MemNode::Address)->bottom_type()->is_narrow()); 6066 predicate(!n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop());
6068 6067
6069 ins_cost(125); // XXX 6068 ins_cost(125); // XXX
6070 format %{ "movq $dst, $mem\t# class" %} 6069 format %{ "movq $dst, $mem\t# class" %}
6071 opcode(0x8B); 6070 opcode(0x8B);
6072 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); 6071 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem));
6073 ins_pipe(ialu_reg_mem); // XXX 6072 ins_pipe(ialu_reg_mem); // XXX
6074 %} 6073 %}
6075 6074
6076 // Load Klass Pointer 6075 // Load Klass Pointer
6077 instruct loadKlassComp(rRegP dst, memory mem) 6076 instruct loadKlassComp(rRegP dst, memory mem, rFlagsReg cr)
6078 %{ 6077 %{
6079 match(Set dst (LoadKlass mem)); 6078 match(Set dst (LoadKlass mem));
6080 predicate(n->in(MemNode::Address)->bottom_type()->is_narrow()); 6079 predicate(n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop());
6080 effect(KILL cr);
6081 6081
6082 ins_cost(125); // XXX 6082 ins_cost(125); // XXX
6083 format %{ "movl $dst, $mem\t# compressed class\n\t" 6083 format %{ "movl $dst, $mem\t# compressed class\n\t"
6084 "decode_heap_oop $dst,$dst" %} 6084 "decode_heap_oop $dst,$dst" %}
6085 ins_encode %{ 6085 ins_encode %{
6356 __ xorq(dst, dst); 6356 __ xorq(dst, dst);
6357 %} 6357 %}
6358 ins_pipe(ialu_reg); 6358 ins_pipe(ialu_reg);
6359 %} 6359 %}
6360 6360
6361 instruct loadConN(rRegN dst, immN src) %{ 6361 instruct loadConN(rRegN dst, immN src, rFlagsReg cr) %{
6362 match(Set dst src); 6362 match(Set dst src);
6363 effect(KILL cr);
6363 6364
6364 ins_cost(125); 6365 ins_cost(125);
6365 format %{ "movq $dst, $src\t# compressed ptr\n\t" 6366 format %{ "movq $dst, $src\t# compressed ptr\n\t"
6366 "encode_heap_oop_not_null $dst,$dst" %} 6367 "encode_heap_oop_not_null $dst,$dst" %}
6367 ins_encode %{ 6368 ins_encode %{
6631 ins_encode(REX_mem_wide(mem), OpcP, RM_opc_mem(0x00, mem), Con32(src)); 6632 ins_encode(REX_mem_wide(mem), OpcP, RM_opc_mem(0x00, mem), Con32(src));
6632 ins_pipe(ialu_mem_imm); 6633 ins_pipe(ialu_mem_imm);
6633 %} 6634 %}
6634 6635
6635 // Store Compressed Pointer 6636 // Store Compressed Pointer
6636 instruct storeN(memory mem, rRegN src, rFlagsReg cr) 6637 instruct storeN(memory mem, rRegN src)
6637 %{ 6638 %{
6638 match(Set mem (StoreN mem src)); 6639 match(Set mem (StoreN mem src));
6639 effect(KILL cr);
6640 6640
6641 ins_cost(125); // XXX 6641 ins_cost(125); // XXX
6642 format %{ "movl $mem, $src\t# ptr" %} 6642 format %{ "movl $mem, $src\t# ptr" %}
6643 ins_encode %{ 6643 ins_encode %{
6644 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 6644 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);