src/cpu/sparc/vm/sparc.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/sparc/vm/sparc.ad Wed May 14 20:04:32 2008
--- new/src/cpu/sparc/vm/sparc.ad Wed May 14 20:04:31 2008
*** 5469,5479 ****
--- 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());
! predicate(!n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop());
ins_cost(MEMORY_REF_COST);
size(4);
#ifndef _LP64
format %{ "LDUW $mem,$dst\t! klass ptr" %}
*** 5484,5497 ****
--- 5484,5497 ----
#endif
ins_encode( form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
! // Load narrow Klass Pointer
! instruct loadKlassComp(iRegP dst, memory mem) %{
! match(Set dst (LoadKlass mem));
! predicate(n->in(MemNode::Address)->bottom_type()->is_narrow());
! instruct loadNKlass(iRegN dst, memory mem) %{
! match(Set dst (LoadNKlass mem));
! predicate(n->in(MemNode::Address)->bottom_type()->is_ptr_to_narrowoop());
ins_cost(MEMORY_REF_COST);
format %{ "LDUW $mem,$dst\t! compressed klass ptr" %}
ins_encode %{
*** 5501,5513 ****
--- 5501,5510 ----
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)
*** 5607,5632 ****
--- 5604,5631 ----
__ 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!ptr" %}
! format %{ "SET $src,$dst\t! compressed 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);
}
+ __ load_narrow_oop_con((jobject)$src$$constant, dst);
%}
! ins_pipe(loadConP);
! 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 ****
--- 6255,6292 ----
format %{ "MOV$cmp $fcc,$src,$dst" %}
ins_encode( enc_cmov_imm_f(cmp,dst,src, fcc) );
ins_pipe(ialu_imm);
%}
+ // Conditional move ofr 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 works also for 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" %}
*** 6415,6425 ****
--- 6442,6451 ----
ins_encode( enc_cmov_reg_f(cmp,dst,src, fcc) );
ins_pipe(ialu_reg);
%}
//----------OS and Locking Instructions----------------------------------------
// This name is KNOWN by the ADLC and cannot be changed.
// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
// for this guy.
*** 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 ****
--- 8879,8888 ----
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));
src/cpu/sparc/vm/sparc.ad
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File