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