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 |
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----------- |
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) %{ |
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) %{ |
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) %{ |
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 |