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

📄 sparc32.mcs

📁 miracl-大数运算库,大家使用有什么问题请多多提意见
💻 MCS
字号:
;
; 32-bit SPARC v8 version. Don't forget the delay slot!
;
; Sorry about all the %'s! Each % must be input here as %%
; Triple register is %l2|%l1|%l0
; MUL_START. Initialise registers. Make %o0 and %01 point to multipliers a 
; and b. %o2 points at result c. 
; Initialise Triple register to 0
; See makemcs.txt for more information about this file
; 
MACRO MUL_START
  __asm__ __volatile__ (
  "mov    %%0,%%%%o0\n"
  "mov    %%1,%%%%o1\n"
  "mov    %%2,%%%%o2\n"
  "mov    %%%%g0,%%%%l0\n"
  "mov    %%%%g0,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
ENDM
;
; STEP macro. Calculates a double-register partial product
; and adds it to the triple register total
; Parameters 1 & 2: Indices i and j for partial product multipliers a[i] 
; and b[j]
MACRO STEP
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "ld     [%%%%o1+4*%d],%%%%l4\n"
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
MACRO STEP1M
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "ld     [%%%%o1+4*%d],%%%%l4\n"
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
ENDM
MACRO STEP1A
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
MACRO STEP2M
  "ld     [%%%%o0+4*%d],%%%%l5\n"
  "ld     [%%%%o1+4*%d],%%%%l6\n"
  "umul   %%%%l5,%%%%l6,%%%%l5\n"
  "rd     %%%%y,%%%%l6\n"
ENDM
MACRO STEP2A
  "addcc  %%%%l0,%%%%l5,%%%%l0\n"
  "addxcc %%%%l1,%%%%l6,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
;
; LAST
;
MACRO LAST
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "ld     [%%%%o1+4*%d],%%%%l4\n" 
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "add    %%%%l0,%%%%l3,%%%%l0\n"
ENDM
;
; MFIN macro. Finish column calculation. Store Sum for this column
; and get Carry for next
; Parameter 1: Index k for Column Sum c[k]
MACRO MFIN
  "st     %%%%l0,[%%%%o2+4*%d]\n"
  "mov    %%%%l1,%%%%l0\n"
  "mov    %%%%l2,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
ENDM
;
; MUL_END
; Parameter 1: Index for final carry c[.]
MACRO MUL_END  
  "st     %%%%l0,[%%%%o2+4*%d]\n"
   :
   :"r"(a),"r"(b),"r"(c)
   :"l0","l1","l2","l3","l4","l5","l6","o0","o1","o2","memory"
  );
ENDM
;
; SQR_START
; 
MACRO SQR_START
  __asm__ __volatile__ (
  "mov    %%0,%%%%o0\n"
  "mov    %%1,%%%%o2\n"
  "mov    %%%%g0,%%%%l0\n"
  "mov    %%%%g0,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
ENDM
;
; DSTEP macro. Calculates a double-register partial product
; and add it twice to a triple register total
; Parameters 1 & 2 : Indices of partial product multipliers
MACRO DSTEP
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "ld     [%%%%o0+4*%d],%%%%l4\n"
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
MACRO DSTEP1M
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "ld     [%%%%o0+4*%d],%%%%l4\n"
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
ENDM
MACRO DSTEP1A
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
MACRO DSTEP2M
  "ld     [%%%%o0+4*%d],%%%%l5\n"
  "ld     [%%%%o0+4*%d],%%%%l6\n"
  "umul   %%%%l5,%%%%l6,%%%%l5\n"
  "rd     %%%%y,%%%%l6\n"
ENDM
MACRO DSTEP2A
  "addcc  %%%%l0,%%%%l5,%%%%l0\n"
  "addxcc %%%%l1,%%%%l6,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
  "addcc  %%%%l0,%%%%l5,%%%%l0\n"
  "addxcc %%%%l1,%%%%l6,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
;
; SELF macro. Calculate the double-register square and
; add it to a triple register total
; Parameter 1 : Index of diagonal element
MACRO SELF
  "ld     [%%%%o0+4*%d],%%%%l3\n"
  "umul   %%%%l3,%%%%l3,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
ENDM
;
; SFIN macro. Finish column calculation for squaring. Store Sum
; and get Carry for next column.
; Parameter 1: Index of Column Sum
MACRO SFIN
  "st     %%%%l0,[%%%%o2+4*%d]\n"
  "mov    %%%%l1,%%%%l0\n"
  "mov    %%%%l2,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
ENDM
;
; SQR_END
; Parameter 1: Index for final carry
MACRO SQR_END
  "st     %%%%l0,[%%%%o2+4*%d]\n"
   :
   :"r"(a),"r"(c)
   :"l0","l1","l2","l3","l4","l5","l6","o0","o2","memory"
  );
ENDM
;
; REDC_START
;
MACRO REDC_START
  __asm__ __volatile__ (
  "mov    %%0,%%%%o0\n"
  "mov    %%1,%%%%o1\n"
  "mov    %%2,%%%%o2\n"
  "mov    %%%%g0,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
  "ld     [%%%%o0],%%%%l0\n"
ENDM
;
; RFINU macro
;
MACRO RFINU
  "umul   %%%%l0,%%%%o2,%%%%l3\n"
  "st     %%%%l3,[%%%%o0+4*%d]\n"
  "ld     [%%%%o1],%%%%l4\n"
  "umul   %%%%l3,%%%%l4,%%%%l3\n"
  "rd     %%%%y,%%%%l4\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addxcc %%%%l1,%%%%l4,%%%%l1\n"
  "addx   %%%%l2,%%%%g0,%%%%l2\n"
  "mov    %%%%l1,%%%%l0\n"
  "mov    %%%%l2,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
  "ld     [%%%%o0+4*(%d+1)],%%%%l3\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addx   %%%%l1,%%%%l2,%%%%l1\n"
ENDM
;
; RFIND macro
;
MACRO RFIND
  "st     %%%%l0,[%%%%o0+4*%d]\n"
  "mov    %%%%l1,%%%%l0\n"
  "mov    %%%%l2,%%%%l1\n"
  "mov    %%%%g0,%%%%l2\n"
  "ld     [%%%%o0+4*(%d+1)],%%%%l3\n"
  "addcc  %%%%l0,%%%%l3,%%%%l0\n"
  "addx   %%%%l1,%%%%l2,%%%%l1\n"
ENDM
;
; REDC_END
;
MACRO REDC_END
  "st     %%%%l0,[%%%%o0+4*%d]\n"
  "st     %%%%l1,[%%%%o0+4*(%d+1)]\n"
   :
   :"r"(a),"r"(b),"r"(ndash)
   :"l0","l1","l2","l3","l4","l5","l6","o0","o1","o2","memory"
  );
ENDM
;
; ADD_START macro - initialise for add. Do first one
;
MACRO ADD_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "mov    %%3,%%%%o2\n"
  "ld     [%%%%o0],%%%%l0\n"
  "ld     [%%%%o1],%%%%l1\n"
  "addcc  %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o2]\n"
ENDM
;
; ADD macro. Add two numbers from memory and store result in memory.
; Don't forget carry bit
;
MACRO ADD
  "ld     [%%%%o0+4*%d],%%%%l0\n"
  "ld     [%%%%o1+4*%d],%%%%l1\n"
  "addxcc %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o2+4*%d]\n"
ENDM
;
; ADD_END macro. Catch Carry
;
MACRO ADD_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b),"r"(c)
   :"o0","o1","o2","l0","l1","memory"
  );
ENDM
;
; INC_START macro
;
MACRO INC_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "ld     [%%%%o0],%%%%l0\n"
  "ld     [%%%%o1],%%%%l1\n"
  "addcc  %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o0]\n"
ENDM
;
; INC macro. Increment number in memory. Don't forget carry
;
MACRO INC
  "ld     [%%%%o0+4*%d],%%%%l0\n"
  "ld     [%%%%o1+4*%d],%%%%l1\n"
  "addxcc %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o0+4*%d]\n"
ENDM
;
; INC_END macro. Catch Carry
;
MACRO INC_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b)
   :"o0","o1","l0","l1","memory"
  );
ENDM
;
; SUB_START macro. Do first one.
;
MACRO SUB_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "mov    %%3,%%%%o2\n"
  "ld     [%%%%o0],%%%%l0\n"
  "ld     [%%%%o1],%%%%l1\n"
  "subcc  %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o2]\n"
ENDM
;
; SUB macro. Subtract two numbers in memory and store result in memory.
;
MACRO SUB
  "ld     [%%%%o0+4*%d],%%%%l0\n"
  "ld     [%%%%o1+4*%d],%%%%l1\n"
  "subxcc %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o2+4*%d]\n"
ENDM
;
; SUB_END macro. Catch Carry
;
MACRO SUB_END  
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b),"r"(c)
   :"o0","o1","o2","l0","l1","memory"
  );
ENDM
;
; DEC_START macro. Do first one.
;
MACRO DEC_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "ld     [%%%%o0],%%%%l0\n"
  "ld     [%%%%o1],%%%%l1\n"
  "subcc  %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o0]\n"
ENDM
;
; DEC macro. Decrement from number in memory. Don't forget borrow.
;
MACRO DEC
  "ld     [%%%%o0+4*%d],%%%%l0\n"
  "ld     [%%%%o1+4*%d],%%%%l1\n"
  "subxcc %%%%l0,%%%%l1,%%%%l0\n"
  "st     %%%%l0,[%%%%o0+4*%d]\n"
ENDM
;
; DEC_END macro
;
MACRO DEC_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b) 
   :"o0","o1","l0","l1","memory"
  );
ENDM
;
; KADD_START macro. Zero carry flag
;
MACRO KADD_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "mov    %%3,%%%%o2\n"
  "mov    %%4,%%%%o3\n"
  "addcc  %%%%g0,%%%%g0,%%%%g0\n"
  "k%d:\n"
ENDM
;
; KASL macro. Leave carry flag undisturbed
; Save carry in l0, and then restore it in delay slot
;
MACRO KASL
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "subcc  %%%%o3,1,%%%%o3\n"
  "be     k%d\n"
  "addcc  %%%%l0,-1,%%%%g0\n"
  "add    %%%%o0,4*%d,%%%%o0\n"
  "add    %%%%o1,4*%d,%%%%o1\n"
  "add    %%%%o2,4*%d,%%%%o2\n"
  "ba     k%d\n"
  "add    %%%%g0,%%%%g0,%%%%g0\n"
  "k%d:\n"
ENDM
;
; KADD_END  macro
;
MACRO KADD_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b),"r"(c),"r"(n)
   :"o0","o1","o2","o3","l0","l1","memory"
  );
ENDM
;
; KINC_START macro. Zero carry flag. 
;
MACRO KINC_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "mov    %%3,%%%%o3\n"
  "addcc  %%%%g0,%%%%g0,%%%%g0\n"
  "k%d:\n"
ENDM
;
; KIDL macro
;
MACRO KIDL
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "subcc  %%%%o3,1,%%%%o3\n"
  "be     k%d\n"
  "addcc  %%%%l0,-1,%%%%g0\n"
  "add    %%%%o0,4*%d,%%%%o0\n"
  "add    %%%%o1,4*%d,%%%%o1\n"
  "ba     k%d\n"
  "add    %%%%g0,%%%%g0,%%%%g0\n"
  "k%d:\n"
ENDM
;
; KINC_END macro
;
MACRO KINC_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"      
   :"=r"(carry)
   :"r"(a),"r"(b),"r"(n)
   :"o0","o1","o3","l0","l1","memory"
  );
ENDM
;
; KDEC_START macro
;
MACRO KDEC_START
  __asm__ __volatile__ (
  "mov    %%1,%%%%o0\n"
  "mov    %%2,%%%%o1\n"
  "mov    %%3,%%%%o3\n"
  "addcc  %%%%g0,%%%%g0,%%%%g0\n"
  "k%d:\n"
ENDM
;
; KDEC_END macro
;
MACRO KDEC_END
  "addx   %%%%g0,%%%%g0,%%%%l0\n"
  "mov    %%%%l0,%%0\n"
   :"=r"(carry)
   :"r"(a),"r"(b),"r"(n)
   :"o0","o1","o3","l0","l1","memory"
  );
ENDM

⌨️ 快捷键说明

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