Commit 57e49b40745ceb6c198cc58274b705afb5f20493
1 parent
d4929d58
Fix constant checks on Sparc64 host
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4486 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
17 additions
and
12 deletions
tcg/sparc/tcg-target.c
... | ... | @@ -87,10 +87,15 @@ static const int tcg_target_call_oarg_regs[2] = { |
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,7 +111,7 @@ 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,9 +163,9 @@ static inline int tcg_target_const_match(tcg_target_long val, |
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,10 +253,10 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, |
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,9 +279,9 @@ static inline void tcg_out_ld_ptr(TCGContext *s, int ret, |
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,7 +292,7 @@ static inline void tcg_out_ld_ptr(TCGContext *s, int ret, |
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,7 +345,7 @@ static inline void tcg_out_sety(TCGContext *s, tcg_target_long val) |
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); | ... | ... |