Revision 57e49b40 tcg/sparc/tcg-target.c

b/tcg/sparc/tcg-target.c
87 87
    TCG_REG_O1,
88 88
};
89 89

  
90
static inline int check_fit(tcg_target_long val, unsigned int bits)
90
static inline int check_fit_tl(tcg_target_long val, unsigned int bits)
91 91
{
92
    return ((val << ((sizeof(tcg_target_long) * 8 - bits))
93
             >> (sizeof(tcg_target_long) * 8 - bits)) == val);
92
    return (val << ((sizeof(tcg_target_long) * 8 - bits))
93
            >> (sizeof(tcg_target_long) * 8 - bits)) == val;
94
}
95

  
96
static inline int check_fit_i32(uint32_t val, unsigned int bits)
97
{
98
    return ((val << (32 - bits)) >> (32 - bits)) == val;
94 99
}
95 100

  
96 101
static void patch_reloc(uint8_t *code_ptr, int type,
......
106 111
    case R_SPARC_WDISP22:
107 112
        value -= (long)code_ptr;
108 113
        value >>= 2;
109
        if (!check_fit(value, 22))
114
        if (!check_fit_tl(value, 22))
110 115
            tcg_abort();
111 116
        *(uint32_t *)code_ptr = ((*(uint32_t *)code_ptr) & ~0x3fffff) | value;
112 117
        break;
......
158 163
    ct = arg_ct->ct;
159 164
    if (ct & TCG_CT_CONST)
160 165
        return 1;
161
    else if ((ct & TCG_CT_CONST_S11) && check_fit(val, 11))
166
    else if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11))
162 167
        return 1;
163
    else if ((ct & TCG_CT_CONST_S13) && check_fit(val, 13))
168
    else if ((ct & TCG_CT_CONST_S13) && check_fit_tl(val, 13))
164 169
        return 1;
165 170
    else
166 171
        return 0;
......
248 253
                                int ret, tcg_target_long arg)
249 254
{
250 255
#if defined(__sparc_v9__) && !defined(__sparc_v8plus__)
251
    if (!check_fit(arg, 32))
256
    if (!check_fit_tl(arg, 32) && (arg & ~0xffffffff) != 0)
252 257
        fprintf(stderr, "unimplemented %s with constant %ld\n", __func__, arg);
253 258
#endif
254
    if (check_fit(arg, 13))
259
    if (check_fit_i32(arg, 13))
255 260
        tcg_out32(s, ARITH_OR | INSN_RD(ret) | INSN_RS1(TCG_REG_G0) |
256 261
                  INSN_IMM13(arg));
257 262
    else {
......
274 279
                                  tcg_target_long arg)
275 280
{
276 281
#if defined(__sparc_v9__) && !defined(__sparc_v8plus__)
277
    if (!check_fit(arg, 32))
282
    if (!check_fit_tl(arg, 32) && (arg & ~0xffffffff) != 0)
278 283
        fprintf(stderr, "unimplemented %s with offset %ld\n", __func__, arg);
279
    if (!check_fit(arg, 13))
284
    if (!check_fit_i32(arg, 13))
280 285
        tcg_out32(s, SETHI | INSN_RD(ret) | (((uint32_t)arg & 0xfffffc00) >> 10));
281 286
    tcg_out32(s, LDX | INSN_RD(ret) | INSN_RS1(ret) |
282 287
              INSN_IMM13(arg & 0x3ff));
......
287 292

  
288 293
static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, int op)
289 294
{
290
    if (check_fit(offset, 13))
295
    if (check_fit_tl(offset, 13))
291 296
        tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(addr) |
292 297
                  INSN_IMM13(offset));
293 298
    else {
......
340 345
static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)
341 346
{
342 347
    if (val != 0) {
343
        if (check_fit(val, 13))
348
        if (check_fit_tl(val, 13))
344 349
            tcg_out_arithi(s, reg, reg, val, ARITH_ADD);
345 350
        else {
346 351
            tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I5, val);

Also available in: Unified diff