movebytes.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:3k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)movebytes.c 1.10 98/02/15 Copyright 1985 J. Schilling */
  2. /*
  3.  * move data
  4.  *
  5.  * Copyright (c) 1985 J. Schilling
  6.  */
  7. /*
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2, or (at your option)
  11.  * any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; see the file COPYING.  If not, write to
  20.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22. #include <standard.h>
  23. #include <align.h>
  24. #define DO8(a) a;a;a;a;a;a;a;a;
  25. char *movebytes(fromv, tov, cnt)
  26. const void *fromv;
  27. void *tov;
  28. int cnt;
  29. {
  30. register const char *from = fromv;
  31. register char *to = tov;
  32. register int n;
  33. if ((n = cnt) == 0)
  34. return (to);
  35. if (from >= to) {
  36. /*
  37.  * source is on higher adresses than destination:
  38.  * move bytes forwards
  39.  */
  40. if (n >= 8 * sizeof(long)) {
  41. if (l2aligned(from, to)) {
  42. register const long *froml = (const long *)from;
  43. register long *tol = (long *)to;
  44. register int rem = n % (8 * sizeof (long));
  45. n /= (8 * sizeof (long));
  46. do {
  47. DO8 (*tol++ = *froml++);
  48. } while (--n > 0);
  49. from = (const char *)froml;
  50. to = (char *)tol;
  51. n = rem;
  52. }
  53. if (n >= 8) {
  54. n -= 8;
  55. do {
  56. DO8 (*to++ = *from++);
  57. } while ((n -= 8) >= 0);
  58. n += 8;
  59. }
  60. if (n > 0) do {
  61. *to++ = *from++;
  62. } while (--n > 0);
  63. return (to);
  64. }
  65. if (n > 0) do {
  66. *to++ = *from++;
  67. } while (--n > 0);
  68. return (to);
  69. } else {
  70. char *ep;
  71. /*
  72.  * source is on lower adresses than destination:
  73.  * move bytes backwards
  74.  */
  75. to += n;
  76. from += n;
  77. ep = to;
  78. if (n >= 8 * sizeof(long)) {
  79. if (l2aligned(from, to)) {
  80. register const long *froml = (const long *)from;
  81. register long *tol = (long *)to;
  82. register int rem = n % (8 * sizeof (long));
  83. n /= (8 * sizeof (long));
  84. do {
  85. DO8 (*--tol = *--froml);
  86. } while (--n > 0);
  87. from = (const char *)froml;
  88. to = (char *)tol;
  89. n = rem;
  90. }
  91. if (n >= 8) {
  92. n -= 8;
  93. do {
  94. DO8 (*--to = *--from);
  95. } while ((n -= 8) >= 0);
  96. n += 8;
  97. }
  98. if (n > 0) do {
  99. *--to = *--from;
  100. } while (--n > 0);
  101. return (ep);
  102. }
  103. if (n > 0) do {
  104. *--to = *--from;
  105. } while (--n > 0);
  106. return (ep);
  107. }
  108. }