home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Kasumi / source / a64_resample.asm64 < prev    next >
Encoding:
Text File  |  2009-09-14  |  12.1 KB  |  621 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Graphics support library
  3. ;    Copyright (C) 1998-2004 Avery Lee
  4. ;
  5. ;    This program is free software; you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation; either version 2 of the License, or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License    
  16. ;    along with this program; if not, write to the Free Software
  17. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ;
  19.  
  20.     default    rel
  21.  
  22.     segment    .rdata, align=16
  23.  
  24.     align 16
  25. roundval        dq    0000200000002000h, 0000200000002000h
  26.  
  27.  
  28.     segment    .text
  29.  
  30.  
  31. %macro VDSAVE 1-*
  32.  
  33.     %rep    %0
  34.         %rotate -1
  35.         push        %1
  36.         [pushreg    %1]
  37.     %endrep
  38.  
  39. %endmacro
  40.  
  41. %macro VDRESTORE 1-*
  42.  
  43.     %rep    %0
  44.         pop            %1
  45.  
  46.         %rotate 1
  47.     %endrep
  48.  
  49. %endmacro
  50.  
  51. %macro VDSAVEXMM128    2
  52. %assign    %%count        %2 + 1 - %1
  53. %assign %%stkoffset    0
  54. %assign %%reg        %1
  55.  
  56.     sub rsp, %%count*16+8
  57.     [allocstack %%count*16]
  58.  
  59.     %rep %%count
  60.         movdqa    oword [rsp+%%stkoffset], xmm %+ %%reg
  61.         [savexmm128 xmm %+ %%reg, %%stkoffset]
  62.  
  63.         %assign    %%stkoffset    %%stkoffset + 16
  64.         %assign %%reg        %%reg + 1
  65.     %endrep
  66. %endmacro
  67.  
  68. %macro VDRESTOREXMM128    2
  69. %assign    %%count        %2+1-%1
  70. %assign    %%stkoffset    %%count*16
  71. %assign    %%reg        %2
  72.  
  73.     %rep    %%count
  74.         %assign %%stkoffset %%stkoffset-16
  75.         movdqa xmm %+ %%reg, oword [rsp+%%stkoffset]
  76.  
  77.         %assign %%reg %%reg-1
  78.     %endrep
  79.  
  80.     add rsp, %%count*16+8
  81. %endmacro
  82.  
  83. ;-------------------------------------------------------------------------
  84. ;
  85. ;    long vdasm_resize_table_row_SSE2(
  86. ;        Pixel *out,            // rcx
  87. ;        Pixel *in,            // rdx
  88. ;        int *filter,        // r8
  89. ;        int filter_width,    // r9d
  90. ;        PixDim w,            // [rsp+40]
  91. ;        long accum,            // [rsp+48]
  92. ;        long frac);            // [rsp+56]
  93. ;
  94.     global vdasm_resize_table_row_SSE2
  95. proc_frame vdasm_resize_table_row_SSE2
  96.  
  97.     VDSAVE            rbx, rsi, rdi, rbp, r12, r13, r14, r15
  98.     VDSAVEXMM128    6, 15
  99. end_prolog
  100.  
  101.     .parms equ rsp+168+64
  102.  
  103.     mov            r10d, dword [.parms+40]
  104.     shl            r10, 2
  105.     add            rcx, r10
  106.     neg            r10
  107.     shl            r9d, 2                    ;filter_width <<= 2
  108.  
  109.     movaps        xmm6, oword [roundval]
  110.     pxor        xmm5, xmm5
  111.     mov            rsi, rdx
  112.     shr            rsi, 2
  113.  
  114.     mov            edi, [.parms+48]
  115.     mov            eax, edi
  116.     shl            edi, 16
  117.     sar            rax, 16
  118.     add            rsi, rax
  119.     mov            ebp, [.parms+56]
  120.     movsxd        r11, ebp
  121.     shl            ebp, 16
  122.     sar            r11, 16
  123.  
  124.     ;register map
  125.     ;
  126.     ;eax        temp coefficient pair counter
  127.     ;rbx        temp coefficient pointer
  128.     ;rcx        destination
  129.     ;rdx        temp source
  130.     ;rsi        source/4
  131.     ;edi        accumulator
  132.     ;ebp        fractional increment
  133.     ;r8            filter
  134.     ;r9            filter_width*4
  135.     ;r10        -width*4
  136.     ;r11        integral increment
  137.     ;r12
  138.     ;r13
  139.     ;r14
  140.     ;r15
  141.  
  142.     cmp            r9d, 16
  143.     jz            .accel_4coeff
  144.     cmp            r9d, 24
  145.     jz            .accel_6coeff
  146.  
  147.     test        r9d, 8
  148.     jz            .pixelloop_even_pairs
  149.     cmp            r9d, 8
  150.     jnz            .pixelloop_odd_pairs
  151.  
  152. .pixelloop_single_pairs:
  153.     mov            eax, edi
  154.     shr            eax, 24
  155.     imul        eax, r9d
  156.     
  157.     lea            rdx, [rsi*4]
  158.  
  159.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  160.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  161.     punpcklbw    xmm0, xmm1
  162.     punpcklbw    xmm0, xmm5
  163.     movq        xmm1, qword [r8+rax]
  164.     pshufd        xmm1, xmm1, 01000100b
  165.     pmaddwd        xmm0, xmm1
  166.     
  167.     movdqa        xmm4, xmm6
  168.     paddd        xmm4, xmm0
  169.  
  170.     psrad        xmm4, 14
  171.     packssdw    xmm4, xmm4
  172.     packuswb    xmm4, xmm4
  173.  
  174.     add            edi, ebp
  175.     adc            rsi, r11
  176.  
  177.     movd        dword [rcx+r10], xmm4
  178.     add            r10, 4
  179.     jnz            .pixelloop_single_pairs
  180.     jmp            .xit
  181.  
  182. .pixelloop_odd_pairs:
  183.     movdqa        xmm4, xmm6
  184.  
  185.     mov            eax, edi
  186.     shr            eax, 24
  187.     imul        eax, r9d
  188.     lea            rbx, [r8+rax]
  189.  
  190.     lea            rdx, [rsi*4]
  191.     lea            rax, [r9-8]
  192. .coeffloop_odd_pairs:
  193.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  194.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  195.     movd        xmm2, dword [rdx+8]        ;xmm2 = p2
  196.     movd        xmm3, dword [rdx+12]        ;xmm3 = p3
  197.     add            rdx, 16
  198.     punpcklbw    xmm0, xmm1
  199.     punpcklbw    xmm2, xmm3
  200.     punpcklbw    xmm0, xmm5
  201.     punpcklbw    xmm2, xmm5
  202.     movq        xmm1, qword [rbx]
  203.     movq        xmm3, qword [rbx+8]
  204.     add            rbx, 16
  205.     pshufd        xmm1, xmm1, 01000100b
  206.     pshufd        xmm3, xmm3, 01000100b
  207.     pmaddwd        xmm0, xmm1
  208.     pmaddwd        xmm2, xmm3
  209.     paddd        xmm0, xmm2
  210.     paddd        xmm4, xmm0
  211.     sub            eax, 16
  212.     jnz            .coeffloop_odd_pairs
  213.  
  214.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  215.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  216.     punpcklbw    xmm0, xmm1
  217.     punpcklbw    xmm0, xmm5
  218.     movq        xmm1, qword [rbx]
  219.     pshufd        xmm1, xmm1, 01000100b
  220.     pmaddwd        xmm0, xmm1
  221.     paddd        xmm4, xmm0
  222.  
  223.     psrad        xmm4, 14
  224.     packssdw    xmm4, xmm4
  225.     packuswb    xmm4, xmm4
  226.  
  227.     add            edi, ebp
  228.     adc            rsi, r11
  229.  
  230.     movd        dword [rcx+r10], xmm4
  231.     add            r10, 4
  232.     jnz            .pixelloop_odd_pairs
  233.     jmp            .xit
  234.  
  235. .pixelloop_even_pairs:
  236.     movdqa        xmm4, xmm6
  237.  
  238.     mov            eax, edi
  239.     shr            eax, 24
  240.     imul        eax, r9d
  241.     lea            rbx, [r8+rax]
  242.  
  243.     lea            rdx, [rsi*4]
  244.     mov            eax, r9d
  245. .coeffloop_even_pairs:
  246.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  247.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  248.     movd        xmm2, dword [rdx+8]        ;xmm2 = p2
  249.     movd        xmm3, dword [rdx+12]        ;xmm3 = p3
  250.     add            rdx, 16
  251.     punpcklbw    xmm0, xmm1
  252.     punpcklbw    xmm2, xmm3
  253.     punpcklbw    xmm0, xmm5
  254.     punpcklbw    xmm2, xmm5
  255.     movq        xmm1, qword [rbx]
  256.     movq        xmm3, qword [rbx+8]
  257.     add            rbx, 16
  258.     pshufd        xmm1, xmm1, 01000100b
  259.     pshufd        xmm3, xmm3, 01000100b
  260.     pmaddwd        xmm0, xmm1
  261.     pmaddwd        xmm2, xmm3
  262.     paddd        xmm0, xmm2
  263.     paddd        xmm4, xmm0
  264.     sub            eax, 16
  265.     jnz            .coeffloop_even_pairs
  266.  
  267.     psrad        xmm4, 14
  268.     packssdw    xmm4, xmm4
  269.     packuswb    xmm4, xmm4
  270.  
  271.     add            edi, ebp
  272.     adc            rsi, r11
  273.  
  274.     movd        dword [rcx+r10], xmm4
  275.     add            r10, 4
  276.     jnz            .pixelloop_even_pairs
  277.  
  278. .xit:
  279.     VDRESTOREXMM128    6, 15
  280.     VDRESTORE    rbx, rsi, rdi, rbp, r12, r13, r14, r15
  281.     ret
  282.  
  283. .accel_4coeff:
  284. .pixelloop_4coeff:
  285.     pxor        xmm5, xmm5
  286.     movdqa        xmm4, xmm6
  287.  
  288.     mov            eax, 0ff000000h
  289.     lea            rdx, [rsi*4]
  290.     and            eax, edi
  291.     shr            eax, 20
  292.     lea            rbx, [r8+rax]
  293.  
  294.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  295.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  296.     movd        xmm2, dword [rdx+8]        ;xmm2 = p2
  297.     movd        xmm3, dword [rdx+12]        ;xmm3 = p3
  298.     punpcklbw    xmm0, xmm1
  299.     punpcklbw    xmm2, xmm3
  300.     punpcklbw    xmm0, xmm5
  301.     punpcklbw    xmm2, xmm5
  302.     movq        xmm1, qword [rbx]
  303.     movq        xmm3, qword [rbx+8]
  304.     pshufd        xmm1, xmm1, 01000100b
  305.     pshufd        xmm3, xmm3, 01000100b
  306.     pmaddwd        xmm0, xmm1
  307.     pmaddwd        xmm2, xmm3
  308.     paddd        xmm0, xmm2
  309.     paddd        xmm4, xmm0
  310.  
  311.     psrad        xmm4, 14
  312.     packssdw    xmm4, xmm4
  313.     packuswb    xmm4, xmm4
  314.  
  315.     add            edi, ebp
  316.     adc            rsi, r11
  317.  
  318.     movd        dword [rcx+r10], xmm4
  319.     add            r10, 4
  320.     jnz            .pixelloop_4coeff
  321.     jmp            .xit
  322.  
  323. .accel_6coeff:
  324. .pixelloop_6coeff:
  325.     pxor        xmm5, xmm5
  326.     movdqa        xmm4, xmm6
  327.  
  328.     lea            rdx, [rsi*4]
  329.     mov            eax, edi
  330.     shr            eax, 24
  331.     lea            rax, [rax+rax*2]
  332.     lea            rbx, [r8+rax*8]
  333.  
  334.     movd        xmm0, dword [rdx]            ;xmm0 = p0
  335.     movd        xmm1, dword [rdx+4]        ;xmm1 = p1
  336.     movd        xmm2, dword [rdx+8]        ;xmm2 = p2
  337.     movd        xmm3, dword [rdx+12]        ;xmm3 = p3
  338.     movd        xmm8, dword [rdx+16]        ;xmm6 = p4
  339.     movd        xmm9, dword [rdx+20]        ;xmm7 = p5
  340.     punpcklbw    xmm0, xmm1
  341.     punpcklbw    xmm2, xmm3
  342.     punpcklbw    xmm8, xmm9
  343.     punpcklbw    xmm0, xmm5
  344.     punpcklbw    xmm2, xmm5
  345.     punpcklbw    xmm8, xmm5
  346.     movq        xmm1, qword [rbx]
  347.     movq        xmm3, qword [rbx+8]
  348.     movq        xmm9, qword [rbx+16]
  349.     pshufd        xmm1, xmm1, 01000100b
  350.     pshufd        xmm3, xmm3, 01000100b
  351.     pshufd        xmm9, xmm9, 01000100b
  352.     pmaddwd        xmm0, xmm1
  353.     pmaddwd        xmm2, xmm3
  354.     pmaddwd        xmm8, xmm9
  355.     paddd        xmm0, xmm2
  356.     paddd        xmm4, xmm0
  357.     paddd        xmm4, xmm8
  358.  
  359.     psrad        xmm4, 14
  360.     packssdw    xmm4, xmm4
  361.     packuswb    xmm4, xmm4
  362.  
  363.     add            edi, ebp
  364.     adc            rsi, r11
  365.  
  366.     movd        dword [rcx+r10], xmm4
  367.     add            r10, 4
  368.     jnz            .pixelloop_6coeff
  369.     jmp            .xit
  370. endproc_frame
  371.  
  372.  
  373. ;--------------------------------------------------------------------------
  374. ;
  375. ;    vdasm_resize_table_col_SSE2(
  376. ;        uint32 *dst,                // rcx
  377. ;        const uint32 *const *srcs,    // rdx
  378. ;        int *filter,        // r8
  379. ;        int filter_width,    // r9d
  380. ;        PixDim w,            // [rsp+40] -> r10d
  381. ;        );
  382. ;
  383.     global    vdasm_resize_table_col_SSE2
  384. proc_frame    vdasm_resize_table_col_SSE2
  385.     VDSAVE            rbx, rsi, rdi, rbp, r12, r13, r14, r15
  386.     VDSAVEXMM128    6, 15
  387. end_prolog
  388.  
  389.     .parms equ rsp+168+64
  390.  
  391.     mov            r10d, [.parms+40]            ;r10d = w
  392.  
  393.     pxor        xmm5, xmm5
  394.     movdqa        xmm4, oword [roundval]
  395.     xor            rbx, rbx                    ;rbx = source offset
  396.  
  397.     cmp            r9d, 4
  398.     jz            .accel_4coeff
  399.     cmp            r9d, 6
  400.     jz            .accel_6coeff
  401.  
  402.     shr            r9d, 1                        ;r9d = filter pair count
  403.  
  404. .pixelloop:
  405.     mov            rax, rdx                    ;rax = row pointer table
  406.     mov            rdi, r8                        ;rdi = filter
  407.     mov            r11d, r9d                    ;r11d = filter width counter
  408.     movdqa        xmm2, xmm4
  409. .coeffloop:
  410.     mov            rsi, [rax]
  411.  
  412.     movd        xmm0, dword [rsi+rbx]
  413.  
  414.     mov            rsi, [rax+8]
  415.     add            rax, 16
  416.  
  417.     movd        xmm1, dword [rsi+rbx]
  418.     punpcklbw    xmm0, xmm1
  419.  
  420.     punpcklbw    xmm0, xmm5
  421.  
  422.     movq        xmm1, qword [rdi]
  423.     pshufd        xmm1, xmm1, 01000100b
  424.  
  425.     pmaddwd        xmm0, xmm1
  426.  
  427.     paddd        xmm2, xmm0
  428.  
  429.     add            rdi,8
  430.  
  431.     sub            r11d,1
  432.     jne            .coeffloop
  433.  
  434.     psrad        xmm2,14
  435.     packssdw    xmm2,xmm2
  436.     add            rbx,4
  437.     packuswb    xmm2,xmm2
  438.  
  439.     movd        dword [rcx],xmm2
  440.     add            rcx,4
  441.     sub            r10d,1
  442.     jne            .pixelloop
  443.  
  444. .xit:
  445.     VDRESTOREXMM128    6, 15
  446.     VDRESTORE    rbx, rsi, rdi, rbp, r12, r13, r14, r15
  447.     ret
  448.  
  449. .accel_4coeff:
  450.     mov            r12, [rdx]
  451.     mov            r13, [rdx+8]
  452.     mov            r14, [rdx+16]
  453.     mov            r15, [rdx+24]
  454.     movq        xmm8, qword [r8]
  455.     punpcklqdq    xmm8, xmm8
  456.     movq        xmm9, qword [r8+8]
  457.     punpcklqdq    xmm9, xmm9
  458.  
  459.     sub            r10d, 1
  460.     jc            .oddpixel_4coeff
  461. .pixelloop_4coeff:
  462.     movq        xmm0, qword [r12+rbx]
  463.     movq        xmm1, qword [r13+rbx]
  464.     movq        xmm2, qword [r14+rbx]
  465.     movq        xmm3, qword [r15+rbx]
  466.  
  467.     punpcklbw    xmm0, xmm1
  468.     punpcklbw    xmm2, xmm3
  469.  
  470.     movdqa        xmm1, xmm0
  471.     movdqa        xmm3, xmm2
  472.  
  473.     punpcklbw    xmm0, xmm5
  474.     punpckhbw    xmm1, xmm5
  475.     punpcklbw    xmm2, xmm5
  476.     punpckhbw    xmm3, xmm5
  477.  
  478.     pmaddwd        xmm0, xmm8
  479.     pmaddwd        xmm1, xmm8
  480.     pmaddwd        xmm2, xmm9
  481.     pmaddwd        xmm3, xmm9
  482.  
  483.     paddd        xmm0, xmm4
  484.     paddd        xmm1, xmm4
  485.     paddd        xmm0, xmm2
  486.     paddd        xmm1, xmm3
  487.  
  488.     psrad        xmm0, 14
  489.     psrad        xmm1, 14
  490.     packssdw    xmm0, xmm1
  491.     packuswb    xmm0, xmm0
  492.  
  493.     movq        qword [rcx], xmm0
  494.     add            rcx, 8
  495.     add            rbx, 8
  496.     sub            r10d, 2
  497.     ja            .pixelloop_4coeff
  498.     jnz            .xit
  499. .oddpixel_4coeff:
  500.     movd        xmm0, dword [r12+rbx]
  501.     movd        xmm1, dword [r13+rbx]
  502.     movd        xmm2, dword [r14+rbx]
  503.     movd        xmm3, dword [r15+rbx]
  504.  
  505.     punpcklbw    xmm0, xmm1
  506.     punpcklbw    xmm2, xmm3
  507.     punpcklbw    xmm0, xmm5
  508.     punpcklbw    xmm2, xmm5
  509.  
  510.     pmaddwd        xmm0, xmm8
  511.     pmaddwd        xmm2, xmm9
  512.  
  513.     paddd        xmm0, xmm4
  514.     paddd        xmm0, xmm2
  515.  
  516.     psrad        xmm0, 14
  517.     packssdw    xmm0, xmm0
  518.     packuswb    xmm0, xmm0
  519.  
  520.     movd        dword [rcx], xmm0
  521.  
  522.     jmp            .xit
  523.  
  524. .accel_6coeff:
  525.     mov            r12, [rdx]
  526.     mov            r13, [rdx+8]
  527.     mov            r14, [rdx+16]
  528.     mov            r15, [rdx+24]
  529.     mov            rsi, [rdx+32]
  530.     mov            rdx, [rdx+40]
  531.     movq        xmm10, qword [r8]
  532.     punpcklqdq    xmm10, xmm10
  533.     movq        xmm11, qword [r8+8]
  534.     punpcklqdq    xmm11, xmm11
  535.     movq        xmm12, qword [r8+16]
  536.     punpcklqdq    xmm12, xmm12
  537.  
  538.     sub            r10d, 1
  539.     jc            .oddpixel_6coeff
  540. .pixelloop_6coeff:
  541.     movq        xmm0, qword [r12+rbx]
  542.     movq        xmm1, qword [r13+rbx]
  543.     movq        xmm2, qword [r14+rbx]
  544.     movq        xmm3, qword [r15+rbx]
  545.     movq        xmm8, qword [rsi+rbx]
  546.     movq        xmm9, qword [rdx+rbx]
  547.  
  548.     punpcklbw    xmm0, xmm1
  549.     punpcklbw    xmm2, xmm3
  550.     punpcklbw    xmm8, xmm9
  551.  
  552.     movdqa        xmm1, xmm0
  553.     movdqa        xmm3, xmm2
  554.     movdqa        xmm9, xmm8
  555.  
  556.     punpcklbw    xmm0, xmm5
  557.     punpckhbw    xmm1, xmm5
  558.     punpcklbw    xmm2, xmm5
  559.     punpckhbw    xmm3, xmm5
  560.     punpcklbw    xmm8, xmm5
  561.     punpckhbw    xmm9, xmm5
  562.  
  563.     pmaddwd        xmm0, xmm10
  564.     pmaddwd        xmm1, xmm10
  565.     pmaddwd        xmm2, xmm11
  566.     pmaddwd        xmm3, xmm11
  567.     pmaddwd        xmm8, xmm12
  568.     pmaddwd        xmm9, xmm12
  569.  
  570.     paddd        xmm0, xmm4
  571.     paddd        xmm1, xmm4
  572.     paddd        xmm2, xmm8
  573.     paddd        xmm3, xmm9
  574.     paddd        xmm0, xmm2
  575.     paddd        xmm1, xmm3
  576.  
  577.     psrad        xmm0, 14
  578.     psrad        xmm1, 14
  579.     packssdw    xmm0, xmm1
  580.     packuswb    xmm0, xmm0
  581.  
  582.     movq        qword [rcx], xmm0
  583.     add            rcx, 8
  584.     add            rbx, 8
  585.     sub            r10d, 2
  586.     ja            .pixelloop_6coeff
  587.     jnz            .xit
  588. .oddpixel_6coeff:
  589.     movd        xmm0, dword [r12+rbx]
  590.     movd        xmm1, dword [r13+rbx]
  591.     movd        xmm2, dword [r14+rbx]
  592.     movd        xmm3, dword [r15+rbx]
  593.     movd        xmm8, dword [rsi+rbx]
  594.     movd        xmm9, dword [rdx+rbx]
  595.  
  596.     punpcklbw    xmm0, xmm1
  597.     punpcklbw    xmm2, xmm3
  598.     punpcklbw    xmm8, xmm9
  599.     punpcklbw    xmm0, xmm5
  600.     punpcklbw    xmm2, xmm5
  601.     punpcklbw    xmm8, xmm5
  602.  
  603.     pmaddwd        xmm0, xmm10
  604.     pmaddwd        xmm2, xmm11
  605.     pmaddwd        xmm8, xmm12
  606.  
  607.     paddd        xmm0, xmm4
  608.     paddd        xmm2, xmm8
  609.     paddd        xmm0, xmm2
  610.  
  611.     psrad        xmm0, 14
  612.     packssdw    xmm0, xmm0
  613.     packuswb    xmm0, xmm0
  614.  
  615.     movd        dword [rcx], xmm0
  616.  
  617.     jmp            .xit
  618. endproc_frame
  619.  
  620.     end
  621.