@ -1164,8 +1164,7 @@ Expr_Node_Gen_Reloc_R (Expr_Node * head)
}
return note ;
}
/* Blackfin opcode generation. */
/* These functions are called by the generated parser
@ -1964,3 +1963,743 @@ bfin_force_relocation (struct fix *fixp)
return generic_force_reloc ( fixp ) ;
}
/* This is a stripped down version of the disassembler. The only thing it
does is return a mask of registers modified by an instruction . Only
instructions that can occur in a parallel - issue bundle are handled , and
only the registers that can cause a conflict are recorded . */
# define DREG_MASK(n) (0x101 << (n))
# define DREGH_MASK(n) (0x100 << (n))
# define DREGL_MASK(n) (0x001 << (n))
# define IREG_MASK(n) (1 << ((n) + 16))
static int
decode_ProgCtrl_0 ( int iw0 )
{
if ( iw0 = = 0 )
return 0 ;
abort ( ) ;
}
static int
decode_LDSTpmod_0 ( int iw0 )
{
/* LDSTpmod
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 0 | 0 | . W . | . aop . . . | . reg . . . . . . . | . idx . . . . . . . | . ptr . . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int W = ( ( iw0 > > LDSTpmod_W_bits ) & LDSTpmod_W_mask ) ;
int aop = ( ( iw0 > > LDSTpmod_aop_bits ) & LDSTpmod_aop_mask ) ;
int idx = ( ( iw0 > > LDSTpmod_idx_bits ) & LDSTpmod_idx_mask ) ;
int ptr = ( ( iw0 > > LDSTpmod_ptr_bits ) & LDSTpmod_ptr_mask ) ;
int reg = ( ( iw0 > > LDSTpmod_reg_bits ) & LDSTpmod_reg_mask ) ;
if ( aop = = 1 & & W = = 0 & & idx = = ptr )
return DREGL_MASK ( reg ) ;
else if ( aop = = 2 & & W = = 0 & & idx = = ptr )
return DREGH_MASK ( reg ) ;
else if ( aop = = 1 & & W = = 1 & & idx = = ptr )
return 0 ;
else if ( aop = = 2 & & W = = 1 & & idx = = ptr )
return 0 ;
else if ( aop = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & W = = 0 )
return DREGL_MASK ( reg ) ;
else if ( aop = = 2 & & W = = 0 )
return DREGH_MASK ( reg ) ;
else if ( aop = = 3 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 3 & & W = = 1 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 1 & & W = = 1 )
return 0 ;
else if ( aop = = 2 & & W = = 1 )
return 0 ;
else
return 0 ;
return 2 ;
}
static int
decode_dagMODim_0 ( int iw0 )
{
/* dagMODim
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | . br | 1 | 1 | . op | . m . . . . . | . i . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int i = ( ( iw0 > > DagMODim_i_bits ) & DagMODim_i_mask ) ;
int op = ( ( iw0 > > DagMODim_op_bits ) & DagMODim_op_mask ) ;
if ( op = = 0 | | op = = 1 )
return IREG_MASK ( i ) ;
else
return 0 ;
return 2 ;
}
static int
decode_dagMODik_0 ( int iw0 )
{
/* dagMODik
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | . op . . . . | . i . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int i = ( ( iw0 > > DagMODik_i_bits ) & DagMODik_i_mask ) ;
return IREG_MASK ( i ) ;
}
/* GOOD */
static int
decode_dspLDST_0 ( int iw0 )
{
/* dspLDST
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 0 | 1 | 1 | 1 | . W . | . aop . . . | . m . . . . . | . i . . . . . | . reg . . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int i = ( ( iw0 > > DspLDST_i_bits ) & DspLDST_i_mask ) ;
int m = ( ( iw0 > > DspLDST_m_bits ) & DspLDST_m_mask ) ;
int W = ( ( iw0 > > DspLDST_W_bits ) & DspLDST_W_mask ) ;
int aop = ( ( iw0 > > DspLDST_aop_bits ) & DspLDST_aop_mask ) ;
int reg = ( ( iw0 > > DspLDST_reg_bits ) & DspLDST_reg_mask ) ;
if ( aop = = 0 & & W = = 0 & & m = = 0 )
return DREG_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 0 & & W = = 0 & & m = = 1 )
return DREGL_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 0 & & W = = 0 & & m = = 2 )
return DREGH_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 0 & & m = = 0 )
return DREG_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 0 & & m = = 1 )
return DREGL_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 0 & & m = = 2 )
return DREGH_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 2 & & W = = 0 & & m = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & W = = 0 & & m = = 1 )
return DREGL_MASK ( reg ) ;
else if ( aop = = 2 & & W = = 0 & & m = = 2 )
return DREGH_MASK ( reg ) ;
else if ( aop = = 0 & & W = = 1 & & m = = 0 )
return IREG_MASK ( i ) ;
else if ( aop = = 0 & & W = = 1 & & m = = 1 )
return IREG_MASK ( i ) ;
else if ( aop = = 0 & & W = = 1 & & m = = 2 )
return IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 1 & & m = = 0 )
return IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 1 & & m = = 1 )
return IREG_MASK ( i ) ;
else if ( aop = = 1 & & W = = 1 & & m = = 2 )
return IREG_MASK ( i ) ;
else if ( aop = = 2 & & W = = 1 & & m = = 0 )
return 0 ;
else if ( aop = = 2 & & W = = 1 & & m = = 1 )
return 0 ;
else if ( aop = = 2 & & W = = 1 & & m = = 2 )
return 0 ;
else if ( aop = = 3 & & W = = 0 )
return DREG_MASK ( reg ) | IREG_MASK ( i ) ;
else if ( aop = = 3 & & W = = 1 )
return IREG_MASK ( i ) ;
abort ( ) ;
}
/* GOOD */
static int
decode_LDST_0 ( int iw0 )
{
/* LDST
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 0 | 1 | . sz . . . . | . W . | . aop . . . | . Z . | . ptr . . . . . . . | . reg . . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int Z = ( ( iw0 > > LDST_Z_bits ) & LDST_Z_mask ) ;
int W = ( ( iw0 > > LDST_W_bits ) & LDST_W_mask ) ;
int sz = ( ( iw0 > > LDST_sz_bits ) & LDST_sz_mask ) ;
int aop = ( ( iw0 > > LDST_aop_bits ) & LDST_aop_mask ) ;
int reg = ( ( iw0 > > LDST_reg_bits ) & LDST_reg_mask ) ;
if ( aop = = 0 & & sz = = 0 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & sz = = 0 & & Z = = 1 & & W = = 0 )
return 0 ;
else if ( aop = = 0 & & sz = = 1 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & sz = = 1 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & sz = = 2 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & sz = = 2 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & sz = = 0 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & sz = = 0 & & Z = = 1 & & W = = 0 )
return 0 ;
else if ( aop = = 1 & & sz = = 1 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & sz = = 1 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & sz = = 2 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 1 & & sz = = 2 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & sz = = 0 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & sz = = 0 & & Z = = 1 & & W = = 0 )
return 0 ;
else if ( aop = = 2 & & sz = = 1 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & sz = = 1 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & sz = = 2 & & Z = = 0 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 2 & & sz = = 2 & & Z = = 1 & & W = = 0 )
return DREG_MASK ( reg ) ;
else if ( aop = = 0 & & sz = = 0 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 0 & & sz = = 0 & & Z = = 1 & & W = = 1 )
return 0 ;
else if ( aop = = 0 & & sz = = 1 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 0 & & sz = = 2 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 1 & & sz = = 0 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 1 & & sz = = 0 & & Z = = 1 & & W = = 1 )
return 0 ;
else if ( aop = = 1 & & sz = = 1 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 1 & & sz = = 2 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 2 & & sz = = 0 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 2 & & sz = = 0 & & Z = = 1 & & W = = 1 )
return 0 ;
else if ( aop = = 2 & & sz = = 1 & & Z = = 0 & & W = = 1 )
return 0 ;
else if ( aop = = 2 & & sz = = 2 & & Z = = 0 & & W = = 1 )
return 0 ;
abort ( ) ;
}
static int
decode_LDSTiiFP_0 ( int iw0 )
{
/* LDSTiiFP
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 1 | 1 | 1 | 0 | . W . | . offset . . . . . . . . . . . . | . reg . . . . . . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int reg = ( ( iw0 > > LDSTiiFP_reg_bits ) & LDSTiiFP_reg_mask ) ;
int W = ( ( iw0 > > LDSTiiFP_W_bits ) & LDSTiiFP_W_mask ) ;
if ( W = = 0 )
return reg < 8 ? DREG_MASK ( reg ) : 0 ;
else
return 0 ;
}
static int
decode_LDSTii_0 ( int iw0 )
{
/* LDSTii
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 0 | 1 | . W . | . op . . . . | . offset . . . . . . . . | . ptr . . . . . . . | . reg . . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int reg = ( ( iw0 > > LDSTii_reg_bit ) & LDSTii_reg_mask ) ;
int op = ( ( iw0 > > LDSTii_op_bit ) & LDSTii_op_mask ) ;
int W = ( ( iw0 > > LDSTii_W_bit ) & LDSTii_W_mask ) ;
if ( W = = 0 & & op ! = 3 )
return DREG_MASK ( reg ) ;
else if ( W = = 0 & & op = = 3 )
return 0 ;
else if ( W = = 1 & & op = = 0 )
return 0 ;
else if ( W = = 1 & & op = = 1 )
return 0 ;
else if ( W = = 1 & & op = = 3 )
return 0 ;
abort ( ) ;
}
static int
decode_dsp32mac_0 ( int iw0 , int iw1 )
{
int result = 0 ;
/* dsp32mac
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 1 | 0 | 0 | . M . | 0 | 0 | . mmod . . . . . . . . . . | . MM | . P . | . w1 | . op1 . . . |
| . h01 | . h11 | . w0 | . op0 . . . | . h00 | . h10 | . dst . . . . . . . | . src0 . . . . . . | . src1 . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int op1 = ( ( iw0 > > ( DSP32Mac_op1_bits - 16 ) ) & DSP32Mac_op1_mask ) ;
int w1 = ( ( iw0 > > ( DSP32Mac_w1_bits - 16 ) ) & DSP32Mac_w1_mask ) ;
int P = ( ( iw0 > > ( DSP32Mac_p_bits - 16 ) ) & DSP32Mac_p_mask ) ;
int mmod = ( ( iw0 > > ( DSP32Mac_mmod_bits - 16 ) ) & DSP32Mac_mmod_mask ) ;
int w0 = ( ( iw1 > > DSP32Mac_w0_bits ) & DSP32Mac_w0_mask ) ;
int MM = ( ( iw1 > > DSP32Mac_MM_bits ) & DSP32Mac_MM_mask ) ;
int dst = ( ( iw1 > > DSP32Mac_dst_bits ) & DSP32Mac_dst_mask ) ;
int op0 = ( ( iw1 > > DSP32Mac_op0_bits ) & DSP32Mac_op0_mask ) ;
if ( w0 = = 0 & & w1 = = 0 & & op1 = = 3 & & op0 = = 3 )
return 0 ;
if ( op1 = = 3 & & MM )
return 0 ;
if ( ( w1 | | w0 ) & & mmod = = M_W32 )
return 0 ;
if ( ( ( 1 < < mmod ) & ( P ? 0x131b : 0x1b5f ) ) = = 0 )
return 0 ;
if ( w1 = = 1 | | op1 ! = 3 )
{
if ( w1 )
{
if ( P )
return DREG_MASK ( dst + 1 ) ;
else
return DREGH_MASK ( dst ) ;
}
}
if ( w0 = = 1 | | op0 ! = 3 )
{
if ( w0 )
{
if ( P )
return DREG_MASK ( dst ) ;
else
return DREGL_MASK ( dst ) ;
}
}
return result ;
}
static int
decode_dsp32mult_0 ( int iw0 , int iw1 )
{
/* dsp32mult
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 1 | 0 | 0 | . M . | 0 | 1 | . mmod . . . . . . . . . . | . MM | . P . | . w1 | . op1 . . . |
| . h01 | . h11 | . w0 | . op0 . . . | . h00 | . h10 | . dst . . . . . . . | . src0 . . . . . . | . src1 . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int w1 = ( ( iw0 > > ( DSP32Mac_w1_bits - 16 ) ) & DSP32Mac_w1_mask ) ;
int P = ( ( iw0 > > ( DSP32Mac_p_bits - 16 ) ) & DSP32Mac_p_mask ) ;
int mmod = ( ( iw0 > > ( DSP32Mac_mmod_bits - 16 ) ) & DSP32Mac_mmod_mask ) ;
int w0 = ( ( iw1 > > DSP32Mac_w0_bits ) & DSP32Mac_w0_mask ) ;
int dst = ( ( iw1 > > DSP32Mac_dst_bits ) & DSP32Mac_dst_mask ) ;
int result = 0 ;
if ( w1 = = 0 & & w0 = = 0 )
return 0 ;
if ( ( ( 1 < < mmod ) & ( P ? 0x313 : 0x1b57 ) ) = = 0 )
return 0 ;
if ( w1 )
{
if ( P )
return DREG_MASK ( dst | 1 ) ;
else
return DREGH_MASK ( dst ) ;
}
if ( w0 )
{
if ( P )
return DREG_MASK ( dst ) ;
else
return DREGL_MASK ( dst ) ;
}
return result ;
}
static int
decode_dsp32alu_0 ( int iw0 , int iw1 )
{
/* dsp32alu
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 1 | 0 | 0 | . M . | 1 | 0 | - | - | - | . HL | . aopcde . . . . . . . . . . . . |
| . aop . . . | . s . | . x . | . dst0 . . . . . . | . dst1 . . . . . . | . src0 . . . . . . | . src1 . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int s = ( ( iw1 > > DSP32Alu_s_bits ) & DSP32Alu_s_mask ) ;
int x = ( ( iw1 > > DSP32Alu_x_bits ) & DSP32Alu_x_mask ) ;
int aop = ( ( iw1 > > DSP32Alu_aop_bits ) & DSP32Alu_aop_mask ) ;
int dst0 = ( ( iw1 > > DSP32Alu_dst0_bits ) & DSP32Alu_dst0_mask ) ;
int dst1 = ( ( iw1 > > DSP32Alu_dst1_bits ) & DSP32Alu_dst1_mask ) ;
int HL = ( ( iw0 > > ( DSP32Alu_HL_bits - 16 ) ) & DSP32Alu_HL_mask ) ;
int aopcde = ( ( iw0 > > ( DSP32Alu_aopcde_bits - 16 ) ) & DSP32Alu_aopcde_mask ) ;
if ( aop = = 0 & & aopcde = = 9 & & s = = 0 )
return 0 ;
else if ( aop = = 2 & & aopcde = = 9 & & HL = = 0 & & s = = 0 )
return 0 ;
else if ( aop > = x * 2 & & aopcde = = 5 )
return HL ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( HL = = 0 & & aopcde = = 2 )
return DREGL_MASK ( dst0 ) ;
else if ( HL = = 1 & & aopcde = = 2 )
return DREGH_MASK ( dst0 ) ;
else if ( HL = = 0 & & aopcde = = 3 )
return DREGL_MASK ( dst0 ) ;
else if ( HL = = 1 & & aopcde = = 3 )
return DREGH_MASK ( dst0 ) ;
else if ( aop = = 0 & & aopcde = = 9 & & s = = 1 )
return 0 ;
else if ( aop = = 1 & & aopcde = = 9 & & s = = 0 )
return 0 ;
else if ( aop = = 2 & & aopcde = = 9 & & s = = 1 )
return 0 ;
else if ( aop = = 3 & & aopcde = = 9 & & s = = 0 )
return 0 ;
else if ( aopcde = = 8 )
return 0 ;
else if ( aop = = 0 & & aopcde = = 11 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 1 & & aopcde = = 11 )
return HL ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( aopcde = = 11 )
return 0 ;
else if ( aopcde = = 22 )
return DREG_MASK ( dst0 ) ;
else if ( ( aop = = 0 | | aop = = 1 ) & & aopcde = = 14 )
return 0 ;
else if ( aop = = 3 & & HL = = 0 & & aopcde = = 14 )
return 0 ;
else if ( aop = = 3 & & HL = = 0 & & aopcde = = 15 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 1 & & aopcde = = 16 )
return 0 ;
else if ( aop = = 0 & & aopcde = = 16 )
return 0 ;
else if ( aop = = 3 & & HL = = 0 & & aopcde = = 16 )
return 0 ;
else if ( aop = = 3 & & HL = = 0 & & aopcde = = 7 )
return DREG_MASK ( dst0 ) ;
else if ( ( aop = = 0 | | aop = = 1 | | aop = = 2 ) & & aopcde = = 7 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 0 & & aopcde = = 12 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 1 & & aopcde = = 12 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 3 & & aopcde = = 12 )
return HL ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( aopcde = = 0 )
return DREG_MASK ( dst0 ) ;
else if ( aopcde = = 1 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 0 & & aopcde = = 10 )
return DREGL_MASK ( dst0 ) ;
else if ( aop = = 1 & & aopcde = = 10 )
return DREGL_MASK ( dst0 ) ;
else if ( ( aop = = 1 | | aop = = 0 ) & & aopcde = = 4 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 2 & & aopcde = = 4 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 0 & & aopcde = = 17 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 1 & & aopcde = = 17 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 0 & & aopcde = = 18 )
return 0 ;
else if ( aop = = 3 & & aopcde = = 18 )
return 0 ;
else if ( ( aop = = 0 | | aop = = 1 | | aop = = 2 ) & & aopcde = = 6 )
return DREG_MASK ( dst0 ) ;
else if ( ( aop = = 0 | | aop = = 1 ) & & aopcde = = 20 )
return DREG_MASK ( dst0 ) ;
else if ( ( aop = = 0 | | aop = = 1 ) & & aopcde = = 21 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aop = = 0 & & aopcde = = 23 & & HL = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 0 & & aopcde = = 23 & & HL = = 0 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 0 & & aopcde = = 24 )
return DREG_MASK ( dst0 ) ;
else if ( aop = = 1 & & aopcde = = 24 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else if ( aopcde = = 13 )
return DREG_MASK ( dst0 ) | DREG_MASK ( dst1 ) ;
else
return 0 ;
return 4 ;
}
static int
decode_dsp32shift_0 ( int iw0 , int iw1 )
{
/* dsp32shift
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 1 | 0 | 0 | . M . | 1 | 1 | 0 | 0 | - | - | . sopcde . . . . . . . . . . . . |
| . sop . . . | . HLs . . . | . dst0 . . . . . . | - | - | - | . src0 . . . . . . | . src1 . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int HLs = ( ( iw1 > > DSP32Shift_HLs_bits ) & DSP32Shift_HLs_mask ) ;
int sop = ( ( iw1 > > DSP32Shift_sop_bits ) & DSP32Shift_sop_mask ) ;
int src0 = ( ( iw1 > > DSP32Shift_src0_bits ) & DSP32Shift_src0_mask ) ;
int src1 = ( ( iw1 > > DSP32Shift_src1_bits ) & DSP32Shift_src1_mask ) ;
int dst0 = ( ( iw1 > > DSP32Shift_dst0_bits ) & DSP32Shift_dst0_mask ) ;
int sopcde = ( ( iw0 > > ( DSP32Shift_sopcde_bits - 16 ) ) & DSP32Shift_sopcde_mask ) ;
if ( sop = = 0 & & sopcde = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 3 )
return 0 ;
else if ( sop = = 1 & & sopcde = = 3 )
return 0 ;
else if ( sop = = 2 & & sopcde = = 3 )
return 0 ;
else if ( sop = = 3 & & sopcde = = 3 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sopcde = = 2 )
return DREG_MASK ( dst0 ) ;
else if ( sopcde = = 4 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 5 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 5 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 5 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 6 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 6 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 3 & & sopcde = = 6 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 7 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 7 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 7 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 3 & & sopcde = = 7 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 8 )
return DREG_MASK ( src0 ) | DREG_MASK ( src1 ) ;
#if 0
{
OUTS ( outf , " BITMUX ( " ) ;
OUTS ( outf , dregs ( src0 ) ) ;
OUTS ( outf , " , " ) ;
OUTS ( outf , dregs ( src1 ) ) ;
OUTS ( outf , " , A0) (ASR) " ) ;
}
# endif
else if ( sop = = 1 & & sopcde = = 8 )
return DREG_MASK ( src0 ) | DREG_MASK ( src1 ) ;
#if 0
{
OUTS ( outf , " BITMUX ( " ) ;
OUTS ( outf , dregs ( src0 ) ) ;
OUTS ( outf , " , " ) ;
OUTS ( outf , dregs ( src1 ) ) ;
OUTS ( outf , " , A0) (ASL) " ) ;
}
# endif
else if ( sopcde = = 9 )
return sop < 2 ? DREGL_MASK ( dst0 ) : DREG_MASK ( dst0 ) ;
else if ( sopcde = = 10 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 11 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 11 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 12 )
return 0 ;
else if ( sop = = 1 & & sopcde = = 12 )
return DREGL_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 13 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 13 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 13 )
return DREG_MASK ( dst0 ) ;
abort ( ) ;
}
static int
decode_dsp32shiftimm_0 ( int iw0 , int iw1 )
{
/* dsp32shiftimm
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - +
| 1 | 1 | 0 | 0 | . M . | 1 | 1 | 0 | 1 | - | - | . sopcde . . . . . . . . . . . . |
| . sop . . . | . HLs . . . | . dst0 . . . . . . | . immag . . . . . . . . . . . . . . . . . | . src1 . . . . . . |
+ - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - | - - - + - - - + - - - + - - - + */
int sop = ( ( iw1 > > DSP32ShiftImm_sop_bits ) & DSP32ShiftImm_sop_mask ) ;
int bit8 = ( ( iw1 > > 8 ) & 0x1 ) ;
int dst0 = ( ( iw1 > > DSP32ShiftImm_dst0_bits ) & DSP32ShiftImm_dst0_mask ) ;
int sopcde = ( ( iw0 > > ( DSP32ShiftImm_sopcde_bits - 16 ) ) & DSP32ShiftImm_sopcde_mask ) ;
int HLs = ( ( iw1 > > DSP32ShiftImm_HLs_bits ) & DSP32ShiftImm_HLs_mask ) ;
if ( sop = = 0 & & sopcde = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 0 & & bit8 = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 0 & & bit8 = = 1 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 0 & & bit8 = = 0 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 0 & & bit8 = = 1 )
return HLs & 2 ? DREGH_MASK ( dst0 ) : DREGL_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 3 & & HLs = = 1 )
return 0 ;
else if ( sop = = 0 & & sopcde = = 3 & & HLs = = 0 & & bit8 = = 0 )
return 0 ;
else if ( sop = = 0 & & sopcde = = 3 & & HLs = = 0 & & bit8 = = 1 )
return 0 ;
else if ( sop = = 0 & & sopcde = = 3 & & HLs = = 1 & & bit8 = = 0 )
return 0 ;
else if ( sop = = 0 & & sopcde = = 3 & & HLs = = 1 & & bit8 = = 1 )
return 0 ;
else if ( sop = = 1 & & sopcde = = 3 & & HLs = = 0 )
return 0 ;
else if ( sop = = 1 & & sopcde = = 3 & & HLs = = 1 )
return 0 ;
else if ( sop = = 2 & & sopcde = = 3 & & HLs = = 0 )
return 0 ;
else if ( sop = = 1 & & sopcde = = 1 & & bit8 = = 0 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 1 & & bit8 = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 1 & & bit8 = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 1 & & bit8 = = 0 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 1 & & sopcde = = 2 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 2 & & bit8 = = 1 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 2 & & sopcde = = 2 & & bit8 = = 0 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 3 & & sopcde = = 2 )
return DREG_MASK ( dst0 ) ;
else if ( sop = = 0 & & sopcde = = 2 )
return DREG_MASK ( dst0 ) ;
abort ( ) ;
}
int
insn_regmask ( int iw0 , int iw1 )
{
if ( ( iw0 & 0xf7ff ) = = 0xc003 & & iw1 = = 0x1800 )
return 0 ; /* MNOP */
else if ( ( iw0 & 0xff00 ) = = 0x0000 )
return decode_ProgCtrl_0 ( iw0 ) ;
else if ( ( iw0 & 0xffc0 ) = = 0x0240 )
abort ( ) ;
else if ( ( iw0 & 0xff80 ) = = 0x0100 )
abort ( ) ;
else if ( ( iw0 & 0xfe00 ) = = 0x0400 )
abort ( ) ;
else if ( ( iw0 & 0xfe00 ) = = 0x0600 )
abort ( ) ;
else if ( ( iw0 & 0xf800 ) = = 0x0800 )
abort ( ) ;
else if ( ( iw0 & 0xffe0 ) = = 0x0200 )
abort ( ) ;
else if ( ( iw0 & 0xff00 ) = = 0x0300 )
abort ( ) ;
else if ( ( iw0 & 0xf000 ) = = 0x1000 )
abort ( ) ;
else if ( ( iw0 & 0xf000 ) = = 0x2000 )
abort ( ) ;
else if ( ( iw0 & 0xf000 ) = = 0x3000 )
abort ( ) ;
else if ( ( iw0 & 0xfc00 ) = = 0x4000 )
abort ( ) ;
else if ( ( iw0 & 0xfe00 ) = = 0x4400 )
abort ( ) ;
else if ( ( iw0 & 0xf800 ) = = 0x4800 )
abort ( ) ;
else if ( ( iw0 & 0xf000 ) = = 0x5000 )
abort ( ) ;
else if ( ( iw0 & 0xf800 ) = = 0x6000 )
abort ( ) ;
else if ( ( iw0 & 0xf800 ) = = 0x6800 )
abort ( ) ;
else if ( ( iw0 & 0xf000 ) = = 0x8000 )
return decode_LDSTpmod_0 ( iw0 ) ;
else if ( ( iw0 & 0xff60 ) = = 0x9e60 )
return decode_dagMODim_0 ( iw0 ) ;
else if ( ( iw0 & 0xfff0 ) = = 0x9f60 )
return decode_dagMODik_0 ( iw0 ) ;
else if ( ( iw0 & 0xfc00 ) = = 0x9c00 )
return decode_dspLDST_0 ( iw0 ) ;
else if ( ( iw0 & 0xf000 ) = = 0x9000 )
return decode_LDST_0 ( iw0 ) ;
else if ( ( iw0 & 0xfc00 ) = = 0xb800 )
return decode_LDSTiiFP_0 ( iw0 ) ;
else if ( ( iw0 & 0xe000 ) = = 0xA000 )
return decode_LDSTii_0 ( iw0 ) ;
else if ( ( iw0 & 0xff80 ) = = 0xe080 & & ( iw1 & 0x0C00 ) = = 0x0000 )
abort ( ) ;
else if ( ( iw0 & 0xff00 ) = = 0xe100 & & ( iw1 & 0x0000 ) = = 0x0000 )
abort ( ) ;
else if ( ( iw0 & 0xfe00 ) = = 0xe200 & & ( iw1 & 0x0000 ) = = 0x0000 )
abort ( ) ;
else if ( ( iw0 & 0xfc00 ) = = 0xe400 & & ( iw1 & 0x0000 ) = = 0x0000 )
abort ( ) ;
else if ( ( iw0 & 0xfffe ) = = 0xe800 & & ( iw1 & 0x0000 ) = = 0x0000 )
abort ( ) ;
else if ( ( iw0 & 0xf600 ) = = 0xc000 & & ( iw1 & 0x0000 ) = = 0x0000 )
return decode_dsp32mac_0 ( iw0 , iw1 ) ;
else if ( ( iw0 & 0xf600 ) = = 0xc200 & & ( iw1 & 0x0000 ) = = 0x0000 )
return decode_dsp32mult_0 ( iw0 , iw1 ) ;
else if ( ( iw0 & 0xf7c0 ) = = 0xc400 & & ( iw1 & 0x0000 ) = = 0x0000 )
return decode_dsp32alu_0 ( iw0 , iw1 ) ;
else if ( ( iw0 & 0xf780 ) = = 0xc600 & & ( iw1 & 0x01c0 ) = = 0x0000 )
return decode_dsp32shift_0 ( iw0 , iw1 ) ;
else if ( ( iw0 & 0xf780 ) = = 0xc680 & & ( iw1 & 0x0000 ) = = 0x0000 )
return decode_dsp32shiftimm_0 ( iw0 , iw1 ) ;
else if ( ( iw0 & 0xff00 ) = = 0xf800 )
abort ( ) ;
else if ( ( iw0 & 0xFFC0 ) = = 0xf000 & & ( iw1 & 0x0000 ) = = 0x0000 )
abort ( ) ;
abort ( ) ;
}