home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / unix / unixlib_1 / !UnixLib37_src_sys_s__mem < prev    next >
Encoding:
Text File  |  1996-11-09  |  6.2 KB  |  347 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_mem,v $
  4. ; $Date: 1996/11/06 22:01:42 $
  5. ; $Revision: 1.3 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: _mem,v $
  10. ; Revision 1.3  1996/11/06 22:01:42  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.2  1996/10/30 21:59:00  unixlib
  14. ; Massive changes made by Nick Burret and Peter Burwood.
  15. ;
  16. ; Revision 1.1  1996/04/19 21:34:32  simon
  17. ; Initial revision
  18. ;
  19. ;----------------------------------------------------------------------------
  20.  
  21.     GET    Unix37:unixlib.s.asm_dec
  22.  
  23.     AREA    |C$$code|,CODE,READONLY
  24.  
  25.     EXPORT    |_memset|
  26.     EXPORT    |__memset|
  27.     EXPORT    |memset|
  28.  
  29. |memset|
  30. |__memset|
  31.     MOV    ip,a1
  32.     AND    a2,a2,#&ff
  33.     CMP    a3,#4
  34.     BLT    |__memset_l4|
  35.     ANDS    a4,ip,#3
  36.     BEQ    |_memset|
  37.     RSB    a4,a4,#4
  38.     SUB    a3,a3,a4
  39.     CMP    a4,#2
  40.     STRB    a2,[ip],#1
  41.     STRGEB    a2,[ip],#1
  42.     STRGTB    a2,[ip],#1
  43. |_memset|
  44.     ORR    a2,a2,a2,LSL #8
  45.     ORR    a2,a2,a2,LSL #16
  46.     ANDS    a4,a3,#12
  47.     BEQ    |__memset_l2|
  48.     CMP    a4,#8
  49.     STR    a2,[ip],#4
  50.     STRGE    a2,[ip],#4
  51.     STRGT    a2,[ip],#4
  52. |__memset_l2|
  53.     BICS    a3,a3,#12
  54.     MOVEQS    pc,lr
  55.     BICS    a4,a3,#15
  56.     BEQ    |__memset_l5|
  57.     STMFD    sp!,{v1,v2,lr}
  58.     MOV    v1,a2
  59.     MOV    v2,a2
  60.     MOV    lr,a2
  61.     SUB    a3,a3,a4
  62. |__memset_l3|
  63.     STMIA    ip!,{a2,v1,v2,lr}
  64.     SUBS    a4,a4,#32
  65.     STMGEIA ip!,{a2,v1,v2,lr}
  66.     BGT    |__memset_l3|
  67.     LDMFD    sp!,{v1,v2,lr}
  68. |__memset_l4|
  69.     CMP    a3,#0
  70.     MOVEQS    pc,lr
  71. |__memset_l5|
  72.     CMP    a3,#2
  73.     STRB    a2,[ip],#1
  74.     STRGEB    a2,[ip],#1
  75.     STRGTB    a2,[ip],#1
  76.     MOVS    pc,lr
  77.  
  78.  
  79.     EXPORT    |_memcpy|
  80.     EXPORT    |_memmove|
  81. |_memcpy|
  82. |_memmove|
  83.     CMP    a1,a2
  84.     CMPNE    a3,#0
  85.     MOVEQS    pc,lr
  86.     MOV    ip,a1
  87.     CMP    ip,a2
  88.     BLE    |__memcpy_wd|
  89.     ADDGT    ip,ip,a3
  90.     ADDGT    a2,a2,a3
  91.     B    |__memcpy_wu|
  92.  
  93.     EXPORT    |__memcpy|
  94.     EXPORT    |memcpy|
  95.     EXPORT    |__memmove|
  96.     EXPORT    |memmove|
  97. |memcpy|
  98. |__memcpy|
  99. |__memmove|
  100. |memmove|
  101.     CMP    a1,a2
  102.     CMPNE    a3,#0
  103.     MOVEQS    pc,lr
  104.     MOV    ip,a1
  105.     CMP    ip,a2
  106.     ADDGT    ip,ip,a3
  107.     ADDGT    a2,a2,a3
  108.     ANDS    a4,ip,#3
  109.     ANDEQS    a4,a2,#3
  110.     BEQ    |__memcpy_w|
  111.     CMP    a3,#4
  112.     BLT    |__memcpy_b|
  113.  
  114. |__memcpy_c|                ; complex copy
  115.     CMP    ip,a2
  116.     BLE    |__memcpy_cd|
  117.  
  118. |__memcpy_cu|                ; complex copyup - word align ip
  119.     ANDS    a4,ip,#3
  120.     BEQ    |__memcpy_cu_l0|
  121.     SUB    a3,a3,a4
  122.     CMP    a4,#2
  123.     LDRB    a4,[a2,#-1]!
  124.     STRB    a4,[ip,#-1]!
  125.     LDRGEB    a4,[a2,#-1]!
  126.     STRGEB    a4,[ip,#-1]!
  127.     LDRGTB    a4,[a2,#-1]!
  128.     STRGTB    a4,[ip,#-1]!
  129. |__memcpy_cu_l0|
  130.     ANDS    a4,a2,#3
  131.     BEQ    |__memcpy_wu|
  132.     STMFD    sp!,{a1,v1,v2,lr}
  133.     BIC    a2,a2,#3        ; word align a2 [1]
  134.     MOV    a4,a4,LSL #3        ; a4 = shift1
  135.     RSB    v1,a4,#32        ; v1 = shift2
  136.     LDR    a1,[a2,#0]
  137.     ANDS    lr,a3,#12
  138.     BEQ    |__memcpy_cu_l1|
  139.     LDR    v2,[a2,#-4]!
  140.     MOV    a1,a1,LSL v1
  141.     ORR    a1,a1,v2,LSR a4
  142.     STR    a1,[ip,#-4]!
  143.     MOV    a1,v2
  144.     SUBS    lr,lr,#4
  145.     BEQ    |__memcpy_cu_l1|
  146.     LDR    v2,[a2,#-4]!
  147.     MOV    a1,a1,LSL v1
  148.     ORR    a1,a1,v2,LSR a4
  149.     STR    a1,[ip,#-4]!
  150.     MOV    a1,v2
  151.     SUBS    lr,lr,#4
  152.     BEQ    |__memcpy_cu_l1|
  153.     LDR    v2,[a2,#-4]!
  154.     MOV    a1,a1,LSL v1
  155.     ORR    a1,a1,v2,LSR a4
  156.     STR    a1,[ip,#-4]!
  157.     MOV    a1,v2
  158. |__memcpy_cu_l1|
  159.     BICS    a3,a3,#12
  160.     LDMEQFD sp!,{a1,v1,v2,pc}^
  161.     BICS    lr,a3,#15
  162.     BEQ    |__memcpy_cu_l4|
  163.     STMFD    sp!,{v3,v4,v5}
  164.     MOV    v5,a1
  165.     SUB    a3,a3,lr
  166. |__memcpy_cu_l2|
  167.     LDMDB    a2!,{a1,v2,v3,v4}
  168.     MOV    v5,v5,LSL v1
  169.     ORR    v5,v5,v4,LSR a4
  170.     MOV    v4,v4,LSL v1
  171.     ORR    v4,v4,v3,LSR a4
  172.     MOV    v3,v3,LSL v1
  173.     ORR    v3,v3,v2,LSR a4
  174.     MOV    v2,v2,LSL v1
  175.     ORR    v2,v2,a1,LSR a4
  176.     STMDB    ip!,{v2,v3,v4,v5}
  177.     MOV    v5,a1
  178.     SUBS    lr,lr,#16
  179.     BGT    |__memcpy_cu_l2|
  180. |__memcpy_cu_l3|
  181.     LDMFD    sp!,{v3,v4,v5}
  182. |__memcpy_cu_l4|
  183.     ADD    a2,a2,a4,LSR #3        ; reset a2 from [1]
  184.     LDMFD    sp!,{a1,v1,v2,lr}
  185.     CMP    a3,#0
  186.     MOVEQS    pc,lr
  187.     B    |__memcpy_bu|
  188.  
  189. |__memcpy_cd|                ; complex copydown - word align ip
  190.     ANDS    a4,ip,#3
  191.     BEQ    |__memcpy_cd_l0|
  192.     RSB    a4,a4,#4
  193.     SUB    a3,a3,a4
  194.     CMP    a4,#2
  195.     LDRB    a4,[a2],#1
  196.     STRB    a4,[ip],#1
  197.     LDRGEB    a4,[a2],#1
  198.     STRGEB    a4,[ip],#1
  199.     LDRGTB    a4,[a2],#1
  200.     STRGTB    a4,[ip],#1
  201. |__memcpy_cd_l0|
  202.     ANDS    a4,a2,#3
  203.     BEQ    |__memcpy_wd|
  204.     STMFD    sp!,{a1,v1,v2,lr}
  205.     BIC    a2,a2,#3        ; word align a2 [1]
  206.     MOV    a4,a4,LSL #3        ; a4 = shift1
  207.     RSB    v1,a4,#32        ; v1 = shift2
  208.     LDR    a1,[a2],#4
  209.     ANDS    lr,a3,#12
  210.     BEQ    |__memcpy_cd_l1|
  211.     LDR    v2,[a2],#4
  212.     MOV    a1,a1,LSR a4
  213.     ORR    a1,a1,v2,LSL v1
  214.     STR    a1,[ip],#4
  215.     MOV    a1,v2
  216.     SUBS    lr,lr,#4
  217.     BEQ    |__memcpy_cd_l1|
  218.     LDR    v2,[a2],#4
  219.     MOV    a1,a1,LSR a4
  220.     ORR    a1,a1,v2,LSL v1
  221.     STR    a1,[ip],#4
  222.     MOV    a1,v2
  223.     SUBS    lr,lr,#4
  224.     BEQ    |__memcpy_cd_l1|
  225.     LDR    v2,[a2],#4
  226.     MOV    a1,a1,LSR a4
  227.     ORR    a1,a1,v2,LSL v1
  228.     STR    a1,[ip],#4
  229.     MOV    a1,v2
  230. |__memcpy_cd_l1|
  231.     BICS    a3,a3,#12
  232.     LDMEQFD sp!,{a1,v1,v2,pc}^
  233.     BICS    lr,a3,#15
  234.     BEQ    |__memcpy_cd_l4|
  235.     STMFD    sp!,{v3,v4,v5}
  236.     SUB    a3,a3,lr
  237. |__memcpy_cd_l2|
  238.     LDMIA    a2!,{v2,v3,v4,v5}
  239.     MOV    a1,a1,LSR a4
  240.     ORR    a1,a1,v2,LSL v1
  241.     MOV    v2,v2,LSR a4
  242.     ORR    v2,v2,v3,LSL v1
  243.     MOV    v3,v3,LSR a4
  244.     ORR    v3,v3,v4,LSL v1
  245.     MOV    v4,v4,LSR a4
  246.     ORR    v4,v4,v5,LSL v1
  247.     STMIA    ip!,{a1,v2,v3,v4}
  248.     MOV    a1,v5
  249.     SUBS    lr,lr,#16
  250.     BGT    |__memcpy_cd_l2|
  251. |__memcpy_cd_l3|
  252.     LDMFD    sp!,{v3,v4,v5}
  253. |__memcpy_cd_l4|
  254.     SUB    a2,a2,v1,LSR #3        ; reset a2 from [1]
  255.     LDMFD    sp!,{a1,v1,v2,lr}
  256.     CMP    a3,#0
  257.     MOVEQS    pc,lr
  258.     B    |__memcpy_bd|
  259.  
  260. |__memcpy_b|                ; byte copy 1 <= length <= 3
  261.     CMP    ip,a2
  262.     BLE    |__memcpy_bd|
  263.  
  264. |__memcpy_bu|                ; byte copyup
  265.     CMP    a3,#2
  266.     LDRB    a4,[a2,#-1]!
  267.     STRB    a4,[ip,#-1]!
  268.     LDRGEB    a4,[a2,#-1]!
  269.     STRGEB    a4,[ip,#-1]!
  270.     LDRGTB    a4,[a2,#-1]!
  271.     STRGTB    a4,[ip,#-1]!
  272.     MOVS    pc,lr
  273.  
  274. |__memcpy_bd|                ; byte copydown
  275.     CMP    a3,#2
  276.     LDRB    a4,[a2],#1
  277.     STRB    a4,[ip],#1
  278.     LDRGEB    a4,[a2],#1
  279.     STRGEB    a4,[ip],#1
  280.     LDRGTB    a4,[a2],#1
  281.     STRGTB    a4,[ip],#1
  282.     MOVS    pc,lr
  283.  
  284. |__memcpy_w|                ; word aligned copy
  285.     CMP    ip,a2
  286.     BLE    |__memcpy_wd|
  287.  
  288. |__memcpy_wu|                ; word aligned copyup
  289.     ANDS    a4,a3,#12
  290.     BEQ    |__memcpy_wu_l0|
  291.     CMP    a4,#8
  292.     LDR    a4,[a2,#-4]!
  293.     STR    a4,[ip,#-4]!
  294.     LDRGE    a4,[a2,#-4]!
  295.     STRGE    a4,[ip,#-4]!
  296.     LDRGT    a4,[a2,#-4]!
  297.     STRGT    a4,[ip,#-4]!
  298. |__memcpy_wu_l0|
  299.     BICS    a3,a3,#12
  300.     MOVEQS    pc,lr
  301.     BICS    a4,a3,#15
  302.     BEQ    |__memcpy_bu|
  303.     STMFD    sp!,{a1,v1,v2,lr}
  304.     SUB    a3,a3,a4
  305. |__memcpy_wu_l1|
  306.     LDMDB    a2!,{a1,v1,v2,lr}
  307.     STMDB    ip!,{a1,v1,v2,lr}
  308.     SUBS    a4,a4,#32
  309.     LDMGEDB a2!,{a1,v1,v2,lr}
  310.     STMGEDB ip!,{a1,v1,v2,lr}
  311.     BGT    |__memcpy_wu_l1|
  312.     CMP    a3,#0
  313.     LDMFD    sp!,{a1,v1,v2,lr}
  314.     MOVEQS    pc,lr
  315.     B    |__memcpy_bu|
  316.  
  317. |__memcpy_wd|                ; word aligned copydown
  318.     ANDS    a4,a3,#12
  319.     BEQ    |__memcpy_wd_l0|
  320.     CMP    a4,#8
  321.     LDR    a4,[a2],#4
  322.     STR    a4,[ip],#4
  323.     LDRGE    a4,[a2],#4
  324.     STRGE    a4,[ip],#4
  325.     LDRGT    a4,[a2],#4
  326.     STRGT    a4,[ip],#4
  327. |__memcpy_wd_l0|
  328.     BICS    a3,a3,#12
  329.     MOVEQS    pc,lr
  330.     BICS    a4,a3,#15
  331.     BEQ    |__memcpy_bd|
  332.     STMFD    sp!,{a1,v1,v2,lr}
  333.     SUB    a3,a3,a4
  334. |__memcpy_wd_l1|
  335.     LDMIA    a2!,{a1,v1,v2,lr}
  336.     STMIA    ip!,{a1,v1,v2,lr}
  337.     SUBS    a4,a4,#32
  338.     LDMGEIA a2!,{a1,v1,v2,lr}
  339.     STMGEIA ip!,{a1,v1,v2,lr}
  340.     BGT    |__memcpy_wd_l1|
  341.     CMP    a3,#0
  342.     LDMFD    sp!,{a1,v1,v2,lr}
  343.     MOVEQS    pc,lr
  344.     B    |__memcpy_bd|
  345.  
  346.     END
  347.