⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp16xx.md

📁 gcc编译工具没有什么特别
💻 MD
📖 第 1 页 / 共 4 页
字号:
}")(define_expand "reload_outhi"  [(set (match_operand:HI 0 "register_operand" "=r")        (match_operand:HI 1 "register_operand" "r"))   (clobber (match_operand:QI 2 "register_operand" "=&h"))]  ""  "{	emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HImode));	emit_move_insn (operand_subword (operands[0], 0, 0, HImode), operands[2]);	emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HImode));	emit_move_insn (operand_subword (operands[0], 1, 0, HImode), operands[2]);	DONE;}")(define_expand "movstrqi"  [(parallel [(set (match_operand:BLK 0 "memory_operand" "")		   (match_operand:BLK 1 "memory_operand" ""))	      (use (match_operand:QI 2 "const_int_operand" ""))	      (use (match_operand:QI 3 "const_int_operand" ""))	      (clobber (match_scratch:QI 4 ""))	      (clobber (match_dup 5))	      (clobber (match_dup 6))])]  ""  "{  rtx addr0, addr1;  if (GET_CODE (operands[2]) != CONST_INT)    FAIL;  if (INTVAL(operands[2]) > 127)    FAIL;  addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));  addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));  operands[5] = addr0;  operands[6] = addr1;  operands[0] = change_address (operands[0], VOIDmode, addr0);  operands[1] = change_address (operands[1], VOIDmode, addr1);}")(define_insn ""  [(set (mem:BLK (match_operand:QI 0 "register_operand" "a"))	(mem:BLK (match_operand:QI 1 "register_operand" "a")))   (use (match_operand:QI 2 "const_int_operand" "n"))   (use (match_operand:QI 3 "immediate_operand" "i"))   (clobber (match_scratch:QI 4 "=x"))   (clobber (match_dup 0))   (clobber (match_dup 1))]  ""  "*{ return output_block_move (operands); }");; Floating point move insns(define_expand "movhf"  [(set (match_operand:HF 0 "general_operand" "")	(match_operand:HF 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, HFmode))    DONE;}")(define_insn "match_movhf"  [(set (match_operand:HF 0 "nonimmediate_operand" "=A,Z,d,d,m,d,Y")	(match_operand:HF 1 "general_operand"       "d,A,F,m,d,Y,d"))]  ""  "*{	/* NOTE: When loading the register 16 bits at a time we	   MUST load the high half FIRST (because the 1610 zeros	   the low half) and then load the low half */	switch (which_alternative)        {		/* register to accumulator */		case 0: 		   return \"%0=%1\";		case 1:		   return \"%u0=%u1\;%w0=%w1\";		case 2:		   output_dsp16xx_float_const(operands);		   return \"\";		case 3:		   double_reg_from_memory(operands);		   return \"\";		case 4:		   double_reg_to_memory(operands);		   return \"\";		case 5:		case 6:		   return \"%u0=%u1\;%w0=%w1\";        }}"[(set_attr "type" "move,move,load_i,load,store,load,store")])(define_expand "reload_inhf"  [(set (match_operand:HF 0 "register_operand" "=r")        (match_operand:HF 1 "register_operand" "r"))   (clobber (match_operand:QI 2 "register_operand" "=&h"))]  ""  "{  /* Check for an overlap of operand 2 (an accumulator) with     the msw of operand 0. If we have an overlap we must reverse     the order of the moves. */  if (REGNO(operands[2]) == REGNO(operands[0]))    {      emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode));      emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]);      emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode));      emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]);    }  else    {      emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode));      emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]);      emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode));      emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]);    }    DONE;}")(define_expand "reload_outhf"  [(set (match_operand:HF 0 "register_operand" "=r")        (match_operand:HF 1 "register_operand" "r"))   (clobber (match_operand:QI 2 "register_operand" "=&h"))]  ""  "{	emit_move_insn (operands[2], operand_subword (operands[1], 0, 0, HFmode));	emit_move_insn (operand_subword (operands[0], 0, 0, HFmode), operands[2]);	emit_move_insn (operands[2], operand_subword (operands[1], 1, 0, HFmode));	emit_move_insn (operand_subword (operands[0], 1, 0, HFmode), operands[2]);	DONE;}");;;; CONVERSION INSTRUCTIONS;;(define_expand "extendqihi2"  [(clobber (match_dup 2))   (set (match_dup 3) (match_operand:QI 1 "register_operand" ""))   (set (match_operand:HI 0 "register_operand" "")	(ashift:HI (match_dup 2)		   (const_int 16)))   (set (match_dup 0)	(ashiftrt:HI (match_dup 0) (const_int 16)))]  ""  "{	operands[2] = gen_reg_rtx (HImode);	operands[3] = gen_rtx (SUBREG, QImode, operands[2], 1);}");;(define_insn "extendqihi2";;  [(set (match_operand:HI 0 "register_operand" "=A");;        (sign_extend:HI (match_operand:QI 1 "register_operand" "h")))];;  "";;  "%0 = %1 >> 16");;(define_insn "zero_extendqihi2";;  [(set (match_operand:HI 0 "register_operand" "=t,f,A,?d,?A");;        (zero_extend:HI (match_operand:QI 1 "register_operand" "w,z,ku,A,r")))];;  "";;  "*;; {;;  switch (which_alternative);;    {;;    case 0:;;    case 1:;;      return \"%0=0\";;;;;    case 2:;;      if (REGNO(operands[1]) == (REGNO(operands[0]) + 1));;        return \"%0=0\";;;      else;;	return \"%w0=%1\;%0=0\";;;    case 3:;;      return \"%w0=%1\;%0=0\";;;;;    case 4:;;      if (REGNO(operands[1]) == REG_Y || REGNO(operands[1]) == REG_PROD;;	  || IS_ACCUM_REG(REGNO(operands[1])));;	return \"move %w0=%1\;%0=0\";;;      else;;	return \"%w0=%1\;%0=0\";;;    };; }")(define_expand "zero_extendqihi2"  [(clobber (match_dup 2))   (set (match_dup 3) (match_operand:QI 1 "register_operand" ""))   (set (match_operand:HI 0 "register_operand" "")	(ashift:HI (match_dup 2)		   (const_int 16)))   (set (match_dup 0)	(lshiftrt:HI (match_dup 0) (const_int 16)))]  ""  "{	operands[2] = gen_reg_rtx (HImode);	operands[3] = gen_rtx (SUBREG, QImode, operands[2], 1);}")(define_expand "floathihf2"  [(set (match_operand:HF 0 "register_operand" "")	(float:HF (match_operand:HI 1 "register_operand" "")))]  ""  "{  if (!dsp16xx_floathihf2_libcall)    dsp16xx_floathihf2_libcall = gen_rtx_SYMBOL_REF (Pmode, FLOATHIHF2_LIBCALL);    emit_library_call (dsp16xx_floathihf2_libcall, 1, HFmode, 1,		     operands[1], HImode);  emit_move_insn (operands[0], hard_libcall_value(HFmode));  DONE;}")(define_expand "fix_trunchfhi2"  [(set (match_operand:HI 0 "register_operand" "")	(fix:HI (match_operand:HF 1 "register_operand" "")))]  ""  "{  if (!dsp16xx_fixhfhi2_libcall)    dsp16xx_fixhfhi2_libcall = gen_rtx_SYMBOL_REF (Pmode, FIXHFHI2_LIBCALL);    emit_library_call (dsp16xx_fixhfhi2_libcall, 1, HImode, 1,		     operands[1], HFmode);  emit_move_insn (operands[0], hard_libcall_value(HImode));  DONE;}")(define_expand "fixuns_trunchfhi2"  [(set (match_operand:HI 0 "register_operand" "")	(unsigned_fix:HI (match_operand:HF 1 "register_operand" "")))]  ""  "{  rtx reg1 = gen_reg_rtx (HFmode);  rtx reg2 = gen_reg_rtx (HFmode);  rtx reg3 = gen_reg_rtx (HImode);  rtx label1 = gen_label_rtx ();  rtx label2 = gen_label_rtx ();  REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);  if (reg1)			/* turn off complaints about unreached code */    {      emit_move_insn (reg1, immed_real_const_1 (offset, HFmode));      do_pending_stack_adjust ();      emit_insn (gen_cmphf (operands[1], reg1));      emit_jump_insn (gen_bge (label1));      emit_insn (gen_fix_trunchfhi2 (operands[0], operands[1]));      emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,			       gen_rtx (LABEL_REF, VOIDmode, label2)));      emit_barrier ();      emit_label (label1);      emit_insn (gen_subhf3 (reg2, operands[1], reg1));      emit_move_insn (reg3, GEN_INT (0x80000000));;      emit_insn (gen_fix_trunchfhi2 (operands[0], reg2));      emit_insn (gen_iorhi3 (operands[0], operands[0], reg3));      emit_label (label2);      /* allow REG_NOTES to be set on last insn (labels don't have enough	 fields, and can't be used for REG_NOTES anyway).  */      emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));      DONE;    }}");;;; SHIFT INSTRUCTIONS;;(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 1)))]  ""  "%0=%1>>1"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 4)))]  ""  "%0=%1>>4"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 8)))]  ""  "%0=%1>>8"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 16)))]  ""  "%0=%1>>16"  [(set_attr "type" "special")]);;;; Arithmetic Right shift(define_expand "ashrhi3"  [(set (match_operand:HI 0 "register_operand" "")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "")                     (match_operand:QI 2 "nonmemory_operand" "")))]  ""  "{  if (!TARGET_BMU)  {      /* If we are shifting by a constant we can do it in 1 or more	 1600 core shift instructions. The core instructions can	 shift by 1, 4, 8, or 16. */            if (GET_CODE(operands[2]) == CONST_INT)	;      else      {	rtx label1 = gen_label_rtx ();	rtx label2 = gen_label_rtx ();#if 0	if (!dsp16xx_ashrhi3_libcall)	  dsp16xx_ashrhi3_libcall = gen_rtx_SYMBOL_REF (Pmode, ASHRHI3_LIBCALL);	  emit_library_call (dsp16xx_ashrhi3_libcall, 1, HImode, 2,			     operands[1], HImode,			     operands[2], QImode);	  emit_move_insn (operands[0], hard_libcall_value(HImode));	  DONE;#else	do_pending_stack_adjust ();	emit_insn (gen_tstqi (operands[2]));	emit_jump_insn (gen_bne (label1));	emit_move_insn (operands[0], operands[1]);	emit_jump_insn (gen_jump (label2));	emit_barrier ();	emit_label (label1);	if (GET_CODE(operands[2]) != MEM)	  {	    rtx stack_slot;	    	    stack_slot = assign_stack_temp (QImode, GET_MODE_SIZE(QImode), 0);	    stack_slot = change_address (stack_slot, VOIDmode, XEXP (stack_slot, 0));	    emit_move_insn (stack_slot, operands[2]);	    operands[2] = stack_slot;	  }	emit_insn (gen_match_ashrhi3_nobmu (operands[0], operands[1], operands[2]));	emit_label (label2);	DONE;#endif      }  }}")(define_insn "match_ashrhi3_bmu"  [(set (match_operand:HI 0 "register_operand" "=A,A,A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A,A,!A")                     (match_operand:QI 2 "nonmemory_operand" "B,I,h")))]  "TARGET_BMU"  "@   %0=%1>>%2   %0=%1>>%H2   %0=%1>>%2"  [(set_attr "type" "shift,shift_i,shift")])(define_insn "match_ashrhi3_nobmu"  [(set (match_operand:HI 0 "register_operand" "=A,A")        (ashiftrt:HI (match_operand:HI 1 "register_operand" "A,0")                     (match_operand:QI 2 "general_operand" "n,m")))]  "!TARGET_BMU"  "*{  if (which_alternative == 0)    {      emit_1600_core_shift (ASHIFTRT, operands, INTVAL(operands[2]));      return \"\";    }  else    {      output_asm_insn (\"cloop=%2\", operands);      output_asm_insn (\"do 0 \{\", operands);      output_asm_insn (\"%0=%0>>1\", operands);      return \"\}\";    }}")		   ;;;; Logical Right Shift(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 1)))]  ""  "%0=%1>>1\;%0=%b0&0x7fff"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 4)))]  ""  "%0=%1>>4\;%0=%b0&0x0fff"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 8)))]  ""  "%0=%1>>8\;%0=%b0&0x00ff"  [(set_attr "type" "special")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A")                     (const_int 16)))]  ""  "%0=%1>>16\;%0=%b0&0x0000"  [(set_attr "type" "special")])(define_expand "lshrhi3"  [(set (match_operand:HI 0 "register_operand" "")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "")                     (match_operand:QI 2 "nonmemory_operand" "")))]  ""  "{  if (!TARGET_BMU)    {      /* If we are shifting by a constant we can do it in 1 or more	 1600 core shift instructions. The core instructions can	 shift by 1, 4, 8, or 16. */            if (GET_CODE(operands[2]) == CONST_INT)	emit_insn (gen_match_lshrhi3_nobmu (operands[0], operands[1], operands[2]));	      else	{	  rtx label1 = gen_label_rtx ();	  rtx label2 = gen_label_rtx ();#if 0	  if (!dsp16xx_lshrhi3_libcall)	    dsp16xx_lshrhi3_libcall = gen_rtx_SYMBOL_REF (Pmode, LSHRHI3_LIBCALL);	  	  emit_library_call (dsp16xx_lshrhi3_libcall, 1, HImode, 2,			     operands[1], HImode,			     operands[2], QImode);	  emit_move_insn (operands[0], hard_libcall_value(HImode));	  DONE;#else	  do_pending_stack_adjust ();	  emit_insn (gen_tstqi (operands[2]));	  emit_jump_insn (gen_bne (label1));	  emit_move_insn (operands[0], operands[1]);	  emit_jump_insn (gen_jump (label2));	  emit_barrier ();	  emit_label (label1);	  if (GET_CODE(operands[2]) != MEM)	    {	      rtx stack_slot;	    	      stack_slot = assign_stack_temp (QImode, GET_MODE_SIZE(QImode), 0);	      stack_slot = change_address (stack_slot, VOIDmode, XEXP (stack_slot, 0));	      emit_move_insn (stack_slot, operands[2]);	      operands[2] = stack_slot;	    }	  emit_insn (gen_match_lshrhi3_nobmu (operands[0], operands[1], operands[2]));	  emit_label (label2);	  DONE;#endif	}    }}")(define_insn "match_lshrhi3"  [(set (match_operand:HI 0 "register_operand" "=A,A,A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A,A,!A")                     (match_operand:QI 2 "nonmemory_operand" "B,I,h")))]  "TARGET_BMU"  "@   %0=%1>>>%2   %0=%1>>>%H2   %0=%1>>>%2"  [(set_attr "type" "shift,shift_i,shift")])(define_insn "match_lshrhi3_nobmu"  [(set (match_operand:HI 0 "register_operand" "=A,A")        (lshiftrt:HI (match_operand:HI 1 "register_operand" "A,0")                     (match_operand:QI 2 "general_operand" "n,m")))   (clobber (match_scratch:QI 3 "=X,Y"))]  "!TARGET_BMU"  "*{  if (which_alternative == 0)    {      emit_1600_core_shift (LSHIFTRT, operands, INTVAL(operands[2]));      return \"\";    }  else    {      output_asm_insn (\"%3=psw\;psw=0\",operands);      output_asm_insn (\"cloop=%2\", operands);      output_asm_insn (\"do 0 \{\", operands);      output_asm_insn (\"%0=%0>>1\", operands);      output_asm_insn (\"\}\", operands);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -