📄 xtensa.md
字号:
(define_insn "nsau" [(set (match_operand:SI 0 "register_operand" "=a") (unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_NSAU))] "TARGET_NSA" "nsau\t%0, %1" [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")]);; Negation and one's complement.(define_insn "negsi2" [(set (match_operand:SI 0 "register_operand" "=a") (neg:SI (match_operand:SI 1 "register_operand" "r")))] "" "neg\t%0, %1" [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")])(define_expand "one_cmplsi2" [(set (match_operand:SI 0 "register_operand" "") (not:SI (match_operand:SI 1 "register_operand" "")))] ""{ rtx temp = gen_reg_rtx (SImode); emit_insn (gen_movsi (temp, constm1_rtx)); emit_insn (gen_xorsi3 (operands[0], temp, operands[1])); DONE;})(define_insn "negsf2" [(set (match_operand:SF 0 "register_operand" "=f") (neg:SF (match_operand:SF 1 "register_operand" "f")))] "TARGET_HARD_FLOAT" "neg.s\t%0, %1" [(set_attr "type" "farith") (set_attr "mode" "SF") (set_attr "length" "3")]);; Logical instructions.(define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=a,a") (and:SI (match_operand:SI 1 "register_operand" "%r,r") (match_operand:SI 2 "mask_operand" "P,r")))] "" "@ extui\t%0, %1, 0, %K2 and\t%0, %1, %2" [(set_attr "type" "arith,arith") (set_attr "mode" "SI") (set_attr "length" "3,3")])(define_insn "iorsi3" [(set (match_operand:SI 0 "register_operand" "=a") (ior:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "register_operand" "r")))] "" "or\t%0, %1, %2" [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")])(define_insn "xorsi3" [(set (match_operand:SI 0 "register_operand" "=a") (xor:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "register_operand" "r")))] "" "xor\t%0, %1, %2" [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")]);; Zero-extend instructions.(define_insn "zero_extendhisi2" [(set (match_operand:SI 0 "register_operand" "=a,a") (zero_extend:SI (match_operand:HI 1 "nonimmed_operand" "r,U")))] "" "@ extui\t%0, %1, 0, 16 l16ui\t%0, %1" [(set_attr "type" "arith,load") (set_attr "mode" "SI") (set_attr "length" "3,3")])(define_insn "zero_extendqisi2" [(set (match_operand:SI 0 "register_operand" "=a,a") (zero_extend:SI (match_operand:QI 1 "nonimmed_operand" "r,U")))] "" "@ extui\t%0, %1, 0, 8 l8ui\t%0, %1" [(set_attr "type" "arith,load") (set_attr "mode" "SI") (set_attr "length" "3,3")]);; Sign-extend instructions.(define_expand "extendhisi2" [(set (match_operand:SI 0 "register_operand" "") (sign_extend:SI (match_operand:HI 1 "register_operand" "")))] ""{ if (sext_operand (operands[1], HImode)) emit_insn (gen_extendhisi2_internal (operands[0], operands[1])); else xtensa_extend_reg (operands[0], operands[1]); DONE;})(define_insn "extendhisi2_internal" [(set (match_operand:SI 0 "register_operand" "=B,a") (sign_extend:SI (match_operand:HI 1 "sext_operand" "r,U")))] "" "@ sext\t%0, %1, 15 l16si\t%0, %1" [(set_attr "type" "arith,load") (set_attr "mode" "SI") (set_attr "length" "3,3")])(define_expand "extendqisi2" [(set (match_operand:SI 0 "register_operand" "") (sign_extend:SI (match_operand:QI 1 "register_operand" "")))] ""{ if (TARGET_SEXT) emit_insn (gen_extendqisi2_internal (operands[0], operands[1])); else xtensa_extend_reg (operands[0], operands[1]); DONE;})(define_insn "extendqisi2_internal" [(set (match_operand:SI 0 "register_operand" "=B") (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))] "TARGET_SEXT" "sext\t%0, %1, 7" [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")]);; Field extract instructions.(define_expand "extv" [(set (match_operand:SI 0 "register_operand" "") (sign_extract:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "TARGET_SEXT"{ if (!sext_fldsz_operand (operands[2], SImode)) FAIL; /* We could expand to a right shift followed by SEXT but that's no better than the standard left and right shift sequence. */ if (!lsbitnum_operand (operands[3], SImode)) FAIL; emit_insn (gen_extv_internal (operands[0], operands[1], operands[2], operands[3])); DONE;})(define_insn "extv_internal" [(set (match_operand:SI 0 "register_operand" "=a") (sign_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "sext_fldsz_operand" "i") (match_operand:SI 3 "lsbitnum_operand" "i")))] "TARGET_SEXT"{ int fldsz = INTVAL (operands[2]); operands[2] = GEN_INT (fldsz - 1); return "sext\t%0, %1, %2";} [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")])(define_expand "extzv" [(set (match_operand:SI 0 "register_operand" "") (zero_extract:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] ""{ if (!extui_fldsz_operand (operands[2], SImode)) FAIL; emit_insn (gen_extzv_internal (operands[0], operands[1], operands[2], operands[3])); DONE;})(define_insn "extzv_internal" [(set (match_operand:SI 0 "register_operand" "=a") (zero_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "extui_fldsz_operand" "i") (match_operand:SI 3 "const_int_operand" "i")))] ""{ int shift; if (BITS_BIG_ENDIAN) shift = (32 - (INTVAL (operands[2]) + INTVAL (operands[3]))) & 0x1f; else shift = INTVAL (operands[3]) & 0x1f; operands[3] = GEN_INT (shift); return "extui\t%0, %1, %3, %2";} [(set_attr "type" "arith") (set_attr "mode" "SI") (set_attr "length" "3")]);; Conversions.(define_insn "fix_truncsfsi2" [(set (match_operand:SI 0 "register_operand" "=a") (fix:SI (match_operand:SF 1 "register_operand" "f")))] "TARGET_HARD_FLOAT" "trunc.s\t%0, %1, 0" [(set_attr "type" "fconv") (set_attr "mode" "SF") (set_attr "length" "3")])(define_insn "fixuns_truncsfsi2" [(set (match_operand:SI 0 "register_operand" "=a") (unsigned_fix:SI (match_operand:SF 1 "register_operand" "f")))] "TARGET_HARD_FLOAT" "utrunc.s\t%0, %1, 0" [(set_attr "type" "fconv") (set_attr "mode" "SF") (set_attr "length" "3")])(define_insn "floatsisf2" [(set (match_operand:SF 0 "register_operand" "=f") (float:SF (match_operand:SI 1 "register_operand" "a")))] "TARGET_HARD_FLOAT" "float.s\t%0, %1, 0" [(set_attr "type" "fconv") (set_attr "mode" "SF") (set_attr "length" "3")])(define_insn "floatunssisf2" [(set (match_operand:SF 0 "register_operand" "=f") (unsigned_float:SF (match_operand:SI 1 "register_operand" "a")))] "TARGET_HARD_FLOAT" "ufloat.s\t%0, %1, 0" [(set_attr "type" "fconv") (set_attr "mode" "SF") (set_attr "length" "3")]);; Data movement instructions.;; 64-bit Integer moves(define_expand "movdi" [(set (match_operand:DI 0 "nonimmed_operand" "") (match_operand:DI 1 "general_operand" ""))] ""{ if (CONSTANT_P (operands[1]) && !TARGET_CONST16) operands[1] = force_const_mem (DImode, operands[1]); if (!register_operand (operands[0], DImode) && !register_operand (operands[1], DImode)) operands[1] = force_reg (DImode, operands[1]); operands[1] = xtensa_copy_incoming_a7 (operands[1]);})(define_insn_and_split "movdi_internal" [(set (match_operand:DI 0 "nonimmed_operand" "=a,W,a,a,U") (match_operand:DI 1 "move_operand" "r,i,T,U,r"))] "register_operand (operands[0], DImode) || register_operand (operands[1], DImode)" "#" "reload_completed" [(set (match_dup 0) (match_dup 2)) (set (match_dup 1) (match_dup 3))]{ xtensa_split_operand_pair (operands, SImode); if (reg_overlap_mentioned_p (operands[0], operands[3])) { rtx tmp; tmp = operands[0], operands[0] = operands[1], operands[1] = tmp; tmp = operands[2], operands[2] = operands[3], operands[3] = tmp; }});; 32-bit Integer moves(define_expand "movsi" [(set (match_operand:SI 0 "nonimmed_operand" "") (match_operand:SI 1 "general_operand" ""))] ""{ if (xtensa_emit_move_sequence (operands, SImode)) DONE;})(define_insn "movsi_internal" [(set (match_operand:SI 0 "nonimmed_operand" "=D,D,D,D,R,R,a,q,a,W,a,a,U,*a,*A") (match_operand:SI 1 "move_operand" "M,D,d,R,D,d,r,r,I,i,T,U,r,*A,*r"))] "xtensa_valid_move (SImode, operands)" "@ movi.n\t%0, %x1 mov.n\t%0, %1 mov.n\t%0, %1 %v1l32i.n\t%0, %1 %v0s32i.n\t%1, %0 %v0s32i.n\t%1, %0 mov\t%0, %1 movsp\t%0, %1 movi\t%0, %x1 const16\t%0, %t1\;const16\t%0, %b1 %v1l32r\t%0, %1 %v1l32i\t%0, %1 %v0s32i\t%1, %0 rsr\t%0, 16 # ACCLO wsr\t%1, 16 # ACCLO" [(set_attr "type" "move,move,move,load,store,store,move,move,move,move,load,load,store,rsr,wsr") (set_attr "mode" "SI") (set_attr "length" "2,2,2,2,2,2,3,3,3,6,3,3,3,3,3")]);; 16-bit Integer moves(define_expand "movhi" [(set (match_operand:HI 0 "nonimmed_operand" "") (match_operand:HI 1 "general_operand" ""))] ""{ if (xtensa_emit_move_sequence (operands, HImode)) DONE;})(define_insn "movhi_internal" [(set (match_operand:HI 0 "nonimmed_operand" "=D,D,a,a,a,U,*a,*A") (match_operand:HI 1 "move_operand" "M,d,r,I,U,r,*A,*r"))] "xtensa_valid_move (HImode, operands)" "@ movi.n\t%0, %x1 mov.n\t%0, %1 mov\t%0, %1 movi\t%0, %x1 %v1l16ui\t%0, %1 %v0s16i\t%1, %0 rsr\t%0, 16 # ACCLO wsr\t%1, 16 # ACCLO" [(set_attr "type" "move,move,move,move,load,store,rsr,wsr") (set_attr "mode" "HI") (set_attr "length" "2,2,3,3,3,3,3,3")]);; 8-bit Integer moves(define_expand "movqi" [(set (match_operand:QI 0 "nonimmed_operand" "") (match_operand:QI 1 "general_operand" ""))] ""{ if (xtensa_emit_move_sequence (operands, QImode)) DONE;})(define_insn "movqi_internal" [(set (match_operand:QI 0 "nonimmed_operand" "=D,D,a,a,a,U,*a,*A") (match_operand:QI 1 "move_operand" "M,d,r,I,U,r,*A,*r"))] "xtensa_valid_move (QImode, operands)" "@ movi.n\t%0, %x1 mov.n\t%0, %1 mov\t%0, %1 movi\t%0, %x1 %v1l8ui\t%0, %1 %v0s8i\t%1, %0 rsr\t%0, 16 # ACCLO wsr\t%1, 16 # ACCLO" [(set_attr "type" "move,move,move,move,load,store,rsr,wsr") (set_attr "mode" "QI") (set_attr "length" "2,2,3,3,3,3,3,3")]);; 32-bit floating point moves(define_expand "movsf" [(set (match_operand:SF 0 "nonimmed_operand" "") (match_operand:SF 1 "general_operand" ""))] ""{ if (!TARGET_CONST16 && CONSTANT_P (operands[1])) operands[1] = force_const_mem (SFmode, operands[1]); if ((!register_operand (operands[0], SFmode) && !register_operand (operands[1], SFmode)) || (FP_REG_P (xt_true_regnum (operands[0])) && !(reload_in_progress | reload_completed) && (constantpool_mem_p (operands[1]) || CONSTANT_P (operands[1])))) operands[1] = force_reg (SFmode, operands[1]); operands[1] = xtensa_copy_incoming_a7 (operands[1]);})(define_insn "movsf_internal" [(set (match_operand:SF 0 "nonimmed_operand" "=f,f,U,D,D,R,a,f,a,W,a,a,U") (match_operand:SF 1 "move_operand" "f,U,f,d,R,d,r,r,f,iF,T,U,r"))] "((register_operand (operands[0], SFmode) || register_operand (operands[1], SFmode)) && !(FP_REG_P (xt_true_regnum (operands[0])) && (constantpool_mem_p (operands[1]) || CONSTANT_P (operands[1]))))" "@ mov.s\t%0, %1 %v1lsi\t%0, %1 %v0ssi\t%1, %0 mov.n\t%0, %1 %v1l32i.n\t%0, %1 %v0s32i.n\t%1, %0 mov\t%0, %1 wfr\t%0, %1 rfr\t%0, %1 const16\t%0, %t1\;const16\t%0, %b1 %v1l32r\t%0, %1 %v1l32i\t%0, %1 %v0s32i\t%1, %0" [(set_attr "type" "farith,fload,fstore,move,load,store,move,farith,farith,move,load,load,store") (set_attr "mode" "SF") (set_attr "length" "3,3,3,2,2,2,3,3,3,6,3,3,3")])(define_insn "*lsiu" [(set (match_operand:SF 0 "register_operand" "=f") (mem:SF (plus:SI (match_operand:SI 1 "register_operand" "+a") (match_operand:SI 2 "fpmem_offset_operand" "i")))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_HARD_FLOAT"{ if (volatile_refs_p (PATTERN (insn))) output_asm_insn ("memw", operands); return "lsiu\t%0, %1, %2";} [(set_attr "type" "fload") (set_attr "mode" "SF") (set_attr "length" "3")])(define_insn "*ssiu" [(set (mem:SF (plus:SI (match_operand:SI 0 "register_operand" "+a") (match_operand:SI 1 "fpmem_offset_operand" "i"))) (match_operand:SF 2 "register_operand" "f")) (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] "TARGET_HARD_FLOAT"{ if (volatile_refs_p (PATTERN (insn))) output_asm_insn ("memw", operands); return "ssiu\t%2, %0, %1";} [(set_attr "type" "fstore") (set_attr "mode" "SF") (set_attr "length" "3")]);; 64-bit floating point moves(define_expand "movdf" [(set (match_operand:DF 0 "nonimmed_operand" "") (match_operand:DF 1 "general_operand" ""))] ""{ if (CONSTANT_P (operands[1]) && !TARGET_CONST16) operands[1] = force_const_mem (DFmode, operands[1]); if (!register_operand (operands[0], DFmode) && !register_operand (operands[1], DFmode)) operands[1] = force_reg (DFmode, operands[1]); operands[1] = xtensa_copy_incoming_a7 (operands[1]);})(define_insn_and_split "movdf_internal" [(set (match_operand:DF 0 "nonimmed_operand" "=a,W,a,a,U") (match_operand:DF 1 "move_operand" "r,iF,T,U,r"))] "register_operand (operands[0], DFmode) || register_operand (operands[1], DFmode)" "#" "reload_completed" [(set (match_dup 0) (match_dup 2)) (set (match_dup 1) (match_dup 3))]{ xtensa_split_operand_pair (operands, SFmode); if (reg_overlap_mentioned_p (operands[0], operands[3])) { rtx tmp; tmp = operands[0], operands[0] = operands[1], operands[1] = tmp; tmp = operands[2], operands[2] = operands[3], operands[3] = tmp; }});; Block moves(define_expand "movmemsi" [(parallel [(set (match_operand:BLK 0 "" "") (match_operand:BLK 1 "" "")) (use (match_operand:SI 2 "arith_operand" "")) (use (match_operand:SI 3 "const_int_operand" ""))])] ""{ if (!xtensa_expand_block_move (operands)) FAIL; DONE;});; Shift instructions.(define_expand "ashlsi3" [(set (match_operand:SI 0 "register_operand" "") (ashift:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "arith_operand" "")))] ""{ operands[1] = xtensa_copy_incoming_a7 (operands[1]);})(define_insn "ashlsi3_internal" [(set (match_operand:SI 0 "register_operand" "=a,a") (ashift:SI (match_operand:SI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "J,r")))] "" "@ slli\t%0, %1, %R2 ssl\t%2\;sll\t%0, %1" [(set_attr "type" "arith,arith") (set_attr "mode" "SI") (set_attr "length" "3,6")])(define_insn "ashrsi3" [(set (match_operand:SI 0 "register_operand" "=a,a") (ashiftrt:SI (match_operand:SI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "J,r")))] "" "@ srai\t%0, %1, %R2 ssr\t%2\;sra\t%0, %1" [(set_attr "type" "arith,arith") (set_attr "mode" "SI") (set_attr "length" "3,6")])(define_insn "lshrsi3" [(set (match_operand:SI 0 "register_operand" "=a,a") (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -