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