Mercurial > hg > truffle
comparison src/cpu/sparc/vm/sparc.ad @ 415:4d9884b01ba6
6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
Reviewed-by: kvn, rasbold
author | never |
---|---|
date | Tue, 28 Oct 2008 09:31:30 -0700 |
parents | 9c2ecc2ffb12 |
children | a1980da045cc |
comparison
equal
deleted
inserted
replaced
407:ebfd4ae89bf6 | 415:4d9884b01ba6 |
---|---|
1741 | 1741 |
1742 // Is this branch offset short enough that a short branch can be used? | 1742 // Is this branch offset short enough that a short branch can be used? |
1743 // | 1743 // |
1744 // NOTE: If the platform does not provide any short branch variants, then | 1744 // NOTE: If the platform does not provide any short branch variants, then |
1745 // this method should return false for offset 0. | 1745 // this method should return false for offset 0. |
1746 bool Matcher::is_short_branch_offset(int offset) { | 1746 bool Matcher::is_short_branch_offset(int rule, int offset) { |
1747 return false; | 1747 return false; |
1748 } | 1748 } |
1749 | 1749 |
1750 const bool Matcher::isSimpleConstant64(jlong value) { | 1750 const bool Matcher::isSimpleConstant64(jlong value) { |
1751 // Will one (StoreL ConL) be cheaper than two (StoreI ConI)?. | 1751 // Will one (StoreL ConL) be cheaper than two (StoreI ConI)?. |
1924 enc_class form3_mem_reg( memory mem, iRegI dst ) %{ | 1924 enc_class form3_mem_reg( memory mem, iRegI dst ) %{ |
1925 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, | 1925 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, |
1926 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); | 1926 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); |
1927 %} | 1927 %} |
1928 | 1928 |
1929 enc_class simple_form3_mem_reg( memory mem, iRegI dst ) %{ | |
1930 emit_form3_mem_reg(cbuf, this, $primary, -1, | |
1931 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); | |
1932 %} | |
1933 | |
1929 enc_class form3_mem_reg_little( memory mem, iRegI dst) %{ | 1934 enc_class form3_mem_reg_little( memory mem, iRegI dst) %{ |
1930 emit_form3_mem_reg_asi(cbuf, this, $primary, $tertiary, | 1935 emit_form3_mem_reg_asi(cbuf, this, $primary, -1, |
1931 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg, Assembler::ASI_PRIMARY_LITTLE); | 1936 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg, Assembler::ASI_PRIMARY_LITTLE); |
1932 %} | 1937 %} |
1933 | 1938 |
1934 enc_class form3_mem_prefetch_read( memory mem ) %{ | 1939 enc_class form3_mem_prefetch_read( memory mem ) %{ |
1935 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, | 1940 emit_form3_mem_reg(cbuf, this, $primary, -1, |
1936 $mem$$base, $mem$$disp, $mem$$index, 0/*prefetch function many-reads*/); | 1941 $mem$$base, $mem$$disp, $mem$$index, 0/*prefetch function many-reads*/); |
1937 %} | 1942 %} |
1938 | 1943 |
1939 enc_class form3_mem_prefetch_write( memory mem ) %{ | 1944 enc_class form3_mem_prefetch_write( memory mem ) %{ |
1940 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, | 1945 emit_form3_mem_reg(cbuf, this, $primary, -1, |
1941 $mem$$base, $mem$$disp, $mem$$index, 2/*prefetch function many-writes*/); | 1946 $mem$$base, $mem$$disp, $mem$$index, 2/*prefetch function many-writes*/); |
1942 %} | 1947 %} |
1943 | 1948 |
1944 enc_class form3_mem_reg_long_unaligned_marshal( memory mem, iRegL reg ) %{ | 1949 enc_class form3_mem_reg_long_unaligned_marshal( memory mem, iRegL reg ) %{ |
1945 assert( Assembler::is_simm13($mem$$disp ), "need disp and disp+4" ); | 1950 assert( Assembler::is_simm13($mem$$disp ), "need disp and disp+4" ); |
1946 assert( Assembler::is_simm13($mem$$disp+4), "need disp and disp+4" ); | 1951 assert( Assembler::is_simm13($mem$$disp+4), "need disp and disp+4" ); |
1947 guarantee($mem$$index == R_G0_enc, "double index?"); | 1952 guarantee($mem$$index == R_G0_enc, "double index?"); |
1948 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, $mem$$base, $mem$$disp+4, R_G0_enc, R_O7_enc ); | 1953 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, R_O7_enc ); |
1949 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg ); | 1954 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg ); |
1950 emit3_simm13( cbuf, Assembler::arith_op, $reg$$reg, Assembler::sllx_op3, $reg$$reg, 0x1020 ); | 1955 emit3_simm13( cbuf, Assembler::arith_op, $reg$$reg, Assembler::sllx_op3, $reg$$reg, 0x1020 ); |
1951 emit3( cbuf, Assembler::arith_op, $reg$$reg, Assembler::or_op3, $reg$$reg, 0, R_O7_enc ); | 1956 emit3( cbuf, Assembler::arith_op, $reg$$reg, Assembler::or_op3, $reg$$reg, 0, R_O7_enc ); |
1952 %} | 1957 %} |
1953 | 1958 |
1954 enc_class form3_mem_reg_double_unaligned( memory mem, RegD_low reg ) %{ | 1959 enc_class form3_mem_reg_double_unaligned( memory mem, RegD_low reg ) %{ |
1955 assert( Assembler::is_simm13($mem$$disp ), "need disp and disp+4" ); | 1960 assert( Assembler::is_simm13($mem$$disp ), "need disp and disp+4" ); |
1956 assert( Assembler::is_simm13($mem$$disp+4), "need disp and disp+4" ); | 1961 assert( Assembler::is_simm13($mem$$disp+4), "need disp and disp+4" ); |
1957 guarantee($mem$$index == R_G0_enc, "double index?"); | 1962 guarantee($mem$$index == R_G0_enc, "double index?"); |
1958 // Load long with 2 instructions | 1963 // Load long with 2 instructions |
1959 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg+0 ); | 1964 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg+0 ); |
1960 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, $mem$$base, $mem$$disp+4, R_G0_enc, $reg$$reg+1 ); | 1965 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, $reg$$reg+1 ); |
1961 %} | 1966 %} |
1962 | 1967 |
1963 //%%% form3_mem_plus_4_reg is a hack--get rid of it | 1968 //%%% form3_mem_plus_4_reg is a hack--get rid of it |
1964 enc_class form3_mem_plus_4_reg( memory mem, iRegI dst ) %{ | 1969 enc_class form3_mem_plus_4_reg( memory mem, iRegI dst ) %{ |
1965 guarantee($mem$$disp, "cannot offset a reg-reg operand by 4"); | 1970 guarantee($mem$$disp, "cannot offset a reg-reg operand by 4"); |
1966 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, $mem$$base, $mem$$disp + 4, $mem$$index, $dst$$reg); | 1971 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp + 4, $mem$$index, $dst$$reg); |
1967 %} | 1972 %} |
1968 | 1973 |
1969 enc_class form3_g0_rs2_rd_move( iRegI rs2, iRegI rd ) %{ | 1974 enc_class form3_g0_rs2_rd_move( iRegI rs2, iRegI rd ) %{ |
1970 // Encode a reg-reg copy. If it is useless, then empty encoding. | 1975 // Encode a reg-reg copy. If it is useless, then empty encoding. |
1971 if( $rs2$$reg != $rd$$reg ) | 1976 if( $rs2$$reg != $rd$$reg ) |
5060 effect(DEF dst, USE src); | 5065 effect(DEF dst, USE src); |
5061 ins_cost(MEMORY_REF_COST); | 5066 ins_cost(MEMORY_REF_COST); |
5062 size(4); | 5067 size(4); |
5063 format %{ "LDF $src,$dst\t! stkI to regF" %} | 5068 format %{ "LDF $src,$dst\t! stkI to regF" %} |
5064 opcode(Assembler::ldf_op3); | 5069 opcode(Assembler::ldf_op3); |
5065 ins_encode(form3_mem_reg(src, dst)); | 5070 ins_encode(simple_form3_mem_reg(src, dst)); |
5066 ins_pipe(floadF_stk); | 5071 ins_pipe(floadF_stk); |
5067 %} | 5072 %} |
5068 | 5073 |
5069 instruct stkL_to_regD(regD dst, stackSlotL src) %{ | 5074 instruct stkL_to_regD(regD dst, stackSlotL src) %{ |
5070 // No match rule to avoid chain rule match. | 5075 // No match rule to avoid chain rule match. |
5071 effect(DEF dst, USE src); | 5076 effect(DEF dst, USE src); |
5072 ins_cost(MEMORY_REF_COST); | 5077 ins_cost(MEMORY_REF_COST); |
5073 size(4); | 5078 size(4); |
5074 format %{ "LDDF $src,$dst\t! stkL to regD" %} | 5079 format %{ "LDDF $src,$dst\t! stkL to regD" %} |
5075 opcode(Assembler::lddf_op3); | 5080 opcode(Assembler::lddf_op3); |
5076 ins_encode(form3_mem_reg(src, dst)); | 5081 ins_encode(simple_form3_mem_reg(src, dst)); |
5077 ins_pipe(floadD_stk); | 5082 ins_pipe(floadD_stk); |
5078 %} | 5083 %} |
5079 | 5084 |
5080 instruct regF_to_stkI(stackSlotI dst, regF src) %{ | 5085 instruct regF_to_stkI(stackSlotI dst, regF src) %{ |
5081 // No match rule to avoid chain rule match. | 5086 // No match rule to avoid chain rule match. |
5082 effect(DEF dst, USE src); | 5087 effect(DEF dst, USE src); |
5083 ins_cost(MEMORY_REF_COST); | 5088 ins_cost(MEMORY_REF_COST); |
5084 size(4); | 5089 size(4); |
5085 format %{ "STF $src,$dst\t! regF to stkI" %} | 5090 format %{ "STF $src,$dst\t! regF to stkI" %} |
5086 opcode(Assembler::stf_op3); | 5091 opcode(Assembler::stf_op3); |
5087 ins_encode(form3_mem_reg(dst, src)); | 5092 ins_encode(simple_form3_mem_reg(dst, src)); |
5088 ins_pipe(fstoreF_stk_reg); | 5093 ins_pipe(fstoreF_stk_reg); |
5089 %} | 5094 %} |
5090 | 5095 |
5091 instruct regD_to_stkL(stackSlotL dst, regD src) %{ | 5096 instruct regD_to_stkL(stackSlotL dst, regD src) %{ |
5092 // No match rule to avoid chain rule match. | 5097 // No match rule to avoid chain rule match. |
5093 effect(DEF dst, USE src); | 5098 effect(DEF dst, USE src); |
5094 ins_cost(MEMORY_REF_COST); | 5099 ins_cost(MEMORY_REF_COST); |
5095 size(4); | 5100 size(4); |
5096 format %{ "STDF $src,$dst\t! regD to stkL" %} | 5101 format %{ "STDF $src,$dst\t! regD to stkL" %} |
5097 opcode(Assembler::stdf_op3); | 5102 opcode(Assembler::stdf_op3); |
5098 ins_encode(form3_mem_reg(dst, src)); | 5103 ins_encode(simple_form3_mem_reg(dst, src)); |
5099 ins_pipe(fstoreD_stk_reg); | 5104 ins_pipe(fstoreD_stk_reg); |
5100 %} | 5105 %} |
5101 | 5106 |
5102 instruct regI_to_stkLHi(stackSlotL dst, iRegI src) %{ | 5107 instruct regI_to_stkLHi(stackSlotL dst, iRegI src) %{ |
5103 effect(DEF dst, USE src); | 5108 effect(DEF dst, USE src); |
5104 ins_cost(MEMORY_REF_COST*2); | 5109 ins_cost(MEMORY_REF_COST*2); |
5105 size(8); | 5110 size(8); |
5106 format %{ "STW $src,$dst.hi\t! long\n\t" | 5111 format %{ "STW $src,$dst.hi\t! long\n\t" |
5107 "STW R_G0,$dst.lo" %} | 5112 "STW R_G0,$dst.lo" %} |
5108 opcode(Assembler::stw_op3); | 5113 opcode(Assembler::stw_op3); |
5109 ins_encode(form3_mem_reg(dst, src), form3_mem_plus_4_reg(dst, R_G0)); | 5114 ins_encode(simple_form3_mem_reg(dst, src), form3_mem_plus_4_reg(dst, R_G0)); |
5110 ins_pipe(lstoreI_stk_reg); | 5115 ins_pipe(lstoreI_stk_reg); |
5111 %} | 5116 %} |
5112 | 5117 |
5113 instruct regL_to_stkD(stackSlotD dst, iRegL src) %{ | 5118 instruct regL_to_stkD(stackSlotD dst, iRegL src) %{ |
5114 // No match rule to avoid chain rule match. | 5119 // No match rule to avoid chain rule match. |
5115 effect(DEF dst, USE src); | 5120 effect(DEF dst, USE src); |
5116 ins_cost(MEMORY_REF_COST); | 5121 ins_cost(MEMORY_REF_COST); |
5117 size(4); | 5122 size(4); |
5118 format %{ "STX $src,$dst\t! regL to stkD" %} | 5123 format %{ "STX $src,$dst\t! regL to stkD" %} |
5119 opcode(Assembler::stx_op3); | 5124 opcode(Assembler::stx_op3); |
5120 ins_encode( form3_mem_reg( dst, src ) ); | 5125 ins_encode(simple_form3_mem_reg( dst, src ) ); |
5121 ins_pipe(istore_stk_reg); | 5126 ins_pipe(istore_stk_reg); |
5122 %} | 5127 %} |
5123 | 5128 |
5124 //---------- Chain stack slots between similar types -------- | 5129 //---------- Chain stack slots between similar types -------- |
5125 | 5130 |
5129 ins_cost(MEMORY_REF_COST); | 5134 ins_cost(MEMORY_REF_COST); |
5130 | 5135 |
5131 size(4); | 5136 size(4); |
5132 format %{ "LDUW $src,$dst\t!stk" %} | 5137 format %{ "LDUW $src,$dst\t!stk" %} |
5133 opcode(Assembler::lduw_op3); | 5138 opcode(Assembler::lduw_op3); |
5134 ins_encode( form3_mem_reg( src, dst ) ); | 5139 ins_encode(simple_form3_mem_reg( src, dst ) ); |
5135 ins_pipe(iload_mem); | 5140 ins_pipe(iload_mem); |
5136 %} | 5141 %} |
5137 | 5142 |
5138 // Store integer to stack slot | 5143 // Store integer to stack slot |
5139 instruct regI_to_stkI( stackSlotI dst, iRegI src ) %{ | 5144 instruct regI_to_stkI( stackSlotI dst, iRegI src ) %{ |
5141 ins_cost(MEMORY_REF_COST); | 5146 ins_cost(MEMORY_REF_COST); |
5142 | 5147 |
5143 size(4); | 5148 size(4); |
5144 format %{ "STW $src,$dst\t!stk" %} | 5149 format %{ "STW $src,$dst\t!stk" %} |
5145 opcode(Assembler::stw_op3); | 5150 opcode(Assembler::stw_op3); |
5146 ins_encode( form3_mem_reg( dst, src ) ); | 5151 ins_encode(simple_form3_mem_reg( dst, src ) ); |
5147 ins_pipe(istore_mem_reg); | 5152 ins_pipe(istore_mem_reg); |
5148 %} | 5153 %} |
5149 | 5154 |
5150 // Load long from stack slot | 5155 // Load long from stack slot |
5151 instruct stkL_to_regL( iRegL dst, stackSlotL src ) %{ | 5156 instruct stkL_to_regL( iRegL dst, stackSlotL src ) %{ |
5153 | 5158 |
5154 ins_cost(MEMORY_REF_COST); | 5159 ins_cost(MEMORY_REF_COST); |
5155 size(4); | 5160 size(4); |
5156 format %{ "LDX $src,$dst\t! long" %} | 5161 format %{ "LDX $src,$dst\t! long" %} |
5157 opcode(Assembler::ldx_op3); | 5162 opcode(Assembler::ldx_op3); |
5158 ins_encode( form3_mem_reg( src, dst ) ); | 5163 ins_encode(simple_form3_mem_reg( src, dst ) ); |
5159 ins_pipe(iload_mem); | 5164 ins_pipe(iload_mem); |
5160 %} | 5165 %} |
5161 | 5166 |
5162 // Store long to stack slot | 5167 // Store long to stack slot |
5163 instruct regL_to_stkL(stackSlotL dst, iRegL src) %{ | 5168 instruct regL_to_stkL(stackSlotL dst, iRegL src) %{ |
5165 | 5170 |
5166 ins_cost(MEMORY_REF_COST); | 5171 ins_cost(MEMORY_REF_COST); |
5167 size(4); | 5172 size(4); |
5168 format %{ "STX $src,$dst\t! long" %} | 5173 format %{ "STX $src,$dst\t! long" %} |
5169 opcode(Assembler::stx_op3); | 5174 opcode(Assembler::stx_op3); |
5170 ins_encode( form3_mem_reg( dst, src ) ); | 5175 ins_encode(simple_form3_mem_reg( dst, src ) ); |
5171 ins_pipe(istore_mem_reg); | 5176 ins_pipe(istore_mem_reg); |
5172 %} | 5177 %} |
5173 | 5178 |
5174 #ifdef _LP64 | 5179 #ifdef _LP64 |
5175 // Load pointer from stack slot, 64-bit encoding | 5180 // Load pointer from stack slot, 64-bit encoding |
5177 match(Set dst src); | 5182 match(Set dst src); |
5178 ins_cost(MEMORY_REF_COST); | 5183 ins_cost(MEMORY_REF_COST); |
5179 size(4); | 5184 size(4); |
5180 format %{ "LDX $src,$dst\t!ptr" %} | 5185 format %{ "LDX $src,$dst\t!ptr" %} |
5181 opcode(Assembler::ldx_op3); | 5186 opcode(Assembler::ldx_op3); |
5182 ins_encode( form3_mem_reg( src, dst ) ); | 5187 ins_encode(simple_form3_mem_reg( src, dst ) ); |
5183 ins_pipe(iload_mem); | 5188 ins_pipe(iload_mem); |
5184 %} | 5189 %} |
5185 | 5190 |
5186 // Store pointer to stack slot | 5191 // Store pointer to stack slot |
5187 instruct regP_to_stkP(stackSlotP dst, iRegP src) %{ | 5192 instruct regP_to_stkP(stackSlotP dst, iRegP src) %{ |
5188 match(Set dst src); | 5193 match(Set dst src); |
5189 ins_cost(MEMORY_REF_COST); | 5194 ins_cost(MEMORY_REF_COST); |
5190 size(4); | 5195 size(4); |
5191 format %{ "STX $src,$dst\t!ptr" %} | 5196 format %{ "STX $src,$dst\t!ptr" %} |
5192 opcode(Assembler::stx_op3); | 5197 opcode(Assembler::stx_op3); |
5193 ins_encode( form3_mem_reg( dst, src ) ); | 5198 ins_encode(simple_form3_mem_reg( dst, src ) ); |
5194 ins_pipe(istore_mem_reg); | 5199 ins_pipe(istore_mem_reg); |
5195 %} | 5200 %} |
5196 #else // _LP64 | 5201 #else // _LP64 |
5197 // Load pointer from stack slot, 32-bit encoding | 5202 // Load pointer from stack slot, 32-bit encoding |
5198 instruct stkP_to_regP( iRegP dst, stackSlotP src ) %{ | 5203 instruct stkP_to_regP( iRegP dst, stackSlotP src ) %{ |
5199 match(Set dst src); | 5204 match(Set dst src); |
5200 ins_cost(MEMORY_REF_COST); | 5205 ins_cost(MEMORY_REF_COST); |
5201 format %{ "LDUW $src,$dst\t!ptr" %} | 5206 format %{ "LDUW $src,$dst\t!ptr" %} |
5202 opcode(Assembler::lduw_op3, Assembler::ldst_op); | 5207 opcode(Assembler::lduw_op3, Assembler::ldst_op); |
5203 ins_encode( form3_mem_reg( src, dst ) ); | 5208 ins_encode(simple_form3_mem_reg( src, dst ) ); |
5204 ins_pipe(iload_mem); | 5209 ins_pipe(iload_mem); |
5205 %} | 5210 %} |
5206 | 5211 |
5207 // Store pointer to stack slot | 5212 // Store pointer to stack slot |
5208 instruct regP_to_stkP(stackSlotP dst, iRegP src) %{ | 5213 instruct regP_to_stkP(stackSlotP dst, iRegP src) %{ |
5209 match(Set dst src); | 5214 match(Set dst src); |
5210 ins_cost(MEMORY_REF_COST); | 5215 ins_cost(MEMORY_REF_COST); |
5211 format %{ "STW $src,$dst\t!ptr" %} | 5216 format %{ "STW $src,$dst\t!ptr" %} |
5212 opcode(Assembler::stw_op3, Assembler::ldst_op); | 5217 opcode(Assembler::stw_op3, Assembler::ldst_op); |
5213 ins_encode( form3_mem_reg( dst, src ) ); | 5218 ins_encode(simple_form3_mem_reg( dst, src ) ); |
5214 ins_pipe(istore_mem_reg); | 5219 ins_pipe(istore_mem_reg); |
5215 %} | 5220 %} |
5216 #endif // _LP64 | 5221 #endif // _LP64 |
5217 | 5222 |
5218 //------------Special Nop instructions for bundling - no match rules----------- | 5223 //------------Special Nop instructions for bundling - no match rules----------- |
5271 ins_cost(MEMORY_REF_COST); | 5276 ins_cost(MEMORY_REF_COST); |
5272 | 5277 |
5273 size(4); | 5278 size(4); |
5274 format %{ "LDSB $mem,$dst" %} | 5279 format %{ "LDSB $mem,$dst" %} |
5275 opcode(Assembler::ldsb_op3); | 5280 opcode(Assembler::ldsb_op3); |
5276 ins_encode( form3_mem_reg( mem, dst ) ); | 5281 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5277 ins_pipe(iload_mask_mem); | 5282 ins_pipe(iload_mask_mem); |
5278 %} | 5283 %} |
5279 | 5284 |
5280 // Load Byte (8bit UNsigned) into an int reg | 5285 // Load Byte (8bit UNsigned) into an int reg |
5281 instruct loadUB(iRegI dst, memory mem, immI_255 bytemask) %{ | 5286 instruct loadUB(iRegI dst, memory mem, immI_255 bytemask) %{ |
5283 ins_cost(MEMORY_REF_COST); | 5288 ins_cost(MEMORY_REF_COST); |
5284 | 5289 |
5285 size(4); | 5290 size(4); |
5286 format %{ "LDUB $mem,$dst" %} | 5291 format %{ "LDUB $mem,$dst" %} |
5287 opcode(Assembler::ldub_op3); | 5292 opcode(Assembler::ldub_op3); |
5288 ins_encode( form3_mem_reg( mem, dst ) ); | 5293 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5289 ins_pipe(iload_mask_mem); | 5294 ins_pipe(iload_mask_mem); |
5290 %} | 5295 %} |
5291 | 5296 |
5292 // Load Byte (8bit UNsigned) into a Long Register | 5297 // Load Byte (8bit UNsigned) into a Long Register |
5293 instruct loadUBL(iRegL dst, memory mem, immL_FF bytemask) %{ | 5298 instruct loadUBL(iRegL dst, memory mem, immL_FF bytemask) %{ |
5295 ins_cost(MEMORY_REF_COST); | 5300 ins_cost(MEMORY_REF_COST); |
5296 | 5301 |
5297 size(4); | 5302 size(4); |
5298 format %{ "LDUB $mem,$dst" %} | 5303 format %{ "LDUB $mem,$dst" %} |
5299 opcode(Assembler::ldub_op3); | 5304 opcode(Assembler::ldub_op3); |
5300 ins_encode( form3_mem_reg( mem, dst ) ); | 5305 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5301 ins_pipe(iload_mask_mem); | 5306 ins_pipe(iload_mask_mem); |
5302 %} | 5307 %} |
5303 | 5308 |
5304 // Load Char (16bit UNsigned) into a Long Register | 5309 // Load Char (16bit UNsigned) into a Long Register |
5305 instruct loadUCL(iRegL dst, memory mem, immL_FFFF bytemask) %{ | 5310 instruct loadUCL(iRegL dst, memory mem, immL_FFFF bytemask) %{ |
5307 ins_cost(MEMORY_REF_COST); | 5312 ins_cost(MEMORY_REF_COST); |
5308 | 5313 |
5309 size(4); | 5314 size(4); |
5310 format %{ "LDUH $mem,$dst" %} | 5315 format %{ "LDUH $mem,$dst" %} |
5311 opcode(Assembler::lduh_op3); | 5316 opcode(Assembler::lduh_op3); |
5312 ins_encode( form3_mem_reg( mem, dst ) ); | 5317 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5313 ins_pipe(iload_mask_mem); | 5318 ins_pipe(iload_mask_mem); |
5314 %} | 5319 %} |
5315 | 5320 |
5316 // Load Char (16bit unsigned) | 5321 // Load Char (16bit unsigned) |
5317 instruct loadC(iRegI dst, memory mem) %{ | 5322 instruct loadC(iRegI dst, memory mem) %{ |
5319 ins_cost(MEMORY_REF_COST); | 5324 ins_cost(MEMORY_REF_COST); |
5320 | 5325 |
5321 size(4); | 5326 size(4); |
5322 format %{ "LDUH $mem,$dst" %} | 5327 format %{ "LDUH $mem,$dst" %} |
5323 opcode(Assembler::lduh_op3); | 5328 opcode(Assembler::lduh_op3); |
5324 ins_encode( form3_mem_reg( mem, dst ) ); | 5329 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5325 ins_pipe(iload_mask_mem); | 5330 ins_pipe(iload_mask_mem); |
5326 %} | 5331 %} |
5327 | 5332 |
5328 // Load Integer | 5333 // Load Integer |
5329 instruct loadI(iRegI dst, memory mem) %{ | 5334 instruct loadI(iRegI dst, memory mem) %{ |
5331 ins_cost(MEMORY_REF_COST); | 5336 ins_cost(MEMORY_REF_COST); |
5332 size(4); | 5337 size(4); |
5333 | 5338 |
5334 format %{ "LDUW $mem,$dst" %} | 5339 format %{ "LDUW $mem,$dst" %} |
5335 opcode(Assembler::lduw_op3); | 5340 opcode(Assembler::lduw_op3); |
5336 ins_encode( form3_mem_reg( mem, dst ) ); | 5341 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5337 ins_pipe(iload_mem); | 5342 ins_pipe(iload_mem); |
5338 %} | 5343 %} |
5339 | 5344 |
5340 // Load Long - aligned | 5345 // Load Long - aligned |
5341 instruct loadL(iRegL dst, memory mem ) %{ | 5346 instruct loadL(iRegL dst, memory mem ) %{ |
5342 match(Set dst (LoadL mem)); | 5347 match(Set dst (LoadL mem)); |
5343 ins_cost(MEMORY_REF_COST); | 5348 ins_cost(MEMORY_REF_COST); |
5344 size(4); | 5349 size(4); |
5345 format %{ "LDX $mem,$dst\t! long" %} | 5350 format %{ "LDX $mem,$dst\t! long" %} |
5346 opcode(Assembler::ldx_op3); | 5351 opcode(Assembler::ldx_op3); |
5347 ins_encode( form3_mem_reg( mem, dst ) ); | 5352 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5348 ins_pipe(iload_mem); | 5353 ins_pipe(iload_mem); |
5349 %} | 5354 %} |
5350 | 5355 |
5351 // Load Long - UNaligned | 5356 // Load Long - UNaligned |
5352 instruct loadL_unaligned(iRegL dst, memory mem, o7RegI tmp) %{ | 5357 instruct loadL_unaligned(iRegL dst, memory mem, o7RegI tmp) %{ |
5357 format %{ "LDUW $mem+4,R_O7\t! misaligned long\n" | 5362 format %{ "LDUW $mem+4,R_O7\t! misaligned long\n" |
5358 "\tLDUW $mem ,$dst\n" | 5363 "\tLDUW $mem ,$dst\n" |
5359 "\tSLLX #32, $dst, $dst\n" | 5364 "\tSLLX #32, $dst, $dst\n" |
5360 "\tOR $dst, R_O7, $dst" %} | 5365 "\tOR $dst, R_O7, $dst" %} |
5361 opcode(Assembler::lduw_op3); | 5366 opcode(Assembler::lduw_op3); |
5362 ins_encode( form3_mem_reg_long_unaligned_marshal( mem, dst )); | 5367 ins_encode(form3_mem_reg_long_unaligned_marshal( mem, dst )); |
5363 ins_pipe(iload_mem); | 5368 ins_pipe(iload_mem); |
5364 %} | 5369 %} |
5365 | 5370 |
5366 // Load Aligned Packed Byte into a Double Register | 5371 // Load Aligned Packed Byte into a Double Register |
5367 instruct loadA8B(regD dst, memory mem) %{ | 5372 instruct loadA8B(regD dst, memory mem) %{ |
5368 match(Set dst (Load8B mem)); | 5373 match(Set dst (Load8B mem)); |
5369 ins_cost(MEMORY_REF_COST); | 5374 ins_cost(MEMORY_REF_COST); |
5370 size(4); | 5375 size(4); |
5371 format %{ "LDDF $mem,$dst\t! packed8B" %} | 5376 format %{ "LDDF $mem,$dst\t! packed8B" %} |
5372 opcode(Assembler::lddf_op3); | 5377 opcode(Assembler::lddf_op3); |
5373 ins_encode( form3_mem_reg( mem, dst ) ); | 5378 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5374 ins_pipe(floadD_mem); | 5379 ins_pipe(floadD_mem); |
5375 %} | 5380 %} |
5376 | 5381 |
5377 // Load Aligned Packed Char into a Double Register | 5382 // Load Aligned Packed Char into a Double Register |
5378 instruct loadA4C(regD dst, memory mem) %{ | 5383 instruct loadA4C(regD dst, memory mem) %{ |
5379 match(Set dst (Load4C mem)); | 5384 match(Set dst (Load4C mem)); |
5380 ins_cost(MEMORY_REF_COST); | 5385 ins_cost(MEMORY_REF_COST); |
5381 size(4); | 5386 size(4); |
5382 format %{ "LDDF $mem,$dst\t! packed4C" %} | 5387 format %{ "LDDF $mem,$dst\t! packed4C" %} |
5383 opcode(Assembler::lddf_op3); | 5388 opcode(Assembler::lddf_op3); |
5384 ins_encode( form3_mem_reg( mem, dst ) ); | 5389 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5385 ins_pipe(floadD_mem); | 5390 ins_pipe(floadD_mem); |
5386 %} | 5391 %} |
5387 | 5392 |
5388 // Load Aligned Packed Short into a Double Register | 5393 // Load Aligned Packed Short into a Double Register |
5389 instruct loadA4S(regD dst, memory mem) %{ | 5394 instruct loadA4S(regD dst, memory mem) %{ |
5390 match(Set dst (Load4S mem)); | 5395 match(Set dst (Load4S mem)); |
5391 ins_cost(MEMORY_REF_COST); | 5396 ins_cost(MEMORY_REF_COST); |
5392 size(4); | 5397 size(4); |
5393 format %{ "LDDF $mem,$dst\t! packed4S" %} | 5398 format %{ "LDDF $mem,$dst\t! packed4S" %} |
5394 opcode(Assembler::lddf_op3); | 5399 opcode(Assembler::lddf_op3); |
5395 ins_encode( form3_mem_reg( mem, dst ) ); | 5400 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5396 ins_pipe(floadD_mem); | 5401 ins_pipe(floadD_mem); |
5397 %} | 5402 %} |
5398 | 5403 |
5399 // Load Aligned Packed Int into a Double Register | 5404 // Load Aligned Packed Int into a Double Register |
5400 instruct loadA2I(regD dst, memory mem) %{ | 5405 instruct loadA2I(regD dst, memory mem) %{ |
5401 match(Set dst (Load2I mem)); | 5406 match(Set dst (Load2I mem)); |
5402 ins_cost(MEMORY_REF_COST); | 5407 ins_cost(MEMORY_REF_COST); |
5403 size(4); | 5408 size(4); |
5404 format %{ "LDDF $mem,$dst\t! packed2I" %} | 5409 format %{ "LDDF $mem,$dst\t! packed2I" %} |
5405 opcode(Assembler::lddf_op3); | 5410 opcode(Assembler::lddf_op3); |
5406 ins_encode( form3_mem_reg( mem, dst ) ); | 5411 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5407 ins_pipe(floadD_mem); | 5412 ins_pipe(floadD_mem); |
5408 %} | 5413 %} |
5409 | 5414 |
5410 // Load Range | 5415 // Load Range |
5411 instruct loadRange(iRegI dst, memory mem) %{ | 5416 instruct loadRange(iRegI dst, memory mem) %{ |
5413 ins_cost(MEMORY_REF_COST); | 5418 ins_cost(MEMORY_REF_COST); |
5414 | 5419 |
5415 size(4); | 5420 size(4); |
5416 format %{ "LDUW $mem,$dst\t! range" %} | 5421 format %{ "LDUW $mem,$dst\t! range" %} |
5417 opcode(Assembler::lduw_op3); | 5422 opcode(Assembler::lduw_op3); |
5418 ins_encode( form3_mem_reg( mem, dst ) ); | 5423 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5419 ins_pipe(iload_mem); | 5424 ins_pipe(iload_mem); |
5420 %} | 5425 %} |
5421 | 5426 |
5422 // Load Integer into %f register (for fitos/fitod) | 5427 // Load Integer into %f register (for fitos/fitod) |
5423 instruct loadI_freg(regF dst, memory mem) %{ | 5428 instruct loadI_freg(regF dst, memory mem) %{ |
5425 ins_cost(MEMORY_REF_COST); | 5430 ins_cost(MEMORY_REF_COST); |
5426 size(4); | 5431 size(4); |
5427 | 5432 |
5428 format %{ "LDF $mem,$dst\t! for fitos/fitod" %} | 5433 format %{ "LDF $mem,$dst\t! for fitos/fitod" %} |
5429 opcode(Assembler::ldf_op3); | 5434 opcode(Assembler::ldf_op3); |
5430 ins_encode( form3_mem_reg( mem, dst ) ); | 5435 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5431 ins_pipe(floadF_mem); | 5436 ins_pipe(floadF_mem); |
5432 %} | 5437 %} |
5433 | 5438 |
5434 // Load Pointer | 5439 // Load Pointer |
5435 instruct loadP(iRegP dst, memory mem) %{ | 5440 instruct loadP(iRegP dst, memory mem) %{ |
5512 ins_cost(MEMORY_REF_COST); | 5517 ins_cost(MEMORY_REF_COST); |
5513 | 5518 |
5514 size(4); | 5519 size(4); |
5515 format %{ "LDSH $mem,$dst" %} | 5520 format %{ "LDSH $mem,$dst" %} |
5516 opcode(Assembler::ldsh_op3); | 5521 opcode(Assembler::ldsh_op3); |
5517 ins_encode( form3_mem_reg( mem, dst ) ); | 5522 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5518 ins_pipe(iload_mask_mem); | 5523 ins_pipe(iload_mask_mem); |
5519 %} | 5524 %} |
5520 | 5525 |
5521 // Load Double | 5526 // Load Double |
5522 instruct loadD(regD dst, memory mem) %{ | 5527 instruct loadD(regD dst, memory mem) %{ |
5524 ins_cost(MEMORY_REF_COST); | 5529 ins_cost(MEMORY_REF_COST); |
5525 | 5530 |
5526 size(4); | 5531 size(4); |
5527 format %{ "LDDF $mem,$dst" %} | 5532 format %{ "LDDF $mem,$dst" %} |
5528 opcode(Assembler::lddf_op3); | 5533 opcode(Assembler::lddf_op3); |
5529 ins_encode( form3_mem_reg( mem, dst ) ); | 5534 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5530 ins_pipe(floadD_mem); | 5535 ins_pipe(floadD_mem); |
5531 %} | 5536 %} |
5532 | 5537 |
5533 // Load Double - UNaligned | 5538 // Load Double - UNaligned |
5534 instruct loadD_unaligned(regD_low dst, memory mem ) %{ | 5539 instruct loadD_unaligned(regD_low dst, memory mem ) %{ |
5548 ins_cost(MEMORY_REF_COST); | 5553 ins_cost(MEMORY_REF_COST); |
5549 | 5554 |
5550 size(4); | 5555 size(4); |
5551 format %{ "LDF $mem,$dst" %} | 5556 format %{ "LDF $mem,$dst" %} |
5552 opcode(Assembler::ldf_op3); | 5557 opcode(Assembler::ldf_op3); |
5553 ins_encode( form3_mem_reg( mem, dst ) ); | 5558 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
5554 ins_pipe(floadF_mem); | 5559 ins_pipe(floadF_mem); |
5555 %} | 5560 %} |
5556 | 5561 |
5557 // Load Constant | 5562 // Load Constant |
5558 instruct loadConI( iRegI dst, immI src ) %{ | 5563 instruct loadConI( iRegI dst, immI src ) %{ |
5717 ins_cost(MEMORY_REF_COST); | 5722 ins_cost(MEMORY_REF_COST); |
5718 | 5723 |
5719 size(4); | 5724 size(4); |
5720 format %{ "STB $src,$mem\t! byte" %} | 5725 format %{ "STB $src,$mem\t! byte" %} |
5721 opcode(Assembler::stb_op3); | 5726 opcode(Assembler::stb_op3); |
5722 ins_encode( form3_mem_reg( mem, src ) ); | 5727 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5723 ins_pipe(istore_mem_reg); | 5728 ins_pipe(istore_mem_reg); |
5724 %} | 5729 %} |
5725 | 5730 |
5726 instruct storeB0(memory mem, immI0 src) %{ | 5731 instruct storeB0(memory mem, immI0 src) %{ |
5727 match(Set mem (StoreB mem src)); | 5732 match(Set mem (StoreB mem src)); |
5728 ins_cost(MEMORY_REF_COST); | 5733 ins_cost(MEMORY_REF_COST); |
5729 | 5734 |
5730 size(4); | 5735 size(4); |
5731 format %{ "STB $src,$mem\t! byte" %} | 5736 format %{ "STB $src,$mem\t! byte" %} |
5732 opcode(Assembler::stb_op3); | 5737 opcode(Assembler::stb_op3); |
5733 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5738 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5734 ins_pipe(istore_mem_zero); | 5739 ins_pipe(istore_mem_zero); |
5735 %} | 5740 %} |
5736 | 5741 |
5737 instruct storeCM0(memory mem, immI0 src) %{ | 5742 instruct storeCM0(memory mem, immI0 src) %{ |
5738 match(Set mem (StoreCM mem src)); | 5743 match(Set mem (StoreCM mem src)); |
5739 ins_cost(MEMORY_REF_COST); | 5744 ins_cost(MEMORY_REF_COST); |
5740 | 5745 |
5741 size(4); | 5746 size(4); |
5742 format %{ "STB $src,$mem\t! CMS card-mark byte 0" %} | 5747 format %{ "STB $src,$mem\t! CMS card-mark byte 0" %} |
5743 opcode(Assembler::stb_op3); | 5748 opcode(Assembler::stb_op3); |
5744 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5749 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5745 ins_pipe(istore_mem_zero); | 5750 ins_pipe(istore_mem_zero); |
5746 %} | 5751 %} |
5747 | 5752 |
5748 // Store Char/Short | 5753 // Store Char/Short |
5749 instruct storeC(memory mem, iRegI src) %{ | 5754 instruct storeC(memory mem, iRegI src) %{ |
5751 ins_cost(MEMORY_REF_COST); | 5756 ins_cost(MEMORY_REF_COST); |
5752 | 5757 |
5753 size(4); | 5758 size(4); |
5754 format %{ "STH $src,$mem\t! short" %} | 5759 format %{ "STH $src,$mem\t! short" %} |
5755 opcode(Assembler::sth_op3); | 5760 opcode(Assembler::sth_op3); |
5756 ins_encode( form3_mem_reg( mem, src ) ); | 5761 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5757 ins_pipe(istore_mem_reg); | 5762 ins_pipe(istore_mem_reg); |
5758 %} | 5763 %} |
5759 | 5764 |
5760 instruct storeC0(memory mem, immI0 src) %{ | 5765 instruct storeC0(memory mem, immI0 src) %{ |
5761 match(Set mem (StoreC mem src)); | 5766 match(Set mem (StoreC mem src)); |
5762 ins_cost(MEMORY_REF_COST); | 5767 ins_cost(MEMORY_REF_COST); |
5763 | 5768 |
5764 size(4); | 5769 size(4); |
5765 format %{ "STH $src,$mem\t! short" %} | 5770 format %{ "STH $src,$mem\t! short" %} |
5766 opcode(Assembler::sth_op3); | 5771 opcode(Assembler::sth_op3); |
5767 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5772 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5768 ins_pipe(istore_mem_zero); | 5773 ins_pipe(istore_mem_zero); |
5769 %} | 5774 %} |
5770 | 5775 |
5771 // Store Integer | 5776 // Store Integer |
5772 instruct storeI(memory mem, iRegI src) %{ | 5777 instruct storeI(memory mem, iRegI src) %{ |
5774 ins_cost(MEMORY_REF_COST); | 5779 ins_cost(MEMORY_REF_COST); |
5775 | 5780 |
5776 size(4); | 5781 size(4); |
5777 format %{ "STW $src,$mem" %} | 5782 format %{ "STW $src,$mem" %} |
5778 opcode(Assembler::stw_op3); | 5783 opcode(Assembler::stw_op3); |
5779 ins_encode( form3_mem_reg( mem, src ) ); | 5784 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5780 ins_pipe(istore_mem_reg); | 5785 ins_pipe(istore_mem_reg); |
5781 %} | 5786 %} |
5782 | 5787 |
5783 // Store Long | 5788 // Store Long |
5784 instruct storeL(memory mem, iRegL src) %{ | 5789 instruct storeL(memory mem, iRegL src) %{ |
5785 match(Set mem (StoreL mem src)); | 5790 match(Set mem (StoreL mem src)); |
5786 ins_cost(MEMORY_REF_COST); | 5791 ins_cost(MEMORY_REF_COST); |
5787 size(4); | 5792 size(4); |
5788 format %{ "STX $src,$mem\t! long" %} | 5793 format %{ "STX $src,$mem\t! long" %} |
5789 opcode(Assembler::stx_op3); | 5794 opcode(Assembler::stx_op3); |
5790 ins_encode( form3_mem_reg( mem, src ) ); | 5795 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5791 ins_pipe(istore_mem_reg); | 5796 ins_pipe(istore_mem_reg); |
5792 %} | 5797 %} |
5793 | 5798 |
5794 instruct storeI0(memory mem, immI0 src) %{ | 5799 instruct storeI0(memory mem, immI0 src) %{ |
5795 match(Set mem (StoreI mem src)); | 5800 match(Set mem (StoreI mem src)); |
5796 ins_cost(MEMORY_REF_COST); | 5801 ins_cost(MEMORY_REF_COST); |
5797 | 5802 |
5798 size(4); | 5803 size(4); |
5799 format %{ "STW $src,$mem" %} | 5804 format %{ "STW $src,$mem" %} |
5800 opcode(Assembler::stw_op3); | 5805 opcode(Assembler::stw_op3); |
5801 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5806 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5802 ins_pipe(istore_mem_zero); | 5807 ins_pipe(istore_mem_zero); |
5803 %} | 5808 %} |
5804 | 5809 |
5805 instruct storeL0(memory mem, immL0 src) %{ | 5810 instruct storeL0(memory mem, immL0 src) %{ |
5806 match(Set mem (StoreL mem src)); | 5811 match(Set mem (StoreL mem src)); |
5807 ins_cost(MEMORY_REF_COST); | 5812 ins_cost(MEMORY_REF_COST); |
5808 | 5813 |
5809 size(4); | 5814 size(4); |
5810 format %{ "STX $src,$mem" %} | 5815 format %{ "STX $src,$mem" %} |
5811 opcode(Assembler::stx_op3); | 5816 opcode(Assembler::stx_op3); |
5812 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5817 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5813 ins_pipe(istore_mem_zero); | 5818 ins_pipe(istore_mem_zero); |
5814 %} | 5819 %} |
5815 | 5820 |
5816 // Store Integer from float register (used after fstoi) | 5821 // Store Integer from float register (used after fstoi) |
5817 instruct storeI_Freg(memory mem, regF src) %{ | 5822 instruct storeI_Freg(memory mem, regF src) %{ |
5819 ins_cost(MEMORY_REF_COST); | 5824 ins_cost(MEMORY_REF_COST); |
5820 | 5825 |
5821 size(4); | 5826 size(4); |
5822 format %{ "STF $src,$mem\t! after fstoi/fdtoi" %} | 5827 format %{ "STF $src,$mem\t! after fstoi/fdtoi" %} |
5823 opcode(Assembler::stf_op3); | 5828 opcode(Assembler::stf_op3); |
5824 ins_encode( form3_mem_reg( mem, src ) ); | 5829 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5825 ins_pipe(fstoreF_mem_reg); | 5830 ins_pipe(fstoreF_mem_reg); |
5826 %} | 5831 %} |
5827 | 5832 |
5828 // Store Pointer | 5833 // Store Pointer |
5829 instruct storeP(memory dst, sp_ptr_RegP src) %{ | 5834 instruct storeP(memory dst, sp_ptr_RegP src) %{ |
5902 ins_cost(MEMORY_REF_COST); | 5907 ins_cost(MEMORY_REF_COST); |
5903 | 5908 |
5904 size(4); | 5909 size(4); |
5905 format %{ "STDF $src,$mem" %} | 5910 format %{ "STDF $src,$mem" %} |
5906 opcode(Assembler::stdf_op3); | 5911 opcode(Assembler::stdf_op3); |
5907 ins_encode( form3_mem_reg( mem, src ) ); | 5912 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5908 ins_pipe(fstoreD_mem_reg); | 5913 ins_pipe(fstoreD_mem_reg); |
5909 %} | 5914 %} |
5910 | 5915 |
5911 instruct storeD0( memory mem, immD0 src) %{ | 5916 instruct storeD0( memory mem, immD0 src) %{ |
5912 match(Set mem (StoreD mem src)); | 5917 match(Set mem (StoreD mem src)); |
5913 ins_cost(MEMORY_REF_COST); | 5918 ins_cost(MEMORY_REF_COST); |
5914 | 5919 |
5915 size(4); | 5920 size(4); |
5916 format %{ "STX $src,$mem" %} | 5921 format %{ "STX $src,$mem" %} |
5917 opcode(Assembler::stx_op3); | 5922 opcode(Assembler::stx_op3); |
5918 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5923 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5919 ins_pipe(fstoreD_mem_zero); | 5924 ins_pipe(fstoreD_mem_zero); |
5920 %} | 5925 %} |
5921 | 5926 |
5922 // Store Float | 5927 // Store Float |
5923 instruct storeF( memory mem, regF src) %{ | 5928 instruct storeF( memory mem, regF src) %{ |
5925 ins_cost(MEMORY_REF_COST); | 5930 ins_cost(MEMORY_REF_COST); |
5926 | 5931 |
5927 size(4); | 5932 size(4); |
5928 format %{ "STF $src,$mem" %} | 5933 format %{ "STF $src,$mem" %} |
5929 opcode(Assembler::stf_op3); | 5934 opcode(Assembler::stf_op3); |
5930 ins_encode( form3_mem_reg( mem, src ) ); | 5935 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5931 ins_pipe(fstoreF_mem_reg); | 5936 ins_pipe(fstoreF_mem_reg); |
5932 %} | 5937 %} |
5933 | 5938 |
5934 instruct storeF0( memory mem, immF0 src) %{ | 5939 instruct storeF0( memory mem, immF0 src) %{ |
5935 match(Set mem (StoreF mem src)); | 5940 match(Set mem (StoreF mem src)); |
5936 ins_cost(MEMORY_REF_COST); | 5941 ins_cost(MEMORY_REF_COST); |
5937 | 5942 |
5938 size(4); | 5943 size(4); |
5939 format %{ "STW $src,$mem\t! storeF0" %} | 5944 format %{ "STW $src,$mem\t! storeF0" %} |
5940 opcode(Assembler::stw_op3); | 5945 opcode(Assembler::stw_op3); |
5941 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 5946 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
5942 ins_pipe(fstoreF_mem_zero); | 5947 ins_pipe(fstoreF_mem_zero); |
5943 %} | 5948 %} |
5944 | 5949 |
5945 // Store Aligned Packed Bytes in Double register to memory | 5950 // Store Aligned Packed Bytes in Double register to memory |
5946 instruct storeA8B(memory mem, regD src) %{ | 5951 instruct storeA8B(memory mem, regD src) %{ |
5947 match(Set mem (Store8B mem src)); | 5952 match(Set mem (Store8B mem src)); |
5948 ins_cost(MEMORY_REF_COST); | 5953 ins_cost(MEMORY_REF_COST); |
5949 size(4); | 5954 size(4); |
5950 format %{ "STDF $src,$mem\t! packed8B" %} | 5955 format %{ "STDF $src,$mem\t! packed8B" %} |
5951 opcode(Assembler::stdf_op3); | 5956 opcode(Assembler::stdf_op3); |
5952 ins_encode( form3_mem_reg( mem, src ) ); | 5957 ins_encode(simple_form3_mem_reg( mem, src ) ); |
5953 ins_pipe(fstoreD_mem_reg); | 5958 ins_pipe(fstoreD_mem_reg); |
5954 %} | 5959 %} |
5955 | 5960 |
5956 // Convert oop pointer into compressed form | 5961 // Convert oop pointer into compressed form |
5957 instruct encodeHeapOop(iRegN dst, iRegP src) %{ | 5962 instruct encodeHeapOop(iRegN dst, iRegP src) %{ |
6002 match(Set mem (Store8B mem zero)); | 6007 match(Set mem (Store8B mem zero)); |
6003 ins_cost(MEMORY_REF_COST); | 6008 ins_cost(MEMORY_REF_COST); |
6004 size(4); | 6009 size(4); |
6005 format %{ "STX $zero,$mem\t! packed8B" %} | 6010 format %{ "STX $zero,$mem\t! packed8B" %} |
6006 opcode(Assembler::stx_op3); | 6011 opcode(Assembler::stx_op3); |
6007 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 6012 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
6008 ins_pipe(fstoreD_mem_zero); | 6013 ins_pipe(fstoreD_mem_zero); |
6009 %} | 6014 %} |
6010 | 6015 |
6011 // Store Aligned Packed Chars/Shorts in Double register to memory | 6016 // Store Aligned Packed Chars/Shorts in Double register to memory |
6012 instruct storeA4C(memory mem, regD src) %{ | 6017 instruct storeA4C(memory mem, regD src) %{ |
6013 match(Set mem (Store4C mem src)); | 6018 match(Set mem (Store4C mem src)); |
6014 ins_cost(MEMORY_REF_COST); | 6019 ins_cost(MEMORY_REF_COST); |
6015 size(4); | 6020 size(4); |
6016 format %{ "STDF $src,$mem\t! packed4C" %} | 6021 format %{ "STDF $src,$mem\t! packed4C" %} |
6017 opcode(Assembler::stdf_op3); | 6022 opcode(Assembler::stdf_op3); |
6018 ins_encode( form3_mem_reg( mem, src ) ); | 6023 ins_encode(simple_form3_mem_reg( mem, src ) ); |
6019 ins_pipe(fstoreD_mem_reg); | 6024 ins_pipe(fstoreD_mem_reg); |
6020 %} | 6025 %} |
6021 | 6026 |
6022 // Store Zero into Aligned Packed Chars/Shorts | 6027 // Store Zero into Aligned Packed Chars/Shorts |
6023 instruct storeA4C0(memory mem, immI0 zero) %{ | 6028 instruct storeA4C0(memory mem, immI0 zero) %{ |
6024 match(Set mem (Store4C mem (Replicate4C zero))); | 6029 match(Set mem (Store4C mem (Replicate4C zero))); |
6025 ins_cost(MEMORY_REF_COST); | 6030 ins_cost(MEMORY_REF_COST); |
6026 size(4); | 6031 size(4); |
6027 format %{ "STX $zero,$mem\t! packed4C" %} | 6032 format %{ "STX $zero,$mem\t! packed4C" %} |
6028 opcode(Assembler::stx_op3); | 6033 opcode(Assembler::stx_op3); |
6029 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 6034 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
6030 ins_pipe(fstoreD_mem_zero); | 6035 ins_pipe(fstoreD_mem_zero); |
6031 %} | 6036 %} |
6032 | 6037 |
6033 // Store Aligned Packed Ints in Double register to memory | 6038 // Store Aligned Packed Ints in Double register to memory |
6034 instruct storeA2I(memory mem, regD src) %{ | 6039 instruct storeA2I(memory mem, regD src) %{ |
6035 match(Set mem (Store2I mem src)); | 6040 match(Set mem (Store2I mem src)); |
6036 ins_cost(MEMORY_REF_COST); | 6041 ins_cost(MEMORY_REF_COST); |
6037 size(4); | 6042 size(4); |
6038 format %{ "STDF $src,$mem\t! packed2I" %} | 6043 format %{ "STDF $src,$mem\t! packed2I" %} |
6039 opcode(Assembler::stdf_op3); | 6044 opcode(Assembler::stdf_op3); |
6040 ins_encode( form3_mem_reg( mem, src ) ); | 6045 ins_encode(simple_form3_mem_reg( mem, src ) ); |
6041 ins_pipe(fstoreD_mem_reg); | 6046 ins_pipe(fstoreD_mem_reg); |
6042 %} | 6047 %} |
6043 | 6048 |
6044 // Store Zero into Aligned Packed Ints | 6049 // Store Zero into Aligned Packed Ints |
6045 instruct storeA2I0(memory mem, immI0 zero) %{ | 6050 instruct storeA2I0(memory mem, immI0 zero) %{ |
6046 match(Set mem (Store2I mem zero)); | 6051 match(Set mem (Store2I mem zero)); |
6047 ins_cost(MEMORY_REF_COST); | 6052 ins_cost(MEMORY_REF_COST); |
6048 size(4); | 6053 size(4); |
6049 format %{ "STX $zero,$mem\t! packed2I" %} | 6054 format %{ "STX $zero,$mem\t! packed2I" %} |
6050 opcode(Assembler::stx_op3); | 6055 opcode(Assembler::stx_op3); |
6051 ins_encode( form3_mem_reg( mem, R_G0 ) ); | 6056 ins_encode(simple_form3_mem_reg( mem, R_G0 ) ); |
6052 ins_pipe(fstoreD_mem_zero); | 6057 ins_pipe(fstoreD_mem_zero); |
6053 %} | 6058 %} |
6054 | 6059 |
6055 | 6060 |
6056 //----------MemBar Instructions----------------------------------------------- | 6061 //----------MemBar Instructions----------------------------------------------- |
6160 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! | 6165 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! |
6161 match(Set stkSlot src); // chain rule | 6166 match(Set stkSlot src); // chain rule |
6162 ins_cost(MEMORY_REF_COST); | 6167 ins_cost(MEMORY_REF_COST); |
6163 format %{ "STDF $src,$stkSlot\t!stk" %} | 6168 format %{ "STDF $src,$stkSlot\t!stk" %} |
6164 opcode(Assembler::stdf_op3); | 6169 opcode(Assembler::stdf_op3); |
6165 ins_encode(form3_mem_reg(stkSlot, src)); | 6170 ins_encode(simple_form3_mem_reg(stkSlot, src)); |
6166 ins_pipe(fstoreD_stk_reg); | 6171 ins_pipe(fstoreD_stk_reg); |
6167 %} | 6172 %} |
6168 | 6173 |
6169 instruct ldfSSD(regD dst, stackSlotD stkSlot) %{ | 6174 instruct ldfSSD(regD dst, stackSlotD stkSlot) %{ |
6170 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! | 6175 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! |
6171 match(Set dst stkSlot); // chain rule | 6176 match(Set dst stkSlot); // chain rule |
6172 ins_cost(MEMORY_REF_COST); | 6177 ins_cost(MEMORY_REF_COST); |
6173 format %{ "LDDF $stkSlot,$dst\t!stk" %} | 6178 format %{ "LDDF $stkSlot,$dst\t!stk" %} |
6174 opcode(Assembler::lddf_op3); | 6179 opcode(Assembler::lddf_op3); |
6175 ins_encode(form3_mem_reg(stkSlot, dst)); | 6180 ins_encode(simple_form3_mem_reg(stkSlot, dst)); |
6176 ins_pipe(floadD_stk); | 6181 ins_pipe(floadD_stk); |
6177 %} | 6182 %} |
6178 | 6183 |
6179 instruct stfSSF(stackSlotF stkSlot, regF src) %{ | 6184 instruct stfSSF(stackSlotF stkSlot, regF src) %{ |
6180 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! | 6185 // %%%% TO DO: Tell the coalescer that this kind of node is a copy! |
6181 match(Set stkSlot src); // chain rule | 6186 match(Set stkSlot src); // chain rule |
6182 ins_cost(MEMORY_REF_COST); | 6187 ins_cost(MEMORY_REF_COST); |
6183 format %{ "STF $src,$stkSlot\t!stk" %} | 6188 format %{ "STF $src,$stkSlot\t!stk" %} |
6184 opcode(Assembler::stf_op3); | 6189 opcode(Assembler::stf_op3); |
6185 ins_encode(form3_mem_reg(stkSlot, src)); | 6190 ins_encode(simple_form3_mem_reg(stkSlot, src)); |
6186 ins_pipe(fstoreF_stk_reg); | 6191 ins_pipe(fstoreF_stk_reg); |
6187 %} | 6192 %} |
6188 | 6193 |
6189 //----------Conditional Move--------------------------------------------------- | 6194 //----------Conditional Move--------------------------------------------------- |
6190 // Conditional move | 6195 // Conditional move |
6582 match(Set dst (LoadLLocked mem)); | 6587 match(Set dst (LoadLLocked mem)); |
6583 ins_cost(MEMORY_REF_COST); | 6588 ins_cost(MEMORY_REF_COST); |
6584 size(4); | 6589 size(4); |
6585 format %{ "LDX $mem,$dst\t! long" %} | 6590 format %{ "LDX $mem,$dst\t! long" %} |
6586 opcode(Assembler::ldx_op3); | 6591 opcode(Assembler::ldx_op3); |
6587 ins_encode( form3_mem_reg( mem, dst ) ); | 6592 ins_encode(simple_form3_mem_reg( mem, dst ) ); |
6588 ins_pipe(iload_mem); | 6593 ins_pipe(iload_mem); |
6589 %} | 6594 %} |
6590 | 6595 |
6591 instruct storePConditional( iRegP heap_top_ptr, iRegP oldval, g3RegP newval, flagsRegP pcc ) %{ | 6596 instruct storePConditional( iRegP heap_top_ptr, iRegP oldval, g3RegP newval, flagsRegP pcc ) %{ |
6592 match(Set pcc (StorePConditional heap_top_ptr (Binary oldval newval))); | 6597 match(Set pcc (StorePConditional heap_top_ptr (Binary oldval newval))); |
7664 ins_cost(DEFAULT_COST + MEMORY_REF_COST); | 7669 ins_cost(DEFAULT_COST + MEMORY_REF_COST); |
7665 size(8); | 7670 size(8); |
7666 format %{ "LDF $mem,$dst\n\t" | 7671 format %{ "LDF $mem,$dst\n\t" |
7667 "FITOD $dst,$dst" %} | 7672 "FITOD $dst,$dst" %} |
7668 opcode(Assembler::ldf_op3, Assembler::fitod_opf); | 7673 opcode(Assembler::ldf_op3, Assembler::fitod_opf); |
7669 ins_encode( form3_mem_reg( mem, dst ), form3_convI2F(dst, dst)); | 7674 ins_encode(simple_form3_mem_reg( mem, dst ), form3_convI2F(dst, dst)); |
7670 ins_pipe(floadF_mem); | 7675 ins_pipe(floadF_mem); |
7671 %} | 7676 %} |
7672 | 7677 |
7673 | 7678 |
7674 instruct convI2F_helper(regF dst, regF tmp) %{ | 7679 instruct convI2F_helper(regF dst, regF tmp) %{ |
7694 ins_cost(DEFAULT_COST + MEMORY_REF_COST); | 7699 ins_cost(DEFAULT_COST + MEMORY_REF_COST); |
7695 size(8); | 7700 size(8); |
7696 format %{ "LDF $mem,$dst\n\t" | 7701 format %{ "LDF $mem,$dst\n\t" |
7697 "FITOS $dst,$dst" %} | 7702 "FITOS $dst,$dst" %} |
7698 opcode(Assembler::ldf_op3, Assembler::fitos_opf); | 7703 opcode(Assembler::ldf_op3, Assembler::fitos_opf); |
7699 ins_encode( form3_mem_reg( mem, dst ), form3_convI2F(dst, dst)); | 7704 ins_encode(simple_form3_mem_reg( mem, dst ), form3_convI2F(dst, dst)); |
7700 ins_pipe(floadF_mem); | 7705 ins_pipe(floadF_mem); |
7701 %} | 7706 %} |
7702 | 7707 |
7703 | 7708 |
7704 instruct convI2L_reg(iRegL dst, iRegI src) %{ | 7709 instruct convI2L_reg(iRegL dst, iRegI src) %{ |
7736 ins_cost(MEMORY_REF_COST); | 7741 ins_cost(MEMORY_REF_COST); |
7737 | 7742 |
7738 size(4); | 7743 size(4); |
7739 format %{ "LDUW $src,$dst\t! MoveF2I" %} | 7744 format %{ "LDUW $src,$dst\t! MoveF2I" %} |
7740 opcode(Assembler::lduw_op3); | 7745 opcode(Assembler::lduw_op3); |
7741 ins_encode( form3_mem_reg( src, dst ) ); | 7746 ins_encode(simple_form3_mem_reg( src, dst ) ); |
7742 ins_pipe(iload_mem); | 7747 ins_pipe(iload_mem); |
7743 %} | 7748 %} |
7744 | 7749 |
7745 instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{ | 7750 instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{ |
7746 match(Set dst (MoveI2F src)); | 7751 match(Set dst (MoveI2F src)); |
7748 ins_cost(MEMORY_REF_COST); | 7753 ins_cost(MEMORY_REF_COST); |
7749 | 7754 |
7750 size(4); | 7755 size(4); |
7751 format %{ "LDF $src,$dst\t! MoveI2F" %} | 7756 format %{ "LDF $src,$dst\t! MoveI2F" %} |
7752 opcode(Assembler::ldf_op3); | 7757 opcode(Assembler::ldf_op3); |
7753 ins_encode(form3_mem_reg(src, dst)); | 7758 ins_encode(simple_form3_mem_reg(src, dst)); |
7754 ins_pipe(floadF_stk); | 7759 ins_pipe(floadF_stk); |
7755 %} | 7760 %} |
7756 | 7761 |
7757 instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{ | 7762 instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{ |
7758 match(Set dst (MoveD2L src)); | 7763 match(Set dst (MoveD2L src)); |
7760 ins_cost(MEMORY_REF_COST); | 7765 ins_cost(MEMORY_REF_COST); |
7761 | 7766 |
7762 size(4); | 7767 size(4); |
7763 format %{ "LDX $src,$dst\t! MoveD2L" %} | 7768 format %{ "LDX $src,$dst\t! MoveD2L" %} |
7764 opcode(Assembler::ldx_op3); | 7769 opcode(Assembler::ldx_op3); |
7765 ins_encode( form3_mem_reg( src, dst ) ); | 7770 ins_encode(simple_form3_mem_reg( src, dst ) ); |
7766 ins_pipe(iload_mem); | 7771 ins_pipe(iload_mem); |
7767 %} | 7772 %} |
7768 | 7773 |
7769 instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{ | 7774 instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{ |
7770 match(Set dst (MoveL2D src)); | 7775 match(Set dst (MoveL2D src)); |
7772 ins_cost(MEMORY_REF_COST); | 7777 ins_cost(MEMORY_REF_COST); |
7773 | 7778 |
7774 size(4); | 7779 size(4); |
7775 format %{ "LDDF $src,$dst\t! MoveL2D" %} | 7780 format %{ "LDDF $src,$dst\t! MoveL2D" %} |
7776 opcode(Assembler::lddf_op3); | 7781 opcode(Assembler::lddf_op3); |
7777 ins_encode(form3_mem_reg(src, dst)); | 7782 ins_encode(simple_form3_mem_reg(src, dst)); |
7778 ins_pipe(floadD_stk); | 7783 ins_pipe(floadD_stk); |
7779 %} | 7784 %} |
7780 | 7785 |
7781 instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{ | 7786 instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{ |
7782 match(Set dst (MoveF2I src)); | 7787 match(Set dst (MoveF2I src)); |
7784 ins_cost(MEMORY_REF_COST); | 7789 ins_cost(MEMORY_REF_COST); |
7785 | 7790 |
7786 size(4); | 7791 size(4); |
7787 format %{ "STF $src,$dst\t!MoveF2I" %} | 7792 format %{ "STF $src,$dst\t!MoveF2I" %} |
7788 opcode(Assembler::stf_op3); | 7793 opcode(Assembler::stf_op3); |
7789 ins_encode(form3_mem_reg(dst, src)); | 7794 ins_encode(simple_form3_mem_reg(dst, src)); |
7790 ins_pipe(fstoreF_stk_reg); | 7795 ins_pipe(fstoreF_stk_reg); |
7791 %} | 7796 %} |
7792 | 7797 |
7793 instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{ | 7798 instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{ |
7794 match(Set dst (MoveI2F src)); | 7799 match(Set dst (MoveI2F src)); |
7796 ins_cost(MEMORY_REF_COST); | 7801 ins_cost(MEMORY_REF_COST); |
7797 | 7802 |
7798 size(4); | 7803 size(4); |
7799 format %{ "STW $src,$dst\t!MoveI2F" %} | 7804 format %{ "STW $src,$dst\t!MoveI2F" %} |
7800 opcode(Assembler::stw_op3); | 7805 opcode(Assembler::stw_op3); |
7801 ins_encode( form3_mem_reg( dst, src ) ); | 7806 ins_encode(simple_form3_mem_reg( dst, src ) ); |
7802 ins_pipe(istore_mem_reg); | 7807 ins_pipe(istore_mem_reg); |
7803 %} | 7808 %} |
7804 | 7809 |
7805 instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{ | 7810 instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{ |
7806 match(Set dst (MoveD2L src)); | 7811 match(Set dst (MoveD2L src)); |
7808 ins_cost(MEMORY_REF_COST); | 7813 ins_cost(MEMORY_REF_COST); |
7809 | 7814 |
7810 size(4); | 7815 size(4); |
7811 format %{ "STDF $src,$dst\t!MoveD2L" %} | 7816 format %{ "STDF $src,$dst\t!MoveD2L" %} |
7812 opcode(Assembler::stdf_op3); | 7817 opcode(Assembler::stdf_op3); |
7813 ins_encode(form3_mem_reg(dst, src)); | 7818 ins_encode(simple_form3_mem_reg(dst, src)); |
7814 ins_pipe(fstoreD_stk_reg); | 7819 ins_pipe(fstoreD_stk_reg); |
7815 %} | 7820 %} |
7816 | 7821 |
7817 instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{ | 7822 instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{ |
7818 match(Set dst (MoveL2D src)); | 7823 match(Set dst (MoveL2D src)); |
7820 ins_cost(MEMORY_REF_COST); | 7825 ins_cost(MEMORY_REF_COST); |
7821 | 7826 |
7822 size(4); | 7827 size(4); |
7823 format %{ "STX $src,$dst\t!MoveL2D" %} | 7828 format %{ "STX $src,$dst\t!MoveL2D" %} |
7824 opcode(Assembler::stx_op3); | 7829 opcode(Assembler::stx_op3); |
7825 ins_encode( form3_mem_reg( dst, src ) ); | 7830 ins_encode(simple_form3_mem_reg( dst, src ) ); |
7826 ins_pipe(istore_mem_reg); | 7831 ins_pipe(istore_mem_reg); |
7827 %} | 7832 %} |
7828 | 7833 |
7829 | 7834 |
7830 //----------- | 7835 //----------- |