home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / sys / s / _mem < prev    next >
Text File  |  1994-02-26  |  9KB  |  324 lines

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