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