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