Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/x86_64.ad @ 164:c436414a719e
6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
Summary: Add LoadNKlass and CMoveN nodes, use CmpN and ConN nodes to generate narrow oops compare instructions.
Reviewed-by: never, rasbold
author | kvn |
---|---|
date | Wed, 21 May 2008 13:46:23 -0700 |
parents | 885ed790ecf0 |
children | 7793bd37a336 |
comparison
equal
deleted
inserted
replaced
163:885ed790ecf0 | 164:c436414a719e |
---|---|
6061 | 6061 |
6062 // Load Klass Pointer | 6062 // Load Klass Pointer |
6063 instruct loadKlass(rRegP dst, memory mem) | 6063 instruct loadKlass(rRegP dst, memory mem) |
6064 %{ | 6064 %{ |
6065 match(Set dst (LoadKlass mem)); | 6065 match(Set dst (LoadKlass mem)); |
6066 predicate(!n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop()); | |
6067 | 6066 |
6068 ins_cost(125); // XXX | 6067 ins_cost(125); // XXX |
6069 format %{ "movq $dst, $mem\t# class" %} | 6068 format %{ "movq $dst, $mem\t# class" %} |
6070 opcode(0x8B); | 6069 opcode(0x8B); |
6071 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); | 6070 ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem)); |
6072 ins_pipe(ialu_reg_mem); // XXX | 6071 ins_pipe(ialu_reg_mem); // XXX |
6073 %} | 6072 %} |
6074 | 6073 |
6075 // Load Klass Pointer | 6074 // Load narrow Klass Pointer |
6076 instruct loadKlassComp(rRegP dst, memory mem, rFlagsReg cr) | 6075 instruct loadNKlass(rRegN dst, memory mem) |
6077 %{ | 6076 %{ |
6078 match(Set dst (LoadKlass mem)); | 6077 match(Set dst (LoadNKlass mem)); |
6079 predicate(n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop()); | |
6080 effect(KILL cr); | |
6081 | 6078 |
6082 ins_cost(125); // XXX | 6079 ins_cost(125); // XXX |
6083 format %{ "movl $dst, $mem\t# compressed class\n\t" | 6080 format %{ "movl $dst, $mem\t# compressed klass ptr\n\t" %} |
6084 "decode_heap_oop $dst,$dst" %} | |
6085 ins_encode %{ | 6081 ins_encode %{ |
6086 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); | 6082 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); |
6087 Register dst = as_Register($dst$$reg); | 6083 Register dst = as_Register($dst$$reg); |
6088 __ movl(dst, addr); | 6084 __ movl(dst, addr); |
6089 // klass is never null in the header but this is generated for all | |
6090 // klass loads not just the _klass field in the header. | |
6091 __ decode_heap_oop(dst); | |
6092 %} | 6085 %} |
6093 ins_pipe(ialu_reg_mem); // XXX | 6086 ins_pipe(ialu_reg_mem); // XXX |
6094 %} | 6087 %} |
6095 | 6088 |
6096 // Load Float | 6089 // Load Float |
6356 __ xorq(dst, dst); | 6349 __ xorq(dst, dst); |
6357 %} | 6350 %} |
6358 ins_pipe(ialu_reg); | 6351 ins_pipe(ialu_reg); |
6359 %} | 6352 %} |
6360 | 6353 |
6361 instruct loadConN(rRegN dst, immN src, rFlagsReg cr) %{ | 6354 instruct loadConN(rRegN dst, immN src) %{ |
6362 match(Set dst src); | 6355 match(Set dst src); |
6363 effect(KILL cr); | |
6364 | 6356 |
6365 ins_cost(125); | 6357 ins_cost(125); |
6366 format %{ "movq $dst, $src\t# compressed ptr\n\t" | 6358 format %{ "movl $dst, $src\t# compressed ptr" %} |
6367 "encode_heap_oop_not_null $dst,$dst" %} | |
6368 ins_encode %{ | 6359 ins_encode %{ |
6369 address con = (address)$src$$constant; | 6360 address con = (address)$src$$constant; |
6370 Register dst = $dst$$Register; | 6361 Register dst = $dst$$Register; |
6371 if (con == NULL) { | 6362 if (con == NULL) { |
6372 ShouldNotReachHere(); | 6363 ShouldNotReachHere(); |
6373 } else { | 6364 } else { |
6374 __ movoop(dst, (jobject)$src$$constant); | 6365 __ set_narrow_oop(dst, (jobject)$src$$constant); |
6375 __ encode_heap_oop_not_null(dst); | |
6376 } | 6366 } |
6377 %} | 6367 %} |
6378 ins_pipe(ialu_reg_fat); // XXX | 6368 ins_pipe(ialu_reg_fat); // XXX |
6379 %} | 6369 %} |
6380 | 6370 |
6637 instruct storeN(memory mem, rRegN src) | 6627 instruct storeN(memory mem, rRegN src) |
6638 %{ | 6628 %{ |
6639 match(Set mem (StoreN mem src)); | 6629 match(Set mem (StoreN mem src)); |
6640 | 6630 |
6641 ins_cost(125); // XXX | 6631 ins_cost(125); // XXX |
6642 format %{ "movl $mem, $src\t# ptr" %} | 6632 format %{ "movl $mem, $src\t# compressed ptr" %} |
6643 ins_encode %{ | 6633 ins_encode %{ |
6644 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); | 6634 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); |
6645 Register src = as_Register($src$$reg); | 6635 Register src = as_Register($src$$reg); |
6646 __ movl(addr, src); | 6636 __ movl(addr, src); |
6647 %} | 6637 %} |
7138 ins_cost(250); // XXX | 7128 ins_cost(250); // XXX |
7139 format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} | 7129 format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} |
7140 opcode(0x0F, 0x40); | 7130 opcode(0x0F, 0x40); |
7141 ins_encode(REX_reg_mem(dst, src), enc_cmov(cop), reg_mem(dst, src)); | 7131 ins_encode(REX_reg_mem(dst, src), enc_cmov(cop), reg_mem(dst, src)); |
7142 ins_pipe(pipe_cmov_mem); | 7132 ins_pipe(pipe_cmov_mem); |
7133 %} | |
7134 | |
7135 // Conditional move | |
7136 instruct cmovN_reg(rRegN dst, rRegN src, rFlagsReg cr, cmpOp cop) | |
7137 %{ | |
7138 match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); | |
7139 | |
7140 ins_cost(200); // XXX | |
7141 format %{ "cmovl$cop $dst, $src\t# signed, compressed ptr" %} | |
7142 opcode(0x0F, 0x40); | |
7143 ins_encode(REX_reg_reg(dst, src), enc_cmov(cop), reg_reg(dst, src)); | |
7144 ins_pipe(pipe_cmov_reg); | |
7145 %} | |
7146 | |
7147 // Conditional move | |
7148 instruct cmovN_regU(rRegN dst, rRegN src, rFlagsRegU cr, cmpOpU cop) | |
7149 %{ | |
7150 match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); | |
7151 | |
7152 ins_cost(200); // XXX | |
7153 format %{ "cmovl$cop $dst, $src\t# unsigned, compressed ptr" %} | |
7154 opcode(0x0F, 0x40); | |
7155 ins_encode(REX_reg_reg(dst, src), enc_cmov(cop), reg_reg(dst, src)); | |
7156 ins_pipe(pipe_cmov_reg); | |
7143 %} | 7157 %} |
7144 | 7158 |
7145 // Conditional move | 7159 // Conditional move |
7146 instruct cmovP_reg(rRegP dst, rRegP src, rFlagsReg cr, cmpOp cop) | 7160 instruct cmovP_reg(rRegP dst, rRegP src, rFlagsReg cr, cmpOp cop) |
7147 %{ | 7161 %{ |
11053 ins_encode(REX_mem_wide(op), | 11067 ins_encode(REX_mem_wide(op), |
11054 OpcP, RM_opc_mem(0x00, op), Con_d32(0xFFFFFFFF)); | 11068 OpcP, RM_opc_mem(0x00, op), Con_d32(0xFFFFFFFF)); |
11055 ins_pipe(ialu_cr_reg_imm); | 11069 ins_pipe(ialu_cr_reg_imm); |
11056 %} | 11070 %} |
11057 | 11071 |
11072 | |
11073 instruct compN_rReg(rFlagsRegU cr, rRegN op1, rRegN op2) | |
11074 %{ | |
11075 match(Set cr (CmpN op1 op2)); | |
11076 | |
11077 format %{ "cmpl $op1, $op2\t# compressed ptr" %} | |
11078 ins_encode %{ __ cmpl(as_Register($op1$$reg), as_Register($op2$$reg)); %} | |
11079 ins_pipe(ialu_cr_reg_reg); | |
11080 %} | |
11081 | |
11082 instruct compN_rReg_mem(rFlagsRegU cr, rRegN src, memory mem) | |
11083 %{ | |
11084 match(Set cr (CmpN src (LoadN mem))); | |
11085 | |
11086 ins_cost(500); // XXX | |
11087 format %{ "cmpl $src, mem\t# compressed ptr" %} | |
11088 ins_encode %{ | |
11089 Address adr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); | |
11090 __ cmpl(as_Register($src$$reg), adr); | |
11091 %} | |
11092 ins_pipe(ialu_cr_reg_mem); | |
11093 %} | |
11094 | |
11058 instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{ | 11095 instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{ |
11059 match(Set cr (CmpN src zero)); | 11096 match(Set cr (CmpN src zero)); |
11060 | 11097 |
11061 format %{ "testl $src, $src" %} | 11098 format %{ "testl $src, $src\t# compressed ptr" %} |
11062 ins_encode %{ __ testl($src$$Register, $src$$Register); %} | 11099 ins_encode %{ __ testl($src$$Register, $src$$Register); %} |
11063 ins_pipe(ialu_cr_reg_imm); | 11100 ins_pipe(ialu_cr_reg_imm); |
11101 %} | |
11102 | |
11103 instruct testN_reg_mem(rFlagsReg cr, memory mem, immN0 zero) | |
11104 %{ | |
11105 match(Set cr (CmpN (LoadN mem) zero)); | |
11106 | |
11107 ins_cost(500); // XXX | |
11108 format %{ "testl $mem, 0xffffffff\t# compressed ptr" %} | |
11109 ins_encode %{ | |
11110 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); | |
11111 __ cmpl(addr, (int)0xFFFFFFFF); | |
11112 %} | |
11113 ins_pipe(ialu_cr_reg_mem); | |
11064 %} | 11114 %} |
11065 | 11115 |
11066 // Yanked all unsigned pointer compare operations. | 11116 // Yanked all unsigned pointer compare operations. |
11067 // Pointer compares are done with CmpP which is already unsigned. | 11117 // Pointer compares are done with CmpP which is already unsigned. |
11068 | 11118 |