Home | History | Annotate | Line # | Download | only in m32r
      1   1.1  christos /* Simulator instruction semantics for m32rxf.
      2   1.1  christos 
      3   1.1  christos THIS FILE IS MACHINE GENERATED WITH CGEN.
      4   1.1  christos 
      5  1.11  christos Copyright (C) 1996-2024 Free Software Foundation, Inc.
      6   1.1  christos 
      7   1.1  christos This file is part of the GNU simulators.
      8   1.1  christos 
      9   1.1  christos    This file is free software; you can redistribute it and/or modify
     10   1.1  christos    it under the terms of the GNU General Public License as published by
     11   1.1  christos    the Free Software Foundation; either version 3, or (at your option)
     12   1.1  christos    any later version.
     13   1.1  christos 
     14   1.1  christos    It is distributed in the hope that it will be useful, but WITHOUT
     15   1.1  christos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16   1.1  christos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     17   1.1  christos    License for more details.
     18   1.1  christos 
     19   1.1  christos    You should have received a copy of the GNU General Public License along
     20  1.11  christos    with this program; if not, write to the Free Software Foundation, Inc.,
     21  1.11  christos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     22   1.1  christos 
     23   1.1  christos */
     24   1.1  christos 
     25   1.1  christos #ifdef DEFINE_LABELS
     26   1.1  christos 
     27   1.1  christos   /* The labels have the case they have because the enum of insn types
     28   1.1  christos      is all uppercase and in the non-stdc case the insn symbol is built
     29   1.1  christos      into the enum name.  */
     30   1.1  christos 
     31   1.1  christos   static struct {
     32   1.1  christos     int index;
     33   1.1  christos     void *label;
     34   1.1  christos   } labels[] = {
     35   1.1  christos     { M32RXF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
     36   1.1  christos     { M32RXF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
     37   1.1  christos     { M32RXF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
     38   1.1  christos     { M32RXF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
     39   1.1  christos     { M32RXF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
     40   1.1  christos     { M32RXF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
     41   1.1  christos     { M32RXF_INSN_ADD, && case_sem_INSN_ADD },
     42   1.1  christos     { M32RXF_INSN_ADD3, && case_sem_INSN_ADD3 },
     43   1.1  christos     { M32RXF_INSN_AND, && case_sem_INSN_AND },
     44   1.1  christos     { M32RXF_INSN_AND3, && case_sem_INSN_AND3 },
     45   1.1  christos     { M32RXF_INSN_OR, && case_sem_INSN_OR },
     46   1.1  christos     { M32RXF_INSN_OR3, && case_sem_INSN_OR3 },
     47   1.1  christos     { M32RXF_INSN_XOR, && case_sem_INSN_XOR },
     48   1.1  christos     { M32RXF_INSN_XOR3, && case_sem_INSN_XOR3 },
     49   1.1  christos     { M32RXF_INSN_ADDI, && case_sem_INSN_ADDI },
     50   1.1  christos     { M32RXF_INSN_ADDV, && case_sem_INSN_ADDV },
     51   1.1  christos     { M32RXF_INSN_ADDV3, && case_sem_INSN_ADDV3 },
     52   1.1  christos     { M32RXF_INSN_ADDX, && case_sem_INSN_ADDX },
     53   1.1  christos     { M32RXF_INSN_BC8, && case_sem_INSN_BC8 },
     54   1.1  christos     { M32RXF_INSN_BC24, && case_sem_INSN_BC24 },
     55   1.1  christos     { M32RXF_INSN_BEQ, && case_sem_INSN_BEQ },
     56   1.1  christos     { M32RXF_INSN_BEQZ, && case_sem_INSN_BEQZ },
     57   1.1  christos     { M32RXF_INSN_BGEZ, && case_sem_INSN_BGEZ },
     58   1.1  christos     { M32RXF_INSN_BGTZ, && case_sem_INSN_BGTZ },
     59   1.1  christos     { M32RXF_INSN_BLEZ, && case_sem_INSN_BLEZ },
     60   1.1  christos     { M32RXF_INSN_BLTZ, && case_sem_INSN_BLTZ },
     61   1.1  christos     { M32RXF_INSN_BNEZ, && case_sem_INSN_BNEZ },
     62   1.1  christos     { M32RXF_INSN_BL8, && case_sem_INSN_BL8 },
     63   1.1  christos     { M32RXF_INSN_BL24, && case_sem_INSN_BL24 },
     64   1.1  christos     { M32RXF_INSN_BCL8, && case_sem_INSN_BCL8 },
     65   1.1  christos     { M32RXF_INSN_BCL24, && case_sem_INSN_BCL24 },
     66   1.1  christos     { M32RXF_INSN_BNC8, && case_sem_INSN_BNC8 },
     67   1.1  christos     { M32RXF_INSN_BNC24, && case_sem_INSN_BNC24 },
     68   1.1  christos     { M32RXF_INSN_BNE, && case_sem_INSN_BNE },
     69   1.1  christos     { M32RXF_INSN_BRA8, && case_sem_INSN_BRA8 },
     70   1.1  christos     { M32RXF_INSN_BRA24, && case_sem_INSN_BRA24 },
     71   1.1  christos     { M32RXF_INSN_BNCL8, && case_sem_INSN_BNCL8 },
     72   1.1  christos     { M32RXF_INSN_BNCL24, && case_sem_INSN_BNCL24 },
     73   1.1  christos     { M32RXF_INSN_CMP, && case_sem_INSN_CMP },
     74   1.1  christos     { M32RXF_INSN_CMPI, && case_sem_INSN_CMPI },
     75   1.1  christos     { M32RXF_INSN_CMPU, && case_sem_INSN_CMPU },
     76   1.1  christos     { M32RXF_INSN_CMPUI, && case_sem_INSN_CMPUI },
     77   1.1  christos     { M32RXF_INSN_CMPEQ, && case_sem_INSN_CMPEQ },
     78   1.1  christos     { M32RXF_INSN_CMPZ, && case_sem_INSN_CMPZ },
     79   1.1  christos     { M32RXF_INSN_DIV, && case_sem_INSN_DIV },
     80   1.1  christos     { M32RXF_INSN_DIVU, && case_sem_INSN_DIVU },
     81   1.1  christos     { M32RXF_INSN_REM, && case_sem_INSN_REM },
     82   1.1  christos     { M32RXF_INSN_REMU, && case_sem_INSN_REMU },
     83   1.1  christos     { M32RXF_INSN_DIVH, && case_sem_INSN_DIVH },
     84   1.1  christos     { M32RXF_INSN_JC, && case_sem_INSN_JC },
     85   1.1  christos     { M32RXF_INSN_JNC, && case_sem_INSN_JNC },
     86   1.1  christos     { M32RXF_INSN_JL, && case_sem_INSN_JL },
     87   1.1  christos     { M32RXF_INSN_JMP, && case_sem_INSN_JMP },
     88   1.1  christos     { M32RXF_INSN_LD, && case_sem_INSN_LD },
     89   1.1  christos     { M32RXF_INSN_LD_D, && case_sem_INSN_LD_D },
     90   1.1  christos     { M32RXF_INSN_LDB, && case_sem_INSN_LDB },
     91   1.1  christos     { M32RXF_INSN_LDB_D, && case_sem_INSN_LDB_D },
     92   1.1  christos     { M32RXF_INSN_LDH, && case_sem_INSN_LDH },
     93   1.1  christos     { M32RXF_INSN_LDH_D, && case_sem_INSN_LDH_D },
     94   1.1  christos     { M32RXF_INSN_LDUB, && case_sem_INSN_LDUB },
     95   1.1  christos     { M32RXF_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
     96   1.1  christos     { M32RXF_INSN_LDUH, && case_sem_INSN_LDUH },
     97   1.1  christos     { M32RXF_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
     98   1.1  christos     { M32RXF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
     99   1.1  christos     { M32RXF_INSN_LD24, && case_sem_INSN_LD24 },
    100   1.1  christos     { M32RXF_INSN_LDI8, && case_sem_INSN_LDI8 },
    101   1.1  christos     { M32RXF_INSN_LDI16, && case_sem_INSN_LDI16 },
    102   1.1  christos     { M32RXF_INSN_LOCK, && case_sem_INSN_LOCK },
    103   1.1  christos     { M32RXF_INSN_MACHI_A, && case_sem_INSN_MACHI_A },
    104   1.1  christos     { M32RXF_INSN_MACLO_A, && case_sem_INSN_MACLO_A },
    105   1.1  christos     { M32RXF_INSN_MACWHI_A, && case_sem_INSN_MACWHI_A },
    106   1.1  christos     { M32RXF_INSN_MACWLO_A, && case_sem_INSN_MACWLO_A },
    107   1.1  christos     { M32RXF_INSN_MUL, && case_sem_INSN_MUL },
    108   1.1  christos     { M32RXF_INSN_MULHI_A, && case_sem_INSN_MULHI_A },
    109   1.1  christos     { M32RXF_INSN_MULLO_A, && case_sem_INSN_MULLO_A },
    110   1.1  christos     { M32RXF_INSN_MULWHI_A, && case_sem_INSN_MULWHI_A },
    111   1.1  christos     { M32RXF_INSN_MULWLO_A, && case_sem_INSN_MULWLO_A },
    112   1.1  christos     { M32RXF_INSN_MV, && case_sem_INSN_MV },
    113   1.1  christos     { M32RXF_INSN_MVFACHI_A, && case_sem_INSN_MVFACHI_A },
    114   1.1  christos     { M32RXF_INSN_MVFACLO_A, && case_sem_INSN_MVFACLO_A },
    115   1.1  christos     { M32RXF_INSN_MVFACMI_A, && case_sem_INSN_MVFACMI_A },
    116   1.1  christos     { M32RXF_INSN_MVFC, && case_sem_INSN_MVFC },
    117   1.1  christos     { M32RXF_INSN_MVTACHI_A, && case_sem_INSN_MVTACHI_A },
    118   1.1  christos     { M32RXF_INSN_MVTACLO_A, && case_sem_INSN_MVTACLO_A },
    119   1.1  christos     { M32RXF_INSN_MVTC, && case_sem_INSN_MVTC },
    120   1.1  christos     { M32RXF_INSN_NEG, && case_sem_INSN_NEG },
    121   1.1  christos     { M32RXF_INSN_NOP, && case_sem_INSN_NOP },
    122   1.1  christos     { M32RXF_INSN_NOT, && case_sem_INSN_NOT },
    123   1.1  christos     { M32RXF_INSN_RAC_DSI, && case_sem_INSN_RAC_DSI },
    124   1.1  christos     { M32RXF_INSN_RACH_DSI, && case_sem_INSN_RACH_DSI },
    125   1.1  christos     { M32RXF_INSN_RTE, && case_sem_INSN_RTE },
    126   1.1  christos     { M32RXF_INSN_SETH, && case_sem_INSN_SETH },
    127   1.1  christos     { M32RXF_INSN_SLL, && case_sem_INSN_SLL },
    128   1.1  christos     { M32RXF_INSN_SLL3, && case_sem_INSN_SLL3 },
    129   1.1  christos     { M32RXF_INSN_SLLI, && case_sem_INSN_SLLI },
    130   1.1  christos     { M32RXF_INSN_SRA, && case_sem_INSN_SRA },
    131   1.1  christos     { M32RXF_INSN_SRA3, && case_sem_INSN_SRA3 },
    132   1.1  christos     { M32RXF_INSN_SRAI, && case_sem_INSN_SRAI },
    133   1.1  christos     { M32RXF_INSN_SRL, && case_sem_INSN_SRL },
    134   1.1  christos     { M32RXF_INSN_SRL3, && case_sem_INSN_SRL3 },
    135   1.1  christos     { M32RXF_INSN_SRLI, && case_sem_INSN_SRLI },
    136   1.1  christos     { M32RXF_INSN_ST, && case_sem_INSN_ST },
    137   1.1  christos     { M32RXF_INSN_ST_D, && case_sem_INSN_ST_D },
    138   1.1  christos     { M32RXF_INSN_STB, && case_sem_INSN_STB },
    139   1.1  christos     { M32RXF_INSN_STB_D, && case_sem_INSN_STB_D },
    140   1.1  christos     { M32RXF_INSN_STH, && case_sem_INSN_STH },
    141   1.1  christos     { M32RXF_INSN_STH_D, && case_sem_INSN_STH_D },
    142   1.1  christos     { M32RXF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
    143   1.1  christos     { M32RXF_INSN_STH_PLUS, && case_sem_INSN_STH_PLUS },
    144   1.1  christos     { M32RXF_INSN_STB_PLUS, && case_sem_INSN_STB_PLUS },
    145   1.1  christos     { M32RXF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
    146   1.1  christos     { M32RXF_INSN_SUB, && case_sem_INSN_SUB },
    147   1.1  christos     { M32RXF_INSN_SUBV, && case_sem_INSN_SUBV },
    148   1.1  christos     { M32RXF_INSN_SUBX, && case_sem_INSN_SUBX },
    149   1.1  christos     { M32RXF_INSN_TRAP, && case_sem_INSN_TRAP },
    150   1.1  christos     { M32RXF_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
    151   1.1  christos     { M32RXF_INSN_SATB, && case_sem_INSN_SATB },
    152   1.1  christos     { M32RXF_INSN_SATH, && case_sem_INSN_SATH },
    153   1.1  christos     { M32RXF_INSN_SAT, && case_sem_INSN_SAT },
    154   1.1  christos     { M32RXF_INSN_PCMPBZ, && case_sem_INSN_PCMPBZ },
    155   1.1  christos     { M32RXF_INSN_SADD, && case_sem_INSN_SADD },
    156   1.1  christos     { M32RXF_INSN_MACWU1, && case_sem_INSN_MACWU1 },
    157   1.1  christos     { M32RXF_INSN_MSBLO, && case_sem_INSN_MSBLO },
    158   1.1  christos     { M32RXF_INSN_MULWU1, && case_sem_INSN_MULWU1 },
    159   1.1  christos     { M32RXF_INSN_MACLH1, && case_sem_INSN_MACLH1 },
    160   1.1  christos     { M32RXF_INSN_SC, && case_sem_INSN_SC },
    161   1.1  christos     { M32RXF_INSN_SNC, && case_sem_INSN_SNC },
    162   1.1  christos     { M32RXF_INSN_CLRPSW, && case_sem_INSN_CLRPSW },
    163   1.1  christos     { M32RXF_INSN_SETPSW, && case_sem_INSN_SETPSW },
    164   1.1  christos     { M32RXF_INSN_BSET, && case_sem_INSN_BSET },
    165   1.1  christos     { M32RXF_INSN_BCLR, && case_sem_INSN_BCLR },
    166   1.1  christos     { M32RXF_INSN_BTST, && case_sem_INSN_BTST },
    167   1.1  christos     { M32RXF_INSN_PAR_ADD, && case_sem_INSN_PAR_ADD },
    168   1.1  christos     { M32RXF_INSN_WRITE_ADD, && case_sem_INSN_WRITE_ADD },
    169   1.1  christos     { M32RXF_INSN_PAR_AND, && case_sem_INSN_PAR_AND },
    170   1.1  christos     { M32RXF_INSN_WRITE_AND, && case_sem_INSN_WRITE_AND },
    171   1.1  christos     { M32RXF_INSN_PAR_OR, && case_sem_INSN_PAR_OR },
    172   1.1  christos     { M32RXF_INSN_WRITE_OR, && case_sem_INSN_WRITE_OR },
    173   1.1  christos     { M32RXF_INSN_PAR_XOR, && case_sem_INSN_PAR_XOR },
    174   1.1  christos     { M32RXF_INSN_WRITE_XOR, && case_sem_INSN_WRITE_XOR },
    175   1.1  christos     { M32RXF_INSN_PAR_ADDI, && case_sem_INSN_PAR_ADDI },
    176   1.1  christos     { M32RXF_INSN_WRITE_ADDI, && case_sem_INSN_WRITE_ADDI },
    177   1.1  christos     { M32RXF_INSN_PAR_ADDV, && case_sem_INSN_PAR_ADDV },
    178   1.1  christos     { M32RXF_INSN_WRITE_ADDV, && case_sem_INSN_WRITE_ADDV },
    179   1.1  christos     { M32RXF_INSN_PAR_ADDX, && case_sem_INSN_PAR_ADDX },
    180   1.1  christos     { M32RXF_INSN_WRITE_ADDX, && case_sem_INSN_WRITE_ADDX },
    181   1.1  christos     { M32RXF_INSN_PAR_BC8, && case_sem_INSN_PAR_BC8 },
    182   1.1  christos     { M32RXF_INSN_WRITE_BC8, && case_sem_INSN_WRITE_BC8 },
    183   1.1  christos     { M32RXF_INSN_PAR_BL8, && case_sem_INSN_PAR_BL8 },
    184   1.1  christos     { M32RXF_INSN_WRITE_BL8, && case_sem_INSN_WRITE_BL8 },
    185   1.1  christos     { M32RXF_INSN_PAR_BCL8, && case_sem_INSN_PAR_BCL8 },
    186   1.1  christos     { M32RXF_INSN_WRITE_BCL8, && case_sem_INSN_WRITE_BCL8 },
    187   1.1  christos     { M32RXF_INSN_PAR_BNC8, && case_sem_INSN_PAR_BNC8 },
    188   1.1  christos     { M32RXF_INSN_WRITE_BNC8, && case_sem_INSN_WRITE_BNC8 },
    189   1.1  christos     { M32RXF_INSN_PAR_BRA8, && case_sem_INSN_PAR_BRA8 },
    190   1.1  christos     { M32RXF_INSN_WRITE_BRA8, && case_sem_INSN_WRITE_BRA8 },
    191   1.1  christos     { M32RXF_INSN_PAR_BNCL8, && case_sem_INSN_PAR_BNCL8 },
    192   1.1  christos     { M32RXF_INSN_WRITE_BNCL8, && case_sem_INSN_WRITE_BNCL8 },
    193   1.1  christos     { M32RXF_INSN_PAR_CMP, && case_sem_INSN_PAR_CMP },
    194   1.1  christos     { M32RXF_INSN_WRITE_CMP, && case_sem_INSN_WRITE_CMP },
    195   1.1  christos     { M32RXF_INSN_PAR_CMPU, && case_sem_INSN_PAR_CMPU },
    196   1.1  christos     { M32RXF_INSN_WRITE_CMPU, && case_sem_INSN_WRITE_CMPU },
    197   1.1  christos     { M32RXF_INSN_PAR_CMPEQ, && case_sem_INSN_PAR_CMPEQ },
    198   1.1  christos     { M32RXF_INSN_WRITE_CMPEQ, && case_sem_INSN_WRITE_CMPEQ },
    199   1.1  christos     { M32RXF_INSN_PAR_CMPZ, && case_sem_INSN_PAR_CMPZ },
    200   1.1  christos     { M32RXF_INSN_WRITE_CMPZ, && case_sem_INSN_WRITE_CMPZ },
    201   1.1  christos     { M32RXF_INSN_PAR_JC, && case_sem_INSN_PAR_JC },
    202   1.1  christos     { M32RXF_INSN_WRITE_JC, && case_sem_INSN_WRITE_JC },
    203   1.1  christos     { M32RXF_INSN_PAR_JNC, && case_sem_INSN_PAR_JNC },
    204   1.1  christos     { M32RXF_INSN_WRITE_JNC, && case_sem_INSN_WRITE_JNC },
    205   1.1  christos     { M32RXF_INSN_PAR_JL, && case_sem_INSN_PAR_JL },
    206   1.1  christos     { M32RXF_INSN_WRITE_JL, && case_sem_INSN_WRITE_JL },
    207   1.1  christos     { M32RXF_INSN_PAR_JMP, && case_sem_INSN_PAR_JMP },
    208   1.1  christos     { M32RXF_INSN_WRITE_JMP, && case_sem_INSN_WRITE_JMP },
    209   1.1  christos     { M32RXF_INSN_PAR_LD, && case_sem_INSN_PAR_LD },
    210   1.1  christos     { M32RXF_INSN_WRITE_LD, && case_sem_INSN_WRITE_LD },
    211   1.1  christos     { M32RXF_INSN_PAR_LDB, && case_sem_INSN_PAR_LDB },
    212   1.1  christos     { M32RXF_INSN_WRITE_LDB, && case_sem_INSN_WRITE_LDB },
    213   1.1  christos     { M32RXF_INSN_PAR_LDH, && case_sem_INSN_PAR_LDH },
    214   1.1  christos     { M32RXF_INSN_WRITE_LDH, && case_sem_INSN_WRITE_LDH },
    215   1.1  christos     { M32RXF_INSN_PAR_LDUB, && case_sem_INSN_PAR_LDUB },
    216   1.1  christos     { M32RXF_INSN_WRITE_LDUB, && case_sem_INSN_WRITE_LDUB },
    217   1.1  christos     { M32RXF_INSN_PAR_LDUH, && case_sem_INSN_PAR_LDUH },
    218   1.1  christos     { M32RXF_INSN_WRITE_LDUH, && case_sem_INSN_WRITE_LDUH },
    219   1.1  christos     { M32RXF_INSN_PAR_LD_PLUS, && case_sem_INSN_PAR_LD_PLUS },
    220   1.1  christos     { M32RXF_INSN_WRITE_LD_PLUS, && case_sem_INSN_WRITE_LD_PLUS },
    221   1.1  christos     { M32RXF_INSN_PAR_LDI8, && case_sem_INSN_PAR_LDI8 },
    222   1.1  christos     { M32RXF_INSN_WRITE_LDI8, && case_sem_INSN_WRITE_LDI8 },
    223   1.1  christos     { M32RXF_INSN_PAR_LOCK, && case_sem_INSN_PAR_LOCK },
    224   1.1  christos     { M32RXF_INSN_WRITE_LOCK, && case_sem_INSN_WRITE_LOCK },
    225   1.1  christos     { M32RXF_INSN_PAR_MACHI_A, && case_sem_INSN_PAR_MACHI_A },
    226   1.1  christos     { M32RXF_INSN_WRITE_MACHI_A, && case_sem_INSN_WRITE_MACHI_A },
    227   1.1  christos     { M32RXF_INSN_PAR_MACLO_A, && case_sem_INSN_PAR_MACLO_A },
    228   1.1  christos     { M32RXF_INSN_WRITE_MACLO_A, && case_sem_INSN_WRITE_MACLO_A },
    229   1.1  christos     { M32RXF_INSN_PAR_MACWHI_A, && case_sem_INSN_PAR_MACWHI_A },
    230   1.1  christos     { M32RXF_INSN_WRITE_MACWHI_A, && case_sem_INSN_WRITE_MACWHI_A },
    231   1.1  christos     { M32RXF_INSN_PAR_MACWLO_A, && case_sem_INSN_PAR_MACWLO_A },
    232   1.1  christos     { M32RXF_INSN_WRITE_MACWLO_A, && case_sem_INSN_WRITE_MACWLO_A },
    233   1.1  christos     { M32RXF_INSN_PAR_MUL, && case_sem_INSN_PAR_MUL },
    234   1.1  christos     { M32RXF_INSN_WRITE_MUL, && case_sem_INSN_WRITE_MUL },
    235   1.1  christos     { M32RXF_INSN_PAR_MULHI_A, && case_sem_INSN_PAR_MULHI_A },
    236   1.1  christos     { M32RXF_INSN_WRITE_MULHI_A, && case_sem_INSN_WRITE_MULHI_A },
    237   1.1  christos     { M32RXF_INSN_PAR_MULLO_A, && case_sem_INSN_PAR_MULLO_A },
    238   1.1  christos     { M32RXF_INSN_WRITE_MULLO_A, && case_sem_INSN_WRITE_MULLO_A },
    239   1.1  christos     { M32RXF_INSN_PAR_MULWHI_A, && case_sem_INSN_PAR_MULWHI_A },
    240   1.1  christos     { M32RXF_INSN_WRITE_MULWHI_A, && case_sem_INSN_WRITE_MULWHI_A },
    241   1.1  christos     { M32RXF_INSN_PAR_MULWLO_A, && case_sem_INSN_PAR_MULWLO_A },
    242   1.1  christos     { M32RXF_INSN_WRITE_MULWLO_A, && case_sem_INSN_WRITE_MULWLO_A },
    243   1.1  christos     { M32RXF_INSN_PAR_MV, && case_sem_INSN_PAR_MV },
    244   1.1  christos     { M32RXF_INSN_WRITE_MV, && case_sem_INSN_WRITE_MV },
    245   1.1  christos     { M32RXF_INSN_PAR_MVFACHI_A, && case_sem_INSN_PAR_MVFACHI_A },
    246   1.1  christos     { M32RXF_INSN_WRITE_MVFACHI_A, && case_sem_INSN_WRITE_MVFACHI_A },
    247   1.1  christos     { M32RXF_INSN_PAR_MVFACLO_A, && case_sem_INSN_PAR_MVFACLO_A },
    248   1.1  christos     { M32RXF_INSN_WRITE_MVFACLO_A, && case_sem_INSN_WRITE_MVFACLO_A },
    249   1.1  christos     { M32RXF_INSN_PAR_MVFACMI_A, && case_sem_INSN_PAR_MVFACMI_A },
    250   1.1  christos     { M32RXF_INSN_WRITE_MVFACMI_A, && case_sem_INSN_WRITE_MVFACMI_A },
    251   1.1  christos     { M32RXF_INSN_PAR_MVFC, && case_sem_INSN_PAR_MVFC },
    252   1.1  christos     { M32RXF_INSN_WRITE_MVFC, && case_sem_INSN_WRITE_MVFC },
    253   1.1  christos     { M32RXF_INSN_PAR_MVTACHI_A, && case_sem_INSN_PAR_MVTACHI_A },
    254   1.1  christos     { M32RXF_INSN_WRITE_MVTACHI_A, && case_sem_INSN_WRITE_MVTACHI_A },
    255   1.1  christos     { M32RXF_INSN_PAR_MVTACLO_A, && case_sem_INSN_PAR_MVTACLO_A },
    256   1.1  christos     { M32RXF_INSN_WRITE_MVTACLO_A, && case_sem_INSN_WRITE_MVTACLO_A },
    257   1.1  christos     { M32RXF_INSN_PAR_MVTC, && case_sem_INSN_PAR_MVTC },
    258   1.1  christos     { M32RXF_INSN_WRITE_MVTC, && case_sem_INSN_WRITE_MVTC },
    259   1.1  christos     { M32RXF_INSN_PAR_NEG, && case_sem_INSN_PAR_NEG },
    260   1.1  christos     { M32RXF_INSN_WRITE_NEG, && case_sem_INSN_WRITE_NEG },
    261   1.1  christos     { M32RXF_INSN_PAR_NOP, && case_sem_INSN_PAR_NOP },
    262   1.1  christos     { M32RXF_INSN_WRITE_NOP, && case_sem_INSN_WRITE_NOP },
    263   1.1  christos     { M32RXF_INSN_PAR_NOT, && case_sem_INSN_PAR_NOT },
    264   1.1  christos     { M32RXF_INSN_WRITE_NOT, && case_sem_INSN_WRITE_NOT },
    265   1.1  christos     { M32RXF_INSN_PAR_RAC_DSI, && case_sem_INSN_PAR_RAC_DSI },
    266   1.1  christos     { M32RXF_INSN_WRITE_RAC_DSI, && case_sem_INSN_WRITE_RAC_DSI },
    267   1.1  christos     { M32RXF_INSN_PAR_RACH_DSI, && case_sem_INSN_PAR_RACH_DSI },
    268   1.1  christos     { M32RXF_INSN_WRITE_RACH_DSI, && case_sem_INSN_WRITE_RACH_DSI },
    269   1.1  christos     { M32RXF_INSN_PAR_RTE, && case_sem_INSN_PAR_RTE },
    270   1.1  christos     { M32RXF_INSN_WRITE_RTE, && case_sem_INSN_WRITE_RTE },
    271   1.1  christos     { M32RXF_INSN_PAR_SLL, && case_sem_INSN_PAR_SLL },
    272   1.1  christos     { M32RXF_INSN_WRITE_SLL, && case_sem_INSN_WRITE_SLL },
    273   1.1  christos     { M32RXF_INSN_PAR_SLLI, && case_sem_INSN_PAR_SLLI },
    274   1.1  christos     { M32RXF_INSN_WRITE_SLLI, && case_sem_INSN_WRITE_SLLI },
    275   1.1  christos     { M32RXF_INSN_PAR_SRA, && case_sem_INSN_PAR_SRA },
    276   1.1  christos     { M32RXF_INSN_WRITE_SRA, && case_sem_INSN_WRITE_SRA },
    277   1.1  christos     { M32RXF_INSN_PAR_SRAI, && case_sem_INSN_PAR_SRAI },
    278   1.1  christos     { M32RXF_INSN_WRITE_SRAI, && case_sem_INSN_WRITE_SRAI },
    279   1.1  christos     { M32RXF_INSN_PAR_SRL, && case_sem_INSN_PAR_SRL },
    280   1.1  christos     { M32RXF_INSN_WRITE_SRL, && case_sem_INSN_WRITE_SRL },
    281   1.1  christos     { M32RXF_INSN_PAR_SRLI, && case_sem_INSN_PAR_SRLI },
    282   1.1  christos     { M32RXF_INSN_WRITE_SRLI, && case_sem_INSN_WRITE_SRLI },
    283   1.1  christos     { M32RXF_INSN_PAR_ST, && case_sem_INSN_PAR_ST },
    284   1.1  christos     { M32RXF_INSN_WRITE_ST, && case_sem_INSN_WRITE_ST },
    285   1.1  christos     { M32RXF_INSN_PAR_STB, && case_sem_INSN_PAR_STB },
    286   1.1  christos     { M32RXF_INSN_WRITE_STB, && case_sem_INSN_WRITE_STB },
    287   1.1  christos     { M32RXF_INSN_PAR_STH, && case_sem_INSN_PAR_STH },
    288   1.1  christos     { M32RXF_INSN_WRITE_STH, && case_sem_INSN_WRITE_STH },
    289   1.1  christos     { M32RXF_INSN_PAR_ST_PLUS, && case_sem_INSN_PAR_ST_PLUS },
    290   1.1  christos     { M32RXF_INSN_WRITE_ST_PLUS, && case_sem_INSN_WRITE_ST_PLUS },
    291   1.1  christos     { M32RXF_INSN_PAR_STH_PLUS, && case_sem_INSN_PAR_STH_PLUS },
    292   1.1  christos     { M32RXF_INSN_WRITE_STH_PLUS, && case_sem_INSN_WRITE_STH_PLUS },
    293   1.1  christos     { M32RXF_INSN_PAR_STB_PLUS, && case_sem_INSN_PAR_STB_PLUS },
    294   1.1  christos     { M32RXF_INSN_WRITE_STB_PLUS, && case_sem_INSN_WRITE_STB_PLUS },
    295   1.1  christos     { M32RXF_INSN_PAR_ST_MINUS, && case_sem_INSN_PAR_ST_MINUS },
    296   1.1  christos     { M32RXF_INSN_WRITE_ST_MINUS, && case_sem_INSN_WRITE_ST_MINUS },
    297   1.1  christos     { M32RXF_INSN_PAR_SUB, && case_sem_INSN_PAR_SUB },
    298   1.1  christos     { M32RXF_INSN_WRITE_SUB, && case_sem_INSN_WRITE_SUB },
    299   1.1  christos     { M32RXF_INSN_PAR_SUBV, && case_sem_INSN_PAR_SUBV },
    300   1.1  christos     { M32RXF_INSN_WRITE_SUBV, && case_sem_INSN_WRITE_SUBV },
    301   1.1  christos     { M32RXF_INSN_PAR_SUBX, && case_sem_INSN_PAR_SUBX },
    302   1.1  christos     { M32RXF_INSN_WRITE_SUBX, && case_sem_INSN_WRITE_SUBX },
    303   1.1  christos     { M32RXF_INSN_PAR_TRAP, && case_sem_INSN_PAR_TRAP },
    304   1.1  christos     { M32RXF_INSN_WRITE_TRAP, && case_sem_INSN_WRITE_TRAP },
    305   1.1  christos     { M32RXF_INSN_PAR_UNLOCK, && case_sem_INSN_PAR_UNLOCK },
    306   1.1  christos     { M32RXF_INSN_WRITE_UNLOCK, && case_sem_INSN_WRITE_UNLOCK },
    307   1.1  christos     { M32RXF_INSN_PAR_PCMPBZ, && case_sem_INSN_PAR_PCMPBZ },
    308   1.1  christos     { M32RXF_INSN_WRITE_PCMPBZ, && case_sem_INSN_WRITE_PCMPBZ },
    309   1.1  christos     { M32RXF_INSN_PAR_SADD, && case_sem_INSN_PAR_SADD },
    310   1.1  christos     { M32RXF_INSN_WRITE_SADD, && case_sem_INSN_WRITE_SADD },
    311   1.1  christos     { M32RXF_INSN_PAR_MACWU1, && case_sem_INSN_PAR_MACWU1 },
    312   1.1  christos     { M32RXF_INSN_WRITE_MACWU1, && case_sem_INSN_WRITE_MACWU1 },
    313   1.1  christos     { M32RXF_INSN_PAR_MSBLO, && case_sem_INSN_PAR_MSBLO },
    314   1.1  christos     { M32RXF_INSN_WRITE_MSBLO, && case_sem_INSN_WRITE_MSBLO },
    315   1.1  christos     { M32RXF_INSN_PAR_MULWU1, && case_sem_INSN_PAR_MULWU1 },
    316   1.1  christos     { M32RXF_INSN_WRITE_MULWU1, && case_sem_INSN_WRITE_MULWU1 },
    317   1.1  christos     { M32RXF_INSN_PAR_MACLH1, && case_sem_INSN_PAR_MACLH1 },
    318   1.1  christos     { M32RXF_INSN_WRITE_MACLH1, && case_sem_INSN_WRITE_MACLH1 },
    319   1.1  christos     { M32RXF_INSN_PAR_SC, && case_sem_INSN_PAR_SC },
    320   1.1  christos     { M32RXF_INSN_WRITE_SC, && case_sem_INSN_WRITE_SC },
    321   1.1  christos     { M32RXF_INSN_PAR_SNC, && case_sem_INSN_PAR_SNC },
    322   1.1  christos     { M32RXF_INSN_WRITE_SNC, && case_sem_INSN_WRITE_SNC },
    323   1.1  christos     { M32RXF_INSN_PAR_CLRPSW, && case_sem_INSN_PAR_CLRPSW },
    324   1.1  christos     { M32RXF_INSN_WRITE_CLRPSW, && case_sem_INSN_WRITE_CLRPSW },
    325   1.1  christos     { M32RXF_INSN_PAR_SETPSW, && case_sem_INSN_PAR_SETPSW },
    326   1.1  christos     { M32RXF_INSN_WRITE_SETPSW, && case_sem_INSN_WRITE_SETPSW },
    327   1.1  christos     { M32RXF_INSN_PAR_BTST, && case_sem_INSN_PAR_BTST },
    328   1.1  christos     { M32RXF_INSN_WRITE_BTST, && case_sem_INSN_WRITE_BTST },
    329   1.1  christos     { 0, 0 }
    330   1.1  christos   };
    331   1.1  christos   int i;
    332   1.1  christos 
    333   1.1  christos   for (i = 0; labels[i].label != 0; ++i)
    334   1.1  christos     {
    335   1.1  christos #if FAST_P
    336   1.1  christos       CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
    337   1.1  christos #else
    338   1.1  christos       CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
    339   1.1  christos #endif
    340   1.1  christos     }
    341   1.1  christos 
    342   1.1  christos #undef DEFINE_LABELS
    343   1.1  christos #endif /* DEFINE_LABELS */
    344   1.1  christos 
    345   1.1  christos #ifdef DEFINE_SWITCH
    346   1.1  christos 
    347   1.1  christos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
    348   1.1  christos    off frills like tracing and profiling.  */
    349   1.5  christos /* FIXME: A better way would be to have CGEN_TRACE_RESULT check for something
    350   1.1  christos    that can cause it to be optimized out.  Another way would be to emit
    351   1.1  christos    special handlers into the instruction "stream".  */
    352   1.1  christos 
    353   1.1  christos #if FAST_P
    354   1.5  christos #undef CGEN_TRACE_RESULT
    355   1.5  christos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
    356   1.1  christos #endif
    357   1.1  christos 
    358   1.1  christos #undef GET_ATTR
    359   1.1  christos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
    360   1.1  christos 
    361   1.1  christos {
    362   1.1  christos 
    363   1.1  christos #if WITH_SCACHE_PBB
    364   1.1  christos 
    365   1.1  christos /* Branch to next handler without going around main loop.  */
    366   1.1  christos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
    367   1.1  christos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
    368   1.1  christos 
    369   1.1  christos #else /* ! WITH_SCACHE_PBB */
    370   1.1  christos 
    371   1.1  christos #define NEXT(vpc) BREAK (sem)
    372   1.1  christos #ifdef __GNUC__
    373   1.1  christos #if FAST_P
    374   1.1  christos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
    375   1.1  christos #else
    376   1.1  christos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
    377   1.1  christos #endif
    378   1.1  christos #else
    379   1.1  christos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
    380   1.1  christos #endif
    381   1.1  christos 
    382   1.1  christos #endif /* ! WITH_SCACHE_PBB */
    383   1.1  christos 
    384   1.1  christos     {
    385   1.1  christos 
    386   1.1  christos   CASE (sem, INSN_X_INVALID) : /* --invalid-- */
    387   1.1  christos {
    388   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    389   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    390   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    391   1.1  christos   int UNUSED written = 0;
    392   1.1  christos   IADDR UNUSED pc = abuf->addr;
    393   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    394   1.1  christos 
    395   1.1  christos   {
    396   1.1  christos     /* Update the recorded pc in the cpu state struct.
    397   1.1  christos        Only necessary for WITH_SCACHE case, but to avoid the
    398   1.1  christos        conditional compilation ....  */
    399   1.1  christos     SET_H_PC (pc);
    400   1.1  christos     /* Virtual insns have zero size.  Overwrite vpc with address of next insn
    401   1.1  christos        using the default-insn-bitsize spec.  When executing insns in parallel
    402   1.1  christos        we may want to queue the fault and continue execution.  */
    403   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    404   1.1  christos     vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
    405   1.1  christos   }
    406   1.1  christos 
    407   1.1  christos #undef FLD
    408   1.1  christos }
    409   1.1  christos   NEXT (vpc);
    410   1.1  christos 
    411   1.1  christos   CASE (sem, INSN_X_AFTER) : /* --after-- */
    412   1.1  christos {
    413   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    414   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    415   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    416   1.1  christos   int UNUSED written = 0;
    417   1.1  christos   IADDR UNUSED pc = abuf->addr;
    418   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    419   1.1  christos 
    420   1.1  christos   {
    421   1.1  christos #if WITH_SCACHE_PBB_M32RXF
    422   1.1  christos     m32rxf_pbb_after (current_cpu, sem_arg);
    423   1.1  christos #endif
    424   1.1  christos   }
    425   1.1  christos 
    426   1.1  christos #undef FLD
    427   1.1  christos }
    428   1.1  christos   NEXT (vpc);
    429   1.1  christos 
    430   1.1  christos   CASE (sem, INSN_X_BEFORE) : /* --before-- */
    431   1.1  christos {
    432   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    433   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    434   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    435   1.1  christos   int UNUSED written = 0;
    436   1.1  christos   IADDR UNUSED pc = abuf->addr;
    437   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    438   1.1  christos 
    439   1.1  christos   {
    440   1.1  christos #if WITH_SCACHE_PBB_M32RXF
    441   1.1  christos     m32rxf_pbb_before (current_cpu, sem_arg);
    442   1.1  christos #endif
    443   1.1  christos   }
    444   1.1  christos 
    445   1.1  christos #undef FLD
    446   1.1  christos }
    447   1.1  christos   NEXT (vpc);
    448   1.1  christos 
    449   1.1  christos   CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
    450   1.1  christos {
    451   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    452   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    453   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    454   1.1  christos   int UNUSED written = 0;
    455   1.1  christos   IADDR UNUSED pc = abuf->addr;
    456   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    457   1.1  christos 
    458   1.1  christos   {
    459   1.1  christos #if WITH_SCACHE_PBB_M32RXF
    460   1.1  christos #ifdef DEFINE_SWITCH
    461   1.1  christos     vpc = m32rxf_pbb_cti_chain (current_cpu, sem_arg,
    462   1.1  christos 			       pbb_br_type, pbb_br_npc);
    463   1.1  christos     BREAK (sem);
    464   1.1  christos #else
    465   1.1  christos     /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
    466   1.1  christos     vpc = m32rxf_pbb_cti_chain (current_cpu, sem_arg,
    467   1.1  christos 			       CPU_PBB_BR_TYPE (current_cpu),
    468   1.1  christos 			       CPU_PBB_BR_NPC (current_cpu));
    469   1.1  christos #endif
    470   1.1  christos #endif
    471   1.1  christos   }
    472   1.1  christos 
    473   1.1  christos #undef FLD
    474   1.1  christos }
    475   1.1  christos   NEXT (vpc);
    476   1.1  christos 
    477   1.1  christos   CASE (sem, INSN_X_CHAIN) : /* --chain-- */
    478   1.1  christos {
    479   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    480   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    481   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    482   1.1  christos   int UNUSED written = 0;
    483   1.1  christos   IADDR UNUSED pc = abuf->addr;
    484   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    485   1.1  christos 
    486   1.1  christos   {
    487   1.1  christos #if WITH_SCACHE_PBB_M32RXF
    488   1.1  christos     vpc = m32rxf_pbb_chain (current_cpu, sem_arg);
    489   1.1  christos #ifdef DEFINE_SWITCH
    490   1.1  christos     BREAK (sem);
    491   1.1  christos #endif
    492   1.1  christos #endif
    493   1.1  christos   }
    494   1.1  christos 
    495   1.1  christos #undef FLD
    496   1.1  christos }
    497   1.1  christos   NEXT (vpc);
    498   1.1  christos 
    499   1.1  christos   CASE (sem, INSN_X_BEGIN) : /* --begin-- */
    500   1.1  christos {
    501   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    502   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    503   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
    504   1.1  christos   int UNUSED written = 0;
    505   1.1  christos   IADDR UNUSED pc = abuf->addr;
    506   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
    507   1.1  christos 
    508   1.1  christos   {
    509   1.1  christos #if WITH_SCACHE_PBB_M32RXF
    510   1.1  christos #if defined DEFINE_SWITCH || defined FAST_P
    511   1.1  christos     /* In the switch case FAST_P is a constant, allowing several optimizations
    512   1.1  christos        in any called inline functions.  */
    513   1.1  christos     vpc = m32rxf_pbb_begin (current_cpu, FAST_P);
    514   1.1  christos #else
    515   1.1  christos #if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
    516   1.1  christos     vpc = m32rxf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
    517   1.1  christos #else
    518   1.1  christos     vpc = m32rxf_pbb_begin (current_cpu, 0);
    519   1.1  christos #endif
    520   1.1  christos #endif
    521   1.1  christos #endif
    522   1.1  christos   }
    523   1.1  christos 
    524   1.1  christos #undef FLD
    525   1.1  christos }
    526   1.1  christos   NEXT (vpc);
    527   1.1  christos 
    528   1.1  christos   CASE (sem, INSN_ADD) : /* add $dr,$sr */
    529   1.1  christos {
    530   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    531   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    532   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    533   1.1  christos   int UNUSED written = 0;
    534   1.1  christos   IADDR UNUSED pc = abuf->addr;
    535   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    536   1.1  christos 
    537   1.1  christos   {
    538   1.1  christos     SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
    539   1.1  christos     * FLD (i_dr) = opval;
    540   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    541   1.1  christos   }
    542   1.1  christos 
    543   1.1  christos #undef FLD
    544   1.1  christos }
    545   1.1  christos   NEXT (vpc);
    546   1.1  christos 
    547   1.1  christos   CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
    548   1.1  christos {
    549   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    550   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    551   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
    552   1.1  christos   int UNUSED written = 0;
    553   1.1  christos   IADDR UNUSED pc = abuf->addr;
    554   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    555   1.1  christos 
    556   1.1  christos   {
    557   1.1  christos     SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
    558   1.1  christos     * FLD (i_dr) = opval;
    559   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    560   1.1  christos   }
    561   1.1  christos 
    562   1.1  christos #undef FLD
    563   1.1  christos }
    564   1.1  christos   NEXT (vpc);
    565   1.1  christos 
    566   1.1  christos   CASE (sem, INSN_AND) : /* and $dr,$sr */
    567   1.1  christos {
    568   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    569   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    570   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    571   1.1  christos   int UNUSED written = 0;
    572   1.1  christos   IADDR UNUSED pc = abuf->addr;
    573   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    574   1.1  christos 
    575   1.1  christos   {
    576   1.1  christos     SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
    577   1.1  christos     * FLD (i_dr) = opval;
    578   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    579   1.1  christos   }
    580   1.1  christos 
    581   1.1  christos #undef FLD
    582   1.1  christos }
    583   1.1  christos   NEXT (vpc);
    584   1.1  christos 
    585   1.1  christos   CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
    586   1.1  christos {
    587   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    588   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    589   1.1  christos #define FLD(f) abuf->fields.sfmt_and3.f
    590   1.1  christos   int UNUSED written = 0;
    591   1.1  christos   IADDR UNUSED pc = abuf->addr;
    592   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    593   1.1  christos 
    594   1.1  christos   {
    595   1.1  christos     SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
    596   1.1  christos     * FLD (i_dr) = opval;
    597   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    598   1.1  christos   }
    599   1.1  christos 
    600   1.1  christos #undef FLD
    601   1.1  christos }
    602   1.1  christos   NEXT (vpc);
    603   1.1  christos 
    604   1.1  christos   CASE (sem, INSN_OR) : /* or $dr,$sr */
    605   1.1  christos {
    606   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    607   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    608   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    609   1.1  christos   int UNUSED written = 0;
    610   1.1  christos   IADDR UNUSED pc = abuf->addr;
    611   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    612   1.1  christos 
    613   1.1  christos   {
    614   1.1  christos     SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
    615   1.1  christos     * FLD (i_dr) = opval;
    616   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    617   1.1  christos   }
    618   1.1  christos 
    619   1.1  christos #undef FLD
    620   1.1  christos }
    621   1.1  christos   NEXT (vpc);
    622   1.1  christos 
    623   1.1  christos   CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
    624   1.1  christos {
    625   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    626   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    627   1.1  christos #define FLD(f) abuf->fields.sfmt_and3.f
    628   1.1  christos   int UNUSED written = 0;
    629   1.1  christos   IADDR UNUSED pc = abuf->addr;
    630   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    631   1.1  christos 
    632   1.1  christos   {
    633   1.1  christos     SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
    634   1.1  christos     * FLD (i_dr) = opval;
    635   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    636   1.1  christos   }
    637   1.1  christos 
    638   1.1  christos #undef FLD
    639   1.1  christos }
    640   1.1  christos   NEXT (vpc);
    641   1.1  christos 
    642   1.1  christos   CASE (sem, INSN_XOR) : /* xor $dr,$sr */
    643   1.1  christos {
    644   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    645   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    646   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    647   1.1  christos   int UNUSED written = 0;
    648   1.1  christos   IADDR UNUSED pc = abuf->addr;
    649   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    650   1.1  christos 
    651   1.1  christos   {
    652   1.1  christos     SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
    653   1.1  christos     * FLD (i_dr) = opval;
    654   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    655   1.1  christos   }
    656   1.1  christos 
    657   1.1  christos #undef FLD
    658   1.1  christos }
    659   1.1  christos   NEXT (vpc);
    660   1.1  christos 
    661   1.1  christos   CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
    662   1.1  christos {
    663   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    664   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    665   1.1  christos #define FLD(f) abuf->fields.sfmt_and3.f
    666   1.1  christos   int UNUSED written = 0;
    667   1.1  christos   IADDR UNUSED pc = abuf->addr;
    668   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    669   1.1  christos 
    670   1.1  christos   {
    671   1.1  christos     SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
    672   1.1  christos     * FLD (i_dr) = opval;
    673   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    674   1.1  christos   }
    675   1.1  christos 
    676   1.1  christos #undef FLD
    677   1.1  christos }
    678   1.1  christos   NEXT (vpc);
    679   1.1  christos 
    680   1.1  christos   CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
    681   1.1  christos {
    682   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    683   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    684   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
    685   1.1  christos   int UNUSED written = 0;
    686   1.1  christos   IADDR UNUSED pc = abuf->addr;
    687   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    688   1.1  christos 
    689   1.1  christos   {
    690   1.1  christos     SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
    691   1.1  christos     * FLD (i_dr) = opval;
    692   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    693   1.1  christos   }
    694   1.1  christos 
    695   1.1  christos #undef FLD
    696   1.1  christos }
    697   1.1  christos   NEXT (vpc);
    698   1.1  christos 
    699   1.1  christos   CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
    700   1.1  christos {
    701   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    702   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    703   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    704   1.1  christos   int UNUSED written = 0;
    705   1.1  christos   IADDR UNUSED pc = abuf->addr;
    706   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    707   1.1  christos 
    708   1.1  christos {
    709   1.1  christos   SI temp0;BI temp1;
    710   1.1  christos   temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
    711   1.1  christos   temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
    712   1.1  christos   {
    713   1.1  christos     SI opval = temp0;
    714   1.1  christos     * FLD (i_dr) = opval;
    715   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    716   1.1  christos   }
    717   1.1  christos   {
    718   1.1  christos     BI opval = temp1;
    719   1.1  christos     CPU (h_cond) = opval;
    720   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
    721   1.1  christos   }
    722   1.1  christos }
    723   1.1  christos 
    724   1.1  christos #undef FLD
    725   1.1  christos }
    726   1.1  christos   NEXT (vpc);
    727   1.1  christos 
    728   1.1  christos   CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
    729   1.1  christos {
    730   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    731   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    732   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
    733   1.1  christos   int UNUSED written = 0;
    734   1.1  christos   IADDR UNUSED pc = abuf->addr;
    735   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    736   1.1  christos 
    737   1.1  christos {
    738   1.1  christos   SI temp0;BI temp1;
    739   1.1  christos   temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
    740   1.1  christos   temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
    741   1.1  christos   {
    742   1.1  christos     SI opval = temp0;
    743   1.1  christos     * FLD (i_dr) = opval;
    744   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    745   1.1  christos   }
    746   1.1  christos   {
    747   1.1  christos     BI opval = temp1;
    748   1.1  christos     CPU (h_cond) = opval;
    749   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
    750   1.1  christos   }
    751   1.1  christos }
    752   1.1  christos 
    753   1.1  christos #undef FLD
    754   1.1  christos }
    755   1.1  christos   NEXT (vpc);
    756   1.1  christos 
    757   1.1  christos   CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
    758   1.1  christos {
    759   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    760   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    761   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
    762   1.1  christos   int UNUSED written = 0;
    763   1.1  christos   IADDR UNUSED pc = abuf->addr;
    764   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    765   1.1  christos 
    766   1.1  christos {
    767   1.1  christos   SI temp0;BI temp1;
    768   1.1  christos   temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
    769   1.1  christos   temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
    770   1.1  christos   {
    771   1.1  christos     SI opval = temp0;
    772   1.1  christos     * FLD (i_dr) = opval;
    773   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
    774   1.1  christos   }
    775   1.1  christos   {
    776   1.1  christos     BI opval = temp1;
    777   1.1  christos     CPU (h_cond) = opval;
    778   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
    779   1.1  christos   }
    780   1.1  christos }
    781   1.1  christos 
    782   1.1  christos #undef FLD
    783   1.1  christos }
    784   1.1  christos   NEXT (vpc);
    785   1.1  christos 
    786   1.1  christos   CASE (sem, INSN_BC8) : /* bc.s $disp8 */
    787   1.1  christos {
    788   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    789   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    790   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
    791   1.1  christos   int UNUSED written = 0;
    792   1.1  christos   IADDR UNUSED pc = abuf->addr;
    793   1.1  christos   SEM_BRANCH_INIT
    794   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
    795   1.1  christos 
    796   1.1  christos if (CPU (h_cond)) {
    797   1.1  christos   {
    798   1.1  christos     USI opval = FLD (i_disp8);
    799   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    800   1.1  christos     written |= (1 << 2);
    801   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    802   1.1  christos   }
    803   1.1  christos }
    804   1.1  christos 
    805   1.1  christos   abuf->written = written;
    806   1.1  christos   SEM_BRANCH_FINI (vpc);
    807   1.1  christos #undef FLD
    808   1.1  christos }
    809   1.1  christos   NEXT (vpc);
    810   1.1  christos 
    811   1.1  christos   CASE (sem, INSN_BC24) : /* bc.l $disp24 */
    812   1.1  christos {
    813   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    814   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    815   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
    816   1.1  christos   int UNUSED written = 0;
    817   1.1  christos   IADDR UNUSED pc = abuf->addr;
    818   1.1  christos   SEM_BRANCH_INIT
    819   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    820   1.1  christos 
    821   1.1  christos if (CPU (h_cond)) {
    822   1.1  christos   {
    823   1.1  christos     USI opval = FLD (i_disp24);
    824   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    825   1.1  christos     written |= (1 << 2);
    826   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    827   1.1  christos   }
    828   1.1  christos }
    829   1.1  christos 
    830   1.1  christos   abuf->written = written;
    831   1.1  christos   SEM_BRANCH_FINI (vpc);
    832   1.1  christos #undef FLD
    833   1.1  christos }
    834   1.1  christos   NEXT (vpc);
    835   1.1  christos 
    836   1.1  christos   CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
    837   1.1  christos {
    838   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    839   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    840   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    841   1.1  christos   int UNUSED written = 0;
    842   1.1  christos   IADDR UNUSED pc = abuf->addr;
    843   1.1  christos   SEM_BRANCH_INIT
    844   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    845   1.1  christos 
    846   1.1  christos if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
    847   1.1  christos   {
    848   1.1  christos     USI opval = FLD (i_disp16);
    849   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    850   1.1  christos     written |= (1 << 3);
    851   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    852   1.1  christos   }
    853   1.1  christos }
    854   1.1  christos 
    855   1.1  christos   abuf->written = written;
    856   1.1  christos   SEM_BRANCH_FINI (vpc);
    857   1.1  christos #undef FLD
    858   1.1  christos }
    859   1.1  christos   NEXT (vpc);
    860   1.1  christos 
    861   1.1  christos   CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
    862   1.1  christos {
    863   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    864   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    865   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    866   1.1  christos   int UNUSED written = 0;
    867   1.1  christos   IADDR UNUSED pc = abuf->addr;
    868   1.1  christos   SEM_BRANCH_INIT
    869   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    870   1.1  christos 
    871   1.1  christos if (EQSI (* FLD (i_src2), 0)) {
    872   1.1  christos   {
    873   1.1  christos     USI opval = FLD (i_disp16);
    874   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    875   1.1  christos     written |= (1 << 2);
    876   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    877   1.1  christos   }
    878   1.1  christos }
    879   1.1  christos 
    880   1.1  christos   abuf->written = written;
    881   1.1  christos   SEM_BRANCH_FINI (vpc);
    882   1.1  christos #undef FLD
    883   1.1  christos }
    884   1.1  christos   NEXT (vpc);
    885   1.1  christos 
    886   1.1  christos   CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
    887   1.1  christos {
    888   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    889   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    890   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    891   1.1  christos   int UNUSED written = 0;
    892   1.1  christos   IADDR UNUSED pc = abuf->addr;
    893   1.1  christos   SEM_BRANCH_INIT
    894   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    895   1.1  christos 
    896   1.1  christos if (GESI (* FLD (i_src2), 0)) {
    897   1.1  christos   {
    898   1.1  christos     USI opval = FLD (i_disp16);
    899   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    900   1.1  christos     written |= (1 << 2);
    901   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    902   1.1  christos   }
    903   1.1  christos }
    904   1.1  christos 
    905   1.1  christos   abuf->written = written;
    906   1.1  christos   SEM_BRANCH_FINI (vpc);
    907   1.1  christos #undef FLD
    908   1.1  christos }
    909   1.1  christos   NEXT (vpc);
    910   1.1  christos 
    911   1.1  christos   CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
    912   1.1  christos {
    913   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    914   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    915   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    916   1.1  christos   int UNUSED written = 0;
    917   1.1  christos   IADDR UNUSED pc = abuf->addr;
    918   1.1  christos   SEM_BRANCH_INIT
    919   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    920   1.1  christos 
    921   1.1  christos if (GTSI (* FLD (i_src2), 0)) {
    922   1.1  christos   {
    923   1.1  christos     USI opval = FLD (i_disp16);
    924   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    925   1.1  christos     written |= (1 << 2);
    926   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    927   1.1  christos   }
    928   1.1  christos }
    929   1.1  christos 
    930   1.1  christos   abuf->written = written;
    931   1.1  christos   SEM_BRANCH_FINI (vpc);
    932   1.1  christos #undef FLD
    933   1.1  christos }
    934   1.1  christos   NEXT (vpc);
    935   1.1  christos 
    936   1.1  christos   CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
    937   1.1  christos {
    938   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    939   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    940   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    941   1.1  christos   int UNUSED written = 0;
    942   1.1  christos   IADDR UNUSED pc = abuf->addr;
    943   1.1  christos   SEM_BRANCH_INIT
    944   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    945   1.1  christos 
    946   1.1  christos if (LESI (* FLD (i_src2), 0)) {
    947   1.1  christos   {
    948   1.1  christos     USI opval = FLD (i_disp16);
    949   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    950   1.1  christos     written |= (1 << 2);
    951   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    952   1.1  christos   }
    953   1.1  christos }
    954   1.1  christos 
    955   1.1  christos   abuf->written = written;
    956   1.1  christos   SEM_BRANCH_FINI (vpc);
    957   1.1  christos #undef FLD
    958   1.1  christos }
    959   1.1  christos   NEXT (vpc);
    960   1.1  christos 
    961   1.1  christos   CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
    962   1.1  christos {
    963   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    964   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    965   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    966   1.1  christos   int UNUSED written = 0;
    967   1.1  christos   IADDR UNUSED pc = abuf->addr;
    968   1.1  christos   SEM_BRANCH_INIT
    969   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    970   1.1  christos 
    971   1.1  christos if (LTSI (* FLD (i_src2), 0)) {
    972   1.1  christos   {
    973   1.1  christos     USI opval = FLD (i_disp16);
    974   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
    975   1.1  christos     written |= (1 << 2);
    976   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
    977   1.1  christos   }
    978   1.1  christos }
    979   1.1  christos 
    980   1.1  christos   abuf->written = written;
    981   1.1  christos   SEM_BRANCH_FINI (vpc);
    982   1.1  christos #undef FLD
    983   1.1  christos }
    984   1.1  christos   NEXT (vpc);
    985   1.1  christos 
    986   1.1  christos   CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
    987   1.1  christos {
    988   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
    989   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
    990   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
    991   1.1  christos   int UNUSED written = 0;
    992   1.1  christos   IADDR UNUSED pc = abuf->addr;
    993   1.1  christos   SEM_BRANCH_INIT
    994   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
    995   1.1  christos 
    996   1.1  christos if (NESI (* FLD (i_src2), 0)) {
    997   1.1  christos   {
    998   1.1  christos     USI opval = FLD (i_disp16);
    999   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1000   1.1  christos     written |= (1 << 2);
   1001   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1002   1.1  christos   }
   1003   1.1  christos }
   1004   1.1  christos 
   1005   1.1  christos   abuf->written = written;
   1006   1.1  christos   SEM_BRANCH_FINI (vpc);
   1007   1.1  christos #undef FLD
   1008   1.1  christos }
   1009   1.1  christos   NEXT (vpc);
   1010   1.1  christos 
   1011   1.1  christos   CASE (sem, INSN_BL8) : /* bl.s $disp8 */
   1012   1.1  christos {
   1013   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1014   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1015   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   1016   1.1  christos   int UNUSED written = 0;
   1017   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1018   1.1  christos   SEM_BRANCH_INIT
   1019   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1020   1.1  christos 
   1021   1.1  christos {
   1022   1.1  christos   {
   1023   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   1024   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1025   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1026   1.1  christos   }
   1027   1.1  christos   {
   1028   1.1  christos     USI opval = FLD (i_disp8);
   1029   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1030   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1031   1.1  christos   }
   1032   1.1  christos }
   1033   1.1  christos 
   1034   1.1  christos   SEM_BRANCH_FINI (vpc);
   1035   1.1  christos #undef FLD
   1036   1.1  christos }
   1037   1.1  christos   NEXT (vpc);
   1038   1.1  christos 
   1039   1.1  christos   CASE (sem, INSN_BL24) : /* bl.l $disp24 */
   1040   1.1  christos {
   1041   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1042   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1043   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
   1044   1.1  christos   int UNUSED written = 0;
   1045   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1046   1.1  christos   SEM_BRANCH_INIT
   1047   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1048   1.1  christos 
   1049   1.1  christos {
   1050   1.1  christos   {
   1051   1.1  christos     SI opval = ADDSI (pc, 4);
   1052   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1053   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1054   1.1  christos   }
   1055   1.1  christos   {
   1056   1.1  christos     USI opval = FLD (i_disp24);
   1057   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1058   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1059   1.1  christos   }
   1060   1.1  christos }
   1061   1.1  christos 
   1062   1.1  christos   SEM_BRANCH_FINI (vpc);
   1063   1.1  christos #undef FLD
   1064   1.1  christos }
   1065   1.1  christos   NEXT (vpc);
   1066   1.1  christos 
   1067   1.1  christos   CASE (sem, INSN_BCL8) : /* bcl.s $disp8 */
   1068   1.1  christos {
   1069   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1070   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1071   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   1072   1.1  christos   int UNUSED written = 0;
   1073   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1074   1.1  christos   SEM_BRANCH_INIT
   1075   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1076   1.1  christos 
   1077   1.1  christos if (CPU (h_cond)) {
   1078   1.1  christos {
   1079   1.1  christos   {
   1080   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   1081   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1082   1.1  christos     written |= (1 << 3);
   1083   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1084   1.1  christos   }
   1085   1.1  christos   {
   1086   1.1  christos     USI opval = FLD (i_disp8);
   1087   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1088   1.1  christos     written |= (1 << 4);
   1089   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1090   1.1  christos   }
   1091   1.1  christos }
   1092   1.1  christos }
   1093   1.1  christos 
   1094   1.1  christos   abuf->written = written;
   1095   1.1  christos   SEM_BRANCH_FINI (vpc);
   1096   1.1  christos #undef FLD
   1097   1.1  christos }
   1098   1.1  christos   NEXT (vpc);
   1099   1.1  christos 
   1100   1.1  christos   CASE (sem, INSN_BCL24) : /* bcl.l $disp24 */
   1101   1.1  christos {
   1102   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1103   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1104   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
   1105   1.1  christos   int UNUSED written = 0;
   1106   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1107   1.1  christos   SEM_BRANCH_INIT
   1108   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1109   1.1  christos 
   1110   1.1  christos if (CPU (h_cond)) {
   1111   1.1  christos {
   1112   1.1  christos   {
   1113   1.1  christos     SI opval = ADDSI (pc, 4);
   1114   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1115   1.1  christos     written |= (1 << 3);
   1116   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1117   1.1  christos   }
   1118   1.1  christos   {
   1119   1.1  christos     USI opval = FLD (i_disp24);
   1120   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1121   1.1  christos     written |= (1 << 4);
   1122   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1123   1.1  christos   }
   1124   1.1  christos }
   1125   1.1  christos }
   1126   1.1  christos 
   1127   1.1  christos   abuf->written = written;
   1128   1.1  christos   SEM_BRANCH_FINI (vpc);
   1129   1.1  christos #undef FLD
   1130   1.1  christos }
   1131   1.1  christos   NEXT (vpc);
   1132   1.1  christos 
   1133   1.1  christos   CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
   1134   1.1  christos {
   1135   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1136   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1137   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   1138   1.1  christos   int UNUSED written = 0;
   1139   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1140   1.1  christos   SEM_BRANCH_INIT
   1141   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1142   1.1  christos 
   1143   1.1  christos if (NOTBI (CPU (h_cond))) {
   1144   1.1  christos   {
   1145   1.1  christos     USI opval = FLD (i_disp8);
   1146   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1147   1.1  christos     written |= (1 << 2);
   1148   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1149   1.1  christos   }
   1150   1.1  christos }
   1151   1.1  christos 
   1152   1.1  christos   abuf->written = written;
   1153   1.1  christos   SEM_BRANCH_FINI (vpc);
   1154   1.1  christos #undef FLD
   1155   1.1  christos }
   1156   1.1  christos   NEXT (vpc);
   1157   1.1  christos 
   1158   1.1  christos   CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
   1159   1.1  christos {
   1160   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1161   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1162   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
   1163   1.1  christos   int UNUSED written = 0;
   1164   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1165   1.1  christos   SEM_BRANCH_INIT
   1166   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1167   1.1  christos 
   1168   1.1  christos if (NOTBI (CPU (h_cond))) {
   1169   1.1  christos   {
   1170   1.1  christos     USI opval = FLD (i_disp24);
   1171   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1172   1.1  christos     written |= (1 << 2);
   1173   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1174   1.1  christos   }
   1175   1.1  christos }
   1176   1.1  christos 
   1177   1.1  christos   abuf->written = written;
   1178   1.1  christos   SEM_BRANCH_FINI (vpc);
   1179   1.1  christos #undef FLD
   1180   1.1  christos }
   1181   1.1  christos   NEXT (vpc);
   1182   1.1  christos 
   1183   1.1  christos   CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
   1184   1.1  christos {
   1185   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1186   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1187   1.1  christos #define FLD(f) abuf->fields.sfmt_beq.f
   1188   1.1  christos   int UNUSED written = 0;
   1189   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1190   1.1  christos   SEM_BRANCH_INIT
   1191   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1192   1.1  christos 
   1193   1.1  christos if (NESI (* FLD (i_src1), * FLD (i_src2))) {
   1194   1.1  christos   {
   1195   1.1  christos     USI opval = FLD (i_disp16);
   1196   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1197   1.1  christos     written |= (1 << 3);
   1198   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1199   1.1  christos   }
   1200   1.1  christos }
   1201   1.1  christos 
   1202   1.1  christos   abuf->written = written;
   1203   1.1  christos   SEM_BRANCH_FINI (vpc);
   1204   1.1  christos #undef FLD
   1205   1.1  christos }
   1206   1.1  christos   NEXT (vpc);
   1207   1.1  christos 
   1208   1.1  christos   CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
   1209   1.1  christos {
   1210   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1211   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1212   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   1213   1.1  christos   int UNUSED written = 0;
   1214   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1215   1.1  christos   SEM_BRANCH_INIT
   1216   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1217   1.1  christos 
   1218   1.1  christos   {
   1219   1.1  christos     USI opval = FLD (i_disp8);
   1220   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1221   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1222   1.1  christos   }
   1223   1.1  christos 
   1224   1.1  christos   SEM_BRANCH_FINI (vpc);
   1225   1.1  christos #undef FLD
   1226   1.1  christos }
   1227   1.1  christos   NEXT (vpc);
   1228   1.1  christos 
   1229   1.1  christos   CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
   1230   1.1  christos {
   1231   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1232   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1233   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
   1234   1.1  christos   int UNUSED written = 0;
   1235   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1236   1.1  christos   SEM_BRANCH_INIT
   1237   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1238   1.1  christos 
   1239   1.1  christos   {
   1240   1.1  christos     USI opval = FLD (i_disp24);
   1241   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1242   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1243   1.1  christos   }
   1244   1.1  christos 
   1245   1.1  christos   SEM_BRANCH_FINI (vpc);
   1246   1.1  christos #undef FLD
   1247   1.1  christos }
   1248   1.1  christos   NEXT (vpc);
   1249   1.1  christos 
   1250   1.1  christos   CASE (sem, INSN_BNCL8) : /* bncl.s $disp8 */
   1251   1.1  christos {
   1252   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1253   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1254   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   1255   1.1  christos   int UNUSED written = 0;
   1256   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1257   1.1  christos   SEM_BRANCH_INIT
   1258   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1259   1.1  christos 
   1260   1.1  christos if (NOTBI (CPU (h_cond))) {
   1261   1.1  christos {
   1262   1.1  christos   {
   1263   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   1264   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1265   1.1  christos     written |= (1 << 3);
   1266   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1267   1.1  christos   }
   1268   1.1  christos   {
   1269   1.1  christos     USI opval = FLD (i_disp8);
   1270   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1271   1.1  christos     written |= (1 << 4);
   1272   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1273   1.1  christos   }
   1274   1.1  christos }
   1275   1.1  christos }
   1276   1.1  christos 
   1277   1.1  christos   abuf->written = written;
   1278   1.1  christos   SEM_BRANCH_FINI (vpc);
   1279   1.1  christos #undef FLD
   1280   1.1  christos }
   1281   1.1  christos   NEXT (vpc);
   1282   1.1  christos 
   1283   1.1  christos   CASE (sem, INSN_BNCL24) : /* bncl.l $disp24 */
   1284   1.1  christos {
   1285   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1286   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1287   1.1  christos #define FLD(f) abuf->fields.sfmt_bl24.f
   1288   1.1  christos   int UNUSED written = 0;
   1289   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1290   1.1  christos   SEM_BRANCH_INIT
   1291   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1292   1.1  christos 
   1293   1.1  christos if (NOTBI (CPU (h_cond))) {
   1294   1.1  christos {
   1295   1.1  christos   {
   1296   1.1  christos     SI opval = ADDSI (pc, 4);
   1297   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1298   1.1  christos     written |= (1 << 3);
   1299   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1300   1.1  christos   }
   1301   1.1  christos   {
   1302   1.1  christos     USI opval = FLD (i_disp24);
   1303   1.1  christos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
   1304   1.1  christos     written |= (1 << 4);
   1305   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1306   1.1  christos   }
   1307   1.1  christos }
   1308   1.1  christos }
   1309   1.1  christos 
   1310   1.1  christos   abuf->written = written;
   1311   1.1  christos   SEM_BRANCH_FINI (vpc);
   1312   1.1  christos #undef FLD
   1313   1.1  christos }
   1314   1.1  christos   NEXT (vpc);
   1315   1.1  christos 
   1316   1.1  christos   CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
   1317   1.1  christos {
   1318   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1319   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1320   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   1321   1.1  christos   int UNUSED written = 0;
   1322   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1323   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1324   1.1  christos 
   1325   1.1  christos   {
   1326   1.1  christos     BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
   1327   1.1  christos     CPU (h_cond) = opval;
   1328   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1329   1.1  christos   }
   1330   1.1  christos 
   1331   1.1  christos #undef FLD
   1332   1.1  christos }
   1333   1.1  christos   NEXT (vpc);
   1334   1.1  christos 
   1335   1.1  christos   CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
   1336   1.1  christos {
   1337   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1338   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1339   1.1  christos #define FLD(f) abuf->fields.sfmt_st_d.f
   1340   1.1  christos   int UNUSED written = 0;
   1341   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1342   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1343   1.1  christos 
   1344   1.1  christos   {
   1345   1.1  christos     BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
   1346   1.1  christos     CPU (h_cond) = opval;
   1347   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1348   1.1  christos   }
   1349   1.1  christos 
   1350   1.1  christos #undef FLD
   1351   1.1  christos }
   1352   1.1  christos   NEXT (vpc);
   1353   1.1  christos 
   1354   1.1  christos   CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
   1355   1.1  christos {
   1356   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1357   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1358   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   1359   1.1  christos   int UNUSED written = 0;
   1360   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1361   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1362   1.1  christos 
   1363   1.1  christos   {
   1364   1.1  christos     BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
   1365   1.1  christos     CPU (h_cond) = opval;
   1366   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1367   1.1  christos   }
   1368   1.1  christos 
   1369   1.1  christos #undef FLD
   1370   1.1  christos }
   1371   1.1  christos   NEXT (vpc);
   1372   1.1  christos 
   1373   1.1  christos   CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
   1374   1.1  christos {
   1375   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1376   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1377   1.1  christos #define FLD(f) abuf->fields.sfmt_st_d.f
   1378   1.1  christos   int UNUSED written = 0;
   1379   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1380   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1381   1.1  christos 
   1382   1.1  christos   {
   1383   1.1  christos     BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
   1384   1.1  christos     CPU (h_cond) = opval;
   1385   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1386   1.1  christos   }
   1387   1.1  christos 
   1388   1.1  christos #undef FLD
   1389   1.1  christos }
   1390   1.1  christos   NEXT (vpc);
   1391   1.1  christos 
   1392   1.1  christos   CASE (sem, INSN_CMPEQ) : /* cmpeq $src1,$src2 */
   1393   1.1  christos {
   1394   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1395   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1396   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   1397   1.1  christos   int UNUSED written = 0;
   1398   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1399   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1400   1.1  christos 
   1401   1.1  christos   {
   1402   1.1  christos     BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
   1403   1.1  christos     CPU (h_cond) = opval;
   1404   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1405   1.1  christos   }
   1406   1.1  christos 
   1407   1.1  christos #undef FLD
   1408   1.1  christos }
   1409   1.1  christos   NEXT (vpc);
   1410   1.1  christos 
   1411   1.1  christos   CASE (sem, INSN_CMPZ) : /* cmpz $src2 */
   1412   1.1  christos {
   1413   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1414   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1415   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   1416   1.1  christos   int UNUSED written = 0;
   1417   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1418   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1419   1.1  christos 
   1420   1.1  christos   {
   1421   1.1  christos     BI opval = EQSI (* FLD (i_src2), 0);
   1422   1.1  christos     CPU (h_cond) = opval;
   1423   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   1424   1.1  christos   }
   1425   1.1  christos 
   1426   1.1  christos #undef FLD
   1427   1.1  christos }
   1428   1.1  christos   NEXT (vpc);
   1429   1.1  christos 
   1430   1.1  christos   CASE (sem, INSN_DIV) : /* div $dr,$sr */
   1431   1.1  christos {
   1432   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1433   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1434   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   1435   1.1  christos   int UNUSED written = 0;
   1436   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1437   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1438   1.1  christos 
   1439   1.1  christos if (NESI (* FLD (i_sr), 0)) {
   1440   1.1  christos   {
   1441   1.1  christos     SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
   1442   1.1  christos     * FLD (i_dr) = opval;
   1443   1.1  christos     written |= (1 << 2);
   1444   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1445   1.1  christos   }
   1446   1.1  christos }
   1447   1.1  christos 
   1448   1.1  christos   abuf->written = written;
   1449   1.1  christos #undef FLD
   1450   1.1  christos }
   1451   1.1  christos   NEXT (vpc);
   1452   1.1  christos 
   1453   1.1  christos   CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
   1454   1.1  christos {
   1455   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1456   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1457   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   1458   1.1  christos   int UNUSED written = 0;
   1459   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1460   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1461   1.1  christos 
   1462   1.1  christos if (NESI (* FLD (i_sr), 0)) {
   1463   1.1  christos   {
   1464   1.1  christos     SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
   1465   1.1  christos     * FLD (i_dr) = opval;
   1466   1.1  christos     written |= (1 << 2);
   1467   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1468   1.1  christos   }
   1469   1.1  christos }
   1470   1.1  christos 
   1471   1.1  christos   abuf->written = written;
   1472   1.1  christos #undef FLD
   1473   1.1  christos }
   1474   1.1  christos   NEXT (vpc);
   1475   1.1  christos 
   1476   1.1  christos   CASE (sem, INSN_REM) : /* rem $dr,$sr */
   1477   1.1  christos {
   1478   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1479   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1480   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   1481   1.1  christos   int UNUSED written = 0;
   1482   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1483   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1484   1.1  christos 
   1485   1.1  christos if (NESI (* FLD (i_sr), 0)) {
   1486   1.1  christos   {
   1487   1.1  christos     SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
   1488   1.1  christos     * FLD (i_dr) = opval;
   1489   1.1  christos     written |= (1 << 2);
   1490   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1491   1.1  christos   }
   1492   1.1  christos }
   1493   1.1  christos 
   1494   1.1  christos   abuf->written = written;
   1495   1.1  christos #undef FLD
   1496   1.1  christos }
   1497   1.1  christos   NEXT (vpc);
   1498   1.1  christos 
   1499   1.1  christos   CASE (sem, INSN_REMU) : /* remu $dr,$sr */
   1500   1.1  christos {
   1501   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1502   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1503   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   1504   1.1  christos   int UNUSED written = 0;
   1505   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1506   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1507   1.1  christos 
   1508   1.1  christos if (NESI (* FLD (i_sr), 0)) {
   1509   1.1  christos   {
   1510   1.1  christos     SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
   1511   1.1  christos     * FLD (i_dr) = opval;
   1512   1.1  christos     written |= (1 << 2);
   1513   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1514   1.1  christos   }
   1515   1.1  christos }
   1516   1.1  christos 
   1517   1.1  christos   abuf->written = written;
   1518   1.1  christos #undef FLD
   1519   1.1  christos }
   1520   1.1  christos   NEXT (vpc);
   1521   1.1  christos 
   1522   1.1  christos   CASE (sem, INSN_DIVH) : /* divh $dr,$sr */
   1523   1.1  christos {
   1524   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1525   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1526   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   1527   1.1  christos   int UNUSED written = 0;
   1528   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1529   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1530   1.1  christos 
   1531   1.1  christos if (NESI (* FLD (i_sr), 0)) {
   1532   1.1  christos   {
   1533   1.1  christos     SI opval = DIVSI (EXTHISI (TRUNCSIHI (* FLD (i_dr))), * FLD (i_sr));
   1534   1.1  christos     * FLD (i_dr) = opval;
   1535   1.1  christos     written |= (1 << 2);
   1536   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1537   1.1  christos   }
   1538   1.1  christos }
   1539   1.1  christos 
   1540   1.1  christos   abuf->written = written;
   1541   1.1  christos #undef FLD
   1542   1.1  christos }
   1543   1.1  christos   NEXT (vpc);
   1544   1.1  christos 
   1545   1.1  christos   CASE (sem, INSN_JC) : /* jc $sr */
   1546   1.1  christos {
   1547   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1548   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1549   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   1550   1.1  christos   int UNUSED written = 0;
   1551   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1552   1.1  christos   SEM_BRANCH_INIT
   1553   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1554   1.1  christos 
   1555   1.1  christos if (CPU (h_cond)) {
   1556   1.1  christos   {
   1557   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   1558   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   1559   1.1  christos     written |= (1 << 2);
   1560   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1561   1.1  christos   }
   1562   1.1  christos }
   1563   1.1  christos 
   1564   1.1  christos   abuf->written = written;
   1565   1.1  christos   SEM_BRANCH_FINI (vpc);
   1566   1.1  christos #undef FLD
   1567   1.1  christos }
   1568   1.1  christos   NEXT (vpc);
   1569   1.1  christos 
   1570   1.1  christos   CASE (sem, INSN_JNC) : /* jnc $sr */
   1571   1.1  christos {
   1572   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1573   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1574   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   1575   1.1  christos   int UNUSED written = 0;
   1576   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1577   1.1  christos   SEM_BRANCH_INIT
   1578   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1579   1.1  christos 
   1580   1.1  christos if (NOTBI (CPU (h_cond))) {
   1581   1.1  christos   {
   1582   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   1583   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   1584   1.1  christos     written |= (1 << 2);
   1585   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1586   1.1  christos   }
   1587   1.1  christos }
   1588   1.1  christos 
   1589   1.1  christos   abuf->written = written;
   1590   1.1  christos   SEM_BRANCH_FINI (vpc);
   1591   1.1  christos #undef FLD
   1592   1.1  christos }
   1593   1.1  christos   NEXT (vpc);
   1594   1.1  christos 
   1595   1.1  christos   CASE (sem, INSN_JL) : /* jl $sr */
   1596   1.1  christos {
   1597   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1598   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1599   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   1600   1.1  christos   int UNUSED written = 0;
   1601   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1602   1.1  christos   SEM_BRANCH_INIT
   1603   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1604   1.1  christos 
   1605   1.1  christos {
   1606   1.1  christos   SI temp0;USI temp1;
   1607   1.1  christos   temp0 = ADDSI (ANDSI (pc, -4), 4);
   1608   1.1  christos   temp1 = ANDSI (* FLD (i_sr), -4);
   1609   1.1  christos   {
   1610   1.1  christos     SI opval = temp0;
   1611   1.1  christos     CPU (h_gr[((UINT) 14)]) = opval;
   1612   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1613   1.1  christos   }
   1614   1.1  christos   {
   1615   1.1  christos     USI opval = temp1;
   1616   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   1617   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1618   1.1  christos   }
   1619   1.1  christos }
   1620   1.1  christos 
   1621   1.1  christos   SEM_BRANCH_FINI (vpc);
   1622   1.1  christos #undef FLD
   1623   1.1  christos }
   1624   1.1  christos   NEXT (vpc);
   1625   1.1  christos 
   1626   1.1  christos   CASE (sem, INSN_JMP) : /* jmp $sr */
   1627   1.1  christos {
   1628   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1629   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1630   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   1631   1.1  christos   int UNUSED written = 0;
   1632   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1633   1.1  christos   SEM_BRANCH_INIT
   1634   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1635   1.1  christos 
   1636   1.1  christos   {
   1637   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   1638   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   1639   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   1640   1.1  christos   }
   1641   1.1  christos 
   1642   1.1  christos   SEM_BRANCH_FINI (vpc);
   1643   1.1  christos #undef FLD
   1644   1.1  christos }
   1645   1.1  christos   NEXT (vpc);
   1646   1.1  christos 
   1647   1.1  christos   CASE (sem, INSN_LD) : /* ld $dr,@$sr */
   1648   1.1  christos {
   1649   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1650   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1651   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1652   1.1  christos   int UNUSED written = 0;
   1653   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1654   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1655   1.1  christos 
   1656   1.1  christos   {
   1657   1.1  christos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   1658   1.1  christos     * FLD (i_dr) = opval;
   1659   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1660   1.1  christos   }
   1661   1.1  christos 
   1662   1.1  christos #undef FLD
   1663   1.1  christos }
   1664   1.1  christos   NEXT (vpc);
   1665   1.1  christos 
   1666   1.1  christos   CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
   1667   1.1  christos {
   1668   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1669   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1670   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1671   1.1  christos   int UNUSED written = 0;
   1672   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1673   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1674   1.1  christos 
   1675   1.1  christos   {
   1676   1.1  christos     SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
   1677   1.1  christos     * FLD (i_dr) = opval;
   1678   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1679   1.1  christos   }
   1680   1.1  christos 
   1681   1.1  christos #undef FLD
   1682   1.1  christos }
   1683   1.1  christos   NEXT (vpc);
   1684   1.1  christos 
   1685   1.1  christos   CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
   1686   1.1  christos {
   1687   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1688   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1689   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1690   1.1  christos   int UNUSED written = 0;
   1691   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1692   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1693   1.1  christos 
   1694   1.1  christos   {
   1695   1.1  christos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
   1696   1.1  christos     * FLD (i_dr) = opval;
   1697   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1698   1.1  christos   }
   1699   1.1  christos 
   1700   1.1  christos #undef FLD
   1701   1.1  christos }
   1702   1.1  christos   NEXT (vpc);
   1703   1.1  christos 
   1704   1.1  christos   CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
   1705   1.1  christos {
   1706   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1707   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1708   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1709   1.1  christos   int UNUSED written = 0;
   1710   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1711   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1712   1.1  christos 
   1713   1.1  christos   {
   1714   1.1  christos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
   1715   1.1  christos     * FLD (i_dr) = opval;
   1716   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1717   1.1  christos   }
   1718   1.1  christos 
   1719   1.1  christos #undef FLD
   1720   1.1  christos }
   1721   1.1  christos   NEXT (vpc);
   1722   1.1  christos 
   1723   1.1  christos   CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
   1724   1.1  christos {
   1725   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1726   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1727   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1728   1.1  christos   int UNUSED written = 0;
   1729   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1730   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1731   1.1  christos 
   1732   1.1  christos   {
   1733   1.1  christos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
   1734   1.1  christos     * FLD (i_dr) = opval;
   1735   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1736   1.1  christos   }
   1737   1.1  christos 
   1738   1.1  christos #undef FLD
   1739   1.1  christos }
   1740   1.1  christos   NEXT (vpc);
   1741   1.1  christos 
   1742   1.1  christos   CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
   1743   1.1  christos {
   1744   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1745   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1746   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1747   1.1  christos   int UNUSED written = 0;
   1748   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1749   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1750   1.1  christos 
   1751   1.1  christos   {
   1752   1.1  christos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
   1753   1.1  christos     * FLD (i_dr) = opval;
   1754   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1755   1.1  christos   }
   1756   1.1  christos 
   1757   1.1  christos #undef FLD
   1758   1.1  christos }
   1759   1.1  christos   NEXT (vpc);
   1760   1.1  christos 
   1761   1.1  christos   CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
   1762   1.1  christos {
   1763   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1764   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1765   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1766   1.1  christos   int UNUSED written = 0;
   1767   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1768   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1769   1.1  christos 
   1770   1.1  christos   {
   1771   1.1  christos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
   1772   1.1  christos     * FLD (i_dr) = opval;
   1773   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1774   1.1  christos   }
   1775   1.1  christos 
   1776   1.1  christos #undef FLD
   1777   1.1  christos }
   1778   1.1  christos   NEXT (vpc);
   1779   1.1  christos 
   1780   1.1  christos   CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
   1781   1.1  christos {
   1782   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1783   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1784   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1785   1.1  christos   int UNUSED written = 0;
   1786   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1787   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1788   1.1  christos 
   1789   1.1  christos   {
   1790   1.1  christos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
   1791   1.1  christos     * FLD (i_dr) = opval;
   1792   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1793   1.1  christos   }
   1794   1.1  christos 
   1795   1.1  christos #undef FLD
   1796   1.1  christos }
   1797   1.1  christos   NEXT (vpc);
   1798   1.1  christos 
   1799   1.1  christos   CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
   1800   1.1  christos {
   1801   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1802   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1803   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1804   1.1  christos   int UNUSED written = 0;
   1805   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1806   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1807   1.1  christos 
   1808   1.1  christos   {
   1809   1.1  christos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
   1810   1.1  christos     * FLD (i_dr) = opval;
   1811   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1812   1.1  christos   }
   1813   1.1  christos 
   1814   1.1  christos #undef FLD
   1815   1.1  christos }
   1816   1.1  christos   NEXT (vpc);
   1817   1.1  christos 
   1818   1.1  christos   CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
   1819   1.1  christos {
   1820   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1821   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1822   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1823   1.1  christos   int UNUSED written = 0;
   1824   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1825   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1826   1.1  christos 
   1827   1.1  christos   {
   1828   1.1  christos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
   1829   1.1  christos     * FLD (i_dr) = opval;
   1830   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1831   1.1  christos   }
   1832   1.1  christos 
   1833   1.1  christos #undef FLD
   1834   1.1  christos }
   1835   1.1  christos   NEXT (vpc);
   1836   1.1  christos 
   1837   1.1  christos   CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
   1838   1.1  christos {
   1839   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1840   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1841   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1842   1.1  christos   int UNUSED written = 0;
   1843   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1844   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1845   1.1  christos 
   1846   1.1  christos {
   1847   1.1  christos   SI temp0;SI temp1;
   1848   1.1  christos   temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   1849   1.1  christos   temp1 = ADDSI (* FLD (i_sr), 4);
   1850   1.1  christos   {
   1851   1.1  christos     SI opval = temp0;
   1852   1.1  christos     * FLD (i_dr) = opval;
   1853   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1854   1.1  christos   }
   1855   1.1  christos   {
   1856   1.1  christos     SI opval = temp1;
   1857   1.1  christos     * FLD (i_sr) = opval;
   1858   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1859   1.1  christos   }
   1860   1.1  christos }
   1861   1.1  christos 
   1862   1.1  christos #undef FLD
   1863   1.1  christos }
   1864   1.1  christos   NEXT (vpc);
   1865   1.1  christos 
   1866   1.1  christos   CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
   1867   1.1  christos {
   1868   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1869   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1870   1.1  christos #define FLD(f) abuf->fields.sfmt_ld24.f
   1871   1.1  christos   int UNUSED written = 0;
   1872   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1873   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1874   1.1  christos 
   1875   1.1  christos   {
   1876   1.1  christos     SI opval = FLD (i_uimm24);
   1877   1.1  christos     * FLD (i_dr) = opval;
   1878   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1879   1.1  christos   }
   1880   1.1  christos 
   1881   1.1  christos #undef FLD
   1882   1.1  christos }
   1883   1.1  christos   NEXT (vpc);
   1884   1.1  christos 
   1885   1.1  christos   CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
   1886   1.1  christos {
   1887   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1888   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1889   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
   1890   1.1  christos   int UNUSED written = 0;
   1891   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1892   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1893   1.1  christos 
   1894   1.1  christos   {
   1895   1.1  christos     SI opval = FLD (f_simm8);
   1896   1.1  christos     * FLD (i_dr) = opval;
   1897   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1898   1.1  christos   }
   1899   1.1  christos 
   1900   1.1  christos #undef FLD
   1901   1.1  christos }
   1902   1.1  christos   NEXT (vpc);
   1903   1.1  christos 
   1904   1.1  christos   CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
   1905   1.1  christos {
   1906   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1907   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1908   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   1909   1.1  christos   int UNUSED written = 0;
   1910   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1911   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   1912   1.1  christos 
   1913   1.1  christos   {
   1914   1.1  christos     SI opval = FLD (f_simm16);
   1915   1.1  christos     * FLD (i_dr) = opval;
   1916   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1917   1.1  christos   }
   1918   1.1  christos 
   1919   1.1  christos #undef FLD
   1920   1.1  christos }
   1921   1.1  christos   NEXT (vpc);
   1922   1.1  christos 
   1923   1.1  christos   CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
   1924   1.1  christos {
   1925   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1926   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1927   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   1928   1.1  christos   int UNUSED written = 0;
   1929   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1930   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1931   1.1  christos 
   1932   1.1  christos {
   1933   1.1  christos   {
   1934   1.1  christos     BI opval = 1;
   1935   1.1  christos     CPU (h_lock) = opval;
   1936   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
   1937   1.1  christos   }
   1938   1.1  christos   {
   1939   1.1  christos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   1940   1.1  christos     * FLD (i_dr) = opval;
   1941   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   1942   1.1  christos   }
   1943   1.1  christos }
   1944   1.1  christos 
   1945   1.1  christos #undef FLD
   1946   1.1  christos }
   1947   1.1  christos   NEXT (vpc);
   1948   1.1  christos 
   1949   1.1  christos   CASE (sem, INSN_MACHI_A) : /* machi $src1,$src2,$acc */
   1950   1.1  christos {
   1951   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1952   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1953   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   1954   1.1  christos   int UNUSED written = 0;
   1955   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1956   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1957   1.1  christos 
   1958   1.1  christos   {
   1959   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
   1960   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   1961   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   1962   1.1  christos   }
   1963   1.1  christos 
   1964   1.1  christos #undef FLD
   1965   1.1  christos }
   1966   1.1  christos   NEXT (vpc);
   1967   1.1  christos 
   1968   1.1  christos   CASE (sem, INSN_MACLO_A) : /* maclo $src1,$src2,$acc */
   1969   1.1  christos {
   1970   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1971   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1972   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   1973   1.1  christos   int UNUSED written = 0;
   1974   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1975   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1976   1.1  christos 
   1977   1.1  christos   {
   1978   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
   1979   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   1980   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   1981   1.1  christos   }
   1982   1.1  christos 
   1983   1.1  christos #undef FLD
   1984   1.1  christos }
   1985   1.1  christos   NEXT (vpc);
   1986   1.1  christos 
   1987   1.1  christos   CASE (sem, INSN_MACWHI_A) : /* macwhi $src1,$src2,$acc */
   1988   1.1  christos {
   1989   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   1990   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   1991   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   1992   1.1  christos   int UNUSED written = 0;
   1993   1.1  christos   IADDR UNUSED pc = abuf->addr;
   1994   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   1995   1.1  christos 
   1996   1.1  christos   {
   1997   1.1  christos     DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
   1998   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   1999   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2000   1.1  christos   }
   2001   1.1  christos 
   2002   1.1  christos #undef FLD
   2003   1.1  christos }
   2004   1.1  christos   NEXT (vpc);
   2005   1.1  christos 
   2006   1.1  christos   CASE (sem, INSN_MACWLO_A) : /* macwlo $src1,$src2,$acc */
   2007   1.1  christos {
   2008   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2009   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2010   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   2011   1.1  christos   int UNUSED written = 0;
   2012   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2013   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2014   1.1  christos 
   2015   1.1  christos   {
   2016   1.1  christos     DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
   2017   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   2018   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2019   1.1  christos   }
   2020   1.1  christos 
   2021   1.1  christos #undef FLD
   2022   1.1  christos }
   2023   1.1  christos   NEXT (vpc);
   2024   1.1  christos 
   2025   1.1  christos   CASE (sem, INSN_MUL) : /* mul $dr,$sr */
   2026   1.1  christos {
   2027   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2028   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2029   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2030   1.1  christos   int UNUSED written = 0;
   2031   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2032   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2033   1.1  christos 
   2034   1.1  christos   {
   2035   1.1  christos     SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
   2036   1.1  christos     * FLD (i_dr) = opval;
   2037   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2038   1.1  christos   }
   2039   1.1  christos 
   2040   1.1  christos #undef FLD
   2041   1.1  christos }
   2042   1.1  christos   NEXT (vpc);
   2043   1.1  christos 
   2044   1.1  christos   CASE (sem, INSN_MULHI_A) : /* mulhi $src1,$src2,$acc */
   2045   1.1  christos {
   2046   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2047   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2048   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   2049   1.1  christos   int UNUSED written = 0;
   2050   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2051   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2052   1.1  christos 
   2053   1.1  christos   {
   2054   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
   2055   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   2056   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2057   1.1  christos   }
   2058   1.1  christos 
   2059   1.1  christos #undef FLD
   2060   1.1  christos }
   2061   1.1  christos   NEXT (vpc);
   2062   1.1  christos 
   2063   1.1  christos   CASE (sem, INSN_MULLO_A) : /* mullo $src1,$src2,$acc */
   2064   1.1  christos {
   2065   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2066   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2067   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   2068   1.1  christos   int UNUSED written = 0;
   2069   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2070   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2071   1.1  christos 
   2072   1.1  christos   {
   2073   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
   2074   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   2075   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2076   1.1  christos   }
   2077   1.1  christos 
   2078   1.1  christos #undef FLD
   2079   1.1  christos }
   2080   1.1  christos   NEXT (vpc);
   2081   1.1  christos 
   2082   1.1  christos   CASE (sem, INSN_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
   2083   1.1  christos {
   2084   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2085   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2086   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   2087   1.1  christos   int UNUSED written = 0;
   2088   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2089   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2090   1.1  christos 
   2091   1.1  christos   {
   2092   1.1  christos     DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
   2093   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   2094   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2095   1.1  christos   }
   2096   1.1  christos 
   2097   1.1  christos #undef FLD
   2098   1.1  christos }
   2099   1.1  christos   NEXT (vpc);
   2100   1.1  christos 
   2101   1.1  christos   CASE (sem, INSN_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
   2102   1.1  christos {
   2103   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2104   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2105   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   2106   1.1  christos   int UNUSED written = 0;
   2107   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2108   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2109   1.1  christos 
   2110   1.1  christos   {
   2111   1.1  christos     DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
   2112   1.1  christos     SET_H_ACCUMS (FLD (f_acc), opval);
   2113   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2114   1.1  christos   }
   2115   1.1  christos 
   2116   1.1  christos #undef FLD
   2117   1.1  christos }
   2118   1.1  christos   NEXT (vpc);
   2119   1.1  christos 
   2120   1.1  christos   CASE (sem, INSN_MV) : /* mv $dr,$sr */
   2121   1.1  christos {
   2122   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2123   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2124   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2125   1.1  christos   int UNUSED written = 0;
   2126   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2127   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2128   1.1  christos 
   2129   1.1  christos   {
   2130   1.1  christos     SI opval = * FLD (i_sr);
   2131   1.1  christos     * FLD (i_dr) = opval;
   2132   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2133   1.1  christos   }
   2134   1.1  christos 
   2135   1.1  christos #undef FLD
   2136   1.1  christos }
   2137   1.1  christos   NEXT (vpc);
   2138   1.1  christos 
   2139   1.1  christos   CASE (sem, INSN_MVFACHI_A) : /* mvfachi $dr,$accs */
   2140   1.1  christos {
   2141   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2142   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2143   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   2144   1.1  christos   int UNUSED written = 0;
   2145   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2146   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2147   1.1  christos 
   2148   1.1  christos   {
   2149   1.1  christos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
   2150   1.1  christos     * FLD (i_dr) = opval;
   2151   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2152   1.1  christos   }
   2153   1.1  christos 
   2154   1.1  christos #undef FLD
   2155   1.1  christos }
   2156   1.1  christos   NEXT (vpc);
   2157   1.1  christos 
   2158   1.1  christos   CASE (sem, INSN_MVFACLO_A) : /* mvfaclo $dr,$accs */
   2159   1.1  christos {
   2160   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2161   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2162   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   2163   1.1  christos   int UNUSED written = 0;
   2164   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2165   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2166   1.1  christos 
   2167   1.1  christos   {
   2168   1.1  christos     SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
   2169   1.1  christos     * FLD (i_dr) = opval;
   2170   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2171   1.1  christos   }
   2172   1.1  christos 
   2173   1.1  christos #undef FLD
   2174   1.1  christos }
   2175   1.1  christos   NEXT (vpc);
   2176   1.1  christos 
   2177   1.1  christos   CASE (sem, INSN_MVFACMI_A) : /* mvfacmi $dr,$accs */
   2178   1.1  christos {
   2179   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2180   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2181   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   2182   1.1  christos   int UNUSED written = 0;
   2183   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2184   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2185   1.1  christos 
   2186   1.1  christos   {
   2187   1.1  christos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
   2188   1.1  christos     * FLD (i_dr) = opval;
   2189   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2190   1.1  christos   }
   2191   1.1  christos 
   2192   1.1  christos #undef FLD
   2193   1.1  christos }
   2194   1.1  christos   NEXT (vpc);
   2195   1.1  christos 
   2196   1.1  christos   CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
   2197   1.1  christos {
   2198   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2199   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2200   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2201   1.1  christos   int UNUSED written = 0;
   2202   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2203   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2204   1.1  christos 
   2205   1.1  christos   {
   2206   1.1  christos     SI opval = GET_H_CR (FLD (f_r2));
   2207   1.1  christos     * FLD (i_dr) = opval;
   2208   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2209   1.1  christos   }
   2210   1.1  christos 
   2211   1.1  christos #undef FLD
   2212   1.1  christos }
   2213   1.1  christos   NEXT (vpc);
   2214   1.1  christos 
   2215   1.1  christos   CASE (sem, INSN_MVTACHI_A) : /* mvtachi $src1,$accs */
   2216   1.1  christos {
   2217   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2218   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2219   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   2220   1.1  christos   int UNUSED written = 0;
   2221   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2222   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2223   1.1  christos 
   2224   1.1  christos   {
   2225   1.1  christos     DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
   2226   1.1  christos     SET_H_ACCUMS (FLD (f_accs), opval);
   2227   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2228   1.1  christos   }
   2229   1.1  christos 
   2230   1.1  christos #undef FLD
   2231   1.1  christos }
   2232   1.1  christos   NEXT (vpc);
   2233   1.1  christos 
   2234   1.1  christos   CASE (sem, INSN_MVTACLO_A) : /* mvtaclo $src1,$accs */
   2235   1.1  christos {
   2236   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2237   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2238   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   2239   1.1  christos   int UNUSED written = 0;
   2240   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2241   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2242   1.1  christos 
   2243   1.1  christos   {
   2244   1.1  christos     DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
   2245   1.1  christos     SET_H_ACCUMS (FLD (f_accs), opval);
   2246   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2247   1.1  christos   }
   2248   1.1  christos 
   2249   1.1  christos #undef FLD
   2250   1.1  christos }
   2251   1.1  christos   NEXT (vpc);
   2252   1.1  christos 
   2253   1.1  christos   CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
   2254   1.1  christos {
   2255   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2256   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2257   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2258   1.1  christos   int UNUSED written = 0;
   2259   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2260   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2261   1.1  christos 
   2262   1.1  christos   {
   2263   1.1  christos     USI opval = * FLD (i_sr);
   2264   1.1  christos     SET_H_CR (FLD (f_r1), opval);
   2265   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   2266   1.1  christos   }
   2267   1.1  christos 
   2268   1.1  christos #undef FLD
   2269   1.1  christos }
   2270   1.1  christos   NEXT (vpc);
   2271   1.1  christos 
   2272   1.1  christos   CASE (sem, INSN_NEG) : /* neg $dr,$sr */
   2273   1.1  christos {
   2274   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2275   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2276   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2277   1.1  christos   int UNUSED written = 0;
   2278   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2279   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2280   1.1  christos 
   2281   1.1  christos   {
   2282   1.1  christos     SI opval = NEGSI (* FLD (i_sr));
   2283   1.1  christos     * FLD (i_dr) = opval;
   2284   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2285   1.1  christos   }
   2286   1.1  christos 
   2287   1.1  christos #undef FLD
   2288   1.1  christos }
   2289   1.1  christos   NEXT (vpc);
   2290   1.1  christos 
   2291   1.1  christos   CASE (sem, INSN_NOP) : /* nop */
   2292   1.1  christos {
   2293   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2294   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2295   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   2296   1.1  christos   int UNUSED written = 0;
   2297   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2298   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2299   1.1  christos 
   2300   1.1  christos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
   2301   1.1  christos 
   2302   1.1  christos #undef FLD
   2303   1.1  christos }
   2304   1.1  christos   NEXT (vpc);
   2305   1.1  christos 
   2306   1.1  christos   CASE (sem, INSN_NOT) : /* not $dr,$sr */
   2307   1.1  christos {
   2308   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2309   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2310   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2311   1.1  christos   int UNUSED written = 0;
   2312   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2313   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2314   1.1  christos 
   2315   1.1  christos   {
   2316   1.1  christos     SI opval = INVSI (* FLD (i_sr));
   2317   1.1  christos     * FLD (i_dr) = opval;
   2318   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2319   1.1  christos   }
   2320   1.1  christos 
   2321   1.1  christos #undef FLD
   2322   1.1  christos }
   2323   1.1  christos   NEXT (vpc);
   2324   1.1  christos 
   2325   1.1  christos   CASE (sem, INSN_RAC_DSI) : /* rac $accd,$accs,$imm1 */
   2326   1.1  christos {
   2327   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2328   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2329   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   2330   1.1  christos   int UNUSED written = 0;
   2331   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2332   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2333   1.1  christos 
   2334   1.1  christos {
   2335   1.1  christos   DI tmp_tmp1;
   2336   1.1  christos   tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
   2337   1.1  christos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
   2338   1.1  christos   {
   2339   1.1  christos     DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
   2340   1.1  christos     SET_H_ACCUMS (FLD (f_accd), opval);
   2341   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2342   1.1  christos   }
   2343   1.1  christos }
   2344   1.1  christos 
   2345   1.1  christos #undef FLD
   2346   1.1  christos }
   2347   1.1  christos   NEXT (vpc);
   2348   1.1  christos 
   2349   1.1  christos   CASE (sem, INSN_RACH_DSI) : /* rach $accd,$accs,$imm1 */
   2350   1.1  christos {
   2351   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2352   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2353   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   2354   1.1  christos   int UNUSED written = 0;
   2355   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2356   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2357   1.1  christos 
   2358   1.1  christos {
   2359   1.1  christos   DI tmp_tmp1;
   2360   1.1  christos   tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
   2361   1.1  christos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
   2362   1.1  christos   {
   2363   1.1  christos     DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
   2364   1.1  christos     SET_H_ACCUMS (FLD (f_accd), opval);
   2365   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   2366   1.1  christos   }
   2367   1.1  christos }
   2368   1.1  christos 
   2369   1.1  christos #undef FLD
   2370   1.1  christos }
   2371   1.1  christos   NEXT (vpc);
   2372   1.1  christos 
   2373   1.1  christos   CASE (sem, INSN_RTE) : /* rte */
   2374   1.1  christos {
   2375   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2376   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2377   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   2378   1.1  christos   int UNUSED written = 0;
   2379   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2380   1.1  christos   SEM_BRANCH_INIT
   2381   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2382   1.1  christos 
   2383   1.1  christos {
   2384   1.1  christos   {
   2385   1.1  christos     USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
   2386   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   2387   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   2388   1.1  christos   }
   2389   1.1  christos   {
   2390   1.1  christos     USI opval = GET_H_CR (((UINT) 14));
   2391   1.1  christos     SET_H_CR (((UINT) 6), opval);
   2392   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   2393   1.1  christos   }
   2394   1.1  christos   {
   2395   1.1  christos     UQI opval = CPU (h_bpsw);
   2396   1.1  christos     SET_H_PSW (opval);
   2397   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
   2398   1.1  christos   }
   2399   1.1  christos   {
   2400   1.1  christos     UQI opval = CPU (h_bbpsw);
   2401   1.1  christos     CPU (h_bpsw) = opval;
   2402   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
   2403   1.1  christos   }
   2404   1.1  christos }
   2405   1.1  christos 
   2406   1.1  christos   SEM_BRANCH_FINI (vpc);
   2407   1.1  christos #undef FLD
   2408   1.1  christos }
   2409   1.1  christos   NEXT (vpc);
   2410   1.1  christos 
   2411   1.1  christos   CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
   2412   1.1  christos {
   2413   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2414   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2415   1.1  christos #define FLD(f) abuf->fields.sfmt_seth.f
   2416   1.1  christos   int UNUSED written = 0;
   2417   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2418   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2419   1.1  christos 
   2420   1.1  christos   {
   2421   1.1  christos     SI opval = SLLSI (FLD (f_hi16), 16);
   2422   1.1  christos     * FLD (i_dr) = opval;
   2423   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2424   1.1  christos   }
   2425   1.1  christos 
   2426   1.1  christos #undef FLD
   2427   1.1  christos }
   2428   1.1  christos   NEXT (vpc);
   2429   1.1  christos 
   2430   1.1  christos   CASE (sem, INSN_SLL) : /* sll $dr,$sr */
   2431   1.1  christos {
   2432   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2433   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2434   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2435   1.1  christos   int UNUSED written = 0;
   2436   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2437   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2438   1.1  christos 
   2439   1.1  christos   {
   2440   1.1  christos     SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   2441   1.1  christos     * FLD (i_dr) = opval;
   2442   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2443   1.1  christos   }
   2444   1.1  christos 
   2445   1.1  christos #undef FLD
   2446   1.1  christos }
   2447   1.1  christos   NEXT (vpc);
   2448   1.1  christos 
   2449   1.1  christos   CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
   2450   1.1  christos {
   2451   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2452   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2453   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   2454   1.1  christos   int UNUSED written = 0;
   2455   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2456   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2457   1.1  christos 
   2458   1.1  christos   {
   2459   1.1  christos     SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
   2460   1.1  christos     * FLD (i_dr) = opval;
   2461   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2462   1.1  christos   }
   2463   1.1  christos 
   2464   1.1  christos #undef FLD
   2465   1.1  christos }
   2466   1.1  christos   NEXT (vpc);
   2467   1.1  christos 
   2468   1.1  christos   CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
   2469   1.1  christos {
   2470   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2471   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2472   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   2473   1.1  christos   int UNUSED written = 0;
   2474   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2475   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2476   1.1  christos 
   2477   1.1  christos   {
   2478   1.1  christos     SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
   2479   1.1  christos     * FLD (i_dr) = opval;
   2480   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2481   1.1  christos   }
   2482   1.1  christos 
   2483   1.1  christos #undef FLD
   2484   1.1  christos }
   2485   1.1  christos   NEXT (vpc);
   2486   1.1  christos 
   2487   1.1  christos   CASE (sem, INSN_SRA) : /* sra $dr,$sr */
   2488   1.1  christos {
   2489   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2490   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2491   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2492   1.1  christos   int UNUSED written = 0;
   2493   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2494   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2495   1.1  christos 
   2496   1.1  christos   {
   2497   1.1  christos     SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   2498   1.1  christos     * FLD (i_dr) = opval;
   2499   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2500   1.1  christos   }
   2501   1.1  christos 
   2502   1.1  christos #undef FLD
   2503   1.1  christos }
   2504   1.1  christos   NEXT (vpc);
   2505   1.1  christos 
   2506   1.1  christos   CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
   2507   1.1  christos {
   2508   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2509   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2510   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   2511   1.1  christos   int UNUSED written = 0;
   2512   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2513   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2514   1.1  christos 
   2515   1.1  christos   {
   2516   1.1  christos     SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
   2517   1.1  christos     * FLD (i_dr) = opval;
   2518   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2519   1.1  christos   }
   2520   1.1  christos 
   2521   1.1  christos #undef FLD
   2522   1.1  christos }
   2523   1.1  christos   NEXT (vpc);
   2524   1.1  christos 
   2525   1.1  christos   CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
   2526   1.1  christos {
   2527   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2528   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2529   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   2530   1.1  christos   int UNUSED written = 0;
   2531   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2532   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2533   1.1  christos 
   2534   1.1  christos   {
   2535   1.1  christos     SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
   2536   1.1  christos     * FLD (i_dr) = opval;
   2537   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2538   1.1  christos   }
   2539   1.1  christos 
   2540   1.1  christos #undef FLD
   2541   1.1  christos }
   2542   1.1  christos   NEXT (vpc);
   2543   1.1  christos 
   2544   1.1  christos   CASE (sem, INSN_SRL) : /* srl $dr,$sr */
   2545   1.1  christos {
   2546   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2547   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2548   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2549   1.1  christos   int UNUSED written = 0;
   2550   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2551   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2552   1.1  christos 
   2553   1.1  christos   {
   2554   1.1  christos     SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   2555   1.1  christos     * FLD (i_dr) = opval;
   2556   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2557   1.1  christos   }
   2558   1.1  christos 
   2559   1.1  christos #undef FLD
   2560   1.1  christos }
   2561   1.1  christos   NEXT (vpc);
   2562   1.1  christos 
   2563   1.1  christos   CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
   2564   1.1  christos {
   2565   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2566   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2567   1.1  christos #define FLD(f) abuf->fields.sfmt_add3.f
   2568   1.1  christos   int UNUSED written = 0;
   2569   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2570   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2571   1.1  christos 
   2572   1.1  christos   {
   2573   1.1  christos     SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
   2574   1.1  christos     * FLD (i_dr) = opval;
   2575   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2576   1.1  christos   }
   2577   1.1  christos 
   2578   1.1  christos #undef FLD
   2579   1.1  christos }
   2580   1.1  christos   NEXT (vpc);
   2581   1.1  christos 
   2582   1.1  christos   CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
   2583   1.1  christos {
   2584   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2585   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2586   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   2587   1.1  christos   int UNUSED written = 0;
   2588   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2589   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2590   1.1  christos 
   2591   1.1  christos   {
   2592   1.1  christos     SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
   2593   1.1  christos     * FLD (i_dr) = opval;
   2594   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2595   1.1  christos   }
   2596   1.1  christos 
   2597   1.1  christos #undef FLD
   2598   1.1  christos }
   2599   1.1  christos   NEXT (vpc);
   2600   1.1  christos 
   2601   1.1  christos   CASE (sem, INSN_ST) : /* st $src1,@$src2 */
   2602   1.1  christos {
   2603   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2604   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2605   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2606   1.1  christos   int UNUSED written = 0;
   2607   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2608   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2609   1.1  christos 
   2610   1.1  christos   {
   2611   1.1  christos     SI opval = * FLD (i_src1);
   2612   1.1  christos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
   2613   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2614   1.1  christos   }
   2615   1.1  christos 
   2616   1.1  christos #undef FLD
   2617   1.1  christos }
   2618   1.1  christos   NEXT (vpc);
   2619   1.1  christos 
   2620   1.1  christos   CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
   2621   1.1  christos {
   2622   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2623   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2624   1.1  christos #define FLD(f) abuf->fields.sfmt_st_d.f
   2625   1.1  christos   int UNUSED written = 0;
   2626   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2627   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2628   1.1  christos 
   2629   1.1  christos   {
   2630   1.1  christos     SI opval = * FLD (i_src1);
   2631   1.1  christos     SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
   2632   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2633   1.1  christos   }
   2634   1.1  christos 
   2635   1.1  christos #undef FLD
   2636   1.1  christos }
   2637   1.1  christos   NEXT (vpc);
   2638   1.1  christos 
   2639   1.1  christos   CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
   2640   1.1  christos {
   2641   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2642   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2643   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2644   1.1  christos   int UNUSED written = 0;
   2645   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2646   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2647   1.1  christos 
   2648   1.1  christos   {
   2649   1.1  christos     QI opval = * FLD (i_src1);
   2650   1.1  christos     SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
   2651   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2652   1.1  christos   }
   2653   1.1  christos 
   2654   1.1  christos #undef FLD
   2655   1.1  christos }
   2656   1.1  christos   NEXT (vpc);
   2657   1.1  christos 
   2658   1.1  christos   CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
   2659   1.1  christos {
   2660   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2661   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2662   1.1  christos #define FLD(f) abuf->fields.sfmt_st_d.f
   2663   1.1  christos   int UNUSED written = 0;
   2664   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2665   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2666   1.1  christos 
   2667   1.1  christos   {
   2668   1.1  christos     QI opval = * FLD (i_src1);
   2669   1.1  christos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
   2670   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2671   1.1  christos   }
   2672   1.1  christos 
   2673   1.1  christos #undef FLD
   2674   1.1  christos }
   2675   1.1  christos   NEXT (vpc);
   2676   1.1  christos 
   2677   1.1  christos   CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
   2678   1.1  christos {
   2679   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2680   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2681   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2682   1.1  christos   int UNUSED written = 0;
   2683   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2684   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2685   1.1  christos 
   2686   1.1  christos   {
   2687   1.1  christos     HI opval = * FLD (i_src1);
   2688   1.1  christos     SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
   2689   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2690   1.1  christos   }
   2691   1.1  christos 
   2692   1.1  christos #undef FLD
   2693   1.1  christos }
   2694   1.1  christos   NEXT (vpc);
   2695   1.1  christos 
   2696   1.1  christos   CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
   2697   1.1  christos {
   2698   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2699   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2700   1.1  christos #define FLD(f) abuf->fields.sfmt_st_d.f
   2701   1.1  christos   int UNUSED written = 0;
   2702   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2703   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2704   1.1  christos 
   2705   1.1  christos   {
   2706   1.1  christos     HI opval = * FLD (i_src1);
   2707   1.1  christos     SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
   2708   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2709   1.1  christos   }
   2710   1.1  christos 
   2711   1.1  christos #undef FLD
   2712   1.1  christos }
   2713   1.1  christos   NEXT (vpc);
   2714   1.1  christos 
   2715   1.1  christos   CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
   2716   1.1  christos {
   2717   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2718   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2719   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2720   1.1  christos   int UNUSED written = 0;
   2721   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2722   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2723   1.1  christos 
   2724   1.1  christos {
   2725   1.1  christos   SI tmp_new_src2;
   2726   1.1  christos   tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
   2727   1.1  christos   {
   2728   1.1  christos     SI opval = * FLD (i_src1);
   2729   1.1  christos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
   2730   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2731   1.1  christos   }
   2732   1.1  christos   {
   2733   1.1  christos     SI opval = tmp_new_src2;
   2734   1.1  christos     * FLD (i_src2) = opval;
   2735   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2736   1.1  christos   }
   2737   1.1  christos }
   2738   1.1  christos 
   2739   1.1  christos #undef FLD
   2740   1.1  christos }
   2741   1.1  christos   NEXT (vpc);
   2742   1.1  christos 
   2743   1.1  christos   CASE (sem, INSN_STH_PLUS) : /* sth $src1,@$src2+ */
   2744   1.1  christos {
   2745   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2746   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2747   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2748   1.1  christos   int UNUSED written = 0;
   2749   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2750   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2751   1.1  christos 
   2752   1.1  christos {
   2753   1.1  christos   SI tmp_new_src2;
   2754   1.1  christos   tmp_new_src2 = * FLD (i_src2);
   2755   1.1  christos   {
   2756   1.1  christos     HI opval = * FLD (i_src1);
   2757   1.1  christos     SETMEMHI (current_cpu, pc, tmp_new_src2, opval);
   2758   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2759   1.1  christos   }
   2760   1.1  christos   {
   2761   1.1  christos     SI opval = ADDSI (tmp_new_src2, 2);
   2762   1.1  christos     * FLD (i_src2) = opval;
   2763   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2764   1.1  christos   }
   2765   1.1  christos }
   2766   1.1  christos 
   2767   1.1  christos #undef FLD
   2768   1.1  christos }
   2769   1.1  christos   NEXT (vpc);
   2770   1.1  christos 
   2771   1.1  christos   CASE (sem, INSN_STB_PLUS) : /* stb $src1,@$src2+ */
   2772   1.1  christos {
   2773   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2774   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2775   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2776   1.1  christos   int UNUSED written = 0;
   2777   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2778   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2779   1.1  christos 
   2780   1.1  christos {
   2781   1.1  christos   SI tmp_new_src2;
   2782   1.1  christos   tmp_new_src2 = * FLD (i_src2);
   2783   1.1  christos   {
   2784   1.1  christos     QI opval = * FLD (i_src1);
   2785   1.1  christos     SETMEMQI (current_cpu, pc, tmp_new_src2, opval);
   2786   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2787   1.1  christos   }
   2788   1.1  christos   {
   2789   1.1  christos     SI opval = ADDSI (tmp_new_src2, 1);
   2790   1.1  christos     * FLD (i_src2) = opval;
   2791   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2792   1.1  christos   }
   2793   1.1  christos }
   2794   1.1  christos 
   2795   1.1  christos #undef FLD
   2796   1.1  christos }
   2797   1.1  christos   NEXT (vpc);
   2798   1.1  christos 
   2799   1.1  christos   CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
   2800   1.1  christos {
   2801   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2802   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2803   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2804   1.1  christos   int UNUSED written = 0;
   2805   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2806   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2807   1.1  christos 
   2808   1.1  christos {
   2809   1.1  christos   SI tmp_new_src2;
   2810   1.1  christos   tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
   2811   1.1  christos   {
   2812   1.1  christos     SI opval = * FLD (i_src1);
   2813   1.1  christos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
   2814   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2815   1.1  christos   }
   2816   1.1  christos   {
   2817   1.1  christos     SI opval = tmp_new_src2;
   2818   1.1  christos     * FLD (i_src2) = opval;
   2819   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2820   1.1  christos   }
   2821   1.1  christos }
   2822   1.1  christos 
   2823   1.1  christos #undef FLD
   2824   1.1  christos }
   2825   1.1  christos   NEXT (vpc);
   2826   1.1  christos 
   2827   1.1  christos   CASE (sem, INSN_SUB) : /* sub $dr,$sr */
   2828   1.1  christos {
   2829   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2830   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2831   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2832   1.1  christos   int UNUSED written = 0;
   2833   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2834   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2835   1.1  christos 
   2836   1.1  christos   {
   2837   1.1  christos     SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
   2838   1.1  christos     * FLD (i_dr) = opval;
   2839   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2840   1.1  christos   }
   2841   1.1  christos 
   2842   1.1  christos #undef FLD
   2843   1.1  christos }
   2844   1.1  christos   NEXT (vpc);
   2845   1.1  christos 
   2846   1.1  christos   CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
   2847   1.1  christos {
   2848   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2849   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2850   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2851   1.1  christos   int UNUSED written = 0;
   2852   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2853   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2854   1.1  christos 
   2855   1.1  christos {
   2856   1.1  christos   SI temp0;BI temp1;
   2857   1.1  christos   temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
   2858   1.1  christos   temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
   2859   1.1  christos   {
   2860   1.1  christos     SI opval = temp0;
   2861   1.1  christos     * FLD (i_dr) = opval;
   2862   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2863   1.1  christos   }
   2864   1.1  christos   {
   2865   1.1  christos     BI opval = temp1;
   2866   1.1  christos     CPU (h_cond) = opval;
   2867   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   2868   1.1  christos   }
   2869   1.1  christos }
   2870   1.1  christos 
   2871   1.1  christos #undef FLD
   2872   1.1  christos }
   2873   1.1  christos   NEXT (vpc);
   2874   1.1  christos 
   2875   1.1  christos   CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
   2876   1.1  christos {
   2877   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2878   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2879   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   2880   1.1  christos   int UNUSED written = 0;
   2881   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2882   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2883   1.1  christos 
   2884   1.1  christos {
   2885   1.1  christos   SI temp0;BI temp1;
   2886   1.1  christos   temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   2887   1.1  christos   temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   2888   1.1  christos   {
   2889   1.1  christos     SI opval = temp0;
   2890   1.1  christos     * FLD (i_dr) = opval;
   2891   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2892   1.1  christos   }
   2893   1.1  christos   {
   2894   1.1  christos     BI opval = temp1;
   2895   1.1  christos     CPU (h_cond) = opval;
   2896   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   2897   1.1  christos   }
   2898   1.1  christos }
   2899   1.1  christos 
   2900   1.1  christos #undef FLD
   2901   1.1  christos }
   2902   1.1  christos   NEXT (vpc);
   2903   1.1  christos 
   2904   1.1  christos   CASE (sem, INSN_TRAP) : /* trap $uimm4 */
   2905   1.1  christos {
   2906   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2907   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2908   1.1  christos #define FLD(f) abuf->fields.sfmt_trap.f
   2909   1.1  christos   int UNUSED written = 0;
   2910   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2911   1.1  christos   SEM_BRANCH_INIT
   2912   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2913   1.1  christos 
   2914   1.1  christos {
   2915   1.1  christos   {
   2916   1.1  christos     USI opval = GET_H_CR (((UINT) 6));
   2917   1.1  christos     SET_H_CR (((UINT) 14), opval);
   2918   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   2919   1.1  christos   }
   2920   1.1  christos   {
   2921   1.1  christos     USI opval = ADDSI (pc, 4);
   2922   1.1  christos     SET_H_CR (((UINT) 6), opval);
   2923   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   2924   1.1  christos   }
   2925   1.1  christos   {
   2926   1.1  christos     UQI opval = CPU (h_bpsw);
   2927   1.1  christos     CPU (h_bbpsw) = opval;
   2928   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
   2929   1.1  christos   }
   2930   1.1  christos   {
   2931   1.1  christos     UQI opval = GET_H_PSW ();
   2932   1.1  christos     CPU (h_bpsw) = opval;
   2933   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
   2934   1.1  christos   }
   2935   1.1  christos   {
   2936   1.1  christos     UQI opval = ANDQI (GET_H_PSW (), 128);
   2937   1.1  christos     SET_H_PSW (opval);
   2938   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
   2939   1.1  christos   }
   2940   1.1  christos   {
   2941   1.1  christos     SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
   2942   1.1  christos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
   2943   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   2944   1.1  christos   }
   2945   1.1  christos }
   2946   1.1  christos 
   2947   1.1  christos   SEM_BRANCH_FINI (vpc);
   2948   1.1  christos #undef FLD
   2949   1.1  christos }
   2950   1.1  christos   NEXT (vpc);
   2951   1.1  christos 
   2952   1.1  christos   CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
   2953   1.1  christos {
   2954   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2955   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2956   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   2957   1.1  christos   int UNUSED written = 0;
   2958   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2959   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   2960   1.1  christos 
   2961   1.1  christos {
   2962   1.1  christos if (CPU (h_lock)) {
   2963   1.1  christos   {
   2964   1.1  christos     SI opval = * FLD (i_src1);
   2965   1.1  christos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
   2966   1.1  christos     written |= (1 << 4);
   2967   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   2968   1.1  christos   }
   2969   1.1  christos }
   2970   1.1  christos   {
   2971   1.1  christos     BI opval = 0;
   2972   1.1  christos     CPU (h_lock) = opval;
   2973   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
   2974   1.1  christos   }
   2975   1.1  christos }
   2976   1.1  christos 
   2977   1.1  christos   abuf->written = written;
   2978   1.1  christos #undef FLD
   2979   1.1  christos }
   2980   1.1  christos   NEXT (vpc);
   2981   1.1  christos 
   2982   1.1  christos   CASE (sem, INSN_SATB) : /* satb $dr,$sr */
   2983   1.1  christos {
   2984   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   2985   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   2986   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   2987   1.1  christos   int UNUSED written = 0;
   2988   1.1  christos   IADDR UNUSED pc = abuf->addr;
   2989   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   2990   1.1  christos 
   2991   1.1  christos   {
   2992   1.1  christos     SI opval = (GESI (* FLD (i_sr), 127)) ? (127) : (LESI (* FLD (i_sr), -128)) ? (-128) : (* FLD (i_sr));
   2993   1.1  christos     * FLD (i_dr) = opval;
   2994   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   2995   1.1  christos   }
   2996   1.1  christos 
   2997   1.1  christos #undef FLD
   2998   1.1  christos }
   2999   1.1  christos   NEXT (vpc);
   3000   1.1  christos 
   3001   1.1  christos   CASE (sem, INSN_SATH) : /* sath $dr,$sr */
   3002   1.1  christos {
   3003   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3004   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3005   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   3006   1.1  christos   int UNUSED written = 0;
   3007   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3008   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   3009   1.1  christos 
   3010   1.1  christos   {
   3011   1.1  christos     SI opval = (GESI (* FLD (i_sr), 32767)) ? (32767) : (LESI (* FLD (i_sr), -32768)) ? (-32768) : (* FLD (i_sr));
   3012   1.1  christos     * FLD (i_dr) = opval;
   3013   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3014   1.1  christos   }
   3015   1.1  christos 
   3016   1.1  christos #undef FLD
   3017   1.1  christos }
   3018   1.1  christos   NEXT (vpc);
   3019   1.1  christos 
   3020   1.1  christos   CASE (sem, INSN_SAT) : /* sat $dr,$sr */
   3021   1.1  christos {
   3022   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3023   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3024   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   3025   1.1  christos   int UNUSED written = 0;
   3026   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3027   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   3028   1.1  christos 
   3029   1.1  christos   {
   3030   1.1  christos     SI opval = ((CPU (h_cond)) ? (((LTSI (* FLD (i_sr), 0)) ? (2147483647) : (0x80000000))) : (* FLD (i_sr)));
   3031   1.1  christos     * FLD (i_dr) = opval;
   3032   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3033   1.1  christos   }
   3034   1.1  christos 
   3035   1.1  christos #undef FLD
   3036   1.1  christos }
   3037   1.1  christos   NEXT (vpc);
   3038   1.1  christos 
   3039   1.1  christos   CASE (sem, INSN_PCMPBZ) : /* pcmpbz $src2 */
   3040   1.1  christos {
   3041   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3042   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3043   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3044   1.1  christos   int UNUSED written = 0;
   3045   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3046   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3047   1.1  christos 
   3048   1.1  christos   {
   3049   1.1  christos     BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
   3050   1.1  christos     CPU (h_cond) = opval;
   3051   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3052   1.1  christos   }
   3053   1.1  christos 
   3054   1.1  christos #undef FLD
   3055   1.1  christos }
   3056   1.1  christos   NEXT (vpc);
   3057   1.1  christos 
   3058   1.1  christos   CASE (sem, INSN_SADD) : /* sadd */
   3059   1.1  christos {
   3060   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3061   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3062   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   3063   1.1  christos   int UNUSED written = 0;
   3064   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3065   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3066   1.1  christos 
   3067   1.1  christos   {
   3068   1.1  christos     DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
   3069   1.1  christos     SET_H_ACCUMS (((UINT) 0), opval);
   3070   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   3071   1.1  christos   }
   3072   1.1  christos 
   3073   1.1  christos #undef FLD
   3074   1.1  christos }
   3075   1.1  christos   NEXT (vpc);
   3076   1.1  christos 
   3077   1.1  christos   CASE (sem, INSN_MACWU1) : /* macwu1 $src1,$src2 */
   3078   1.1  christos {
   3079   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3080   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3081   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3082   1.1  christos   int UNUSED written = 0;
   3083   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3084   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3085   1.1  christos 
   3086   1.1  christos   {
   3087   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
   3088   1.1  christos     SET_H_ACCUMS (((UINT) 1), opval);
   3089   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   3090   1.1  christos   }
   3091   1.1  christos 
   3092   1.1  christos #undef FLD
   3093   1.1  christos }
   3094   1.1  christos   NEXT (vpc);
   3095   1.1  christos 
   3096   1.1  christos   CASE (sem, INSN_MSBLO) : /* msblo $src1,$src2 */
   3097   1.1  christos {
   3098   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3099   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3100   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3101   1.1  christos   int UNUSED written = 0;
   3102   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3103   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3104   1.1  christos 
   3105   1.1  christos   {
   3106   1.1  christos     DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
   3107   1.1  christos     SET_H_ACCUM (opval);
   3108   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
   3109   1.1  christos   }
   3110   1.1  christos 
   3111   1.1  christos #undef FLD
   3112   1.1  christos }
   3113   1.1  christos   NEXT (vpc);
   3114   1.1  christos 
   3115   1.1  christos   CASE (sem, INSN_MULWU1) : /* mulwu1 $src1,$src2 */
   3116   1.1  christos {
   3117   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3118   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3119   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3120   1.1  christos   int UNUSED written = 0;
   3121   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3122   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3123   1.1  christos 
   3124   1.1  christos   {
   3125   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
   3126   1.1  christos     SET_H_ACCUMS (((UINT) 1), opval);
   3127   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   3128   1.1  christos   }
   3129   1.1  christos 
   3130   1.1  christos #undef FLD
   3131   1.1  christos }
   3132   1.1  christos   NEXT (vpc);
   3133   1.1  christos 
   3134   1.1  christos   CASE (sem, INSN_MACLH1) : /* maclh1 $src1,$src2 */
   3135   1.1  christos {
   3136   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3137   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3138   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3139   1.1  christos   int UNUSED written = 0;
   3140   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3141   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3142   1.1  christos 
   3143   1.1  christos   {
   3144   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
   3145   1.1  christos     SET_H_ACCUMS (((UINT) 1), opval);
   3146   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   3147   1.1  christos   }
   3148   1.1  christos 
   3149   1.1  christos #undef FLD
   3150   1.1  christos }
   3151   1.1  christos   NEXT (vpc);
   3152   1.1  christos 
   3153   1.1  christos   CASE (sem, INSN_SC) : /* sc */
   3154   1.1  christos {
   3155   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3156   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3157   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   3158   1.1  christos   int UNUSED written = 0;
   3159   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3160   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3161   1.1  christos 
   3162   1.1  christos if (ZEXTBISI (CPU (h_cond)))
   3163   1.1  christos   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
   3164   1.1  christos 
   3165   1.1  christos #undef FLD
   3166   1.1  christos }
   3167   1.1  christos   NEXT (vpc);
   3168   1.1  christos 
   3169   1.1  christos   CASE (sem, INSN_SNC) : /* snc */
   3170   1.1  christos {
   3171   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3172   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3173   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   3174   1.1  christos   int UNUSED written = 0;
   3175   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3176   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3177   1.1  christos 
   3178   1.1  christos if (ZEXTBISI (NOTBI (CPU (h_cond))))
   3179   1.1  christos   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
   3180   1.1  christos 
   3181   1.1  christos #undef FLD
   3182   1.1  christos }
   3183   1.1  christos   NEXT (vpc);
   3184   1.1  christos 
   3185   1.1  christos   CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */
   3186   1.1  christos {
   3187   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3188   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3189   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   3190   1.1  christos   int UNUSED written = 0;
   3191   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3192   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3193   1.1  christos 
   3194   1.1  christos   {
   3195   1.1  christos     USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
   3196   1.1  christos     SET_H_CR (((UINT) 0), opval);
   3197   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   3198   1.1  christos   }
   3199   1.1  christos 
   3200   1.1  christos #undef FLD
   3201   1.1  christos }
   3202   1.1  christos   NEXT (vpc);
   3203   1.1  christos 
   3204   1.1  christos   CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */
   3205   1.1  christos {
   3206   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3207   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3208   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   3209   1.1  christos   int UNUSED written = 0;
   3210   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3211   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3212   1.1  christos 
   3213   1.1  christos   {
   3214   1.1  christos     USI opval = FLD (f_uimm8);
   3215   1.1  christos     SET_H_CR (((UINT) 0), opval);
   3216   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   3217   1.1  christos   }
   3218   1.1  christos 
   3219   1.1  christos #undef FLD
   3220   1.1  christos }
   3221   1.1  christos   NEXT (vpc);
   3222   1.1  christos 
   3223   1.1  christos   CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */
   3224   1.1  christos {
   3225   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3226   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3227   1.1  christos #define FLD(f) abuf->fields.sfmt_bset.f
   3228   1.1  christos   int UNUSED written = 0;
   3229   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3230   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   3231   1.1  christos 
   3232   1.1  christos   {
   3233   1.1  christos     QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
   3234   1.1  christos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
   3235   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   3236   1.1  christos   }
   3237   1.1  christos 
   3238   1.1  christos #undef FLD
   3239   1.1  christos }
   3240   1.1  christos   NEXT (vpc);
   3241   1.1  christos 
   3242   1.1  christos   CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */
   3243   1.1  christos {
   3244   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3245   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3246   1.1  christos #define FLD(f) abuf->fields.sfmt_bset.f
   3247   1.1  christos   int UNUSED written = 0;
   3248   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3249   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
   3250   1.1  christos 
   3251   1.1  christos   {
   3252   1.1  christos     QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
   3253   1.1  christos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
   3254   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   3255   1.1  christos   }
   3256   1.1  christos 
   3257   1.1  christos #undef FLD
   3258   1.1  christos }
   3259   1.1  christos   NEXT (vpc);
   3260   1.1  christos 
   3261   1.1  christos   CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */
   3262   1.1  christos {
   3263   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3264   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3265   1.1  christos #define FLD(f) abuf->fields.sfmt_bset.f
   3266   1.1  christos   int UNUSED written = 0;
   3267   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3268   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3269   1.1  christos 
   3270   1.1  christos   {
   3271   1.1  christos     BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
   3272   1.1  christos     CPU (h_cond) = opval;
   3273   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3274   1.1  christos   }
   3275   1.1  christos 
   3276   1.1  christos #undef FLD
   3277   1.1  christos }
   3278   1.1  christos   NEXT (vpc);
   3279   1.1  christos 
   3280   1.1  christos   CASE (sem, INSN_PAR_ADD) : /* add $dr,$sr */
   3281   1.1  christos {
   3282   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3283   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3284   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3285   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3286   1.1  christos   int UNUSED written = 0;
   3287   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3288   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3289   1.1  christos 
   3290   1.1  christos   {
   3291   1.1  christos     SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
   3292   1.1  christos     OPRND (dr) = opval;
   3293   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3294   1.1  christos   }
   3295   1.1  christos 
   3296   1.1  christos #undef OPRND
   3297   1.1  christos #undef FLD
   3298   1.1  christos }
   3299   1.1  christos   NEXT (vpc);
   3300   1.1  christos 
   3301   1.1  christos CASE (sem, INSN_WRITE_ADD) : /* add $dr,$sr */
   3302   1.1  christos   {
   3303   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3304   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3305   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3306   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3307   1.1  christos     int UNUSED written = abuf->written;
   3308   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3309   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3310   1.1  christos 
   3311   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3312   1.1  christos 
   3313   1.1  christos #undef OPRND
   3314   1.1  christos #undef FLD
   3315   1.1  christos   }
   3316   1.1  christos   NEXT (vpc);
   3317   1.1  christos 
   3318   1.1  christos   CASE (sem, INSN_PAR_AND) : /* and $dr,$sr */
   3319   1.1  christos {
   3320   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3321   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3322   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3323   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3324   1.1  christos   int UNUSED written = 0;
   3325   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3326   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3327   1.1  christos 
   3328   1.1  christos   {
   3329   1.1  christos     SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
   3330   1.1  christos     OPRND (dr) = opval;
   3331   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3332   1.1  christos   }
   3333   1.1  christos 
   3334   1.1  christos #undef OPRND
   3335   1.1  christos #undef FLD
   3336   1.1  christos }
   3337   1.1  christos   NEXT (vpc);
   3338   1.1  christos 
   3339   1.1  christos CASE (sem, INSN_WRITE_AND) : /* and $dr,$sr */
   3340   1.1  christos   {
   3341   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3342   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3343   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3344   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3345   1.1  christos     int UNUSED written = abuf->written;
   3346   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3347   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3348   1.1  christos 
   3349   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3350   1.1  christos 
   3351   1.1  christos #undef OPRND
   3352   1.1  christos #undef FLD
   3353   1.1  christos   }
   3354   1.1  christos   NEXT (vpc);
   3355   1.1  christos 
   3356   1.1  christos   CASE (sem, INSN_PAR_OR) : /* or $dr,$sr */
   3357   1.1  christos {
   3358   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3359   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3360   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3361   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3362   1.1  christos   int UNUSED written = 0;
   3363   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3364   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3365   1.1  christos 
   3366   1.1  christos   {
   3367   1.1  christos     SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
   3368   1.1  christos     OPRND (dr) = opval;
   3369   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3370   1.1  christos   }
   3371   1.1  christos 
   3372   1.1  christos #undef OPRND
   3373   1.1  christos #undef FLD
   3374   1.1  christos }
   3375   1.1  christos   NEXT (vpc);
   3376   1.1  christos 
   3377   1.1  christos CASE (sem, INSN_WRITE_OR) : /* or $dr,$sr */
   3378   1.1  christos   {
   3379   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3380   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3381   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3382   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3383   1.1  christos     int UNUSED written = abuf->written;
   3384   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3385   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3386   1.1  christos 
   3387   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3388   1.1  christos 
   3389   1.1  christos #undef OPRND
   3390   1.1  christos #undef FLD
   3391   1.1  christos   }
   3392   1.1  christos   NEXT (vpc);
   3393   1.1  christos 
   3394   1.1  christos   CASE (sem, INSN_PAR_XOR) : /* xor $dr,$sr */
   3395   1.1  christos {
   3396   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3397   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3398   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3399   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3400   1.1  christos   int UNUSED written = 0;
   3401   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3402   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3403   1.1  christos 
   3404   1.1  christos   {
   3405   1.1  christos     SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
   3406   1.1  christos     OPRND (dr) = opval;
   3407   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3408   1.1  christos   }
   3409   1.1  christos 
   3410   1.1  christos #undef OPRND
   3411   1.1  christos #undef FLD
   3412   1.1  christos }
   3413   1.1  christos   NEXT (vpc);
   3414   1.1  christos 
   3415   1.1  christos CASE (sem, INSN_WRITE_XOR) : /* xor $dr,$sr */
   3416   1.1  christos   {
   3417   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3418   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3419   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3420   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   3421   1.1  christos     int UNUSED written = abuf->written;
   3422   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3423   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3424   1.1  christos 
   3425   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3426   1.1  christos 
   3427   1.1  christos #undef OPRND
   3428   1.1  christos #undef FLD
   3429   1.1  christos   }
   3430   1.1  christos   NEXT (vpc);
   3431   1.1  christos 
   3432   1.1  christos   CASE (sem, INSN_PAR_ADDI) : /* addi $dr,$simm8 */
   3433   1.1  christos {
   3434   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3435   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3436   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
   3437   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addi.f
   3438   1.1  christos   int UNUSED written = 0;
   3439   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3440   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3441   1.1  christos 
   3442   1.1  christos   {
   3443   1.1  christos     SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
   3444   1.1  christos     OPRND (dr) = opval;
   3445   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3446   1.1  christos   }
   3447   1.1  christos 
   3448   1.1  christos #undef OPRND
   3449   1.1  christos #undef FLD
   3450   1.1  christos }
   3451   1.1  christos   NEXT (vpc);
   3452   1.1  christos 
   3453   1.1  christos CASE (sem, INSN_WRITE_ADDI) : /* addi $dr,$simm8 */
   3454   1.1  christos   {
   3455   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3456   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3457   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
   3458   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addi.f
   3459   1.1  christos     int UNUSED written = abuf->written;
   3460   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3461   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3462   1.1  christos 
   3463   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3464   1.1  christos 
   3465   1.1  christos #undef OPRND
   3466   1.1  christos #undef FLD
   3467   1.1  christos   }
   3468   1.1  christos   NEXT (vpc);
   3469   1.1  christos 
   3470   1.1  christos   CASE (sem, INSN_PAR_ADDV) : /* addv $dr,$sr */
   3471   1.1  christos {
   3472   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3473   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3474   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3475   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addv.f
   3476   1.1  christos   int UNUSED written = 0;
   3477   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3478   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3479   1.1  christos 
   3480   1.1  christos {
   3481   1.1  christos   SI temp0;BI temp1;
   3482   1.1  christos   temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
   3483   1.1  christos   temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
   3484   1.1  christos   {
   3485   1.1  christos     SI opval = temp0;
   3486   1.1  christos     OPRND (dr) = opval;
   3487   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3488   1.1  christos   }
   3489   1.1  christos   {
   3490   1.1  christos     BI opval = temp1;
   3491   1.1  christos     OPRND (condbit) = opval;
   3492   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3493   1.1  christos   }
   3494   1.1  christos }
   3495   1.1  christos 
   3496   1.1  christos #undef OPRND
   3497   1.1  christos #undef FLD
   3498   1.1  christos }
   3499   1.1  christos   NEXT (vpc);
   3500   1.1  christos 
   3501   1.1  christos CASE (sem, INSN_WRITE_ADDV) : /* addv $dr,$sr */
   3502   1.1  christos   {
   3503   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3504   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3505   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3506   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addv.f
   3507   1.1  christos     int UNUSED written = abuf->written;
   3508   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3509   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3510   1.1  christos 
   3511   1.1  christos   CPU (h_cond) = OPRND (condbit);
   3512   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3513   1.1  christos 
   3514   1.1  christos #undef OPRND
   3515   1.1  christos #undef FLD
   3516   1.1  christos   }
   3517   1.1  christos   NEXT (vpc);
   3518   1.1  christos 
   3519   1.1  christos   CASE (sem, INSN_PAR_ADDX) : /* addx $dr,$sr */
   3520   1.1  christos {
   3521   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3522   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3523   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3524   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addx.f
   3525   1.1  christos   int UNUSED written = 0;
   3526   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3527   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3528   1.1  christos 
   3529   1.1  christos {
   3530   1.1  christos   SI temp0;BI temp1;
   3531   1.1  christos   temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   3532   1.1  christos   temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   3533   1.1  christos   {
   3534   1.1  christos     SI opval = temp0;
   3535   1.1  christos     OPRND (dr) = opval;
   3536   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3537   1.1  christos   }
   3538   1.1  christos   {
   3539   1.1  christos     BI opval = temp1;
   3540   1.1  christos     OPRND (condbit) = opval;
   3541   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3542   1.1  christos   }
   3543   1.1  christos }
   3544   1.1  christos 
   3545   1.1  christos #undef OPRND
   3546   1.1  christos #undef FLD
   3547   1.1  christos }
   3548   1.1  christos   NEXT (vpc);
   3549   1.1  christos 
   3550   1.1  christos CASE (sem, INSN_WRITE_ADDX) : /* addx $dr,$sr */
   3551   1.1  christos   {
   3552   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3553   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3554   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   3555   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addx.f
   3556   1.1  christos     int UNUSED written = abuf->written;
   3557   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3558   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3559   1.1  christos 
   3560   1.1  christos   CPU (h_cond) = OPRND (condbit);
   3561   1.1  christos   * FLD (i_dr) = OPRND (dr);
   3562   1.1  christos 
   3563   1.1  christos #undef OPRND
   3564   1.1  christos #undef FLD
   3565   1.1  christos   }
   3566   1.1  christos   NEXT (vpc);
   3567   1.1  christos 
   3568   1.1  christos   CASE (sem, INSN_PAR_BC8) : /* bc.s $disp8 */
   3569   1.1  christos {
   3570   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3571   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3572   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3573   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
   3574   1.1  christos   int UNUSED written = 0;
   3575   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3576   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3577   1.1  christos 
   3578   1.1  christos if (CPU (h_cond)) {
   3579   1.1  christos   {
   3580   1.1  christos     USI opval = FLD (i_disp8);
   3581   1.1  christos     OPRND (pc) = opval;
   3582   1.1  christos     written |= (1 << 2);
   3583   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3584   1.1  christos   }
   3585   1.1  christos }
   3586   1.1  christos 
   3587   1.1  christos   abuf->written = written;
   3588   1.1  christos #undef OPRND
   3589   1.1  christos #undef FLD
   3590   1.1  christos }
   3591   1.1  christos   NEXT (vpc);
   3592   1.1  christos 
   3593   1.1  christos CASE (sem, INSN_WRITE_BC8) : /* bc.s $disp8 */
   3594   1.1  christos   {
   3595   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3596   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3597   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3598   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
   3599   1.1  christos     int UNUSED written = abuf->written;
   3600   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3601   1.1  christos     SEM_BRANCH_INIT
   3602   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3603   1.1  christos 
   3604   1.1  christos   if (written & (1 << 2))
   3605   1.1  christos     {
   3606   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3607   1.1  christos     }
   3608   1.1  christos 
   3609   1.1  christos   SEM_BRANCH_FINI (vpc);
   3610   1.1  christos #undef OPRND
   3611   1.1  christos #undef FLD
   3612   1.1  christos   }
   3613   1.1  christos   NEXT (vpc);
   3614   1.1  christos 
   3615   1.1  christos   CASE (sem, INSN_PAR_BL8) : /* bl.s $disp8 */
   3616   1.1  christos {
   3617   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3618   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3619   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3620   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bl8.f
   3621   1.1  christos   int UNUSED written = 0;
   3622   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3623   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3624   1.1  christos 
   3625   1.1  christos {
   3626   1.1  christos   {
   3627   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   3628   1.1  christos     OPRND (h_gr_SI_14) = opval;
   3629   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3630   1.1  christos   }
   3631   1.1  christos   {
   3632   1.1  christos     USI opval = FLD (i_disp8);
   3633   1.1  christos     OPRND (pc) = opval;
   3634   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3635   1.1  christos   }
   3636   1.1  christos }
   3637   1.1  christos 
   3638   1.1  christos #undef OPRND
   3639   1.1  christos #undef FLD
   3640   1.1  christos }
   3641   1.1  christos   NEXT (vpc);
   3642   1.1  christos 
   3643   1.1  christos CASE (sem, INSN_WRITE_BL8) : /* bl.s $disp8 */
   3644   1.1  christos   {
   3645   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3646   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3647   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3648   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bl8.f
   3649   1.1  christos     int UNUSED written = abuf->written;
   3650   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3651   1.1  christos     SEM_BRANCH_INIT
   3652   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3653   1.1  christos 
   3654   1.1  christos   CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
   3655   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3656   1.1  christos 
   3657   1.1  christos   SEM_BRANCH_FINI (vpc);
   3658   1.1  christos #undef OPRND
   3659   1.1  christos #undef FLD
   3660   1.1  christos   }
   3661   1.1  christos   NEXT (vpc);
   3662   1.1  christos 
   3663   1.1  christos   CASE (sem, INSN_PAR_BCL8) : /* bcl.s $disp8 */
   3664   1.1  christos {
   3665   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3666   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3667   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3668   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
   3669   1.1  christos   int UNUSED written = 0;
   3670   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3671   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3672   1.1  christos 
   3673   1.1  christos if (CPU (h_cond)) {
   3674   1.1  christos {
   3675   1.1  christos   {
   3676   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   3677   1.1  christos     OPRND (h_gr_SI_14) = opval;
   3678   1.1  christos     written |= (1 << 3);
   3679   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3680   1.1  christos   }
   3681   1.1  christos   {
   3682   1.1  christos     USI opval = FLD (i_disp8);
   3683   1.1  christos     OPRND (pc) = opval;
   3684   1.1  christos     written |= (1 << 4);
   3685   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3686   1.1  christos   }
   3687   1.1  christos }
   3688   1.1  christos }
   3689   1.1  christos 
   3690   1.1  christos   abuf->written = written;
   3691   1.1  christos #undef OPRND
   3692   1.1  christos #undef FLD
   3693   1.1  christos }
   3694   1.1  christos   NEXT (vpc);
   3695   1.1  christos 
   3696   1.1  christos CASE (sem, INSN_WRITE_BCL8) : /* bcl.s $disp8 */
   3697   1.1  christos   {
   3698   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3699   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3700   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3701   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
   3702   1.1  christos     int UNUSED written = abuf->written;
   3703   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3704   1.1  christos     SEM_BRANCH_INIT
   3705   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3706   1.1  christos 
   3707   1.1  christos   if (written & (1 << 3))
   3708   1.1  christos     {
   3709   1.1  christos       CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
   3710   1.1  christos     }
   3711   1.1  christos   if (written & (1 << 4))
   3712   1.1  christos     {
   3713   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3714   1.1  christos     }
   3715   1.1  christos 
   3716   1.1  christos   SEM_BRANCH_FINI (vpc);
   3717   1.1  christos #undef OPRND
   3718   1.1  christos #undef FLD
   3719   1.1  christos   }
   3720   1.1  christos   NEXT (vpc);
   3721   1.1  christos 
   3722   1.1  christos   CASE (sem, INSN_PAR_BNC8) : /* bnc.s $disp8 */
   3723   1.1  christos {
   3724   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3725   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3726   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3727   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
   3728   1.1  christos   int UNUSED written = 0;
   3729   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3730   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3731   1.1  christos 
   3732   1.1  christos if (NOTBI (CPU (h_cond))) {
   3733   1.1  christos   {
   3734   1.1  christos     USI opval = FLD (i_disp8);
   3735   1.1  christos     OPRND (pc) = opval;
   3736   1.1  christos     written |= (1 << 2);
   3737   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3738   1.1  christos   }
   3739   1.1  christos }
   3740   1.1  christos 
   3741   1.1  christos   abuf->written = written;
   3742   1.1  christos #undef OPRND
   3743   1.1  christos #undef FLD
   3744   1.1  christos }
   3745   1.1  christos   NEXT (vpc);
   3746   1.1  christos 
   3747   1.1  christos CASE (sem, INSN_WRITE_BNC8) : /* bnc.s $disp8 */
   3748   1.1  christos   {
   3749   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3750   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3751   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3752   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
   3753   1.1  christos     int UNUSED written = abuf->written;
   3754   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3755   1.1  christos     SEM_BRANCH_INIT
   3756   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3757   1.1  christos 
   3758   1.1  christos   if (written & (1 << 2))
   3759   1.1  christos     {
   3760   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3761   1.1  christos     }
   3762   1.1  christos 
   3763   1.1  christos   SEM_BRANCH_FINI (vpc);
   3764   1.1  christos #undef OPRND
   3765   1.1  christos #undef FLD
   3766   1.1  christos   }
   3767   1.1  christos   NEXT (vpc);
   3768   1.1  christos 
   3769   1.1  christos   CASE (sem, INSN_PAR_BRA8) : /* bra.s $disp8 */
   3770   1.1  christos {
   3771   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3772   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3773   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3774   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bra8.f
   3775   1.1  christos   int UNUSED written = 0;
   3776   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3777   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3778   1.1  christos 
   3779   1.1  christos   {
   3780   1.1  christos     USI opval = FLD (i_disp8);
   3781   1.1  christos     OPRND (pc) = opval;
   3782   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3783   1.1  christos   }
   3784   1.1  christos 
   3785   1.1  christos #undef OPRND
   3786   1.1  christos #undef FLD
   3787   1.1  christos }
   3788   1.1  christos   NEXT (vpc);
   3789   1.1  christos 
   3790   1.1  christos CASE (sem, INSN_WRITE_BRA8) : /* bra.s $disp8 */
   3791   1.1  christos   {
   3792   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3793   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3794   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3795   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bra8.f
   3796   1.1  christos     int UNUSED written = abuf->written;
   3797   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3798   1.1  christos     SEM_BRANCH_INIT
   3799   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3800   1.1  christos 
   3801   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3802   1.1  christos 
   3803   1.1  christos   SEM_BRANCH_FINI (vpc);
   3804   1.1  christos #undef OPRND
   3805   1.1  christos #undef FLD
   3806   1.1  christos   }
   3807   1.1  christos   NEXT (vpc);
   3808   1.1  christos 
   3809   1.1  christos   CASE (sem, INSN_PAR_BNCL8) : /* bncl.s $disp8 */
   3810   1.1  christos {
   3811   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3812   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3813   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3814   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
   3815   1.1  christos   int UNUSED written = 0;
   3816   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3817   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3818   1.1  christos 
   3819   1.1  christos if (NOTBI (CPU (h_cond))) {
   3820   1.1  christos {
   3821   1.1  christos   {
   3822   1.1  christos     SI opval = ADDSI (ANDSI (pc, -4), 4);
   3823   1.1  christos     OPRND (h_gr_SI_14) = opval;
   3824   1.1  christos     written |= (1 << 3);
   3825   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   3826   1.1  christos   }
   3827   1.1  christos   {
   3828   1.1  christos     USI opval = FLD (i_disp8);
   3829   1.1  christos     OPRND (pc) = opval;
   3830   1.1  christos     written |= (1 << 4);
   3831   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   3832   1.1  christos   }
   3833   1.1  christos }
   3834   1.1  christos }
   3835   1.1  christos 
   3836   1.1  christos   abuf->written = written;
   3837   1.1  christos #undef OPRND
   3838   1.1  christos #undef FLD
   3839   1.1  christos }
   3840   1.1  christos   NEXT (vpc);
   3841   1.1  christos 
   3842   1.1  christos CASE (sem, INSN_WRITE_BNCL8) : /* bncl.s $disp8 */
   3843   1.1  christos   {
   3844   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3845   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3846   1.1  christos #define FLD(f) abuf->fields.sfmt_bl8.f
   3847   1.1  christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
   3848   1.1  christos     int UNUSED written = abuf->written;
   3849   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3850   1.1  christos     SEM_BRANCH_INIT
   3851   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3852   1.1  christos 
   3853   1.1  christos   if (written & (1 << 3))
   3854   1.1  christos     {
   3855   1.1  christos       CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
   3856   1.1  christos     }
   3857   1.1  christos   if (written & (1 << 4))
   3858   1.1  christos     {
   3859   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   3860   1.1  christos     }
   3861   1.1  christos 
   3862   1.1  christos   SEM_BRANCH_FINI (vpc);
   3863   1.1  christos #undef OPRND
   3864   1.1  christos #undef FLD
   3865   1.1  christos   }
   3866   1.1  christos   NEXT (vpc);
   3867   1.1  christos 
   3868   1.1  christos   CASE (sem, INSN_PAR_CMP) : /* cmp $src1,$src2 */
   3869   1.1  christos {
   3870   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3871   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3872   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3873   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3874   1.1  christos   int UNUSED written = 0;
   3875   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3876   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3877   1.1  christos 
   3878   1.1  christos   {
   3879   1.1  christos     BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
   3880   1.1  christos     OPRND (condbit) = opval;
   3881   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3882   1.1  christos   }
   3883   1.1  christos 
   3884   1.1  christos #undef OPRND
   3885   1.1  christos #undef FLD
   3886   1.1  christos }
   3887   1.1  christos   NEXT (vpc);
   3888   1.1  christos 
   3889   1.1  christos CASE (sem, INSN_WRITE_CMP) : /* cmp $src1,$src2 */
   3890   1.1  christos   {
   3891   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3892   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3893   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3894   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3895   1.1  christos     int UNUSED written = abuf->written;
   3896   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3897   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3898   1.1  christos 
   3899   1.1  christos   CPU (h_cond) = OPRND (condbit);
   3900   1.1  christos 
   3901   1.1  christos #undef OPRND
   3902   1.1  christos #undef FLD
   3903   1.1  christos   }
   3904   1.1  christos   NEXT (vpc);
   3905   1.1  christos 
   3906   1.1  christos   CASE (sem, INSN_PAR_CMPU) : /* cmpu $src1,$src2 */
   3907   1.1  christos {
   3908   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3909   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3910   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3911   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3912   1.1  christos   int UNUSED written = 0;
   3913   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3914   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3915   1.1  christos 
   3916   1.1  christos   {
   3917   1.1  christos     BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
   3918   1.1  christos     OPRND (condbit) = opval;
   3919   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3920   1.1  christos   }
   3921   1.1  christos 
   3922   1.1  christos #undef OPRND
   3923   1.1  christos #undef FLD
   3924   1.1  christos }
   3925   1.1  christos   NEXT (vpc);
   3926   1.1  christos 
   3927   1.1  christos CASE (sem, INSN_WRITE_CMPU) : /* cmpu $src1,$src2 */
   3928   1.1  christos   {
   3929   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3930   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3931   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3932   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3933   1.1  christos     int UNUSED written = abuf->written;
   3934   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3935   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3936   1.1  christos 
   3937   1.1  christos   CPU (h_cond) = OPRND (condbit);
   3938   1.1  christos 
   3939   1.1  christos #undef OPRND
   3940   1.1  christos #undef FLD
   3941   1.1  christos   }
   3942   1.1  christos   NEXT (vpc);
   3943   1.1  christos 
   3944   1.1  christos   CASE (sem, INSN_PAR_CMPEQ) : /* cmpeq $src1,$src2 */
   3945   1.1  christos {
   3946   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3947   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3948   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3949   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3950   1.1  christos   int UNUSED written = 0;
   3951   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3952   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3953   1.1  christos 
   3954   1.1  christos   {
   3955   1.1  christos     BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
   3956   1.1  christos     OPRND (condbit) = opval;
   3957   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3958   1.1  christos   }
   3959   1.1  christos 
   3960   1.1  christos #undef OPRND
   3961   1.1  christos #undef FLD
   3962   1.1  christos }
   3963   1.1  christos   NEXT (vpc);
   3964   1.1  christos 
   3965   1.1  christos CASE (sem, INSN_WRITE_CMPEQ) : /* cmpeq $src1,$src2 */
   3966   1.1  christos   {
   3967   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3968   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   3969   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3970   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
   3971   1.1  christos     int UNUSED written = abuf->written;
   3972   1.1  christos     IADDR UNUSED pc = abuf->addr;
   3973   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   3974   1.1  christos 
   3975   1.1  christos   CPU (h_cond) = OPRND (condbit);
   3976   1.1  christos 
   3977   1.1  christos #undef OPRND
   3978   1.1  christos #undef FLD
   3979   1.1  christos   }
   3980   1.1  christos   NEXT (vpc);
   3981   1.1  christos 
   3982   1.1  christos   CASE (sem, INSN_PAR_CMPZ) : /* cmpz $src2 */
   3983   1.1  christos {
   3984   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   3985   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   3986   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   3987   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
   3988   1.1  christos   int UNUSED written = 0;
   3989   1.1  christos   IADDR UNUSED pc = abuf->addr;
   3990   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   3991   1.1  christos 
   3992   1.1  christos   {
   3993   1.1  christos     BI opval = EQSI (* FLD (i_src2), 0);
   3994   1.1  christos     OPRND (condbit) = opval;
   3995   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   3996   1.1  christos   }
   3997   1.1  christos 
   3998   1.1  christos #undef OPRND
   3999   1.1  christos #undef FLD
   4000   1.1  christos }
   4001   1.1  christos   NEXT (vpc);
   4002   1.1  christos 
   4003   1.1  christos CASE (sem, INSN_WRITE_CMPZ) : /* cmpz $src2 */
   4004   1.1  christos   {
   4005   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4006   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4007   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   4008   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
   4009   1.1  christos     int UNUSED written = abuf->written;
   4010   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4011   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4012   1.1  christos 
   4013   1.1  christos   CPU (h_cond) = OPRND (condbit);
   4014   1.1  christos 
   4015   1.1  christos #undef OPRND
   4016   1.1  christos #undef FLD
   4017   1.1  christos   }
   4018   1.1  christos   NEXT (vpc);
   4019   1.1  christos 
   4020   1.1  christos   CASE (sem, INSN_PAR_JC) : /* jc $sr */
   4021   1.1  christos {
   4022   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4023   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4024   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4025   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jc.f
   4026   1.1  christos   int UNUSED written = 0;
   4027   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4028   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4029   1.1  christos 
   4030   1.1  christos if (CPU (h_cond)) {
   4031   1.1  christos   {
   4032   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   4033   1.1  christos     OPRND (pc) = opval;
   4034   1.1  christos     written |= (1 << 2);
   4035   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   4036   1.1  christos   }
   4037   1.1  christos }
   4038   1.1  christos 
   4039   1.1  christos   abuf->written = written;
   4040   1.1  christos #undef OPRND
   4041   1.1  christos #undef FLD
   4042   1.1  christos }
   4043   1.1  christos   NEXT (vpc);
   4044   1.1  christos 
   4045   1.1  christos CASE (sem, INSN_WRITE_JC) : /* jc $sr */
   4046   1.1  christos   {
   4047   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4048   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4049   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4050   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jc.f
   4051   1.1  christos     int UNUSED written = abuf->written;
   4052   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4053   1.1  christos     SEM_BRANCH_INIT
   4054   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4055   1.1  christos 
   4056   1.1  christos   if (written & (1 << 2))
   4057   1.1  christos     {
   4058   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   4059   1.1  christos     }
   4060   1.1  christos 
   4061   1.1  christos   SEM_BRANCH_FINI (vpc);
   4062   1.1  christos #undef OPRND
   4063   1.1  christos #undef FLD
   4064   1.1  christos   }
   4065   1.1  christos   NEXT (vpc);
   4066   1.1  christos 
   4067   1.1  christos   CASE (sem, INSN_PAR_JNC) : /* jnc $sr */
   4068   1.1  christos {
   4069   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4070   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4071   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4072   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jc.f
   4073   1.1  christos   int UNUSED written = 0;
   4074   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4075   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4076   1.1  christos 
   4077   1.1  christos if (NOTBI (CPU (h_cond))) {
   4078   1.1  christos   {
   4079   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   4080   1.1  christos     OPRND (pc) = opval;
   4081   1.1  christos     written |= (1 << 2);
   4082   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   4083   1.1  christos   }
   4084   1.1  christos }
   4085   1.1  christos 
   4086   1.1  christos   abuf->written = written;
   4087   1.1  christos #undef OPRND
   4088   1.1  christos #undef FLD
   4089   1.1  christos }
   4090   1.1  christos   NEXT (vpc);
   4091   1.1  christos 
   4092   1.1  christos CASE (sem, INSN_WRITE_JNC) : /* jnc $sr */
   4093   1.1  christos   {
   4094   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4095   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4096   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4097   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jc.f
   4098   1.1  christos     int UNUSED written = abuf->written;
   4099   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4100   1.1  christos     SEM_BRANCH_INIT
   4101   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4102   1.1  christos 
   4103   1.1  christos   if (written & (1 << 2))
   4104   1.1  christos     {
   4105   1.1  christos       SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   4106   1.1  christos     }
   4107   1.1  christos 
   4108   1.1  christos   SEM_BRANCH_FINI (vpc);
   4109   1.1  christos #undef OPRND
   4110   1.1  christos #undef FLD
   4111   1.1  christos   }
   4112   1.1  christos   NEXT (vpc);
   4113   1.1  christos 
   4114   1.1  christos   CASE (sem, INSN_PAR_JL) : /* jl $sr */
   4115   1.1  christos {
   4116   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4117   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4118   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4119   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jl.f
   4120   1.1  christos   int UNUSED written = 0;
   4121   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4122   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4123   1.1  christos 
   4124   1.1  christos {
   4125   1.1  christos   SI temp0;USI temp1;
   4126   1.1  christos   temp0 = ADDSI (ANDSI (pc, -4), 4);
   4127   1.1  christos   temp1 = ANDSI (* FLD (i_sr), -4);
   4128   1.1  christos   {
   4129   1.1  christos     SI opval = temp0;
   4130   1.1  christos     OPRND (h_gr_SI_14) = opval;
   4131   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4132   1.1  christos   }
   4133   1.1  christos   {
   4134   1.1  christos     USI opval = temp1;
   4135   1.1  christos     OPRND (pc) = opval;
   4136   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   4137   1.1  christos   }
   4138   1.1  christos }
   4139   1.1  christos 
   4140   1.1  christos #undef OPRND
   4141   1.1  christos #undef FLD
   4142   1.1  christos }
   4143   1.1  christos   NEXT (vpc);
   4144   1.1  christos 
   4145   1.1  christos CASE (sem, INSN_WRITE_JL) : /* jl $sr */
   4146   1.1  christos   {
   4147   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4148   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4149   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4150   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jl.f
   4151   1.1  christos     int UNUSED written = abuf->written;
   4152   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4153   1.1  christos     SEM_BRANCH_INIT
   4154   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4155   1.1  christos 
   4156   1.1  christos   CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
   4157   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   4158   1.1  christos 
   4159   1.1  christos   SEM_BRANCH_FINI (vpc);
   4160   1.1  christos #undef OPRND
   4161   1.1  christos #undef FLD
   4162   1.1  christos   }
   4163   1.1  christos   NEXT (vpc);
   4164   1.1  christos 
   4165   1.1  christos   CASE (sem, INSN_PAR_JMP) : /* jmp $sr */
   4166   1.1  christos {
   4167   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4168   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4169   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4170   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jmp.f
   4171   1.1  christos   int UNUSED written = 0;
   4172   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4173   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4174   1.1  christos 
   4175   1.1  christos   {
   4176   1.1  christos     USI opval = ANDSI (* FLD (i_sr), -4);
   4177   1.1  christos     OPRND (pc) = opval;
   4178   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   4179   1.1  christos   }
   4180   1.1  christos 
   4181   1.1  christos #undef OPRND
   4182   1.1  christos #undef FLD
   4183   1.1  christos }
   4184   1.1  christos   NEXT (vpc);
   4185   1.1  christos 
   4186   1.1  christos CASE (sem, INSN_WRITE_JMP) : /* jmp $sr */
   4187   1.1  christos   {
   4188   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4189   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4190   1.1  christos #define FLD(f) abuf->fields.sfmt_jl.f
   4191   1.1  christos #define OPRND(f) par_exec->operands.sfmt_jmp.f
   4192   1.1  christos     int UNUSED written = abuf->written;
   4193   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4194   1.1  christos     SEM_BRANCH_INIT
   4195   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4196   1.1  christos 
   4197   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   4198   1.1  christos 
   4199   1.1  christos   SEM_BRANCH_FINI (vpc);
   4200   1.1  christos #undef OPRND
   4201   1.1  christos #undef FLD
   4202   1.1  christos   }
   4203   1.1  christos   NEXT (vpc);
   4204   1.1  christos 
   4205   1.1  christos   CASE (sem, INSN_PAR_LD) : /* ld $dr,@$sr */
   4206   1.1  christos {
   4207   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4208   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4209   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4210   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ld.f
   4211   1.1  christos   int UNUSED written = 0;
   4212   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4213   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4214   1.1  christos 
   4215   1.1  christos   {
   4216   1.1  christos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   4217   1.1  christos     OPRND (dr) = opval;
   4218   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4219   1.1  christos   }
   4220   1.1  christos 
   4221   1.1  christos #undef OPRND
   4222   1.1  christos #undef FLD
   4223   1.1  christos }
   4224   1.1  christos   NEXT (vpc);
   4225   1.1  christos 
   4226   1.1  christos CASE (sem, INSN_WRITE_LD) : /* ld $dr,@$sr */
   4227   1.1  christos   {
   4228   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4229   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4230   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4231   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ld.f
   4232   1.1  christos     int UNUSED written = abuf->written;
   4233   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4234   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4235   1.1  christos 
   4236   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4237   1.1  christos 
   4238   1.1  christos #undef OPRND
   4239   1.1  christos #undef FLD
   4240   1.1  christos   }
   4241   1.1  christos   NEXT (vpc);
   4242   1.1  christos 
   4243   1.1  christos   CASE (sem, INSN_PAR_LDB) : /* ldb $dr,@$sr */
   4244   1.1  christos {
   4245   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4246   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4247   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4248   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
   4249   1.1  christos   int UNUSED written = 0;
   4250   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4251   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4252   1.1  christos 
   4253   1.1  christos   {
   4254   1.1  christos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
   4255   1.1  christos     OPRND (dr) = opval;
   4256   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4257   1.1  christos   }
   4258   1.1  christos 
   4259   1.1  christos #undef OPRND
   4260   1.1  christos #undef FLD
   4261   1.1  christos }
   4262   1.1  christos   NEXT (vpc);
   4263   1.1  christos 
   4264   1.1  christos CASE (sem, INSN_WRITE_LDB) : /* ldb $dr,@$sr */
   4265   1.1  christos   {
   4266   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4267   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4268   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4269   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
   4270   1.1  christos     int UNUSED written = abuf->written;
   4271   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4272   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4273   1.1  christos 
   4274   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4275   1.1  christos 
   4276   1.1  christos #undef OPRND
   4277   1.1  christos #undef FLD
   4278   1.1  christos   }
   4279   1.1  christos   NEXT (vpc);
   4280   1.1  christos 
   4281   1.1  christos   CASE (sem, INSN_PAR_LDH) : /* ldh $dr,@$sr */
   4282   1.1  christos {
   4283   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4284   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4285   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4286   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
   4287   1.1  christos   int UNUSED written = 0;
   4288   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4289   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4290   1.1  christos 
   4291   1.1  christos   {
   4292   1.1  christos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
   4293   1.1  christos     OPRND (dr) = opval;
   4294   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4295   1.1  christos   }
   4296   1.1  christos 
   4297   1.1  christos #undef OPRND
   4298   1.1  christos #undef FLD
   4299   1.1  christos }
   4300   1.1  christos   NEXT (vpc);
   4301   1.1  christos 
   4302   1.1  christos CASE (sem, INSN_WRITE_LDH) : /* ldh $dr,@$sr */
   4303   1.1  christos   {
   4304   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4305   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4306   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4307   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
   4308   1.1  christos     int UNUSED written = abuf->written;
   4309   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4310   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4311   1.1  christos 
   4312   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4313   1.1  christos 
   4314   1.1  christos #undef OPRND
   4315   1.1  christos #undef FLD
   4316   1.1  christos   }
   4317   1.1  christos   NEXT (vpc);
   4318   1.1  christos 
   4319   1.1  christos   CASE (sem, INSN_PAR_LDUB) : /* ldub $dr,@$sr */
   4320   1.1  christos {
   4321   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4322   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4323   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4324   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
   4325   1.1  christos   int UNUSED written = 0;
   4326   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4327   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4328   1.1  christos 
   4329   1.1  christos   {
   4330   1.1  christos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
   4331   1.1  christos     OPRND (dr) = opval;
   4332   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4333   1.1  christos   }
   4334   1.1  christos 
   4335   1.1  christos #undef OPRND
   4336   1.1  christos #undef FLD
   4337   1.1  christos }
   4338   1.1  christos   NEXT (vpc);
   4339   1.1  christos 
   4340   1.1  christos CASE (sem, INSN_WRITE_LDUB) : /* ldub $dr,@$sr */
   4341   1.1  christos   {
   4342   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4343   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4344   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4345   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
   4346   1.1  christos     int UNUSED written = abuf->written;
   4347   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4348   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4349   1.1  christos 
   4350   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4351   1.1  christos 
   4352   1.1  christos #undef OPRND
   4353   1.1  christos #undef FLD
   4354   1.1  christos   }
   4355   1.1  christos   NEXT (vpc);
   4356   1.1  christos 
   4357   1.1  christos   CASE (sem, INSN_PAR_LDUH) : /* lduh $dr,@$sr */
   4358   1.1  christos {
   4359   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4360   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4361   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4362   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
   4363   1.1  christos   int UNUSED written = 0;
   4364   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4365   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4366   1.1  christos 
   4367   1.1  christos   {
   4368   1.1  christos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
   4369   1.1  christos     OPRND (dr) = opval;
   4370   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4371   1.1  christos   }
   4372   1.1  christos 
   4373   1.1  christos #undef OPRND
   4374   1.1  christos #undef FLD
   4375   1.1  christos }
   4376   1.1  christos   NEXT (vpc);
   4377   1.1  christos 
   4378   1.1  christos CASE (sem, INSN_WRITE_LDUH) : /* lduh $dr,@$sr */
   4379   1.1  christos   {
   4380   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4381   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4382   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4383   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
   4384   1.1  christos     int UNUSED written = abuf->written;
   4385   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4386   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4387   1.1  christos 
   4388   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4389   1.1  christos 
   4390   1.1  christos #undef OPRND
   4391   1.1  christos #undef FLD
   4392   1.1  christos   }
   4393   1.1  christos   NEXT (vpc);
   4394   1.1  christos 
   4395   1.1  christos   CASE (sem, INSN_PAR_LD_PLUS) : /* ld $dr,@$sr+ */
   4396   1.1  christos {
   4397   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4398   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4399   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4400   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
   4401   1.1  christos   int UNUSED written = 0;
   4402   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4403   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4404   1.1  christos 
   4405   1.1  christos {
   4406   1.1  christos   SI temp0;SI temp1;
   4407   1.1  christos   temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   4408   1.1  christos   temp1 = ADDSI (* FLD (i_sr), 4);
   4409   1.1  christos   {
   4410   1.1  christos     SI opval = temp0;
   4411   1.1  christos     OPRND (dr) = opval;
   4412   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4413   1.1  christos   }
   4414   1.1  christos   {
   4415   1.1  christos     SI opval = temp1;
   4416   1.1  christos     OPRND (sr) = opval;
   4417   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4418   1.1  christos   }
   4419   1.1  christos }
   4420   1.1  christos 
   4421   1.1  christos #undef OPRND
   4422   1.1  christos #undef FLD
   4423   1.1  christos }
   4424   1.1  christos   NEXT (vpc);
   4425   1.1  christos 
   4426   1.1  christos CASE (sem, INSN_WRITE_LD_PLUS) : /* ld $dr,@$sr+ */
   4427   1.1  christos   {
   4428   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4429   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4430   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4431   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
   4432   1.1  christos     int UNUSED written = abuf->written;
   4433   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4434   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4435   1.1  christos 
   4436   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4437   1.1  christos   * FLD (i_sr) = OPRND (sr);
   4438   1.1  christos 
   4439   1.1  christos #undef OPRND
   4440   1.1  christos #undef FLD
   4441   1.1  christos   }
   4442   1.1  christos   NEXT (vpc);
   4443   1.1  christos 
   4444   1.1  christos   CASE (sem, INSN_PAR_LDI8) : /* ldi8 $dr,$simm8 */
   4445   1.1  christos {
   4446   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4447   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4448   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
   4449   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldi8.f
   4450   1.1  christos   int UNUSED written = 0;
   4451   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4452   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4453   1.1  christos 
   4454   1.1  christos   {
   4455   1.1  christos     SI opval = FLD (f_simm8);
   4456   1.1  christos     OPRND (dr) = opval;
   4457   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4458   1.1  christos   }
   4459   1.1  christos 
   4460   1.1  christos #undef OPRND
   4461   1.1  christos #undef FLD
   4462   1.1  christos }
   4463   1.1  christos   NEXT (vpc);
   4464   1.1  christos 
   4465   1.1  christos CASE (sem, INSN_WRITE_LDI8) : /* ldi8 $dr,$simm8 */
   4466   1.1  christos   {
   4467   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4468   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4469   1.1  christos #define FLD(f) abuf->fields.sfmt_addi.f
   4470   1.1  christos #define OPRND(f) par_exec->operands.sfmt_ldi8.f
   4471   1.1  christos     int UNUSED written = abuf->written;
   4472   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4473   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4474   1.1  christos 
   4475   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4476   1.1  christos 
   4477   1.1  christos #undef OPRND
   4478   1.1  christos #undef FLD
   4479   1.1  christos   }
   4480   1.1  christos   NEXT (vpc);
   4481   1.1  christos 
   4482   1.1  christos   CASE (sem, INSN_PAR_LOCK) : /* lock $dr,@$sr */
   4483   1.1  christos {
   4484   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4485   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4486   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4487   1.1  christos #define OPRND(f) par_exec->operands.sfmt_lock.f
   4488   1.1  christos   int UNUSED written = 0;
   4489   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4490   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4491   1.1  christos 
   4492   1.1  christos {
   4493   1.1  christos   {
   4494   1.1  christos     BI opval = 1;
   4495   1.1  christos     OPRND (h_lock_BI) = opval;
   4496   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
   4497   1.1  christos   }
   4498   1.1  christos   {
   4499   1.1  christos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
   4500   1.1  christos     OPRND (dr) = opval;
   4501   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4502   1.1  christos   }
   4503   1.1  christos }
   4504   1.1  christos 
   4505   1.1  christos #undef OPRND
   4506   1.1  christos #undef FLD
   4507   1.1  christos }
   4508   1.1  christos   NEXT (vpc);
   4509   1.1  christos 
   4510   1.1  christos CASE (sem, INSN_WRITE_LOCK) : /* lock $dr,@$sr */
   4511   1.1  christos   {
   4512   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4513   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4514   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4515   1.1  christos #define OPRND(f) par_exec->operands.sfmt_lock.f
   4516   1.1  christos     int UNUSED written = abuf->written;
   4517   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4518   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4519   1.1  christos 
   4520   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4521   1.1  christos   CPU (h_lock) = OPRND (h_lock_BI);
   4522   1.1  christos 
   4523   1.1  christos #undef OPRND
   4524   1.1  christos #undef FLD
   4525   1.1  christos   }
   4526   1.1  christos   NEXT (vpc);
   4527   1.1  christos 
   4528   1.1  christos   CASE (sem, INSN_PAR_MACHI_A) : /* machi $src1,$src2,$acc */
   4529   1.1  christos {
   4530   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4531   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4532   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4533   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4534   1.1  christos   int UNUSED written = 0;
   4535   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4536   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4537   1.1  christos 
   4538   1.1  christos   {
   4539   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
   4540   1.1  christos     OPRND (acc) = opval;
   4541   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4542   1.1  christos   }
   4543   1.1  christos 
   4544   1.1  christos #undef OPRND
   4545   1.1  christos #undef FLD
   4546   1.1  christos }
   4547   1.1  christos   NEXT (vpc);
   4548   1.1  christos 
   4549   1.1  christos CASE (sem, INSN_WRITE_MACHI_A) : /* machi $src1,$src2,$acc */
   4550   1.1  christos   {
   4551   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4552   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4553   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4554   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4555   1.1  christos     int UNUSED written = abuf->written;
   4556   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4557   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4558   1.1  christos 
   4559   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4560   1.1  christos 
   4561   1.1  christos #undef OPRND
   4562   1.1  christos #undef FLD
   4563   1.1  christos   }
   4564   1.1  christos   NEXT (vpc);
   4565   1.1  christos 
   4566   1.1  christos   CASE (sem, INSN_PAR_MACLO_A) : /* maclo $src1,$src2,$acc */
   4567   1.1  christos {
   4568   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4569   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4570   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4571   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4572   1.1  christos   int UNUSED written = 0;
   4573   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4574   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4575   1.1  christos 
   4576   1.1  christos   {
   4577   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
   4578   1.1  christos     OPRND (acc) = opval;
   4579   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4580   1.1  christos   }
   4581   1.1  christos 
   4582   1.1  christos #undef OPRND
   4583   1.1  christos #undef FLD
   4584   1.1  christos }
   4585   1.1  christos   NEXT (vpc);
   4586   1.1  christos 
   4587   1.1  christos CASE (sem, INSN_WRITE_MACLO_A) : /* maclo $src1,$src2,$acc */
   4588   1.1  christos   {
   4589   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4590   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4591   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4592   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4593   1.1  christos     int UNUSED written = abuf->written;
   4594   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4595   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4596   1.1  christos 
   4597   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4598   1.1  christos 
   4599   1.1  christos #undef OPRND
   4600   1.1  christos #undef FLD
   4601   1.1  christos   }
   4602   1.1  christos   NEXT (vpc);
   4603   1.1  christos 
   4604   1.1  christos   CASE (sem, INSN_PAR_MACWHI_A) : /* macwhi $src1,$src2,$acc */
   4605   1.1  christos {
   4606   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4607   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4608   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4609   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4610   1.1  christos   int UNUSED written = 0;
   4611   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4612   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4613   1.1  christos 
   4614   1.1  christos   {
   4615   1.1  christos     DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
   4616   1.1  christos     OPRND (acc) = opval;
   4617   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4618   1.1  christos   }
   4619   1.1  christos 
   4620   1.1  christos #undef OPRND
   4621   1.1  christos #undef FLD
   4622   1.1  christos }
   4623   1.1  christos   NEXT (vpc);
   4624   1.1  christos 
   4625   1.1  christos CASE (sem, INSN_WRITE_MACWHI_A) : /* macwhi $src1,$src2,$acc */
   4626   1.1  christos   {
   4627   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4628   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4629   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4630   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4631   1.1  christos     int UNUSED written = abuf->written;
   4632   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4633   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4634   1.1  christos 
   4635   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4636   1.1  christos 
   4637   1.1  christos #undef OPRND
   4638   1.1  christos #undef FLD
   4639   1.1  christos   }
   4640   1.1  christos   NEXT (vpc);
   4641   1.1  christos 
   4642   1.1  christos   CASE (sem, INSN_PAR_MACWLO_A) : /* macwlo $src1,$src2,$acc */
   4643   1.1  christos {
   4644   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4645   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4646   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4647   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4648   1.1  christos   int UNUSED written = 0;
   4649   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4650   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4651   1.1  christos 
   4652   1.1  christos   {
   4653   1.1  christos     DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
   4654   1.1  christos     OPRND (acc) = opval;
   4655   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4656   1.1  christos   }
   4657   1.1  christos 
   4658   1.1  christos #undef OPRND
   4659   1.1  christos #undef FLD
   4660   1.1  christos }
   4661   1.1  christos   NEXT (vpc);
   4662   1.1  christos 
   4663   1.1  christos CASE (sem, INSN_WRITE_MACWLO_A) : /* macwlo $src1,$src2,$acc */
   4664   1.1  christos   {
   4665   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4666   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4667   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4668   1.1  christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
   4669   1.1  christos     int UNUSED written = abuf->written;
   4670   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4671   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4672   1.1  christos 
   4673   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4674   1.1  christos 
   4675   1.1  christos #undef OPRND
   4676   1.1  christos #undef FLD
   4677   1.1  christos   }
   4678   1.1  christos   NEXT (vpc);
   4679   1.1  christos 
   4680   1.1  christos   CASE (sem, INSN_PAR_MUL) : /* mul $dr,$sr */
   4681   1.1  christos {
   4682   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4683   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4684   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   4685   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   4686   1.1  christos   int UNUSED written = 0;
   4687   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4688   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4689   1.1  christos 
   4690   1.1  christos   {
   4691   1.1  christos     SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
   4692   1.1  christos     OPRND (dr) = opval;
   4693   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4694   1.1  christos   }
   4695   1.1  christos 
   4696   1.1  christos #undef OPRND
   4697   1.1  christos #undef FLD
   4698   1.1  christos }
   4699   1.1  christos   NEXT (vpc);
   4700   1.1  christos 
   4701   1.1  christos CASE (sem, INSN_WRITE_MUL) : /* mul $dr,$sr */
   4702   1.1  christos   {
   4703   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4704   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4705   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   4706   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   4707   1.1  christos     int UNUSED written = abuf->written;
   4708   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4709   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4710   1.1  christos 
   4711   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4712   1.1  christos 
   4713   1.1  christos #undef OPRND
   4714   1.1  christos #undef FLD
   4715   1.1  christos   }
   4716   1.1  christos   NEXT (vpc);
   4717   1.1  christos 
   4718   1.1  christos   CASE (sem, INSN_PAR_MULHI_A) : /* mulhi $src1,$src2,$acc */
   4719   1.1  christos {
   4720   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4721   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4722   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4723   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4724   1.1  christos   int UNUSED written = 0;
   4725   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4726   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4727   1.1  christos 
   4728   1.1  christos   {
   4729   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
   4730   1.1  christos     OPRND (acc) = opval;
   4731   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4732   1.1  christos   }
   4733   1.1  christos 
   4734   1.1  christos #undef OPRND
   4735   1.1  christos #undef FLD
   4736   1.1  christos }
   4737   1.1  christos   NEXT (vpc);
   4738   1.1  christos 
   4739   1.1  christos CASE (sem, INSN_WRITE_MULHI_A) : /* mulhi $src1,$src2,$acc */
   4740   1.1  christos   {
   4741   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4742   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4743   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4744   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4745   1.1  christos     int UNUSED written = abuf->written;
   4746   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4747   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4748   1.1  christos 
   4749   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4750   1.1  christos 
   4751   1.1  christos #undef OPRND
   4752   1.1  christos #undef FLD
   4753   1.1  christos   }
   4754   1.1  christos   NEXT (vpc);
   4755   1.1  christos 
   4756   1.1  christos   CASE (sem, INSN_PAR_MULLO_A) : /* mullo $src1,$src2,$acc */
   4757   1.1  christos {
   4758   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4759   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4760   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4761   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4762   1.1  christos   int UNUSED written = 0;
   4763   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4764   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4765   1.1  christos 
   4766   1.1  christos   {
   4767   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
   4768   1.1  christos     OPRND (acc) = opval;
   4769   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4770   1.1  christos   }
   4771   1.1  christos 
   4772   1.1  christos #undef OPRND
   4773   1.1  christos #undef FLD
   4774   1.1  christos }
   4775   1.1  christos   NEXT (vpc);
   4776   1.1  christos 
   4777   1.1  christos CASE (sem, INSN_WRITE_MULLO_A) : /* mullo $src1,$src2,$acc */
   4778   1.1  christos   {
   4779   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4780   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4781   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4782   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4783   1.1  christos     int UNUSED written = abuf->written;
   4784   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4785   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4786   1.1  christos 
   4787   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4788   1.1  christos 
   4789   1.1  christos #undef OPRND
   4790   1.1  christos #undef FLD
   4791   1.1  christos   }
   4792   1.1  christos   NEXT (vpc);
   4793   1.1  christos 
   4794   1.1  christos   CASE (sem, INSN_PAR_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
   4795   1.1  christos {
   4796   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4797   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4798   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4799   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4800   1.1  christos   int UNUSED written = 0;
   4801   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4802   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4803   1.1  christos 
   4804   1.1  christos   {
   4805   1.1  christos     DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
   4806   1.1  christos     OPRND (acc) = opval;
   4807   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4808   1.1  christos   }
   4809   1.1  christos 
   4810   1.1  christos #undef OPRND
   4811   1.1  christos #undef FLD
   4812   1.1  christos }
   4813   1.1  christos   NEXT (vpc);
   4814   1.1  christos 
   4815   1.1  christos CASE (sem, INSN_WRITE_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
   4816   1.1  christos   {
   4817   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4818   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4819   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4820   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4821   1.1  christos     int UNUSED written = abuf->written;
   4822   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4823   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4824   1.1  christos 
   4825   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4826   1.1  christos 
   4827   1.1  christos #undef OPRND
   4828   1.1  christos #undef FLD
   4829   1.1  christos   }
   4830   1.1  christos   NEXT (vpc);
   4831   1.1  christos 
   4832   1.1  christos   CASE (sem, INSN_PAR_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
   4833   1.1  christos {
   4834   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4835   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4836   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4837   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4838   1.1  christos   int UNUSED written = 0;
   4839   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4840   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4841   1.1  christos 
   4842   1.1  christos   {
   4843   1.1  christos     DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
   4844   1.1  christos     OPRND (acc) = opval;
   4845   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   4846   1.1  christos   }
   4847   1.1  christos 
   4848   1.1  christos #undef OPRND
   4849   1.1  christos #undef FLD
   4850   1.1  christos }
   4851   1.1  christos   NEXT (vpc);
   4852   1.1  christos 
   4853   1.1  christos CASE (sem, INSN_WRITE_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
   4854   1.1  christos   {
   4855   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4856   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4857   1.1  christos #define FLD(f) abuf->fields.sfmt_machi_a.f
   4858   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
   4859   1.1  christos     int UNUSED written = abuf->written;
   4860   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4861   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4862   1.1  christos 
   4863   1.1  christos   SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
   4864   1.1  christos 
   4865   1.1  christos #undef OPRND
   4866   1.1  christos #undef FLD
   4867   1.1  christos   }
   4868   1.1  christos   NEXT (vpc);
   4869   1.1  christos 
   4870   1.1  christos   CASE (sem, INSN_PAR_MV) : /* mv $dr,$sr */
   4871   1.1  christos {
   4872   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4873   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4874   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4875   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   4876   1.1  christos   int UNUSED written = 0;
   4877   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4878   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4879   1.1  christos 
   4880   1.1  christos   {
   4881   1.1  christos     SI opval = * FLD (i_sr);
   4882   1.1  christos     OPRND (dr) = opval;
   4883   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4884   1.1  christos   }
   4885   1.1  christos 
   4886   1.1  christos #undef OPRND
   4887   1.1  christos #undef FLD
   4888   1.1  christos }
   4889   1.1  christos   NEXT (vpc);
   4890   1.1  christos 
   4891   1.1  christos CASE (sem, INSN_WRITE_MV) : /* mv $dr,$sr */
   4892   1.1  christos   {
   4893   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4894   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4895   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   4896   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   4897   1.1  christos     int UNUSED written = abuf->written;
   4898   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4899   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4900   1.1  christos 
   4901   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4902   1.1  christos 
   4903   1.1  christos #undef OPRND
   4904   1.1  christos #undef FLD
   4905   1.1  christos   }
   4906   1.1  christos   NEXT (vpc);
   4907   1.1  christos 
   4908   1.1  christos   CASE (sem, INSN_PAR_MVFACHI_A) : /* mvfachi $dr,$accs */
   4909   1.1  christos {
   4910   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4911   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4912   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   4913   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   4914   1.1  christos   int UNUSED written = 0;
   4915   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4916   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4917   1.1  christos 
   4918   1.1  christos   {
   4919   1.1  christos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
   4920   1.1  christos     OPRND (dr) = opval;
   4921   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4922   1.1  christos   }
   4923   1.1  christos 
   4924   1.1  christos #undef OPRND
   4925   1.1  christos #undef FLD
   4926   1.1  christos }
   4927   1.1  christos   NEXT (vpc);
   4928   1.1  christos 
   4929   1.1  christos CASE (sem, INSN_WRITE_MVFACHI_A) : /* mvfachi $dr,$accs */
   4930   1.1  christos   {
   4931   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4932   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4933   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   4934   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   4935   1.1  christos     int UNUSED written = abuf->written;
   4936   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4937   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4938   1.1  christos 
   4939   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4940   1.1  christos 
   4941   1.1  christos #undef OPRND
   4942   1.1  christos #undef FLD
   4943   1.1  christos   }
   4944   1.1  christos   NEXT (vpc);
   4945   1.1  christos 
   4946   1.1  christos   CASE (sem, INSN_PAR_MVFACLO_A) : /* mvfaclo $dr,$accs */
   4947   1.1  christos {
   4948   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4949   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4950   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   4951   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   4952   1.1  christos   int UNUSED written = 0;
   4953   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4954   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4955   1.1  christos 
   4956   1.1  christos   {
   4957   1.1  christos     SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
   4958   1.1  christos     OPRND (dr) = opval;
   4959   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4960   1.1  christos   }
   4961   1.1  christos 
   4962   1.1  christos #undef OPRND
   4963   1.1  christos #undef FLD
   4964   1.1  christos }
   4965   1.1  christos   NEXT (vpc);
   4966   1.1  christos 
   4967   1.1  christos CASE (sem, INSN_WRITE_MVFACLO_A) : /* mvfaclo $dr,$accs */
   4968   1.1  christos   {
   4969   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4970   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   4971   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   4972   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   4973   1.1  christos     int UNUSED written = abuf->written;
   4974   1.1  christos     IADDR UNUSED pc = abuf->addr;
   4975   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   4976   1.1  christos 
   4977   1.1  christos   * FLD (i_dr) = OPRND (dr);
   4978   1.1  christos 
   4979   1.1  christos #undef OPRND
   4980   1.1  christos #undef FLD
   4981   1.1  christos   }
   4982   1.1  christos   NEXT (vpc);
   4983   1.1  christos 
   4984   1.1  christos   CASE (sem, INSN_PAR_MVFACMI_A) : /* mvfacmi $dr,$accs */
   4985   1.1  christos {
   4986   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   4987   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   4988   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   4989   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   4990   1.1  christos   int UNUSED written = 0;
   4991   1.1  christos   IADDR UNUSED pc = abuf->addr;
   4992   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   4993   1.1  christos 
   4994   1.1  christos   {
   4995   1.1  christos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
   4996   1.1  christos     OPRND (dr) = opval;
   4997   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   4998   1.1  christos   }
   4999   1.1  christos 
   5000   1.1  christos #undef OPRND
   5001   1.1  christos #undef FLD
   5002   1.1  christos }
   5003   1.1  christos   NEXT (vpc);
   5004   1.1  christos 
   5005   1.1  christos CASE (sem, INSN_WRITE_MVFACMI_A) : /* mvfacmi $dr,$accs */
   5006   1.1  christos   {
   5007   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5008   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5009   1.1  christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
   5010   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
   5011   1.1  christos     int UNUSED written = abuf->written;
   5012   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5013   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5014   1.1  christos 
   5015   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5016   1.1  christos 
   5017   1.1  christos #undef OPRND
   5018   1.1  christos #undef FLD
   5019   1.1  christos   }
   5020   1.1  christos   NEXT (vpc);
   5021   1.1  christos 
   5022   1.1  christos   CASE (sem, INSN_PAR_MVFC) : /* mvfc $dr,$scr */
   5023   1.1  christos {
   5024   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5025   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5026   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5027   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfc.f
   5028   1.1  christos   int UNUSED written = 0;
   5029   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5030   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5031   1.1  christos 
   5032   1.1  christos   {
   5033   1.1  christos     SI opval = GET_H_CR (FLD (f_r2));
   5034   1.1  christos     OPRND (dr) = opval;
   5035   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5036   1.1  christos   }
   5037   1.1  christos 
   5038   1.1  christos #undef OPRND
   5039   1.1  christos #undef FLD
   5040   1.1  christos }
   5041   1.1  christos   NEXT (vpc);
   5042   1.1  christos 
   5043   1.1  christos CASE (sem, INSN_WRITE_MVFC) : /* mvfc $dr,$scr */
   5044   1.1  christos   {
   5045   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5046   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5047   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5048   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvfc.f
   5049   1.1  christos     int UNUSED written = abuf->written;
   5050   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5051   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5052   1.1  christos 
   5053   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5054   1.1  christos 
   5055   1.1  christos #undef OPRND
   5056   1.1  christos #undef FLD
   5057   1.1  christos   }
   5058   1.1  christos   NEXT (vpc);
   5059   1.1  christos 
   5060   1.1  christos   CASE (sem, INSN_PAR_MVTACHI_A) : /* mvtachi $src1,$accs */
   5061   1.1  christos {
   5062   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5063   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5064   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   5065   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
   5066   1.1  christos   int UNUSED written = 0;
   5067   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5068   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5069   1.1  christos 
   5070   1.1  christos   {
   5071   1.1  christos     DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
   5072   1.1  christos     OPRND (accs) = opval;
   5073   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   5074   1.1  christos   }
   5075   1.1  christos 
   5076   1.1  christos #undef OPRND
   5077   1.1  christos #undef FLD
   5078   1.1  christos }
   5079   1.1  christos   NEXT (vpc);
   5080   1.1  christos 
   5081   1.1  christos CASE (sem, INSN_WRITE_MVTACHI_A) : /* mvtachi $src1,$accs */
   5082   1.1  christos   {
   5083   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5084   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5085   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   5086   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
   5087   1.1  christos     int UNUSED written = abuf->written;
   5088   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5089   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5090   1.1  christos 
   5091   1.1  christos   SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
   5092   1.1  christos 
   5093   1.1  christos #undef OPRND
   5094   1.1  christos #undef FLD
   5095   1.1  christos   }
   5096   1.1  christos   NEXT (vpc);
   5097   1.1  christos 
   5098   1.1  christos   CASE (sem, INSN_PAR_MVTACLO_A) : /* mvtaclo $src1,$accs */
   5099   1.1  christos {
   5100   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5101   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5102   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   5103   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
   5104   1.1  christos   int UNUSED written = 0;
   5105   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5106   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5107   1.1  christos 
   5108   1.1  christos   {
   5109   1.1  christos     DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
   5110   1.1  christos     OPRND (accs) = opval;
   5111   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   5112   1.1  christos   }
   5113   1.1  christos 
   5114   1.1  christos #undef OPRND
   5115   1.1  christos #undef FLD
   5116   1.1  christos }
   5117   1.1  christos   NEXT (vpc);
   5118   1.1  christos 
   5119   1.1  christos CASE (sem, INSN_WRITE_MVTACLO_A) : /* mvtaclo $src1,$accs */
   5120   1.1  christos   {
   5121   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5122   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5123   1.1  christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
   5124   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
   5125   1.1  christos     int UNUSED written = abuf->written;
   5126   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5127   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5128   1.1  christos 
   5129   1.1  christos   SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
   5130   1.1  christos 
   5131   1.1  christos #undef OPRND
   5132   1.1  christos #undef FLD
   5133   1.1  christos   }
   5134   1.1  christos   NEXT (vpc);
   5135   1.1  christos 
   5136   1.1  christos   CASE (sem, INSN_PAR_MVTC) : /* mvtc $sr,$dcr */
   5137   1.1  christos {
   5138   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5139   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5140   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5141   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtc.f
   5142   1.1  christos   int UNUSED written = 0;
   5143   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5144   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5145   1.1  christos 
   5146   1.1  christos   {
   5147   1.1  christos     USI opval = * FLD (i_sr);
   5148   1.1  christos     OPRND (dcr) = opval;
   5149   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   5150   1.1  christos   }
   5151   1.1  christos 
   5152   1.1  christos #undef OPRND
   5153   1.1  christos #undef FLD
   5154   1.1  christos }
   5155   1.1  christos   NEXT (vpc);
   5156   1.1  christos 
   5157   1.1  christos CASE (sem, INSN_WRITE_MVTC) : /* mvtc $sr,$dcr */
   5158   1.1  christos   {
   5159   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5160   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5161   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5162   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mvtc.f
   5163   1.1  christos     int UNUSED written = abuf->written;
   5164   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5165   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5166   1.1  christos 
   5167   1.1  christos   SET_H_CR (FLD (f_r1), OPRND (dcr));
   5168   1.1  christos 
   5169   1.1  christos #undef OPRND
   5170   1.1  christos #undef FLD
   5171   1.1  christos   }
   5172   1.1  christos   NEXT (vpc);
   5173   1.1  christos 
   5174   1.1  christos   CASE (sem, INSN_PAR_NEG) : /* neg $dr,$sr */
   5175   1.1  christos {
   5176   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5177   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5178   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5179   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   5180   1.1  christos   int UNUSED written = 0;
   5181   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5182   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5183   1.1  christos 
   5184   1.1  christos   {
   5185   1.1  christos     SI opval = NEGSI (* FLD (i_sr));
   5186   1.1  christos     OPRND (dr) = opval;
   5187   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5188   1.1  christos   }
   5189   1.1  christos 
   5190   1.1  christos #undef OPRND
   5191   1.1  christos #undef FLD
   5192   1.1  christos }
   5193   1.1  christos   NEXT (vpc);
   5194   1.1  christos 
   5195   1.1  christos CASE (sem, INSN_WRITE_NEG) : /* neg $dr,$sr */
   5196   1.1  christos   {
   5197   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5198   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5199   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5200   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   5201   1.1  christos     int UNUSED written = abuf->written;
   5202   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5203   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5204   1.1  christos 
   5205   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5206   1.1  christos 
   5207   1.1  christos #undef OPRND
   5208   1.1  christos #undef FLD
   5209   1.1  christos   }
   5210   1.1  christos   NEXT (vpc);
   5211   1.1  christos 
   5212   1.1  christos   CASE (sem, INSN_PAR_NOP) : /* nop */
   5213   1.1  christos {
   5214   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5215   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5216   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   5217   1.1  christos #define OPRND(f) par_exec->operands.sfmt_nop.f
   5218   1.1  christos   int UNUSED written = 0;
   5219   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5220   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5221   1.1  christos 
   5222   1.1  christos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
   5223   1.1  christos 
   5224   1.1  christos #undef OPRND
   5225   1.1  christos #undef FLD
   5226   1.1  christos }
   5227   1.1  christos   NEXT (vpc);
   5228   1.1  christos 
   5229   1.1  christos CASE (sem, INSN_WRITE_NOP) : /* nop */
   5230   1.1  christos   {
   5231   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5232   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5233   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   5234   1.1  christos #define OPRND(f) par_exec->operands.sfmt_nop.f
   5235   1.1  christos     int UNUSED written = abuf->written;
   5236   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5237   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5238   1.1  christos 
   5239   1.1  christos 
   5240   1.1  christos #undef OPRND
   5241   1.1  christos #undef FLD
   5242   1.1  christos   }
   5243   1.1  christos   NEXT (vpc);
   5244   1.1  christos 
   5245   1.1  christos   CASE (sem, INSN_PAR_NOT) : /* not $dr,$sr */
   5246   1.1  christos {
   5247   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5248   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5249   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5250   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   5251   1.1  christos   int UNUSED written = 0;
   5252   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5253   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5254   1.1  christos 
   5255   1.1  christos   {
   5256   1.1  christos     SI opval = INVSI (* FLD (i_sr));
   5257   1.1  christos     OPRND (dr) = opval;
   5258   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5259   1.1  christos   }
   5260   1.1  christos 
   5261   1.1  christos #undef OPRND
   5262   1.1  christos #undef FLD
   5263   1.1  christos }
   5264   1.1  christos   NEXT (vpc);
   5265   1.1  christos 
   5266   1.1  christos CASE (sem, INSN_WRITE_NOT) : /* not $dr,$sr */
   5267   1.1  christos   {
   5268   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5269   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5270   1.1  christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
   5271   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mv.f
   5272   1.1  christos     int UNUSED written = abuf->written;
   5273   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5274   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5275   1.1  christos 
   5276   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5277   1.1  christos 
   5278   1.1  christos #undef OPRND
   5279   1.1  christos #undef FLD
   5280   1.1  christos   }
   5281   1.1  christos   NEXT (vpc);
   5282   1.1  christos 
   5283   1.1  christos   CASE (sem, INSN_PAR_RAC_DSI) : /* rac $accd,$accs,$imm1 */
   5284   1.1  christos {
   5285   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5286   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5287   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   5288   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
   5289   1.1  christos   int UNUSED written = 0;
   5290   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5291   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5292   1.1  christos 
   5293   1.1  christos {
   5294   1.1  christos   DI tmp_tmp1;
   5295   1.1  christos   tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
   5296   1.1  christos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
   5297   1.1  christos   {
   5298   1.1  christos     DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
   5299   1.1  christos     OPRND (accd) = opval;
   5300   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   5301   1.1  christos   }
   5302   1.1  christos }
   5303   1.1  christos 
   5304   1.1  christos #undef OPRND
   5305   1.1  christos #undef FLD
   5306   1.1  christos }
   5307   1.1  christos   NEXT (vpc);
   5308   1.1  christos 
   5309   1.1  christos CASE (sem, INSN_WRITE_RAC_DSI) : /* rac $accd,$accs,$imm1 */
   5310   1.1  christos   {
   5311   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5312   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5313   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   5314   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
   5315   1.1  christos     int UNUSED written = abuf->written;
   5316   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5317   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5318   1.1  christos 
   5319   1.1  christos   SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
   5320   1.1  christos 
   5321   1.1  christos #undef OPRND
   5322   1.1  christos #undef FLD
   5323   1.1  christos   }
   5324   1.1  christos   NEXT (vpc);
   5325   1.1  christos 
   5326   1.1  christos   CASE (sem, INSN_PAR_RACH_DSI) : /* rach $accd,$accs,$imm1 */
   5327   1.1  christos {
   5328   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5329   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5330   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   5331   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
   5332   1.1  christos   int UNUSED written = 0;
   5333   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5334   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5335   1.1  christos 
   5336   1.1  christos {
   5337   1.1  christos   DI tmp_tmp1;
   5338   1.1  christos   tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
   5339   1.1  christos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
   5340   1.1  christos   {
   5341   1.1  christos     DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
   5342   1.1  christos     OPRND (accd) = opval;
   5343   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   5344   1.1  christos   }
   5345   1.1  christos }
   5346   1.1  christos 
   5347   1.1  christos #undef OPRND
   5348   1.1  christos #undef FLD
   5349   1.1  christos }
   5350   1.1  christos   NEXT (vpc);
   5351   1.1  christos 
   5352   1.1  christos CASE (sem, INSN_WRITE_RACH_DSI) : /* rach $accd,$accs,$imm1 */
   5353   1.1  christos   {
   5354   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5355   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5356   1.1  christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
   5357   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
   5358   1.1  christos     int UNUSED written = abuf->written;
   5359   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5360   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5361   1.1  christos 
   5362   1.1  christos   SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
   5363   1.1  christos 
   5364   1.1  christos #undef OPRND
   5365   1.1  christos #undef FLD
   5366   1.1  christos   }
   5367   1.1  christos   NEXT (vpc);
   5368   1.1  christos 
   5369   1.1  christos   CASE (sem, INSN_PAR_RTE) : /* rte */
   5370   1.1  christos {
   5371   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5372   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5373   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   5374   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rte.f
   5375   1.1  christos   int UNUSED written = 0;
   5376   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5377   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5378   1.1  christos 
   5379   1.1  christos {
   5380   1.1  christos   {
   5381   1.1  christos     USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
   5382   1.1  christos     OPRND (pc) = opval;
   5383   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   5384   1.1  christos   }
   5385   1.1  christos   {
   5386   1.1  christos     USI opval = GET_H_CR (((UINT) 14));
   5387   1.1  christos     OPRND (h_cr_USI_6) = opval;
   5388   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   5389   1.1  christos   }
   5390   1.1  christos   {
   5391   1.1  christos     UQI opval = CPU (h_bpsw);
   5392   1.1  christos     OPRND (h_psw_UQI) = opval;
   5393   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
   5394   1.1  christos   }
   5395   1.1  christos   {
   5396   1.1  christos     UQI opval = CPU (h_bbpsw);
   5397   1.1  christos     OPRND (h_bpsw_UQI) = opval;
   5398   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
   5399   1.1  christos   }
   5400   1.1  christos }
   5401   1.1  christos 
   5402   1.1  christos #undef OPRND
   5403   1.1  christos #undef FLD
   5404   1.1  christos }
   5405   1.1  christos   NEXT (vpc);
   5406   1.1  christos 
   5407   1.1  christos CASE (sem, INSN_WRITE_RTE) : /* rte */
   5408   1.1  christos   {
   5409   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5410   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5411   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   5412   1.1  christos #define OPRND(f) par_exec->operands.sfmt_rte.f
   5413   1.1  christos     int UNUSED written = abuf->written;
   5414   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5415   1.1  christos     SEM_BRANCH_INIT
   5416   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5417   1.1  christos 
   5418   1.1  christos   CPU (h_bpsw) = OPRND (h_bpsw_UQI);
   5419   1.1  christos   SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
   5420   1.1  christos   SET_H_PSW (OPRND (h_psw_UQI));
   5421   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   5422   1.1  christos 
   5423   1.1  christos   SEM_BRANCH_FINI (vpc);
   5424   1.1  christos #undef OPRND
   5425   1.1  christos #undef FLD
   5426   1.1  christos   }
   5427   1.1  christos   NEXT (vpc);
   5428   1.1  christos 
   5429   1.1  christos   CASE (sem, INSN_PAR_SLL) : /* sll $dr,$sr */
   5430   1.1  christos {
   5431   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5432   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5433   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5434   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5435   1.1  christos   int UNUSED written = 0;
   5436   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5437   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5438   1.1  christos 
   5439   1.1  christos   {
   5440   1.1  christos     SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   5441   1.1  christos     OPRND (dr) = opval;
   5442   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5443   1.1  christos   }
   5444   1.1  christos 
   5445   1.1  christos #undef OPRND
   5446   1.1  christos #undef FLD
   5447   1.1  christos }
   5448   1.1  christos   NEXT (vpc);
   5449   1.1  christos 
   5450   1.1  christos CASE (sem, INSN_WRITE_SLL) : /* sll $dr,$sr */
   5451   1.1  christos   {
   5452   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5453   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5454   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5455   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5456   1.1  christos     int UNUSED written = abuf->written;
   5457   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5458   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5459   1.1  christos 
   5460   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5461   1.1  christos 
   5462   1.1  christos #undef OPRND
   5463   1.1  christos #undef FLD
   5464   1.1  christos   }
   5465   1.1  christos   NEXT (vpc);
   5466   1.1  christos 
   5467   1.1  christos   CASE (sem, INSN_PAR_SLLI) : /* slli $dr,$uimm5 */
   5468   1.1  christos {
   5469   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5470   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5471   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5472   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5473   1.1  christos   int UNUSED written = 0;
   5474   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5475   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5476   1.1  christos 
   5477   1.1  christos   {
   5478   1.1  christos     SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
   5479   1.1  christos     OPRND (dr) = opval;
   5480   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5481   1.1  christos   }
   5482   1.1  christos 
   5483   1.1  christos #undef OPRND
   5484   1.1  christos #undef FLD
   5485   1.1  christos }
   5486   1.1  christos   NEXT (vpc);
   5487   1.1  christos 
   5488   1.1  christos CASE (sem, INSN_WRITE_SLLI) : /* slli $dr,$uimm5 */
   5489   1.1  christos   {
   5490   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5491   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5492   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5493   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5494   1.1  christos     int UNUSED written = abuf->written;
   5495   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5496   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5497   1.1  christos 
   5498   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5499   1.1  christos 
   5500   1.1  christos #undef OPRND
   5501   1.1  christos #undef FLD
   5502   1.1  christos   }
   5503   1.1  christos   NEXT (vpc);
   5504   1.1  christos 
   5505   1.1  christos   CASE (sem, INSN_PAR_SRA) : /* sra $dr,$sr */
   5506   1.1  christos {
   5507   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5508   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5509   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5510   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5511   1.1  christos   int UNUSED written = 0;
   5512   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5513   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5514   1.1  christos 
   5515   1.1  christos   {
   5516   1.1  christos     SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   5517   1.1  christos     OPRND (dr) = opval;
   5518   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5519   1.1  christos   }
   5520   1.1  christos 
   5521   1.1  christos #undef OPRND
   5522   1.1  christos #undef FLD
   5523   1.1  christos }
   5524   1.1  christos   NEXT (vpc);
   5525   1.1  christos 
   5526   1.1  christos CASE (sem, INSN_WRITE_SRA) : /* sra $dr,$sr */
   5527   1.1  christos   {
   5528   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5529   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5530   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5531   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5532   1.1  christos     int UNUSED written = abuf->written;
   5533   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5534   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5535   1.1  christos 
   5536   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5537   1.1  christos 
   5538   1.1  christos #undef OPRND
   5539   1.1  christos #undef FLD
   5540   1.1  christos   }
   5541   1.1  christos   NEXT (vpc);
   5542   1.1  christos 
   5543   1.1  christos   CASE (sem, INSN_PAR_SRAI) : /* srai $dr,$uimm5 */
   5544   1.1  christos {
   5545   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5546   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5547   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5548   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5549   1.1  christos   int UNUSED written = 0;
   5550   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5551   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5552   1.1  christos 
   5553   1.1  christos   {
   5554   1.1  christos     SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
   5555   1.1  christos     OPRND (dr) = opval;
   5556   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5557   1.1  christos   }
   5558   1.1  christos 
   5559   1.1  christos #undef OPRND
   5560   1.1  christos #undef FLD
   5561   1.1  christos }
   5562   1.1  christos   NEXT (vpc);
   5563   1.1  christos 
   5564   1.1  christos CASE (sem, INSN_WRITE_SRAI) : /* srai $dr,$uimm5 */
   5565   1.1  christos   {
   5566   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5567   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5568   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5569   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5570   1.1  christos     int UNUSED written = abuf->written;
   5571   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5572   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5573   1.1  christos 
   5574   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5575   1.1  christos 
   5576   1.1  christos #undef OPRND
   5577   1.1  christos #undef FLD
   5578   1.1  christos   }
   5579   1.1  christos   NEXT (vpc);
   5580   1.1  christos 
   5581   1.1  christos   CASE (sem, INSN_PAR_SRL) : /* srl $dr,$sr */
   5582   1.1  christos {
   5583   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5584   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5585   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5586   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5587   1.1  christos   int UNUSED written = 0;
   5588   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5589   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5590   1.1  christos 
   5591   1.1  christos   {
   5592   1.1  christos     SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
   5593   1.1  christos     OPRND (dr) = opval;
   5594   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5595   1.1  christos   }
   5596   1.1  christos 
   5597   1.1  christos #undef OPRND
   5598   1.1  christos #undef FLD
   5599   1.1  christos }
   5600   1.1  christos   NEXT (vpc);
   5601   1.1  christos 
   5602   1.1  christos CASE (sem, INSN_WRITE_SRL) : /* srl $dr,$sr */
   5603   1.1  christos   {
   5604   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5605   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5606   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5607   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5608   1.1  christos     int UNUSED written = abuf->written;
   5609   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5610   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5611   1.1  christos 
   5612   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5613   1.1  christos 
   5614   1.1  christos #undef OPRND
   5615   1.1  christos #undef FLD
   5616   1.1  christos   }
   5617   1.1  christos   NEXT (vpc);
   5618   1.1  christos 
   5619   1.1  christos   CASE (sem, INSN_PAR_SRLI) : /* srli $dr,$uimm5 */
   5620   1.1  christos {
   5621   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5622   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5623   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5624   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5625   1.1  christos   int UNUSED written = 0;
   5626   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5627   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5628   1.1  christos 
   5629   1.1  christos   {
   5630   1.1  christos     SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
   5631   1.1  christos     OPRND (dr) = opval;
   5632   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5633   1.1  christos   }
   5634   1.1  christos 
   5635   1.1  christos #undef OPRND
   5636   1.1  christos #undef FLD
   5637   1.1  christos }
   5638   1.1  christos   NEXT (vpc);
   5639   1.1  christos 
   5640   1.1  christos CASE (sem, INSN_WRITE_SRLI) : /* srli $dr,$uimm5 */
   5641   1.1  christos   {
   5642   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5643   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5644   1.1  christos #define FLD(f) abuf->fields.sfmt_slli.f
   5645   1.1  christos #define OPRND(f) par_exec->operands.sfmt_slli.f
   5646   1.1  christos     int UNUSED written = abuf->written;
   5647   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5648   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5649   1.1  christos 
   5650   1.1  christos   * FLD (i_dr) = OPRND (dr);
   5651   1.1  christos 
   5652   1.1  christos #undef OPRND
   5653   1.1  christos #undef FLD
   5654   1.1  christos   }
   5655   1.1  christos   NEXT (vpc);
   5656   1.1  christos 
   5657   1.1  christos   CASE (sem, INSN_PAR_ST) : /* st $src1,@$src2 */
   5658   1.1  christos {
   5659   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5660   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5661   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5662   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st.f
   5663   1.1  christos   int UNUSED written = 0;
   5664   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5665   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5666   1.1  christos 
   5667   1.1  christos   {
   5668   1.1  christos     SI opval = * FLD (i_src1);
   5669   1.1  christos     OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
   5670   1.1  christos     OPRND (h_memory_SI_src2) = opval;
   5671   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5672   1.1  christos   }
   5673   1.1  christos 
   5674   1.1  christos #undef OPRND
   5675   1.1  christos #undef FLD
   5676   1.1  christos }
   5677   1.1  christos   NEXT (vpc);
   5678   1.1  christos 
   5679   1.1  christos CASE (sem, INSN_WRITE_ST) : /* st $src1,@$src2 */
   5680   1.1  christos   {
   5681   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5682   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5683   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5684   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st.f
   5685   1.1  christos     int UNUSED written = abuf->written;
   5686   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5687   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5688   1.1  christos 
   5689   1.1  christos   SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
   5690   1.1  christos 
   5691   1.1  christos #undef OPRND
   5692   1.1  christos #undef FLD
   5693   1.1  christos   }
   5694   1.1  christos   NEXT (vpc);
   5695   1.1  christos 
   5696   1.1  christos   CASE (sem, INSN_PAR_STB) : /* stb $src1,@$src2 */
   5697   1.1  christos {
   5698   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5699   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5700   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5701   1.1  christos #define OPRND(f) par_exec->operands.sfmt_stb.f
   5702   1.1  christos   int UNUSED written = 0;
   5703   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5704   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5705   1.1  christos 
   5706   1.1  christos   {
   5707   1.1  christos     QI opval = * FLD (i_src1);
   5708   1.1  christos     OPRND (h_memory_QI_src2_idx) = * FLD (i_src2);
   5709   1.1  christos     OPRND (h_memory_QI_src2) = opval;
   5710   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5711   1.1  christos   }
   5712   1.1  christos 
   5713   1.1  christos #undef OPRND
   5714   1.1  christos #undef FLD
   5715   1.1  christos }
   5716   1.1  christos   NEXT (vpc);
   5717   1.1  christos 
   5718   1.1  christos CASE (sem, INSN_WRITE_STB) : /* stb $src1,@$src2 */
   5719   1.1  christos   {
   5720   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5721   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5722   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5723   1.1  christos #define OPRND(f) par_exec->operands.sfmt_stb.f
   5724   1.1  christos     int UNUSED written = abuf->written;
   5725   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5726   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5727   1.1  christos 
   5728   1.1  christos   SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_src2_idx), OPRND (h_memory_QI_src2));
   5729   1.1  christos 
   5730   1.1  christos #undef OPRND
   5731   1.1  christos #undef FLD
   5732   1.1  christos   }
   5733   1.1  christos   NEXT (vpc);
   5734   1.1  christos 
   5735   1.1  christos   CASE (sem, INSN_PAR_STH) : /* sth $src1,@$src2 */
   5736   1.1  christos {
   5737   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5738   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5739   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5740   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sth.f
   5741   1.1  christos   int UNUSED written = 0;
   5742   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5743   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5744   1.1  christos 
   5745   1.1  christos   {
   5746   1.1  christos     HI opval = * FLD (i_src1);
   5747   1.1  christos     OPRND (h_memory_HI_src2_idx) = * FLD (i_src2);
   5748   1.1  christos     OPRND (h_memory_HI_src2) = opval;
   5749   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5750   1.1  christos   }
   5751   1.1  christos 
   5752   1.1  christos #undef OPRND
   5753   1.1  christos #undef FLD
   5754   1.1  christos }
   5755   1.1  christos   NEXT (vpc);
   5756   1.1  christos 
   5757   1.1  christos CASE (sem, INSN_WRITE_STH) : /* sth $src1,@$src2 */
   5758   1.1  christos   {
   5759   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5760   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5761   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5762   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sth.f
   5763   1.1  christos     int UNUSED written = abuf->written;
   5764   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5765   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5766   1.1  christos 
   5767   1.1  christos   SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_src2_idx), OPRND (h_memory_HI_src2));
   5768   1.1  christos 
   5769   1.1  christos #undef OPRND
   5770   1.1  christos #undef FLD
   5771   1.1  christos   }
   5772   1.1  christos   NEXT (vpc);
   5773   1.1  christos 
   5774   1.1  christos   CASE (sem, INSN_PAR_ST_PLUS) : /* st $src1,@+$src2 */
   5775   1.1  christos {
   5776   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5777   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5778   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5779   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
   5780   1.1  christos   int UNUSED written = 0;
   5781   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5782   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5783   1.1  christos 
   5784   1.1  christos {
   5785   1.1  christos   SI tmp_new_src2;
   5786   1.1  christos   tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
   5787   1.1  christos   {
   5788   1.1  christos     SI opval = * FLD (i_src1);
   5789   1.1  christos     OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
   5790   1.1  christos     OPRND (h_memory_SI_new_src2) = opval;
   5791   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5792   1.1  christos   }
   5793   1.1  christos   {
   5794   1.1  christos     SI opval = tmp_new_src2;
   5795   1.1  christos     OPRND (src2) = opval;
   5796   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5797   1.1  christos   }
   5798   1.1  christos }
   5799   1.1  christos 
   5800   1.1  christos #undef OPRND
   5801   1.1  christos #undef FLD
   5802   1.1  christos }
   5803   1.1  christos   NEXT (vpc);
   5804   1.1  christos 
   5805   1.1  christos CASE (sem, INSN_WRITE_ST_PLUS) : /* st $src1,@+$src2 */
   5806   1.1  christos   {
   5807   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5808   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5809   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5810   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
   5811   1.1  christos     int UNUSED written = abuf->written;
   5812   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5813   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5814   1.1  christos 
   5815   1.1  christos   SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
   5816   1.1  christos   * FLD (i_src2) = OPRND (src2);
   5817   1.1  christos 
   5818   1.1  christos #undef OPRND
   5819   1.1  christos #undef FLD
   5820   1.1  christos   }
   5821   1.1  christos   NEXT (vpc);
   5822   1.1  christos 
   5823   1.1  christos   CASE (sem, INSN_PAR_STH_PLUS) : /* sth $src1,@$src2+ */
   5824   1.1  christos {
   5825   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5826   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5827   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5828   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sth_plus.f
   5829   1.1  christos   int UNUSED written = 0;
   5830   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5831   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5832   1.1  christos 
   5833   1.1  christos {
   5834   1.1  christos   SI tmp_new_src2;
   5835   1.1  christos   tmp_new_src2 = * FLD (i_src2);
   5836   1.1  christos   {
   5837   1.1  christos     HI opval = * FLD (i_src1);
   5838   1.1  christos     OPRND (h_memory_HI_new_src2_idx) = tmp_new_src2;
   5839   1.1  christos     OPRND (h_memory_HI_new_src2) = opval;
   5840   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5841   1.1  christos   }
   5842   1.1  christos   {
   5843   1.1  christos     SI opval = ADDSI (tmp_new_src2, 2);
   5844   1.1  christos     OPRND (src2) = opval;
   5845   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5846   1.1  christos   }
   5847   1.1  christos }
   5848   1.1  christos 
   5849   1.1  christos #undef OPRND
   5850   1.1  christos #undef FLD
   5851   1.1  christos }
   5852   1.1  christos   NEXT (vpc);
   5853   1.1  christos 
   5854   1.1  christos CASE (sem, INSN_WRITE_STH_PLUS) : /* sth $src1,@$src2+ */
   5855   1.1  christos   {
   5856   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5857   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5858   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5859   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sth_plus.f
   5860   1.1  christos     int UNUSED written = abuf->written;
   5861   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5862   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5863   1.1  christos 
   5864   1.1  christos   SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_new_src2_idx), OPRND (h_memory_HI_new_src2));
   5865   1.1  christos   * FLD (i_src2) = OPRND (src2);
   5866   1.1  christos 
   5867   1.1  christos #undef OPRND
   5868   1.1  christos #undef FLD
   5869   1.1  christos   }
   5870   1.1  christos   NEXT (vpc);
   5871   1.1  christos 
   5872   1.1  christos   CASE (sem, INSN_PAR_STB_PLUS) : /* stb $src1,@$src2+ */
   5873   1.1  christos {
   5874   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5875   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5876   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5877   1.1  christos #define OPRND(f) par_exec->operands.sfmt_stb_plus.f
   5878   1.1  christos   int UNUSED written = 0;
   5879   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5880   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5881   1.1  christos 
   5882   1.1  christos {
   5883   1.1  christos   SI tmp_new_src2;
   5884   1.1  christos   tmp_new_src2 = * FLD (i_src2);
   5885   1.1  christos   {
   5886   1.1  christos     QI opval = * FLD (i_src1);
   5887   1.1  christos     OPRND (h_memory_QI_new_src2_idx) = tmp_new_src2;
   5888   1.1  christos     OPRND (h_memory_QI_new_src2) = opval;
   5889   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5890   1.1  christos   }
   5891   1.1  christos   {
   5892   1.1  christos     SI opval = ADDSI (tmp_new_src2, 1);
   5893   1.1  christos     OPRND (src2) = opval;
   5894   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5895   1.1  christos   }
   5896   1.1  christos }
   5897   1.1  christos 
   5898   1.1  christos #undef OPRND
   5899   1.1  christos #undef FLD
   5900   1.1  christos }
   5901   1.1  christos   NEXT (vpc);
   5902   1.1  christos 
   5903   1.1  christos CASE (sem, INSN_WRITE_STB_PLUS) : /* stb $src1,@$src2+ */
   5904   1.1  christos   {
   5905   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5906   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5907   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5908   1.1  christos #define OPRND(f) par_exec->operands.sfmt_stb_plus.f
   5909   1.1  christos     int UNUSED written = abuf->written;
   5910   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5911   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5912   1.1  christos 
   5913   1.1  christos   SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_new_src2_idx), OPRND (h_memory_QI_new_src2));
   5914   1.1  christos   * FLD (i_src2) = OPRND (src2);
   5915   1.1  christos 
   5916   1.1  christos #undef OPRND
   5917   1.1  christos #undef FLD
   5918   1.1  christos   }
   5919   1.1  christos   NEXT (vpc);
   5920   1.1  christos 
   5921   1.1  christos   CASE (sem, INSN_PAR_ST_MINUS) : /* st $src1,@-$src2 */
   5922   1.1  christos {
   5923   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5924   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5925   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5926   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
   5927   1.1  christos   int UNUSED written = 0;
   5928   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5929   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5930   1.1  christos 
   5931   1.1  christos {
   5932   1.1  christos   SI tmp_new_src2;
   5933   1.1  christos   tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
   5934   1.1  christos   {
   5935   1.1  christos     SI opval = * FLD (i_src1);
   5936   1.1  christos     OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
   5937   1.1  christos     OPRND (h_memory_SI_new_src2) = opval;
   5938   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   5939   1.1  christos   }
   5940   1.1  christos   {
   5941   1.1  christos     SI opval = tmp_new_src2;
   5942   1.1  christos     OPRND (src2) = opval;
   5943   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5944   1.1  christos   }
   5945   1.1  christos }
   5946   1.1  christos 
   5947   1.1  christos #undef OPRND
   5948   1.1  christos #undef FLD
   5949   1.1  christos }
   5950   1.1  christos   NEXT (vpc);
   5951   1.1  christos 
   5952   1.1  christos CASE (sem, INSN_WRITE_ST_MINUS) : /* st $src1,@-$src2 */
   5953   1.1  christos   {
   5954   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5955   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5956   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   5957   1.1  christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
   5958   1.1  christos     int UNUSED written = abuf->written;
   5959   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5960   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   5961   1.1  christos 
   5962   1.1  christos   SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
   5963   1.1  christos   * FLD (i_src2) = OPRND (src2);
   5964   1.1  christos 
   5965   1.1  christos #undef OPRND
   5966   1.1  christos #undef FLD
   5967   1.1  christos   }
   5968   1.1  christos   NEXT (vpc);
   5969   1.1  christos 
   5970   1.1  christos   CASE (sem, INSN_PAR_SUB) : /* sub $dr,$sr */
   5971   1.1  christos {
   5972   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5973   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   5974   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5975   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5976   1.1  christos   int UNUSED written = 0;
   5977   1.1  christos   IADDR UNUSED pc = abuf->addr;
   5978   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   5979   1.1  christos 
   5980   1.1  christos   {
   5981   1.1  christos     SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
   5982   1.1  christos     OPRND (dr) = opval;
   5983   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   5984   1.1  christos   }
   5985   1.1  christos 
   5986   1.1  christos #undef OPRND
   5987   1.1  christos #undef FLD
   5988   1.1  christos }
   5989   1.1  christos   NEXT (vpc);
   5990   1.1  christos 
   5991   1.1  christos CASE (sem, INSN_WRITE_SUB) : /* sub $dr,$sr */
   5992   1.1  christos   {
   5993   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   5994   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   5995   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   5996   1.1  christos #define OPRND(f) par_exec->operands.sfmt_add.f
   5997   1.1  christos     int UNUSED written = abuf->written;
   5998   1.1  christos     IADDR UNUSED pc = abuf->addr;
   5999   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6000   1.1  christos 
   6001   1.1  christos   * FLD (i_dr) = OPRND (dr);
   6002   1.1  christos 
   6003   1.1  christos #undef OPRND
   6004   1.1  christos #undef FLD
   6005   1.1  christos   }
   6006   1.1  christos   NEXT (vpc);
   6007   1.1  christos 
   6008   1.1  christos   CASE (sem, INSN_PAR_SUBV) : /* subv $dr,$sr */
   6009   1.1  christos {
   6010   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6011   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6012   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   6013   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addv.f
   6014   1.1  christos   int UNUSED written = 0;
   6015   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6016   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6017   1.1  christos 
   6018   1.1  christos {
   6019   1.1  christos   SI temp0;BI temp1;
   6020   1.1  christos   temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
   6021   1.1  christos   temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
   6022   1.1  christos   {
   6023   1.1  christos     SI opval = temp0;
   6024   1.1  christos     OPRND (dr) = opval;
   6025   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   6026   1.1  christos   }
   6027   1.1  christos   {
   6028   1.1  christos     BI opval = temp1;
   6029   1.1  christos     OPRND (condbit) = opval;
   6030   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   6031   1.1  christos   }
   6032   1.1  christos }
   6033   1.1  christos 
   6034   1.1  christos #undef OPRND
   6035   1.1  christos #undef FLD
   6036   1.1  christos }
   6037   1.1  christos   NEXT (vpc);
   6038   1.1  christos 
   6039   1.1  christos CASE (sem, INSN_WRITE_SUBV) : /* subv $dr,$sr */
   6040   1.1  christos   {
   6041   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6042   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6043   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   6044   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addv.f
   6045   1.1  christos     int UNUSED written = abuf->written;
   6046   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6047   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6048   1.1  christos 
   6049   1.1  christos   CPU (h_cond) = OPRND (condbit);
   6050   1.1  christos   * FLD (i_dr) = OPRND (dr);
   6051   1.1  christos 
   6052   1.1  christos #undef OPRND
   6053   1.1  christos #undef FLD
   6054   1.1  christos   }
   6055   1.1  christos   NEXT (vpc);
   6056   1.1  christos 
   6057   1.1  christos   CASE (sem, INSN_PAR_SUBX) : /* subx $dr,$sr */
   6058   1.1  christos {
   6059   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6060   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6061   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   6062   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addx.f
   6063   1.1  christos   int UNUSED written = 0;
   6064   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6065   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6066   1.1  christos 
   6067   1.1  christos {
   6068   1.1  christos   SI temp0;BI temp1;
   6069   1.1  christos   temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   6070   1.1  christos   temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
   6071   1.1  christos   {
   6072   1.1  christos     SI opval = temp0;
   6073   1.1  christos     OPRND (dr) = opval;
   6074   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
   6075   1.1  christos   }
   6076   1.1  christos   {
   6077   1.1  christos     BI opval = temp1;
   6078   1.1  christos     OPRND (condbit) = opval;
   6079   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   6080   1.1  christos   }
   6081   1.1  christos }
   6082   1.1  christos 
   6083   1.1  christos #undef OPRND
   6084   1.1  christos #undef FLD
   6085   1.1  christos }
   6086   1.1  christos   NEXT (vpc);
   6087   1.1  christos 
   6088   1.1  christos CASE (sem, INSN_WRITE_SUBX) : /* subx $dr,$sr */
   6089   1.1  christos   {
   6090   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6091   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6092   1.1  christos #define FLD(f) abuf->fields.sfmt_add.f
   6093   1.1  christos #define OPRND(f) par_exec->operands.sfmt_addx.f
   6094   1.1  christos     int UNUSED written = abuf->written;
   6095   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6096   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6097   1.1  christos 
   6098   1.1  christos   CPU (h_cond) = OPRND (condbit);
   6099   1.1  christos   * FLD (i_dr) = OPRND (dr);
   6100   1.1  christos 
   6101   1.1  christos #undef OPRND
   6102   1.1  christos #undef FLD
   6103   1.1  christos   }
   6104   1.1  christos   NEXT (vpc);
   6105   1.1  christos 
   6106   1.1  christos   CASE (sem, INSN_PAR_TRAP) : /* trap $uimm4 */
   6107   1.1  christos {
   6108   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6109   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6110   1.1  christos #define FLD(f) abuf->fields.sfmt_trap.f
   6111   1.1  christos #define OPRND(f) par_exec->operands.sfmt_trap.f
   6112   1.1  christos   int UNUSED written = 0;
   6113   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6114   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6115   1.1  christos 
   6116   1.1  christos {
   6117   1.1  christos   {
   6118   1.1  christos     USI opval = GET_H_CR (((UINT) 6));
   6119   1.1  christos     OPRND (h_cr_USI_14) = opval;
   6120   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   6121   1.1  christos   }
   6122   1.1  christos   {
   6123   1.1  christos     USI opval = ADDSI (pc, 4);
   6124   1.1  christos     OPRND (h_cr_USI_6) = opval;
   6125   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   6126   1.1  christos   }
   6127   1.1  christos   {
   6128   1.1  christos     UQI opval = CPU (h_bpsw);
   6129   1.1  christos     OPRND (h_bbpsw_UQI) = opval;
   6130   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
   6131   1.1  christos   }
   6132   1.1  christos   {
   6133   1.1  christos     UQI opval = GET_H_PSW ();
   6134   1.1  christos     OPRND (h_bpsw_UQI) = opval;
   6135   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
   6136   1.1  christos   }
   6137   1.1  christos   {
   6138   1.1  christos     UQI opval = ANDQI (GET_H_PSW (), 128);
   6139   1.1  christos     OPRND (h_psw_UQI) = opval;
   6140   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
   6141   1.1  christos   }
   6142   1.1  christos   {
   6143   1.1  christos     SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
   6144   1.1  christos     OPRND (pc) = opval;
   6145   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
   6146   1.1  christos   }
   6147   1.1  christos }
   6148   1.1  christos 
   6149   1.1  christos #undef OPRND
   6150   1.1  christos #undef FLD
   6151   1.1  christos }
   6152   1.1  christos   NEXT (vpc);
   6153   1.1  christos 
   6154   1.1  christos CASE (sem, INSN_WRITE_TRAP) : /* trap $uimm4 */
   6155   1.1  christos   {
   6156   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6157   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6158   1.1  christos #define FLD(f) abuf->fields.sfmt_trap.f
   6159   1.1  christos #define OPRND(f) par_exec->operands.sfmt_trap.f
   6160   1.1  christos     int UNUSED written = abuf->written;
   6161   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6162   1.1  christos     SEM_BRANCH_INIT
   6163   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6164   1.1  christos 
   6165   1.1  christos   CPU (h_bbpsw) = OPRND (h_bbpsw_UQI);
   6166   1.1  christos   CPU (h_bpsw) = OPRND (h_bpsw_UQI);
   6167   1.1  christos   SET_H_CR (((UINT) 14), OPRND (h_cr_USI_14));
   6168   1.1  christos   SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
   6169   1.1  christos   SET_H_PSW (OPRND (h_psw_UQI));
   6170   1.1  christos   SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
   6171   1.1  christos 
   6172   1.1  christos   SEM_BRANCH_FINI (vpc);
   6173   1.1  christos #undef OPRND
   6174   1.1  christos #undef FLD
   6175   1.1  christos   }
   6176   1.1  christos   NEXT (vpc);
   6177   1.1  christos 
   6178   1.1  christos   CASE (sem, INSN_PAR_UNLOCK) : /* unlock $src1,@$src2 */
   6179   1.1  christos {
   6180   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6181   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6182   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6183   1.1  christos #define OPRND(f) par_exec->operands.sfmt_unlock.f
   6184   1.1  christos   int UNUSED written = 0;
   6185   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6186   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6187   1.1  christos 
   6188   1.1  christos {
   6189   1.1  christos if (CPU (h_lock)) {
   6190   1.1  christos   {
   6191   1.1  christos     SI opval = * FLD (i_src1);
   6192   1.1  christos     OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
   6193   1.1  christos     OPRND (h_memory_SI_src2) = opval;
   6194   1.1  christos     written |= (1 << 4);
   6195   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
   6196   1.1  christos   }
   6197   1.1  christos }
   6198   1.1  christos   {
   6199   1.1  christos     BI opval = 0;
   6200   1.1  christos     OPRND (h_lock_BI) = opval;
   6201   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
   6202   1.1  christos   }
   6203   1.1  christos }
   6204   1.1  christos 
   6205   1.1  christos   abuf->written = written;
   6206   1.1  christos #undef OPRND
   6207   1.1  christos #undef FLD
   6208   1.1  christos }
   6209   1.1  christos   NEXT (vpc);
   6210   1.1  christos 
   6211   1.1  christos CASE (sem, INSN_WRITE_UNLOCK) : /* unlock $src1,@$src2 */
   6212   1.1  christos   {
   6213   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6214   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6215   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6216   1.1  christos #define OPRND(f) par_exec->operands.sfmt_unlock.f
   6217   1.1  christos     int UNUSED written = abuf->written;
   6218   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6219   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6220   1.1  christos 
   6221   1.1  christos   CPU (h_lock) = OPRND (h_lock_BI);
   6222   1.1  christos   if (written & (1 << 4))
   6223   1.1  christos     {
   6224   1.1  christos       SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
   6225   1.1  christos     }
   6226   1.1  christos 
   6227   1.1  christos #undef OPRND
   6228   1.1  christos #undef FLD
   6229   1.1  christos   }
   6230   1.1  christos   NEXT (vpc);
   6231   1.1  christos 
   6232   1.1  christos   CASE (sem, INSN_PAR_PCMPBZ) : /* pcmpbz $src2 */
   6233   1.1  christos {
   6234   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6235   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6236   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6237   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
   6238   1.1  christos   int UNUSED written = 0;
   6239   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6240   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6241   1.1  christos 
   6242   1.1  christos   {
   6243   1.1  christos     BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
   6244   1.1  christos     OPRND (condbit) = opval;
   6245   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   6246   1.1  christos   }
   6247   1.1  christos 
   6248   1.1  christos #undef OPRND
   6249   1.1  christos #undef FLD
   6250   1.1  christos }
   6251   1.1  christos   NEXT (vpc);
   6252   1.1  christos 
   6253   1.1  christos CASE (sem, INSN_WRITE_PCMPBZ) : /* pcmpbz $src2 */
   6254   1.1  christos   {
   6255   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6256   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6257   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6258   1.1  christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
   6259   1.1  christos     int UNUSED written = abuf->written;
   6260   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6261   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6262   1.1  christos 
   6263   1.1  christos   CPU (h_cond) = OPRND (condbit);
   6264   1.1  christos 
   6265   1.1  christos #undef OPRND
   6266   1.1  christos #undef FLD
   6267   1.1  christos   }
   6268   1.1  christos   NEXT (vpc);
   6269   1.1  christos 
   6270   1.1  christos   CASE (sem, INSN_PAR_SADD) : /* sadd */
   6271   1.1  christos {
   6272   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6273   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6274   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6275   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sadd.f
   6276   1.1  christos   int UNUSED written = 0;
   6277   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6278   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6279   1.1  christos 
   6280   1.1  christos   {
   6281   1.1  christos     DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
   6282   1.1  christos     OPRND (h_accums_DI_0) = opval;
   6283   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   6284   1.1  christos   }
   6285   1.1  christos 
   6286   1.1  christos #undef OPRND
   6287   1.1  christos #undef FLD
   6288   1.1  christos }
   6289   1.1  christos   NEXT (vpc);
   6290   1.1  christos 
   6291   1.1  christos CASE (sem, INSN_WRITE_SADD) : /* sadd */
   6292   1.1  christos   {
   6293   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6294   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6295   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6296   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sadd.f
   6297   1.1  christos     int UNUSED written = abuf->written;
   6298   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6299   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6300   1.1  christos 
   6301   1.1  christos   SET_H_ACCUMS (((UINT) 0), OPRND (h_accums_DI_0));
   6302   1.1  christos 
   6303   1.1  christos #undef OPRND
   6304   1.1  christos #undef FLD
   6305   1.1  christos   }
   6306   1.1  christos   NEXT (vpc);
   6307   1.1  christos 
   6308   1.1  christos   CASE (sem, INSN_PAR_MACWU1) : /* macwu1 $src1,$src2 */
   6309   1.1  christos {
   6310   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6311   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6312   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6313   1.1  christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
   6314   1.1  christos   int UNUSED written = 0;
   6315   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6316   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6317   1.1  christos 
   6318   1.1  christos   {
   6319   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
   6320   1.1  christos     OPRND (h_accums_DI_1) = opval;
   6321   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   6322   1.1  christos   }
   6323   1.1  christos 
   6324   1.1  christos #undef OPRND
   6325   1.1  christos #undef FLD
   6326   1.1  christos }
   6327   1.1  christos   NEXT (vpc);
   6328   1.1  christos 
   6329   1.1  christos CASE (sem, INSN_WRITE_MACWU1) : /* macwu1 $src1,$src2 */
   6330   1.1  christos   {
   6331   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6332   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6333   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6334   1.1  christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
   6335   1.1  christos     int UNUSED written = abuf->written;
   6336   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6337   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6338   1.1  christos 
   6339   1.1  christos   SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
   6340   1.1  christos 
   6341   1.1  christos #undef OPRND
   6342   1.1  christos #undef FLD
   6343   1.1  christos   }
   6344   1.1  christos   NEXT (vpc);
   6345   1.1  christos 
   6346   1.1  christos   CASE (sem, INSN_PAR_MSBLO) : /* msblo $src1,$src2 */
   6347   1.1  christos {
   6348   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6349   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6350   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6351   1.1  christos #define OPRND(f) par_exec->operands.sfmt_msblo.f
   6352   1.1  christos   int UNUSED written = 0;
   6353   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6354   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6355   1.1  christos 
   6356   1.1  christos   {
   6357   1.1  christos     DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
   6358   1.1  christos     OPRND (accum) = opval;
   6359   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
   6360   1.1  christos   }
   6361   1.1  christos 
   6362   1.1  christos #undef OPRND
   6363   1.1  christos #undef FLD
   6364   1.1  christos }
   6365   1.1  christos   NEXT (vpc);
   6366   1.1  christos 
   6367   1.1  christos CASE (sem, INSN_WRITE_MSBLO) : /* msblo $src1,$src2 */
   6368   1.1  christos   {
   6369   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6370   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6371   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6372   1.1  christos #define OPRND(f) par_exec->operands.sfmt_msblo.f
   6373   1.1  christos     int UNUSED written = abuf->written;
   6374   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6375   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6376   1.1  christos 
   6377   1.1  christos   SET_H_ACCUM (OPRND (accum));
   6378   1.1  christos 
   6379   1.1  christos #undef OPRND
   6380   1.1  christos #undef FLD
   6381   1.1  christos   }
   6382   1.1  christos   NEXT (vpc);
   6383   1.1  christos 
   6384   1.1  christos   CASE (sem, INSN_PAR_MULWU1) : /* mulwu1 $src1,$src2 */
   6385   1.1  christos {
   6386   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6387   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6388   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6389   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
   6390   1.1  christos   int UNUSED written = 0;
   6391   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6392   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6393   1.1  christos 
   6394   1.1  christos   {
   6395   1.1  christos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
   6396   1.1  christos     OPRND (h_accums_DI_1) = opval;
   6397   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   6398   1.1  christos   }
   6399   1.1  christos 
   6400   1.1  christos #undef OPRND
   6401   1.1  christos #undef FLD
   6402   1.1  christos }
   6403   1.1  christos   NEXT (vpc);
   6404   1.1  christos 
   6405   1.1  christos CASE (sem, INSN_WRITE_MULWU1) : /* mulwu1 $src1,$src2 */
   6406   1.1  christos   {
   6407   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6408   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6409   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6410   1.1  christos #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
   6411   1.1  christos     int UNUSED written = abuf->written;
   6412   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6413   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6414   1.1  christos 
   6415   1.1  christos   SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
   6416   1.1  christos 
   6417   1.1  christos #undef OPRND
   6418   1.1  christos #undef FLD
   6419   1.1  christos   }
   6420   1.1  christos   NEXT (vpc);
   6421   1.1  christos 
   6422   1.1  christos   CASE (sem, INSN_PAR_MACLH1) : /* maclh1 $src1,$src2 */
   6423   1.1  christos {
   6424   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6425   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6426   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6427   1.1  christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
   6428   1.1  christos   int UNUSED written = 0;
   6429   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6430   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6431   1.1  christos 
   6432   1.1  christos   {
   6433   1.1  christos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
   6434   1.1  christos     OPRND (h_accums_DI_1) = opval;
   6435   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
   6436   1.1  christos   }
   6437   1.1  christos 
   6438   1.1  christos #undef OPRND
   6439   1.1  christos #undef FLD
   6440   1.1  christos }
   6441   1.1  christos   NEXT (vpc);
   6442   1.1  christos 
   6443   1.1  christos CASE (sem, INSN_WRITE_MACLH1) : /* maclh1 $src1,$src2 */
   6444   1.1  christos   {
   6445   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6446   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6447   1.1  christos #define FLD(f) abuf->fields.sfmt_st_plus.f
   6448   1.1  christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
   6449   1.1  christos     int UNUSED written = abuf->written;
   6450   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6451   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6452   1.1  christos 
   6453   1.1  christos   SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
   6454   1.1  christos 
   6455   1.1  christos #undef OPRND
   6456   1.1  christos #undef FLD
   6457   1.1  christos   }
   6458   1.1  christos   NEXT (vpc);
   6459   1.1  christos 
   6460   1.1  christos   CASE (sem, INSN_PAR_SC) : /* sc */
   6461   1.1  christos {
   6462   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6463   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6464   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6465   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sc.f
   6466   1.1  christos   int UNUSED written = 0;
   6467   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6468   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6469   1.1  christos 
   6470   1.1  christos if (ZEXTBISI (CPU (h_cond)))
   6471   1.1  christos   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
   6472   1.1  christos 
   6473   1.1  christos #undef OPRND
   6474   1.1  christos #undef FLD
   6475   1.1  christos }
   6476   1.1  christos   NEXT (vpc);
   6477   1.1  christos 
   6478   1.1  christos CASE (sem, INSN_WRITE_SC) : /* sc */
   6479   1.1  christos   {
   6480   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6481   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6482   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6483   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sc.f
   6484   1.1  christos     int UNUSED written = abuf->written;
   6485   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6486   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6487   1.1  christos 
   6488   1.1  christos 
   6489   1.1  christos #undef OPRND
   6490   1.1  christos #undef FLD
   6491   1.1  christos   }
   6492   1.1  christos   NEXT (vpc);
   6493   1.1  christos 
   6494   1.1  christos   CASE (sem, INSN_PAR_SNC) : /* snc */
   6495   1.1  christos {
   6496   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6497   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6498   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6499   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sc.f
   6500   1.1  christos   int UNUSED written = 0;
   6501   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6502   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6503   1.1  christos 
   6504   1.1  christos if (ZEXTBISI (NOTBI (CPU (h_cond))))
   6505   1.1  christos   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
   6506   1.1  christos 
   6507   1.1  christos #undef OPRND
   6508   1.1  christos #undef FLD
   6509   1.1  christos }
   6510   1.1  christos   NEXT (vpc);
   6511   1.1  christos 
   6512   1.1  christos CASE (sem, INSN_WRITE_SNC) : /* snc */
   6513   1.1  christos   {
   6514   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6515   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6516   1.1  christos #define FLD(f) abuf->fields.sfmt_empty.f
   6517   1.1  christos #define OPRND(f) par_exec->operands.sfmt_sc.f
   6518   1.1  christos     int UNUSED written = abuf->written;
   6519   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6520   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6521   1.1  christos 
   6522   1.1  christos 
   6523   1.1  christos #undef OPRND
   6524   1.1  christos #undef FLD
   6525   1.1  christos   }
   6526   1.1  christos   NEXT (vpc);
   6527   1.1  christos 
   6528   1.1  christos   CASE (sem, INSN_PAR_CLRPSW) : /* clrpsw $uimm8 */
   6529   1.1  christos {
   6530   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6531   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6532   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   6533   1.1  christos #define OPRND(f) par_exec->operands.sfmt_clrpsw.f
   6534   1.1  christos   int UNUSED written = 0;
   6535   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6536   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6537   1.1  christos 
   6538   1.1  christos   {
   6539   1.1  christos     USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
   6540   1.1  christos     OPRND (h_cr_USI_0) = opval;
   6541   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   6542   1.1  christos   }
   6543   1.1  christos 
   6544   1.1  christos #undef OPRND
   6545   1.1  christos #undef FLD
   6546   1.1  christos }
   6547   1.1  christos   NEXT (vpc);
   6548   1.1  christos 
   6549   1.1  christos CASE (sem, INSN_WRITE_CLRPSW) : /* clrpsw $uimm8 */
   6550   1.1  christos   {
   6551   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6552   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6553   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   6554   1.1  christos #define OPRND(f) par_exec->operands.sfmt_clrpsw.f
   6555   1.1  christos     int UNUSED written = abuf->written;
   6556   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6557   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6558   1.1  christos 
   6559   1.1  christos   SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
   6560   1.1  christos 
   6561   1.1  christos #undef OPRND
   6562   1.1  christos #undef FLD
   6563   1.1  christos   }
   6564   1.1  christos   NEXT (vpc);
   6565   1.1  christos 
   6566   1.1  christos   CASE (sem, INSN_PAR_SETPSW) : /* setpsw $uimm8 */
   6567   1.1  christos {
   6568   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6569   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6570   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   6571   1.1  christos #define OPRND(f) par_exec->operands.sfmt_setpsw.f
   6572   1.1  christos   int UNUSED written = 0;
   6573   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6574   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6575   1.1  christos 
   6576   1.1  christos   {
   6577   1.1  christos     USI opval = FLD (f_uimm8);
   6578   1.1  christos     OPRND (h_cr_USI_0) = opval;
   6579   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
   6580   1.1  christos   }
   6581   1.1  christos 
   6582   1.1  christos #undef OPRND
   6583   1.1  christos #undef FLD
   6584   1.1  christos }
   6585   1.1  christos   NEXT (vpc);
   6586   1.1  christos 
   6587   1.1  christos CASE (sem, INSN_WRITE_SETPSW) : /* setpsw $uimm8 */
   6588   1.1  christos   {
   6589   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6590   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6591   1.1  christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
   6592   1.1  christos #define OPRND(f) par_exec->operands.sfmt_setpsw.f
   6593   1.1  christos     int UNUSED written = abuf->written;
   6594   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6595   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6596   1.1  christos 
   6597   1.1  christos   SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
   6598   1.1  christos 
   6599   1.1  christos #undef OPRND
   6600   1.1  christos #undef FLD
   6601   1.1  christos   }
   6602   1.1  christos   NEXT (vpc);
   6603   1.1  christos 
   6604   1.1  christos   CASE (sem, INSN_PAR_BTST) : /* btst $uimm3,$sr */
   6605   1.1  christos {
   6606   1.1  christos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6607   1.1  christos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
   6608   1.1  christos #define FLD(f) abuf->fields.sfmt_bset.f
   6609   1.1  christos #define OPRND(f) par_exec->operands.sfmt_btst.f
   6610   1.1  christos   int UNUSED written = 0;
   6611   1.1  christos   IADDR UNUSED pc = abuf->addr;
   6612   1.1  christos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
   6613   1.1  christos 
   6614   1.1  christos   {
   6615   1.1  christos     BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
   6616   1.1  christos     OPRND (condbit) = opval;
   6617   1.5  christos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
   6618   1.1  christos   }
   6619   1.1  christos 
   6620   1.1  christos #undef OPRND
   6621   1.1  christos #undef FLD
   6622   1.1  christos }
   6623   1.1  christos   NEXT (vpc);
   6624   1.1  christos 
   6625   1.1  christos CASE (sem, INSN_WRITE_BTST) : /* btst $uimm3,$sr */
   6626   1.1  christos   {
   6627   1.1  christos     SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
   6628   1.1  christos     const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
   6629   1.1  christos #define FLD(f) abuf->fields.sfmt_bset.f
   6630   1.1  christos #define OPRND(f) par_exec->operands.sfmt_btst.f
   6631   1.1  christos     int UNUSED written = abuf->written;
   6632   1.1  christos     IADDR UNUSED pc = abuf->addr;
   6633   1.1  christos     vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
   6634   1.1  christos 
   6635   1.1  christos   CPU (h_cond) = OPRND (condbit);
   6636   1.1  christos 
   6637   1.1  christos #undef OPRND
   6638   1.1  christos #undef FLD
   6639   1.1  christos   }
   6640   1.1  christos   NEXT (vpc);
   6641   1.1  christos 
   6642   1.1  christos 
   6643   1.1  christos     }
   6644   1.1  christos   ENDSWITCH (sem) /* End of semantic switch.  */
   6645   1.1  christos 
   6646   1.1  christos   /* At this point `vpc' contains the next insn to execute.  */
   6647   1.1  christos }
   6648   1.1  christos 
   6649   1.1  christos #undef DEFINE_SWITCH
   6650   1.1  christos #endif /* DEFINE_SWITCH */
   6651