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