Commit 9a5c57fdc1ffa558cf3ebda39d6e088662d5607d
1 parent
dfa1a3f1
tcg: add bswap16_i64 and bswap32_i64 TCG ops
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6832 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
64 additions
and
0 deletions
tcg/tcg-op.h
| ... | ... | @@ -1297,6 +1297,20 @@ static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) |
| 1297 | 1297 | tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); |
| 1298 | 1298 | } |
| 1299 | 1299 | |
| 1300 | +/* Note: we assume the six high bytes are set to zero */ | |
| 1301 | +static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) | |
| 1302 | +{ | |
| 1303 | + tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); | |
| 1304 | + tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg)); | |
| 1305 | +} | |
| 1306 | + | |
| 1307 | +/* Note: we assume the four high bytes are set to zero */ | |
| 1308 | +static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) | |
| 1309 | +{ | |
| 1310 | + tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); | |
| 1311 | + tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg)); | |
| 1312 | +} | |
| 1313 | + | |
| 1300 | 1314 | static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) |
| 1301 | 1315 | { |
| 1302 | 1316 | TCGv_i32 t0, t1; |
| ... | ... | @@ -1378,6 +1392,50 @@ static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) |
| 1378 | 1392 | tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); |
| 1379 | 1393 | } |
| 1380 | 1394 | |
| 1395 | +/* Note: we assume the six high bytes are set to zero */ | |
| 1396 | +static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) | |
| 1397 | +{ | |
| 1398 | +#ifdef TCG_TARGET_HAS_bswap16_i64 | |
| 1399 | + tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg); | |
| 1400 | +#else | |
| 1401 | + TCGv_i64 t0 = tcg_temp_new_i64(); | |
| 1402 | + | |
| 1403 | + tcg_gen_ext8u_i64(t0, arg); | |
| 1404 | + tcg_gen_shli_i64(t0, t0, 8); | |
| 1405 | + tcg_gen_shri_i64(ret, arg, 8); | |
| 1406 | + tcg_gen_or_i64(ret, ret, t0); | |
| 1407 | + tcg_temp_free_i64(t0); | |
| 1408 | +#endif | |
| 1409 | +} | |
| 1410 | + | |
| 1411 | +/* Note: we assume the four high bytes are set to zero */ | |
| 1412 | +static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) | |
| 1413 | +{ | |
| 1414 | +#ifdef TCG_TARGET_HAS_bswap32_i64 | |
| 1415 | + tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg); | |
| 1416 | +#else | |
| 1417 | + TCGv_i64 t0, t1; | |
| 1418 | + t0 = tcg_temp_new_i64(); | |
| 1419 | + t1 = tcg_temp_new_i64(); | |
| 1420 | + | |
| 1421 | + tcg_gen_shli_i64(t0, arg, 24); | |
| 1422 | + tcg_gen_ext32u_i64(t0, t0); | |
| 1423 | + | |
| 1424 | + tcg_gen_andi_i64(t1, arg, 0x0000ff00); | |
| 1425 | + tcg_gen_shli_i64(t1, t1, 8); | |
| 1426 | + tcg_gen_or_i64(t0, t0, t1); | |
| 1427 | + | |
| 1428 | + tcg_gen_shri_i64(t1, arg, 8); | |
| 1429 | + tcg_gen_andi_i64(t1, t1, 0x0000ff00); | |
| 1430 | + tcg_gen_or_i64(t0, t0, t1); | |
| 1431 | + | |
| 1432 | + tcg_gen_shri_i64(t1, arg, 24); | |
| 1433 | + tcg_gen_or_i64(ret, t0, t1); | |
| 1434 | + tcg_temp_free_i64(t0); | |
| 1435 | + tcg_temp_free_i64(t1); | |
| 1436 | +#endif | |
| 1437 | +} | |
| 1438 | + | |
| 1381 | 1439 | static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) |
| 1382 | 1440 | { |
| 1383 | 1441 | #ifdef TCG_TARGET_HAS_bswap64_i64 | ... | ... |
tcg/tcg-opc.h
| ... | ... | @@ -152,6 +152,12 @@ DEF2(ext16s_i64, 1, 1, 0, 0) |
| 152 | 152 | #ifdef TCG_TARGET_HAS_ext32s_i64 |
| 153 | 153 | DEF2(ext32s_i64, 1, 1, 0, 0) |
| 154 | 154 | #endif |
| 155 | +#ifdef TCG_TARGET_HAS_bswap16_i64 | |
| 156 | +DEF2(bswap16_i64, 1, 1, 0, 0) | |
| 157 | +#endif | |
| 158 | +#ifdef TCG_TARGET_HAS_bswap32_i64 | |
| 159 | +DEF2(bswap32_i64, 1, 1, 0, 0) | |
| 160 | +#endif | |
| 155 | 161 | #ifdef TCG_TARGET_HAS_bswap64_i64 |
| 156 | 162 | DEF2(bswap64_i64, 1, 1, 0, 0) |
| 157 | 163 | #endif | ... | ... |