mpi_mips.s
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:10k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation. Portions created by Netscape are 
  16.  * Copyright (C) 2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above. If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  *  $Id: mpi_mips.s,v 1.2 2000/08/31 02:40:32 nelsonb%netscape.com Exp $
  33.  */
  34. #include <regdef.h>
  35.         .set    noreorder
  36.         .set    noat
  37.         .section        .text, 1, 0x00000006, 4, 4
  38. .text:
  39.         .section        .text
  40.         .ent    s_mpv_mul_d_add
  41.         .globl  s_mpv_mul_d_add
  42. s_mpv_mul_d_add: 
  43.  #/* c += a * b */
  44.  #void s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b, 
  45.  #       mp_digit *c)
  46.  #{
  47.  #  mp_digit   a0, a1; regs a4, a5
  48.  #  mp_digit   c0, c1;  regs a6, a7
  49.  #  mp_digit   cy = 0;  reg t2
  50.  #  mp_word    w0, w1;  regs t0, t1
  51.  #
  52.  #  if (a_len) {
  53. beq a1,zero,.L.1
  54. move t2,zero # cy = 0
  55. dsll32 a2,a2,0 # "b" is sometimes negative (?!?!)
  56. dsrl32 a2,a2,0 # This clears the upper 32 bits.
  57.  #    a0 = a[0];
  58. lwu a4,0(a0)
  59.  #    w0 = ((mp_word)b * a0);
  60. dmultu a2,a4
  61.  #    if (--a_len) {
  62. addiu a1,a1,-1
  63. beq a1,zero,.L.2
  64.  #      while (a_len >= 2) {
  65. sltiu t3,a1,2
  66. bne t3,zero,.L.3
  67.  #   a1     = a[1];
  68. lwu a5,4(a0)
  69. .L.4:
  70.  #   a_len -= 2;
  71.         addiu a1,a1,-2
  72.  #   c0     = c[0];
  73. lwu a6,0(a3)
  74.  #   w0    += cy;
  75. mflo t0
  76. daddu t0,t0,t2
  77.  #   w0    += c0;
  78. daddu t0,t0,a6
  79.  #   w1     = (mp_word)b * a1; 
  80. dmultu a2,a5 #
  81.  #   cy     = CARRYOUT(w0);
  82. dsrl32 t2,t0,0
  83.  #   c[0]   = ACCUM(w0);
  84. sw t0,0(a3)
  85.  #   a0     = a[2];
  86. lwu a4,8(a0)
  87.  #   a     += 2;
  88. addiu a0,a0,8
  89.  #   c1     = c[1];
  90. lwu a7,4(a3)
  91.  #   w1    += cy;
  92. mflo t1
  93. daddu t1,t1,t2
  94.  #   w1    += c1;
  95. daddu t1,t1,a7
  96.  #   w0     = (mp_word)b * a0;
  97. dmultu a2,a4 #
  98.  #   cy     = CARRYOUT(w1);
  99. dsrl32 t2,t1,0
  100.  #   c[1]   = ACCUM(w1);
  101. sw t1,4(a3)
  102.  #   c     += 2;
  103. addiu a3,a3,8
  104. sltiu t3,a1,2
  105. beq t3,zero,.L.4
  106.  #   a1     = a[1];
  107. lwu a5,4(a0)
  108.  #      }
  109. .L.3:
  110.  #      c0       = c[0];
  111. lwu a6,0(a3)
  112.  #      w0      += cy;
  113.  #      if (a_len) {
  114. mflo t0
  115. beq a1,zero,.L.5
  116. daddu t0,t0,t2
  117.  #   w1     = (mp_word)b * a1; 
  118. dmultu a2,a5
  119.  #   w0    += c0;
  120. daddu t0,t0,a6 #
  121.  #   cy     = CARRYOUT(w0);
  122. dsrl32 t2,t0,0
  123.  #   c[0]   = ACCUM(w0);
  124. sw t0,0(a3)
  125.  #   c1     = c[1];
  126. lwu a7,4(a3)
  127.  #   w1    += cy;
  128. mflo t1
  129. daddu t1,t1,t2
  130.  #   w1    += c1;
  131. daddu t1,t1,a7
  132.  #   c[1]   = ACCUM(w1);
  133. sw t1,4(a3)
  134.  #   cy     = CARRYOUT(w1);
  135. dsrl32 t2,t1,0
  136.  #   c     += 1;
  137. b .L.6
  138. addiu a3,a3,4
  139.  #      } else {
  140. .L.5:
  141.  #   w0    += c0;
  142. daddu t0,t0,a6
  143.  #   c[0]   = ACCUM(w0);
  144. sw t0,0(a3)
  145.  #   cy     = CARRYOUT(w0);
  146. b .L.6
  147. dsrl32 t2,t0,0
  148.  #      }
  149.  #    } else {
  150. .L.2:
  151.  #      c0     = c[0];
  152. lwu a6,0(a3)
  153.  #      w0    += c0;
  154. mflo t0
  155. daddu t0,t0,a6
  156.  #      c[0]   = ACCUM(w0);
  157. sw t0,0(a3)
  158.  #      cy     = CARRYOUT(w0);
  159. dsrl32 t2,t0,0
  160.  #    }
  161. .L.6:
  162.  #    c[1] = cy;
  163. jr ra
  164. sw t2,4(a3)
  165.  #  }
  166. .L.1:
  167. jr ra
  168. nop
  169.  #}
  170.  #
  171.         .end    s_mpv_mul_d_add
  172.         .ent    s_mpv_mul_d_add_prop
  173.         .globl  s_mpv_mul_d_add_prop
  174. s_mpv_mul_d_add_prop: 
  175.  #/* c += a * b */
  176.  #void s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b, 
  177.  #       mp_digit *c)
  178.  #{
  179.  #  mp_digit   a0, a1; regs a4, a5
  180.  #  mp_digit   c0, c1;  regs a6, a7
  181.  #  mp_digit   cy = 0;  reg t2
  182.  #  mp_word    w0, w1;  regs t0, t1
  183.  #
  184.  #  if (a_len) {
  185. beq a1,zero,.M.1
  186. move t2,zero # cy = 0
  187. dsll32 a2,a2,0 # "b" is sometimes negative (?!?!)
  188. dsrl32 a2,a2,0 # This clears the upper 32 bits.
  189.  #    a0 = a[0];
  190. lwu a4,0(a0)
  191.  #    w0 = ((mp_word)b * a0);
  192. dmultu a2,a4
  193.  #    if (--a_len) {
  194. addiu a1,a1,-1
  195. beq a1,zero,.M.2
  196.  #      while (a_len >= 2) {
  197. sltiu t3,a1,2
  198. bne t3,zero,.M.3
  199.  #   a1     = a[1];
  200. lwu a5,4(a0)
  201. .M.4:
  202.  #   a_len -= 2;
  203.         addiu a1,a1,-2
  204.  #   c0     = c[0];
  205. lwu a6,0(a3)
  206.  #   w0    += cy;
  207. mflo t0
  208. daddu t0,t0,t2
  209.  #   w0    += c0;
  210. daddu t0,t0,a6
  211.  #   w1     = (mp_word)b * a1; 
  212. dmultu a2,a5 #
  213.  #   cy     = CARRYOUT(w0);
  214. dsrl32 t2,t0,0
  215.  #   c[0]   = ACCUM(w0);
  216. sw t0,0(a3)
  217.  #   a0     = a[2];
  218. lwu a4,8(a0)
  219.  #   a     += 2;
  220. addiu a0,a0,8
  221.  #   c1     = c[1];
  222. lwu a7,4(a3)
  223.  #   w1    += cy;
  224. mflo t1
  225. daddu t1,t1,t2
  226.  #   w1    += c1;
  227. daddu t1,t1,a7
  228.  #   w0     = (mp_word)b * a0;
  229. dmultu a2,a4 #
  230.  #   cy     = CARRYOUT(w1);
  231. dsrl32 t2,t1,0
  232.  #   c[1]   = ACCUM(w1);
  233. sw t1,4(a3)
  234.  #   c     += 2;
  235. addiu a3,a3,8
  236. sltiu t3,a1,2
  237. beq t3,zero,.M.4
  238.  #   a1     = a[1];
  239. lwu a5,4(a0)
  240.  #      }
  241. .M.3:
  242.  #      c0       = c[0];
  243. lwu a6,0(a3)
  244.  #      w0      += cy;
  245.  #      if (a_len) {
  246. mflo t0
  247. beq a1,zero,.M.5
  248. daddu t0,t0,t2
  249.  #   w1     = (mp_word)b * a1; 
  250. dmultu a2,a5
  251.  #   w0    += c0;
  252. daddu t0,t0,a6 #
  253.  #   cy     = CARRYOUT(w0);
  254. dsrl32 t2,t0,0
  255.  #   c[0]   = ACCUM(w0);
  256. sw t0,0(a3)
  257.  #   c1     = c[1];
  258. lwu a7,4(a3)
  259.  #   w1    += cy;
  260. mflo t1
  261. daddu t1,t1,t2
  262.  #   w1    += c1;
  263. daddu t1,t1,a7
  264.  #   c[1]   = ACCUM(w1);
  265. sw t1,4(a3)
  266.  #   cy     = CARRYOUT(w1);
  267. dsrl32 t2,t1,0
  268.  #   c     += 1;
  269. b .M.6
  270. addiu a3,a3,8
  271.  #      } else {
  272. .M.5:
  273.  #   w0    += c0;
  274. daddu t0,t0,a6
  275.  #   c[0]   = ACCUM(w0);
  276. sw t0,0(a3)
  277.  #   cy     = CARRYOUT(w0);
  278. dsrl32 t2,t0,0
  279. b .M.6
  280. addiu a3,a3,4
  281.  #      }
  282.  #    } else {
  283. .M.2:
  284.  #      c0     = c[0];
  285. lwu a6,0(a3)
  286.  #      w0    += c0;
  287. mflo t0
  288. daddu t0,t0,a6
  289.  #      c[0]   = ACCUM(w0);
  290. sw t0,0(a3)
  291.  #      cy     = CARRYOUT(w0);
  292. dsrl32 t2,t0,0
  293. addiu a3,a3,4
  294.  #    }
  295. .M.6:
  296.  #    while (cy) {
  297. beq t2,zero,.M.1
  298. nop
  299. .M.7:
  300.  #      mp_word w = (mp_word)*c + cy;
  301. lwu a6,0(a3)
  302. daddu t2,t2,a6
  303.  #      *c++ = ACCUM(w);
  304. sw t2,0(a3)
  305.  #      cy = CARRYOUT(w);
  306. dsrl32 t2,t2,0
  307. bne t2,zero,.M.7
  308. addiu a3,a3,4
  309.  #  }
  310. .M.1:
  311. jr ra
  312. nop
  313.  #}
  314.  #
  315.         .end    s_mpv_mul_d_add_prop
  316.         .ent    s_mpv_mul_d
  317.         .globl  s_mpv_mul_d
  318. s_mpv_mul_d: 
  319.  #/* c = a * b */
  320.  #void s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, 
  321.  #       mp_digit *c)
  322.  #{
  323.  #  mp_digit   a0, a1; regs a4, a5
  324.  #  mp_digit   cy = 0;  reg t2
  325.  #  mp_word    w0, w1;  regs t0, t1
  326.  #
  327.  #  if (a_len) {
  328. beq a1,zero,.N.1
  329. move t2,zero # cy = 0
  330. dsll32 a2,a2,0 # "b" is sometimes negative (?!?!)
  331. dsrl32 a2,a2,0 # This clears the upper 32 bits.
  332.  #    a0 = a[0];
  333. lwu a4,0(a0)
  334.  #    w0 = ((mp_word)b * a0);
  335. dmultu a2,a4
  336.  #    if (--a_len) {
  337. addiu a1,a1,-1
  338. beq a1,zero,.N.2
  339.  #      while (a_len >= 2) {
  340. sltiu t3,a1,2
  341. bne t3,zero,.N.3
  342.  #   a1     = a[1];
  343. lwu a5,4(a0)
  344. .N.4:
  345.  #   a_len -= 2;
  346.         addiu a1,a1,-2
  347.  #   w0    += cy;
  348. mflo t0
  349. daddu t0,t0,t2
  350.  #   cy     = CARRYOUT(w0);
  351. dsrl32 t2,t0,0
  352.  #   w1     = (mp_word)b * a1; 
  353. dmultu a2,a5
  354.  #   c[0]   = ACCUM(w0);
  355. sw t0,0(a3)
  356.  #   a0     = a[2];
  357. lwu a4,8(a0)
  358.  #   a     += 2;
  359. addiu a0,a0,8
  360.  #   w1    += cy;
  361. mflo t1
  362. daddu t1,t1,t2
  363.  #   cy     = CARRYOUT(w1);
  364. dsrl32 t2,t1,0
  365.  #   w0     = (mp_word)b * a0;
  366. dmultu a2,a4
  367.  #   c[1]   = ACCUM(w1);
  368. sw t1,4(a3)
  369.  #   c     += 2;
  370. addiu a3,a3,8
  371. sltiu t3,a1,2
  372. beq t3,zero,.N.4
  373.  #   a1     = a[1];
  374. lwu a5,4(a0)
  375.  #      }
  376. .N.3:
  377.  #      w0      += cy;
  378.  #      if (a_len) {
  379. mflo t0
  380. beq a1,zero,.N.5
  381. daddu t0,t0,t2
  382.  #   w1     = (mp_word)b * a1; 
  383. dmultu a2,a5 #
  384.  #   cy     = CARRYOUT(w0);
  385. dsrl32 t2,t0,0
  386.  #   c[0]   = ACCUM(w0);
  387. sw t0,0(a3)
  388.  #   w1    += cy;
  389. mflo t1
  390. daddu t1,t1,t2
  391.  #   c[1]   = ACCUM(w1);
  392. sw t1,4(a3)
  393.  #   cy     = CARRYOUT(w1);
  394. dsrl32 t2,t1,0
  395.  #   c     += 1;
  396. b .N.6
  397. addiu a3,a3,4
  398.  #      } else {
  399. .N.5:
  400.  #   c[0]   = ACCUM(w0);
  401. sw t0,0(a3)
  402.  #   cy     = CARRYOUT(w0);
  403. b .N.6
  404. dsrl32 t2,t0,0
  405.  #      }
  406.  #    } else {
  407. .N.2:
  408. mflo t0
  409.  #      c[0]   = ACCUM(w0);
  410. sw t0,0(a3)
  411.  #      cy     = CARRYOUT(w0);
  412. dsrl32 t2,t0,0
  413.  #    }
  414. .N.6:
  415.  #    c[1] = cy;
  416. jr ra
  417. sw t2,4(a3)
  418.  #  }
  419. .N.1:
  420. jr ra
  421. nop
  422.  #}
  423.  #
  424.         .end    s_mpv_mul_d
  425.         .ent    s_mpv_sqr_add_prop
  426.         .globl  s_mpv_sqr_add_prop
  427.  #void   s_mpv_sqr_add_prop(const mp_digit *a, mp_size a_len, mp_digit *sqrs);
  428.  # registers
  429.  # a0 *a
  430.  # a1 a_len
  431.  # a2 *sqr
  432.  # a3 digit from *a, a_i
  433.  # a4 square of digit from a
  434.  # a5,a6 next 2 digits in sqr
  435.  # a7,t0 carry 
  436. s_mpv_sqr_add_prop:
  437. move a7,zero
  438. move t0,zero
  439. lwu a3,0(a0)
  440. addiu a1,a1,-1 # --a_len
  441. dmultu a3,a3
  442. beq a1,zero,.P.3 # jump if we've already done the only sqr
  443. addiu a0,a0,4 # ++a
  444. .P.2:
  445.         lwu a5,0(a2)
  446.         lwu a6,4(a2)
  447. addiu a2,a2,8 # sqrs += 2;
  448. dsll32 a6,a6,0
  449. daddu a5,a5,a6
  450. lwu a3,0(a0)
  451. addiu a0,a0,4 # ++a
  452. mflo a4
  453. daddu a6,a5,a4
  454. sltu a7,a6,a5 # a7 = a6 < a5 detect overflow
  455. dmultu a3,a3
  456. daddu a4,a6,t0
  457. sltu t0,a4,a6
  458. add t0,t0,a7
  459. sw a4,-8(a2)
  460. addiu a1,a1,-1 # --a_len
  461. dsrl32 a4,a4,0
  462. bne a1,zero,.P.2 # loop if a_len > 0
  463. sw a4,-4(a2)
  464. .P.3:
  465.         lwu a5,0(a2)
  466.         lwu a6,4(a2)
  467. addiu a2,a2,8 # sqrs += 2;
  468. dsll32 a6,a6,0
  469. daddu a5,a5,a6
  470. mflo a4
  471. daddu a6,a5,a4
  472. sltu a7,a6,a5 # a7 = a6 < a5 detect overflow
  473. daddu a4,a6,t0
  474. sltu t0,a4,a6
  475. add t0,t0,a7
  476. sw a4,-8(a2)
  477. beq t0,zero,.P.9 # jump if no carry
  478. dsrl32 a4,a4,0
  479. .P.8:
  480. sw a4,-4(a2)
  481. /* propagate final carry */
  482. lwu a5,0(a2)
  483. daddu a6,a5,t0
  484. sltu t0,a6,a5
  485. bne t0,zero,.P.8 # loop if carry persists
  486. addiu a2,a2,4 # sqrs++
  487. .P.9:
  488. jr ra
  489. sw a4,-4(a2)
  490.         .end    s_mpv_sqr_add_prop