1 1.1 christos /* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*- 2 1.1 christos 3 1.1.1.12 christos Copyright (C) 2005-2025 Free Software Foundation, Inc. 4 1.1 christos Contributed by Red Hat, Inc. 5 1.1 christos 6 1.1 christos This file is part of the GNU simulators. 7 1.1 christos 8 1.1 christos This program is free software; you can redistribute it and/or modify 9 1.1 christos it under the terms of the GNU General Public License as published by 10 1.1 christos the Free Software Foundation; either version 3 of the License, or 11 1.1 christos (at your option) any later version. 12 1.1 christos 13 1.1 christos This program is distributed in the hope that it will be useful, 14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 1.1 christos GNU General Public License for more details. 17 1.1 christos 18 1.1 christos You should have received a copy of the GNU General Public License 19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 1.1 christos 21 1.1.1.10 christos /* This must come before any other includes. */ 22 1.1.1.10 christos #include "defs.h" 23 1.1 christos 24 1.1 christos #include <stdio.h> 25 1.1 christos #include <stdlib.h> 26 1.1 christos 27 1.1.1.10 christos #include "ansidecl.h" 28 1.1 christos #include "cpu.h" 29 1.1 christos #include "mem.h" 30 1.1 christos #include "misc.h" 31 1.1 christos #include "int.h" 32 1.1 christos 33 1.1 christos #define tprintf if (trace) printf 34 1.1 christos 35 1.1 christos static unsigned char 36 1.1.1.5 christos getbyte (void) 37 1.1 christos { 38 1.1 christos int tsave = trace; 39 1.1 christos unsigned char b; 40 1.1 christos 41 1.1 christos if (trace == 1) 42 1.1 christos trace = 0; 43 1.1 christos b = mem_get_pc (); 44 1.1 christos regs.r_pc ++; 45 1.1 christos trace = tsave; 46 1.1 christos return b; 47 1.1 christos } 48 1.1 christos 49 1.1 christos #define M32C_ONLY() /* FIXME: add something here */ 50 1.1 christos 51 1.1 christos #define GETBYTE() (op[opi++] = getbyte()) 52 1.1 christos 53 1.1 christos #define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc) 54 1.1 christos #define NOTYET() unsupported("unimplemented", m32c_opcode_pc) 55 1.1 christos 56 1.1 christos static void 57 1.1 christos unsupported (char *tag, int orig_pc) 58 1.1 christos { 59 1.1 christos int i; 60 1.1 christos printf("%s opcode at %08x\n", tag, orig_pc); 61 1.1 christos regs.r_pc = orig_pc; 62 1.1 christos for (i=0; i<2; i++) 63 1.1 christos { 64 1.1 christos int b = mem_get_pc(); 65 1.1 christos printf(" %s", bits(b>>4, 4)); 66 1.1 christos printf(" %s", bits(b, 4)); 67 1.1 christos regs.r_pc ++; 68 1.1 christos } 69 1.1 christos printf("\n"); 70 1.1 christos regs.r_pc = orig_pc; 71 1.1 christos for (i=0; i<6; i++) 72 1.1 christos { 73 1.1 christos printf(" %02x", mem_get_pc ()); 74 1.1 christos regs.r_pc ++; 75 1.1 christos } 76 1.1 christos printf("\n"); 77 1.1 christos exit(1); 78 1.1 christos } 79 1.1 christos 80 1.1 christos static int 81 1.1 christos IMM(int bytes) 82 1.1 christos { 83 1.1 christos int rv = 0; 84 1.1 christos switch (bytes) 85 1.1 christos { 86 1.1 christos case 1: 87 1.1 christos rv = mem_get_qi (get_reg(pc)); 88 1.1 christos break; 89 1.1 christos case 2: 90 1.1 christos rv = mem_get_hi (get_reg(pc)); 91 1.1 christos break; 92 1.1 christos case 3: 93 1.1 christos rv = mem_get_psi (get_reg(pc)); 94 1.1 christos break; 95 1.1 christos case 4: 96 1.1 christos rv = mem_get_si (get_reg(pc)); 97 1.1 christos break; 98 1.1 christos } 99 1.1 christos regs.r_pc += bytes; 100 1.1 christos return rv; 101 1.1 christos } 102 1.1 christos 103 1.1 christos #define IMM4() (immm >= 8 ? 7 - immm : immm + 1) 104 1.1 christos 105 1.1 christos #define NO_PREFIX() PREFIX(0,0,0) 106 1.1 christos 107 1.1 christos /* Indicate which sorts of prefixes are allowed for the current 108 1.1 christos opcode. */ 109 1.1.1.5 christos static void 110 1.1.1.5 christos prefix (int src_allowed, int dest_allowed, int index_bytewidth) 111 1.1 christos { 112 1.1 christos /* At the moment, we don't do anything with this information. We 113 1.1 christos just wanted to get the information entered in some 114 1.1 christos machine-readable form while we were going through all the 115 1.1 christos opcodes. */ 116 1.1 christos } 117 1.1 christos 118 1.1 christos #define MATH_OP(dc,s,c,op) \ 119 1.1 christos { \ 120 1.1 christos int ma, mb; \ 121 1.1 christos ma = get_src(dc); \ 122 1.1 christos mb = s & b2mask[dc.bytes]; \ 123 1.1 christos ll = (long long)ma op (long long)mb op c; \ 124 1.1 christos tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%llx\n", ma, mb, c, ll); \ 125 1.1 christos ma = sign_ext (ma, dc.bytes * 8); \ 126 1.1 christos mb = sign_ext (s, dc.bytes * 8); \ 127 1.1 christos v = ma op mb op c; \ 128 1.1 christos tprintf("%d " #op " %d " #op " %d = %d\n", ma, mb, c, v); \ 129 1.1 christos set_oszc (v, dc.bytes, (1 op 1) ? (ll > b2mask[dc.bytes]) : (ll >= 0)); \ 130 1.1 christos put_dest (dc, v); \ 131 1.1 christos } 132 1.1 christos 133 1.1 christos #define LOGIC_OP(dc,s,op) \ 134 1.1 christos { \ 135 1.1 christos int ma, mb; \ 136 1.1 christos ma = get_src(dc); \ 137 1.1 christos mb = s & b2mask[dc.bytes]; \ 138 1.1 christos v = ma op mb; \ 139 1.1 christos tprintf("0x%x " #op " 0x%x = 0x%x\n", ma, mb, v); \ 140 1.1 christos set_sz (v, dc.bytes); \ 141 1.1 christos put_dest (dc, v); \ 142 1.1 christos } 143 1.1 christos 144 1.1 christos #define BIT_OP(dc,bit,expr) \ 145 1.1 christos b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \ 146 1.1 christos v = expr; \ 147 1.1 christos tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \ 148 1.1 christos b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \ 149 1.1 christos put_bit2 (dc, bitindex == -1 ? bit : bitindex, v); 150 1.1 christos 151 1.1 christos #define BIT_OPC(dc,bit,expr) \ 152 1.1 christos b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \ 153 1.1 christos v = expr; \ 154 1.1 christos tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \ 155 1.1 christos b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \ 156 1.1 christos set_c (v); 157 1.1 christos 158 1.1 christos #define carry (FLAG_C ? 1 : 0) 159 1.1 christos 160 1.1 christos static void 161 1.1 christos cmp (int d, int s, int bytes) 162 1.1 christos { 163 1.1 christos int a, b, f=0; 164 1.1 christos a = d - s; 165 1.1 christos b = sign_ext (d, bytes*8) - sign_ext (s, bytes*8); 166 1.1 christos tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n", 167 1.1 christos d, s, a, 168 1.1 christos sign_ext(d,bytes*8), sign_ext(s,bytes*8), b); 169 1.1 christos 170 1.1 christos if (b == 0) 171 1.1 christos f |= FLAGBIT_Z; 172 1.1 christos if (b & b2signbit[bytes]) 173 1.1 christos f |= FLAGBIT_S; 174 1.1 christos if ((d & b2mask[bytes]) >= (s & b2mask[bytes])) 175 1.1 christos f |= FLAGBIT_C; 176 1.1 christos if (b < b2minsigned[bytes] || b > b2maxsigned[bytes]) 177 1.1 christos f |= FLAGBIT_O; 178 1.1 christos 179 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f); 180 1.1 christos } 181 1.1 christos 182 1.1 christos static void 183 1.1 christos dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w) 184 1.1 christos { 185 1.1 christos srcdest sc, dc; 186 1.1 christos int a, b=0, res; 187 1.1 christos 188 1.1 christos prefix (0, 0, 0); 189 1.1 christos 190 1.1 christos if (!imm) 191 1.1 christos { 192 1.1 christos sc = decode_src23 (sss, ss, w+1); 193 1.1 christos b = get_src (sc); 194 1.1 christos } 195 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 196 1.1 christos a = get_src (dc); 197 1.1 christos if (imm) 198 1.1 christos b = IMM(w+1); 199 1.1 christos 200 1.1 christos a = bcd2int(a, w); 201 1.1 christos b = bcd2int(b, w); 202 1.1 christos 203 1.1 christos tprintf("decimal: %d %s %d", a, add?"+":"-", b); 204 1.1 christos if (cy) 205 1.1 christos tprintf(" c=%d", carry); 206 1.1 christos 207 1.1 christos if (add) 208 1.1 christos { 209 1.1 christos res = a + b; 210 1.1 christos if (cy) 211 1.1 christos res += carry; 212 1.1 christos cy = res > (w ? 9999 : 99); 213 1.1 christos } 214 1.1 christos else 215 1.1 christos { 216 1.1 christos res = a - b; 217 1.1 christos if (cy) 218 1.1 christos res -= (1-carry); 219 1.1 christos cy = res >= 0; 220 1.1 christos if (res < 0) 221 1.1 christos res += w ? 10000 : 100; 222 1.1 christos } 223 1.1 christos 224 1.1 christos res = int2bcd (res, w); 225 1.1 christos tprintf(" = %x\n", res); 226 1.1 christos 227 1.1 christos set_szc (res, w+1, cy); 228 1.1 christos 229 1.1 christos put_dest (dc, res); 230 1.1 christos } 231 1.1 christos #define DADDV(A,C) dadd_op(ddd, dd, sss, ss, 0, A, C, w) 232 1.1 christos #define DADDI(A,C) dadd_op(ddd, dd, 0, 0, 1, A, C, w) 233 1.1 christos 234 1.1 christos static void 235 1.1 christos div_op (int sss, int ss, int u, int x, int bytes) 236 1.1 christos { 237 1.1 christos srcdest sc; 238 1.1 christos int s, v, a, b; 239 1.1 christos 240 1.1 christos if (sss == -1) 241 1.1 christos s = IMM(bytes); 242 1.1 christos else 243 1.1 christos { 244 1.1 christos sc = decode_dest23 (sss, ss, bytes); 245 1.1 christos s = get_src (sc); 246 1.1 christos } 247 1.1 christos 248 1.1 christos v = get_reg (bytes > 1 ? r2r0 : r0); 249 1.1 christos 250 1.1 christos if (!u) 251 1.1 christos { 252 1.1 christos /* FIXME? do we sign extend a0/a1 to .L? Docs say zero extend. */ 253 1.1 christos s = sign_ext (s, bytes*8); 254 1.1 christos v = sign_ext (v, bytes*8); 255 1.1 christos } 256 1.1 christos 257 1.1 christos if (s == 0) 258 1.1 christos { 259 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O); 260 1.1 christos return; 261 1.1 christos } 262 1.1 christos 263 1.1 christos if (u) 264 1.1 christos { 265 1.1 christos a = (unsigned int)v / (unsigned int)s; 266 1.1 christos b = (unsigned int)v % (unsigned int)s; 267 1.1 christos } 268 1.1 christos else 269 1.1 christos { 270 1.1 christos a = v / s; 271 1.1 christos b = v % s; 272 1.1 christos } 273 1.1 christos if (x) 274 1.1 christos { 275 1.1 christos if ((s > 0 && b < 0) 276 1.1 christos || (s < 0 && b > 0)) 277 1.1 christos { 278 1.1 christos a --; 279 1.1 christos b += s; 280 1.1 christos } 281 1.1 christos } 282 1.1 christos tprintf ("%d / %d = %d rem %d\n", v, s, a, b); 283 1.1 christos if ((!u && (a > b2maxsigned[bytes] 284 1.1 christos || a < b2minsigned[bytes])) 285 1.1 christos || (u && (a > b2mask[bytes]))) 286 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O); 287 1.1 christos else 288 1.1 christos set_flags (FLAGBIT_O, 0); 289 1.1 christos 290 1.1 christos switch (bytes) 291 1.1 christos { 292 1.1 christos case 1: 293 1.1 christos put_reg (r0l, a); 294 1.1 christos put_reg (r0h, b); 295 1.1 christos break; 296 1.1 christos case 2: 297 1.1 christos put_reg (r0, a); 298 1.1 christos put_reg (r2, b); 299 1.1 christos break; 300 1.1 christos case 4: 301 1.1 christos put_reg (r2r0, a); 302 1.1 christos break; 303 1.1 christos } 304 1.1 christos } 305 1.1 christos 306 1.1 christos static void 307 1.1 christos index_op (int sss, int ss, int do_s, int do_d, int scale, int w) 308 1.1 christos { 309 1.1 christos srcdest sc = decode_src23 (sss, ss, w+1); 310 1.1 christos int v = get_src (sc) * scale; 311 1.1 christos tprintf("%d = %d * %d, %d %d\n", v, get_src(sc), scale, do_s, do_d); 312 1.1 christos decode_index (do_s * v, do_d * v); 313 1.1 christos } 314 1.1 christos #define INDEXOP(scale,do_s,do_d) \ 315 1.1 christos index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode 316 1.1 christos 317 1.1 christos static void 318 1.1 christos rot_op (srcdest sd, int rotc, int count) 319 1.1 christos { 320 1.1 christos int mask = (sd.bytes == 2) ? 0xffff : 0xff; 321 1.1 christos int msb = (sd.bytes == 2) ? 0x8000 : 0x80; 322 1.1 christos int v = get_src (sd); 323 1.1 christos int c = carry, ct; 324 1.1 christos 325 1.1 christos tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count); 326 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 327 1.1 christos while (count > 0) 328 1.1 christos { 329 1.1 christos ct = (v & msb) ? 1 : 0; 330 1.1 christos v <<= 1; 331 1.1 christos v |= rotc ? c : ct; 332 1.1 christos v &= mask; 333 1.1 christos c = ct; 334 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 335 1.1 christos count --; 336 1.1 christos } 337 1.1 christos while (count < 0) 338 1.1 christos { 339 1.1 christos ct = v & 1; 340 1.1 christos v >>= 1; 341 1.1 christos v |= (rotc ? c : ct) * msb; 342 1.1 christos c = ct; 343 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 344 1.1 christos count ++; 345 1.1 christos } 346 1.1 christos put_dest (sd, v); 347 1.1 christos set_szc (v, sd.bytes, c); 348 1.1 christos } 349 1.1 christos 350 1.1 christos static void 351 1.1 christos shift_op (srcdest sd, int arith, int count, int setc) 352 1.1 christos { 353 1.1 christos int mask = (sd.bytes == 2) ? 0xffff : 0xff; 354 1.1 christos int msb = (sd.bytes == 2) ? 0x8000 : 0x80; 355 1.1 christos int v = get_src (sd); 356 1.1 christos int c = 0; 357 1.1 christos int o = 0; 358 1.1 christos 359 1.1 christos if (sd.bytes == 4) 360 1.1 christos { 361 1.1 christos mask = 0xffffffffU; 362 1.1 christos msb = 0x80000000U; 363 1.1 christos } 364 1.1 christos 365 1.1 christos tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count); 366 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 367 1.1 christos while (count > 0) 368 1.1 christos { 369 1.1 christos c = (v & msb) ? 1 : 0; 370 1.1 christos v <<= 1; 371 1.1 christos v &= mask; 372 1.1 christos if (c != ((v & msb) ? 1 : 0)) 373 1.1 christos o = 1; 374 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 375 1.1 christos count --; 376 1.1 christos } 377 1.1 christos while (count < 0) 378 1.1 christos { 379 1.1 christos c = v & 1; 380 1.1 christos if (arith) 381 1.1 christos v = (v & msb) | (v >> 1); 382 1.1 christos else 383 1.1 christos v = (v >> 1) & (msb - 1); 384 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 385 1.1 christos count ++; 386 1.1 christos } 387 1.1 christos put_dest (sd, v); 388 1.1 christos set_sz (v, sd.bytes); 389 1.1 christos if (setc) 390 1.1 christos set_c (c); 391 1.1 christos set_flags (FLAGBIT_O, o ? FLAGBIT_O : 0); 392 1.1 christos } 393 1.1 christos 394 1.1 christos static int pcs[16]; 395 1.1 christos static int ipcs = 0; 396 1.1 christos 397 1.1 christos int 398 1.1.1.5 christos decode_m32c (void) 399 1.1 christos { 400 1.1 christos unsigned char op[40]; 401 1.1 christos int opi; 402 1.1 christos int v, a, b; 403 1.1 christos long long ll; 404 1.1 christos srcdest sc, dc; 405 1.1 christos int imm; 406 1.1 christos int bitindex = -1; 407 1.1 christos int t0, t1=0, t2, t3=0; 408 1.1 christos int ta0, ta1, dif; 409 1.1 christos 410 1.1 christos step_result = M32C_MAKE_STEPPED (); 411 1.1 christos 412 1.1 christos decode_indirect (0, 0); 413 1.1 christos decode_index (0, 0); 414 1.1 christos 415 1.1 christos next_opcode: 416 1.1 christos opi = 0; 417 1.1 christos m32c_opcode_pc = get_reg (pc); 418 1.1 christos 419 1.1 christos tprintf("trace: decode pc = %06x\n", m32c_opcode_pc); 420 1.1 christos 421 1.1 christos if (m32c_opcode_pc == 0) 422 1.1 christos { 423 1.1 christos int i; 424 1.1 christos printf("Abort: PC is zero, here from:\n"); 425 1.1 christos for (i=0; i<4; i++) 426 1.1 christos printf(" 0x%06x\n", pcs[(ipcs+15-i)%16]); 427 1.1 christos return M32C_MAKE_HIT_BREAK (); 428 1.1 christos } 429 1.1 christos pcs[ipcs++] = m32c_opcode_pc; 430 1.1 christos ipcs %= 16; 431 1.1 christos 432 1.1 christos /** VARY sss 000 001 010 011 100 */ 433 1.1 christos /** VARY ddd 000 001 010 011 100 */ 434 1.1 christos 435 1.1 christos /** 0000 1001 indirect dest */ 436 1.1 christos 437 1.1 christos decode_indirect (0, 1); 438 1.1 christos goto next_opcode; 439 1.1 christos 440 1.1 christos /** 0100 0001 indirect src */ 441 1.1 christos 442 1.1 christos decode_indirect (1, 0); 443 1.1 christos goto next_opcode; 444 1.1 christos 445 1.1 christos /** 0100 1001 indirect src and dest */ 446 1.1 christos 447 1.1 christos decode_indirect (1, 1); 448 1.1 christos goto next_opcode; 449 1.1 christos 450 1.1 christos /** 1010 ddd w dd01 1111 ABS.size dest */ 451 1.1 christos 452 1.1 christos prefix (0, 1, 0); 453 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 454 1.1 christos v = sign_ext (get_src (dc), w?16:8); 455 1.1 christos a = v<0 ? -v : v; 456 1.1 christos tprintf("abs(%d) = %d\n", v, a); 457 1.1 christos set_osz(a, w+1); 458 1.1 christos put_dest (dc, a); 459 1.1 christos 460 1.1 christos /** 0000 0001 1000 ddd w dd10 1110 ADC.size #IMM,dest */ 461 1.1 christos 462 1.1 christos prefix (0, 0, 0); 463 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 464 1.1 christos imm = IMM (w+1); 465 1.1 christos MATH_OP (dc, imm, carry, +); 466 1.1 christos 467 1.1 christos /** 0000 0001 1sss ddd w dd ss 0100 ADC.size src,dest */ 468 1.1 christos 469 1.1 christos prefix (0, 0, 0); 470 1.1 christos sc = decode_src23 (sss, ss, w+1); 471 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 472 1.1 christos b = get_src (sc); 473 1.1 christos MATH_OP (dc, b, carry, +); 474 1.1 christos 475 1.1 christos /** 1011 ddd w dd01 1110 ADCF.size dest */ 476 1.1 christos 477 1.1 christos prefix (0, 1, 0); 478 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 479 1.1 christos MATH_OP (dc, 0, carry, +); 480 1.1 christos 481 1.1 christos /** 1000 ddd w dd10 1110 ADD.size:G #IMM,dest */ 482 1.1 christos 483 1.1 christos prefix (0, 1, 0); 484 1.1 christos dc = decode_dest23(ddd, dd, w+1); 485 1.1 christos imm = IMM(w+1); 486 1.1 christos MATH_OP (dc, imm, 0, +); 487 1.1 christos 488 1.1 christos /** 1000 ddd0 dd11 0001 ADD.L:G #IMM,dest */ 489 1.1 christos 490 1.1 christos prefix (0, 1, 0); 491 1.1 christos dc = decode_dest23(ddd, dd, 4); 492 1.1 christos imm = IMM(4); 493 1.1 christos MATH_OP (dc, imm, 0, +); 494 1.1 christos 495 1.1 christos /** 111L ddd w dd11 immm ADD.size:Q #IMM,dest */ 496 1.1 christos 497 1.1 christos prefix (0, 1, 0); 498 1.1 christos dc = decode_dest23(ddd, dd, L ? 4 : (w+1)); 499 1.1 christos imm = sign_ext (immm, 4); 500 1.1 christos MATH_OP (dc, imm, 0, +); 501 1.1 christos 502 1.1 christos /** 00dd 011w ADD.size:S #IMM,dest */ 503 1.1 christos 504 1.1 christos prefix (0, 1, 0); 505 1.1 christos dc = decode_dest2(dd, w+1); 506 1.1 christos imm = IMM (w+1); 507 1.1 christos MATH_OP (dc, imm, 0, +); 508 1.1 christos 509 1.1 christos /** 10i0 110d ADD.L:S #IMM,A0/A1 */ 510 1.1 christos 511 1.1 christos prefix (0, 0, 0); 512 1.1 christos dc = reg_sd (d ? a1 : a0); 513 1.1 christos imm = i ? 2 : 1; 514 1.1 christos MATH_OP (dc, imm, 0, +); 515 1.1 christos 516 1.1 christos /** 1sss ddd w dd ss 1000 ADD.size:G src,dest */ 517 1.1 christos 518 1.1 christos prefix (1, 1, 0); 519 1.1 christos sc = decode_src23(sss, ss, w+1); 520 1.1 christos dc = decode_dest23(ddd, dd, w+1); 521 1.1 christos b = get_src (sc); 522 1.1 christos MATH_OP (dc, b, 0, +); 523 1.1 christos 524 1.1 christos /** 1sss ddd1 dd ss 0010 ADD.L:G src,dest */ 525 1.1 christos 526 1.1 christos prefix (1, 1, 0); 527 1.1 christos sc = decode_src23(sss, ss, 4); 528 1.1 christos dc = decode_dest23(ddd, dd, 4); 529 1.1 christos b = get_src (sc); 530 1.1 christos MATH_OP (dc, b, 0, +); 531 1.1 christos 532 1.1 christos /** 1011 0110 0001 0011 ADD.L:G #IMM16,SP */ 533 1.1 christos 534 1.1 christos prefix (0, 0, 0); 535 1.1 christos dc = reg_sd (sp); 536 1.1 christos b = sign_ext (IMM(2), 16); 537 1.1 christos MATH_OP (dc, b, 0, +); 538 1.1 christos 539 1.1 christos /** 01ii 001i ADD.L:Q #IMM3,SP */ 540 1.1 christos 541 1.1 christos prefix (0, 0, 0); 542 1.1 christos dc = reg_sd (sp); 543 1.1 christos b = ii * 2 + i + 1; 544 1.1 christos MATH_OP (dc, b, 0, +); 545 1.1 christos 546 1.1 christos /** 1011 0110 0000 0011 ADD.L:S #IMM8,SP */ 547 1.1 christos 548 1.1 christos prefix (0, 0, 0); 549 1.1 christos dc = reg_sd (sp); 550 1.1 christos b = sign_ext (IMM(1), 8); 551 1.1 christos MATH_OP (dc, b, 0, +); 552 1.1 christos 553 1.1 christos /** 1000 ddd0 dd01 0001 ADDX #IMM,dest */ 554 1.1 christos 555 1.1 christos prefix (0, 1, 0); 556 1.1 christos dc = decode_dest23(ddd, dd, 4); 557 1.1 christos imm = sign_ext (IMM(1), 8); 558 1.1 christos MATH_OP (dc, imm, 0, +); 559 1.1 christos 560 1.1 christos /** 1sss ddd0 dd ss 0010 ADDX src,dest */ 561 1.1 christos 562 1.1 christos prefix (1, 1, 0); 563 1.1 christos sc = decode_src23(sss, ss, 1); 564 1.1 christos dc = decode_dest23(ddd, dd, 4); 565 1.1 christos b = sign_ext (get_src (sc), 8); 566 1.1 christos MATH_OP (dc, b, 0, +); 567 1.1 christos 568 1.1 christos /** 1111 ddd w dd01 immm ADJNZ.size #IMM,dest,label */ 569 1.1 christos 570 1.1 christos prefix (0, 0, 0); 571 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 572 1.1 christos v = get_src (dc); 573 1.1 christos imm = sign_ext(immm, 4); 574 1.1 christos tprintf("%d + %d = %d\n", v, imm, v+imm); 575 1.1 christos v += imm; 576 1.1 christos put_dest (dc, v); 577 1.1 christos a = sign_ext (IMM(1), 8); 578 1.1 christos if ((v & (w ? 0xffff : 0xff)) != 0) 579 1.1 christos { 580 1.1 christos tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a); 581 1.1 christos put_reg (pc, m32c_opcode_pc + 2 + a); 582 1.1 christos tprintf("%x\n", get_reg (pc)); 583 1.1 christos } 584 1.1 christos 585 1.1 christos /** 1000 ddd w dd11 1111 AND.size:G #IMM,dest */ 586 1.1 christos 587 1.1 christos prefix (0, 1, 0); 588 1.1 christos dc = decode_dest23(ddd, dd, w+1); 589 1.1 christos imm = IMM(w+1); 590 1.1 christos LOGIC_OP (dc, imm, &); 591 1.1 christos 592 1.1 christos /** 01dd 110w AND.size:S #IMM,dest */ 593 1.1 christos 594 1.1 christos prefix (0, 1, 0); 595 1.1 christos dc = decode_dest2(dd, w+1); 596 1.1 christos imm = IMM (w+1); 597 1.1 christos LOGIC_OP (dc, imm, &); 598 1.1 christos 599 1.1 christos /** 1sss ddd w dd ss 1101 AND.size:G src,dest */ 600 1.1 christos 601 1.1 christos prefix (1, 1, 0); 602 1.1 christos sc = decode_src23(sss, ss, w+1); 603 1.1 christos dc = decode_dest23(ddd, dd, w+1); 604 1.1 christos b = get_src (sc); 605 1.1 christos LOGIC_OP (dc, b, &); 606 1.1 christos 607 1.1 christos /** 0000 0001 1101 sss0 ss00 1bit BAND src */ 608 1.1 christos 609 1.1 christos sc = decode_src23 (sss, ss, 1); 610 1.1 christos BIT_OPC (sc, bit, b & carry); 611 1.1 christos 612 1.1 christos /** 1101 ddd0 dd11 0bit BCLR dest */ 613 1.1 christos 614 1.1 christos dc = decode_dest23 (ddd, dd, 1); 615 1.1 christos BIT_OP (dc, bit, 0); 616 1.1 christos 617 1.1 christos /** 1100 ddd w dd10 1110 BITINDEX.size src */ 618 1.1 christos 619 1.1 christos prefix (0, 0, 0); 620 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 621 1.1 christos bitindex = get_src (dc); 622 1.1 christos tprintf ("bitindex set to %d\n", bitindex); 623 1.1 christos goto next_opcode; 624 1.1 christos 625 1.1 christos /** 1101 ddd0 dd01 0bit BMcnd dest */ 626 1.1 christos 627 1.1 christos prefix (0, 0, 0); 628 1.1 christos dc = decode_dest23 (ddd, dd, 1); 629 1.1 christos if (condition_true (IMM (1))) 630 1.1 christos put_bit2 (dc, bit, 1); 631 1.1 christos else 632 1.1 christos put_bit2 (dc, bit, 0); 633 1.1 christos 634 1.1 christos /** 1101 1001 0c10 1cnd BMcnd C */ 635 1.1 christos 636 1.1 christos prefix (0, 0, 0); 637 1.1 christos if (condition_true (c * 8 + cnd)) 638 1.1 christos set_c (1); 639 1.1 christos else 640 1.1 christos set_c (0); 641 1.1 christos 642 1.1 christos /** 0000 0001 1101 sss0 ss01 1bit BNAND src */ 643 1.1 christos 644 1.1 christos prefix (0, 0, 0); 645 1.1 christos sc = decode_src23 (sss, ss, 1); 646 1.1 christos BIT_OPC (sc, bit, (!b) & carry); 647 1.1 christos 648 1.1 christos /** 0000 0001 1101 sss0 ss11 0bit BNOR src */ 649 1.1 christos 650 1.1 christos prefix (0, 0, 0); 651 1.1 christos sc = decode_src23 (sss, ss, 1); 652 1.1 christos BIT_OPC (sc, bit, (!b) | carry); 653 1.1 christos 654 1.1 christos /** 1101 ddd0 dd01 1bit BNOT dest */ 655 1.1 christos 656 1.1 christos prefix (0, 0, 0); 657 1.1 christos dc = decode_dest23 (ddd, dd, 1); 658 1.1 christos BIT_OP (dc, bit, !b); 659 1.1 christos 660 1.1 christos /** 0000 0001 1101 sss0 ss00 0bit BNTST src */ 661 1.1 christos 662 1.1 christos prefix (0, 0, 0); 663 1.1 christos sc = decode_dest23 (sss, ss, 1); 664 1.1 christos b = get_bit2 (sc, bit); 665 1.1 christos set_zc (!b, !b); 666 1.1 christos 667 1.1 christos /** 0000 0001 1101 sss0 ss11 1bit BNXOR src */ 668 1.1 christos 669 1.1 christos prefix (0, 0, 0); 670 1.1 christos sc = decode_src23 (sss, ss, 1); 671 1.1 christos BIT_OPC (sc, bit, !b ^ carry); 672 1.1 christos 673 1.1 christos /** 0000 0001 1101 sss0 ss10 0bit BOR src */ 674 1.1 christos 675 1.1 christos prefix (0, 0, 0); 676 1.1 christos sc = decode_src23 (sss, ss, 1); 677 1.1 christos BIT_OPC (sc, bit, b | carry); 678 1.1 christos 679 1.1 christos /** 0000 0000 BRK */ 680 1.1 christos 681 1.1 christos /* We report the break to our caller with the PC still pointing at the 682 1.1 christos breakpoint instruction. */ 683 1.1 christos put_reg (pc, m32c_opcode_pc); 684 1.1 christos if (verbose) 685 1.1 christos printf("[break]\n"); 686 1.1 christos if (in_gdb || (regs.r_intbl == 0 && regs.r_intbh == 0)) 687 1.1 christos return M32C_MAKE_HIT_BREAK (); 688 1.1 christos if (mem_get_qi (0xFFFFE7) == 0xff) 689 1.1 christos trigger_based_interrupt (0); 690 1.1 christos else 691 1.1 christos trigger_fixed_interrupt (0xFFFFE4); 692 1.1 christos 693 1.1 christos /** 1111 1110 GBRK */ 694 1.1 christos 695 1.1 christos /* This alternate break, which is not part of the chip's opcode set, 696 1.1 christos is here in case you need to debug a program that itself uses the 697 1.1 christos chip's BRK opcode. You'll need to modify your copy of GDB to use 698 1.1 christos this opcode instead of the real BRK. */ 699 1.1 christos 700 1.1 christos /* GDB Break. */ 701 1.1 christos /* We report the break to our caller with the PC still pointing at the 702 1.1 christos breakpoint instruction. */ 703 1.1 christos put_reg (pc, m32c_opcode_pc); 704 1.1 christos if (verbose) 705 1.1 christos printf("[gdb break]\n"); 706 1.1 christos return M32C_MAKE_HIT_BREAK (); 707 1.1 christos 708 1.1 christos /** 0000 1000 BRK2 */ 709 1.1 christos 710 1.1 christos if (verbose) 711 1.1 christos printf("[break2]\n"); 712 1.1 christos if (in_gdb) 713 1.1 christos return M32C_MAKE_HIT_BREAK (); 714 1.1 christos if (mem_get_qi (0xFFFFE7) == 0xff) 715 1.1 christos trigger_based_interrupt (0); 716 1.1 christos else 717 1.1 christos trigger_fixed_interrupt (0xFFFFE4); 718 1.1 christos 719 1.1 christos /** 1101 ddd0 dd11 1bit BSET dest */ 720 1.1 christos 721 1.1 christos dc = decode_dest23 (ddd, dd, 1); 722 1.1 christos BIT_OP (dc, bit, 1); 723 1.1 christos 724 1.1 christos /** 1101 sss0 ss00 0bit BTST:G src */ 725 1.1 christos 726 1.1 christos prefix (0, 0, 0); 727 1.1 christos sc = decode_src23 (sss, ss, 1); 728 1.1 christos b = get_bit2 (sc, bit); 729 1.1 christos set_zc (!b, b); 730 1.1 christos 731 1.1.1.11 christos /** 00bb 101bit BTST:S src */ 732 1.1 christos 733 1.1 christos sc = decode_src23 (3, 3, 1); /* bit,base:19 */ 734 1.1.1.11 christos bit = get_bit2 (sc, bb*2 + bit); 735 1.1.1.11 christos set_zc (!bit, bit); 736 1.1 christos 737 1.1 christos /** 1101 ddd0 dd10 0bit BTSTC dest */ 738 1.1 christos 739 1.1 christos prefix (0, 0, 0); 740 1.1 christos sc = decode_dest23 (ddd, dd, 1); 741 1.1 christos b = get_bit2 (sc, bit); 742 1.1 christos set_zc (!b, b); 743 1.1 christos put_bit2 (sc, bit, 0); 744 1.1 christos 745 1.1 christos /** 1101 ddd0 dd10 1bit BTSTS dest */ 746 1.1 christos 747 1.1 christos prefix (0, 0, 0); 748 1.1 christos sc = decode_dest23 (ddd, dd, 1); 749 1.1 christos b = get_bit2 (sc, bit); 750 1.1 christos set_zc (!b, b); 751 1.1 christos put_bit2 (sc, bit, 1); 752 1.1 christos 753 1.1 christos /** 0000 0001 1101 sss0 ss10 1bit BXOR src */ 754 1.1 christos 755 1.1 christos prefix (0, 0, 0); 756 1.1 christos sc = decode_src23 (sss, ss, 1); 757 1.1 christos BIT_OPC (sc, bit, b ^ carry); 758 1.1 christos 759 1.1 christos /** 0000 0001 1000 ddd w dd11 1110 CLIP.size #IMM1,#IMM2,dest */ 760 1.1 christos 761 1.1 christos prefix (0, 0, 0); 762 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 763 1.1 christos a = sign_ext (IMM(w+1), w*8+8); 764 1.1 christos b = sign_ext (IMM(w+1), w*8+8); 765 1.1 christos v = sign_ext (get_src (dc), w*8+8); 766 1.1 christos tprintf("clip %d <= %d <= %d : ", a, v, b); 767 1.1 christos if (a > v) 768 1.1 christos v = a; 769 1.1 christos if (v > b) 770 1.1 christos v = b; 771 1.1 christos tprintf("%d\n", v); 772 1.1 christos put_dest (dc, v); 773 1.1 christos 774 1.1 christos /** 1001 ddd w dd10 1110 CMP.size:G #IMM,dest */ 775 1.1 christos 776 1.1 christos prefix (0, 1, 0); 777 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 778 1.1 christos v = get_src (dc); 779 1.1 christos imm = IMM(w+1); 780 1.1 christos cmp (v, imm, w+1); 781 1.1 christos 782 1.1 christos /** 1010 ddd0 dd11 0001 CMP.L:G #IMM32,dest */ 783 1.1 christos 784 1.1 christos prefix (0, 1, 0); 785 1.1 christos dc = decode_dest23 (ddd, dd, 4); 786 1.1 christos v = get_src (dc); 787 1.1 christos imm = IMM(4); 788 1.1 christos cmp (v, imm, 4); 789 1.1 christos 790 1.1 christos /** 1110 ddd w dd01 immm CMP.size:Q #IMM,dest */ 791 1.1 christos 792 1.1 christos prefix (0, 1, 0); 793 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 794 1.1 christos v = get_src (dc); 795 1.1 christos immm = sign_ext (immm, 4); 796 1.1 christos cmp (v, immm, w+1); 797 1.1 christos 798 1.1 christos /** 01dd 011w CMP.size:S #IMM,dest */ 799 1.1 christos 800 1.1 christos prefix (0, 1, 0); 801 1.1 christos dc = decode_dest2 (dd, w+1); 802 1.1 christos v = get_src (dc); 803 1.1 christos imm = sign_ext (IMM(w+1),w*8+8); 804 1.1 christos cmp (v, imm, w+1); 805 1.1 christos 806 1.1 christos /** 1sss ddd w dd ss 0110 CMP.size:G src,dest */ 807 1.1 christos 808 1.1 christos prefix (1, 1, 0); 809 1.1 christos sc = decode_src23 (sss, ss, w+1); 810 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 811 1.1 christos a = get_src (dc); 812 1.1 christos b = get_src (sc); 813 1.1 christos cmp (a, b, w+1); 814 1.1 christos 815 1.1 christos /** 1sss ddd1 dd ss 0001 CMP.L:G src,dest */ 816 1.1 christos 817 1.1 christos prefix (1, 1, 0); 818 1.1 christos sc = decode_src23 (sss, ss, 4); 819 1.1 christos dc = decode_dest23 (ddd, dd, 4); 820 1.1 christos a = get_src (dc); 821 1.1 christos b = get_src (sc); 822 1.1 christos cmp (a, b, 4); 823 1.1 christos 824 1.1 christos /** 01dd 000w CMP.size:S src,R0/R0L */ 825 1.1 christos 826 1.1 christos prefix (0, 1, 0); 827 1.1 christos dc = decode_dest2 (dd, w+1); 828 1.1 christos a = get_reg (w ? r0 : r0l); 829 1.1 christos b = get_src (dc); 830 1.1 christos cmp (a, b, w+1); 831 1.1 christos 832 1.1 christos /** 1010 ddd0 dd01 0001 CMPX #IMM,dest */ 833 1.1 christos 834 1.1 christos prefix (0, 1, 0); 835 1.1 christos dc = decode_dest23 (ddd, dd, 4); 836 1.1 christos v = get_src (dc); 837 1.1 christos imm = sign_ext (IMM(1), 8); 838 1.1 christos cmp (v, imm, 4); 839 1.1 christos 840 1.1 christos /** 0000 0001 1000 ddd w dd00 1110 DADC.size #IMM,dest */ 841 1.1 christos 842 1.1 christos DADDI(1,1); 843 1.1 christos 844 1.1 christos /** 0000 0001 1sss ddd w dd ss 1000 DADC.size src,dest */ 845 1.1 christos 846 1.1 christos DADDV(1,1); 847 1.1 christos 848 1.1 christos /** 0000 0001 1000 ddd w dd01 1110 DADD.size #IMM,dest */ 849 1.1 christos 850 1.1 christos DADDI(1,0); 851 1.1 christos 852 1.1 christos /** 0000 0001 1sss ddd w dd ss 0000 DADD.size src,dest */ 853 1.1 christos 854 1.1 christos DADDV(1,0); 855 1.1 christos 856 1.1 christos /** 1011 ddd w dd00 1110 DEC.size dest */ 857 1.1 christos 858 1.1 christos prefix (0, 1, 0); 859 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 860 1.1 christos a = get_src (dc); 861 1.1 christos v = a-1; 862 1.1 christos tprintf ("%x -- = %x\n", a, v); 863 1.1 christos set_sz (v, w+1); 864 1.1 christos put_dest (dc, v); 865 1.1 christos 866 1.1 christos /** 1011 0000 010w 0011 DIV.size #IMM */ 867 1.1 christos 868 1.1 christos prefix (0, 0, 0); 869 1.1 christos div_op (-1, 0, 0, 0, w+1); 870 1.1 christos 871 1.1 christos /** 1000 sss w ss01 1110 DIV.size src */ 872 1.1 christos 873 1.1 christos prefix (0, 1, 0); 874 1.1 christos div_op (sss, ss, 0, 0, w+1); 875 1.1 christos 876 1.1 christos /** 0000 0001 1010 sss1 ss01 1111 DIV.L src */ 877 1.1 christos 878 1.1 christos M32C_ONLY(); 879 1.1 christos prefix (0, 0, 0); 880 1.1 christos div_op (sss, ss, 0, 0, 4); 881 1.1 christos 882 1.1 christos /** 1011 0000 000w 0011 DIVU.size #IMM */ 883 1.1 christos 884 1.1 christos prefix (0, 0, 0); 885 1.1 christos div_op (-1, 0, 1, 0, w+1); 886 1.1 christos 887 1.1 christos /** 1000 sss w ss00 1110 DIVU.size src */ 888 1.1 christos 889 1.1 christos prefix (0, 1, 0); 890 1.1 christos div_op (sss, ss, 1, 0, w+1); 891 1.1 christos 892 1.1 christos /** 0000 0001 1010 sss1 ss00 1111 DIVU.L src */ 893 1.1 christos 894 1.1 christos M32C_ONLY(); 895 1.1 christos prefix (0, 0, 0); 896 1.1 christos div_op (sss, ss, 1, 0, 4); 897 1.1 christos 898 1.1 christos /** 1011 0010 010w 0011 DIVX.size #IMM */ 899 1.1 christos 900 1.1 christos prefix (0, 0, 0); 901 1.1 christos div_op (-1, 0, 0, 1, w+1); 902 1.1 christos 903 1.1 christos /** 1001 sss w ss01 1110 DIVX.size src */ 904 1.1 christos 905 1.1 christos prefix (0, 1, 0); 906 1.1 christos div_op (sss, ss, 0, 1, w+1); 907 1.1 christos 908 1.1 christos /** 0000 0001 1010 sss1 ss10 1111 DIVX.L src */ 909 1.1 christos 910 1.1 christos M32C_ONLY(); 911 1.1 christos prefix (0, 0, 0); 912 1.1 christos div_op (sss, ss, 0, 1, 4); 913 1.1 christos 914 1.1 christos /** 0000 0001 1001 ddd w dd00 1110 DSBB.size #IMM,dest */ 915 1.1 christos 916 1.1 christos DADDI(0,1); 917 1.1 christos 918 1.1 christos /** 0000 0001 1sss ddd w dd ss 1010 DSBB.size src,dest */ 919 1.1 christos 920 1.1 christos DADDV(0,1); 921 1.1 christos 922 1.1 christos /** 0000 0001 1001 ddd w dd01 1110 DSUB.size #IMM,dest */ 923 1.1 christos 924 1.1 christos DADDI(0,0); 925 1.1 christos 926 1.1 christos /** 0000 0001 1sss ddd w dd ss 0010 DSUB.size src,dest */ 927 1.1 christos 928 1.1 christos DADDV(0,0); 929 1.1 christos 930 1.1 christos /** 1110 1100 ENTER #IMM */ 931 1.1 christos 932 1.1 christos imm = IMM(1); 933 1.1 christos put_reg (sp, get_reg (sp) - 4); 934 1.1 christos mem_put_si (get_reg (sp), get_reg (fb)); 935 1.1 christos put_reg (fb, get_reg (sp)); 936 1.1 christos put_reg (sp, get_reg (sp) - imm); 937 1.1 christos 938 1.1 christos /** 1111 1100 EXITD */ 939 1.1 christos 940 1.1 christos put_reg (sp, get_reg (fb)); 941 1.1 christos put_reg (fb, mem_get_si (get_reg (sp))); 942 1.1 christos put_reg (sp, get_reg (sp) + 4); 943 1.1 christos put_reg (pc, mem_get_si (get_reg (sp))); 944 1.1 christos put_reg (sp, get_reg (sp) + 4); 945 1.1 christos 946 1.1 christos /** 1100 ddd w dd01 1110 EXTS.size dest */ 947 1.1 christos 948 1.1 christos prefix (0, 0, 0); 949 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 950 1.1 christos v = sign_ext (get_src (dc), (w+1)*8); 951 1.1 christos dc = widen_sd (dc); 952 1.1 christos put_dest (dc, v); 953 1.1 christos set_sz (v, (w+1)*2); 954 1.1 christos 955 1.1 christos /** 0000 0001 1sss ddd0 dd ss 0111 EXTS.B src,dest */ 956 1.1 christos 957 1.1 christos prefix (0, 0, 0); 958 1.1 christos sc = decode_src23 (sss, ss, 1); 959 1.1 christos dc = decode_dest23 (ddd, dd, 2); 960 1.1 christos v = sign_ext (get_src (sc), 8); 961 1.1 christos put_dest (dc, v); 962 1.1 christos set_sz (v, 16); 963 1.1 christos 964 1.1 christos /** 0000 0001 1sss ddd0 dd ss 1011 EXTZ src,dest */ 965 1.1 christos 966 1.1 christos prefix (0, 0, 0); 967 1.1 christos sc = decode_src23 (sss, ss, 1); 968 1.1 christos dc = decode_dest23 (ddd, dd, 2); 969 1.1 christos v = get_src (sc); 970 1.1 christos put_dest (dc, v); 971 1.1 christos set_sz (v, 16); 972 1.1 christos 973 1.1 christos /** 1101 0011 1110 1dst FCLR dest */ 974 1.1 christos 975 1.1 christos set_flags (1 << dst, 0); 976 1.1 christos 977 1.1 christos /** 1001 1111 FREIT */ 978 1.1 christos 979 1.1 christos NOTYET(); 980 1.1 christos 981 1.1 christos /** 1101 0001 1110 1dst FSET dest */ 982 1.1 christos 983 1.1 christos set_flags (1 << dst, 1 << dst); 984 1.1 christos 985 1.1 christos /** 1010 ddd w dd00 1110 INC.size dest */ 986 1.1 christos 987 1.1 christos prefix (0, 1, 0); 988 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 989 1.1 christos a = get_src (dc); 990 1.1 christos v = a+1; 991 1.1 christos tprintf ("%x ++ = %x\n", a, v); 992 1.1 christos set_sz (v, w+1); 993 1.1 christos put_dest (dc, v); 994 1.1 christos 995 1.1 christos /** 1000 sss0 ss0w 0011 INDEXB.size src */ 996 1.1 christos INDEXOP(1, 1, 1); 997 1.1 christos /** 1010 sss0 ss0w 0011 INDEXBD.size src */ 998 1.1 christos INDEXOP(1, 0, 1); 999 1.1 christos /** 1100 sss0 ss0w 0011 INDEXBS.size src */ 1000 1.1 christos INDEXOP(1, 1, 0); 1001 1.1 christos /** 1001 sss0 ss1w 0011 INDEXL.size src */ 1002 1.1 christos INDEXOP(4, 1, 1); 1003 1.1 christos /** 1011 sss0 ss1w 0011 INDEXLD.size src */ 1004 1.1 christos INDEXOP(4, 0, 1); 1005 1.1 christos /** 1001 sss0 ss0w 0011 INDEXLS.size src */ 1006 1.1 christos INDEXOP(4, 1, 0); 1007 1.1 christos /** 1000 sss0 ss1w 0011 INDEXW.size src */ 1008 1.1 christos INDEXOP(2, 1, 1); 1009 1.1 christos /** 1010 sss0 ss1w 0011 INDEXWD.size src */ 1010 1.1 christos INDEXOP(2, 0, 1); 1011 1.1 christos /** 1100 sss0 ss1w 0011 INDEXWS.size src */ 1012 1.1 christos INDEXOP(2, 1, 0); 1013 1.1 christos 1014 1.1 christos /** 1011 1110 vector00 INT #IMM */ 1015 1.1 christos 1016 1.1 christos prefix (0, 0, 0); 1017 1.1 christos trigger_based_interrupt (vector); 1018 1.1 christos 1019 1.1 christos /** 1011 1111 INTO */ 1020 1.1 christos 1021 1.1 christos prefix (0, 0, 0); 1022 1.1 christos if (FLAG_O) 1023 1.1 christos trigger_fixed_interrupt (0xffffe0); 1024 1.1 christos 1025 1.1 christos /** 1ccc 101c Jcnd label */ 1026 1.1 christos 1027 1.1 christos prefix (0, 0, 0); 1028 1.1 christos v = sign_ext (IMM(1), 8); 1029 1.1 christos if (condition_true (ccc*2+c)) 1030 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + v); 1031 1.1 christos 1032 1.1 christos /** 01dd 101d JMP.S label */ 1033 1.1 christos 1034 1.1 christos prefix (0, 0, 0); 1035 1.1 christos put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2); 1036 1.1 christos 1037 1.1 christos /** 1011 1011 JMP.B label */ 1038 1.1 christos 1039 1.1 christos prefix (0, 0, 0); 1040 1.1 christos imm = sign_ext (IMM(1), 8); 1041 1.1 christos if (imm == -1) 1042 1.1 christos { 1043 1.1 christos if (verbose) 1044 1.1 christos printf("[jmp-to-self detected as exit]\n"); 1045 1.1 christos return M32C_MAKE_HIT_BREAK (); 1046 1.1 christos } 1047 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + imm); 1048 1.1 christos 1049 1.1 christos /** 1100 1110 JMP.W label */ 1050 1.1 christos 1051 1.1 christos prefix (0, 0, 0); 1052 1.1 christos imm = sign_ext (IMM(2), 16); 1053 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + imm); 1054 1.1 christos 1055 1.1 christos /** 1100 1100 JMP.A label */ 1056 1.1 christos 1057 1.1 christos prefix (0, 0, 0); 1058 1.1 christos imm = IMM(3); 1059 1.1 christos put_reg (pc, imm); 1060 1.1 christos 1061 1.1 christos /** 1100 sss1 ss00 1111 JMPI.W src */ 1062 1.1 christos 1063 1.1 christos prefix (0, 0, 0); 1064 1.1 christos sc = decode_src23 (sss, ss, 2); 1065 1.1 christos a = get_src (sc); 1066 1.1 christos a = sign_ext (a, 16); 1067 1.1 christos put_reg (pc, m32c_opcode_pc + a); 1068 1.1 christos 1069 1.1 christos /** 1000 sss0 ss00 0001 JMPI.A src */ 1070 1.1 christos 1071 1.1 christos prefix (0, 0, 0); 1072 1.1 christos sc = decode_src23 (sss, ss, 3); 1073 1.1 christos a = get_src (sc); 1074 1.1 christos put_reg (pc, a); 1075 1.1 christos 1076 1.1 christos /** 1101 1100 JMPS #IMM8 */ 1077 1.1 christos 1078 1.1 christos prefix (0, 0, 0); 1079 1.1 christos imm = IMM(1); 1080 1.1 christos a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2); 1081 1.1 christos put_reg (pc, a); 1082 1.1 christos 1083 1.1 christos /** 1100 1111 JSR.W label */ 1084 1.1 christos 1085 1.1 christos prefix (0, 0, 0); 1086 1.1 christos imm = sign_ext (IMM(2), 16); 1087 1.1 christos put_reg (sp, get_reg (sp) - 4); 1088 1.1 christos mem_put_si (get_reg (sp), get_reg (pc)); 1089 1.1 christos put_reg (pc, m32c_opcode_pc + imm + 1); 1090 1.1 christos 1091 1.1 christos /** 1100 1101 JSR.A label */ 1092 1.1 christos 1093 1.1 christos prefix (0, 0, 0); 1094 1.1 christos imm = IMM(3); 1095 1.1 christos put_reg (sp, get_reg (sp) - 4); 1096 1.1 christos mem_put_si (get_reg (sp), get_reg (pc)); 1097 1.1 christos put_reg (pc, imm); 1098 1.1 christos 1099 1.1 christos /** 1100 sss1 ss01 1111 JSRI.W src */ 1100 1.1 christos 1101 1.1 christos prefix (0, 0, 0); 1102 1.1 christos sc = decode_src23 (sss, ss, 2); 1103 1.1 christos a = get_src (sc); 1104 1.1 christos a = sign_ext (a, 16); 1105 1.1 christos put_reg (sp, get_reg (sp) - 4); 1106 1.1 christos mem_put_si (get_reg (sp), get_reg (pc)); 1107 1.1 christos put_reg (pc, m32c_opcode_pc + a); 1108 1.1 christos 1109 1.1 christos /** 1001 sss0 ss00 0001 JSRI.A src */ 1110 1.1 christos 1111 1.1 christos prefix (0, 0, 0); 1112 1.1 christos sc = decode_src23 (sss, ss, 3); 1113 1.1 christos a = get_src (sc); 1114 1.1 christos put_reg (sp, get_reg (sp) - 4); 1115 1.1 christos mem_put_si (get_reg (sp), get_reg (pc)); 1116 1.1 christos put_reg (pc, a); 1117 1.1 christos 1118 1.1 christos /** 1101 1101 JSRS #IMM8 */ 1119 1.1 christos 1120 1.1 christos prefix (0, 0, 0); 1121 1.1 christos imm = IMM(1); 1122 1.1 christos a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2); 1123 1.1 christos put_reg (sp, get_reg (sp) - 4); 1124 1.1 christos mem_put_si (get_reg (sp), get_reg (pc)); 1125 1.1 christos put_reg (pc, a); 1126 1.1 christos 1127 1.1 christos /** 1101 0101 1010 1dst LDC #IMM16,dest */ 1128 1.1 christos 1129 1.1 christos imm = IMM(2); 1130 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0); 1131 1.1 christos put_dest (dc, imm); 1132 1.1 christos 1133 1.1 christos /** 1101 0101 0010 1dst LDC #IMM24,dest */ 1134 1.1 christos 1135 1.1 christos imm = IMM(3); 1136 1.1 christos dc = decode_cr_b (dst, CR_B_INTB); 1137 1.1 christos put_dest (dc, imm); 1138 1.1 christos 1139 1.1 christos /** 1101 0101 0110 1dst LDC #IMM24,dest */ 1140 1.1 christos 1141 1.1 christos imm = IMM(3); 1142 1.1 christos dc = decode_cr_b (dst, CR_B_DMA0); 1143 1.1 christos put_dest (dc, imm); 1144 1.1 christos 1145 1.1 christos /** 0000 0001 1101 sss1 ss00 1dst LDC src,dest */ 1146 1.1 christos 1147 1.1 christos prefix (0, 0, 0); 1148 1.1 christos sc = decode_src23 (sss, ss, 2); 1149 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0); 1150 1.1 christos a = get_src (sc); 1151 1.1 christos put_dest (dc, a); 1152 1.1 christos 1153 1.1 christos /** 1101 sss1 ss00 0dst LDC src,dest */ 1154 1.1 christos 1155 1.1 christos prefix (0, 0, 0); 1156 1.1 christos sc = decode_src23 (sss, ss, 3); 1157 1.1 christos dc = decode_cr_b (dst, CR_B_INTB); 1158 1.1 christos a = get_src (sc); 1159 1.1 christos put_dest (dc, a); 1160 1.1 christos 1161 1.1 christos /** 0000 0001 1101 sss1 ss00 0dst LDC src,dest */ 1162 1.1 christos 1163 1.1 christos prefix (0, 0, 0); 1164 1.1 christos sc = decode_src23 (sss, ss, 3); 1165 1.1 christos dc = decode_cr_b (dst, CR_B_DMA0); 1166 1.1 christos a = get_src (sc); 1167 1.1 christos put_dest (dc, a); 1168 1.1 christos 1169 1.1 christos /** 1011 0110 1100 0011 LDCTX */ 1170 1.1 christos 1171 1.1 christos NOTYET(); 1172 1.1 christos 1173 1.1.1.11 christos /** 1101 0101 1110 1flg LDIPL #IMM */ 1174 1.1 christos 1175 1.1.1.11 christos set_flags (0x7000, flg*0x1000); 1176 1.1 christos 1177 1.1 christos /** 0000 0001 1000 ddd w dd11 1111 MAX.size #IMM,dest */ 1178 1.1 christos 1179 1.1 christos prefix (0, 0, 0); 1180 1.1 christos w++; 1181 1.1 christos dc = decode_dest23 (ddd, dd, w); 1182 1.1 christos imm = sign_ext (IMM(w), w*8); 1183 1.1 christos a = sign_ext (get_src (dc), w*8); 1184 1.1 christos tprintf ("max %d %d\n", imm, a); 1185 1.1 christos if (imm > a) 1186 1.1 christos put_dest (dc, imm); 1187 1.1 christos 1188 1.1 christos /** 0000 0001 1sss ddd w dd ss 1101 MAX.size src,dest */ 1189 1.1 christos 1190 1.1 christos prefix (0, 0, 0); 1191 1.1 christos w++; 1192 1.1 christos sc = decode_src23 (sss, ss, w); 1193 1.1 christos dc = decode_dest23 (ddd, dd, w); 1194 1.1 christos b = sign_ext (get_src (sc), w*8); 1195 1.1 christos a = sign_ext (get_src (dc), w*8); 1196 1.1 christos tprintf ("max %d %d\n", b, a); 1197 1.1 christos if (b > a) 1198 1.1 christos put_dest (dc, b); 1199 1.1 christos 1200 1.1 christos /** 0000 0001 1000 ddd w dd10 1111 MIN.size #IMM,dest */ 1201 1.1 christos 1202 1.1 christos prefix (0, 0, 0); 1203 1.1 christos w++; 1204 1.1 christos dc = decode_dest23 (ddd, dd, w); 1205 1.1 christos imm = sign_ext (IMM(w), w*8); 1206 1.1 christos a = sign_ext (get_src (dc), w*8); 1207 1.1 christos tprintf ("min %d %d\n", imm, a); 1208 1.1 christos if (imm < a) 1209 1.1 christos put_dest (dc, imm); 1210 1.1 christos 1211 1.1 christos /** 0000 0001 1sss ddd w dd ss 1100 MIN.size src,dest */ 1212 1.1 christos 1213 1.1 christos prefix (0, 0, 0); 1214 1.1 christos w++; 1215 1.1 christos sc = decode_src23 (sss, ss, w); 1216 1.1 christos dc = decode_dest23 (ddd, dd, w); 1217 1.1 christos b = sign_ext (get_src (sc), w*8); 1218 1.1 christos a = sign_ext (get_src (dc), w*8); 1219 1.1 christos tprintf ("min %d %d\n", b, a); 1220 1.1 christos if (b < a) 1221 1.1 christos put_dest (dc, b); 1222 1.1 christos 1223 1.1 christos /** 1001 ddd w dd10 1111 MOV.size:G #IMM,dest */ 1224 1.1 christos 1225 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1226 1.1 christos imm = IMM(w+1); 1227 1.1 christos v = imm; 1228 1.1 christos tprintf("%x = %x\n", v, v); 1229 1.1 christos set_sz(v, w+1); 1230 1.1 christos put_dest (dc, v); 1231 1.1 christos 1232 1.1 christos /** 1011 ddd0 dd11 0001 MOV.L:G #IMM,dest */ 1233 1.1 christos 1234 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1235 1.1 christos imm = IMM(4); 1236 1.1 christos v = imm; 1237 1.1 christos tprintf("%x = %x\n", v, v); 1238 1.1 christos set_sz(v, 4); 1239 1.1 christos put_dest (dc, v); 1240 1.1 christos 1241 1.1 christos /** 1111 ddd w dd10 immm MOV.size:Q #IMM4,dest */ 1242 1.1 christos 1243 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1244 1.1 christos imm = sign_ext (immm, 4); 1245 1.1 christos v = imm; 1246 1.1 christos tprintf("%x = %d\n", v, v); 1247 1.1 christos set_sz(v, w+1); 1248 1.1 christos put_dest (dc, v); 1249 1.1 christos 1250 1.1 christos /** 00dd 010w MOV.size:S #IMM,dest */ 1251 1.1 christos 1252 1.1 christos prefix (0, 1, 0); 1253 1.1 christos dc = decode_dest2 (dd, w+1); 1254 1.1 christos imm = IMM(w+1); 1255 1.1 christos put_dest (dc, imm); 1256 1.1 christos set_sz (imm, w+1); 1257 1.1 christos 1258 1.1 christos /** 10w1 110d MOV.size:S #IMM,a0/a1 */ 1259 1.1 christos 1260 1.1 christos imm = IMM(w ? 3 : 2); 1261 1.1 christos put_reg (d ? a1 : a0, imm); 1262 1.1 christos set_sz (imm & addr_mask, w+1); 1263 1.1 christos 1264 1.1 christos /** 00dd 001w MOV.size:Z #0,dest */ 1265 1.1 christos 1266 1.1 christos prefix (0, 1, 0); 1267 1.1 christos dc = decode_dest2 (dd, w+1); 1268 1.1 christos put_dest (dc, 0); 1269 1.1 christos set_sz (0, w+1); 1270 1.1 christos 1271 1.1 christos /** 1sss ddd w dd ss 1011 MOV.size:G src,dest */ 1272 1.1 christos 1273 1.1 christos prefix (1, 1, 0); 1274 1.1 christos sc = decode_src23 (sss, ss, w+1); 1275 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1276 1.1 christos v = get_src (sc); 1277 1.1 christos put_dest (dc, v); 1278 1.1 christos set_sz (v, w+1); 1279 1.1 christos 1280 1.1 christos /** 1sss ddd1 dd ss 0011 MOV.L:G src,dest */ 1281 1.1 christos 1282 1.1 christos prefix (1, 1, 0); 1283 1.1 christos sc = decode_src23 (sss, ss, 4); 1284 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1285 1.1 christos v = get_src (sc); 1286 1.1 christos put_dest (dc, v); 1287 1.1 christos set_sz (v, 4); 1288 1.1 christos 1289 1.1 christos /** VARY SS 01 10 11 */ 1290 1.1 christos /** 00SS 100w MOV.size:S src,R0L/R0 */ 1291 1.1 christos 1292 1.1 christos prefix (0, 1, 0); 1293 1.1 christos sc = decode_dest2 (SS, w+1); 1294 1.1 christos v = get_src (sc); 1295 1.1 christos put_reg (w ? r0 : r0l, v); 1296 1.1 christos set_sz (v, w+1); 1297 1.1 christos 1298 1.1 christos /** 01ss 111w MOV.size:S src,R1L/R1 */ 1299 1.1 christos 1300 1.1 christos prefix (0, 1, 0); 1301 1.1 christos sc = decode_dest2 (ss, w+1); 1302 1.1 christos v = get_src (sc); 1303 1.1 christos put_reg (w ? r1 : r1l, v); 1304 1.1 christos set_sz (v, w+1); 1305 1.1 christos 1306 1.1 christos /** VARY DD 01 10 11 */ 1307 1.1 christos /** 00DD 000w MOV.size:S R0L/R0,dest */ 1308 1.1 christos 1309 1.1 christos prefix (0, 1, 0); 1310 1.1 christos dc = decode_dest2 (DD, w+1); 1311 1.1 christos v = get_reg (w ? r0 : r0l); 1312 1.1 christos put_dest (dc, v); 1313 1.1 christos set_sz (v, w+1); 1314 1.1 christos 1315 1.1 christos /** 01ss 100d MOV.L:S src,A0/A1 */ 1316 1.1 christos 1317 1.1 christos prefix (0, 1, 0); 1318 1.1 christos sc = decode_dest2 (ss, 4); 1319 1.1 christos v = get_src (sc); 1320 1.1 christos put_reg (d ? a1 : a0, v); 1321 1.1 christos set_sz (v, 4); 1322 1.1 christos 1323 1.1 christos /** 1011 ddd w dd00 1111 MOV.size:G dsp:8[SP], dest */ 1324 1.1 christos 1325 1.1 christos prefix (0, 0, 0); 1326 1.1 christos imm = IMM(1); 1327 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1328 1.1 christos a = get_reg (sp) + sign_ext (imm, 8); 1329 1.1 christos a &= addr_mask; 1330 1.1 christos if (w) 1331 1.1 christos v = mem_get_hi (a); 1332 1.1 christos else 1333 1.1 christos v = mem_get_qi (a); 1334 1.1 christos put_dest (dc, v); 1335 1.1 christos set_sz (v, w+1); 1336 1.1 christos 1337 1.1 christos /** 1010 sss w ss00 1111 MOV.size:G src,dsp:8[SP] */ 1338 1.1 christos 1339 1.1 christos prefix (0, 0, 0); 1340 1.1 christos sc = decode_dest23 (sss, ss, w+1); 1341 1.1 christos imm = IMM(1); 1342 1.1 christos a = get_reg (sp) + sign_ext (imm, 8); 1343 1.1 christos a &= addr_mask; 1344 1.1 christos v = get_src (sc); 1345 1.1 christos if (w) 1346 1.1 christos mem_put_hi (a, v); 1347 1.1 christos else 1348 1.1 christos mem_put_qi (a, v); 1349 1.1 christos set_sz (v, w+1); 1350 1.1 christos 1351 1.1 christos /** 1101 sss1 ss01 1dst MOVA src,dest */ 1352 1.1 christos 1353 1.1.1.10 christos { 1354 1.1 christos static reg_id map[8] = { r2r0, r3r1, a0, a1 }; 1355 1.1 christos prefix (0, 0, 0); 1356 1.1 christos sc = decode_src23 (sss, ss, 1); 1357 1.1 christos if (!sc.mem || !map[dst]) 1358 1.1 christos UNSUPPORTED(); 1359 1.1 christos put_reg (map[dst], sc.u.addr); 1360 1.1.1.10 christos } 1361 1.1 christos 1362 1.1 christos /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */ 1363 1.1 christos 1364 1.1 christos prefix (0, 0, 0); 1365 1.1 christos dc = decode_dest23 (ddd, dd, 1); 1366 1.1 christos a = get_src (dc); 1367 1.1 christos b = get_reg (r0l); 1368 1.1 christos switch (hl) 1369 1.1 christos { 1370 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break; 1371 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1372 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1373 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break; 1374 1.1 christos } 1375 1.1 christos put_dest (dc, a); 1376 1.1 christos 1377 1.1 christos /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */ 1378 1.1 christos 1379 1.1 christos prefix (0, 0, 0); 1380 1.1 christos sc = decode_dest23 (sss, ss, 1); 1381 1.1 christos a = get_reg (r0l); 1382 1.1 christos b = get_src (dc); 1383 1.1 christos switch (hl) 1384 1.1 christos { 1385 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break; 1386 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1387 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1388 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break; 1389 1.1 christos } 1390 1.1 christos put_reg (r0l, a); 1391 1.1 christos 1392 1.1 christos /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */ 1393 1.1 christos 1394 1.1 christos prefix (0, 1, 0); 1395 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1396 1.1 christos imm = sign_ext (IMM(1), 8); 1397 1.1 christos put_dest (dc, imm); 1398 1.1 christos set_sz (imm, 1); 1399 1.1 christos 1400 1.1 christos /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */ 1401 1.1 christos 1402 1.1 christos prefix (0, 1, 0); 1403 1.1 christos w ++; 1404 1.1 christos dc = decode_dest23 (ddd, dd, w); 1405 1.1 christos v = sign_ext (get_src (dc), w*8); 1406 1.1 christos imm = sign_ext (IMM(w), w*8); 1407 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm); 1408 1.1 christos v *= imm; 1409 1.1 christos dc = widen_sd (dc); 1410 1.1 christos put_dest (dc, v); 1411 1.1 christos 1412 1.1 christos /** 1sss ddd w dd ss 1100 MUL.size src,dest */ 1413 1.1 christos 1414 1.1 christos prefix (1, 1, 0); 1415 1.1 christos w ++; 1416 1.1 christos sc = decode_src23 (sss, ss, w); 1417 1.1 christos dc = decode_dest23 (ddd, dd, w); 1418 1.1 christos a = sign_ext (get_src (sc), w*8); 1419 1.1 christos b = sign_ext (get_src (dc), w*8); 1420 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b); 1421 1.1 christos v = a * b; 1422 1.1 christos dc = widen_sd (dc); 1423 1.1 christos put_dest (dc, v); 1424 1.1 christos 1425 1.1 christos /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */ 1426 1.1 christos 1427 1.1 christos M32C_ONLY(); 1428 1.1 christos prefix (0, 0, 0); 1429 1.1 christos sc = decode_src23 (sss, ss, 4); 1430 1.1 christos a = sign_ext (get_src (sc), 32); 1431 1.1 christos b = sign_ext (get_reg (r2r0), 32); 1432 1.1 christos ll = (long long)a * (long long)b; 1433 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1434 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1435 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O); 1436 1.1 christos else 1437 1.1 christos set_flags (FLAGBIT_O, 0); 1438 1.1 christos put_reg (r2r0, (int)ll); 1439 1.1 christos 1440 1.1 christos /** 1100 sss1 ss11 1110 MULEX src */ 1441 1.1 christos 1442 1.1 christos prefix (0, 1, 0); 1443 1.1 christos sc = decode_dest23 (sss, ss, 2); 1444 1.1 christos a = sign_ext (get_src (sc), 16); 1445 1.1 christos b = sign_ext (get_reg (r2r0), 32); 1446 1.1 christos ll = (long long)a * (long long)b; 1447 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1448 1.1 christos put_reg (r2r0, (int)ll); 1449 1.1 christos put_reg (r1, (int)(ll >> 32)); 1450 1.1 christos 1451 1.1 christos /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */ 1452 1.1 christos 1453 1.1 christos prefix (0, 1, 0); 1454 1.1 christos w ++; 1455 1.1 christos dc = decode_dest23 (ddd, dd, w); 1456 1.1 christos v = get_src (dc); 1457 1.1 christos imm = IMM(w); 1458 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm); 1459 1.1 christos v *= imm; 1460 1.1 christos dc = widen_sd (dc); 1461 1.1 christos put_dest (dc, v); 1462 1.1 christos 1463 1.1 christos /** 1sss ddd w dd ss 0100 MULU.size src,dest */ 1464 1.1 christos 1465 1.1 christos prefix (1, 1, 0); 1466 1.1 christos w ++; 1467 1.1 christos sc = decode_src23 (sss, ss, w); 1468 1.1 christos dc = decode_dest23 (ddd, dd, w); 1469 1.1 christos a = get_src (sc); 1470 1.1 christos b = get_src (dc); 1471 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b); 1472 1.1 christos v = a * b; 1473 1.1 christos dc = widen_sd (dc); 1474 1.1 christos put_dest (dc, v); 1475 1.1 christos 1476 1.1 christos /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */ 1477 1.1 christos 1478 1.1 christos M32C_ONLY(); 1479 1.1 christos prefix (0, 0, 0); 1480 1.1 christos sc = decode_src23 (sss, ss, 4); 1481 1.1 christos a = get_src (sc); 1482 1.1 christos b = get_reg (r2r0); 1483 1.1 christos ll = (long long)a * (long long)b; 1484 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1485 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1486 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O); 1487 1.1 christos else 1488 1.1 christos set_flags (FLAGBIT_O, 0); 1489 1.1 christos put_reg (r2r0, (int)ll); 1490 1.1 christos 1491 1.1 christos /** 1010 ddd w dd10 1111 NEG.size dest */ 1492 1.1 christos 1493 1.1 christos prefix (0, 1, 0); 1494 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1495 1.1 christos a = sign_ext (get_src (dc), (w+1)*8); 1496 1.1 christos v = -a; 1497 1.1 christos tprintf("%d * -1 = %d\n", a, v); 1498 1.1 christos set_oszc(v, w+1, v==0); 1499 1.1 christos put_dest (dc, v); 1500 1.1 christos 1501 1.1 christos /** 1101 1110 NOP */ 1502 1.1 christos 1503 1.1 christos tprintf("nop\n"); 1504 1.1 christos 1505 1.1 christos /** 1010 ddd w dd01 1110 NOT.size dest */ 1506 1.1 christos 1507 1.1 christos prefix (0, 1, 0); 1508 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1509 1.1 christos a = get_src (dc); 1510 1.1 christos v = ~a; 1511 1.1 christos tprintf("~ %x = %x\n", a, v); 1512 1.1 christos set_sz(v, w+1); 1513 1.1 christos put_dest (dc, v); 1514 1.1 christos 1515 1.1 christos /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */ 1516 1.1 christos 1517 1.1 christos prefix (0, 1, 0); 1518 1.1 christos dc = decode_dest23(ddd, dd, w+1); 1519 1.1 christos imm = IMM(w+1); 1520 1.1 christos LOGIC_OP (dc, imm, |); 1521 1.1 christos 1522 1.1 christos /** 01dd 010w OR.size:S #IMM,dest */ 1523 1.1 christos 1524 1.1 christos prefix (0, 1, 0); 1525 1.1 christos dc = decode_dest2(dd, w+1); 1526 1.1 christos imm = IMM (w+1); 1527 1.1 christos LOGIC_OP (dc, imm, |); 1528 1.1 christos 1529 1.1 christos /** 1sss ddd w dd ss 0101 OR.size:G src,dest */ 1530 1.1 christos 1531 1.1 christos prefix (1, 1, 0); 1532 1.1 christos sc = decode_src23(sss, ss, w+1); 1533 1.1 christos dc = decode_dest23(ddd, dd, w+1); 1534 1.1 christos b = get_src (sc); 1535 1.1 christos LOGIC_OP (dc, b, |); 1536 1.1 christos 1537 1.1 christos /** 1011 ddd w dd10 1111 POP.size dest */ 1538 1.1 christos 1539 1.1 christos prefix (0, 1, 0); 1540 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1541 1.1 christos if (w) 1542 1.1 christos a = mem_get_hi (get_reg (sp)); 1543 1.1 christos else 1544 1.1 christos a = mem_get_qi (get_reg (sp)); 1545 1.1 christos put_reg (sp, get_reg (sp) + 2); 1546 1.1 christos tprintf("pop%s: %x\n", w ? "hi" : "qi", a); 1547 1.1 christos put_dest (dc, a); 1548 1.1 christos 1549 1.1 christos /** 1101 0011 1010 1dst POPC dest */ 1550 1.1 christos 1551 1.1 christos prefix (0, 0, 0); 1552 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0); 1553 1.1 christos a = mem_get_hi (get_reg (sp)); 1554 1.1 christos put_reg (sp, get_reg (sp) + 2); 1555 1.1 christos tprintf("pophi: %x\n", a); 1556 1.1 christos put_dest (dc, a); 1557 1.1 christos 1558 1.1 christos /** 1101 0011 0010 1dst POPC dest */ 1559 1.1 christos 1560 1.1 christos prefix (0, 0, 0); 1561 1.1 christos dc = decode_cr_b (dst, CR_B_INTB); 1562 1.1 christos a = mem_get_si (get_reg (sp)); 1563 1.1 christos put_reg (sp, get_reg (sp) + 4); 1564 1.1 christos tprintf("popsi: %x\n", a); 1565 1.1 christos put_dest (dc, a); 1566 1.1 christos 1567 1.1 christos /** 1000 1110 POPM dest */ 1568 1.1 christos 1569 1.1.1.10 christos { 1570 1.1 christos static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb }; 1571 1.1 christos prefix (0, 0, 0); 1572 1.1 christos imm = IMM(1); 1573 1.1 christos tprintf("popm: %x\n", imm); 1574 1.1 christos for (a=0; a<4; a++) 1575 1.1 christos if (imm & (1<<a)) 1576 1.1 christos { 1577 1.1 christos v = mem_get_hi (get_reg (sp)); 1578 1.1 christos put_reg (map[a], v); 1579 1.1 christos put_reg (sp, get_reg (sp) + 2); 1580 1.1 christos } 1581 1.1 christos for (; a<8; a++) 1582 1.1 christos if (imm & (1<<a)) 1583 1.1 christos { 1584 1.1 christos v = mem_get_si (get_reg (sp)); 1585 1.1 christos put_reg (map[a], v); 1586 1.1 christos put_reg (sp, get_reg (sp) + 4); 1587 1.1 christos } 1588 1.1.1.10 christos } 1589 1.1 christos 1590 1.1 christos /** 1010 111w PUSH.size #IMM */ 1591 1.1 christos 1592 1.1 christos prefix (0, 0, 0); 1593 1.1 christos imm = IMM(w+1); 1594 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", imm); 1595 1.1.1.10 christos a = get_reg (sp) - 2; 1596 1.1 christos if (w) 1597 1.1 christos mem_put_hi (a, imm); 1598 1.1 christos else 1599 1.1 christos mem_put_qi (a, imm); 1600 1.1 christos put_reg (sp, a); 1601 1.1 christos 1602 1.1 christos /** 1100 sss w ss00 1110 PUSH.size src */ 1603 1.1 christos 1604 1.1 christos prefix (0, 1, 0); 1605 1.1 christos sc = decode_dest23 (sss, ss, w+1); 1606 1.1 christos a = get_src (sc); 1607 1.1 christos put_reg (sp, get_reg (sp) - 2); 1608 1.1 christos if (w) 1609 1.1 christos mem_put_hi (get_reg (sp), a); 1610 1.1 christos else 1611 1.1 christos mem_put_qi (get_reg (sp), a); 1612 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", a); 1613 1.1 christos 1614 1.1 christos /** 1011 0110 0101 0011 PUSH.L #IMM32 */ 1615 1.1 christos 1616 1.1 christos imm = IMM(4); 1617 1.1 christos put_reg (sp, get_reg (sp) - 4); 1618 1.1 christos mem_put_si (get_reg (sp), imm); 1619 1.1 christos 1620 1.1 christos /** 1010 sss0 ss00 0001 PUSH.L src */ 1621 1.1 christos 1622 1.1 christos prefix (0, 1, 0); 1623 1.1 christos sc = decode_dest23 (sss, ss, 4); 1624 1.1 christos a = get_src (sc); 1625 1.1 christos put_reg (sp, get_reg (sp) - 4); 1626 1.1 christos mem_put_si (get_reg (sp), a); 1627 1.1 christos 1628 1.1 christos /** 1011 0sa0 ss00 0001 PUSHA src */ 1629 1.1 christos 1630 1.1 christos prefix (0, 0, 0); 1631 1.1 christos sc = decode_dest23 (sa, ss, 1); 1632 1.1 christos put_reg (sp, get_reg (sp) - 4); 1633 1.1 christos mem_put_hi (get_reg (sp), sc.u.addr); 1634 1.1 christos tprintf("pushsi: %x\n", sc.u.addr); 1635 1.1 christos 1636 1.1 christos /** 1101 0001 1010 1src PUSHC src */ 1637 1.1 christos 1638 1.1 christos prefix (0, 0, 0); 1639 1.1 christos sc = decode_cr_b (src, CR_B_DCT0); 1640 1.1 christos a = get_src (sc); 1641 1.1 christos put_reg (sp, get_reg (sp) - 2); 1642 1.1 christos mem_put_hi (get_reg (sp), a); 1643 1.1 christos tprintf("pushhi: %x\n", a); 1644 1.1 christos 1645 1.1 christos /** 1101 0001 0010 1src PUSHC src */ 1646 1.1 christos 1647 1.1 christos prefix (0, 0, 0); 1648 1.1 christos sc = decode_cr_b (src, CR_B_INTB); 1649 1.1 christos a = get_src (sc); 1650 1.1 christos put_reg (sp, get_reg (sp) - 4); 1651 1.1 christos mem_put_si (get_reg (sp), a); 1652 1.1 christos tprintf("pushsi: %x\n", a); 1653 1.1 christos 1654 1.1 christos /** 1000 1111 PUSHM src */ 1655 1.1 christos 1656 1.1.1.10 christos { 1657 1.1 christos static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 }; 1658 1.1 christos imm = IMM(1); 1659 1.1 christos tprintf("pushm: %x\n", imm); 1660 1.1 christos for (a=0; a<4; a++) 1661 1.1 christos if (imm & (1<<a)) 1662 1.1 christos { 1663 1.1 christos put_reg (sp, get_reg (sp) - 4); 1664 1.1 christos v = get_reg (map[a]); 1665 1.1 christos mem_put_si (get_reg (sp), v); 1666 1.1 christos } 1667 1.1 christos for (; a<8; a++) 1668 1.1 christos if (imm & (1<<a)) 1669 1.1 christos { 1670 1.1 christos put_reg (sp, get_reg (sp) - 2); 1671 1.1 christos v = get_reg (map[a]); 1672 1.1 christos mem_put_hi (get_reg (sp), v); 1673 1.1 christos } 1674 1.1.1.10 christos } 1675 1.1 christos 1676 1.1 christos /** 1001 1110 REIT */ 1677 1.1 christos 1678 1.1 christos a = get_reg (sp); 1679 1.1 christos put_reg (pc, mem_get_si (a)); 1680 1.1 christos a += 4; 1681 1.1 christos put_reg (flags, mem_get_hi (a)); 1682 1.1 christos a += 2; 1683 1.1 christos put_reg (sp, a); 1684 1.1 christos 1685 1.1 christos /** 1011 1000 010w 0011 RMPA.size */ 1686 1.1 christos 1687 1.1.1.10 christos { 1688 1.1 christos int count = get_reg (r3); 1689 1.1 christos int list1 = get_reg (a0); 1690 1.1 christos int list2 = get_reg (a1); 1691 1.1 christos long long sum = get_reg_ll (r3r1r2r0) & 0xffffff; 1692 1.1 christos 1693 1.1 christos while (count) 1694 1.1 christos { 1695 1.1 christos if (w) 1696 1.1 christos { 1697 1.1 christos a = sign_ext (mem_get_hi (list1), 16); 1698 1.1 christos b = sign_ext (mem_get_hi (list2), 16); 1699 1.1 christos } 1700 1.1 christos else 1701 1.1 christos { 1702 1.1 christos a = sign_ext (mem_get_qi (list1), 8); 1703 1.1 christos b = sign_ext (mem_get_qi (list2), 8); 1704 1.1 christos } 1705 1.1 christos tprintf("%lld + %d * %d = ", sum, a, b); 1706 1.1 christos sum += a * b; 1707 1.1 christos tprintf("%lld\n", sum); 1708 1.1 christos list1 += w ? 2 : 1; 1709 1.1 christos list2 += w ? 2 : 1; 1710 1.1 christos count --; 1711 1.1 christos } 1712 1.1 christos put_reg (r3, count); 1713 1.1 christos put_reg (a0, list1); 1714 1.1 christos put_reg (a1, list2); 1715 1.1 christos put_reg (r2r0, (int)(sum & 0xffffffffU)); 1716 1.1 christos put_reg (r1, (int)(sum >> 32)); 1717 1.1.1.10 christos } 1718 1.1 christos 1719 1.1 christos /** 1011 ddd w dd10 1110 ROLC.size dest */ 1720 1.1 christos 1721 1.1 christos prefix (0, 1, 0); 1722 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1723 1.1 christos rot_op (dc, 1, 1); 1724 1.1 christos 1725 1.1 christos /** 1010 ddd w dd10 1110 RORC.size dest */ 1726 1.1 christos 1727 1.1 christos prefix (0, 1, 0); 1728 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1729 1.1 christos rot_op (dc, 1, -1); 1730 1.1 christos 1731 1.1 christos /** 1110 ddd w dd10 immm ROT.size #IMM, dest */ 1732 1.1 christos 1733 1.1 christos prefix (0, 1, 0); 1734 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1735 1.1 christos rot_op (dc, IMM4(), -1); 1736 1.1 christos 1737 1.1 christos /** 1010 ddd w dd11 1111 ROT.size R1H,dest */ 1738 1.1 christos 1739 1.1 christos prefix (0, 1, 0); 1740 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1741 1.1 christos a = sign_ext (get_reg (r1h), 8); 1742 1.1 christos rot_op (dc, a, -1); 1743 1.1 christos 1744 1.1 christos /** 1101 1111 RTS */ 1745 1.1 christos 1746 1.1 christos put_reg (pc, mem_get_si (get_reg (sp))); 1747 1.1 christos put_reg (sp, get_reg (sp) + 4); 1748 1.1 christos 1749 1.1 christos /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */ 1750 1.1 christos 1751 1.1 christos prefix (0, 0, 0); 1752 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1753 1.1 christos imm = IMM (w+1); 1754 1.1 christos MATH_OP (dc, imm, !carry, -); 1755 1.1 christos 1756 1.1 christos /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */ 1757 1.1 christos 1758 1.1 christos prefix (0, 0, 0); 1759 1.1 christos sc = decode_src23 (sss, ss, w+1); 1760 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1761 1.1 christos MATH_OP (dc, get_src (sc), !carry, -); 1762 1.1 christos 1763 1.1 christos /** 1101 ddd1 dd11 cond SCcond dest */ 1764 1.1 christos 1765 1.1 christos prefix (0, 1, 0); 1766 1.1 christos dc = decode_dest23 (ddd, dd, 2); 1767 1.1 christos if (condition_true (cond)) 1768 1.1 christos put_dest (dc, 1); 1769 1.1 christos else 1770 1.1 christos put_dest (dc, 0); 1771 1.1 christos 1772 1.1 christos /** 1011 1000 110w 0011 SCMPU.size */ 1773 1.1 christos 1774 1.1 christos ta0 = get_reg (a0); 1775 1.1 christos ta1 = get_reg (a1); 1776 1.1 christos 1777 1.1 christos for (;;) 1778 1.1 christos { 1779 1.1 christos t0 = mem_get_qi (ta0); 1780 1.1 christos t2 = mem_get_qi (ta1); 1781 1.1 christos if (w) 1782 1.1 christos { 1783 1.1 christos t1 = mem_get_qi (ta0 + 1); 1784 1.1 christos t3 = mem_get_qi (ta1 + 1); 1785 1.1 christos } 1786 1.1 christos dif = t0 - t2; 1787 1.1 christos if (dif == 0 && t0 != 0 && w) 1788 1.1 christos dif = t1 - t3; 1789 1.1 christos set_oszc (dif, 1, dif > 0); 1790 1.1 christos 1791 1.1 christos ta0 += w ? 2 : 1; 1792 1.1 christos ta1 += w ? 2 : 1; 1793 1.1 christos 1794 1.1 christos if (t0 == 0 || t0 != t2) 1795 1.1 christos break; 1796 1.1 christos if (w && (t1 == 0 || t1 != t3)) 1797 1.1 christos break; 1798 1.1 christos } 1799 1.1 christos 1800 1.1 christos /** 1111 ddd w dd00 immm SHA.size #IMM,dest */ 1801 1.1 christos 1802 1.1 christos prefix (0, 1, 0); 1803 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1804 1.1 christos shift_op (dc, 1, IMM4(), 1); 1805 1.1 christos 1806 1.1 christos /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */ 1807 1.1 christos 1808 1.1 christos prefix (0, 1, 0); 1809 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1810 1.1 christos imm = sign_ext (IMM(1), 8); 1811 1.1 christos shift_op (dc, 1, imm, 1); 1812 1.1 christos 1813 1.1 christos /** 1011 ddd w dd11 1110 SHA.size R1H,dest */ 1814 1.1 christos 1815 1.1 christos prefix (0, 1, 0); 1816 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1817 1.1 christos a = sign_ext (get_reg (r1h), 8); 1818 1.1 christos shift_op (dc, 1, a, 1); 1819 1.1 christos 1820 1.1 christos /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */ 1821 1.1 christos 1822 1.1 christos prefix (0, 1, 0); 1823 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1824 1.1 christos a = sign_ext (get_reg (r1h), 8); 1825 1.1 christos shift_op (dc, 1, a, 1); 1826 1.1 christos 1827 1.1 christos /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */ 1828 1.1 christos 1829 1.1 christos M32C_ONLY(); 1830 1.1 christos prefix (0, 1, 0); 1831 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1832 1.1 christos imm = sign_ext (IMM(1), 8); 1833 1.1 christos shift_op (dc, 1, imm, 0); 1834 1.1 christos 1835 1.1 christos /** 1110 ddd w dd00 immm SHL.size #IMM, dest */ 1836 1.1 christos 1837 1.1 christos prefix (0, 1, 0); 1838 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1839 1.1 christos shift_op (dc, 0, IMM4(), 1); 1840 1.1 christos 1841 1.1 christos /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */ 1842 1.1 christos 1843 1.1 christos prefix (0, 1, 0); 1844 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1845 1.1 christos imm = sign_ext (IMM(1), 8); 1846 1.1 christos shift_op (dc, 0, imm, 1); 1847 1.1 christos 1848 1.1 christos /** 1010 ddd w dd11 1110 SHL.size R1H,dest */ 1849 1.1 christos 1850 1.1 christos prefix (0, 1, 0); 1851 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 1852 1.1 christos a = sign_ext (get_reg (r1h), 8); 1853 1.1 christos shift_op (dc, 0, a, 1); 1854 1.1 christos 1855 1.1 christos /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */ 1856 1.1 christos 1857 1.1 christos prefix (0, 1, 0); 1858 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1859 1.1 christos a = sign_ext (get_reg (r1h), 8); 1860 1.1 christos shift_op (dc, 0, a, 1); 1861 1.1 christos 1862 1.1 christos /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */ 1863 1.1 christos 1864 1.1 christos M32C_ONLY(); 1865 1.1 christos prefix (0, 1, 0); 1866 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1867 1.1 christos imm = sign_ext (IMM(1), 8); 1868 1.1 christos shift_op (dc, 0, imm, 0); 1869 1.1 christos 1870 1.1 christos /** 1011 0010 100w 0011 SIN.size */ 1871 1.1 christos 1872 1.1 christos v = get_reg (a0); 1873 1.1 christos a = get_reg (a1); 1874 1.1 christos b = get_reg (r3); 1875 1.1 christos if (b) for (;b;) 1876 1.1 christos { 1877 1.1 christos if (w) 1878 1.1 christos mem_put_hi(a, mem_get_hi (v)); 1879 1.1 christos else 1880 1.1 christos mem_put_qi(a, mem_get_qi (v)); 1881 1.1 christos a += w ? 2 : 1; 1882 1.1 christos b --; 1883 1.1 christos } 1884 1.1 christos put_reg (a0, v); 1885 1.1 christos put_reg (a1, a); 1886 1.1 christos put_reg (r3, b); 1887 1.1 christos 1888 1.1 christos /** 1011 0110 100w 0011 SMOVB.size */ 1889 1.1 christos 1890 1.1 christos v = get_reg (a0); 1891 1.1 christos a = get_reg (a1); 1892 1.1 christos b = get_reg (r3); 1893 1.1 christos if (b) for (;b;) 1894 1.1 christos { 1895 1.1 christos if (w) 1896 1.1 christos mem_put_hi(a, mem_get_hi (v)); 1897 1.1 christos else 1898 1.1 christos mem_put_qi(a, mem_get_qi (v)); 1899 1.1 christos v -= w ? 2 : 1; 1900 1.1 christos a -= w ? 2 : 1; 1901 1.1 christos b --; 1902 1.1 christos } 1903 1.1 christos put_reg (a0, v); 1904 1.1 christos put_reg (a1, a); 1905 1.1 christos put_reg (r3, b); 1906 1.1 christos 1907 1.1 christos /** 1011 0000 100w 0011 SMOVF.size */ 1908 1.1 christos 1909 1.1 christos v = get_reg (a0); 1910 1.1 christos a = get_reg (a1); 1911 1.1 christos b = get_reg (r3); 1912 1.1 christos if (b) for (;b;) 1913 1.1 christos { 1914 1.1 christos if (w) 1915 1.1 christos mem_put_hi(a, mem_get_hi (v)); 1916 1.1 christos else 1917 1.1 christos mem_put_qi(a, mem_get_qi (v)); 1918 1.1 christos v += w ? 2 : 1; 1919 1.1 christos a += w ? 2 : 1; 1920 1.1 christos b --; 1921 1.1 christos } 1922 1.1 christos put_reg (a0, v); 1923 1.1 christos put_reg (a1, a); 1924 1.1 christos put_reg (r3, b); 1925 1.1 christos 1926 1.1 christos /** 1011 1000 100w 0011 SMOVU.size */ 1927 1.1 christos 1928 1.1 christos v = get_reg (a0); 1929 1.1 christos a = get_reg (a1); 1930 1.1 christos do 1931 1.1 christos { 1932 1.1 christos if (w) 1933 1.1 christos mem_put_hi(a, (t0 = mem_get_hi (v))); 1934 1.1 christos else 1935 1.1 christos mem_put_qi(a, (t0 = mem_get_qi (v))); 1936 1.1 christos v += w ? 2 : 1; 1937 1.1 christos a += w ? 2 : 1; 1938 1.1 christos if (t0 == 0 1939 1.1 christos || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0))) 1940 1.1 christos break; 1941 1.1 christos } while (1); 1942 1.1 christos put_reg (a0, v); 1943 1.1 christos put_reg (a1, a); 1944 1.1 christos 1945 1.1 christos /** 1011 0100 100w 0011 SOUT.size */ 1946 1.1 christos 1947 1.1 christos v = get_reg (a0); 1948 1.1 christos a = get_reg (a1); 1949 1.1 christos b = get_reg (r3); 1950 1.1 christos for (;b;) 1951 1.1 christos { 1952 1.1 christos if (w) 1953 1.1 christos mem_put_hi(a, mem_get_hi (v)); 1954 1.1 christos else 1955 1.1 christos mem_put_qi(a, mem_get_qi (v)); 1956 1.1 christos v += w ? 2 : 1; 1957 1.1 christos b --; 1958 1.1 christos } 1959 1.1 christos put_reg (a0, v); 1960 1.1 christos put_reg (a1, a); 1961 1.1 christos put_reg (r3, b); 1962 1.1 christos 1963 1.1 christos /** 1011 1000 000w 0011 SSTR.size */ 1964 1.1 christos 1965 1.1 christos a = get_reg (a1); 1966 1.1 christos b = get_reg (r3); 1967 1.1 christos v = get_reg (w ? r0 : r0l); 1968 1.1 christos for (;b;) 1969 1.1 christos { 1970 1.1 christos if (w) 1971 1.1 christos mem_put_hi(a, v); 1972 1.1 christos else 1973 1.1 christos mem_put_qi(a, v); 1974 1.1 christos a += w ? 2 : 1; 1975 1.1 christos b --; 1976 1.1 christos } 1977 1.1 christos put_reg (a1, a); 1978 1.1 christos put_reg (r3, b); 1979 1.1 christos 1980 1.1 christos /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */ 1981 1.1 christos 1982 1.1 christos prefix (0, 0, 0); 1983 1.1 christos dc = decode_dest23 (ddd, dd, 4); 1984 1.1 christos sc = decode_cr_b (src, CR_B_DMA0); 1985 1.1 christos a = get_src (sc); 1986 1.1 christos put_dest (dc, a); 1987 1.1 christos 1988 1.1 christos /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */ 1989 1.1 christos 1990 1.1 christos prefix (0, 0, 0); 1991 1.1 christos dc = decode_dest23 (ddd, dd, 2); 1992 1.1 christos sc = decode_cr_b (src, CR_B_DCT0); 1993 1.1 christos a = get_src (sc); 1994 1.1 christos put_dest (dc, a); 1995 1.1 christos 1996 1.1 christos /** 1101 ddd1 dd01 0src STC src,dest */ 1997 1.1 christos 1998 1.1 christos prefix (0, 0, 0); 1999 1.1 christos dc = decode_dest23 (ddd, dd, 4); 2000 1.1 christos sc = decode_cr_b (src, CR_B_INTB); 2001 1.1 christos a = get_src (sc); 2002 1.1 christos put_dest (dc, a); 2003 1.1 christos 2004 1.1 christos /** 1011 0110 1101 0011 STCX abs16,abs24 */ 2005 1.1 christos 2006 1.1 christos NOTYET(); 2007 1.1 christos 2008 1.1 christos /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */ 2009 1.1 christos 2010 1.1 christos prefix (0, 1, 0); 2011 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2012 1.1 christos imm = IMM(w+1); 2013 1.1 christos if (! FLAG_Z) 2014 1.1 christos put_dest (dc, imm); 2015 1.1 christos 2016 1.1 christos /** 1001 ddd w dd00 1111 STZ.size #IMM,dest */ 2017 1.1 christos 2018 1.1 christos prefix (0, 1, 0); 2019 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2020 1.1 christos imm = IMM(w+1); 2021 1.1 christos if (FLAG_Z) 2022 1.1 christos put_dest (dc, imm); 2023 1.1 christos 2024 1.1 christos /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */ 2025 1.1 christos 2026 1.1 christos prefix (0, 1, 0); 2027 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2028 1.1 christos a = IMM(w+1); 2029 1.1 christos b = IMM(w+1); 2030 1.1 christos if (FLAG_Z) 2031 1.1 christos put_dest (dc, a); 2032 1.1 christos else 2033 1.1 christos put_dest (dc, b); 2034 1.1 christos 2035 1.1 christos /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */ 2036 1.1 christos 2037 1.1 christos prefix (0, 1, 0); 2038 1.1 christos dc = decode_dest23(ddd, dd, w+1); 2039 1.1 christos imm = IMM(w+1); 2040 1.1 christos MATH_OP (dc, imm, 0, -); 2041 1.1 christos 2042 1.1 christos /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */ 2043 1.1 christos 2044 1.1 christos prefix (0, 1, 0); 2045 1.1 christos dc = decode_dest23(ddd, dd, 4); 2046 1.1 christos imm = IMM(4); 2047 1.1 christos MATH_OP (dc, imm, 0, -); 2048 1.1 christos 2049 1.1 christos /** 00dd 111w SUB.size:S #IMM,dest */ 2050 1.1 christos 2051 1.1 christos prefix (0, 1, 0); 2052 1.1 christos dc = decode_dest2(dd, w+1); 2053 1.1 christos imm = IMM (w+1); 2054 1.1 christos MATH_OP (dc, imm, 0, -); 2055 1.1 christos 2056 1.1 christos /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */ 2057 1.1 christos 2058 1.1 christos prefix (1, 1, 0); 2059 1.1 christos sc = decode_src23(sss, ss, w+1); 2060 1.1 christos dc = decode_dest23(ddd, dd, w+1); 2061 1.1 christos b = get_src (sc); 2062 1.1 christos MATH_OP (dc, b, 0, -); 2063 1.1 christos 2064 1.1 christos /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */ 2065 1.1 christos 2066 1.1 christos prefix (1, 1, 0); 2067 1.1 christos sc = decode_src23(sss, ss, 4); 2068 1.1 christos dc = decode_dest23(ddd, dd, 4); 2069 1.1 christos b = get_src (sc); 2070 1.1 christos MATH_OP (dc, b, 0, -); 2071 1.1 christos 2072 1.1 christos /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */ 2073 1.1 christos 2074 1.1 christos prefix (0, 1, 0); 2075 1.1 christos dc = decode_dest23(ddd, dd, 4); 2076 1.1 christos imm = sign_ext (IMM(1), 8); 2077 1.1 christos MATH_OP (dc, imm, 0, -); 2078 1.1 christos 2079 1.1 christos /** 1sss ddd0 dd ss 0000 SUBX src,dest */ 2080 1.1 christos 2081 1.1 christos prefix (1, 1, 0); 2082 1.1 christos sc = decode_src23(sss, ss, 1); 2083 1.1 christos dc = decode_dest23(ddd, dd, 4); 2084 1.1 christos b = sign_ext (get_src (sc), 8); 2085 1.1 christos MATH_OP (dc, b, 0, -); 2086 1.1 christos 2087 1.1 christos /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */ 2088 1.1 christos 2089 1.1 christos prefix (0, 0, 0); 2090 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2091 1.1 christos imm = IMM(w+1); 2092 1.1 christos a = get_src (dc); 2093 1.1 christos v = a & imm; 2094 1.1 christos set_sz (v, w+1); 2095 1.1 christos 2096 1.1 christos /** 00dd 110w TST.size:S #IMM,dest */ 2097 1.1 christos 2098 1.1 christos prefix (0, 0, 0); 2099 1.1 christos dc = decode_dest2 (dd, w+1); 2100 1.1 christos imm = IMM(w+1); 2101 1.1 christos a = get_src (dc); 2102 1.1 christos v = a & imm; 2103 1.1 christos set_sz (v, w+1); 2104 1.1 christos 2105 1.1 christos /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */ 2106 1.1 christos 2107 1.1 christos prefix (0, 0, 0); 2108 1.1 christos sc = decode_src23 (sss, ss, w+1); 2109 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2110 1.1 christos b = get_src (sc); 2111 1.1 christos a = get_src (dc); 2112 1.1 christos v = a & b; 2113 1.1 christos set_sz (v, w+1); 2114 1.1 christos 2115 1.1 christos /** 1111 1111 UND */ 2116 1.1 christos 2117 1.1 christos trigger_fixed_interrupt (0xffffdc); 2118 1.1 christos 2119 1.1 christos /** 1011 0010 0000 0011 WAIT */ 2120 1.1 christos 2121 1.1 christos ; 2122 1.1 christos 2123 1.1 christos /** 1101 ddd w dd00 1src XCHG.size src,dest */ 2124 1.1 christos 2125 1.1 christos dc = decode_dest23 (ddd, dd, w+1); 2126 1.1 christos sc = decode_src3 (src, w+1); 2127 1.1 christos a = get_src (dc); 2128 1.1 christos b = get_src (sc); 2129 1.1 christos put_dest (dc, b); 2130 1.1 christos put_dest (sc, a); 2131 1.1 christos 2132 1.1 christos /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */ 2133 1.1 christos 2134 1.1 christos prefix (0, 1, 0); 2135 1.1 christos dc = decode_dest23(ddd, dd, w+1); 2136 1.1 christos imm = IMM(w+1); 2137 1.1 christos LOGIC_OP (dc, imm, ^); 2138 1.1 christos 2139 1.1 christos /** 1sss ddd w dd ss 1001 XOR.size src,dest */ 2140 1.1 christos 2141 1.1 christos prefix (1, 1, 0); 2142 1.1 christos sc = decode_src23(sss, ss, w+1); 2143 1.1 christos dc = decode_dest23(ddd, dd, w+1); 2144 1.1 christos b = get_src (sc); 2145 1.1 christos LOGIC_OP (dc, b, ^); 2146 1.1 christos 2147 1.1 christos /** */ 2148 1.1 christos 2149 1.1 christos return step_result; 2150 1.1 christos } 2151