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 | ... | ... |