src/cpu/sparc/vm/sparc.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
6703890 Cdiff src/cpu/sparc/vm/sparc.ad
src/cpu/sparc/vm/sparc.ad
Print this page
*** 5469,5479 ****
%}
// Load Klass Pointer
instruct loadKlass(iRegP dst, memory mem) %{
match(Set dst (LoadKlass mem));
- predicate(!n->in(MemNode::Address)->bottom_type()->is_narrow());
ins_cost(MEMORY_REF_COST);
size(4);
#ifndef _LP64
format %{ "LDUW $mem,$dst\t! klass ptr" %}
--- 5469,5478 ----
*** 5484,5497 ****
#endif
ins_encode( form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
! // Load Klass Pointer
! instruct loadKlassComp(iRegP dst, memory mem) %{
! match(Set dst (LoadKlass mem));
! predicate(n->in(MemNode::Address)->bottom_type()->is_narrow());
ins_cost(MEMORY_REF_COST);
format %{ "LDUW $mem,$dst\t! compressed klass ptr" %}
ins_encode %{
--- 5483,5495 ----
#endif
ins_encode( form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
! // Load narrow Klass Pointer
! instruct loadNKlass(iRegN dst, memory mem) %{
! match(Set dst (LoadNKlass mem));
ins_cost(MEMORY_REF_COST);
format %{ "LDUW $mem,$dst\t! compressed klass ptr" %}
ins_encode %{
*** 5501,5513 ****
if (index != G0) {
__ lduw(base, index, dst);
} else {
__ lduw(base, $mem$$disp, dst);
}
- // klass oop never null but this is generated for nonheader klass loads
- // too which can be null.
- __ decode_heap_oop(dst);
%}
ins_pipe(iload_mem);
%}
// Load Short (16bit signed)
--- 5499,5508 ----
*** 5607,5632 ****
__ sethi(polling_page, false );
%}
ins_pipe(loadConP_poll);
%}
instruct loadConN(iRegN dst, immN src) %{
match(Set dst src);
! ins_cost(DEFAULT_COST * 2);
! format %{ "SET $src,$dst\t!ptr" %}
ins_encode %{
- address con = (address)$src$$constant;
Register dst = $dst$$Register;
! if (con == NULL) {
! __ mov(G0, dst);
! } else {
! __ set_oop((jobject)$src$$constant, dst);
! __ encode_heap_oop(dst);
! }
%}
! ins_pipe(loadConP);
!
%}
instruct loadConL(iRegL dst, immL src, o7RegL tmp) %{
// %%% maybe this should work like loadConD
match(Set dst src);
--- 5602,5629 ----
__ sethi(polling_page, false );
%}
ins_pipe(loadConP_poll);
%}
+ instruct loadConN0(iRegN dst, immN0 src) %{
+ match(Set dst src);
+
+ size(4);
+ format %{ "CLR $dst\t! compressed NULL ptr" %}
+ ins_encode( SetNull( dst ) );
+ ins_pipe(ialu_imm);
+ %}
+
instruct loadConN(iRegN dst, immN src) %{
match(Set dst src);
! ins_cost(DEFAULT_COST * 3/2);
! format %{ "SET $src,$dst\t! compressed ptr" %}
ins_encode %{
Register dst = $dst$$Register;
! __ set_narrow_oop((jobject)$src$$constant, dst);
%}
! ins_pipe(ialu_hi_lo_reg);
%}
instruct loadConL(iRegL dst, immL src, o7RegL tmp) %{
// %%% maybe this should work like loadConD
match(Set dst src);
*** 6256,6265 ****
--- 6253,6290 ----
format %{ "MOV$cmp $fcc,$src,$dst" %}
ins_encode( enc_cmov_imm_f(cmp,dst,src, fcc) );
ins_pipe(ialu_imm);
%}
+ // Conditional move for RegN. Only cmov(reg,reg).
+ instruct cmovNP_reg(cmpOpP cmp, flagsRegP pcc, iRegN dst, iRegN src) %{
+ match(Set dst (CMoveN (Binary cmp pcc) (Binary dst src)));
+ ins_cost(150);
+ format %{ "MOV$cmp $pcc,$src,$dst" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::ptr_cc)) );
+ ins_pipe(ialu_reg);
+ %}
+
+ // This instruction also works with CmpN so we don't need cmovNN_reg.
+ instruct cmovNI_reg(cmpOp cmp, flagsReg icc, iRegN dst, iRegN src) %{
+ match(Set dst (CMoveN (Binary cmp icc) (Binary dst src)));
+ ins_cost(150);
+ size(4);
+ format %{ "MOV$cmp $icc,$src,$dst" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::icc)) );
+ ins_pipe(ialu_reg);
+ %}
+
+ instruct cmovNF_reg(cmpOpF cmp, flagsRegF fcc, iRegN dst, iRegN src) %{
+ match(Set dst (CMoveN (Binary cmp fcc) (Binary dst src)));
+ ins_cost(150);
+ size(4);
+ format %{ "MOV$cmp $fcc,$src,$dst" %}
+ ins_encode( enc_cmov_reg_f(cmp,dst,src, fcc) );
+ ins_pipe(ialu_reg);
+ %}
+
// Conditional move
instruct cmovPP_reg(cmpOpP cmp, flagsRegP pcc, iRegP dst, iRegP src) %{
match(Set dst (CMoveP (Binary cmp pcc) (Binary dst src)));
ins_cost(150);
format %{ "MOV$cmp $pcc,$src,$dst\t! ptr" %}
*** 6273,6282 ****
--- 6298,6308 ----
format %{ "MOV$cmp $pcc,$src,$dst\t! ptr" %}
ins_encode( enc_cmov_imm(cmp,dst,src, (Assembler::ptr_cc)) );
ins_pipe(ialu_imm);
%}
+ // This instruction also works with CmpN so we don't need cmovPN_reg.
instruct cmovPI_reg(cmpOp cmp, flagsReg icc, iRegP dst, iRegP src) %{
match(Set dst (CMoveP (Binary cmp icc) (Binary dst src)));
ins_cost(150);
size(4);
*** 8263,8272 ****
--- 8289,8319 ----
opcode(Assembler::subcc_op3, Assembler::arith_op);
ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) );
ins_pipe(ialu_cconly_reg_imm);
%}
+ // Compare Narrow oops
+ instruct compN_iRegN(flagsReg icc, iRegN op1, iRegN op2 ) %{
+ match(Set icc (CmpN op1 op2));
+
+ size(4);
+ format %{ "CMP $op1,$op2\t! compressed ptr" %}
+ opcode(Assembler::subcc_op3, Assembler::arith_op);
+ ins_encode( form3_rs1_rs2_rd( op1, op2, R_G0 ) );
+ ins_pipe(ialu_cconly_reg_reg);
+ %}
+
+ instruct compN_iRegN_immN0(flagsReg icc, iRegN op1, immN0 op2 ) %{
+ match(Set icc (CmpN op1 op2));
+
+ size(4);
+ format %{ "CMP $op1,$op2\t! compressed ptr" %}
+ opcode(Assembler::subcc_op3, Assembler::arith_op);
+ ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) );
+ ins_pipe(ialu_cconly_reg_imm);
+ %}
+
//----------Max and Min--------------------------------------------------------
// Min Instructions
// Conditional move for min
instruct cmovI_reg_lt( iRegI op2, iRegI op1, flagsReg icc ) %{
effect( USE_DEF op2, USE op1, USE icc );
*** 8593,8602 ****
--- 8640,8657 ----
format %{ "MOV$cmp $xcc,$src,$dst" %}
ins_encode( enc_cmov_imm(cmp,dst,src, (Assembler::xcc)) );
ins_pipe(ialu_imm);
%}
+ instruct cmovNL_reg(cmpOp cmp, flagsRegL xcc, iRegN dst, iRegN src) %{
+ match(Set dst (CMoveN (Binary cmp xcc) (Binary dst src)));
+ ins_cost(150);
+ format %{ "MOV$cmp $xcc,$src,$dst" %}
+ ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::xcc)) );
+ ins_pipe(ialu_reg);
+ %}
+
instruct cmovPL_reg(cmpOp cmp, flagsRegL xcc, iRegP dst, iRegP src) %{
match(Set dst (CMoveP (Binary cmp xcc) (Binary dst src)));
ins_cost(150);
format %{ "MOV$cmp $xcc,$src,$dst" %}
ins_encode( enc_cmov_reg(cmp,dst,src, (Assembler::xcc)) );
*** 8824,8843 ****
ins_encode( enc_PartialSubtypeCheck() );
ins_pipe(partial_subtype_check_pipe);
%}
- instruct compP_iRegN_immN0(flagsRegP pcc, iRegN op1, immN0 op2 ) %{
- match(Set pcc (CmpN op1 op2));
-
- size(4);
- format %{ "CMP $op1,$op2\t! ptr" %}
- opcode(Assembler::subcc_op3, Assembler::arith_op);
- ins_encode( form3_rs1_simm13_rd( op1, op2, R_G0 ) );
- ins_pipe(ialu_cconly_reg_imm);
- %}
-
// ============================================================================
// inlined locking and unlocking
instruct cmpFastLock(flagsRegP pcc, iRegP object, iRegP box, iRegP scratch2, o7RegP scratch ) %{
match(Set pcc (FastLock object box));
--- 8879,8888 ----
src/cpu/sparc/vm/sparc.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File