Commit 7089442cb6214a46b1476d18d068f8b2972d1b22
1 parent
f6503059
Fix andi, optimize addi and subi zero cases
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3985 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
13 additions
and
3 deletions
tcg/tcg-op.h
| @@ -252,7 +252,12 @@ static inline void tcg_gen_add_i32(TCGv ret, TCGv arg1, TCGv arg2) | @@ -252,7 +252,12 @@ static inline void tcg_gen_add_i32(TCGv ret, TCGv arg1, TCGv arg2) | ||
| 252 | 252 | ||
| 253 | static inline void tcg_gen_addi_i32(TCGv ret, TCGv arg1, int32_t arg2) | 253 | static inline void tcg_gen_addi_i32(TCGv ret, TCGv arg1, int32_t arg2) |
| 254 | { | 254 | { |
| 255 | - tcg_gen_add_i32(ret, arg1, tcg_const_i32(arg2)); | 255 | + /* some cases can be optimized here */ |
| 256 | + if (arg2 == 0) { | ||
| 257 | + tcg_gen_mov_i32(ret, arg1); | ||
| 258 | + } else { | ||
| 259 | + tcg_gen_add_i32(ret, arg1, tcg_const_i32(arg2)); | ||
| 260 | + } | ||
| 256 | } | 261 | } |
| 257 | 262 | ||
| 258 | static inline void tcg_gen_sub_i32(TCGv ret, TCGv arg1, TCGv arg2) | 263 | static inline void tcg_gen_sub_i32(TCGv ret, TCGv arg1, TCGv arg2) |
| @@ -262,7 +267,12 @@ static inline void tcg_gen_sub_i32(TCGv ret, TCGv arg1, TCGv arg2) | @@ -262,7 +267,12 @@ static inline void tcg_gen_sub_i32(TCGv ret, TCGv arg1, TCGv arg2) | ||
| 262 | 267 | ||
| 263 | static inline void tcg_gen_subi_i32(TCGv ret, TCGv arg1, int32_t arg2) | 268 | static inline void tcg_gen_subi_i32(TCGv ret, TCGv arg1, int32_t arg2) |
| 264 | { | 269 | { |
| 265 | - tcg_gen_sub_i32(ret, arg1, tcg_const_i32(arg2)); | 270 | + /* some cases can be optimized here */ |
| 271 | + if (arg2 == 0) { | ||
| 272 | + tcg_gen_mov_i32(ret, arg1); | ||
| 273 | + } else { | ||
| 274 | + tcg_gen_sub_i32(ret, arg1, tcg_const_i32(arg2)); | ||
| 275 | + } | ||
| 266 | } | 276 | } |
| 267 | 277 | ||
| 268 | static inline void tcg_gen_and_i32(TCGv ret, TCGv arg1, TCGv arg2) | 278 | static inline void tcg_gen_and_i32(TCGv ret, TCGv arg1, TCGv arg2) |
| @@ -291,7 +301,7 @@ static inline void tcg_gen_ori_i32(TCGv ret, TCGv arg1, int32_t arg2) | @@ -291,7 +301,7 @@ static inline void tcg_gen_ori_i32(TCGv ret, TCGv arg1, int32_t arg2) | ||
| 291 | { | 301 | { |
| 292 | /* some cases can be optimized here */ | 302 | /* some cases can be optimized here */ |
| 293 | if (arg2 == 0xffffffff) { | 303 | if (arg2 == 0xffffffff) { |
| 294 | - tcg_gen_movi_i32(ret, 0); | 304 | + tcg_gen_movi_i32(ret, 0xffffffff); |
| 295 | } else if (arg2 == 0) { | 305 | } else if (arg2 == 0) { |
| 296 | tcg_gen_mov_i32(ret, arg1); | 306 | tcg_gen_mov_i32(ret, arg1); |
| 297 | } else { | 307 | } else { |