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

📄 gccppc.mcs

📁 比较新的功能强大的rsa算法源代码,方便使用.
💻 MCS
字号:
;
; powerPC Macros file for GCC compiler
;
; Triple register is R20|R19|R18
; MUL_START. Initialise registers. Make R21 and R22 point to multipliers a 
; and b. R23 points at result c. 
; Initialise Triple register to 0
; See makemcs.txt for more information about this file
;

MACRO PMUL_START
  ASM (
  "mr %%%%r21,%%0\n"
  "mr %%%%r22,%%1\n"
  "mr %%%%r23,%%2\n"
  "mr %%%%r18,%%3\n"
  "xor %%%%r19,%%%%r19,%%%%r19\n"
  "xor %%%%r20,%%%%r20,%%%%r20\n"
ENDM

MACRO PMUL
  "ld %%%%r16,8*%d(%%%%r21)\n"
  "mulld  %%%%r24,%%%%r16,%%%%r18\n"
  "mulhdu %%%%r25,%%%%r16,%%%%r18\n"
  "addc  %%%%r24,%%%%r19,%%%%r24\n"
  "addze %%%%r19,%%%%r25\n"
  "std  %%%%r20,8*%d(%%%%r22)\n"
  "std  %%%%r24,8*%d(%%%%r23)\n"
ENDM

MACRO PMUL_END
  "mulld  %%%%r24,%%%%r18,%%%%r19\n"
  "mulhdu %%%%r25,%%%%r18,%%%%r19\n"
  "std %%%%r24,0(%%%%r22)\n"
  "std %%%%r25,8(%%%%r22)\n"
  :
  :"r"(a),"r"(b),"r"(c),"r"(sn)
  :"r18","r19","r20","r21","r22","r23","r24","r25","memory" 
  );
ENDM

MACRO MUL_START
  ASM (
  "mr %%%%r21,%%0\n"
  "mr %%%%r22,%%1\n"
  "mr %%%%r23,%%2\n"
  "xor %%%%r18,%%%%r18,%%%%r18\n"
  "xor %%%%r19,%%%%r19,%%%%r19\n"
  "xor %%%%r20,%%%%r20,%%%%r20\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 %%%%r16,8*%d(%%%%r21)\n"
  "ld %%%%r17,8*%d(%%%%r22)\n"
  "mulld  %%%%r24,%%%%r16,%%%%r17\n"
  "mulhdu %%%%r25,%%%%r16,%%%%r17\n"
  "addc   %%%%r18,%%%%r18,%%%%r24\n"
  "adde   %%%%r19,%%%%r19,%%%%r25\n"
  "addze  %%%%r20,%%%%r20\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
  "std %%%%r18,8*%d(%%%%r23)\n"
  "mr  %%%%r18,%%%%r19\n"
  "mr  %%%%r19,%%%%r20\n"
  "xor %%%%r20,%%%%r20,%%%%r20\n"
ENDM
;
; LAST
;
MACRO LAST
  "ld  %%%%r16,8*%d(%%%%r21)\n"
  "ld  %%%%r17,8*%d(%%%%r22)\n"
  "mulld %%%%r24,%%%%r16,%%%%r17\n"
  "add   %%%%r18,%%%%r24,%%%%r18\n"
ENDM
;
; MUL_END
; Parameter 1: Index for final carry c[.]
MACRO MUL_END  
  "std  %%%%r18,8*%d(%%%%r23)\n"
  :
  :"r"(a),"r"(b),"r"(c)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory" 
  );
ENDM
;
; SQR_START
; 
MACRO SQR_START
  ASM (
  "mr %%%%r21,%%0\n"
  "mr %%%%r23,%%1\n"
  "xor %%%%r18,%%%%r18,%%%%r18\n"
  "xor %%%%r19,%%%%r19,%%%%r19\n"
  "xor %%%%r20,%%%%r20,%%%%r20\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 %%%%r16,8*%d(%%%%r21)\n"
  "ld %%%%r17,8*%d(%%%%r21)\n"
  "mulld  %%%%r24,%%%%r16,%%%%r17\n"
  "mulhdu %%%%r25,%%%%r16,%%%%r17\n"
  "addc   %%%%r18,%%%%r18,%%%%r24\n"
  "adde   %%%%r19,%%%%r19,%%%%r25\n"
  "addze  %%%%r20,%%%%r20\n"
  "addc   %%%%r18,%%%%r18,%%%%r24\n"
  "adde   %%%%r19,%%%%r19,%%%%r25\n"
  "addze  %%%%r20,%%%%r20\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 %%%%r16,8*%d(%%%%r21)\n"
  "mulld  %%%%r24,%%%%r16,%%%%r16\n"
  "mulhdu %%%%r25,%%%%r16,%%%%r16\n"
  "addc   %%%%r18,%%%%r18,%%%%r24\n"
  "adde   %%%%r19,%%%%r19,%%%%r25\n"
  "addze  %%%%r20,%%%%r20\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
  "std %%%%r18,8*%d(%%%%r23)\n"
  "mr  %%%%r18,%%%%r19\n"
  "mr  %%%%r19,%%%%r20\n"
  "xor %%%%r20,%%%%r20,%%%%r20\n"
ENDM
;
; SQR_END
; Parameter 1: Index for final carry
MACRO SQR_END
  "std %%%%r18,8*%d(%%%%r23)\n"
  :
  :"r"(a),"r"(c)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory"  
  );
ENDM
;
; REDC_START macro
;
MACRO REDC_START
  ASM (
  "mr %%%%r21,%%0\n"
  "mr %%%%r22,%%1\n"
  "mr %%%%r23,%%2\n"
  "xor %%%%r18,%%%%r18,%%%%r18\n"
  "xor %%%%r19,%%%%r19,%%%%r19\n"
  "ld  %%%%r18,0(%%%%r21)\n"
ENDM
;
; RFINU macro
;
MACRO RFINU
  "mulld  %%%%r17,%%%%r23,%%%%r18\n"
  "std    %%%%r17,8*%d(%%%%r21)\n"
  "ld     %%%%r16,0(%%%%r22)\n"
  "mulld  %%%%r24,%%%%r16,%%%%r17\n"
  "mulhdu %%%%r25,%%%%r16,%%%%r17\n"
  "addc   %%%%r16,%%%%r18,%%%%r24\n"
  "adde   %%%%r18,%%%%r19,%%%%r25\n"
  "addze  %%%%r19,%%%%r20\n"
  "ld     %%%%r16,8*(%d+1)(%%%%r21)\n"
  "addc   %%%%r18,%%%%r18,%%%%r16\n"
  "addze  %%%%r19,%%%%r19\n"
  "xor    %%%%r20,%%%%r20,%%%%r20\n"
ENDM
;
; RFIND macro
;
MACRO RFIND
  "std   %%%%r18,8*%d(%%%%r21)\n"
  "ld    %%%%r16,8*(%d+1)(%%%%r21)\n"
  "addc  %%%%r18,%%%%r19,%%%%r16\n"
  "addze %%%%r19,%%%%r20\n"
  "xor   %%%%r20,%%%%r20,%%%%r20\n"
ENDM
;
; REDC_END
;
MACRO REDC_END
  "std  %%%%r18,8*%d(%%%%r21)\n"
  "std  %%%%r19,8*(%d+1)(%%%%r21)\n"
  :
  :"r"(a),"r"(b),"r"(ndash)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory"  
  );
ENDM
;
; ADD_START macro - initialise for add/subtract, do first one
;
MACRO ADD_START
  ASM (
  "mr   %%%%r22,%%1\n"
  "mr   %%%%r23,%%2\n"
  "mr   %%%%r24,%%3\n"
  "ld   %%%%r16,0(%%%%r22)\n"
  "ld   %%%%r17,0(%%%%r23)\n"
  "addc %%%%r16,%%%%r16,%%%%r17\n"
  "std  %%%%r16,0(%%%%r24)\n"
ENDM
;
; ADD macro. Add two numbers from memory and store result in memory.
; Don't forget carry bit
;
MACRO ADD
  "ld   %%%%r16,8*%d(%%%%r22)\n"
  "ld   %%%%r17,8*%d(%%%%r23)\n"
  "adde %%%%r16,%%%%r16,%%%%r17\n"
  "std  %%%%r16,8*%d(%%%%r24)\n"
ENDM
;
; ADD_END macro. Catch carry
;
MACRO ADD_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "mr    %%0,%%%%r16\n"
  :"=r"(carry)
  :"r"(a),"r"(b),"r"(c)
  :"r16","r17","r22","r23","r24","memory"
  );
ENDM
;
; INC_START macro. Do first one
;
MACRO INC_START
  ASM (
  "mr   %%%%r22,%%1\n"
  "mr   %%%%r23,%%2\n"
  "ld   %%%%r16,0(%%%%r22)\n"
  "ld   %%%%r17,0(%%%%r23)\n"
  "addc %%%%r16,%%%%r16,%%%%r17\n"
  "std  %%%%r16,0(%%%%r22)\n"
ENDM
;
; INC macro. Add two numbers from memory and store result in memory.
; Don't forget carry bit
;
MACRO INC
  "ld   %%%%r16,8*%d(%%%%r22)\n"
  "ld   %%%%r17,8*%d(%%%%r23)\n"
  "adde %%%%r16,%%%%r16,%%%%r17\n"
  "std  %%%%r16,8*%d(%%%%r22)\n"
ENDM
;
; INC_END macro. Catch carry
;
MACRO INC_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "mr    %%0,%%%%r16\n"
  :"=r"(carry)
  :"r"(a),"r"(b)
  :"r16","r17","r22","r23","memory"
  );
ENDM
;
; SUB_START macro
;
MACRO SUB_START
  ASM (
  "mr   %%%%r22,%%1\n"
  "mr   %%%%r23,%%2\n"
  "mr   %%%%r24,%%3\n"
  "ld   %%%%r16,0(%%%%r22)\n"
  "ld   %%%%r17,0(%%%%r23)\n"
  "subfc %%%%r16,%%%%r17,%%%%r16\n"
  "std   %%%%r16,0(%%%%r24)\n"
ENDM
;
; SUB macro. Subtract two numbers in memory and store result in memory.
;
MACRO SUB
  "ld   %%%%r16,8*%d(%%%%r22)\n"
  "ld   %%%%r17,8*%d(%%%%r23)\n"
  "subfe %%%%r16,%%%%r17,%%%%r16\n"
  "std  %%%%r16,8*%d(%%%%r24)\n"
ENDM
;
; SUB_END macro. Catch carry
;
MACRO SUB_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "subfic %%%%r17,%%%%r16,1\n"
  "mr    %%0,%%%%r17\n"
  :"=r"(carry)
  :"r"(a),"r"(b),"r"(c)
  :"r16","r17","r22","r23","r24","memory"
  );
ENDM
;
; DEC_START macro
;
MACRO DEC_START
  ASM (
  "mr  %%%%r22,%%1\n"
  "mr  %%%%r23,%%2\n"
  "ld  %%%%r16,0(%%%%r22)\n"
  "ld  %%%%r17,0(%%%%r23)\n"
  "subfc %%%%r16,%%%%r17,%%%%r16\n"
  "std  %%%%r16,0(%%%%r22)\n"
ENDM
;
; DEC macro. Subtract two numbers in memory and store result in memory.
;
MACRO DEC
  "ld   %%%%r16,8*%d(%%%%r22)\n"
  "ld   %%%%r17,8*%d(%%%%r23)\n"
  "subfe %%%%r16,%%%%r17,%%%%r16\n"
  "std  %%%%r16,8*%d(%%%%r22)\n"
ENDM
;
; DEC_END macro. Catch carry
;
MACRO DEC_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "subfic %%%%r17,%%%%r16,1\n"
  "mr    %%0,%%%%r17\n"
  :"=r"(carry)
  :"r"(a),"r"(b)
  :"r16","r17","r22","r23","memory"
  );
ENDM
;
; KADD_START macro. Zero Carry flag
;
MACRO KADD_START
  ASM (
  "mr   %%%%r22,%%1\n"
  "mr   %%%%r23,%%2\n"
  "mr   %%%%r24,%%3\n"
  "mtctr %%4\n"
  "xor  %%%%r16,%%%%r16,%%%%r16\n"
  "addc %%%%r16,%%%%r16,%%%%r16\n"
  "k%d:\n"
ENDM
;
; KASL macro. Important that carry flag is undisturbed!
;
MACRO KASL
  "bdz   k%d\n"
  "addi  %%%%r22,%%%%r22,8*%d\n"
  "addi  %%%%r23,%%%%r23,8*%d\n"
  "addi  %%%%r24,%%%%r24,8*%d\n"
  "b k%d\n"
  "k%d:\n"
ENDM
;
; KADD_END macro
;
MACRO KADD_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "mr    %%0,%%%%r16\n"
  :"=r"(carry)
  :"r"(a),"r"(b),"r"(c),"r"(n)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory" 
  );
ENDM
;
; KINC_START macro. Set carry to Zero 
;
MACRO KINC_START
  ASM (
  "mr   %%%%r22,%%1\n"
  "mr   %%%%r23,%%2\n"
  "mtctr %%3\n"
  "xor  %%%%r16,%%%%r16,%%%%r16\n"
  "addc %%%%r16,%%%%r16,%%%%r16\n"
  "k%d:\n"
ENDM
;
; KIDL macro. Important that carry flag is undisturbed!
;
MACRO KIDL
  "bdz k%d\n"
  "addi %%%%r22,%%%%r22,8*%d\n"
  "addi %%%%r23,%%%%r23,8*%d\n"
  "b k%d\n"
  "k%d: \n"
ENDM
;
; KINC_END macro
;
MACRO KINC_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "mr    %%0,%%%%r16\n"
  :"=r"(carry)
  :"r"(a),"r"(b),"r"(n)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory"
  );
ENDM
;
; KDEC_START macro. Set carry
;
MACRO KDEC_START
  ASM (
  "mr %%%%r22,%%1\n"
  "mr %%%%r23,%%2\n"
  "mtctr %%3\n"
  "subfc %%%%r16,%%%%r16,%%%%r16\n"
  "k%d:\n"
ENDM
;
; KDEC_END macro
;
MACRO KDEC_END
  "xor   %%%%r16,%%%%r16,%%%%r16\n"
  "addze %%%%r16,%%%%r16\n"
  "subfic %%%%r17,%%%%r16,1\n"
  "mr    %%0,%%%%r17\n"
  :"=r"(carry)
  :"r"(a),"r"(b),"r"(n)
  :"r16","r17","r18","r19","r20","r21","r22","r23","r24","r25","memory"
  );
ENDM

⌨️ 快捷键说明

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