* ========== Copyright Header Begin ==========================================
* OpenSPARC T2 Processor File: sparcv9decode.h
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
* The above named program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
* You should have received a copy of the GNU General Public
* License along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
* ========== Copyright Header End ============================================
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
#ifndef _SPARCV9DECODE_H_
#define _SPARCV9DECODE_H_
#pragma ident "@(#)sparcv9decode.h 1.15 07/03/19 SMI"
* Principal instruction decoding for SPARC v9 instruction set.
* Eventually maybe v8 will be a defined subset of this.
bpcc_illegal_cc_specifier
,
bpr_illegal_cc_specifier
,
done_retry_illegal_fcn_field
,
saved_reserved_field_non_zero
,
tcc_reserved_field_non_zero
,
movcc_reserved_field_non_zero
,
illtrap_reserved_field_non_zero
,
fmovcc_reserved_field_non_zero
,
flushw_reserved_field_non_zero
,
visop36_reserved_field_non_zero
,
sir_reserved_field_non_zero
,
cas_reserved_field_non_zero
,
misc_reserved_field_non_zero
* Basic enumeration for the instruction types (op field) opcodes.
Ty_0
= 0, /* Branches and sethi */
Ty_2
= 2, /* Arithmetic & Misc */
Ty_3
= 3 /* Loads/Stores */
* An enumeration table for the op2 values for op==0
T0o3_Illtrap
= 0, T0o3_BPcc
,
T0o3_FBfcc
, T0o3_unknown_0x7
* An enumeration table for the op3 values for op==2
/* Col 0 (0x00 - 0x0f) */
T2o3_add
, T2o3_and
, T2o3_or
, T2o3_xor
,
T2o3_sub
, T2o3_andn
, T2o3_orn
, T2o3_xnor
,
T2o3_addc
, T2o3_mulx
, T2o3_umul
, T2o3_smul
,
T2o3_subc
, T2o3_udivx
, T2o3_udiv
, T2o3_sdiv
,
/* Col 1 (0x10 - 0x1f) */
T2o3_addcc
, T2o3_andcc
, T2o3_orcc
, T2o3_xorcc
,
T2o3_subcc
, T2o3_andncc
, T2o3_orncc
, T2o3_xnorcc
,
T2o3_addccc
, T2o3_unknown_0x19
, T2o3_umulcc
, T2o3_smulcc
,
T2o3_subccc
, T2o3_unknown_0x1d
, T2o3_udivcc
, T2o3_sdivcc
,
/* Col 2 (0x20 - 0x2f) */
T2o3_taddcc
, T2o3_tsubcc
, T2o3_taddcctv
, T2o3_tsubcctv
,
T2o3_mulscc
, T2o3_sll
, T2o3_srl
, T2o3_sra
,
T2o3_rdasr
, T2o3_rdhpr
, T2o3_rdpr
, T2o3_flushw
,
T2o3_movcc
, T2o3_sdivx
, T2o3_popc
, T2o3_movr
,
/* Col 3 (0x30 - 0x3f) */
T2o3_wrasr
, T2o3_saved
, T2o3_wrpr
, T2o3_wrhpr
,
T2o3_fpop_0x34
, T2o3_fpop_0x35
, T2o3_gop
, T2o3_unknown_0x37
,
T2o3_jmpl
, T2o3_return
, T2o3_tcc
, T2o3_flush
,
T2o3_save
, T2o3_restore
, T2o3_retry
, T2o3_unknown_0x3f
* Table of op3 values for the op=3 (load/store) opcodes
/* Col 0 (0x00 - 0x0f) */
T3o3_lduw
, T3o3_ldub
, T3o3_lduh
, T3o3_ldd
,
T3o3_stw
, T3o3_stb
, T3o3_sth
, T3o3_std
,
T3o3_ldsw
, T3o3_ldsb
, T3o3_ldsh
, T3o3_ldx
,
T3o3_unknown_0x0c
, T3o3_ldstub1
, T3o3_stx
, T3o3_swapd
,
/* Col 1 (0x10 - 0x1f) */
T3o3_lduwa
, T3o3_lduba
, T3o3_lduha
, T3o3_ldda
,
T3o3_stwa
, T3o3_stba
, T3o3_stha
, T3o3_stda
,
T3o3_ldswa
, T3o3_ldsba
, T3o3_ldsha
, T3o3_ldxa
,
T3o3_unknown_0x1c
, T3o3_ldstuba
, T3o3_stxa
, T3o3_swapa
,
/* Col 2 (0x20 - 0x2f) */
T3o3_ldf
, T3o3_ldfsr
, T3o3_ldqf
, T3o3_lddf
,
T3o3_stf
, T3o3_stfsr
, T3o3_stqf
, T3o3_stdf
,
T3o3_unknown_0x28
, T3o3_unknown_0x29
, T3o3_unknown_0x2a
, T3o3_unknown_0x2b
,
T3o3_unknown_0x2c
, T3o3_prefetch
, T3o3_unknown_0x2e
, T3o3_unknown_0x2f
,
/* Col 3 (0x30 - 0x3f) */
T3o3_ldfa
, T3o3_unknown_0x31
, T3o3_ldqfa
, T3o3_lddfa
,
T3o3_stfa
, T3o3_unknown_0x35
, T3o3_stqfa
, T3o3_stdfa
,
T3o3_unknown_0x38
, T3o3_unknown_0x39
, T3o3_unknown_0x3a
, T3o3_unknown_0x3b
,
T3o3_casa
, T3o3_prefetcha
, T3o3_casxa
, T3o3_unknown_0x3f
* Table of opf fields for the op=3, op3=0x34 floating point ops
FPop34_fmovs
= 0x001, FPop34_fmovd
= 0x002, FPop34_fmovq
= 0x003,
FPop34_fnegs
= 0x005, FPop34_fnegd
= 0x006, FPop34_fnegq
= 0x007,
FPop34_fabss
= 0x009, FPop34_fabsd
= 0x00a, FPop34_fabsq
= 0x00b,
FPop34_fsqrts
= 0x029, FPop34_fsqrtd
= 0x02a, FPop34_fsqrtq
= 0x02b,
FPop34_fadds
= 0x041, FPop34_faddd
= 0x042, FPop34_faddq
= 0x043,
FPop34_fsubs
= 0x045, FPop34_fsubd
= 0x046, FPop34_fsubq
= 0x047,
FPop34_fmuls
= 0x049, FPop34_fmuld
= 0x04a, FPop34_fmulq
= 0x04b,
FPop34_fdivs
= 0x04d, FPop34_fdivd
= 0x04e, FPop34_fdivq
= 0x04f,
/* following instructions are Rock only */
FPop34_fnadds
= 0x051, FPop34_fnaddd
= 0x052,
FPop34_fnmuls
= 0x059, FPop34_fnmuld
= 0x05a,
FPop34_fhadds
= 0x061, FPop34_fhaddd
= 0x062,
FPop34_fhsubs
= 0x065, FPop34_fhsubd
= 0x066,
FPop34_fsmuld
= 0x069, FPop34_fdmulq
= 0x06e,
/* following instructions are Rock only */
FPop34_fnhadds
= 0x071, FPop34_fnhaddd
= 0x072,
FPop34_fstox
= 0x081, FPop34_fdtox
= 0x082, FPop34_fqtox
= 0x083,
FPop34_fxtos
= 0x084, FPop34_fxtod
= 0x088, FPop34_fxtoq
= 0x08c,
FPop34_fitos
= 0x0c4, FPop34_fdtos
= 0x0c6, FPop34_fqtos
= 0x087,
FPop34_fitod
= 0x0c8, FPop34_fstod
= 0x0c9, FPop34_fqtod
= 0x0cb,
FPop34_fitoq
= 0x0cc, FPop34_fstoq
= 0x0cd, FPop34_fdtoq
= 0x0ce,
FPop34_fstoi
= 0x0d1, FPop34_fdtoi
= 0x0d2, FPop34_fqtoi
= 0x0d3
* Table of opf fields for the op=3, op3=0x35 floating point ops
FPop35_fmovrsz
= 0x025, FPop35_fmovrdz
= 0x026, FPop35_fmovrqz
= 0x027,
FPop35_fmovrslez
= 0x045, FPop35_fmovrdlez
= 0x046, FPop35_fmovrqlez
= 0x047,
FPop35_fmovrslz
= 0x065, FPop35_fmovrdlz
= 0x066, FPop35_fmovrqlz
= 0x067,
FPop35_fmovrsnz
= 0x0a5, FPop35_fmovrdnz
= 0x0a6, FPop35_fmovrqnz
= 0x0a7,
FPop35_fmovrsgz
= 0x0c5, FPop35_fmovrdgz
= 0x0c6, FPop35_fmovrqgz
= 0x0c7,
FPop35_fmovrsgez
= 0x0e5, FPop35_fmovrdgez
= 0x0e6, FPop35_fmovrqgez
= 0x0e7,
FPop35_fmovs_fcc0
= 0x001, FPop35_fmovd_fcc0
= 0x002, FPop35_fmovq_fcc0
= 0x003,
FPop35_fmovs_fcc1
= 0x041, FPop35_fmovd_fcc1
= 0x042, FPop35_fmovq_fcc1
= 0x043,
FPop35_fmovs_fcc2
= 0x081, FPop35_fmovd_fcc2
= 0x082, FPop35_fmovq_fcc2
= 0x083,
FPop35_fmovs_fcc3
= 0x0c1, FPop35_fmovd_fcc3
= 0x0c2, FPop35_fmovq_fcc3
= 0x0c3,
FPop35_fmovs_icc
= 0x101, FPop35_fmovd_icc
= 0x102, FPop35_fmovq_icc
= 0x103,
FPop35_fmovs_xcc
= 0x181, FPop35_fmovd_xcc
= 0x182, FPop35_fmovq_xcc
= 0x183,
FPop35_fcmps
= 0x051, FPop35_fcmpd
= 0x052, FPop35_fcmpq
= 0x053,
FPop35_fcmpes
= 0x055, FPop35_fcmped
= 0x056, FPop35_fcmpeq
= 0x057
* Table of opf fields for the op=3, op3=0x36 vis ops
VISop36_edge8
= 0x000, VISop36_edge8n
= 0x001,
VISop36_edge8l
= 0x002, VISop36_edge8ln
= 0x003,
VISop36_edge16
= 0x004, VISop36_edge16n
= 0x005,
VISop36_edge16l
= 0x006, VISop36_edge16ln
= 0x007,
VISop36_edge32
= 0x008, VISop36_edge32n
= 0x009,
VISop36_edge32l
= 0x00a, VISop36_edge32ln
= 0x00b,
VISop36_array8
= 0x010, VISop36_addxc
= 0x011,
VISop36_array16
= 0x012, VISop36_addxccc
= 0x013,
VISop36_array32
= 0x014, VISop36_random
= 0x015,
VISop36_umulxhi
= 0x016, VISop36_lzd
= 0x017,
VISop36_alignaddr
= 0x018, VISop36_bmask
= 0x019,
VISop36_alignaddrl
= 0x01a, VISop36_cmask8
= 0x01b,
VISop36_cmask16
= 0x01d, VISop36_cmask32
= 0x01f,
VISop36_fcmple16
= 0x020, VISop36_fsll16
= 0x021,
VISop36_fcmpne16
= 0x022, VISop36_fsrl16
= 0x023,
VISop36_fcmple32
= 0x024, VISop36_fsll32
= 0x025,
VISop36_fcmpne32
= 0x026, VISop36_fsrl32
= 0x027,
VISop36_fcmpgt16
= 0x028, VISop36_fslas16
= 0x029,
VISop36_fcmpeq16
= 0x02a, VISop36_fsra16
= 0x02b,
VISop36_fcmpgt32
= 0x02c, VISop36_fslas32
= 0x02d,
VISop36_fcmpeq32
= 0x02e, VISop36_fsra32
= 0x02f,
VISop36_fmul8x16
= 0x031, VISop36_fmul8x16au
= 0x033,
VISop36_fmul8x16al
= 0x035, VISop36_fmul8sux16
= 0x036,
VISop36_fmul8ulx16
= 0x037, VISop36_fmuld8sux16
= 0x038,
VISop36_fmuld8ulx16
= 0x039, VISop36_fpack32
= 0x03a,
VISop36_fpack16
= 0x03b, VISop36_fpackfix
= 0x03d,
VISop36_pdist
= 0x03e, VISop36_pdistn
= 0x03f,
VISop36_fmean16
= 0x040, VISop36_fpadd64
= 0x042,
VISop36_fchksm16
= 0x044, VISop36_fpsub64
= 0x046,
VISop36_fpmerge
= 0x04b, VISop36_fexpand
= 0x04d,
VISop36_bshuffle
= 0x04c, VISop36_faligndata
= 0x048,
VISop36_fpadd16
= 0x050, VISop36_fpadd16s
= 0x051,
VISop36_fpadd32
= 0x052, VISop36_fpadd32s
= 0x053,
VISop36_fpsub16
= 0x054, VISop36_fpsub16s
= 0x055,
VISop36_fpsub32
= 0x056, VISop36_fpsub32s
= 0x057,
VISop36_fpadds16
= 0x058, VISop36_fpadds16s
= 0x059,
VISop36_fpadds32
= 0x05a, VISop36_fpadds32s
= 0x05b,
VISop36_fpsubs16
= 0x05c, VISop36_fpsubs16s
= 0x05d,
VISop36_fpsubs32
= 0x05e, VISop36_fpsubs32s
= 0x05f,
VISop36_fzerod
= 0x060, VISop36_fzeros
= 0x061,
VISop36_fnord
= 0x062, VISop36_fnors
= 0x063,
VISop36_fandnot2d
= 0x064, VISop36_fandnot2s
= 0x065,
VISop36_fnot2d
= 0x066, VISop36_fnot2s
= 0x067,
VISop36_fandnot1d
= 0x068, VISop36_fandnot1s
= 0x069,
VISop36_fnot1d
= 0x06a, VISop36_fnot1s
= 0x06b,
VISop36_fxord
= 0x06c, VISop36_fxors
= 0x06d,
VISop36_fnandd
= 0x06e, VISop36_fnands
= 0x06f,
VISop36_fandd
= 0x070, VISop36_fands
= 0x071,
VISop36_fxnord
= 0x072, VISop36_fxnors
= 0x073,
VISop36_fsrc1d
= 0x074, VISop36_fsrc1s
= 0x075,
VISop36_fornot2d
= 0x076, VISop36_fornot2s
= 0x077,
VISop36_fsrc2d
= 0x078, VISop36_fsrc2s
= 0x079,
VISop36_fornot1d
= 0x07a, VISop36_fornot1s
= 0x07b,
VISop36_ford
= 0x07c, VISop36_fors
= 0x07d,
VISop36_foned
= 0x07e, VISop36_fones
= 0x07f,
VISop36_siam
= 0x81, VISop36_movdtox
= 0x110,
VISop36_movstouw
= 0x111, VISop36_movstosw
= 0x113,
VISop36_xmulx
= 0x115, VISop36_xmulxhi
= 0x116,
VISop36_movxtod
= 0x118, VISop36_movwtos
= 0x119,
VISop36_fucmple8
= 0x120, VISop36_fucmpne8
= 0x122,
VISop36_fucmpgt8
= 0x128, VISop36_fucmpeq8
= 0x12a,
VISop36_flcmps
= 0x151, VISop36_flcmpd
= 0x152
* Table of opf fields for the op=3, op3=0x37 - Rock only
* fused multiply-add/sub floating point ops
FPop37_fmadds
= 0x1, FPop37_fmaddd
= 0x2,
FPop37_fmsubs
= 0x5, FPop37_fmsubd
= 0x6,
FPop37_fnmsubs
= 0x9, FPop37_fnmsubd
= 0xa,
FPop37_fnmadds
= 0xd, FPop37_fnmaddd
= 0xe
* Table of opf fields for the op=3, op3=0x3f - Rock only
* unfused multiply-add/sub floating point ops
FPop3f_fumadds
= 0x1, FPop3f_fumaddd
= 0x2,
FPop3f_fumsubs
= 0x5, FPop3f_fumsubd
= 0x6,
FPop3f_fnumsubs
= 0x9, FPop3f_fnumsubd
= 0xa,
FPop3f_fnumadds
= 0xd, FPop3f_fnumaddd
= 0xe
RCond_reserved_0x0
= 0x0,
RCond_reserved_0x4
= 0x4,
/* Support for the condition code computation*/
* Support macros for the instruction decoder
/* this is for an instruction - so everything is uint32_t */
/* verify field [_e:_s] == 0 */
#define RESERVED_FIELD(_e, _s) ( ((((uint32_t)0xffffffff)<<((_s)+31-(_e))) >> (31-(_e))) )
#define CHECK_RESERVED_ZERO(_i, _e, _s) \
(( ((uint32_t)(_i)) & RESERVED_FIELD(_e, _s) ) == 0 )
#define CHECK_RESERVED_ZERO2(_i, _e1, _s1, _e2, _s2) \
(( ((uint32_t)(_i)) & (RESERVED_FIELD(_e1, _s1) | \
RESERVED_FIELD(_e2, _s2)) ) == 0 )
#define CHECK_RESERVED_ZERO3(_i, _e1, _s1, _e2, _s2, _e3, _s3) \
(( ((uint32_t)(_i)) & (RESERVED_FIELD(_e1, _s1) | \
RESERVED_FIELD(_e2, _s2) | RESERVED_FIELD(_e3, _s3)) ) == 0 )
#define X_OP(_i) (((_i) >> 30) & 0x3)
#define X_OP2(_i) (((_i) >> 22) & 0x7)
#define X_OP3(_i) (((_i) >> 19) & 0x3f)
#define X_FMT2_FCN(_i) (((_i) >> 25) & 0x3f)
/* 22bit immediate for seth_i */
#define X_FMT2_IMM22(_i) ((_i) & 0x3FFFFF)
#define X_RS1(_i) (((_i) >> 14) & 0x1f)
#define X_RS2(_i) (((_i) >> 0) & 0x1f)
#define X_RS3(_i) (((_i) >> 9) & 0x1f)
#define X_RD(_i) (((_i) >> 25) & 0x1f)
#define X_I(_i) (((_i) >> 13) & 0x1)
#define X_ASI(_i) (((_i) >> 5) & 0xff)
/* Nasty set of shifting to ensure we extract sign extended correctly */
#define X_SIMM13(_i) ((((int)(_i))<<(8*sizeof(int)-13))>>(8*sizeof(int)-13))
#define X_SIMM11(_i) ((((int)(_i))<<(8*sizeof(int)-11))>>(8*sizeof(int)-11))
#define X_SIMM10(_i) ((((int)(_i))<<(8*sizeof(int)-10))>>(8*sizeof(int)-10))
#define X_SHIFT_SIZE_BIT(_i) (((_i) >> 12) & 0x1)
#define X_SHIFT_IMM32(_i) ((_i) & 0x1f)
#define X_SHIFT_IMM64(_i) ((_i) & 0x3f)
/* For call instruction */
#define X_FMT1_DISP30(_i) ((_i) & 0x3fffffff)
/* For branches - the displacement, condition and annul bit */
#define X_FMT2_DISP22(_i) ((_i) & 0x3FFFFF)
#define X_FMT2_DISP19(_i) ((_i) & 0x7FFFF)
#define X_FMT2_DISP16(_i) (((_i) & 0x3FFF) | (((_i)>>6) & 0xc000))
#define X_ANNUL_BIT(_i) (((_i) >> 29) & 0x1)
#define X_COND(_i) (((_i)>>25) & 0xf)
#define X_RCOND(_i) (((_i)>>25) & 0x7)
#define X_MOVRCOND(_i) (((_i)>>10) & 0x7)
#define X_FMT3_RCOND(_i) (((_i) >> 10) & 0x7)
#define X_FMT2_CC(_i) (((_i) >>20) & 0x3)
#define X_FMT4_CC(_i) (((_i) >>11) & 0x3)
/* For the conditional move instructions */
#define X_FMT4_CC2(_i) (((_i)>>18)&1) /* =0 if FPCC =1 if ICC */
#define X_FMT4_CC2a(_i) (((_i)>>13)&1) /* =0 if FPCC =1 if ICC */
#define X_FMT4_COND(_i) (((_i)>>14)&0xf)
#define X_MEMBAR_MASKS(_i) ((_i) & 0x7f)
/* Format 3 - done and retry instructions */
#define FMT3_FCN_SHIFT 25
#define FMT3_FCN_MASK_BITS 5
#define FMT3_FCN_MASK_BASE ((1LL<<FMT3_FCN_MASK_BITS)-1)
#define X_FMT3_FCN(_i) (((_i)>>FMT3_FCN_SHIFT)&FMT3_FCN_MASK_BASE)
* Floating point instructions
#define FMT3_FP_OPF_SHIFT 5
#define FMT3_FP_OPF_MASK 0x1ff
#define FMT3_FP_OP5_MASK 0xf
#define X_FP_OPF( _i ) (((_i)>>FMT3_FP_OPF_SHIFT)&FMT3_FP_OPF_MASK)
#define X_FP_OP5( _i ) (((_i)>>FMT3_FP_OPF_SHIFT)&FMT3_FP_OP5_MASK)
#define X_FCOND(_i) (((_i)>>25) & 0x3)
/* rescale reg num for fp double regs */
#define RESCALEFPREG(_R) (_R) = ((_R) & 0x1e) | (((_R) & 1)<<5)
* setup for the xicache processing
#define SET_OP(_n) do { exec_funcp = decoded_impl_##_n ; } while (0)
#define SET_OPv9(_n) do { exec_funcp = decoded_impl_sparcv9_##_n ; } while (0)
#endif /* _SPARCV9DECODE_H_ */