📄 mn10300.md
字号:
"{ if (flag_pic && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) { if (MN10300_GLOBAL_P (XEXP (operands[0], 0))) { /* The PLT code won't run on AM30, but then, there's no shared library support for AM30 either, so we just assume the linker is going to adjust all @PLT relocs to the actual symbols. */ emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx)); XEXP (operands[0], 0) = gen_sym2PLT (XEXP (operands[0], 0)); } else XEXP (operands[0], 0) = gen_sym2PIC (XEXP (operands[0], 0)); } if (! call_address_operand (XEXP (operands[0], 0), VOIDmode)) XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0)); emit_call_insn (gen_call_internal (XEXP (operands[0], 0), operands[1])); DONE;}")(define_insn "call_internal" [(call (mem:QI (match_operand:SI 0 "call_address_operand" "aS")) (match_operand:SI 1 "general_operand" "g"))] "" "*{ if (REG_P (operands[0])) return \"calls %C0\"; else return \"call %C0,[],0\";}" [(set_attr "cc" "clobber")]);; Call subroutine, returning value in operand 0;; (which must be a hard register).(define_expand "call_value" [(set (match_operand 0 "" "") (call (match_operand:QI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ if (flag_pic && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) { if (MN10300_GLOBAL_P (XEXP (operands[1], 0))) { /* The PLT code won't run on AM30, but then, there's no shared library support for AM30 either, so we just assume the linker is going to adjust all @PLT relocs to the actual symbols. */ emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx)); XEXP (operands[1], 0) = gen_sym2PLT (XEXP (operands[1], 0)); } else XEXP (operands[1], 0) = gen_sym2PIC (XEXP (operands[1], 0)); } if (! call_address_operand (XEXP (operands[1], 0), VOIDmode)) XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0)); emit_call_insn (gen_call_value_internal (operands[0], XEXP (operands[1], 0), operands[2])); DONE;}")(define_insn "call_value_internal" [(set (match_operand 0 "" "=dax") (call (mem:QI (match_operand:SI 1 "call_address_operand" "aS")) (match_operand:SI 2 "general_operand" "g")))] "" "*{ if (REG_P (operands[1])) return \"calls %C1\"; else return \"call %C1,[],0\";}" [(set_attr "cc" "clobber")])(define_expand "untyped_call" [(parallel [(call (match_operand 0 "" "") (const_int 0)) (match_operand 1 "" "") (match_operand 2 "" "")])] "" "{ int i; emit_call_insn (gen_call (operands[0], const0_rtx)); for (i = 0; i < XVECLEN (operands[2], 0); i++) { rtx set = XVECEXP (operands[2], 0, i); emit_move_insn (SET_DEST (set), SET_SRC (set)); } DONE;}")(define_insn "nop" [(const_int 0)] "" "nop" [(set_attr "cc" "none")]);; ----------------------------------------------------------------------;; EXTEND INSTRUCTIONS;; ----------------------------------------------------------------------(define_expand "zero_extendqisi2" [(set (match_operand:SI 0 "general_operand" "") (zero_extend:SI (match_operand:QI 1 "general_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,dx,!dax,!dax,!dax") (zero_extend:SI (match_operand:QI 1 "general_operand" "0,dax,m,0,dax,m")))] "TARGET_AM33" "@ extbu %0 mov %1,%0\;extbu %0 movbu %1,%0 extbu %0 mov %1,%0\;extbu %0 movbu %1,%0" [(set_attr "cc" "none_0hit")])(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,dx") (zero_extend:SI (match_operand:QI 1 "general_operand" "0,d,m")))] "" "@ extbu %0 mov %1,%0\;extbu %0 movbu %1,%0" [(set_attr "cc" "none_0hit")])(define_expand "zero_extendhisi2" [(set (match_operand:SI 0 "general_operand" "") (zero_extend:SI (match_operand:HI 1 "general_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,dx,!dax,!dax,!dax") (zero_extend:SI (match_operand:HI 1 "general_operand" "0,dax,m,0,dax,m")))] "TARGET_AM33" "@ exthu %0 mov %1,%0\;exthu %0 movhu %1,%0 exthu %0 mov %1,%0\;exthu %0 movhu %1,%0" [(set_attr "cc" "none_0hit")])(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,dx") (zero_extend:SI (match_operand:HI 1 "general_operand" "0,dx,m")))] "" "@ exthu %0 mov %1,%0\;exthu %0 movhu %1,%0" [(set_attr "cc" "none_0hit")]);;- sign extension instructions(define_expand "extendqisi2" [(set (match_operand:SI 0 "general_operand" "") (sign_extend:SI (match_operand:QI 1 "general_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,!dax,!dax") (sign_extend:SI (match_operand:QI 1 "general_operand" "0,dx,0,dax")))] "TARGET_AM33" "@ extb %0 mov %1,%0\;extb %0 extb %0 mov %1,%0\;extb %0" [(set_attr "cc" "none_0hit")])(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx") (sign_extend:SI (match_operand:QI 1 "general_operand" "0,dx")))] "" "@ extb %0 mov %1,%0\;extb %0" [(set_attr "cc" "none_0hit")])(define_expand "extendhisi2" [(set (match_operand:SI 0 "general_operand" "") (sign_extend:SI (match_operand:HI 1 "general_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx,!dax,!dax") (sign_extend:SI (match_operand:HI 1 "general_operand" "0,dax,0,dax")))] "TARGET_AM33" "@ exth %0 mov %1,%0\;exth %0 exth %0 mov %1,%0\;exth %0" [(set_attr "cc" "none_0hit")])(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=dx,dx") (sign_extend:SI (match_operand:HI 1 "general_operand" "0,dx")))] "" "@ exth %0 mov %1,%0\;exth %0" [(set_attr "cc" "none_0hit")]);; ----------------------------------------------------------------------;; SHIFTS;; ----------------------------------------------------------------------(define_expand "ashlsi3" [(set (match_operand:SI 0 "register_operand" "") (ashift:SI (match_operand:SI 1 "register_operand" "") (match_operand:QI 2 "nonmemory_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dax,dx,!dax") (ashift:SI (match_operand:SI 1 "register_operand" "0,0,dax") (match_operand:QI 2 "nonmemory_operand" "J,dxi,dax")))] "TARGET_AM33" "*{ if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 1) return \"add %0,%0\"; if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 2) return \"asl2 %0\"; if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 3 && REGNO_REG_CLASS (true_regnum (operands[0])) == DATA_REGS) return \"asl2 %0\;add %0,%0\"; if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 4 && REGNO_REG_CLASS (true_regnum (operands[0])) == DATA_REGS) return \"asl2 %0\;asl2 %0\"; if (true_regnum (operands[1]) == true_regnum (operands[0])) return \"asl %S2,%0\"; if (REGNO_REG_CLASS (true_regnum (operands[0])) == DATA_REGS && REGNO_REG_CLASS (true_regnum (operands[1])) == DATA_REGS && true_regnum (operands[0]) != true_regnum (operands[2])) return \"mov %1,%0\;asl %S2,%0\"; return \"asl %2,%1,%0\";}" [(set_attr "cc" "set_zn")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dax,dx,dx,dx,dx") (ashift:SI (match_operand:SI 1 "register_operand" "0,0,0,0,0") (match_operand:QI 2 "nonmemory_operand" "J,K,M,L,dxi")))] "" "@ add %0,%0 asl2 %0 asl2 %0\;add %0,%0 asl2 %0\;asl2 %0 asl %S2,%0" [(set_attr "cc" "set_zn")])(define_expand "lshrsi3" [(set (match_operand:SI 0 "register_operand" "") (lshiftrt:SI (match_operand:SI 1 "register_operand" "") (match_operand:QI 2 "nonmemory_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dx,!dax") (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,dax") (match_operand:QI 2 "nonmemory_operand" "dxi,dax")))] "TARGET_AM33" "*{ if (true_regnum (operands[1]) == true_regnum (operands[0])) return \"lsr %S2,%0\"; if (REGNO_REG_CLASS (true_regnum (operands[0])) == DATA_REGS && REGNO_REG_CLASS (true_regnum (operands[1])) == DATA_REGS && true_regnum (operands[0]) != true_regnum (operands[2])) return \"mov %1,%0\;lsr %S2,%0\"; return \"lsr %2,%1,%0\";}" [(set_attr "cc" "set_zn")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dx") (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") (match_operand:QI 2 "nonmemory_operand" "dxi")))] "" "lsr %S2,%0" [(set_attr "cc" "set_zn")])(define_expand "ashrsi3" [(set (match_operand:SI 0 "register_operand" "") (ashiftrt:SI (match_operand:SI 1 "register_operand" "") (match_operand:QI 2 "nonmemory_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dx,!dax") (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,dax") (match_operand:QI 2 "nonmemory_operand" "dxi,dax")))] "TARGET_AM33" "*{ if (true_regnum (operands[1]) == true_regnum (operands[0])) return \"asr %S2,%0\"; if (REGNO_REG_CLASS (true_regnum (operands[0])) == DATA_REGS && REGNO_REG_CLASS (true_regnum (operands[1])) == DATA_REGS && true_regnum (operands[0]) != true_regnum (operands[2])) return \"mov %1,%0\;asr %S2,%0\"; return \"asr %2,%1,%0\";}" [(set_attr "cc" "set_zn")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=dx") (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") (match_operand:QI 2 "nonmemory_operand" "dxi")))] "" "asr %S2,%0" [(set_attr "cc" "set_zn")]);; ----------------------------------------------------------------------;; FP INSTRUCTIONS;; ----------------------------------------------------------------------;;;; The mn103 series does not have floating point instructions, but since;; FP values are held in integer regs, we can clear the high bit easily;; which gives us an efficient inline floating point absolute value.;;;; Similarly for negation of a FP value.;;(define_expand "absdf2" [(set (match_operand:DF 0 "register_operand" "") (abs:DF (match_operand:DF 1 "register_operand" "")))] "" "{ rtx target, result, insns; start_sequence (); target = operand_subword (operands[0], 1, 1, DFmode); result = expand_binop (SImode, and_optab, operand_subword_force (operands[1], 1, DFmode), GEN_INT (0x7fffffff), target, 0, OPTAB_WIDEN); if (result == 0) abort (); if (result != target) emit_move_insn (result, target); emit_move_insn (operand_subword (operands[0], 0, 1, DFmode), operand_subword_force (operands[1], 0, DFmode)); insns = get_insns (); end_sequence (); emit_no_conflict_block (insns, operands[0], operands[1], 0, 0); DONE;}")(define_expand "abssf2" [(set (match_operand:SF 0 "register_operand" "") (abs:SF (match_operand:SF 1 "register_operand" "")))] "" "{ rtx result; rtx target; if (TARGET_AM33_2) { emit_insn (gen_abssf2_am33_2 (operands[0], operands[1])); DONE; } target = operand_subword_force (operands[0], 0, SFmode); result = expand_binop (SImode, and_optab, operand_subword_force (operands[1], 0, SFmode), GEN_INT (0x7fffffff), target, 0, OPTAB_WIDEN); if (result == 0) abort (); if (result != target) emit_move_insn (result, target); /* Make a place for REG_EQUAL. */ emit_move_insn (operands[0], operands[0]); DONE;}")(define_insn "abssf2_am33_2" [(set (match_operand:SF 0 "register_operand" "=f,f") (abs:SF (match_operand:SF 1 "register_operand" "0,?f")))] "TARGET_AM33_2" "@ fabs %0 fabs %1, %0" [(set_attr "cc" "none_0hit")])(define_expand "negdf2" [(set (match_operand:DF 0 "regi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -