@ -664,107 +664,81 @@ static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
tcg_temp_free_i32 ( t0 ) ;
}
# ifdef TCG_TARGET_HAS_div_i32
static inline void tcg_gen_div_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
if ( TCG_TARGET_HAS_div_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_div_i32 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_rem_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
tcg_gen_op3_i32 ( INDEX_op_rem_i32 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_divu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
tcg_gen_op3_i32 ( INDEX_op_divu_i32 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_remu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
tcg_gen_op3_i32 ( INDEX_op_remu_i32 , ret , arg1 , arg2 ) ;
}
# elif defined(TCG_TARGET_HAS_div2_i32)
static inline void tcg_gen_div_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
} else if ( TCG_TARGET_HAS_div2_i32 ) {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_sari_i32 ( t0 , arg1 , 31 ) ;
tcg_gen_op5_i32 ( INDEX_op_div2_i32 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
}
static inline void tcg_gen_rem_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_sari_i32 ( t0 , arg1 , 31 ) ;
tcg_gen_op5_i32 ( INDEX_op_div2_i32 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
}
static inline void tcg_gen_divu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_movi_i32 ( t0 , 0 ) ;
tcg_gen_op5_i32 ( INDEX_op_divu2_i32 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
}
static inline void tcg_gen_remu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_movi_i32 ( t0 , 0 ) ;
tcg_gen_op5_i32 ( INDEX_op_divu2_i32 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
}
# else
static inline void tcg_gen_div_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
} else {
int sizemask = 0 ;
/* Return value and both arguments are 32-bit and signed. */
sizemask | = tcg_gen_sizemask ( 0 , 0 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 0 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 0 , 1 ) ;
tcg_gen_helper32 ( tcg_helper_div_i32 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_rem_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
if ( TCG_TARGET_HAS_div_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_rem_i32 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i32 ) {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_sari_i32 ( t0 , arg1 , 31 ) ;
tcg_gen_op5_i32 ( INDEX_op_div2_i32 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 32-bit and signed. */
sizemask | = tcg_gen_sizemask ( 0 , 0 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 0 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 0 , 1 ) ;
tcg_gen_helper32 ( tcg_helper_rem_i32 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_divu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
if ( TCG_TARGET_HAS_div_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_divu_i32 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i32 ) {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_movi_i32 ( t0 , 0 ) ;
tcg_gen_op5_i32 ( INDEX_op_divu2_i32 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 32-bit and unsigned. */
sizemask | = tcg_gen_sizemask ( 0 , 0 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 0 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 0 , 0 ) ;
tcg_gen_helper32 ( tcg_helper_divu_i32 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_remu_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
if ( TCG_TARGET_HAS_div_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_remu_i32 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i32 ) {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_movi_i32 ( t0 , 0 ) ;
tcg_gen_op5_i32 ( INDEX_op_divu2_i32 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i32 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 32-bit and unsigned. */
sizemask | = tcg_gen_sizemask ( 0 , 0 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 0 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 0 , 0 ) ;
tcg_gen_helper32 ( tcg_helper_remu_i32 , sizemask , ret , arg1 , arg2 ) ;
}
}
# endif
# if TCG_TARGET_REG_BITS == 32
@ -1250,109 +1224,82 @@ static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
tcg_gen_op3_i64 ( INDEX_op_mul_i64 , ret , arg1 , arg2 ) ;
}
# ifdef TCG_TARGET_HAS_div_i64
static inline void tcg_gen_div_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
if ( TCG_TARGET_HAS_div_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_div_i64 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_rem_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
tcg_gen_op3_i64 ( INDEX_op_rem_i64 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_divu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
tcg_gen_op3_i64 ( INDEX_op_divu_i64 , ret , arg1 , arg2 ) ;
}
static inline void tcg_gen_remu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
tcg_gen_op3_i64 ( INDEX_op_remu_i64 , ret , arg1 , arg2 ) ;
}
# elif defined(TCG_TARGET_HAS_div2_i64)
static inline void tcg_gen_div_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
} else if ( TCG_TARGET_HAS_div2_i64 ) {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_sari_i64 ( t0 , arg1 , 63 ) ;
tcg_gen_op5_i64 ( INDEX_op_div2_i64 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
static inline void tcg_gen_rem_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_sari_i64 ( t0 , arg1 , 63 ) ;
tcg_gen_op5_i64 ( INDEX_op_div2_i64 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
static inline void tcg_gen_divu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_movi_i64 ( t0 , 0 ) ;
tcg_gen_op5_i64 ( INDEX_op_divu2_i64 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
static inline void tcg_gen_remu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_movi_i64 ( t0 , 0 ) ;
tcg_gen_op5_i64 ( INDEX_op_divu2_i64 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
# else
static inline void tcg_gen_div_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
} else {
int sizemask = 0 ;
/* Return value and both arguments are 64-bit and signed. */
sizemask | = tcg_gen_sizemask ( 0 , 1 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 1 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 1 , 1 ) ;
tcg_gen_helper64 ( tcg_helper_div_i64 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_rem_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
if ( TCG_TARGET_HAS_div_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_rem_i64 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i64 ) {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_sari_i64 ( t0 , arg1 , 63 ) ;
tcg_gen_op5_i64 ( INDEX_op_div2_i64 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 64-bit and signed. */
sizemask | = tcg_gen_sizemask ( 0 , 1 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 1 , 1 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 1 , 1 ) ;
tcg_gen_helper64 ( tcg_helper_rem_i64 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_divu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
if ( TCG_TARGET_HAS_div_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_divu_i64 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i64 ) {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_movi_i64 ( t0 , 0 ) ;
tcg_gen_op5_i64 ( INDEX_op_divu2_i64 , ret , t0 , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 64-bit and unsigned. */
sizemask | = tcg_gen_sizemask ( 0 , 1 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 1 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 1 , 0 ) ;
tcg_gen_helper64 ( tcg_helper_divu_i64 , sizemask , ret , arg1 , arg2 ) ;
}
}
static inline void tcg_gen_remu_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
if ( TCG_TARGET_HAS_div_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_remu_i64 , ret , arg1 , arg2 ) ;
} else if ( TCG_TARGET_HAS_div2_i64 ) {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_movi_i64 ( t0 , 0 ) ;
tcg_gen_op5_i64 ( INDEX_op_divu2_i64 , t0 , ret , arg1 , t0 , arg2 ) ;
tcg_temp_free_i64 ( t0 ) ;
} else {
int sizemask = 0 ;
/* Return value and both arguments are 64-bit and unsigned. */
sizemask | = tcg_gen_sizemask ( 0 , 1 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 1 , 1 , 0 ) ;
sizemask | = tcg_gen_sizemask ( 2 , 1 , 0 ) ;
tcg_gen_helper64 ( tcg_helper_remu_i64 , sizemask , ret , arg1 , arg2 ) ;
}
}
# endif
# endif
# endif /* TCG_TARGET_REG_BITS == 32 */
static inline void tcg_gen_addi_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , int64_t arg2 )
{
@ -1413,48 +1360,48 @@ static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
static inline void tcg_gen_ext8s_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_ext8s_i32
if ( TCG_TARGET_HAS_ext8s_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_ext8s_i32 , ret , arg ) ;
# else
} else {
tcg_gen_shli_i32 ( ret , arg , 24 ) ;
tcg_gen_sari_i32 ( ret , ret , 24 ) ;
# endif
}
}
static inline void tcg_gen_ext16s_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_ext16s_i32
if ( TCG_TARGET_HAS_ext16s_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_ext16s_i32 , ret , arg ) ;
# else
} else {
tcg_gen_shli_i32 ( ret , arg , 16 ) ;
tcg_gen_sari_i32 ( ret , ret , 16 ) ;
# endif
}
}
static inline void tcg_gen_ext8u_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_ext8u_i32
if ( TCG_TARGET_HAS_ext8u_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_ext8u_i32 , ret , arg ) ;
# else
} else {
tcg_gen_andi_i32 ( ret , arg , 0xffu ) ;
# endif
}
}
static inline void tcg_gen_ext16u_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_ext16u_i32
if ( TCG_TARGET_HAS_ext16u_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_ext16u_i32 , ret , arg ) ;
# else
} else {
tcg_gen_andi_i32 ( ret , arg , 0xffffu ) ;
# endif
}
}
/* Note: we assume the two high bytes are set to zero */
static inline void tcg_gen_bswap16_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_bswap16_i32
if ( TCG_TARGET_HAS_bswap16_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_bswap16_i32 , ret , arg ) ;
# else
} else {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_ext8u_i32 ( t0 , arg ) ;
@ -1462,14 +1409,14 @@ static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg)
tcg_gen_shri_i32 ( ret , arg , 8 ) ;
tcg_gen_or_i32 ( ret , ret , t0 ) ;
tcg_temp_free_i32 ( t0 ) ;
# endif
}
}
static inline void tcg_gen_bswap32_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_bswap32_i32
if ( TCG_TARGET_HAS_bswap32_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_bswap32_i32 , ret , arg ) ;
# else
} else {
TCGv_i32 t0 , t1 ;
t0 = tcg_temp_new_i32 ( ) ;
t1 = tcg_temp_new_i32 ( ) ;
@ -1488,7 +1435,7 @@ static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg)
tcg_gen_or_i32 ( ret , t0 , t1 ) ;
tcg_temp_free_i32 ( t0 ) ;
tcg_temp_free_i32 ( t1 ) ;
# endif
}
}
# if TCG_TARGET_REG_BITS == 32
@ -1576,59 +1523,59 @@ static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
static inline void tcg_gen_ext8s_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext8s_i64
if ( TCG_TARGET_HAS_ext8s_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext8s_i64 , ret , arg ) ;
# else
} else {
tcg_gen_shli_i64 ( ret , arg , 56 ) ;
tcg_gen_sari_i64 ( ret , ret , 56 ) ;
# endif
}
}
static inline void tcg_gen_ext16s_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext16s_i64
if ( TCG_TARGET_HAS_ext16s_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext16s_i64 , ret , arg ) ;
# else
} else {
tcg_gen_shli_i64 ( ret , arg , 48 ) ;
tcg_gen_sari_i64 ( ret , ret , 48 ) ;
# endif
}
}
static inline void tcg_gen_ext32s_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext32s_i64
if ( TCG_TARGET_HAS_ext32s_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext32s_i64 , ret , arg ) ;
# else
} else {
tcg_gen_shli_i64 ( ret , arg , 32 ) ;
tcg_gen_sari_i64 ( ret , ret , 32 ) ;
# endif
}
}
static inline void tcg_gen_ext8u_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext8u_i64
if ( TCG_TARGET_HAS_ext8u_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext8u_i64 , ret , arg ) ;
# else
} else {
tcg_gen_andi_i64 ( ret , arg , 0xffu ) ;
# endif
}
}
static inline void tcg_gen_ext16u_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext16u_i64
if ( TCG_TARGET_HAS_ext16u_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext16u_i64 , ret , arg ) ;
# else
} else {
tcg_gen_andi_i64 ( ret , arg , 0xffffu ) ;
# endif
}
}
static inline void tcg_gen_ext32u_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_ext32u_i64
if ( TCG_TARGET_HAS_ext32u_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_ext32u_i64 , ret , arg ) ;
# else
} else {
tcg_gen_andi_i64 ( ret , arg , 0xffffffffu ) ;
# endif
}
}
/* Note: we assume the target supports move between 32 and 64 bit
@ -1655,9 +1602,9 @@ static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
/* Note: we assume the six high bytes are set to zero */
static inline void tcg_gen_bswap16_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_bswap16_i64
if ( TCG_TARGET_HAS_bswap16_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_bswap16_i64 , ret , arg ) ;
# else
} else {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_ext8u_i64 ( t0 , arg ) ;
@ -1665,15 +1612,15 @@ static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg)
tcg_gen_shri_i64 ( ret , arg , 8 ) ;
tcg_gen_or_i64 ( ret , ret , t0 ) ;
tcg_temp_free_i64 ( t0 ) ;
# endif
}
}
/* Note: we assume the four high bytes are set to zero */
static inline void tcg_gen_bswap32_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_bswap32_i64
if ( TCG_TARGET_HAS_bswap32_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_bswap32_i64 , ret , arg ) ;
# else
} else {
TCGv_i64 t0 , t1 ;
t0 = tcg_temp_new_i64 ( ) ;
t1 = tcg_temp_new_i64 ( ) ;
@ -1693,14 +1640,14 @@ static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg)
tcg_gen_or_i64 ( ret , t0 , t1 ) ;
tcg_temp_free_i64 ( t0 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_bswap64_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_bswap64_i64
if ( TCG_TARGET_HAS_bswap64_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_bswap64_i64 , ret , arg ) ;
# else
} else {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
TCGv_i64 t1 = tcg_temp_new_i64 ( ) ;
@ -1734,51 +1681,53 @@ static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg)
tcg_gen_or_i64 ( ret , t0 , t1 ) ;
tcg_temp_free_i64 ( t0 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
# endif
static inline void tcg_gen_neg_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_neg_i32
if ( TCG_TARGET_HAS_neg_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_neg_i32 , ret , arg ) ;
# else
} else {
TCGv_i32 t0 = tcg_const_i32 ( 0 ) ;
tcg_gen_sub_i32 ( ret , t0 , arg ) ;
tcg_temp_free_i32 ( t0 ) ;
# endif
}
}
static inline void tcg_gen_neg_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_neg_i64
if ( TCG_TARGET_HAS_neg_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_neg_i64 , ret , arg ) ;
# else
} else {
TCGv_i64 t0 = tcg_const_i64 ( 0 ) ;
tcg_gen_sub_i64 ( ret , t0 , arg ) ;
tcg_temp_free_i64 ( t0 ) ;
# endif
}
}
static inline void tcg_gen_not_i32 ( TCGv_i32 ret , TCGv_i32 arg )
{
# ifdef TCG_TARGET_HAS_not_i32
if ( TCG_TARGET_HAS_not_i32 ) {
tcg_gen_op2_i32 ( INDEX_op_not_i32 , ret , arg ) ;
# else
} else {
tcg_gen_xori_i32 ( ret , arg , - 1 ) ;
# endif
}
}
static inline void tcg_gen_not_i64 ( TCGv_i64 ret , TCGv_i64 arg )
{
# ifdef TCG_TARGET_HAS_not_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_not_i64 ) {
tcg_gen_op2_i64 ( INDEX_op_not_i64 , ret , arg ) ;
# elif defined(TCG_TARGET_HAS_not_i32) && TCG_TARGET_REG_BITS == 32
} else {
tcg_gen_xori_i64 ( ret , arg , - 1 ) ;
}
# else
tcg_gen_not_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg ) ) ;
tcg_gen_not_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg ) ) ;
# else
tcg_gen_xori_i64 ( ret , arg , - 1 ) ;
# endif
}
@ -1787,18 +1736,15 @@ static inline void tcg_gen_discard_i32(TCGv_i32 arg)
tcg_gen_op1_i32 ( INDEX_op_discard , arg ) ;
}
# if TCG_TARGET_REG_BITS == 32
static inline void tcg_gen_discard_i64 ( TCGv_i64 arg )
{
# if TCG_TARGET_REG_BITS == 32
tcg_gen_discard_i32 ( TCGV_LOW ( arg ) ) ;
tcg_gen_discard_i32 ( TCGV_HIGH ( arg ) ) ;
}
# else
static inline void tcg_gen_discard_i64 ( TCGv_i64 arg )
{
tcg_gen_op1_i64 ( INDEX_op_discard , arg ) ;
}
# endif
}
static inline void tcg_gen_concat_i32_i64 ( TCGv_i64 dest , TCGv_i32 low , TCGv_i32 high )
{
@ -1832,136 +1778,142 @@ static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 hi
static inline void tcg_gen_andc_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_andc_i32
if ( TCG_TARGET_HAS_andc_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_andc_i32 , ret , arg1 , arg2 ) ;
# else
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
} else {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_not_i32 ( t0 , arg2 ) ;
tcg_gen_and_i32 ( ret , arg1 , t0 ) ;
tcg_temp_free_i32 ( t0 ) ;
# endif
}
}
static inline void tcg_gen_andc_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_andc_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_andc_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_andc_i64 , ret , arg1 , arg2 ) ;
# elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32
tcg_gen_andc_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_andc_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# else
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
} else {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_not_i64 ( t0 , arg2 ) ;
tcg_gen_and_i64 ( ret , arg1 , t0 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
# else
tcg_gen_andc_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_andc_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# endif
}
static inline void tcg_gen_eqv_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_eqv_i32
if ( TCG_TARGET_HAS_eqv_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_eqv_i32 , ret , arg1 , arg2 ) ;
# else
} else {
tcg_gen_xor_i32 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i32 ( ret , ret ) ;
# endif
}
}
static inline void tcg_gen_eqv_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_eqv_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_eqv_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_eqv_i64 , ret , arg1 , arg2 ) ;
# elif defined(TCG_TARGET_HAS_eqv_i32) && TCG_TARGET_REG_BITS == 32
tcg_gen_eqv_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_eqv_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# else
} else {
tcg_gen_xor_i64 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i64 ( ret , ret ) ;
}
# else
tcg_gen_eqv_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_eqv_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# endif
}
static inline void tcg_gen_nand_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_nand_i32
if ( TCG_TARGET_HAS_nand_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_nand_i32 , ret , arg1 , arg2 ) ;
# else
} else {
tcg_gen_and_i32 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i32 ( ret , ret ) ;
# endif
}
}
static inline void tcg_gen_nand_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_nand_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_nand_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_nand_i64 , ret , arg1 , arg2 ) ;
# elif defined(TCG_TARGET_HAS_nand_i32) && TCG_TARGET_REG_BITS == 32
tcg_gen_nand_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_nand_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# else
} else {
tcg_gen_and_i64 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i64 ( ret , ret ) ;
}
# else
tcg_gen_nand_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_nand_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# endif
}
static inline void tcg_gen_nor_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_nor_i32
if ( TCG_TARGET_HAS_nor_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_nor_i32 , ret , arg1 , arg2 ) ;
# else
} else {
tcg_gen_or_i32 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i32 ( ret , ret ) ;
# endif
}
}
static inline void tcg_gen_nor_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_nor_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_nor_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_nor_i64 , ret , arg1 , arg2 ) ;
# elif defined(TCG_TARGET_HAS_nor_i32) && TCG_TARGET_REG_BITS == 32
tcg_gen_nor_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_nor_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# else
} else {
tcg_gen_or_i64 ( ret , arg1 , arg2 ) ;
tcg_gen_not_i64 ( ret , ret ) ;
}
# else
tcg_gen_nor_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_nor_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# endif
}
static inline void tcg_gen_orc_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_orc_i32
if ( TCG_TARGET_HAS_orc_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_orc_i32 , ret , arg1 , arg2 ) ;
# else
TCGv_i32 t0 ;
t0 = tcg_temp_new_i32 ( ) ;
} else {
TCGv_i32 t0 = tcg_temp_new_i32 ( ) ;
tcg_gen_not_i32 ( t0 , arg2 ) ;
tcg_gen_or_i32 ( ret , arg1 , t0 ) ;
tcg_temp_free_i32 ( t0 ) ;
# endif
}
}
static inline void tcg_gen_orc_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_orc_i64
# if TCG_TARGET_REG_BITS == 64
if ( TCG_TARGET_HAS_orc_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_orc_i64 , ret , arg1 , arg2 ) ;
# elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32
tcg_gen_orc_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_orc_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# else
TCGv_i64 t0 ;
t0 = tcg_temp_new_i64 ( ) ;
} else {
TCGv_i64 t0 = tcg_temp_new_i64 ( ) ;
tcg_gen_not_i64 ( t0 , arg2 ) ;
tcg_gen_or_i64 ( ret , arg1 , t0 ) ;
tcg_temp_free_i64 ( t0 ) ;
}
# else
tcg_gen_orc_i32 ( TCGV_LOW ( ret ) , TCGV_LOW ( arg1 ) , TCGV_LOW ( arg2 ) ) ;
tcg_gen_orc_i32 ( TCGV_HIGH ( ret ) , TCGV_HIGH ( arg1 ) , TCGV_HIGH ( arg2 ) ) ;
# endif
}
static inline void tcg_gen_rotl_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_rot_i32
if ( TCG_TARGET_HAS_rot_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_rotl_i32 , ret , arg1 , arg2 ) ;
# else
} else {
TCGv_i32 t0 , t1 ;
t0 = tcg_temp_new_i32 ( ) ;
@ -1972,16 +1924,15 @@ static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
tcg_gen_or_i32 ( ret , t0 , t1 ) ;
tcg_temp_free_i32 ( t0 ) ;
tcg_temp_free_i32 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_rotl_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_rot_i64
if ( TCG_TARGET_HAS_rot_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_rotl_i64 , ret , arg1 , arg2 ) ;
# else
} else {
TCGv_i64 t0 , t1 ;
t0 = tcg_temp_new_i64 ( ) ;
t1 = tcg_temp_new_i64 ( ) ;
tcg_gen_shl_i64 ( t0 , arg1 , arg2 ) ;
@ -1990,7 +1941,7 @@ static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
tcg_gen_or_i64 ( ret , t0 , t1 ) ;
tcg_temp_free_i64 ( t0 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_rotli_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , int32_t arg2 )
@ -1998,12 +1949,11 @@ static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
/* some cases can be optimized here */
if ( arg2 = = 0 ) {
tcg_gen_mov_i32 ( ret , arg1 ) ;
} else {
# ifdef TCG_TARGET_HAS_rot_i32
} else if ( TCG_TARGET_HAS_rot_i32 ) {
TCGv_i32 t0 = tcg_const_i32 ( arg2 ) ;
tcg_gen_rotl_i32 ( ret , arg1 , t0 ) ;
tcg_temp_free_i32 ( t0 ) ;
# else
} else {
TCGv_i32 t0 , t1 ;
t0 = tcg_temp_new_i32 ( ) ;
t1 = tcg_temp_new_i32 ( ) ;
@ -2012,7 +1962,6 @@ static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
tcg_gen_or_i32 ( ret , t0 , t1 ) ;
tcg_temp_free_i32 ( t0 ) ;
tcg_temp_free_i32 ( t1 ) ;
# endif
}
}
@ -2021,12 +1970,11 @@ static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
/* some cases can be optimized here */
if ( arg2 = = 0 ) {
tcg_gen_mov_i64 ( ret , arg1 ) ;
} else {
# ifdef TCG_TARGET_HAS_rot_i64
} else if ( TCG_TARGET_HAS_rot_i64 ) {
TCGv_i64 t0 = tcg_const_i64 ( arg2 ) ;
tcg_gen_rotl_i64 ( ret , arg1 , t0 ) ;
tcg_temp_free_i64 ( t0 ) ;
# else
} else {
TCGv_i64 t0 , t1 ;
t0 = tcg_temp_new_i64 ( ) ;
t1 = tcg_temp_new_i64 ( ) ;
@ -2035,15 +1983,14 @@ static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
tcg_gen_or_i64 ( ret , t0 , t1 ) ;
tcg_temp_free_i64 ( t0 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_rotr_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , TCGv_i32 arg2 )
{
# ifdef TCG_TARGET_HAS_rot_i32
if ( TCG_TARGET_HAS_rot_i32 ) {
tcg_gen_op3_i32 ( INDEX_op_rotr_i32 , ret , arg1 , arg2 ) ;
# else
} else {
TCGv_i32 t0 , t1 ;
t0 = tcg_temp_new_i32 ( ) ;
@ -2054,16 +2001,15 @@ static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
tcg_gen_or_i32 ( ret , t0 , t1 ) ;
tcg_temp_free_i32 ( t0 ) ;
tcg_temp_free_i32 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_rotr_i64 ( TCGv_i64 ret , TCGv_i64 arg1 , TCGv_i64 arg2 )
{
# ifdef TCG_TARGET_HAS_rot_i64
if ( TCG_TARGET_HAS_rot_i64 ) {
tcg_gen_op3_i64 ( INDEX_op_rotr_i64 , ret , arg1 , arg2 ) ;
# else
} else {
TCGv_i64 t0 , t1 ;
t0 = tcg_temp_new_i64 ( ) ;
t1 = tcg_temp_new_i64 ( ) ;
tcg_gen_shr_i64 ( t0 , arg1 , arg2 ) ;
@ -2072,7 +2018,7 @@ static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
tcg_gen_or_i64 ( ret , t0 , t1 ) ;
tcg_temp_free_i64 ( t0 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_rotri_i32 ( TCGv_i32 ret , TCGv_i32 arg1 , int32_t arg2 )
@ -2099,9 +2045,9 @@ static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1,
TCGv_i32 arg2 , unsigned int ofs ,
unsigned int len )
{
# ifdef TCG_TARGET_HAS_deposit_i32
if ( TCG_TARGET_HAS_deposit_i32 ) {
tcg_gen_op5ii_i32 ( INDEX_op_deposit_i32 , ret , arg1 , arg2 , ofs , len ) ;
# else
} else {
uint32_t mask = ( 1u < < len ) - 1 ;
TCGv_i32 t1 = tcg_temp_new_i32 ( ) ;
@ -2111,16 +2057,16 @@ static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1,
tcg_gen_or_i32 ( ret , ret , t1 ) ;
tcg_temp_free_i32 ( t1 ) ;
# endif
}
}
static inline void tcg_gen_deposit_i64 ( TCGv_i64 ret , TCGv_i64 arg1 ,
TCGv_i64 arg2 , unsigned int ofs ,
unsigned int len )
{
# ifdef TCG_TARGET_HAS_deposit_i64
if ( TCG_TARGET_HAS_deposit_i64 ) {
tcg_gen_op5ii_i64 ( INDEX_op_deposit_i64 , ret , arg1 , arg2 , ofs , len ) ;
# else
} else {
uint64_t mask = ( 1ull < < len ) - 1 ;
TCGv_i64 t1 = tcg_temp_new_i64 ( ) ;
@ -2130,7 +2076,7 @@ static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1,
tcg_gen_or_i64 ( ret , ret , t1 ) ;
tcg_temp_free_i64 ( t1 ) ;
# endif
}
}
/***************************************/