comparison src/share/vm/adlc/output_c.cpp @ 624:337400e7a5dd

6797305: Add LoadUB and LoadUI opcode class Summary: Add a LoadUB (unsigned byte) and LoadUI (unsigned int) opcode class so we have these load optimizations in the first place and do not need to handle them in the matcher. Reviewed-by: never, kvn
author twisti
date Mon, 09 Mar 2009 03:17:11 -0700
parents dbbe28fc66b5
children 2056494941db
comparison
equal deleted inserted replaced
623:9adddb8c0fc8 624:337400e7a5dd
2137 2137
2138 if ( (*rep_var) == '$' ) { 2138 if ( (*rep_var) == '$' ) {
2139 // A subfield variable, '$$' prefix 2139 // A subfield variable, '$$' prefix
2140 emit_field( rep_var ); 2140 emit_field( rep_var );
2141 } else { 2141 } else {
2142 // A replacement variable, '$' prefix 2142 if (_strings_to_emit.peek() != NULL &&
2143 emit_rep_var( rep_var ); 2143 strcmp(_strings_to_emit.peek(), "$Address") == 0) {
2144 fprintf(_fp, "Address::make_raw(");
2145
2146 emit_rep_var( rep_var );
2147 fprintf(_fp,"->base(ra_,this,idx%d), ", _operand_idx);
2148
2149 _reg_status = LITERAL_ACCESSED;
2150 emit_rep_var( rep_var );
2151 fprintf(_fp,"->index(ra_,this,idx%d), ", _operand_idx);
2152
2153 _reg_status = LITERAL_ACCESSED;
2154 emit_rep_var( rep_var );
2155 fprintf(_fp,"->scale(), ");
2156
2157 _reg_status = LITERAL_ACCESSED;
2158 emit_rep_var( rep_var );
2159 Form::DataType stack_type = _operand ? _operand->is_user_name_for_sReg() : Form::none;
2160 if( _operand && _operand_idx==0 && stack_type != Form::none ) {
2161 fprintf(_fp,"->disp(ra_,this,0), ");
2162 } else {
2163 fprintf(_fp,"->disp(ra_,this,idx%d), ", _operand_idx);
2164 }
2165
2166 _reg_status = LITERAL_ACCESSED;
2167 emit_rep_var( rep_var );
2168 fprintf(_fp,"->disp_is_oop())");
2169
2170 // skip trailing $Address
2171 _strings_to_emit.iter();
2172 } else {
2173 // A replacement variable, '$' prefix
2174 const char* next = _strings_to_emit.peek();
2175 const char* next2 = _strings_to_emit.peek(2);
2176 if (next != NULL && next2 != NULL && strcmp(next2, "$Register") == 0 &&
2177 (strcmp(next, "$base") == 0 || strcmp(next, "$index") == 0)) {
2178 // handle $rev_var$$base$$Register and $rev_var$$index$$Register by
2179 // producing as_Register(opnd_array(#)->base(ra_,this,idx1)).
2180 fprintf(_fp, "as_Register(");
2181 // emit the operand reference
2182 emit_rep_var( rep_var );
2183 rep_var = _strings_to_emit.iter();
2184 assert(strcmp(rep_var, "$base") == 0 || strcmp(rep_var, "$index") == 0, "bad pattern");
2185 // handle base or index
2186 emit_field(rep_var);
2187 rep_var = _strings_to_emit.iter();
2188 assert(strcmp(rep_var, "$Register") == 0, "bad pattern");
2189 // close up the parens
2190 fprintf(_fp, ")");
2191 } else {
2192 emit_rep_var( rep_var );
2193 }
2194 }
2144 } // end replacement and/or subfield 2195 } // end replacement and/or subfield
2145 } 2196 }
2146 } 2197 }
2147 2198
2148 void emit_reloc_type(const char* type) { 2199 void emit_reloc_type(const char* type) {