📄 dsp16xx.md
字号:
}")(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 + -