{"name": "disas_thumb_insn", "code": "unsigned __int64 __fastcall disas_thumb_insn ( __int64 @@a1@@ , int * @@a2@@ ) { unsigned int v2 ; unsigned int v3 ; int i ; int j ; int k ; int v8 ; int v9 ; int v10 ; int v11 ; int v12 ; int v13 ; int v14 ; int @@v15@@ ; int v16 ; int v17 ; int v18 ; int v19 ; int v20 ; unsigned int v21 ; unsigned int v22 ; unsigned int v23 ; unsigned int v24 ; unsigned int v25 ; unsigned int v26 ; unsigned int v27 ; unsigned int v28 ; unsigned int v29 ; unsigned int v30 ; unsigned int v31 ; unsigned int v32 ; unsigned int v33 ; unsigned int v34 ; unsigned int v35 ; unsigned int v36 ; unsigned int v37 ; unsigned int v38 ; unsigned int v39 ; unsigned int v40 ; unsigned int v41 ; unsigned int v42 ; unsigned int v43 ; unsigned int v44 ; unsigned int v45 ; unsigned int v46 ; unsigned int v47 ; int v48 ; unsigned int @@v49@@ ; int @@v50@@ ; unsigned int v51 ; unsigned int v52 ; unsigned int v53 ; int v54 ; int v55 ; int v56 ; int v57 ; unsigned int v58 ; unsigned __int64 @@v59@@ ; @@v59@@ = __readfsqword ( Number ) ; if ( @@a2@@ [ Number ] ) { v47 = @@a2@@ [ Number ] ; if ( v47 != Number ) { @@a2@@ [ Number ] = gen_new_label ( ) ; gen_test_cc ( v47 ^ Number , @@a2@@ [ Number ] ) ; @@a2@@ [ Number ] = Number ; } } @@v49@@ = lduw_le_p ( ( unsigned __int16 * ) ( ( unsigned int ) * @@a2@@ + guest_base ) ) ; * @@a2@@ += Number ; switch ( @@v49@@ >> Number ) { case Number : case Number : v8 = @@v49@@ & Number ; v54 = ( @@v49@@ >> Number ) & Number ; if ( v54 != Number ) { v23 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; gen_arm_shift_im ( v23 , v54 , ( @@v49@@ >> Number ) & Number , @@a2@@ [ Number ] == Number ) ; if ( ! @@a2@@ [ Number ] ) gen_logic_CC ( v23 ) ; goto LABEL_186 ; } v22 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; if ( ( @@v49@@ & Number ) != Number ) { v43 = new_tmp ( ) ; tcg_gen_movi_i32 ( v43 , ( @@v49@@ >> Number ) & Number ) ; } else { v43 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; } if ( ( @@v49@@ & Number ) != Number ) { if ( @@a2@@ [ Number ] ) goto LABEL_28 ; goto LABEL_29 ; } if ( @@a2@@ [ Number ] ) goto LABEL_25 ; goto LABEL_13 ; case Number : case Number : v55 = ( @@v49@@ >> Number ) & Number ; v8 = ( @@v49@@ >> Number ) & Number ; if ( v55 ) { v22 = load_reg ( @@a2@@ , v8 ) ; v43 = new_tmp ( ) ; tcg_gen_movi_i32 ( v43 , ( unsigned __int8 ) @@v49@@ ) ; if ( v55 == Number ) { if ( @@a2@@ [ Number ] ) LABEL_28 : tcg_gen_sub_i32 ( v22 , v22 , v43 ) ; else LABEL_29 : gen_helper_sub_cc ( v22 , v22 , v43 ) ; } else { if ( v55 == Number ) { gen_helper_sub_cc ( v22 , v22 , v43 ) ; dead_tmp ( v22 ) ; dead_tmp ( v43 ) ; return __readfsqword ( Number ) ^ @@v59@@ ; } if ( @@a2@@ [ Number ] ) LABEL_25 : tcg_gen_add_i32 ( v22 , v22 , v43 ) ; else LABEL_13 : gen_helper_add_cc ( v22 , v22 , v43 ) ; } dead_tmp ( v43 ) ; store_reg ( ( __int64 ) @@a2@@ , v8 , v22 ) ; } else { v23 = new_tmp ( ) ; tcg_gen_movi_i32 ( v23 , ( unsigned __int8 ) @@v49@@ ) ; if ( ! @@a2@@ [ Number ] ) gen_logic_CC ( v23 ) ; LABEL_186 : store_reg ( ( __int64 ) @@a2@@ , v8 , v23 ) ; } return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ( @@v49@@ & Number ) != Number ) { v18 = ( Number * ( unsigned __int8 ) @@v49@@ + * @@a2@@ + Number ) & Number ; v51 = new_tmp ( ) ; tcg_gen_movi_i32 ( v51 , v18 ) ; v24 = gen_ld32 ( v51 , Number ) ; dead_tmp ( v51 ) ; store_reg ( ( __int64 ) @@a2@@ , ( @@v49@@ >> Number ) & Number , v24 ) ; } else if ( ( @@v49@@ & Number ) != Number ) { v9 = @@v49@@ & Number | ( @@v49@@ >> Number ) & Number ; v16 = ( @@v49@@ >> Number ) & Number ; v56 = ( @@v49@@ >> Number ) & Number ; if ( v56 == Number ) { v27 = load_reg ( @@a2@@ , v16 ) ; if ( ( @@v49@@ & Number ) != Number ) { v19 = * @@a2@@ | Number ; v45 = new_tmp ( ) ; tcg_gen_movi_i32 ( v45 , v19 ) ; store_reg ( ( __int64 ) @@a2@@ , Number , v45 ) ; } LABEL_168 : gen_bx ( ( __int64 ) @@a2@@ , v27 ) ; } else if ( v56 == Number ) { v26 = load_reg ( @@a2@@ , v16 ) ; store_reg ( ( __int64 ) @@a2@@ , v9 , v26 ) ; } else { v25 = load_reg ( @@a2@@ , v9 ) ; v44 = load_reg ( @@a2@@ , v16 ) ; if ( v56 ) { gen_helper_sub_cc ( v25 , v25 , v44 ) ; dead_tmp ( v44 ) ; dead_tmp ( v25 ) ; } else { tcg_gen_add_i32 ( v25 , v25 , v44 ) ; dead_tmp ( v44 ) ; store_reg ( ( __int64 ) @@a2@@ , v9 , v25 ) ; } } } else { v10 = @@v49@@ & Number ; v17 = ( @@v49@@ >> Number ) & Number ; v57 = ( @@v49@@ >> Number ) & Number ; if ( v57 == Number || v57 == Number || v57 == Number || v57 == Number ) { v17 = @@v49@@ & Number ; v10 = ( @@v49@@ >> Number ) & Number ; v20 = Number ; } else { v20 = Number ; } if ( v57 == Number ) { v28 = new_tmp ( ) ; tcg_gen_movi_i32 ( v28 , Number ) ; } else if ( v57 == Number ) { v28 = Number ; } else { v28 = load_reg ( @@a2@@ , v10 ) ; } v46 = load_reg ( @@a2@@ , v17 ) ; switch ( v57 ) { case Number : tcg_gen_and_i32 ( v28 , v28 , v46 ) ; if ( ! @@a2@@ [ Number ] ) goto LABEL_88 ; break ; case Number : tcg_gen_xor_i32 ( v28 , v28 , v46 ) ; if ( ! @@a2@@ [ Number ] ) goto LABEL_88 ; break ; case Number : if ( @@a2@@ [ Number ] ) { gen_helper_shl ( v46 , v46 , v28 ) ; } else { gen_helper_shl_cc ( v46 , v46 , v28 ) ; gen_logic_CC ( v46 ) ; } break ; case Number : if ( @@a2@@ [ Number ] ) { gen_helper_shr ( v46 , v46 , v28 ) ; } else { gen_helper_shr_cc ( v46 , v46 , v28 ) ; gen_logic_CC ( v46 ) ; } break ; case Number : if ( @@a2@@ [ Number ] ) { gen_helper_sar ( v46 , v46 , v28 ) ; } else { gen_helper_sar_cc ( v46 , v46 , v28 ) ; gen_logic_CC ( v46 ) ; } break ; case Number : if ( @@a2@@ [ Number ] ) gen_adc ( v28 , v46 ) ; else gen_helper_adc_cc ( v28 , v28 , v46 ) ; break ; case Number : if ( @@a2@@ [ Number ] ) gen_sub_carry ( v28 , v28 , v46 ) ; else gen_helper_sbc_cc ( v28 , v28 , v46 ) ; break ; case Number : if ( @@a2@@ [ Number ] ) { tcg_gen_andi_i32 ( v28 , v28 , Number ) ; tcg_gen_rotr_i32 ( v46 , v46 , v28 ) ; } else { gen_helper_ror_cc ( v46 , v46 , v28 ) ; gen_logic_CC ( v46 ) ; } break ; case Number : tcg_gen_and_i32 ( v28 , v28 , v46 ) ; gen_logic_CC ( v28 ) ; v10 = Number ; break ; case Number : if ( @@a2@@ [ Number ] ) tcg_gen_neg_i32 ( v28 , v46 ) ; else gen_helper_sub_cc ( v28 , v28 , v46 ) ; break ; case Number : gen_helper_sub_cc ( v28 , v28 , v46 ) ; v10 = Number ; break ; case Number : gen_helper_add_cc ( v28 , v28 , v46 ) ; v10 = Number ; break ; case Number : tcg_gen_or_i32 ( v28 , v28 , v46 ) ; if ( ! @@a2@@ [ Number ] ) goto LABEL_88 ; break ; case Number : tcg_gen_mul_i32 ( v28 , v28 , v46 ) ; if ( ! @@a2@@ [ Number ] ) goto LABEL_88 ; break ; case Number : tcg_gen_andc_i32 ( v28 , v28 , v46 ) ; if ( ! @@a2@@ [ Number ] ) LABEL_88 : gen_logic_CC ( v28 ) ; break ; case Number : tcg_gen_not_i32 ( v46 , v46 ) ; if ( ! @@a2@@ [ Number ] ) gen_logic_CC ( v46 ) ; v20 = Number ; v17 = v10 ; break ; default : break ; } if ( v10 == Number ) { dead_tmp ( v28 ) ; dead_tmp ( v46 ) ; } else if ( v20 ) { store_reg ( ( __int64 ) @@a2@@ , v17 , v46 ) ; if ( v57 != Number ) dead_tmp ( v28 ) ; } else { store_reg ( ( __int64 ) @@a2@@ , v10 , v28 ) ; dead_tmp ( v46 ) ; } } return __readfsqword ( Number ) ^ @@v59@@ ; case Number : v11 = @@v49@@ & Number ; v58 = ( @@v49@@ >> Number ) & Number ; v52 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; v29 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; tcg_gen_add_i32 ( v52 , v52 , v29 ) ; dead_tmp ( v29 ) ; if ( v58 <= Number ) v29 = load_reg ( @@a2@@ , v11 ) ; switch ( v58 ) { case Number : gen_st32 ( v29 , v52 , Number ) ; break ; case Number : gen_st16 ( v29 , v52 , Number ) ; break ; case Number : gen_st8 ( v29 , v52 , Number ) ; break ; case Number : v29 = gen_ld8s ( v52 , Number ) ; break ; case Number : v29 = gen_ld32 ( v52 , Number ) ; break ; case Number : v29 = gen_ld16u ( v52 , Number ) ; break ; case Number : v29 = gen_ld8u ( v52 , Number ) ; break ; case Number : v29 = gen_ld16s ( v52 , Number ) ; break ; default : break ; } if ( v58 > Number ) store_reg ( ( __int64 ) @@a2@@ , v11 , v29 ) ; goto LABEL_123 ; case Number : v12 = @@v49@@ & Number ; v52 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; tcg_gen_addi_i32 ( v52 , v52 , ( @@v49@@ >> Number ) & Number ) ; if ( ( @@v49@@ & Number ) == Number ) goto LABEL_122 ; goto LABEL_121 ; case Number : v13 = @@v49@@ & Number ; v52 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; tcg_gen_addi_i32 ( v52 , v52 , ( @@v49@@ >> Number ) & Number ) ; if ( ( @@v49@@ & Number ) != Number ) { v30 = gen_ld8u ( v52 , Number ) ; store_reg ( ( __int64 ) @@a2@@ , v13 , v30 ) ; } else { v31 = load_reg ( @@a2@@ , v13 ) ; gen_st8 ( v31 , v52 , Number ) ; } goto LABEL_123 ; case Number : v14 = @@v49@@ & Number ; v52 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; tcg_gen_addi_i32 ( v52 , v52 , ( @@v49@@ >> Number ) & Number ) ; if ( ( @@v49@@ & Number ) != Number ) { v32 = gen_ld16u ( v52 , Number ) ; store_reg ( ( __int64 ) @@a2@@ , v14 , v32 ) ; } else { v33 = load_reg ( @@a2@@ , v14 ) ; gen_st16 ( v33 , v52 , Number ) ; } goto LABEL_123 ; case Number : v12 = ( @@v49@@ >> Number ) & Number ; v52 = load_reg ( @@a2@@ , Number ) ; tcg_gen_addi_i32 ( v52 , v52 , Number * ( unsigned __int8 ) @@v49@@ ) ; if ( ( @@v49@@ & Number ) != Number ) { LABEL_121 : v34 = gen_ld32 ( v52 , Number ) ; store_reg ( ( __int64 ) @@a2@@ , v12 , v34 ) ; } else { LABEL_122 : v35 = load_reg ( @@a2@@ , v12 ) ; gen_st32 ( v35 , v52 , Number ) ; } goto LABEL_123 ; case Number : if ( ( @@v49@@ & Number ) != Number ) { v36 = load_reg ( @@a2@@ , Number ) ; } else { v36 = new_tmp ( ) ; tcg_gen_movi_i32 ( v36 , ( * @@a2@@ + Number ) & Number ) ; } tcg_gen_addi_i32 ( v36 , v36 , Number * ( unsigned __int8 ) @@v49@@ ) ; store_reg ( ( __int64 ) @@a2@@ , ( @@v49@@ >> Number ) & Number , v36 ) ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : switch ( ( @@v49@@ >> Number ) & Number ) { case Number : v37 = load_reg ( @@a2@@ , Number ) ; v21 = Number * ( @@v49@@ & Number ) ; if ( ( @@v49@@ & Number ) != Number ) v21 = Number * ( @@v49@@ & Number ) ; tcg_gen_addi_i32 ( v37 , v37 , v21 ) ; store_reg ( ( __int64 ) @@a2@@ , Number , v37 ) ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : case Number : case Number : case Number : v40 = load_reg ( @@a2@@ , @@v49@@ & Number ) ; @@a2@@ [ Number ] = gen_new_label ( ) ; @@a2@@ [ Number ] = Number ; if ( ( @@v49@@ & Number ) != Number ) tcg_gen_brcondi_i32 ( Number , v40 , Number , @@a2@@ [ Number ] ) ; else tcg_gen_brcondi_i32 ( Number , v40 , Number , @@a2@@ [ Number ] ) ; dead_tmp ( v40 ) ; gen_jmp ( @@a2@@ , ( ( @@v49@@ >> Number ) & Number | ( @@v49@@ >> Number ) & Number ) + * @@a2@@ + Number ) ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ! arm_feature ( @@a1@@ , Number ) ) goto LABEL_214 ; v8 = @@v49@@ & Number ; v23 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; v2 = ( unsigned __int8 ) @@v49@@ >> Number ; if ( v2 == Number ) { tcg_gen_ext8u_i32 ( v23 , v23 ) ; } else if ( v2 <= Number ) { if ( v2 == Number ) { tcg_gen_ext16u_i32 ( v23 , v23 ) ; } else if ( ( unsigned __int8 ) @@v49@@ >> Number ) { tcg_gen_ext8s_i32 ( v23 , v23 ) ; } else { tcg_gen_ext16s_i32 ( v23 , v23 ) ; } } goto LABEL_186 ; case Number : case Number : case Number : case Number : v53 = load_reg ( @@a2@@ , Number ) ; if ( ( @@v49@@ & Number ) != Number ) @@v15@@ = Number ; else @@v15@@ = Number ; for ( i = Number ; i <= Number ; ++ i ) { if ( ( @@v49@@ & ( Number << i ) ) != Number ) @@v15@@ += Number ; } if ( ( @@v49@@ & Number ) == Number ) tcg_gen_addi_i32 ( v53 , v53 , - @@v15@@ ) ; for ( j = Number ; j <= Number ; ++ j ) { if ( ( @@v49@@ & ( Number << j ) ) != Number ) { if ( ( @@v49@@ & Number ) != Number ) { v38 = gen_ld32 ( v53 , Number ) ; store_reg ( ( __int64 ) @@a2@@ , j , v38 ) ; } else { v39 = load_reg ( @@a2@@ , j ) ; gen_st32 ( v39 , v53 , Number ) ; } tcg_gen_addi_i32 ( v53 , v53 , Number ) ; } } v27 = Number ; if ( ( @@v49@@ & Number ) != Number ) { if ( ( @@v49@@ & Number ) != Number ) { v27 = gen_ld32 ( v53 , Number ) ; } else { v27 = load_reg ( @@a2@@ , Number ) ; gen_st32 ( v27 , v53 , Number ) ; } tcg_gen_addi_i32 ( v53 , v53 , Number ) ; } if ( ( @@v49@@ & Number ) == Number ) tcg_gen_addi_i32 ( v53 , v53 , - @@v15@@ ) ; store_reg ( ( __int64 ) @@a2@@ , Number , v53 ) ; if ( ( @@v49@@ & Number ) == Number ) goto LABEL_168 ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ! arm_feature ( @@a1@@ , Number ) ) goto LABEL_214 ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ! arm_feature ( @@a1@@ , Number ) ) goto LABEL_214 ; v8 = @@v49@@ & Number ; v23 = load_reg ( @@a2@@ , ( @@v49@@ >> Number ) & Number ) ; v3 = ( unsigned __int8 ) @@v49@@ >> Number ; if ( v3 == Number ) { gen_revsh ( v23 ) ; } else { if ( v3 > Number ) goto LABEL_214 ; if ( ( unsigned __int8 ) @@v49@@ >> Number ) { if ( v3 != Number ) goto LABEL_214 ; gen_rev16 ( v23 ) ; } else { tcg_gen_bswap32_i32 ( v23 , v23 ) ; } } break ; case Number : gen_set_condexec ( ( __int64 ) @@a2@@ ) ; gen_set_pc_im ( * @@a2@@ - Number ) ; gen_exception ( Number ) ; @@a2@@ [ Number ] = Number ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ( @@v49@@ & Number ) != Number ) { @@a2@@ [ Number ] = ( @@v49@@ >> Number ) & Number ; @@a2@@ [ Number ] = @@v49@@ & Number ; } else { gen_nop_hint ( @@a2@@ , ( unsigned __int8 ) @@v49@@ >> Number ) ; } return __readfsqword ( Number ) ^ @@v59@@ ; default : goto LABEL_214 ; } goto LABEL_186 ; case Number : @@v50@@ = ( @@v49@@ >> Number ) & Number ; v52 = load_reg ( @@a2@@ , @@v50@@ ) ; for ( k = Number ; k <= Number ; ++ k ) { if ( ( @@v49@@ & ( Number << k ) ) != Number ) { if ( ( @@v49@@ & Number ) != Number ) { v41 = gen_ld32 ( v52 , Number ) ; store_reg ( ( __int64 ) @@a2@@ , k , v41 ) ; } else { v42 = load_reg ( @@a2@@ , k ) ; gen_st32 ( v42 , v52 , Number ) ; } tcg_gen_addi_i32 ( v52 , v52 , Number ) ; } } if ( ( @@v49@@ & ( Number << @@v50@@ ) ) != Number ) LABEL_123 : dead_tmp ( v52 ) ; else store_reg ( ( __int64 ) @@a2@@ , @@v50@@ , v52 ) ; return __readfsqword ( Number ) ^ @@v59@@ ; case Number : v48 = ( @@v49@@ >> Number ) & Number ; if ( v48 == Number ) { LABEL_214 : gen_set_condexec ( ( __int64 ) @@a2@@ ) ; gen_set_pc_im ( * @@a2@@ - Number ) ; gen_exception ( Number ) ; @@a2@@ [ Number ] = Number ; } else if ( v48 == Number ) { gen_set_condexec ( ( __int64 ) @@a2@@ ) ; gen_set_pc_im ( * @@a2@@ ) ; @@a2@@ [ Number ] = Number ; } else { @@a2@@ [ Number ] = gen_new_label ( ) ; gen_test_cc ( v48 ^ Number , @@a2@@ [ Number ] ) ; @@a2@@ [ Number ] = Number ; gen_jmp ( @@a2@@ , Number * ( char ) @@v49@@ + * @@a2@@ + Number ) ; } return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ( @@v49@@ & Number ) != Number ) { if ( disas_thumb2_insn ( @@a1@@ , @@a2@@ , @@v49@@ ) ) { LABEL_213 : gen_set_condexec ( ( __int64 ) @@a2@@ ) ; gen_set_pc_im ( * @@a2@@ - Number ) ; gen_exception ( Number ) ; @@a2@@ [ Number ] = Number ; } } else { gen_jmp ( @@a2@@ , Number * ( ( int ) ( @@v49@@ << Number ) >> Number ) + * @@a2@@ + Number ) ; } return __readfsqword ( Number ) ^ @@v59@@ ; case Number : if ( ! disas_thumb2_insn ( @@a1@@ , @@a2@@ , @@v49@@ ) ) return __readfsqword ( Number ) ^ @@v59@@ ; goto LABEL_213 ; default : return __readfsqword ( Number ) ^ @@v59@@ ; } }", "source": [{"n": "a1", "t": {"T": 1, "n": "__int64", "s": 8}, "location": "r56"}, {"n": "a2", "t": {"T": 3, "t": "int"}, "location": "r64"}, {"n": "v50", "t": {"T": 1, "n": "int", "s": 4}, "location": "s24"}, {"n": "v49", "t": {"T": 1, "n": "unsigned int", "s": 4}, "location": "s28"}, {"n": "v15", "t": {"T": 1, "n": "int", "s": 4}, "location": "s52"}, {"n": "v59", "t": {"T": 1, "n": "unsigned __int64", "s": 8}, "location": "s8"}]}