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

📄 sparc.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 5 页
字号:
	(high:HI (match_operand 1 "" "")))]  "check_pic (1)"  "sethi %%hi(%a1),%0"  [(set_attr "type" "move")   (set_attr "length" "1")])(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=r")	(lo_sum:DI (match_operand:DI 1 "register_operand" "0")		   (match_operand:DI 2 "immediate_operand" "in")))]  ""  "*{  /* Don't output a 64 bit constant, since we can't trust the assembler to     handle it correctly.  */  if (GET_CODE (operands[2]) == CONST_DOUBLE)    operands[2] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[2]));  return \"or %R1,%%lo(%a2),%R0\";}"  ;; Need to set length for this arith insn because operand2  ;; is not an "arith_operand".  [(set_attr "length" "1")]);; For PIC, symbol_refs are put inside unspec so that the optimizer won't;; confuse them with real addresses.(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(lo_sum:SI (match_operand:SI 1 "register_operand" "r")		   (unspec:SI [(match_operand:SI 2 "immediate_operand" "in")] 0)))]  ""  "or %1,%%lo(%a2),%0"  ;; Need to set length for this arith insn because operand2  ;; is not an "arith_operand".  [(set_attr "length" "1")])(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(lo_sum:SI (match_operand:SI 1 "register_operand" "r")		   (match_operand:SI 2 "immediate_operand" "in")))]  ""  "or %1,%%lo(%a2),%0"  ;; Need to set length for this arith insn because operand2  ;; is not an "arith_operand".  [(set_attr "length" "1")])(define_insn ""  [(set (mem:SI (match_operand:SI 0 "symbolic_operand" ""))	(match_operand:SI 1 "reg_or_0_operand" "rJ"))   (clobber (match_scratch:SI 2 "=&r"))]  ""  "sethi %%hi(%a0),%2\;st %r1,[%2+%%lo(%a0)]"  [(set_attr "type" "store")   (set_attr "length" "2")])(define_expand "movhi"  [(set (match_operand:HI 0 "general_operand" "")	(match_operand:HI 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, HImode, 0))    DONE;}")(define_insn ""  [(set (match_operand:HI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,Q")	(match_operand:HI 1 "move_operand" "rI,K,Q,rJ"))]  "register_operand (operands[0], HImode)   || register_operand (operands[1], HImode)   || operands[1] == const0_rtx"  "@   mov %1,%0   sethi %%hi(%a1),%0   lduh %1,%0   sth %r1,%0"  [(set_attr "type" "move,move,load,store")   (set_attr "length" "*,1,*,1")])(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=r")	(lo_sum:HI (match_operand:HI 1 "register_operand" "r")		   (match_operand 2 "immediate_operand" "in")))]  ""  "or %1,%%lo(%a2),%0"  [(set_attr "length" "1")])(define_insn ""  [(set (mem:HI (match_operand:SI 0 "symbolic_operand" ""))	(match_operand:HI 1 "reg_or_0_operand" "rJ"))   (clobber (match_scratch:SI 2 "=&r"))]  ""  "sethi %%hi(%a0),%2\;sth %r1,[%2+%%lo(%a0)]"  [(set_attr "type" "store")   (set_attr "length" "2")])(define_expand "movqi"  [(set (match_operand:QI 0 "general_operand" "")	(match_operand:QI 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, QImode, 0))    DONE;}")(define_insn ""  [(set (match_operand:QI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,Q")	(match_operand:QI 1 "move_operand" "rI,K,Q,rJ"))]  "register_operand (operands[0], QImode)   || register_operand (operands[1], QImode)   || operands[1] == const0_rtx"  "@   mov %1,%0   sethi %%hi(%a1),%0   ldub %1,%0   stb %r1,%0"  [(set_attr "type" "move,move,load,store")   (set_attr "length" "*,1,*,1")])(define_insn ""  [(set (match_operand:QI 0 "register_operand" "=r")	(subreg:QI (lo_sum:SI (match_operand:QI 1 "register_operand" "r")			      (match_operand 2 "immediate_operand" "in")) 0))]  ""  "or %1,%%lo(%a2),%0"  [(set_attr "length" "1")])(define_insn ""  [(set (mem:QI (match_operand:SI 0 "symbolic_operand" ""))	(match_operand:QI 1 "reg_or_0_operand" "rJ"))   (clobber (match_scratch:SI 2 "=&r"))]  ""  "sethi %%hi(%a0),%2\;stb %r1,[%2+%%lo(%a0)]"  [(set_attr "type" "store")   (set_attr "length" "2")]);; The definition of this insn does not really explain what it does,;; but it should suffice;; that anything generated as this insn will be recognized as one;; and that it will not successfully combine with anything.(define_expand "movstrsi"  [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))		   (mem:BLK (match_operand:BLK 1 "general_operand" "")))	      (use (match_operand:SI 2 "nonmemory_operand" ""))	      (use (match_operand:SI 3 "immediate_operand" ""))	      (clobber (match_dup 0))	      (clobber (match_dup 1))	      (clobber (match_scratch:SI 4 ""))	      (clobber (reg:SI 0))	      (clobber (reg:SI 1))])]  ""  "{  /* If the size isn't known, don't emit inline code.  output_block_move     would output code that's much slower than the library function.     Also don't output code for large blocks.  */  if (GET_CODE (operands[2]) != CONST_INT      || GET_CODE (operands[3]) != CONST_INT      || INTVAL (operands[2]) / INTVAL (operands[3]) > 16)    FAIL;  operands[0] = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));  operands[1] = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));  operands[2] = force_not_mem (operands[2]);}")(define_insn ""  [(set (mem:BLK (match_operand:SI 0 "register_operand" "+r"))	(mem:BLK (match_operand:SI 1 "register_operand" "+r")))   (use (match_operand:SI 2 "nonmemory_operand" "rn"))   (use (match_operand:SI 3 "immediate_operand" "i"))   (clobber (match_dup 0))   (clobber (match_dup 1))   (clobber (match_scratch:SI 4 "=&r"))   (clobber (reg:SI 0))   (clobber (reg:SI 1))]  ""  "* return output_block_move (operands);"  [(set_attr "type" "multi")   (set_attr "length" "6")]);; Floating point move insns;; This pattern forces (set (reg:TF ...) (const_double ...));; to be reloaded by putting the constant into memory.;; It must come before the more general movtf pattern.(define_insn ""  [(set (match_operand:TF 0 "general_operand" "=?r,f,o")	(match_operand:TF 1 "" "?E,m,G"))]  "GET_CODE (operands[1]) == CONST_DOUBLE"  "*{  switch (which_alternative)    {    case 0:      return output_move_quad (operands);    case 1:      return output_fp_move_quad (operands);    case 2:      operands[1] = adj_offsettable_operand (operands[0], 4);      operands[2] = adj_offsettable_operand (operands[0], 8);      operands[3] = adj_offsettable_operand (operands[0], 12);      return \"st %%g0,%0\;st %%g0,%1\;st %%g0,%2\;st %%g0,%3\";    }}"  [(set_attr "type" "load,fpload,store")   (set_attr "length" "5,5,5")])(define_expand "movtf"  [(set (match_operand:TF 0 "general_operand" "")	(match_operand:TF 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, TFmode, 0))    DONE;}")(define_insn ""  [(set (match_operand:TF 0 "reg_or_nonsymb_mem_operand" "=f,r,Q,Q,f,&r,?f,?r")	(match_operand:TF 1 "reg_or_nonsymb_mem_operand" "f,r,f,r,Q,Q,r,f"))]  "register_operand (operands[0], TFmode)   || register_operand (operands[1], TFmode)"  "*{  if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))    return output_fp_move_quad (operands);  return output_move_quad (operands);}"  [(set_attr "type" "fp,move,fpstore,store,fpload,load,multi,multi")   (set_attr "length" "4,4,5,5,5,5,5,5")])(define_insn ""  [(set (mem:TF (match_operand:SI 0 "symbolic_operand" "i,i"))	(match_operand:TF 1 "reg_or_0_operand" "rf,G"))   (clobber (match_scratch:SI 2 "=&r,&r"))]  ""  "*{  output_asm_insn (\"sethi %%hi(%a0),%2\", operands);  if (which_alternative == 0)    return \"std %1,[%2+%%lo(%a0)]\;std %S1,[%2+%%lo(%a0+8)]\";  else    return \"st %%g0,[%2+%%lo(%a0)]\;st %%g0,[%2+%%lo(%a0+4)]\; st %%g0,[%2+%%lo(%a0+8)]\;st %%g0,[%2+%%lo(%a0+12)]\";}"  [(set_attr "type" "store")   (set_attr "length" "5")]);; This pattern forces (set (reg:DF ...) (const_double ...));; to be reloaded by putting the constant into memory.;; It must come before the more general movdf pattern.(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=?r,f,o")	(match_operand:DF 1 "" "?E,m,G"))]  "GET_CODE (operands[1]) == CONST_DOUBLE"  "*{  switch (which_alternative)    {    case 0:      return output_move_double (operands);    case 1:      return output_fp_move_double (operands);    case 2:      operands[1] = adj_offsettable_operand (operands[0], 4);      return \"st %%g0,%0\;st %%g0,%1\";    }}"  [(set_attr "type" "load,fpload,store")   (set_attr "length" "3,3,3")])(define_expand "movdf"  [(set (match_operand:DF 0 "general_operand" "")	(match_operand:DF 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, DFmode, 0))    DONE;}")(define_insn ""  [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand" "=T,U,f,r,Q,Q,f,&r,?f,?r")	(match_operand:DF 1 "reg_or_nonsymb_mem_operand" "U,T,f,r,f,r,Q,Q,r,f"))]  "register_operand (operands[0], DFmode)   || register_operand (operands[1], DFmode)"  "*{  if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))    return output_fp_move_double (operands);  return output_move_double (operands);}"  [(set_attr "type" "fpstore,fpload,fp,move,fpstore,store,fpload,load,multi,multi")   (set_attr "length" "1,1,2,2,3,3,3,3,3,3")])(define_insn ""  [(set (mem:DF (match_operand:SI 0 "symbolic_operand" "i,i"))	(match_operand:DF 1 "reg_or_0_operand" "rf,G"))   (clobber (match_scratch:SI 2 "=&r,&r"))]  ""  "*{  output_asm_insn (\"sethi %%hi(%a0),%2\", operands);  if (which_alternative == 0)    return \"std %1,[%2+%%lo(%a0)]\";  else    return \"st %%g0,[%2+%%lo(%a0)]\;st %%g0,[%2+%%lo(%a0+4)]\";}"  [(set_attr "type" "store")   (set_attr "length" "3")]);; Double-word move insns.(define_expand "movdi"  [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "")	(match_operand:DI 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, DImode, 0))    DONE;}")(define_insn ""  [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "=r,Q,&r,&r,?f,?f,?f,?r,?Q")	(match_operand:DI 1 "general_operand" "r,r,Q,i,r,f,Q,f,f"))]  "register_operand (operands[0], DImode)   || register_operand (operands[1], DImode)   || operands[1] == const0_rtx"  "*{  if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))    return output_fp_move_double (operands);  return output_move_double (operands);}"  [(set_attr "type" "move,store,load,multi,multi,fp,fpload,multi,fpstore")   (set_attr "length" "2,3,3,3,3,2,3,3,3")]);; Floating-point move insns.;; This pattern forces (set (reg:SF ...) (const_double ...));; to be reloaded by putting the constant into memory.;; It must come before the more general movsf pattern.(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=?r,f,m")	(match_operand:SF 1 "" "?E,m,G"))]  "GET_CODE (operands[1]) == CONST_DOUBLE"  "*{  switch (which_alternative)    {    case 0:      return singlemove_string (operands);    case 1:      return \"ld %1,%0\";    case 2:      return \"st %%g0,%0\";    }}"  [(set_attr "type" "load,fpload,store")   (set_attr "length" "2,1,1")])(define_expand "movsf"  [(set (match_operand:SF 0 "general_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""  "{  if (emit_move_sequence (operands, SFmode, 0))    DONE;}")(define_insn ""  [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand" "=f,r,rf,f,r,Q,Q")	(match_operand:SF 1 "reg_or_nonsymb_mem_operand" "f,r,!rf,Q,Q,f,r"))]  "register_operand (operands[0], SFmode)   || register_operand (operands[1], SFmode)"  "@   fmovs %1,%0   mov %1,%0   st %r1,[%%fp-4]\;ld [%%fp-4],%0   ld %1,%0   ld %1,%0   st %r1,%0   st %r1,%0"  [(set_attr "type" "fp,move,multi,fpload,load,fpstore,store")])(define_insn ""  [(set (mem:SF (match_operand:SI 0 "symbolic_operand" "i"))	(match_operand:SF 1 "reg_or_0_operand" "rfG"))   (clobber (match_scratch:SI 2 "=&r"))]  ""  "sethi %%hi(%a0),%2\;st %r1,[%2+%%lo(%a0)]"  [(set_attr "type" "store")   (set_attr "length" "2")]);;- zero extension instructions;; These patterns originally accepted general_operands, however, slightly;; better code is generated by only accepting register_operands, and then;; letting combine generate the ldu[hb] insns.(define_expand "zero_extendhisi2"  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:HI 1 "register_operand" "")))]  ""  "{  rtx temp = gen_reg_rtx (SImode);  rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);  if (GET_CODE (operand1) == SUBREG)    operand1 = XEXP (operand1, 0);  emit_insn (gen_ashlsi3 (temp, gen_rtx (SUBREG, SImode, operand1, 0),			  shift_16));  emit_insn (gen_lshrsi3 (operand0, temp, shift_16));  DONE;}")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]  ""  "lduh %1,%0"  [(set_attr "type" "load")])(define_expand "zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "register_operand" "")))]  ""  "")(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=r,r,r")	(zero_extend:HI (match_operand:QI 1 "sparc_operand" "r,I,Q")))]  "GET_CODE (operands[1]) != CONST_INT"  "@   and %1,0xff,%0;   mov (%1 & 0xff),%0   ldub %1,%0"  [(set_attr "type" "unary,move,load")   (set_attr "length" "1")])(define_expand "zero_extendqisi2"

⌨️ 快捷键说明

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