/* Simulator instruction semantics for crisv32f.

THIS FILE IS MACHINE GENERATED WITH CGEN.

Copyright 1996-2013 Free Software Foundation, Inc.

This file is part of the GNU simulators.

   This file is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   It is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License along
   with this program; if not, see <http://www.gnu.org/licenses/>.

*/

#ifdef DEFINE_LABELS

  /* The labels have the case they have because the enum of insn types
     is all uppercase and in the non-stdc case the insn symbol is built
     into the enum name.  */

  static struct {
    int index;
    void *label;
  } labels[] = {
    { CRISV32F_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
    { CRISV32F_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
    { CRISV32F_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
    { CRISV32F_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
    { CRISV32F_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
    { CRISV32F_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
    { CRISV32F_INSN_MOVE_B_R, && case_sem_INSN_MOVE_B_R },
    { CRISV32F_INSN_MOVE_W_R, && case_sem_INSN_MOVE_W_R },
    { CRISV32F_INSN_MOVE_D_R, && case_sem_INSN_MOVE_D_R },
    { CRISV32F_INSN_MOVEQ, && case_sem_INSN_MOVEQ },
    { CRISV32F_INSN_MOVS_B_R, && case_sem_INSN_MOVS_B_R },
    { CRISV32F_INSN_MOVS_W_R, && case_sem_INSN_MOVS_W_R },
    { CRISV32F_INSN_MOVU_B_R, && case_sem_INSN_MOVU_B_R },
    { CRISV32F_INSN_MOVU_W_R, && case_sem_INSN_MOVU_W_R },
    { CRISV32F_INSN_MOVECBR, && case_sem_INSN_MOVECBR },
    { CRISV32F_INSN_MOVECWR, && case_sem_INSN_MOVECWR },
    { CRISV32F_INSN_MOVECDR, && case_sem_INSN_MOVECDR },
    { CRISV32F_INSN_MOVSCBR, && case_sem_INSN_MOVSCBR },
    { CRISV32F_INSN_MOVSCWR, && case_sem_INSN_MOVSCWR },
    { CRISV32F_INSN_MOVUCBR, && case_sem_INSN_MOVUCBR },
    { CRISV32F_INSN_MOVUCWR, && case_sem_INSN_MOVUCWR },
    { CRISV32F_INSN_ADDQ, && case_sem_INSN_ADDQ },
    { CRISV32F_INSN_SUBQ, && case_sem_INSN_SUBQ },
    { CRISV32F_INSN_CMP_R_B_R, && case_sem_INSN_CMP_R_B_R },
    { CRISV32F_INSN_CMP_R_W_R, && case_sem_INSN_CMP_R_W_R },
    { CRISV32F_INSN_CMP_R_D_R, && case_sem_INSN_CMP_R_D_R },
    { CRISV32F_INSN_CMP_M_B_M, && case_sem_INSN_CMP_M_B_M },
    { CRISV32F_INSN_CMP_M_W_M, && case_sem_INSN_CMP_M_W_M },
    { CRISV32F_INSN_CMP_M_D_M, && case_sem_INSN_CMP_M_D_M },
    { CRISV32F_INSN_CMPCBR, && case_sem_INSN_CMPCBR },
    { CRISV32F_INSN_CMPCWR, && case_sem_INSN_CMPCWR },
    { CRISV32F_INSN_CMPCDR, && case_sem_INSN_CMPCDR },
    { CRISV32F_INSN_CMPQ, && case_sem_INSN_CMPQ },
    { CRISV32F_INSN_CMPS_M_B_M, && case_sem_INSN_CMPS_M_B_M },
    { CRISV32F_INSN_CMPS_M_W_M, && case_sem_INSN_CMPS_M_W_M },
    { CRISV32F_INSN_CMPSCBR, && case_sem_INSN_CMPSCBR },
    { CRISV32F_INSN_CMPSCWR, && case_sem_INSN_CMPSCWR },
    { CRISV32F_INSN_CMPU_M_B_M, && case_sem_INSN_CMPU_M_B_M },
    { CRISV32F_INSN_CMPU_M_W_M, && case_sem_INSN_CMPU_M_W_M },
    { CRISV32F_INSN_CMPUCBR, && case_sem_INSN_CMPUCBR },
    { CRISV32F_INSN_CMPUCWR, && case_sem_INSN_CMPUCWR },
    { CRISV32F_INSN_MOVE_M_B_M, && case_sem_INSN_MOVE_M_B_M },
    { CRISV32F_INSN_MOVE_M_W_M, && case_sem_INSN_MOVE_M_W_M },
    { CRISV32F_INSN_MOVE_M_D_M, && case_sem_INSN_MOVE_M_D_M },
    { CRISV32F_INSN_MOVS_M_B_M, && case_sem_INSN_MOVS_M_B_M },
    { CRISV32F_INSN_MOVS_M_W_M, && case_sem_INSN_MOVS_M_W_M },
    { CRISV32F_INSN_MOVU_M_B_M, && case_sem_INSN_MOVU_M_B_M },
    { CRISV32F_INSN_MOVU_M_W_M, && case_sem_INSN_MOVU_M_W_M },
    { CRISV32F_INSN_MOVE_R_SPRV32, && case_sem_INSN_MOVE_R_SPRV32 },
    { CRISV32F_INSN_MOVE_SPR_RV32, && case_sem_INSN_MOVE_SPR_RV32 },
    { CRISV32F_INSN_MOVE_M_SPRV32, && case_sem_INSN_MOVE_M_SPRV32 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P2, && case_sem_INSN_MOVE_C_SPRV32_P2 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P3, && case_sem_INSN_MOVE_C_SPRV32_P3 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P5, && case_sem_INSN_MOVE_C_SPRV32_P5 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P6, && case_sem_INSN_MOVE_C_SPRV32_P6 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P7, && case_sem_INSN_MOVE_C_SPRV32_P7 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P9, && case_sem_INSN_MOVE_C_SPRV32_P9 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P10, && case_sem_INSN_MOVE_C_SPRV32_P10 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P11, && case_sem_INSN_MOVE_C_SPRV32_P11 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P12, && case_sem_INSN_MOVE_C_SPRV32_P12 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P13, && case_sem_INSN_MOVE_C_SPRV32_P13 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P14, && case_sem_INSN_MOVE_C_SPRV32_P14 },
    { CRISV32F_INSN_MOVE_C_SPRV32_P15, && case_sem_INSN_MOVE_C_SPRV32_P15 },
    { CRISV32F_INSN_MOVE_SPR_MV32, && case_sem_INSN_MOVE_SPR_MV32 },
    { CRISV32F_INSN_MOVE_SS_R, && case_sem_INSN_MOVE_SS_R },
    { CRISV32F_INSN_MOVE_R_SS, && case_sem_INSN_MOVE_R_SS },
    { CRISV32F_INSN_MOVEM_R_M_V32, && case_sem_INSN_MOVEM_R_M_V32 },
    { CRISV32F_INSN_MOVEM_M_R_V32, && case_sem_INSN_MOVEM_M_R_V32 },
    { CRISV32F_INSN_ADD_B_R, && case_sem_INSN_ADD_B_R },
    { CRISV32F_INSN_ADD_W_R, && case_sem_INSN_ADD_W_R },
    { CRISV32F_INSN_ADD_D_R, && case_sem_INSN_ADD_D_R },
    { CRISV32F_INSN_ADD_M_B_M, && case_sem_INSN_ADD_M_B_M },
    { CRISV32F_INSN_ADD_M_W_M, && case_sem_INSN_ADD_M_W_M },
    { CRISV32F_INSN_ADD_M_D_M, && case_sem_INSN_ADD_M_D_M },
    { CRISV32F_INSN_ADDCBR, && case_sem_INSN_ADDCBR },
    { CRISV32F_INSN_ADDCWR, && case_sem_INSN_ADDCWR },
    { CRISV32F_INSN_ADDCDR, && case_sem_INSN_ADDCDR },
    { CRISV32F_INSN_ADDS_B_R, && case_sem_INSN_ADDS_B_R },
    { CRISV32F_INSN_ADDS_W_R, && case_sem_INSN_ADDS_W_R },
    { CRISV32F_INSN_ADDS_M_B_M, && case_sem_INSN_ADDS_M_B_M },
    { CRISV32F_INSN_ADDS_M_W_M, && case_sem_INSN_ADDS_M_W_M },
    { CRISV32F_INSN_ADDSCBR, && case_sem_INSN_ADDSCBR },
    { CRISV32F_INSN_ADDSCWR, && case_sem_INSN_ADDSCWR },
    { CRISV32F_INSN_ADDU_B_R, && case_sem_INSN_ADDU_B_R },
    { CRISV32F_INSN_ADDU_W_R, && case_sem_INSN_ADDU_W_R },
    { CRISV32F_INSN_ADDU_M_B_M, && case_sem_INSN_ADDU_M_B_M },
    { CRISV32F_INSN_ADDU_M_W_M, && case_sem_INSN_ADDU_M_W_M },
    { CRISV32F_INSN_ADDUCBR, && case_sem_INSN_ADDUCBR },
    { CRISV32F_INSN_ADDUCWR, && case_sem_INSN_ADDUCWR },
    { CRISV32F_INSN_SUB_B_R, && case_sem_INSN_SUB_B_R },
    { CRISV32F_INSN_SUB_W_R, && case_sem_INSN_SUB_W_R },
    { CRISV32F_INSN_SUB_D_R, && case_sem_INSN_SUB_D_R },
    { CRISV32F_INSN_SUB_M_B_M, && case_sem_INSN_SUB_M_B_M },
    { CRISV32F_INSN_SUB_M_W_M, && case_sem_INSN_SUB_M_W_M },
    { CRISV32F_INSN_SUB_M_D_M, && case_sem_INSN_SUB_M_D_M },
    { CRISV32F_INSN_SUBCBR, && case_sem_INSN_SUBCBR },
    { CRISV32F_INSN_SUBCWR, && case_sem_INSN_SUBCWR },
    { CRISV32F_INSN_SUBCDR, && case_sem_INSN_SUBCDR },
    { CRISV32F_INSN_SUBS_B_R, && case_sem_INSN_SUBS_B_R },
    { CRISV32F_INSN_SUBS_W_R, && case_sem_INSN_SUBS_W_R },
    { CRISV32F_INSN_SUBS_M_B_M, && case_sem_INSN_SUBS_M_B_M },
    { CRISV32F_INSN_SUBS_M_W_M, && case_sem_INSN_SUBS_M_W_M },
    { CRISV32F_INSN_SUBSCBR, && case_sem_INSN_SUBSCBR },
    { CRISV32F_INSN_SUBSCWR, && case_sem_INSN_SUBSCWR },
    { CRISV32F_INSN_SUBU_B_R, && case_sem_INSN_SUBU_B_R },
    { CRISV32F_INSN_SUBU_W_R, && case_sem_INSN_SUBU_W_R },
    { CRISV32F_INSN_SUBU_M_B_M, && case_sem_INSN_SUBU_M_B_M },
    { CRISV32F_INSN_SUBU_M_W_M, && case_sem_INSN_SUBU_M_W_M },
    { CRISV32F_INSN_SUBUCBR, && case_sem_INSN_SUBUCBR },
    { CRISV32F_INSN_SUBUCWR, && case_sem_INSN_SUBUCWR },
    { CRISV32F_INSN_ADDC_R, && case_sem_INSN_ADDC_R },
    { CRISV32F_INSN_ADDC_M, && case_sem_INSN_ADDC_M },
    { CRISV32F_INSN_ADDC_C, && case_sem_INSN_ADDC_C },
    { CRISV32F_INSN_LAPC_D, && case_sem_INSN_LAPC_D },
    { CRISV32F_INSN_LAPCQ, && case_sem_INSN_LAPCQ },
    { CRISV32F_INSN_ADDI_B_R, && case_sem_INSN_ADDI_B_R },
    { CRISV32F_INSN_ADDI_W_R, && case_sem_INSN_ADDI_W_R },
    { CRISV32F_INSN_ADDI_D_R, && case_sem_INSN_ADDI_D_R },
    { CRISV32F_INSN_NEG_B_R, && case_sem_INSN_NEG_B_R },
    { CRISV32F_INSN_NEG_W_R, && case_sem_INSN_NEG_W_R },
    { CRISV32F_INSN_NEG_D_R, && case_sem_INSN_NEG_D_R },
    { CRISV32F_INSN_TEST_M_B_M, && case_sem_INSN_TEST_M_B_M },
    { CRISV32F_INSN_TEST_M_W_M, && case_sem_INSN_TEST_M_W_M },
    { CRISV32F_INSN_TEST_M_D_M, && case_sem_INSN_TEST_M_D_M },
    { CRISV32F_INSN_MOVE_R_M_B_M, && case_sem_INSN_MOVE_R_M_B_M },
    { CRISV32F_INSN_MOVE_R_M_W_M, && case_sem_INSN_MOVE_R_M_W_M },
    { CRISV32F_INSN_MOVE_R_M_D_M, && case_sem_INSN_MOVE_R_M_D_M },
    { CRISV32F_INSN_MULS_B, && case_sem_INSN_MULS_B },
    { CRISV32F_INSN_MULS_W, && case_sem_INSN_MULS_W },
    { CRISV32F_INSN_MULS_D, && case_sem_INSN_MULS_D },
    { CRISV32F_INSN_MULU_B, && case_sem_INSN_MULU_B },
    { CRISV32F_INSN_MULU_W, && case_sem_INSN_MULU_W },
    { CRISV32F_INSN_MULU_D, && case_sem_INSN_MULU_D },
    { CRISV32F_INSN_MCP, && case_sem_INSN_MCP },
    { CRISV32F_INSN_DSTEP, && case_sem_INSN_DSTEP },
    { CRISV32F_INSN_ABS, && case_sem_INSN_ABS },
    { CRISV32F_INSN_AND_B_R, && case_sem_INSN_AND_B_R },
    { CRISV32F_INSN_AND_W_R, && case_sem_INSN_AND_W_R },
    { CRISV32F_INSN_AND_D_R, && case_sem_INSN_AND_D_R },
    { CRISV32F_INSN_AND_M_B_M, && case_sem_INSN_AND_M_B_M },
    { CRISV32F_INSN_AND_M_W_M, && case_sem_INSN_AND_M_W_M },
    { CRISV32F_INSN_AND_M_D_M, && case_sem_INSN_AND_M_D_M },
    { CRISV32F_INSN_ANDCBR, && case_sem_INSN_ANDCBR },
    { CRISV32F_INSN_ANDCWR, && case_sem_INSN_ANDCWR },
    { CRISV32F_INSN_ANDCDR, && case_sem_INSN_ANDCDR },
    { CRISV32F_INSN_ANDQ, && case_sem_INSN_ANDQ },
    { CRISV32F_INSN_ORR_B_R, && case_sem_INSN_ORR_B_R },
    { CRISV32F_INSN_ORR_W_R, && case_sem_INSN_ORR_W_R },
    { CRISV32F_INSN_ORR_D_R, && case_sem_INSN_ORR_D_R },
    { CRISV32F_INSN_OR_M_B_M, && case_sem_INSN_OR_M_B_M },
    { CRISV32F_INSN_OR_M_W_M, && case_sem_INSN_OR_M_W_M },
    { CRISV32F_INSN_OR_M_D_M, && case_sem_INSN_OR_M_D_M },
    { CRISV32F_INSN_ORCBR, && case_sem_INSN_ORCBR },
    { CRISV32F_INSN_ORCWR, && case_sem_INSN_ORCWR },
    { CRISV32F_INSN_ORCDR, && case_sem_INSN_ORCDR },
    { CRISV32F_INSN_ORQ, && case_sem_INSN_ORQ },
    { CRISV32F_INSN_XOR, && case_sem_INSN_XOR },
    { CRISV32F_INSN_SWAP, && case_sem_INSN_SWAP },
    { CRISV32F_INSN_ASRR_B_R, && case_sem_INSN_ASRR_B_R },
    { CRISV32F_INSN_ASRR_W_R, && case_sem_INSN_ASRR_W_R },
    { CRISV32F_INSN_ASRR_D_R, && case_sem_INSN_ASRR_D_R },
    { CRISV32F_INSN_ASRQ, && case_sem_INSN_ASRQ },
    { CRISV32F_INSN_LSRR_B_R, && case_sem_INSN_LSRR_B_R },
    { CRISV32F_INSN_LSRR_W_R, && case_sem_INSN_LSRR_W_R },
    { CRISV32F_INSN_LSRR_D_R, && case_sem_INSN_LSRR_D_R },
    { CRISV32F_INSN_LSRQ, && case_sem_INSN_LSRQ },
    { CRISV32F_INSN_LSLR_B_R, && case_sem_INSN_LSLR_B_R },
    { CRISV32F_INSN_LSLR_W_R, && case_sem_INSN_LSLR_W_R },
    { CRISV32F_INSN_LSLR_D_R, && case_sem_INSN_LSLR_D_R },
    { CRISV32F_INSN_LSLQ, && case_sem_INSN_LSLQ },
    { CRISV32F_INSN_BTST, && case_sem_INSN_BTST },
    { CRISV32F_INSN_BTSTQ, && case_sem_INSN_BTSTQ },
    { CRISV32F_INSN_SETF, && case_sem_INSN_SETF },
    { CRISV32F_INSN_CLEARF, && case_sem_INSN_CLEARF },
    { CRISV32F_INSN_RFE, && case_sem_INSN_RFE },
    { CRISV32F_INSN_SFE, && case_sem_INSN_SFE },
    { CRISV32F_INSN_RFG, && case_sem_INSN_RFG },
    { CRISV32F_INSN_RFN, && case_sem_INSN_RFN },
    { CRISV32F_INSN_HALT, && case_sem_INSN_HALT },
    { CRISV32F_INSN_BCC_B, && case_sem_INSN_BCC_B },
    { CRISV32F_INSN_BA_B, && case_sem_INSN_BA_B },
    { CRISV32F_INSN_BCC_W, && case_sem_INSN_BCC_W },
    { CRISV32F_INSN_BA_W, && case_sem_INSN_BA_W },
    { CRISV32F_INSN_JAS_R, && case_sem_INSN_JAS_R },
    { CRISV32F_INSN_JAS_C, && case_sem_INSN_JAS_C },
    { CRISV32F_INSN_JUMP_P, && case_sem_INSN_JUMP_P },
    { CRISV32F_INSN_BAS_C, && case_sem_INSN_BAS_C },
    { CRISV32F_INSN_JASC_R, && case_sem_INSN_JASC_R },
    { CRISV32F_INSN_JASC_C, && case_sem_INSN_JASC_C },
    { CRISV32F_INSN_BASC_C, && case_sem_INSN_BASC_C },
    { CRISV32F_INSN_BREAK, && case_sem_INSN_BREAK },
    { CRISV32F_INSN_BOUND_R_B_R, && case_sem_INSN_BOUND_R_B_R },
    { CRISV32F_INSN_BOUND_R_W_R, && case_sem_INSN_BOUND_R_W_R },
    { CRISV32F_INSN_BOUND_R_D_R, && case_sem_INSN_BOUND_R_D_R },
    { CRISV32F_INSN_BOUND_CB, && case_sem_INSN_BOUND_CB },
    { CRISV32F_INSN_BOUND_CW, && case_sem_INSN_BOUND_CW },
    { CRISV32F_INSN_BOUND_CD, && case_sem_INSN_BOUND_CD },
    { CRISV32F_INSN_SCC, && case_sem_INSN_SCC },
    { CRISV32F_INSN_LZ, && case_sem_INSN_LZ },
    { CRISV32F_INSN_ADDOQ, && case_sem_INSN_ADDOQ },
    { CRISV32F_INSN_ADDO_M_B_M, && case_sem_INSN_ADDO_M_B_M },
    { CRISV32F_INSN_ADDO_M_W_M, && case_sem_INSN_ADDO_M_W_M },
    { CRISV32F_INSN_ADDO_M_D_M, && case_sem_INSN_ADDO_M_D_M },
    { CRISV32F_INSN_ADDO_CB, && case_sem_INSN_ADDO_CB },
    { CRISV32F_INSN_ADDO_CW, && case_sem_INSN_ADDO_CW },
    { CRISV32F_INSN_ADDO_CD, && case_sem_INSN_ADDO_CD },
    { CRISV32F_INSN_ADDI_ACR_B_R, && case_sem_INSN_ADDI_ACR_B_R },
    { CRISV32F_INSN_ADDI_ACR_W_R, && case_sem_INSN_ADDI_ACR_W_R },
    { CRISV32F_INSN_ADDI_ACR_D_R, && case_sem_INSN_ADDI_ACR_D_R },
    { CRISV32F_INSN_FIDXI, && case_sem_INSN_FIDXI },
    { CRISV32F_INSN_FTAGI, && case_sem_INSN_FTAGI },
    { CRISV32F_INSN_FIDXD, && case_sem_INSN_FIDXD },
    { CRISV32F_INSN_FTAGD, && case_sem_INSN_FTAGD },
    { 0, 0 }
  };
  int i;

  for (i = 0; labels[i].label != 0; ++i)
    {
#if FAST_P
      CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
#else
      CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
#endif
    }

#undef DEFINE_LABELS
#endif /* DEFINE_LABELS */

#ifdef DEFINE_SWITCH

/* If hyper-fast [well not unnecessarily slow] execution is selected, turn
   off frills like tracing and profiling.  */
/* FIXME: A better way would be to have TRACE_RESULT check for something
   that can cause it to be optimized out.  Another way would be to emit
   special handlers into the instruction "stream".  */

#if FAST_P
#undef TRACE_RESULT
#define TRACE_RESULT(cpu, abuf, name, type, val)
#endif

#undef GET_ATTR
#define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)

{

#if WITH_SCACHE_PBB

/* Branch to next handler without going around main loop.  */
#define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)

#else /* ! WITH_SCACHE_PBB */

#define NEXT(vpc) BREAK (sem)
#ifdef __GNUC__
#if FAST_P
  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
#else
  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
#endif
#else
  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
#endif

#endif /* ! WITH_SCACHE_PBB */

    {

  CASE (sem, INSN_X_INVALID) : /* --invalid-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
    /* Update the recorded pc in the cpu state struct.
       Only necessary for WITH_SCACHE case, but to avoid the
       conditional compilation ....  */
    SET_H_PC (pc);
    /* Virtual insns have zero size.  Overwrite vpc with address of next insn
       using the default-insn-bitsize spec.  When executing insns in parallel
       we may want to queue the fault and continue execution.  */
    vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_X_AFTER) : /* --after-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
#if WITH_SCACHE_PBB_CRISV32F
    crisv32f_pbb_after (current_cpu, sem_arg);
#endif
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_X_BEFORE) : /* --before-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
#if WITH_SCACHE_PBB_CRISV32F
    crisv32f_pbb_before (current_cpu, sem_arg);
#endif
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
#if WITH_SCACHE_PBB_CRISV32F
#ifdef DEFINE_SWITCH
    vpc = crisv32f_pbb_cti_chain (current_cpu, sem_arg,
			       pbb_br_type, pbb_br_npc);
    BREAK (sem);
#else
    /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
    vpc = crisv32f_pbb_cti_chain (current_cpu, sem_arg,
			       CPU_PBB_BR_TYPE (current_cpu),
			       CPU_PBB_BR_NPC (current_cpu));
#endif
#endif
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_X_CHAIN) : /* --chain-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
#if WITH_SCACHE_PBB_CRISV32F
    vpc = crisv32f_pbb_chain (current_cpu, sem_arg);
#ifdef DEFINE_SWITCH
    BREAK (sem);
#endif
#endif
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_X_BEGIN) : /* --begin-- */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);

  {
#if WITH_SCACHE_PBB_CRISV32F
#if defined DEFINE_SWITCH || defined FAST_P
    /* In the switch case FAST_P is a constant, allowing several optimizations
       in any called inline functions.  */
    vpc = crisv32f_pbb_begin (current_cpu, FAST_P);
#else
#if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
    vpc = crisv32f_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
#else
    vpc = crisv32f_pbb_begin (current_cpu, 0);
#endif
#endif
#endif
  }

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_B_R) : /* move.b move.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_newval;
  tmp_newval = GET_H_GR (FLD (f_operand1));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_W_R) : /* move.w move.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_newval;
  tmp_newval = GET_H_GR (FLD (f_operand1));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_D_R) : /* move.d move.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_newval;
  tmp_newval = GET_H_GR (FLD (f_operand1));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVEQ) : /* moveq $i,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_moveq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_newval;
  tmp_newval = FLD (f_s6);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
SET_H_NBIT_MOVE (LTSI (tmp_newval, 0));
SET_H_ZBIT_MOVE (ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1))));
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVS_B_R) : /* movs.b movs.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_newval = EXTQISI (tmp_tmpops);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVS_W_R) : /* movs.w movs.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_newval = EXTHISI (tmp_tmpops);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVU_B_R) : /* movu.b movu.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_newval = ZEXTQISI (tmp_tmpops);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVU_W_R) : /* movu.w movu.m ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_newval = ZEXTHISI (tmp_tmpops);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVECBR) : /* move.b ${sconst8},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_newval;
  tmp_newval = FLD (f_indir_pc__byte);
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVECWR) : /* move.w ${sconst16},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_newval;
  tmp_newval = FLD (f_indir_pc__word);
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVECDR) : /* move.d ${const32},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cd.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_newval;
  tmp_newval = FLD (f_indir_pc__dword);
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVSCBR) : /* movs.b ${sconst8},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_newval;
  tmp_newval = EXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVSCWR) : /* movs.w ${sconst16},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_newval;
  tmp_newval = EXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVUCBR) : /* movu.b ${uconst8},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_newval;
  tmp_newval = ZEXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVUCWR) : /* movu.w ${uconst16},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_newval;
  tmp_newval = ZEXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDQ) : /* addq $j,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_u6);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBQ) : /* subq $j,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_u6);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_R_B_R) : /* cmp-r.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_R_W_R) : /* cmp-r.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_R_D_R) : /* cmp-r.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_M_B_M) : /* cmp-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_M_W_M) : /* cmp-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMP_M_D_M) : /* cmp-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPCBR) : /* cmp.b $sconst8,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = TRUNCSIQI (FLD (f_indir_pc__byte));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPCWR) : /* cmp.w $sconst16,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = TRUNCSIHI (FLD (f_indir_pc__word));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPCDR) : /* cmp.d $const32,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cd.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__dword);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPQ) : /* cmpq $i,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_andq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_s6);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPS_M_B_M) : /* cmps-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPS_M_W_M) : /* cmps-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPSCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPSCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPU_M_B_M) : /* cmpu-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPU_M_W_M) : /* cmpu-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPUCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CMPUCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_M_B_M) : /* move-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmp, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_M_W_M) : /* move-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmp, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_M_D_M) : /* move-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  {
    SI opval = tmp_tmp;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVS_M_B_M) : /* movs-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movs_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = EXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
if (ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
} else {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand2), opval);
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTSI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVS_M_W_M) : /* movs-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movs_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = EXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
if (ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
} else {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand2), opval);
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTSI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVU_M_B_M) : /* movu-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movs_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = ZEXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
if (ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
} else {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand2), opval);
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTSI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVU_M_W_M) : /* movu-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movs_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = ZEXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
if (ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
} else {
  {
    SI opval = tmp_tmp;
    SET_H_GR (FLD (f_operand2), opval);
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTSI (tmp_tmp, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmp, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_R_SPRV32) : /* move ${Rs},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_m_sprv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  SI tmp_rno;
  tmp_tmp = GET_H_GR (FLD (f_operand1));
  tmp_rno = FLD (f_operand2);
if (ORIF (ORIF (EQSI (tmp_rno, 0), EQSI (tmp_rno, 1)), ORIF (EQSI (tmp_rno, 4), EQSI (tmp_rno, 8)))) {
cgen_rtx_error (current_cpu, "move-r-spr: trying to set a read-only special register");
}
 else {
  {
    SI opval = tmp_tmp;
    SET_H_SR (FLD (f_operand2), opval);
    written |= (1 << 2);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_SPR_RV32) : /* move ${Ps},${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_grno;
  SI tmp_prno;
  SI tmp_newval;
  tmp_prno = FLD (f_operand2);
  tmp_newval = GET_H_SR (FLD (f_operand2));
if (EQSI (tmp_prno, 2)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 3)) {
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand1));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
 else if (EQSI (tmp_prno, 5)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 6)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 7)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 9)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 10)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 11)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 12)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 13)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 14)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 15)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else if (EQSI (tmp_prno, 0)) {
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand1));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
 else if (EQSI (tmp_prno, 1)) {
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand1));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
 else if (EQSI (tmp_prno, 4)) {
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand1));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
 else if (EQSI (tmp_prno, 8)) {
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
 else {
cgen_rtx_error (current_cpu, "move-spr-r from unimplemented register");
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_M_SPRV32) : /* move [${Rs}${inc}],${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_m_sprv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_rno;
  SI tmp_newval;
  tmp_rno = FLD (f_operand2);
if (EQSI (tmp_rno, 2)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 3)) {
  tmp_newval = EXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
}
 else if (EQSI (tmp_rno, 5)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 6)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 7)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 9)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 10)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 11)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 12)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 13)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 14)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else if (EQSI (tmp_rno, 15)) {
  tmp_newval = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
}
 else {
cgen_rtx_error (current_cpu, "Trying to set unimplemented special register");
}
  {
    SI opval = tmp_newval;
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P2) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P3) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P5) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P6) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P7) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P9) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P10) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P11) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P12) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P13) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P14) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_C_SPRV32_P15) : /* move ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (f_indir_pc__dword);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_SPR_MV32) : /* move ${Ps},[${Rd-sfield}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_rno;
  tmp_rno = FLD (f_operand2);
if (EQSI (tmp_rno, 2)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 3)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 5)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 6)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 7)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 9)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 10)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 11)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 12)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 13)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 14)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 15)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 0)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 1)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    QI opval = GET_H_SR (FLD (f_operand2));
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 4)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    HI opval = GET_H_SR (FLD (f_operand2));
    SETMEMHI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    HI opval = GET_H_SR (FLD (f_operand2));
    SETMEMHI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else if (EQSI (tmp_rno, 8)) {
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = GET_H_SR (FLD (f_operand2));
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
}
 else {
cgen_rtx_error (current_cpu, "write from unimplemented special register");
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_SS_R) : /* move ${Ss},${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = GET_H_SUPR (FLD (f_operand2));
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_R_SS) : /* move ${Rs},${Sd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = GET_H_GR (FLD (f_operand1));
    SET_H_SUPR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "supr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVEM_R_M_V32) : /* movem ${Rs-dfield},[${Rd-sfield}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movem_r_m_v32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
{
  SI tmp_dummy;
  tmp_dummy = GET_H_GR (FLD (f_operand2));
}
  tmp_addr = GET_H_GR (FLD (f_operand1));
{
if (GESI (FLD (f_operand2), 0)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 0));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 1)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 1));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 2)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 2));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 3)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 3));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 4)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 4));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 5)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 5));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 6)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 6));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 7)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 7));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 8)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 8));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 9)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 9));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 10)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 10));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 11)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 11));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 12)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 12));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 13)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 13));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 14)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 14));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 15)) {
{
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (((UINT) 15));
  {
    SI opval = tmp_tmp;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
}
if (NEBI (tmp_postinc, 0)) {
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 20);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVEM_M_R_V32) : /* movem [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_movem_m_r_v32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = GET_H_GR (FLD (f_operand1));
{
  SI tmp_dummy;
  tmp_dummy = GET_H_GR (FLD (f_operand2));
}
{
if (GESI (FLD (f_operand2), 0)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 0), opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 1)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 1), opval);
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 2)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 2), opval);
    written |= (1 << 14);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 3)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 3), opval);
    written |= (1 << 15);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 4)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 4), opval);
    written |= (1 << 16);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 5)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 5), opval);
    written |= (1 << 17);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 6)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 6), opval);
    written |= (1 << 18);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 7)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 7), opval);
    written |= (1 << 19);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 8)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 8), opval);
    written |= (1 << 20);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 9)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 9), opval);
    written |= (1 << 21);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 10)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 10), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 11)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 11), opval);
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 12)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 12), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 13)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 13), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 14)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 14), opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
if (GESI (FLD (f_operand2), 15)) {
{
  SI tmp_tmp;
  tmp_tmp = GETMEMSI (current_cpu, pc, tmp_addr);
  {
    SI opval = tmp_tmp;
    SET_H_GR (((UINT) 15), opval);
    written |= (1 << 13);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  tmp_addr = ADDSI (tmp_addr, 4);
}
}
}
if (NEBI (tmp_postinc, 0)) {
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 5);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_B_R) : /* add.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), ORIF (ANDIF (LTQI (tmp_tmpopd, 0), GEQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (GEQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_W_R) : /* add.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), ORIF (ANDIF (LTHI (tmp_tmpopd, 0), GEHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (GEHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_D_R) : /* add.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_M_B_M) : /* add-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), ORIF (ANDIF (LTQI (tmp_tmpopd, 0), GEQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (GEQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_M_W_M) : /* add-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), ORIF (ANDIF (LTHI (tmp_tmpopd, 0), GEHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (GEHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADD_M_D_M) : /* add-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDCBR) : /* add.b ${sconst8}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__byte);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), ORIF (ANDIF (LTQI (tmp_tmpopd, 0), GEQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (GEQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDCWR) : /* add.w ${sconst16}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__word);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), ORIF (ANDIF (LTHI (tmp_tmpopd, 0), GEHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (GEHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDCDR) : /* add.d ${const32}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcdr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__dword);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDS_B_R) : /* adds.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDS_W_R) : /* adds.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDS_M_B_M) : /* adds-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDS_M_W_M) : /* adds-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDSCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDSCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDU_B_R) : /* addu.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDU_W_R) : /* addu.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDU_M_B_M) : /* addu-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDU_M_W_M) : /* addu-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDUCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDUCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_B_R) : /* sub.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_W_R) : /* sub.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_D_R) : /* sub.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_M_B_M) : /* sub-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_M_W_M) : /* sub-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 12);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUB_M_D_M) : /* sub-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBCBR) : /* sub.b ${sconst8}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__byte);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBCWR) : /* sub.w ${sconst16}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__word);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBCDR) : /* sub.d ${const32}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcdr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__dword);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBS_B_R) : /* subs.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBS_W_R) : /* subs.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBS_M_B_M) : /* subs-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBS_M_W_M) : /* subs-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBSCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBSCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = EXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBU_B_R) : /* subu.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBU_W_R) : /* subu.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBU_M_B_M) : /* subu-m.b [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBU_M_W_M) : /* subu-m.w [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBUCBR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SUBUCWR) : /* [${Rs}${inc}],$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (FLD (f_indir_pc__word)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDC_R) : /* addc $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
CPU (h_xbit) = 1;
{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDC_M) : /* addc [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
CPU (h_xbit) = 1;
{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDC_C) : /* addc ${const32},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcdr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
CPU (h_xbit) = 1;
{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__dword);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_carry = CPU (h_cbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LAPC_D) : /* lapc.d ${const32-pcrel},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_lapc_d.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = FLD (i_const32_pcrel);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LAPCQ) : /* lapcq ${qo},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_lapcq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = FLD (i_qo);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_B_R) : /* addi.b ${Rs-dfield}.m,${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 1));
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_W_R) : /* addi.w ${Rs-dfield}.m,${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 2));
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_D_R) : /* addi.d ${Rs-dfield}.m,${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 4));
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_NEG_B_R) : /* neg.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = 0;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_NEG_W_R) : /* neg.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = 0;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_newval, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_NEG_D_R) : /* neg.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_GR (FLD (f_operand1));
  tmp_tmpopd = 0;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_TEST_M_B_M) : /* test-m.b [${Rs}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
{
  QI tmp_tmpopd;
  QI tmp_tmpops;
  BI tmp_carry;
  QI tmp_newval;
  tmp_tmpops = 0;
  tmp_tmpopd = tmp_tmpd;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCQI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), ORIF (ANDIF (GEQI (tmp_tmpopd, 0), LTQI (tmp_newval, 0)), ANDIF (LTQI (tmp_tmpops, 0), LTQI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTQI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEQI (tmp_tmpops, 0), LTQI (tmp_tmpopd, 0)), GEQI (tmp_newval, 0)), ANDIF (ANDIF (LTQI (tmp_tmpops, 0), GEQI (tmp_tmpopd, 0)), LTQI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_TEST_M_W_M) : /* test-m.w [${Rs}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
{
  HI tmp_tmpopd;
  HI tmp_tmpops;
  BI tmp_carry;
  HI tmp_newval;
  tmp_tmpops = 0;
  tmp_tmpopd = tmp_tmpd;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCHI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), ORIF (ANDIF (GEHI (tmp_tmpopd, 0), LTHI (tmp_newval, 0)), ANDIF (LTHI (tmp_tmpops, 0), LTHI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTHI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GEHI (tmp_tmpops, 0), LTHI (tmp_tmpopd, 0)), GEHI (tmp_newval, 0)), ANDIF (ANDIF (LTHI (tmp_tmpops, 0), GEHI (tmp_tmpopd, 0)), LTHI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_TEST_M_D_M) : /* test-m.d [${Rs}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = 0;
  tmp_tmpopd = tmp_tmpd;
  tmp_carry = CPU (h_cbit);
  tmp_newval = SUBCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
((void) 0); /*nop*/
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), ORIF (ANDIF (GESI (tmp_tmpopd, 0), LTSI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_newval, 0))));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (GESI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_R_M_B_M) : /* move-r-m.b ${Rs-dfield},[${Rd-sfield}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = GET_H_GR (FLD (f_operand2));
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    QI opval = tmp_tmpd;
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    QI opval = tmp_tmpd;
    SETMEMQI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_R_M_W_M) : /* move-r-m.w ${Rs-dfield},[${Rd-sfield}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = GET_H_GR (FLD (f_operand2));
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    HI opval = tmp_tmpd;
    SETMEMHI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    HI opval = tmp_tmpd;
    SETMEMHI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MOVE_R_M_D_M) : /* move-r-m.d ${Rs-dfield},[${Rd-sfield}${inc}] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = GET_H_GR (FLD (f_operand2));
{
  SI tmp_addr;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
  tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
if (ANDIF (GET_H_V32_V32 (), NEBI (CPU (h_xbit), 0))) {
if (EQBI (CPU (h_pbit), 0)) {
{
  {
    SI opval = tmp_tmpd;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
  {
    BI opval = CPU (h_pbit);
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
} else {
  {
    SI opval = tmp_tmpd;
    SETMEMSI (current_cpu, pc, tmp_addr, opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  }
}
if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULS_B) : /* muls.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = EXTQIDI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = EXTQIDI (TRUNCSIQI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, EXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULS_W) : /* muls.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = EXTHIDI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = EXTHIDI (TRUNCSIHI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, EXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULS_D) : /* muls.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = EXTSIDI (TRUNCSISI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = EXTSIDI (TRUNCSISI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, EXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULU_B) : /* mulu.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = ZEXTQIDI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = ZEXTQIDI (TRUNCSIQI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, ZEXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULU_W) : /* mulu.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = ZEXTHIDI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = ZEXTHIDI (TRUNCSIHI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, ZEXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MULU_D) : /* mulu.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  DI tmp_src1;
  DI tmp_src2;
  DI tmp_tmpr;
  tmp_src1 = ZEXTSIDI (TRUNCSISI (GET_H_GR (FLD (f_operand1))));
  tmp_src2 = ZEXTSIDI (TRUNCSISI (GET_H_GR (FLD (f_operand2))));
  tmp_tmpr = MULDI (tmp_src1, tmp_src2);
  {
    SI opval = TRUNCDISI (tmp_tmpr);
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
  {
    SI opval = TRUNCDISI (SRLDI (tmp_tmpr, 32));
    SET_H_SR (((UINT) 7), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
{
  {
    BI opval = ANDIF (GET_H_V32_V32 (), CPU (h_cbit));
    CPU (h_cbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
  {
    BI opval = LTDI (tmp_tmpr, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQDI (tmp_tmpr, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = NEDI (tmp_tmpr, ZEXTSIDI (TRUNCDISI (tmp_tmpr)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_MCP) : /* mcp $Ps,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
CPU (h_xbit) = 1;
CPU (h_zbit) = 1;
{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  BI tmp_carry;
  SI tmp_newval;
  tmp_tmpops = GET_H_SR (FLD (f_operand2));
  tmp_tmpopd = GET_H_GR (FLD (f_operand1));
  tmp_carry = CPU (h_rbit);
  tmp_newval = ADDCSI (tmp_tmpopd, tmp_tmpops, ((EQBI (CPU (h_xbit), 0)) ? (0) : (tmp_carry)));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = ORIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), ORIF (ANDIF (LTSI (tmp_tmpopd, 0), GESI (tmp_newval, 0)), ANDIF (LTSI (tmp_tmpops, 0), GESI (tmp_newval, 0))));
    CPU (h_rbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "rbit", 'x', opval);
  }
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ORIF (CPU (h_zbit), NOTBI (CPU (h_xbit))));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
  {
    BI opval = ORIF (ANDIF (ANDIF (LTSI (tmp_tmpops, 0), LTSI (tmp_tmpopd, 0)), GESI (tmp_newval, 0)), ANDIF (ANDIF (GESI (tmp_tmpops, 0), GESI (tmp_tmpopd, 0)), LTSI (tmp_newval, 0)));
    CPU (h_vbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_DSTEP) : /* dstep $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  SI tmp_tmps;
  SI tmp_tmpd;
  tmp_tmps = GET_H_GR (FLD (f_operand1));
  tmp_tmp = SLLSI (GET_H_GR (FLD (f_operand2)), 1);
  tmp_tmpd = ((GEUSI (tmp_tmp, tmp_tmps)) ? (SUBSI (tmp_tmp, tmp_tmps)) : (tmp_tmp));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ABS) : /* abs $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ABSSI (GET_H_GR (FLD (f_operand1)));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_B_R) : /* and.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = ANDQI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_W_R) : /* and.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = ANDHI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_D_R) : /* and.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ANDSI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_M_B_M) : /* and-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = ANDQI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_M_W_M) : /* and-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = ANDHI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_AND_M_D_M) : /* and-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ANDSI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ANDCBR) : /* and.b ${sconst8}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_tmpd;
  tmp_tmpd = ANDQI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__byte));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ANDCWR) : /* and.w ${sconst16}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_tmpd;
  tmp_tmpd = ANDHI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__word));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ANDCDR) : /* and.d ${const32}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcdr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpd;
  tmp_tmpd = ANDSI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__dword));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ANDQ) : /* andq $i,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_andq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ANDSI (GET_H_GR (FLD (f_operand2)), FLD (f_s6));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORR_B_R) : /* orr.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = ORQI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORR_W_R) : /* orr.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = ORHI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORR_D_R) : /* orr.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ORSI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_OR_M_B_M) : /* or-m.b [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  tmp_tmpd = ORQI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_OR_M_W_M) : /* or-m.w [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  tmp_tmpd = ORHI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 11);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_OR_M_D_M) : /* or-m.d [${Rs}${inc}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_add_m_b_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ORSI (GET_H_GR (FLD (f_operand2)), ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 10);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; }));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (((ANDIF (GET_H_INSN_PREFIXED_P (), NOTSI (FLD (f_memmode)))) ? (FLD (f_operand1)) : (FLD (f_operand2))), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORCBR) : /* or.b ${sconst8}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcbr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  QI tmp_tmpd;
  tmp_tmpd = ORQI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__byte));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORCWR) : /* or.w ${sconst16}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcwr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  HI tmp_tmpd;
  tmp_tmpd = ORHI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__word));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORCDR) : /* or.d ${const32}],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addcdr.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpd;
  tmp_tmpd = ORSI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__dword));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ORQ) : /* orq $i,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_andq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = ORSI (GET_H_GR (FLD (f_operand2)), FLD (f_s6));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_XOR) : /* xor $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = XORSI (GET_H_GR (FLD (f_operand2)), GET_H_GR (FLD (f_operand1)));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SWAP) : /* swap${swapoption} ${Rs} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmps;
  SI tmp_tmpd;
  tmp_tmps = GET_H_GR (FLD (f_operand1));
  tmp_tmpd = ({   SI tmp_tmpcode;
  SI tmp_tmpval;
  SI tmp_tmpres;
  tmp_tmpcode = FLD (f_operand2);
;   tmp_tmpval = tmp_tmps;
; if (EQSI (tmp_tmpcode, 0)) {
  tmp_tmpres = (cgen_rtx_error (current_cpu, "SWAP without swap modifier isn't implemented"), 0);
}
 else if (EQSI (tmp_tmpcode, 1)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = tmp_tmpval;
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 2)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
}
 else if (EQSI (tmp_tmpcode, 3)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 4)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
}
 else if (EQSI (tmp_tmpcode, 5)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 6)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
}
 else if (EQSI (tmp_tmpcode, 7)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = ({   SI tmp_tmpb;
  tmp_tmpb = tmp_tmpval;
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 8)) {
  tmp_tmpres = INVSI (tmp_tmpval);
}
 else if (EQSI (tmp_tmpcode, 9)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = INVSI (tmp_tmpval);
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 10)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
}
 else if (EQSI (tmp_tmpcode, 11)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 12)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
}
 else if (EQSI (tmp_tmpcode, 13)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
 else if (EQSI (tmp_tmpcode, 14)) {
  tmp_tmpres = ({   SI tmp_tmpb;
  tmp_tmpb = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
}
 else if (EQSI (tmp_tmpcode, 15)) {
  tmp_tmpres = ({   SI tmp_tmpr;
  tmp_tmpr = ({   SI tmp_tmpb;
  tmp_tmpb = ({   SI tmp_tmpb;
  tmp_tmpb = INVSI (tmp_tmpval);
; ORSI (ANDSI (SLLSI (tmp_tmpb, 16), 0xffff0000), ANDSI (SRLSI (tmp_tmpb, 16), 65535)); });
; ORSI (ANDSI (SLLSI (tmp_tmpb, 8), 0xff00ff00), ANDSI (SRLSI (tmp_tmpb, 8), 16711935)); });
; ORSI (SLLSI (ANDSI (tmp_tmpr, 16843009), 7), ORSI (SLLSI (ANDSI (tmp_tmpr, 33686018), 5), ORSI (SLLSI (ANDSI (tmp_tmpr, 67372036), 3), ORSI (SLLSI (ANDSI (tmp_tmpr, 134744072), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 269488144), 1), ORSI (SRLSI (ANDSI (tmp_tmpr, 538976288), 3), ORSI (SRLSI (ANDSI (tmp_tmpr, 1077952576), 5), SRLSI (ANDSI (tmp_tmpr, 0x80808080), 7)))))))); });
}
; tmp_tmpres; });
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ASRR_B_R) : /* asrr.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmpd;
  SI tmp_cnt1;
  SI tmp_cnt2;
  tmp_cnt1 = GET_H_GR (FLD (f_operand1));
  tmp_cnt2 = ((NESI (ANDSI (tmp_cnt1, 32), 0)) ? (31) : (ANDSI (tmp_cnt1, 31)));
  tmp_tmpd = SRASI (EXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand2)))), tmp_cnt2);
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ASRR_W_R) : /* asrr.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmpd;
  SI tmp_cnt1;
  SI tmp_cnt2;
  tmp_cnt1 = GET_H_GR (FLD (f_operand1));
  tmp_cnt2 = ((NESI (ANDSI (tmp_cnt1, 32), 0)) ? (31) : (ANDSI (tmp_cnt1, 31)));
  tmp_tmpd = SRASI (EXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand2)))), tmp_cnt2);
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ASRR_D_R) : /* asrr.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt1;
  SI tmp_cnt2;
  tmp_cnt1 = GET_H_GR (FLD (f_operand1));
  tmp_cnt2 = ((NESI (ANDSI (tmp_cnt1, 32), 0)) ? (31) : (ANDSI (tmp_cnt1, 31)));
  tmp_tmpd = SRASI (EXTSISI (TRUNCSISI (GET_H_GR (FLD (f_operand2)))), tmp_cnt2);
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ASRQ) : /* asrq $c,${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_asrq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = SRASI (GET_H_GR (FLD (f_operand2)), FLD (f_u5));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSRR_B_R) : /* lsrr.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SRLSI (ZEXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSRR_W_R) : /* lsrr.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SRLSI (ZEXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSRR_D_R) : /* lsrr.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SRLSI (ZEXTSISI (TRUNCSISI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSRQ) : /* lsrq $c,${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_asrq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = SRLSI (GET_H_GR (FLD (f_operand2)), FLD (f_u5));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSLR_B_R) : /* lslr.b $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SLLSI (ZEXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 255), ANDSI (tmp_oldregval, 0xffffff00));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTQI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQQI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSLR_W_R) : /* lslr.w $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SLLSI (ZEXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
{
  SI tmp_oldregval;
  tmp_oldregval = GET_H_RAW_GR_ACR (FLD (f_operand2));
  {
    SI opval = ORSI (ANDSI (tmp_tmpd, 65535), ANDSI (tmp_oldregval, 0xffff0000));
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
{
  {
    BI opval = LTHI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQHI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSLR_D_R) : /* lslr.d $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_cnt = ANDSI (GET_H_GR (FLD (f_operand1)), 63);
  tmp_tmpd = ((NESI (ANDSI (tmp_cnt, 32), 0)) ? (0) : (SLLSI (ZEXTSISI (TRUNCSISI (GET_H_GR (FLD (f_operand2)))), ANDSI (tmp_cnt, 31))));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LSLQ) : /* lslq $c,${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_asrq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = SLLSI (GET_H_GR (FLD (f_operand2)), FLD (f_u5));
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BTST) : /* $Rs,$Rd */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_cnt;
  tmp_tmpd = SLLSI (GET_H_GR (FLD (f_operand2)), SUBSI (31, ANDSI (GET_H_GR (FLD (f_operand1)), 31)));
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BTSTQ) : /* btstq $c,${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_asrq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  tmp_tmpd = SLLSI (GET_H_GR (FLD (f_operand2)), SUBSI (31, FLD (f_u5)));
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SETF) : /* setf ${list-of-flags} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_setf.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = FLD (f_dstsrc);
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 0)), 0)) {
  {
    BI opval = 1;
    CPU (h_cbit) = opval;
    written |= (1 << 1);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 1)), 0)) {
  {
    BI opval = 1;
    CPU (h_vbit) = opval;
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 2)), 0)) {
  {
    BI opval = 1;
    CPU (h_zbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 3)), 0)) {
  {
    BI opval = 1;
    CPU (h_nbit) = opval;
    written |= (1 << 3);
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 4)), 0)) {
  {
    BI opval = 1;
    CPU (h_xbit) = opval;
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 5)), 0)) {
  {
    BI opval = 1;
    SET_H_IBIT (opval);
    written |= (1 << 2);
    TRACE_RESULT (current_cpu, abuf, "ibit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 6)), 0)) {
  {
    BI opval = 1;
    SET_H_UBIT (opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "ubit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 7)), 0)) {
  {
    BI opval = 1;
    CPU (h_pbit) = opval;
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "pbit", 'x', opval);
  }
}
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
if (EQSI (ANDSI (tmp_tmp, SLLSI (1, 4)), 0)) {
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_CLEARF) : /* clearf ${list-of-flags} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_setf.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmp;
  tmp_tmp = FLD (f_dstsrc);
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 0)), 0)) {
  {
    BI opval = 0;
    CPU (h_cbit) = opval;
    written |= (1 << 1);
    TRACE_RESULT (current_cpu, abuf, "cbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 1)), 0)) {
  {
    BI opval = 0;
    CPU (h_vbit) = opval;
    written |= (1 << 7);
    TRACE_RESULT (current_cpu, abuf, "vbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 2)), 0)) {
  {
    BI opval = 0;
    CPU (h_zbit) = opval;
    written |= (1 << 9);
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 3)), 0)) {
  {
    BI opval = 0;
    CPU (h_nbit) = opval;
    written |= (1 << 3);
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 4)), 0)) {
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 5)), 0)) {
  {
    BI opval = 0;
    SET_H_IBIT (opval);
    written |= (1 << 2);
    TRACE_RESULT (current_cpu, abuf, "ibit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 6)), 0)) {
  {
    BI opval = 0;
    SET_H_UBIT (opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "ubit", 'x', opval);
  }
}
if (NESI (ANDSI (tmp_tmp, SLLSI (1, 7)), 0)) {
  {
    BI opval = 0;
    CPU (h_pbit) = opval;
    written |= (1 << 4);
    TRACE_RESULT (current_cpu, abuf, "pbit", 'x', opval);
  }
}
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_RFE) : /* rfe */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_rfe.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  USI tmp_oldccs;
  USI tmp_samebits;
  USI tmp_shiftbits;
  USI tmp_keepmask;
  BI tmp_p1;
  tmp_oldccs = GET_H_SR (((UINT) 13));
  tmp_keepmask = 0xc0000000;
  tmp_samebits = ANDSI (tmp_oldccs, tmp_keepmask);
  tmp_shiftbits = ANDSI (SRLSI (ANDSI (tmp_oldccs, 1073609728), 10), INVSI (tmp_keepmask));
  tmp_p1 = NESI (0, ANDSI (tmp_oldccs, 131072));
  {
    SI opval = ORSI (ORSI (tmp_samebits, tmp_shiftbits), ((ANDBI (CPU (h_rbit), NOTBI (tmp_p1))) ? (0) : (128)));
    SET_H_SR (((UINT) 13), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SFE) : /* sfe */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_rfe.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_oldccs;
  SI tmp_savemask;
  tmp_savemask = 0xc0000000;
  tmp_oldccs = GET_H_SR (((UINT) 13));
  {
    SI opval = ORSI (ANDSI (tmp_savemask, tmp_oldccs), ANDSI (INVSI (tmp_savemask), SLLSI (tmp_oldccs, 10)));
    SET_H_SR (((UINT) 13), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_RFG) : /* rfg */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

crisv32f_rfg_handler (current_cpu, pc);

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_RFN) : /* rfn */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_rfe.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  USI tmp_oldccs;
  USI tmp_samebits;
  USI tmp_shiftbits;
  USI tmp_keepmask;
  BI tmp_p1;
  tmp_oldccs = GET_H_SR (((UINT) 13));
  tmp_keepmask = 0xc0000000;
  tmp_samebits = ANDSI (tmp_oldccs, tmp_keepmask);
  tmp_shiftbits = ANDSI (SRLSI (ANDSI (tmp_oldccs, 1073609728), 10), INVSI (tmp_keepmask));
  tmp_p1 = NESI (0, ANDSI (tmp_oldccs, 131072));
  {
    SI opval = ORSI (ORSI (tmp_samebits, tmp_shiftbits), ((ANDBI (CPU (h_rbit), NOTBI (tmp_p1))) ? (0) : (128)));
    SET_H_SR (((UINT) 13), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
}
  {
    BI opval = 1;
    SET_H_MBIT (opval);
    TRACE_RESULT (current_cpu, abuf, "mbit", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_HALT) : /* halt */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_empty.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

  {
    USI opval = crisv32f_halt_handler (current_cpu, pc);
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BCC_B) : /* b${cc} ${o-pcrel} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bcc_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  BI tmp_truthval;
  tmp_truthval = ({   SI tmp_tmpcond;
  BI tmp_condres;
  tmp_tmpcond = FLD (f_operand2);
; if (EQSI (tmp_tmpcond, 0)) {
  tmp_condres = NOTBI (CPU (h_cbit));
}
 else if (EQSI (tmp_tmpcond, 1)) {
  tmp_condres = CPU (h_cbit);
}
 else if (EQSI (tmp_tmpcond, 2)) {
  tmp_condres = NOTBI (CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 3)) {
  tmp_condres = CPU (h_zbit);
}
 else if (EQSI (tmp_tmpcond, 4)) {
  tmp_condres = NOTBI (CPU (h_vbit));
}
 else if (EQSI (tmp_tmpcond, 5)) {
  tmp_condres = CPU (h_vbit);
}
 else if (EQSI (tmp_tmpcond, 6)) {
  tmp_condres = NOTBI (CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 7)) {
  tmp_condres = CPU (h_nbit);
}
 else if (EQSI (tmp_tmpcond, 8)) {
  tmp_condres = ORBI (CPU (h_cbit), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 9)) {
  tmp_condres = NOTBI (ORBI (CPU (h_cbit), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 10)) {
  tmp_condres = NOTBI (XORBI (CPU (h_vbit), CPU (h_nbit)));
}
 else if (EQSI (tmp_tmpcond, 11)) {
  tmp_condres = XORBI (CPU (h_vbit), CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 12)) {
  tmp_condres = NOTBI (ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 13)) {
  tmp_condres = ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 14)) {
  tmp_condres = 1;
}
 else if (EQSI (tmp_tmpcond, 15)) {
  tmp_condres = CPU (h_pbit);
}
; tmp_condres; });
crisv32f_branch_taken (current_cpu, pc, FLD (i_o_pcrel), tmp_truthval);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
if (tmp_truthval) {
{
  {
    USI opval = FLD (i_o_pcrel);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  abuf->written = written;
  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BA_B) : /* ba ${o-pcrel} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bcc_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
  {
    USI opval = FLD (i_o_pcrel);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BCC_W) : /* b${cc} ${o-word-pcrel} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bcc_w.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  BI tmp_truthval;
  tmp_truthval = ({   SI tmp_tmpcond;
  BI tmp_condres;
  tmp_tmpcond = FLD (f_operand2);
; if (EQSI (tmp_tmpcond, 0)) {
  tmp_condres = NOTBI (CPU (h_cbit));
}
 else if (EQSI (tmp_tmpcond, 1)) {
  tmp_condres = CPU (h_cbit);
}
 else if (EQSI (tmp_tmpcond, 2)) {
  tmp_condres = NOTBI (CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 3)) {
  tmp_condres = CPU (h_zbit);
}
 else if (EQSI (tmp_tmpcond, 4)) {
  tmp_condres = NOTBI (CPU (h_vbit));
}
 else if (EQSI (tmp_tmpcond, 5)) {
  tmp_condres = CPU (h_vbit);
}
 else if (EQSI (tmp_tmpcond, 6)) {
  tmp_condres = NOTBI (CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 7)) {
  tmp_condres = CPU (h_nbit);
}
 else if (EQSI (tmp_tmpcond, 8)) {
  tmp_condres = ORBI (CPU (h_cbit), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 9)) {
  tmp_condres = NOTBI (ORBI (CPU (h_cbit), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 10)) {
  tmp_condres = NOTBI (XORBI (CPU (h_vbit), CPU (h_nbit)));
}
 else if (EQSI (tmp_tmpcond, 11)) {
  tmp_condres = XORBI (CPU (h_vbit), CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 12)) {
  tmp_condres = NOTBI (ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 13)) {
  tmp_condres = ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 14)) {
  tmp_condres = 1;
}
 else if (EQSI (tmp_tmpcond, 15)) {
  tmp_condres = CPU (h_pbit);
}
; tmp_condres; });
crisv32f_branch_taken (current_cpu, pc, FLD (i_o_word_pcrel), tmp_truthval);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
if (tmp_truthval) {
{
  {
    USI opval = FLD (i_o_word_pcrel);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    written |= (1 << 8);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  abuf->written = written;
  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BA_W) : /* ba ${o-word-pcrel} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bcc_w.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
  {
    USI opval = FLD (i_o_word_pcrel);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_JAS_R) : /* jas ${Rs},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_m_sprv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
if (ANDIF (EQSI (FLD (f_operand1), 1), EQSI (FLD (f_operand2), 11))) {
cris_flush_simulator_decode_cache (current_cpu, pc);
}
{
{
  {
    SI opval = ADDSI (pc, 4);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = GET_H_GR (FLD (f_operand1));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_JAS_C) : /* jas ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
{
  {
    SI opval = ADDSI (pc, 8);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = FLD (f_indir_pc__dword);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_JUMP_P) : /* jump ${Ps} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
  {
    USI opval = GET_H_SR (FLD (f_operand2));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BAS_C) : /* bas ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bas_c.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
{
  {
    SI opval = ADDSI (pc, 8);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = FLD (i_const32_pcrel);
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_JASC_R) : /* jasc ${Rs},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_m_sprv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
{
  {
    SI opval = ADDSI (pc, 8);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = GET_H_GR (FLD (f_operand1));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_JASC_C) : /* jasc ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_c_sprv32_p2.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
{
  {
    SI opval = ADDSI (pc, 12);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = FLD (f_indir_pc__dword);
    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BASC_C) : /* basc ${const32},${Pd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bas_c.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
{
{
  {
    SI opval = ADDSI (pc, 12);
    SET_H_SR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
  }
  {
    USI opval = FLD (i_const32_pcrel);
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}
}
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BREAK) : /* break $n */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_break.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
  {
    USI opval = crisv32f_break_handler (current_cpu, FLD (f_u4), pc);
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }
}

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_R_B_R) : /* bound-r.b ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_R_W_R) : /* bound-r.w ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = ZEXTHISI (TRUNCSIHI (GET_H_GR (FLD (f_operand1))));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_R_D_R) : /* bound-r.d ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = TRUNCSISI (GET_H_GR (FLD (f_operand1)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_CB) : /* bound.b [PC+],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = ZEXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte)));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_CW) : /* bound.w [PC+],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = ZEXTSISI (FLD (f_indir_pc__word));
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_BOUND_CD) : /* bound.d [PC+],${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cd.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  SI tmp_tmpopd;
  SI tmp_tmpops;
  SI tmp_newval;
  tmp_tmpops = FLD (f_indir_pc__dword);
  tmp_tmpopd = GET_H_GR (FLD (f_operand2));
  tmp_newval = ((LTUSI (tmp_tmpops, tmp_tmpopd)) ? (tmp_tmpops) : (tmp_tmpopd));
  {
    SI opval = tmp_newval;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_newval, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_newval, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_SCC) : /* s${cc} ${Rd-sfield} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_move_spr_mv32.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  BI tmp_truthval;
  tmp_truthval = ({   SI tmp_tmpcond;
  BI tmp_condres;
  tmp_tmpcond = FLD (f_operand2);
; if (EQSI (tmp_tmpcond, 0)) {
  tmp_condres = NOTBI (CPU (h_cbit));
}
 else if (EQSI (tmp_tmpcond, 1)) {
  tmp_condres = CPU (h_cbit);
}
 else if (EQSI (tmp_tmpcond, 2)) {
  tmp_condres = NOTBI (CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 3)) {
  tmp_condres = CPU (h_zbit);
}
 else if (EQSI (tmp_tmpcond, 4)) {
  tmp_condres = NOTBI (CPU (h_vbit));
}
 else if (EQSI (tmp_tmpcond, 5)) {
  tmp_condres = CPU (h_vbit);
}
 else if (EQSI (tmp_tmpcond, 6)) {
  tmp_condres = NOTBI (CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 7)) {
  tmp_condres = CPU (h_nbit);
}
 else if (EQSI (tmp_tmpcond, 8)) {
  tmp_condres = ORBI (CPU (h_cbit), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 9)) {
  tmp_condres = NOTBI (ORBI (CPU (h_cbit), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 10)) {
  tmp_condres = NOTBI (XORBI (CPU (h_vbit), CPU (h_nbit)));
}
 else if (EQSI (tmp_tmpcond, 11)) {
  tmp_condres = XORBI (CPU (h_vbit), CPU (h_nbit));
}
 else if (EQSI (tmp_tmpcond, 12)) {
  tmp_condres = NOTBI (ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit)));
}
 else if (EQSI (tmp_tmpcond, 13)) {
  tmp_condres = ORBI (XORBI (CPU (h_vbit), CPU (h_nbit)), CPU (h_zbit));
}
 else if (EQSI (tmp_tmpcond, 14)) {
  tmp_condres = 1;
}
 else if (EQSI (tmp_tmpcond, 15)) {
  tmp_condres = CPU (h_pbit);
}
; tmp_condres; });
  {
    SI opval = ZEXTBISI (tmp_truthval);
    SET_H_GR (FLD (f_operand1), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_LZ) : /* lz ${Rs},${Rd} */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmpd;
  SI tmp_tmp;
  tmp_tmp = GET_H_GR (FLD (f_operand1));
  tmp_tmpd = 0;
{
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
if (GESI (tmp_tmp, 0)) {
{
  tmp_tmp = SLLSI (tmp_tmp, 1);
  tmp_tmpd = ADDSI (tmp_tmpd, 1);
}
}
}
  {
    SI opval = tmp_tmpd;
    SET_H_GR (FLD (f_operand2), opval);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
{
  {
    BI opval = LTSI (tmp_tmpd, 0);
    CPU (h_nbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "nbit", 'x', opval);
  }
  {
    BI opval = ANDIF (EQSI (tmp_tmpd, 0), ((CPU (h_xbit)) ? (CPU (h_zbit)) : (1)));
    CPU (h_zbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "zbit", 'x', opval);
  }
SET_H_CBIT_MOVE (0);
SET_H_VBIT_MOVE (0);
{
  {
    BI opval = 0;
    CPU (h_xbit) = opval;
    TRACE_RESULT (current_cpu, abuf, "xbit", 'x', opval);
  }
  {
    BI opval = 0;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}
}
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDOQ) : /* addoq $o,$Rs,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addoq.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), FLD (f_s8));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_M_B_M) : /* addo-m.b [${Rs}${inc}],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  QI tmp_tmps;
  tmp_tmps = ({   SI tmp_addr;
  QI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMQI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 1);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), EXTQISI (tmp_tmps));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_M_W_M) : /* addo-m.w [${Rs}${inc}],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  HI tmp_tmps;
  tmp_tmps = ({   SI tmp_addr;
  HI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMHI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 2);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), EXTHISI (tmp_tmps));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_M_D_M) : /* addo-m.d [${Rs}${inc}],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_addc_m.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  SI tmp_tmps;
  tmp_tmps = ({   SI tmp_addr;
  SI tmp_tmp_mem;
  BI tmp_postinc;
  tmp_postinc = FLD (f_memmode);
;   tmp_addr = ((EQBI (GET_H_INSN_PREFIXED_P (), 0)) ? (GET_H_GR (FLD (f_operand1))) : (GET_H_PREFIXREG_V32 ()));
;   tmp_tmp_mem = GETMEMSI (current_cpu, pc, tmp_addr);
; if (NEBI (tmp_postinc, 0)) {
{
if (EQBI (GET_H_INSN_PREFIXED_P (), 0)) {
  tmp_addr = ADDSI (tmp_addr, 4);
}
  {
    SI opval = tmp_addr;
    SET_H_GR (FLD (f_operand1), opval);
    written |= (1 << 6);
    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  }
}
}
; tmp_tmp_mem; });
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), tmp_tmps);
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

  abuf->written = written;
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_CB) : /* addo.b [PC+],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cb.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), EXTQISI (TRUNCSIQI (FLD (f_indir_pc__byte))));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_CW) : /* addo.w [PC+],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cw.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), EXTHISI (TRUNCSIHI (FLD (f_indir_pc__word))));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDO_CD) : /* addo.d [PC+],$Rd,ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_bound_cd.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 6);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand2)), FLD (f_indir_pc__dword));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_ACR_B_R) : /* addi-acr.b ${Rs-dfield}.m,${Rd-sfield},ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 1));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_ACR_W_R) : /* addi-acr.w ${Rs-dfield}.m,${Rd-sfield},ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 2));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_ADDI_ACR_D_R) : /* addi-acr.d ${Rs-dfield}.m,${Rd-sfield},ACR */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_muls_b.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

{
  {
    SI opval = ADDSI (GET_H_GR (FLD (f_operand1)), MULSI (GET_H_GR (FLD (f_operand2)), 4));
    SET_H_PREFIXREG_V32 (opval);
    TRACE_RESULT (current_cpu, abuf, "prefixreg", 'x', opval);
  }
  {
    BI opval = 1;
    SET_H_INSN_PREFIXED_P (opval);
    TRACE_RESULT (current_cpu, abuf, "insn-prefixed-p", 'x', opval);
  }
}

#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_FIDXI) : /* fidxi [$Rs] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

  {
    USI opval = crisv32f_fidxi_handler (current_cpu, pc, GET_H_GR (FLD (f_operand1)));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_FTAGI) : /* fidxi [$Rs] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

  {
    USI opval = crisv32f_ftagi_handler (current_cpu, pc, GET_H_GR (FLD (f_operand1)));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_FIDXD) : /* fidxd [$Rs] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

  {
    USI opval = crisv32f_fidxd_handler (current_cpu, pc, GET_H_GR (FLD (f_operand1)));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);

  CASE (sem, INSN_FTAGD) : /* ftagd [$Rs] */
{
  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
#define FLD(f) abuf->fields.sfmt_mcp.f
  int UNUSED written = 0;
  IADDR UNUSED pc = abuf->addr;
  SEM_BRANCH_INIT
  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);

  {
    USI opval = crisv32f_ftagd_handler (current_cpu, pc, GET_H_GR (FLD (f_operand1)));
    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  }

  SEM_BRANCH_FINI (vpc);
#undef FLD
}
  NEXT (vpc);


    }
  ENDSWITCH (sem) /* End of semantic switch.  */

  /* At this point `vpc' contains the next insn to execute.  */
}

#undef DEFINE_SWITCH
#endif /* DEFINE_SWITCH */
