1277 if (r->is_Register()) return rc_int; |
1283 if (r->is_Register()) return rc_int; |
1278 assert(r->is_FloatRegister(), "must be"); |
1284 assert(r->is_FloatRegister(), "must be"); |
1279 return rc_float; |
1285 return rc_float; |
1280 } |
1286 } |
1281 |
1287 |
1282 static int impl_helper( const MachNode *mach, CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, bool is_load, int offset, int reg, int opcode, const char *op_str, int size, outputStream* st ) { |
1288 static int impl_helper(const MachNode* mach, CodeBuffer* cbuf, PhaseRegAlloc* ra, bool do_size, bool is_load, int offset, int reg, int opcode, const char *op_str, int size, outputStream* st ) { |
1283 if( cbuf ) { |
1289 if (cbuf) { |
1284 // Better yet would be some mechanism to handle variable-size matches correctly |
1290 emit_form3_mem_reg(*cbuf, ra, mach, opcode, -1, R_SP_enc, offset, 0, Matcher::_regEncode[reg]); |
1285 if (!Assembler::is_simm13(offset + STACK_BIAS)) { |
|
1286 ra_->C->record_method_not_compilable("unable to handle large constant offsets"); |
|
1287 } else { |
|
1288 emit_form3_mem_reg(*cbuf, mach, opcode, -1, R_SP_enc, offset, 0, Matcher::_regEncode[reg]); |
|
1289 } |
|
1290 } |
1291 } |
1291 #ifndef PRODUCT |
1292 #ifndef PRODUCT |
1292 else if( !do_size ) { |
1293 else if (!do_size) { |
1293 if( size != 0 ) st->print("\n\t"); |
1294 if (size != 0) st->print("\n\t"); |
1294 if( is_load ) st->print("%s [R_SP + #%d],R_%s\t! spill",op_str,offset,OptoReg::regname(reg)); |
1295 if (is_load) st->print("%s [R_SP + #%d],R_%s\t! spill",op_str,offset,OptoReg::regname(reg)); |
1295 else st->print("%s R_%s,[R_SP + #%d]\t! spill",op_str,OptoReg::regname(reg),offset); |
1296 else st->print("%s R_%s,[R_SP + #%d]\t! spill",op_str,OptoReg::regname(reg),offset); |
1296 } |
1297 } |
1297 #endif |
1298 #endif |
1298 return size+4; |
1299 return size+4; |
1299 } |
1300 } |
1300 |
1301 |
2085 __ untested("encoding"); |
2086 __ untested("encoding"); |
2086 #endif |
2087 #endif |
2087 %} |
2088 %} |
2088 |
2089 |
2089 enc_class form3_mem_reg( memory mem, iRegI dst ) %{ |
2090 enc_class form3_mem_reg( memory mem, iRegI dst ) %{ |
2090 emit_form3_mem_reg(cbuf, this, $primary, $tertiary, |
2091 emit_form3_mem_reg(cbuf, ra_, this, $primary, $tertiary, |
2091 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); |
2092 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); |
2092 %} |
2093 %} |
2093 |
2094 |
2094 enc_class simple_form3_mem_reg( memory mem, iRegI dst ) %{ |
2095 enc_class simple_form3_mem_reg( memory mem, iRegI dst ) %{ |
2095 emit_form3_mem_reg(cbuf, this, $primary, -1, |
2096 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, |
2096 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); |
2097 $mem$$base, $mem$$disp, $mem$$index, $dst$$reg); |
2097 %} |
2098 %} |
2098 |
2099 |
2099 enc_class form3_mem_prefetch_read( memory mem ) %{ |
2100 enc_class form3_mem_prefetch_read( memory mem ) %{ |
2100 emit_form3_mem_reg(cbuf, this, $primary, -1, |
2101 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, |
2101 $mem$$base, $mem$$disp, $mem$$index, 0/*prefetch function many-reads*/); |
2102 $mem$$base, $mem$$disp, $mem$$index, 0/*prefetch function many-reads*/); |
2102 %} |
2103 %} |
2103 |
2104 |
2104 enc_class form3_mem_prefetch_write( memory mem ) %{ |
2105 enc_class form3_mem_prefetch_write( memory mem ) %{ |
2105 emit_form3_mem_reg(cbuf, this, $primary, -1, |
2106 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, |
2106 $mem$$base, $mem$$disp, $mem$$index, 2/*prefetch function many-writes*/); |
2107 $mem$$base, $mem$$disp, $mem$$index, 2/*prefetch function many-writes*/); |
2107 %} |
2108 %} |
2108 |
2109 |
2109 enc_class form3_mem_reg_long_unaligned_marshal( memory mem, iRegL reg ) %{ |
2110 enc_class form3_mem_reg_long_unaligned_marshal( memory mem, iRegL reg ) %{ |
2110 assert(Assembler::is_simm13($mem$$disp ), "need disp and disp+4"); |
2111 assert(Assembler::is_simm13($mem$$disp ), "need disp and disp+4"); |
2111 assert(Assembler::is_simm13($mem$$disp+4), "need disp and disp+4"); |
2112 assert(Assembler::is_simm13($mem$$disp+4), "need disp and disp+4"); |
2112 guarantee($mem$$index == R_G0_enc, "double index?"); |
2113 guarantee($mem$$index == R_G0_enc, "double index?"); |
2113 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, R_O7_enc ); |
2114 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, R_O7_enc ); |
2114 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg ); |
2115 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg ); |
2115 emit3_simm13( cbuf, Assembler::arith_op, $reg$$reg, Assembler::sllx_op3, $reg$$reg, 0x1020 ); |
2116 emit3_simm13( cbuf, Assembler::arith_op, $reg$$reg, Assembler::sllx_op3, $reg$$reg, 0x1020 ); |
2116 emit3( cbuf, Assembler::arith_op, $reg$$reg, Assembler::or_op3, $reg$$reg, 0, R_O7_enc ); |
2117 emit3( cbuf, Assembler::arith_op, $reg$$reg, Assembler::or_op3, $reg$$reg, 0, R_O7_enc ); |
2117 %} |
2118 %} |
2118 |
2119 |
2119 enc_class form3_mem_reg_double_unaligned( memory mem, RegD_low reg ) %{ |
2120 enc_class form3_mem_reg_double_unaligned( memory mem, RegD_low reg ) %{ |
2120 assert(Assembler::is_simm13($mem$$disp ), "need disp and disp+4"); |
2121 assert(Assembler::is_simm13($mem$$disp ), "need disp and disp+4"); |
2121 assert(Assembler::is_simm13($mem$$disp+4), "need disp and disp+4"); |
2122 assert(Assembler::is_simm13($mem$$disp+4), "need disp and disp+4"); |
2122 guarantee($mem$$index == R_G0_enc, "double index?"); |
2123 guarantee($mem$$index == R_G0_enc, "double index?"); |
2123 // Load long with 2 instructions |
2124 // Load long with 2 instructions |
2124 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg+0 ); |
2125 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, $mem$$base, $mem$$disp, R_G0_enc, $reg$$reg+0 ); |
2125 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, $reg$$reg+1 ); |
2126 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, $mem$$base, $mem$$disp+4, R_G0_enc, $reg$$reg+1 ); |
2126 %} |
2127 %} |
2127 |
2128 |
2128 //%%% form3_mem_plus_4_reg is a hack--get rid of it |
2129 //%%% form3_mem_plus_4_reg is a hack--get rid of it |
2129 enc_class form3_mem_plus_4_reg( memory mem, iRegI dst ) %{ |
2130 enc_class form3_mem_plus_4_reg( memory mem, iRegI dst ) %{ |
2130 guarantee($mem$$disp, "cannot offset a reg-reg operand by 4"); |
2131 guarantee($mem$$disp, "cannot offset a reg-reg operand by 4"); |
2131 emit_form3_mem_reg(cbuf, this, $primary, -1, $mem$$base, $mem$$disp + 4, $mem$$index, $dst$$reg); |
2132 emit_form3_mem_reg(cbuf, ra_, this, $primary, -1, $mem$$base, $mem$$disp + 4, $mem$$index, $dst$$reg); |
2132 %} |
2133 %} |
2133 |
2134 |
2134 enc_class form3_g0_rs2_rd_move( iRegI rs2, iRegI rd ) %{ |
2135 enc_class form3_g0_rs2_rd_move( iRegI rs2, iRegI rd ) %{ |
2135 // Encode a reg-reg copy. If it is useless, then empty encoding. |
2136 // Encode a reg-reg copy. If it is useless, then empty encoding. |
2136 if( $rs2$$reg != $rd$$reg ) |
2137 if( $rs2$$reg != $rd$$reg ) |