12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2009-2011 STMicroelectronics. All rights reserved.
32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2008 Apple Inc. All rights reserved.
42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Redistribution and use in source and binary forms, with or without
62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * modification, are permitted provided that the following conditions
72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * are met:
82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 1. Redistributions of source code must retain the above copyright
92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer.
102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    documentation and/or other materials provided with the distribution.
132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef SH4Assembler_h
282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define SH4Assembler_h
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(ASSEMBLER) && CPU(SH4)
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "AssemblerBuffer.h"
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "AssemblerBufferWithConstantPool.h"
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <stdarg.h>
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <stdint.h>
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/Assertions.h>
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/Vector.h>
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef NDEBUG
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define SH4_ASSEMBLER_TRACING
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace JSC {
442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochtypedef uint16_t SH4Word;
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochenum {
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    INVALID_OPCODE = 0xffff,
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ADD_OPCODE = 0x300c,
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ADDIMM_OPCODE = 0x7000,
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ADDC_OPCODE = 0x300e,
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ADDV_OPCODE = 0x300f,
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    AND_OPCODE = 0x2009,
532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ANDIMM_OPCODE = 0xc900,
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DIV0_OPCODE = 0x2007,
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DIV1_OPCODE = 0x3004,
562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BF_OPCODE = 0x8b00,
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BFS_OPCODE = 0x8f00,
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BRA_OPCODE = 0xa000,
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BRAF_OPCODE = 0x0023,
602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NOP_OPCODE = 0x0009,
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BSR_OPCODE = 0xb000,
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RTS_OPCODE = 0x000b,
632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BT_OPCODE = 0x8900,
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BTS_OPCODE = 0x8d00,
652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BSRF_OPCODE = 0x0003,
662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BRK_OPCODE = 0x003b,
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FTRC_OPCODE = 0xf03d,
682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPEQ_OPCODE = 0x3000,
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPEQIMM_OPCODE = 0x8800,
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPGE_OPCODE = 0x3003,
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPGT_OPCODE = 0x3007,
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPHI_OPCODE = 0x3006,
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPHS_OPCODE = 0x3002,
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPPL_OPCODE = 0x4015,
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPPZ_OPCODE = 0x4011,
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CMPSTR_OPCODE = 0x200c,
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DT_OPCODE = 0x4010,
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FCMPEQ_OPCODE = 0xf004,
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FCMPGT_OPCODE = 0xf005,
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOV_OPCODE = 0xf00c,
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FADD_OPCODE = 0xf000,
822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMUL_OPCODE = 0xf002,
832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FSUB_OPCODE = 0xf001,
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FDIV_OPCODE = 0xf003,
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FNEG_OPCODE = 0xf04d,
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JMP_OPCODE = 0x402b,
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSR_OPCODE = 0x400b,
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LDSPR_OPCODE = 0x402a,
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LDSLPR_OPCODE = 0x4026,
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOV_OPCODE = 0x6003,
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVIMM_OPCODE = 0xe000,
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_WRITE_RN_OPCODE = 0x2000,
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_WRITE_RNDEC_OPCODE = 0x2004,
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_WRITE_R0RN_OPCODE = 0x0004,
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_WRITE_OFFGBR_OPCODE = 0xc000,
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_WRITE_OFFRN_OPCODE = 0x8000,
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_READ_RM_OPCODE = 0x6000,
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_READ_RMINC_OPCODE = 0x6004,
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_READ_R0RM_OPCODE = 0x000c,
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_READ_OFFGBR_OPCODE = 0xc400,
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVB_READ_OFFRM_OPCODE = 0x8400,
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_WRITE_RN_OPCODE = 0x2002,
1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_WRITE_RNDEC_OPCODE = 0x2006,
1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_WRITE_R0RN_OPCODE = 0x0006,
1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_WRITE_OFFGBR_OPCODE = 0xc200,
1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_WRITE_OFFRN_OPCODE = 0x1000,
1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_RM_OPCODE = 0x6002,
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_RMINC_OPCODE = 0x6006,
1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_R0RM_OPCODE = 0x000e,
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_OFFGBR_OPCODE = 0xc600,
1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_OFFPC_OPCODE = 0xd000,
1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVL_READ_OFFRM_OPCODE = 0x5000,
1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVW_WRITE_RN_OPCODE = 0x2001,
1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVW_READ_RM_OPCODE = 0x6001,
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVW_READ_R0RM_OPCODE = 0x000d,
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVW_READ_OFFRM_OPCODE = 0x8500,
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVW_READ_OFFPC_OPCODE = 0x9000,
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVA_READ_OFFPC_OPCODE = 0xc700,
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MOVT_OPCODE = 0x0029,
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MULL_OPCODE = 0x0007,
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DMULL_L_OPCODE = 0x3005,
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STSMACL_OPCODE = 0x001a,
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STSMACH_OPCODE = 0x000a,
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DMULSL_OPCODE = 0x300d,
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NEG_OPCODE = 0x600b,
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NEGC_OPCODE = 0x600a,
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NOT_OPCODE = 0x6007,
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OR_OPCODE = 0x200b,
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ORIMM_OPCODE = 0xcb00,
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ORBIMM_OPCODE = 0xcf00,
1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SETS_OPCODE = 0x0058,
1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SETT_OPCODE = 0x0018,
1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHAD_OPCODE = 0x400c,
1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHAL_OPCODE = 0x4020,
1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHAR_OPCODE = 0x4021,
1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLD_OPCODE = 0x400d,
1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLL_OPCODE = 0x4000,
1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLL2_OPCODE = 0x4008,
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLL8_OPCODE = 0x4018,
1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLL16_OPCODE = 0x4028,
1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLR_OPCODE = 0x4001,
1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLR2_OPCODE = 0x4009,
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLR8_OPCODE = 0x4019,
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SHLR16_OPCODE = 0x4029,
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STSPR_OPCODE = 0x002a,
1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STSLPR_OPCODE = 0x4022,
1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FLOAT_OPCODE = 0xf02d,
1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SUB_OPCODE = 0x3008,
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SUBC_OPCODE = 0x300a,
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SUBV_OPCODE = 0x300b,
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    TST_OPCODE = 0x2008,
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    TSTIMM_OPCODE = 0xc800,
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    TSTB_OPCODE = 0xcc00,
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    EXTUW_OPCODE = 0x600d,
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    XOR_OPCODE = 0x200a,
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    XORIMM_OPCODE = 0xca00,
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    XORB_OPCODE = 0xce00,
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_READ_RM_INC_OPCODE = 0xf009,
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_READ_RM_OPCODE = 0xf008,
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_READ_R0RM_OPCODE = 0xf006,
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_WRITE_RN_OPCODE = 0xf00a,
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_WRITE_RN_DEC_OPCODE = 0xf00b,
1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FMOVS_WRITE_R0RN_OPCODE = 0xf007,
1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FCNVDS_DRM_FPUL_OPCODE = 0xf0bd,
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LDS_RM_FPUL_OPCODE = 0x405a,
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FLDS_FRM_FPUL_OPCODE = 0xf01d,
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STS_FPUL_RN_OPCODE = 0x005a,
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FSTS_FPUL_FRN_OPCODE = 0xF00d,
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LDSFPSCR_OPCODE = 0x406a,
1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    STSFPSCR_OPCODE = 0x006a,
1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LDSRMFPUL_OPCODE = 0x405a,
1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FSTSFPULFRN_OPCODE = 0xf00d,
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FSQRT_OPCODE = 0xf06d,
1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FSCHG_OPCODE = 0xf3fd,
1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    CLRT_OPCODE = 8,
1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace SH4Registers {
1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochtypedef enum {
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r0,
1812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r1,
1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r2,
1832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r3,
1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r4,
1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r5,
1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r6,
1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r7,
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r8,
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r9,
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r10,
1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r11,
1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r12,
1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r13,
1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r14, fp = r14,
1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    r15, sp = r15,
1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    pc,
1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    pr,
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} RegisterID;
1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochtypedef enum {
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr0, dr0 = fr0,
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr1,
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr2, dr2 = fr2,
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr3,
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr4, dr4 = fr4,
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr5,
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr6, dr6 = fr6,
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr7,
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr8, dr8 = fr8,
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr9,
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr10, dr10 = fr10,
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr11,
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr12, dr12 = fr12,
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr13,
2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr14, dr14 = fr14,
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    fr15,
2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} FPRegisterID;
2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup1(uint16_t opc, int rm, int rn)
2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 8) | ((rn & 0xf) << 4));
2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup2(uint16_t opc, int rm)
2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 8));
2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup3(uint16_t opc, int rm, int rn)
2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 8) | (rn & 0xff));
2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup4(uint16_t opc, int rm, int rn, int offset)
2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 8) | ((rn & 0xf) << 4) | (offset & 0xf));
2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup5(uint16_t opc, int rm)
2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | (rm & 0xff));
2432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup6(uint16_t opc, int rm)
2462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | (rm & 0xfff));
2482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup7(uint16_t opc, int rm)
2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0x7) << 9));
2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup8(uint16_t opc, int rm, int rn)
2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0x7) << 9) | ((rn & 0x7) << 5));
2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup9(uint16_t opc, int rm, int rn)
2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 8) | ((rn & 0x7) << 5));
2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup10(uint16_t opc, int rm, int rn)
2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0x7) << 9) | ((rn & 0xf) << 4));
2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getOpcodeGroup11(uint16_t opc, int rm, int rn)
2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (opc | ((rm & 0xf) << 4) | (rn & 0xf));
2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getRn(uint16_t x)
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return ((x & 0xf00) >> 8);
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getRm(uint16_t x)
2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return ((x & 0xf0) >> 4);
2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getDisp(uint16_t x)
2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (x & 0xf);
2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getImm8(uint16_t x)
2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (x & 0xff);
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getImm12(uint16_t x)
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (x & 0xfff);
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getDRn(uint16_t x)
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return ((x & 0xe00) >> 9);
3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline uint16_t getDRm(uint16_t x)
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return ((x & 0xe0) >> 5);
3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass SH4Assembler {
3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochpublic:
3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    typedef SH4Registers::RegisterID RegisterID;
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    typedef SH4Registers::FPRegisterID FPRegisterID;
3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    typedef AssemblerBufferWithConstantPool<512, 4, 2, SH4Assembler> SH4Buffer;
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static const RegisterID scratchReg1 = SH4Registers::r3;
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static const RegisterID scratchReg2 = SH4Registers::r11;
3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static const uint32_t maxInstructionSize = 16;
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    enum {
3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        padForAlign8 = 0x00,
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        padForAlign16 = 0x0009,
3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        padForAlign32 = 0x00090009,
3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    };
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SH4Assembler()
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_claimscratchReg = 0x0;
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // SH4 condition codes
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    typedef enum {
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        EQ = 0x0, // Equal
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        NE = 0x1, // Not Equal
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        HS = 0x2, // Unsigend Greater Than equal
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        HI = 0x3, // Unsigend Greater Than
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LS = 0x4, // Unsigend Lower or Same
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LI = 0x5, // Unsigend Lower
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        GE = 0x6, // Greater or Equal
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LT = 0x7, // Less Than
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        GT = 0x8, // Greater Than
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LE = 0x9, // Less or Equal
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        OF = 0xa, // OverFlow
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        SI = 0xb, // Signed
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        EQU= 0xc, // Equal or unordered(NaN)
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        NEU= 0xd,
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        GTU= 0xe,
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        GEU= 0xf,
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LTU= 0x10,
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        LEU= 0x11,
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    } Condition;
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Opaque label types
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochpublic:
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    class JmpSrc {
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        friend class SH4Assembler;
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    public:
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JmpSrc()
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : m_offset(-1)
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    private:
3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JmpSrc(int offset)
3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : m_offset(offset)
3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_offset;
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    };
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    class JmpDst {
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        friend class SH4Assembler;
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    public:
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JmpDst()
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : m_offset(-1)
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_used(false)
3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool isUsed() const { return m_used; }
3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool isSet() const { return (m_offset != -1); }
3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void used() { m_used = true; }
3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    private:
3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JmpDst(int offset)
3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : m_offset(offset)
3872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_used(false)
3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT(m_offset == offset);
3902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_offset : 31;
3932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_used : 1;
3942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    };
3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool isImmediate(int constant)
3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return ((constant <= 127) && (constant >= -128));
3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RegisterID claimScratch()
4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((m_claimscratchReg != 0x3));
4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!(m_claimscratchReg & 0x1)) {
4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_claimscratchReg = (m_claimscratchReg | 0x1);
4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return scratchReg1;
4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
4092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_claimscratchReg = (m_claimscratchReg | 0x2);
4112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return scratchReg2;
4122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void releaseScratch(RegisterID scratchR)
4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (scratchR == scratchReg1)
4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_claimscratchReg = (m_claimscratchReg & 0x2);
4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_claimscratchReg = (m_claimscratchReg & 0x1);
4202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Stack operations
4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void pushReg(RegisterID reg)
4252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (reg == SH4Registers::pr) {
4272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(STSLPR_OPCODE, SH4Registers::sp));
4282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
4292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
4302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(getOpcodeGroup1(MOVL_WRITE_RNDEC_OPCODE, SH4Registers::sp, reg));
4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void popReg(RegisterID reg)
4352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (reg == SH4Registers::pr) {
4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(LDSLPR_OPCODE, SH4Registers::sp));
4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
4392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(getOpcodeGroup1(MOVL_READ_RMINC_OPCODE, reg, SH4Registers::sp));
4422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movt(RegisterID dst)
4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(MOVT_OPCODE, dst);
4472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Arithmetic operations
4512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void addlRegReg(RegisterID src, RegisterID dst)
4532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(ADD_OPCODE, dst, src);
4552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void addclRegReg(RegisterID src, RegisterID dst)
4592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(ADDC_OPCODE, dst, src);
4612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void addvlRegReg(RegisterID src, RegisterID dst)
4652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(ADDV_OPCODE, dst, src);
4672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void addlImm8r(int imm8, RegisterID dst)
4712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 127) && (imm8 >= -128));
4732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(ADDIMM_OPCODE, dst, imm8);
4752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void andlRegReg(RegisterID src, RegisterID dst)
4792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(AND_OPCODE, dst, src);
4812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void andlImm8r(int imm8, RegisterID dst)
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 255) && (imm8 >= 0));
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(dst == SH4Registers::r0);
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup5(ANDIMM_OPCODE, imm8);
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void div1lRegReg(RegisterID src, RegisterID dst)
4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(DIV1_OPCODE, dst, src);
4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void div0lRegReg(RegisterID src, RegisterID dst)
5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(DIV0_OPCODE, dst, src);
5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void notlReg(RegisterID src, RegisterID dst)
5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(NOT_OPCODE, dst, src);
5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void orlRegReg(RegisterID src, RegisterID dst)
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(OR_OPCODE, dst, src);
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void orlImm8r(int imm8, RegisterID dst)
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 255) && (imm8 >= 0));
5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(dst == SH4Registers::r0);
5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup5(ORIMM_OPCODE, imm8);
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void sublRegReg(RegisterID src, RegisterID dst)
5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         uint16_t opc = getOpcodeGroup1(SUB_OPCODE, dst, src);
5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         oneShortOp(opc);
5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void subvlRegReg(RegisterID src, RegisterID dst)
5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         uint16_t opc = getOpcodeGroup1(SUBV_OPCODE, dst, src);
5352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         oneShortOp(opc);
5362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void xorlRegReg(RegisterID src, RegisterID dst)
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(XOR_OPCODE, dst, src);
5412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void xorlImm8r(int imm8, RegisterID dst)
5452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 255) && (imm8 >= 0));
5472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(dst == SH4Registers::r0);
5482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup5(XORIMM_OPCODE, imm8);
5502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void shllImm8r(int imm, RegisterID dst)
5542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (imm) {
5562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 1:
5572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLL_OPCODE, dst));
5582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
5592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 2:
5602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLL2_OPCODE, dst));
5612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
5622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 8:
5632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLL8_OPCODE, dst));
5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
5652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 16:
5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLL16_OPCODE, dst));
5672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
5682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        default:
5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT_NOT_REACHED();
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
5712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void neg(RegisterID dst, RegisterID src)
5742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(NEG_OPCODE, dst, src);
5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void shllRegReg(RegisterID dst, RegisterID rShift)
5802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(SHLD_OPCODE, dst, rShift);
5822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
5832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void shlrRegReg(RegisterID dst, RegisterID rShift)
5862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        neg(rShift, rShift);
5882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        shllRegReg(dst, rShift);
5892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void sharRegReg(RegisterID dst, RegisterID rShift)
5922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        neg(rShift, rShift);
5942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        shaRegReg(dst, rShift);
5952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void shaRegReg(RegisterID dst, RegisterID rShift)
5982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(SHAD_OPCODE, dst, rShift);
6002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void shlrImm8r(int imm, RegisterID dst)
6042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (imm) {
6062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 1:
6072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLR_OPCODE, dst));
6082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 2:
6102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLR2_OPCODE, dst));
6112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 8:
6132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLR8_OPCODE, dst));
6142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case 16:
6162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(SHLR16_OPCODE, dst));
6172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        default:
6192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT_NOT_REACHED();
6202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
6212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void imullRegReg(RegisterID src, RegisterID dst)
6242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MULL_OPCODE, dst, src);
6262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dmullRegReg(RegisterID src, RegisterID dst)
6302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(DMULL_L_OPCODE, dst, src);
6322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dmulslRegReg(RegisterID src, RegisterID dst)
6362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(DMULSL_OPCODE, dst, src);
6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void stsmacl(RegisterID reg)
6422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(STSMACL_OPCODE, reg);
6442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void stsmach(RegisterID reg)
6482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(STSMACH_OPCODE, reg);
6502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Comparisons
6542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void cmplRegReg(RegisterID left, RegisterID right, Condition cond)
6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (cond) {
6582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case NE:
6592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPEQ_OPCODE, right, left));
6602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case GT:
6622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPGT_OPCODE, right, left));
6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case EQ:
6652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPEQ_OPCODE, right, left));
6662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case GE:
6682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPGE_OPCODE, right, left));
6692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case HS:
6712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPHS_OPCODE, right, left));
6722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case HI:
6742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPHI_OPCODE, right, left));
6752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LI:
6772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPHI_OPCODE, left, right));
6782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LS:
6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPHS_OPCODE, left, right));
6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LE:
6832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPGE_OPCODE, left, right));
6842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LT:
6862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(CMPGT_OPCODE, left, right));
6872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
6882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        default:
6892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT_NOT_REACHED();
6902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
6912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void cmppl(RegisterID reg)
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(CMPPL_OPCODE, reg);
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void cmppz(RegisterID reg)
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(CMPPZ_OPCODE, reg);
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
7032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void cmpEqImmR0(int imm, RegisterID dst, Condition cond)
7062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup5(CMPEQIMM_OPCODE, imm);
7082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
7092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void testlRegReg(RegisterID src, RegisterID dst)
7122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(TST_OPCODE, dst, src);
7142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
7152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void testlImm8r(int imm, RegisterID dst)
7182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((dst == SH4Registers::r0) && (imm <= 255) && (imm >= 0));
7202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup5(TSTIMM_OPCODE, imm);
7222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
7232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void nop()
7262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(NOP_OPCODE, false);
7282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void sett()
7312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(SETT_OPCODE);
7332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void clrt()
7362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(CLRT_OPCODE);
7382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fschg()
7412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(FSCHG_OPCODE);
7432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void bkpt()
7462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(BRK_OPCODE, false);
7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void branch(uint16_t opc, int label)
7512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc) {
7532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BT_OPCODE:
7542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT((label <= 127) && (label >= -128));
7552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup5(BT_OPCODE, label));
7562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BRA_OPCODE:
7582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT((label <= 2047) && (label >= -2048));
7592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup6(BRA_OPCODE, label));
7602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BF_OPCODE:
7622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT((label <= 127) && (label >= -128));
7632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup5(BF_OPCODE, label));
7642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        default:
7662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT_NOT_REACHED();
7672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
7682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void branch(uint16_t opc, RegisterID reg)
7712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc) {
7732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BRAF_OPCODE:
7742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(BRAF_OPCODE, reg));
7752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case JMP_OPCODE:
7772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(JMP_OPCODE, reg));
7782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case JSR_OPCODE:
7802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(JSR_OPCODE, reg));
7812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BSRF_OPCODE:
7832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup2(BSRF_OPCODE, reg));
7842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
7852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        default:
7862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT_NOT_REACHED();
7872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
7882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ldspr(RegisterID reg)
7912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(LDSPR_OPCODE, reg);
7932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
7942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void stspr(RegisterID reg)
7972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(STSPR_OPCODE, reg);
7992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void extuw(RegisterID src, RegisterID dst)
8032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(EXTUW_OPCODE, dst, src);
8052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // float operations
8092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ldsrmfpul(RegisterID src)
8112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(LDS_RM_FPUL_OPCODE, src);
8132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fneg(FPRegisterID dst)
8172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FNEG_OPCODE, dst);
8192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fsqrt(FPRegisterID dst)
8232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FSQRT_OPCODE, dst);
8252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void stsfpulReg(RegisterID src)
8292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(STS_FPUL_RN_OPCODE, src);
8312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void floatfpulfrn(RegisterID src)
8352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FLOAT_OPCODE, src);
8372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmull(FPRegisterID src, FPRegisterID dst)
8412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMUL_OPCODE, dst, src);
8432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsReadrm(RegisterID src, FPRegisterID dst)
8472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_READ_RM_OPCODE, dst, src);
8492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsWriterm(FPRegisterID src, RegisterID dst)
8532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_RN_OPCODE, dst, src);
8552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsWriter0r(FPRegisterID src, RegisterID dst)
8592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_R0RN_OPCODE, dst, src);
8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsReadr0r(RegisterID src, FPRegisterID dst)
8652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_READ_R0RM_OPCODE, dst, src);
8672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsReadrminc(RegisterID src, FPRegisterID dst)
8712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_READ_RM_INC_OPCODE, dst, src);
8732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovsWriterndec(FPRegisterID src, RegisterID dst)
8772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_RN_DEC_OPCODE, dst, src);
8792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ftrcRegfpul(FPRegisterID src)
8832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FTRC_OPCODE, src);
8852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc, true, false);
8862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fldsfpul(RegisterID src)
8892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FLDS_FRM_FPUL_OPCODE, src);
8912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fstsfpul(RegisterID src)
8952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
8962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(FSTS_FPUL_FRN_OPCODE, src);
8972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
8982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
8992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ldsfpscr(RegisterID reg)
9012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(LDSFPSCR_OPCODE, reg);
9032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void stsfpscr(RegisterID reg)
9072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup2(STSFPSCR_OPCODE, reg);
9092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // double operations
9132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dcnvds(FPRegisterID src)
9152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup7(FCNVDS_DRM_FPUL_OPCODE, src >> 1);
9172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dcmppeq(FPRegisterID src, FPRegisterID dst)
9212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FCMPEQ_OPCODE, dst >> 1, src >> 1);
9232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dcmppgt(FPRegisterID src, FPRegisterID dst)
9272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FCMPGT_OPCODE, dst >> 1, src >> 1);
9292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dmulRegReg(FPRegisterID src, FPRegisterID dst)
9332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FMUL_OPCODE, dst >> 1, src >> 1);
9352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dsubRegReg(FPRegisterID src, FPRegisterID dst)
9392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FSUB_OPCODE, dst >> 1, src >> 1);
9412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void daddRegReg(FPRegisterID src, FPRegisterID dst)
9452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FADD_OPCODE, dst >> 1, src >> 1);
9472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dmovRegReg(FPRegisterID src, FPRegisterID dst)
9512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FMOV_OPCODE, dst >> 1, src >> 1);
9532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ddivRegReg(FPRegisterID src, FPRegisterID dst)
9572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup8(FDIV_OPCODE, dst >> 1, src >> 1);
9592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dsqrt(FPRegisterID dst)
9632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup7(FSQRT_OPCODE, dst >> 1);
9652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void dneg(FPRegisterID dst)
9692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup7(FNEG_OPCODE, dst >> 1);
9712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovReadrm(RegisterID src, FPRegisterID dst)
9752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup10(FMOVS_READ_RM_OPCODE, dst >> 1, src);
9772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovWriterm(FPRegisterID src, RegisterID dst)
9812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_RN_OPCODE, dst, src >> 1);
9832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovWriter0r(FPRegisterID src, RegisterID dst)
9872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_R0RN_OPCODE, dst, src >> 1);
9892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovReadr0r(RegisterID src, FPRegisterID dst)
9932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup10(FMOVS_READ_R0RM_OPCODE, dst >> 1, src);
9952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
9962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
9972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovReadrminc(RegisterID src, FPRegisterID dst)
9992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup10(FMOVS_READ_RM_INC_OPCODE, dst >> 1, src);
10012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void fmovWriterndec(FPRegisterID src, RegisterID dst)
10052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_RN_DEC_OPCODE, dst, src >> 1);
10072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void floatfpulDreg(FPRegisterID src)
10112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup7(FLOAT_OPCODE, src >> 1);
10132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ftrcdrmfpul(FPRegisterID src)
10172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup7(FTRC_OPCODE, src >> 1);
10192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Various move ops
10232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movImm8(int imm8, RegisterID dst)
10252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 127) && (imm8 >= -128));
10272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, imm8);
10292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlRegReg(RegisterID src, RegisterID dst)
10332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOV_OPCODE, dst, src);
10352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movwRegMem(RegisterID src, RegisterID dst)
10392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVW_WRITE_RN_OPCODE, dst, src);
10412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movwMemReg(RegisterID src, RegisterID dst)
10452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVW_READ_RM_OPCODE, dst, src);
10472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movwPCReg(int offset, RegisterID base, RegisterID dst)
10512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(base == SH4Registers::pc);
10532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((offset <= 255) && (offset >= 0));
10542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(MOVW_READ_OFFPC_OPCODE, dst, offset);
10562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movwMemReg(int offset, RegisterID base, RegisterID dst)
10602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(dst == SH4Registers::r0);
10622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup11(MOVW_READ_OFFRM_OPCODE, base, offset);
10642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movwR0mr(RegisterID src, RegisterID dst)
10682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVW_READ_R0RM_OPCODE, dst, src);
10702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlRegMem(RegisterID src, int offset, RegisterID base)
10742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((offset <= 15) && (offset >= 0));
10762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!offset) {
10782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(MOVL_WRITE_RN_OPCODE, base, src));
10792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
10802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
10812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(getOpcodeGroup4(MOVL_WRITE_OFFRN_OPCODE, base, src, offset));
10832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlRegMem(RegisterID src, RegisterID base)
10862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVL_WRITE_RN_OPCODE, base, src);
10882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
10892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
10902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlMemReg(int offset, RegisterID base, RegisterID dst)
10922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
10932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (base == SH4Registers::pc) {
10942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            ASSERT((offset <= 255) && (offset >= 0));
10952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup3(MOVL_READ_OFFPC_OPCODE, dst, offset));
10962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
10972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
10982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((offset <= 15) && (offset >= 0));
11002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!offset) {
11012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            oneShortOp(getOpcodeGroup1(MOVL_READ_RM_OPCODE, dst, base));
11022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
11032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
11042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(getOpcodeGroup4(MOVL_READ_OFFRM_OPCODE, dst, base, offset));
11062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movbMemReg(int offset, RegisterID base, RegisterID dst)
11092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(dst == SH4Registers::r0);
11112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup11(MOVB_READ_OFFRM_OPCODE, base, offset);
11132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movbR0mr(RegisterID src, RegisterID dst)
11172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVB_READ_R0RM_OPCODE, dst, src);
11192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movbMemReg(RegisterID src, RegisterID dst)
11232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVB_READ_RM_OPCODE, dst, src);
11252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlMemReg(RegisterID base, RegisterID dst)
11292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVL_READ_RM_OPCODE, dst, base);
11312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlMemRegIn(RegisterID base, RegisterID dst)
11352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVL_READ_RMINC_OPCODE, dst, base);
11372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlR0mr(RegisterID src, RegisterID dst)
11412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVL_READ_R0RM_OPCODE, dst, src);
11432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlRegMemr0(RegisterID src, RegisterID dst)
11472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup1(MOVL_WRITE_R0RN_OPCODE, dst, src);
11492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void movlImm8r(int imm8, RegisterID dst)
11532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((imm8 <= 127) && (imm8 >= -128));
11552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, imm8);
11572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(opc);
11582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void loadConstant(uint32_t constant, RegisterID dst)
11612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (((int)constant <= 0x7f) && ((int)constant >= -0x80)) {
11632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            movImm8(constant, dst);
11642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
11652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
11662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, 0);
11682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize, sizeof(uint32_t));
11702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(getOpcodeGroup3(MOVIMM_OPCODE, dst, constant), m_buffer.uncheckedSize());
11712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.putShortWithConstantInt(opc, constant, true);
11722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void loadConstantUnReusable(uint32_t constant, RegisterID dst, bool ensureSpace = false)
11752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, 0);
11772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (ensureSpace)
11792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_buffer.ensureSpace(maxInstructionSize, sizeof(uint32_t));
11802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(getOpcodeGroup3(MOVIMM_OPCODE, dst, constant), m_buffer.uncheckedSize());
11822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.putShortWithConstantInt(opc, constant);
11832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Flow control
11862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc call()
11882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
11892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        RegisterID scr = claimScratch();
11902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 4, sizeof(uint32_t));
11912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        loadConstantUnReusable(0x0, scr);
11922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(JSR_OPCODE, scr);
11932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        nop();
11942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        releaseScratch(scr);
11952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_buffer.uncheckedSize());
11962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc call(RegisterID dst)
11992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 2);
12012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(JSR_OPCODE, dst);
12022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        nop();
12032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_buffer.uncheckedSize());
12042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc jmp()
12072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        RegisterID scr = claimScratch();
12092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 4, sizeof(uint32_t));
12102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_size = m_buffer.uncheckedSize();
12112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        loadConstantUnReusable(0x0, scr);
12122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(BRAF_OPCODE, scr);
12132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        nop();
12142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        releaseScratch(scr);
12152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_size);
12162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc jmp(RegisterID dst)
12192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        jmpReg(dst);
12212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_buffer.uncheckedSize());
12222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void jmpReg(RegisterID dst)
12252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 2);
12272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(JMP_OPCODE, dst);
12282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        nop();
12292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc jne()
12322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_size = m_buffer.uncheckedSize();
12342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(BF_OPCODE, 0);
12352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_size);
12362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpSrc je()
12392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int m_size = m_buffer.uncheckedSize();
12412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        branch(BT_OPCODE, 0);
12422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpSrc(m_size);
12432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ret()
12462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 2);
12482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        oneShortOp(RTS_OPCODE, false);
12492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpDst label()
12522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return JmpDst(m_buffer.size());
12542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int sizeOfConstantPool()
12572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         return m_buffer.sizeOfConstantPool();
12592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JmpDst align(int alignment)
12622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(maxInstructionSize + 2);
12642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        while (!m_buffer.isAligned(alignment)) {
12652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            nop();
12662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_buffer.ensureSpace(maxInstructionSize + 2);
12672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
12682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return label();
12692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void changePCrelativeAddress(int offset, uint16_t* instructionPtr, uint32_t newAddress)
12722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint32_t address = (offset << 2) + ((reinterpret_cast<uint32_t>(instructionPtr) + 4) &(~0x3));
12742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        *reinterpret_cast<uint32_t*>(address) = newAddress;
12752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static uint16_t* getInstructionPtr(void* code, int offset)
12782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return reinterpret_cast<uint16_t*> (reinterpret_cast<uint32_t>(code) + offset);
12802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
12812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void linkJump(void* code, JmpSrc from, void* to)
12832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
12842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(from.m_offset != -1);
12852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = getInstructionPtr(code, from.m_offset);
12872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t instruction = *instructionPtr;
12882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int offsetBits = (reinterpret_cast<uint32_t>(to) - reinterpret_cast<uint32_t>(code)) - from.m_offset;
12892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (((instruction & 0xff00) == BT_OPCODE) || ((instruction & 0xff00) == BF_OPCODE)) {
12912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            /* BT label ==> BF 2
12922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop          LDR reg
12932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop          braf @reg
12942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop          nop
12952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            */
12962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            offsetBits -= 8;
12972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instruction ^= 0x0202;
12982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr++ = instruction;
12992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits);
13002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00));
13012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = instruction;
13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr - 2, from.m_offset, 3);
13032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
13042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         }
13052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         /* MOV #imm, reg => LDR reg
13072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            braf @reg        braf @reg
13082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            nop              nop
13092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch         */
13102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE);
13112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        offsetBits -= 4;
13132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (offsetBits >= -4096 && offsetBits <= 4094) {
13142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1);
13152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *(++instructionPtr) = NOP_OPCODE;
13162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr - 1, from.m_offset, 2);
13172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
13182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
13192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2);
13212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(*instructionPtr, from.m_offset + 2);
13222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void linkCall(void* code, JmpSrc from, void* to)
13252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = getInstructionPtr(code, from.m_offset);
13272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instructionPtr -= 3;
13282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast<uint32_t>(to));
13292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void linkPointer(void* code, JmpDst where, void* value)
13322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = getInstructionPtr(code, where.m_offset);
13342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast<uint32_t>(value));
13352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static unsigned getCallReturnOffset(JmpSrc call)
13382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(call.m_offset >= 0);
13402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return call.m_offset;
13412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static uint32_t* getLdrImmAddressOnPool(SH4Word* insn, uint32_t* constPool)
13442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return (constPool + (*insn & 0xff));
13462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static SH4Word patchConstantPoolLoad(SH4Word load, int value)
13492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return ((load & ~0xff) | value);
13512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static SH4Buffer::TwoShorts placeConstantPoolBarrier(int offset)
13542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(((offset >> 1) <=2047) && ((offset >> 1) >= -2048));
13562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        SH4Buffer::TwoShorts m_barrier;
13582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_barrier.high = (BRA_OPCODE | (offset >> 1));
13592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_barrier.low = NOP_OPCODE;
13602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(((BRA_OPCODE | (offset >> 1))), 0);
13612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(NOP_OPCODE, 0);
13622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return m_barrier;
13632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void patchConstantPoolLoad(void* loadAddr, void* constPoolAddr)
13662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        SH4Word* instructionPtr = reinterpret_cast<SH4Word*>(loadAddr);
13682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        SH4Word instruction = *instructionPtr;
13692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        SH4Word index = instruction & 0xff;
13702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if ((instruction & 0xf000) != MOVIMM_OPCODE)
13722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
13732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((((reinterpret_cast<uint32_t>(constPoolAddr) - reinterpret_cast<uint32_t>(loadAddr)) + index * 4)) < 1024);
13752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int offset = reinterpret_cast<uint32_t>(constPoolAddr) + (index * 4) - ((reinterpret_cast<uint32_t>(instructionPtr) & ~0x03) + 4);
13772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instruction &=0xf00;
13782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instruction |= 0xd000;
13792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        offset &= 0x03ff;
13802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instruction |= (offset >> 2);
13812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        *instructionPtr = instruction;
13822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(instruction, reinterpret_cast<uint32_t>(loadAddr));
13832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void repatchPointer(void* where, void* value)
13862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        patchPointer(where, value);
13882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void repatchInt32(void* where, int32_t value)
13912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = reinterpret_cast<uint16_t*>(where);
13932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, value);
13942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void relinkCall(void* from, void* to)
13972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
13982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = reinterpret_cast<uint16_t*>(from);
13992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instructionPtr -= 3;
14002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast<uint32_t>(to));
14012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
14022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void relinkJump(void* from, void* to)
14042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
14052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = reinterpret_cast<uint16_t*> (from);
14062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t instruction = *instructionPtr;
14072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int32_t offsetBits = (reinterpret_cast<uint32_t>(to) - reinterpret_cast<uint32_t>(from));
14082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (((*instructionPtr & 0xff00) == BT_OPCODE) || ((*instructionPtr & 0xff00) == BF_OPCODE)) {
14102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            offsetBits -= 8;
14112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instructionPtr++;
14122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits);
14132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00));
14142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = instruction;
14152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr, reinterpret_cast<uint32_t>(from) + 1, 3);
14162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
14172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
14182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE);
14202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        offsetBits -= 4;
14212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (offsetBits >= -4096 && offsetBits <= 4094) {
14222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1);
14232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *(++instructionPtr) = NOP_OPCODE;
14242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr - 2, reinterpret_cast<uint32_t>(from), 2);
14252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
14262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
14272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2);
14292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(*instructionPtr, reinterpret_cast<uint32_t>(from));
14302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
14312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Linking & patching
14332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void linkJump(JmpSrc from, JmpDst to)
14352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
14362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(to.m_offset != -1);
14372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(from.m_offset != -1);
14382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t* instructionPtr = getInstructionPtr(data(), from.m_offset);
14402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        uint16_t instruction = *instructionPtr;
14412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int offsetBits;
14422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (((instruction & 0xff00) == BT_OPCODE) || ((instruction & 0xff00) == BF_OPCODE)) {
14442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            /* BT label => BF 2
14452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop        LDR reg
14462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop        braf @reg
14472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch               nop        nop
14482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            */
14492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            offsetBits = (to.m_offset - from.m_offset) - 8;
14502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instruction ^= 0x0202;
14512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr++ = instruction;
14522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if ((*instructionPtr & 0xf000) == 0xe000) {
14532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                uint32_t* addr = getLdrImmAddressOnPool(instructionPtr, m_buffer.poolAddress());
14542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                *addr = offsetBits;
14552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            } else
14562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits);
14572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00));
14582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = instruction;
14592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr - 2, from.m_offset, 3);
14602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
14612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
14622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        /* MOV # imm, reg => LDR reg
14642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch           braf @reg         braf @reg
14652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch           nop               nop
14662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        */
14672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE);
14682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        offsetBits = (to.m_offset - from.m_offset) - 4;
14692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (offsetBits >= -4096 && offsetBits <= 4094) {
14702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1);
14712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *(++instructionPtr) = NOP_OPCODE;
14722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printBlockInstr(instructionPtr - 1, from.m_offset, 2);
14732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
14742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
14752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        instruction = *instructionPtr;
14772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if ((instruction  & 0xf000) == 0xe000) {
14782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            uint32_t* addr = getLdrImmAddressOnPool(instructionPtr, m_buffer.poolAddress());
14792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            *addr = offsetBits - 2;
14802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printInstr(*instructionPtr, from.m_offset + 2);
14812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
14822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
14832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2);
14852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(*instructionPtr, from.m_offset + 2);
14862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
14872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void* getRelocatedAddress(void* code, JmpSrc jump)
14892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
14902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return reinterpret_cast<void*>(reinterpret_cast<uint32_t>(code) + jump.m_offset);
14912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
14922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void* getRelocatedAddress(void* code, JmpDst destination)
14942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
14952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(destination.m_offset != -1);
14962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return reinterpret_cast<void*>(reinterpret_cast<uint32_t>(code) + destination.m_offset);
14972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
14982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst)
15002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return dst.m_offset - src.m_offset;
15022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst)
15052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return dst.m_offset - src.m_offset;
15072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst)
15102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return dst.m_offset - src.m_offset;
15122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void patchPointer(void* code, JmpDst where, void* value)
15152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        patchPointer(reinterpret_cast<uint32_t*>(code) + where.m_offset, value);
15172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void patchPointer(void* code, void* value)
15202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        patchInt32(code, reinterpret_cast<uint32_t>(value));
15222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void patchInt32(void* code, uint32_t value)
15252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        changePCrelativeAddress((*(reinterpret_cast<uint16_t*>(code)) & 0xff), reinterpret_cast<uint16_t*>(code), value);
15272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void* executableCopy(ExecutablePool* allocator)
15302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void* copy = m_buffer.executableCopy(allocator);
15322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(copy);
15332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return copy;
15342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void prefix(uint16_t pre)
15372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.putByte(pre);
15392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void oneShortOp(uint16_t opcode, bool checksize = true, bool isDouble = true)
15422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printInstr(opcode, m_buffer.uncheckedSize(), isDouble);
15442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (checksize)
15452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_buffer.ensureSpace(maxInstructionSize);
15462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.putShortUnchecked(opcode);
15472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ensureSpace(int space)
15502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(space);
15522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void ensureSpace(int insnSpace, int constSpace)
15552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_buffer.ensureSpace(insnSpace, constSpace);
15572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Administrative methods
15602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void* data() const { return m_buffer.data(); }
15622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int size()
15632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return m_buffer.size();
15652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
15662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifdef SH4_ASSEMBLER_TRACING
15682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void printInstr(uint16_t opc, unsigned int size, bool isdoubleInst = true)
15692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
15702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!getenv("JavaScriptCoreDumpJIT"))
15712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
15722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        const char *format = 0;
15742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printfStdoutInstr("offset: 0x%8.8x\t", size);
15752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc) {
15762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BRK_OPCODE:
15772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    BRK\n";
15782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case NOP_OPCODE:
15802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    NOP\n";
15812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case RTS_OPCODE:
15832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format ="    *RTS\n";
15842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SETS_OPCODE:
15862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SETS\n";
15872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SETT_OPCODE:
15892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SETT\n";
15902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CLRT_OPCODE:
15922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CLRT\n";
15932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FSCHG_OPCODE:
15952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FSCHG\n";
15962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
15972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
15982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
15992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format);
16002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
16012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
16022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf0ff) {
16032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BRAF_OPCODE:
16042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BRAF R%d\n";
16052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case DT_OPCODE:
16072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    DT R%d\n";
16082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPPL_OPCODE:
16102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/PL R%d\n";
16112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPPZ_OPCODE:
16132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/PZ R%d\n";
16142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case JMP_OPCODE:
16162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *JMP @R%d\n";
16172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case JSR_OPCODE:
16192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *JSR @R%d\n";
16202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LDSPR_OPCODE:
16222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    LDS R%d, PR\n";
16232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LDSLPR_OPCODE:
16252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    LDS.L @R%d+, PR\n";
16262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVT_OPCODE:
16282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOVT R%d\n";
16292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHAL_OPCODE:
16312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHAL R%d\n";
16322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHAR_OPCODE:
16342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHAR R%d\n";
16352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLL_OPCODE:
16372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLL R%d\n";
16382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLL2_OPCODE:
16402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLL2 R%d\n";
16412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLL8_OPCODE:
16432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLL8 R%d\n";
16442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLL16_OPCODE:
16462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLL16 R%d\n";
16472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLR_OPCODE:
16492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLR R%d\n";
16502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLR2_OPCODE:
16522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLR2 R%d\n";
16532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLR8_OPCODE:
16552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLR8 R%d\n";
16562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLR16_OPCODE:
16582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLR16 R%d\n";
16592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STSPR_OPCODE:
16612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS PR, R%d\n";
16622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STSLPR_OPCODE:
16642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS.L PR, @-R%d\n";
16652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LDS_RM_FPUL_OPCODE:
16672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    LDS R%d, FPUL\n";
16682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STS_FPUL_RN_OPCODE:
16702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS FPUL, R%d \n";
16712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FLDS_FRM_FPUL_OPCODE:
16732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FLDS FR%d, FPUL\n";
16742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FSTS_FPUL_FRN_OPCODE:
16762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FSTS FPUL, R%d \n";
16772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case LDSFPSCR_OPCODE:
16792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    LDS R%d, FPSCR \n";
16802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STSFPSCR_OPCODE:
16822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS FPSCR, R%d \n";
16832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STSMACL_OPCODE:
16852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS MACL, R%d \n";
16862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case STSMACH_OPCODE:
16882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    STS MACH, R%d \n";
16892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BSRF_OPCODE:
16912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BSRF R%d";
16922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FTRC_OPCODE:
16942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FTRC FR%d, FPUL\n";
16952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
16962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
16972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
16982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getRn(opc));
16992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
17002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
17012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf0ff) {
17022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FNEG_OPCODE:
17032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FNEG DR%d\n";
17042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FLOAT_OPCODE:
17062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FLOAT DR%d\n";
17072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FTRC_OPCODE:
17092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FTRC FR%d, FPUL\n";
17102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FSQRT_OPCODE:
17122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FSQRT FR%d\n";
17132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FCNVDS_DRM_FPUL_OPCODE:
17152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FCNVDS FR%d, FPUL\n";
17162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
17182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
17192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (isdoubleInst)
17202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, getDRn(opc) << 1);
17212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
17222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, getRn(opc));
17232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
17242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
17252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf00f) {
17262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ADD_OPCODE:
17272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    ADD R%d, R%d\n";
17282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ADDC_OPCODE:
17302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    ADDC R%d, R%d\n";
17312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ADDV_OPCODE:
17332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    ADDV R%d, R%d\n";
17342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case AND_OPCODE:
17362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    AND R%d, R%d\n";
17372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case DIV1_OPCODE:
17392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    DIV1 R%d, R%d\n";
17402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPEQ_OPCODE:
17422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/EQ R%d, R%d\n";
17432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPGE_OPCODE:
17452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/GE R%d, R%d\n";
17462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPGT_OPCODE:
17482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/GT R%d, R%d\n";
17492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPHI_OPCODE:
17512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/HI R%d, R%d\n";
17522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPHS_OPCODE:
17542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/HS R%d, R%d\n";
17552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOV_OPCODE:
17572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV R%d, R%d\n";
17582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_WRITE_RN_OPCODE:
17602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B R%d, @R%d\n";
17612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_WRITE_RNDEC_OPCODE:
17632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B R%d, @-R%d\n";
17642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_WRITE_R0RN_OPCODE:
17662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B R%d, @(R0, R%d)\n";
17672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_READ_RM_OPCODE:
17692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B @R%d, R%d\n";
17702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_READ_RMINC_OPCODE:
17722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B @R%d+, R%d\n";
17732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_READ_R0RM_OPCODE:
17752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B @(R0, R%d), R%d\n";
17762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_WRITE_RN_OPCODE:
17782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L R%d, @R%d\n";
17792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_WRITE_RNDEC_OPCODE:
17812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L R%d, @-R%d\n";
17822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_WRITE_R0RN_OPCODE:
17842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L R%d, @(R0, R%d)\n";
17852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_RM_OPCODE:
17872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @R%d, R%d\n";
17882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_RMINC_OPCODE:
17902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @R%d+, R%d\n";
17912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_R0RM_OPCODE:
17932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @(R0, R%d), R%d\n";
17942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MULL_OPCODE:
17962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MUL.L R%d, R%d\n";
17972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
17982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case DMULL_L_OPCODE:
17992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    DMULU.L R%d, R%d\n";
18002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case DMULSL_OPCODE:
18022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    DMULS.L R%d, R%d\n";
18032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case NEG_OPCODE:
18052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    NEG R%d, R%d\n";
18062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case NEGC_OPCODE:
18082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    NEGC R%d, R%d\n";
18092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case NOT_OPCODE:
18112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    NOT R%d, R%d\n";
18122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case OR_OPCODE:
18142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    OR R%d, R%d\n";
18152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHAD_OPCODE:
18172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHAD R%d, R%d\n";
18182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SHLD_OPCODE:
18202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SHLD R%d, R%d\n";
18212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SUB_OPCODE:
18232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SUB R%d, R%d\n";
18242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SUBC_OPCODE:
18262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SUBC R%d, R%d\n";
18272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case SUBV_OPCODE:
18292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    SUBV R%d, R%d\n";
18302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case TST_OPCODE:
18322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    TST R%d, R%d\n";
18332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case XOR_OPCODE:
18352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    XOR R%d, R%d\n";break;
18362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVW_WRITE_RN_OPCODE:
18372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.W R%d, @R%d\n";
18382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVW_READ_RM_OPCODE:
18402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.W @R%d, R%d\n";
18412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVW_READ_R0RM_OPCODE:
18432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.W @(R0, R%d), R%d\n";
18442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case EXTUW_OPCODE:
18462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    EXTU.W R%d, R%d\n";
18472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
18492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
18502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getRm(opc), getRn(opc));
18512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
18522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
18532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf00f) {
18542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FSUB_OPCODE:
18552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FSUB FR%d, FR%d\n";
18562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FADD_OPCODE:
18582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FADD FR%d, FR%d\n";
18592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FDIV_OPCODE:
18612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FDIV FR%d, FR%d\n";
18622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMUL_OPCODE:
18642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    DMULL FR%d, FR%d\n";
18652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOV_OPCODE:
18672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FMOV FR%d, FR%d\n";
18682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FCMPEQ_OPCODE:
18702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FCMP/EQ FR%d, FR%d\n";
18712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FCMPGT_OPCODE:
18732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    FCMP/GT FR%d, FR%d\n";
18742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
18762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
18772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (isdoubleInst)
18782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, getDRm(opc) << 1, getDRn(opc) << 1);
18792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
18802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, getRm(opc), getRn(opc));
18812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
18822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
18832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf00f) {
18842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_WRITE_RN_DEC_OPCODE:
18852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s FR%d, @-R%d\n";
18862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_WRITE_RN_OPCODE:
18882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s FR%d, @R%d\n";
18892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_WRITE_R0RN_OPCODE:
18912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s FR%d, @(R0, R%d)\n";
18922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
18932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
18942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
18952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (isdoubleInst)
18962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, "FMOV", getDRm(opc) << 1, getDRn(opc));
18972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
18982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, "FMOV.S", getRm(opc), getRn(opc));
18992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
19002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf00f) {
19022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_READ_RM_OPCODE:
19032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s @R%d, FR%d\n";
19042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_READ_RM_INC_OPCODE:
19062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s @R%d+, FR%d\n";
19072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case FMOVS_READ_R0RM_OPCODE:
19092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    %s @(R0, R%d), FR%d\n";
19102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
19132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (isdoubleInst)
19142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, "FMOV", getDRm(opc), getDRn(opc) << 1);
19152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
19162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                printfStdoutInstr(format, "FMOV.S", getRm(opc), getRn(opc));
19172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
19182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xff00) {
19202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BF_OPCODE:
19212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    BF %d\n";
19222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BFS_OPCODE:
19242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BF/S %d\n";
19252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ANDIMM_OPCODE:
19272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    AND #%d, R0\n";
19282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BT_OPCODE:
19302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    BT %d\n";
19312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BTS_OPCODE:
19332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BT/S %d\n";
19342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case CMPEQIMM_OPCODE:
19362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    CMP/EQ #%d, R0\n";
19372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_WRITE_OFFGBR_OPCODE:
19392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B R0, @(%d, GBR)\n";
19402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_READ_OFFGBR_OPCODE:
19422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B @(%d, GBR), R0\n";
19432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_WRITE_OFFGBR_OPCODE:
19452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L R0, @(%d, GBR)\n";
19462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_OFFGBR_OPCODE:
19482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @(%d, GBR), R0\n";
19492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVA_READ_OFFPC_OPCODE:
19512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOVA @(%d, PC), R0\n";
19522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ORIMM_OPCODE:
19542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    OR #%d, R0\n";
19552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ORBIMM_OPCODE:
19572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    OR.B #%d, @(R0, GBR)\n";
19582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case TSTIMM_OPCODE:
19602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    TST #%d, R0\n";
19612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case TSTB_OPCODE:
19632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    TST.B %d, @(R0, GBR)\n";
19642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case XORIMM_OPCODE:
19662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    XOR #%d, R0\n";
19672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case XORB_OPCODE:
19692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    XOR.B %d, @(R0, GBR)\n";
19702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
19732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getImm8(opc));
19742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
19752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xff00) {
19772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_WRITE_OFFRN_OPCODE:
19782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B R0, @(%d, R%d)\n";
19792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVB_READ_OFFRM_OPCODE:
19812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.B @(%d, R%d), R0\n";
19822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
19852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getDisp(opc), getRm(opc));
19862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
19872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf000) {
19892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BRA_OPCODE:
19902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BRA %d\n";
19912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case BSR_OPCODE:
19932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    *BSR %d\n";
19942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
19952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
19962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
19972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getImm12(opc));
19982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
19992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
20002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf000) {
20012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_OFFPC_OPCODE:
20022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @(%d, PC), R%d\n";
20032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case ADDIMM_OPCODE:
20052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    ADD #%d, R%d\n";
20062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVIMM_OPCODE:
20082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV #%d, R%d\n";
20092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVW_READ_OFFPC_OPCODE:
20112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.W @(%d, PC), R%d\n";
20122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
20142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (format) {
20152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getImm8(opc), getRn(opc));
20162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
20172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
20182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (opc & 0xf000) {
20192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_WRITE_OFFRN_OPCODE:
20202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L R%d, @(%d, R%d)\n";
20212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getRm(opc), getDisp(opc), getRn(opc));
20222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        case MOVL_READ_OFFRM_OPCODE:
20242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            format = "    MOV.L @(%d, R%d), R%d\n";
20252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            printfStdoutInstr(format, getDisp(opc), getRm(opc), getRn(opc));
20262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
20272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
20282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
20292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void printfStdoutInstr(const char* format, ...)
20312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
20322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (getenv("JavaScriptCoreDumpJIT")) {
20332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            va_list args;
20342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            va_start(args, format);
20352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vprintfStdoutInstr(format, args);
20362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            va_end(args);
20372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
20382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
20392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void vprintfStdoutInstr(const char* format, va_list args)
20412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
20422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (getenv("JavaScriptCoreDumpJIT"))
20432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vfprintf(stdout, format, args);
20442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
20452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void printBlockInstr(uint16_t* first, unsigned int offset, int nbInstr)
20472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
20482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printfStdoutInstr(">> repatch instructions after link\n");
20492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (int i = 0; i <= nbInstr; i++)
20502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch           printInstr(*(first + i), offset + i);
20512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        printfStdoutInstr(">> end repatch\n");
20522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
20532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
20542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void printInstr(uint16_t opc, unsigned int size, bool isdoubleInst = true) {};
20552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void printBlockInstr(uint16_t* first, unsigned int offset, int nbInstr) {};
20562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
20572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochprivate:
20592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SH4Buffer m_buffer;
20602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int m_claimscratchReg;
20612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch};
20622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} // namespace JSC
20642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif // ENABLE(ASSEMBLER) && CPU(SH4)
20662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
20672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif // SH4Assembler_h
2068