Revision 26cc915c tcg/sparc/tcg-target.c
b/tcg/sparc/tcg-target.c | ||
---|---|---|
243 | 243 |
#define STW (INSN_OP(3) | INSN_OP3(0x04)) |
244 | 244 |
#define STX (INSN_OP(3) | INSN_OP3(0x0e)) |
245 | 245 |
|
246 |
static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, |
|
247 |
int op) |
|
248 |
{ |
|
249 |
tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | |
|
250 |
INSN_RS2(rs2)); |
|
251 |
} |
|
252 |
|
|
253 |
static inline void tcg_out_arithi(TCGContext *s, int rd, int rs1, int offset, |
|
254 |
int op) |
|
255 |
{ |
|
256 |
tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | |
|
257 |
INSN_IMM13(offset)); |
|
258 |
} |
|
259 |
|
|
246 | 260 |
static inline void tcg_out_mov(TCGContext *s, int ret, int arg) |
247 | 261 |
{ |
248 |
tcg_out32(s, ARITH_OR | INSN_RD(ret) | INSN_RS1(arg) | |
|
249 |
INSN_RS2(TCG_REG_G0)); |
|
262 |
tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR); |
|
263 |
} |
|
264 |
|
|
265 |
static inline void tcg_out_sethi(TCGContext *s, int ret, uint32_t arg) |
|
266 |
{ |
|
267 |
tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10)); |
|
250 | 268 |
} |
251 | 269 |
|
252 | 270 |
static inline void tcg_out_movi(TCGContext *s, TCGType type, |
... | ... | |
260 | 278 |
tcg_out32(s, ARITH_OR | INSN_RD(ret) | INSN_RS1(TCG_REG_G0) | |
261 | 279 |
INSN_IMM13(arg)); |
262 | 280 |
else { |
263 |
tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10));
|
|
281 |
tcg_out_sethi(s, ret, arg);
|
|
264 | 282 |
if (arg & 0x3ff) |
265 | 283 |
tcg_out32(s, ARITH_OR | INSN_RD(ret) | INSN_RS1(ret) | |
266 | 284 |
INSN_IMM13(arg & 0x3ff)); |
... | ... | |
270 | 288 |
static inline void tcg_out_ld_raw(TCGContext *s, int ret, |
271 | 289 |
tcg_target_long arg) |
272 | 290 |
{ |
273 |
tcg_out32(s, SETHI | INSN_RD(ret) | (((uint32_t)arg & 0xfffffc00) >> 10));
|
|
291 |
tcg_out_sethi(s, ret, arg);
|
|
274 | 292 |
tcg_out32(s, LDUW | INSN_RD(ret) | INSN_RS1(ret) | |
275 | 293 |
INSN_IMM13(arg & 0x3ff)); |
276 | 294 |
} |
... | ... | |
282 | 300 |
if (!check_fit_tl(arg, 32) && (arg & ~0xffffffff) != 0) |
283 | 301 |
fprintf(stderr, "unimplemented %s with offset %ld\n", __func__, arg); |
284 | 302 |
if (!check_fit_i32(arg, 13)) |
285 |
tcg_out32(s, SETHI | INSN_RD(ret) | (((uint32_t)arg & 0xfffffc00) >> 10));
|
|
303 |
tcg_out_sethi(s, ret, arg);
|
|
286 | 304 |
tcg_out32(s, LDX | INSN_RD(ret) | INSN_RS1(ret) | |
287 | 305 |
INSN_IMM13(arg & 0x3ff)); |
288 | 306 |
#else |
... | ... | |
320 | 338 |
tcg_out_ldst(s, arg, arg1, arg2, STX); |
321 | 339 |
} |
322 | 340 |
|
323 |
static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, |
|
324 |
int op) |
|
325 |
{ |
|
326 |
tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | |
|
327 |
INSN_RS2(rs2)); |
|
328 |
} |
|
329 |
|
|
330 |
static inline void tcg_out_arithi(TCGContext *s, int rd, int rs1, int offset, |
|
331 |
int op) |
|
332 |
{ |
|
333 |
tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | |
|
334 |
INSN_IMM13(offset)); |
|
335 |
} |
|
336 |
|
|
337 | 341 |
static inline void tcg_out_sety(TCGContext *s, tcg_target_long val) |
338 | 342 |
{ |
339 | 343 |
if (val == 0 || val == -1) |
... | ... | |
356 | 360 |
|
357 | 361 |
static inline void tcg_out_nop(TCGContext *s) |
358 | 362 |
{ |
359 |
tcg_out32(s, SETHI | INSN_RD(TCG_REG_G0) | 0);
|
|
363 |
tcg_out_sethi(s, TCG_REG_G0, 0);
|
|
360 | 364 |
} |
361 | 365 |
|
362 | 366 |
static void tcg_out_branch(TCGContext *s, int opc, int label_index) |
... | ... | |
392 | 396 |
int label_index) |
393 | 397 |
{ |
394 | 398 |
if (const_arg2 && arg2 == 0) |
395 |
/* orcc r, r, %g0 */
|
|
399 |
/* orcc %g0, r, %g0 */
|
|
396 | 400 |
tcg_out_arith(s, TCG_REG_G0, TCG_REG_G0, arg1, ARITH_ORCC); |
397 | 401 |
else |
398 | 402 |
/* subcc r1, r2, %g0 */ |
... | ... | |
780 | 784 |
case INDEX_op_goto_tb: |
781 | 785 |
if (s->tb_jmp_offset) { |
782 | 786 |
/* direct jump method */ |
783 |
tcg_out32(s, SETHI | INSN_RD(TCG_REG_I5) | |
|
784 |
((args[0] & 0xffffe000) >> 10)); |
|
787 |
tcg_out_sethi(s, TCG_REG_I5, args[0] & 0xffffe000); |
|
785 | 788 |
tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_I5) | |
786 | 789 |
INSN_IMM13((args[0] & 0x1fff))); |
787 | 790 |
s->tb_jmp_offset[args[0]] = s->code_ptr - s->code_buf; |
Also available in: Unified diff