home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / vid_c2p_ppc.s < prev    next >
Text File  |  2000-06-17  |  11KB  |  546 lines

  1. # Copyright (C) 1996-1997 Id Software, Inc. 
  2. # This program is free software; you can redistribute it and/or 
  3. # modify it under the terms of the GNU General Public License 
  4. # as published by the Free Software Foundation; either version 2 
  5. # of the License, or (at your option) any later version. 
  6. # This program is distributed in the hope that it will be useful, 
  7. # but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. # See the GNU General Public License for more details. 
  10. # You should have received a copy of the GNU General Public License 
  11. # along with this program; if not, write to the Free Software 
  12. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14. # Chunky2Planar algorithm, originally by James McCoull
  15. # Modified by Peter McGavin for variable size and depth
  16. # and "compare buffer" (hope I didn't slow it down too much)
  17. #
  18. # Ported by Frank Wille (phx) <frank@phoenix.owl.de> to PowerPC (04-Jan-98).
  19. # Using optimized merge-macro by Tim Boescke (phx,26-Jan-98)
  20. # AGA-bug and EHB-palette-change-bug fixed (phx,31-Jan-98)
  21. # WarpOS support (define WarpOS) (phx,22-May-98)
  22. # Deleted all @__name function pointers for WarpOS. They will be
  23. # created by vlink on demand. (phx,08-Jul-98)
  24. #
  25. #     Cpu only solution VERSION 2
  26. #    Not optimized - directly ported from 040-source... (phx)
  27. #    bitplanes are assumed contiguous!
  28. #    analyse instruction offsets to check performance
  29.  
  30. #void c2p_6_ppc (__reg("r3") UBYTE *chunky_data,
  31. #                __reg("r4") PLANEPTR raster,
  32. #                __reg("r5") UBYTE *compare_buffer,
  33. #                __reg("r8") UBYTE *xlate,
  34. #                __reg("r6") ULONG plsiz,
  35. #                __reg("r7") BOOL palette_changed)
  36.  
  37. #void c2p_8_ppc (__reg("r3") UBYTE *chunky_data,
  38. #                __reg("r4") PLANEPTR raster,
  39. #                __reg("r5") UBYTE *compare_buffer,
  40. #                __reg("r6") ULONG plsiz)
  41.  
  42. # r3 -> width*height chunky pixels
  43. # r4 -> contiguous bitplanes
  44. # r5 -> compare buffer
  45. # r6 = width*height/8   (width*height must be a multiple of 32)
  46.  
  47. # GNU-make has some problems with quotes (e.g. in "depth=8"), so this
  48. # is a workaround (phx)
  49. .ifdef    depth8
  50. .set    depth,8
  51. .endif
  52. .ifdef    depth6
  53. .set    depth,6
  54. .endif
  55.  
  56.  
  57. .macro    merge        # in1,in2,tmp3,tmp4,mask,shift
  58. # \1 = abqr
  59. # \2 = ijyz
  60.     srwi    \3,\2,\6
  61.     lis    \4,(\5&0xffff0000)>>16
  62.     ori    \4,\4,\5&0xffff
  63.     xor    \3,\3,\1
  64.     and    \3,\3,\4
  65.     xor    \1,\1,\3
  66.     slwi    \3,\3,\6
  67.     xor    \2,\2,\3
  68. .endm
  69.  
  70. # translate 4 8-bit pixels to 6-bit EHB
  71. .macro    xlate        # offs1,dest2,mem3,xlate4,tmp5
  72.     lbz    \5,\1(\3)
  73.     lbzx    \5,\4,\5
  74.     rlwimi    \2,\5,24,0,7
  75.     lbz    \5,\1+8(\3)
  76.     lbzx    \5,\4,\5
  77.     rlwimi    \2,\5,16,8,15
  78.     lbz    \5,\1+16(\3)
  79.     lbzx    \5,\4,\5
  80.     rlwimi    \2,\5,8,16,23
  81.     lbz    \5,\1+24(\3)
  82.     lbzx    \5,\4,\5
  83.     rlwimi    \2,\5,0,24,31
  84. .endm
  85.  
  86.  
  87.     .text
  88.  
  89. .ifeq    depth-8
  90. .ifdef    WOS
  91.     .global _c2p_8_ppc
  92. _c2p_8_ppc:
  93. .else    # ELF
  94.     .global    c2p_8_ppc
  95. c2p_8_ppc:
  96. .endif
  97.  
  98. .else
  99. .ifeq    depth-6
  100. .ifdef    WOS
  101.     .global _c2p_6_ppc
  102. _c2p_6_ppc:
  103. .else    # ELF
  104.     .global    c2p_6_ppc
  105. c2p_6_ppc:
  106. .endif
  107.  
  108. .else
  109. .fail    "Unsupported depth! Try 6 or 8."
  110. .endif
  111. .endif
  112.  
  113. # Build the stack frame
  114. .ifdef    WOS
  115.     stwu    r1,-96(r1)
  116.     stmw    r14,24(r1)
  117. .else    # ELF
  118.     stwu    r1,-80(r1)
  119.     stmw    r14,8(r1)        # save all non-volatile registers
  120. .endif
  121.  
  122. .ifle depth-6
  123.     mr    r31,r7            # video_palette_changed
  124.     mr    r29,r8            # xlate
  125. .endif
  126.  
  127. # r3 = chunky buffer
  128. # r4 = output area
  129. # r5 = compare buffer
  130. # r6 = plsiz
  131.  
  132.     mr    r12,r6            # r12 = plsiz
  133.  
  134.     slwi    r6,r6,3
  135.     add    r30,r3,r6        # r30 = end of chunky data
  136.  
  137. first_loop:
  138. .ifle depth-6
  139.     cmpwi    r31,0            # palette_changed?
  140.     bne    first_case
  141. .endif
  142.  
  143.     lwz    r6,0(r3)
  144.     lwz    r7,0(r5)
  145.     cmpw    r6,r7
  146.     bne    first_case
  147.     lwz    r6,4(r3)
  148.     lwz    r7,4(r5)
  149.     cmpw    r6,r7
  150.     bne    first_case
  151.     lwz    r6,8(r3)
  152.     lwz    r7,8(r5)
  153.     cmpw    r6,r7
  154.     bne    first_case
  155.     lwz    r6,12(r3)
  156.     lwz    r7,12(r5)
  157.     cmpw    r6,r7
  158.     bne    first_case
  159.     lwz    r6,16(r3)
  160.     lwz    r7,16(r5)
  161.     cmpw    r6,r7
  162.     bne    first_case
  163.     lwz    r6,20(r3)
  164.     lwz    r7,20(r5)
  165.     cmpw    r6,r7
  166.     bne    first_case
  167.     lwz    r6,24(r3)
  168.     lwz    r7,24(r5)
  169.     cmpw    r6,r7
  170.     bne    first_case
  171.     lwz    r6,28(r3)
  172.     lwz    r7,28(r5)
  173.     cmpw    r6,r7
  174.     bne    first_case
  175.  
  176.     addi    r4,r4,4            # skip 32 pixels on output
  177.     addi    r3,r3,32
  178.     addi    r5,r5,32
  179.  
  180.     cmplw    r3,r30
  181.     blt    first_loop
  182.     b    exit            # exit if no changes found
  183.  
  184. first_case:
  185. .ifgt depth-6            # depth 8 code --- no need to xlate pixels
  186. # hint from M68k: d0-d3 -> r8-r11,  d4-d7 -> r14-r17
  187.     lwz    r9,0(r3)
  188.     lwz    r11,4(r3)
  189.     lwz    r8,8(r3)
  190.     lwz    r10,12(r3)
  191.     lwz    r14,2(r3)
  192.     lwz    r15,10(r3)
  193.     lwz    r16,6(r3)
  194.     lwz    r17,14(r3)
  195.  
  196.     stw    r9,0(r5)
  197.     stw    r11,4(r5)
  198.     stw    r8,8(r5)
  199.     stw    r10,12(r5)
  200.  
  201.     lwz    r6,16(r3)
  202.     rlwimi    r9,r6,16,16,31
  203.     rlwimi    r14,r6,0,16,31
  204.     lwz    r6,20(r3)
  205.     rlwimi    r11,r6,16,16,31
  206.     rlwimi    r16,r6,0,16,31
  207.     lwz    r6,24(r3)
  208.     rlwimi    r8,r6,16,16,31
  209.     rlwimi    r15,r6,0,16,31
  210.     lwz    r6,28(r3)
  211.     rlwimi    r10,r6,16,16,31
  212.     rlwimi    r17,r6,0,16,31
  213.  
  214.     sth    r9,16(r5)
  215.     sth    r8,24(r5)
  216.     sth    r11,20(r5)
  217.     sth    r10,28(r5)
  218.     sth    r14,18(r5)
  219.     sth    r15,26(r5)
  220.     sth    r16,22(r5)
  221.     sth    r17,30(r5)
  222.  
  223.     merge    r9,r8,r6,r7,0x00ff00ff,8
  224.     merge    r11,r10,r6,r7,0x00ff00ff,8
  225.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  226.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  227.  
  228.     merge    r14,r15,r6,r7,0x00ff00ff,8
  229.     merge    r16,r17,r6,r7,0x00ff00ff,8
  230.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  231.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  232.  
  233.     merge    r11,r16,r6,r7,0x33333333,2
  234.     merge    r10,r17,r6,r7,0x33333333,2
  235.     merge    r11,r10,r6,r7,0x55555555,1
  236.     merge    r16,r17,r6,r7,0x55555555,1
  237.  
  238.     mr    r18,r17            # plane0
  239.     mr    r19,r16            # plane1
  240.     mr    r20,r10            # plane2
  241.     mr    r21,r11            # plane3
  242.  
  243.     merge    r9,r14,r6,r7,0x33333333,2
  244.     merge    r8,r15,r6,r7,0x33333333,2
  245.     merge    r9,r8,r6,r7,0x55555555,1
  246.     merge    r14,r15,r6,r7,0x55555555,1
  247.  
  248.     mr    r22,r15            # plane4
  249.     mr    r23,r14            # plane5
  250.     mr    r24,r8            # plane6
  251.     mr    r25,r9            # plane7
  252.  
  253.  
  254. .else                # depth 6 code, xlate from 8-bit to 6-bit EHB
  255.     lwz    r6,0(r3)    # copy to compare buffer
  256.     stw    r6,0(r5)
  257.     lwz    r6,4(r3)
  258.     stw    r6,4(r5)
  259.     lwz    r6,8(r3)
  260.     stw    r6,8(r5)
  261.     lwz    r6,12(r3)
  262.     stw    r6,12(r5)
  263.     lwz    r6,16(r3)
  264.     stw    r6,16(r5)
  265.     lwz    r6,20(r3)
  266.     stw    r6,20(r5)
  267.     lwz    r6,24(r3)
  268.     stw    r6,24(r5)
  269.     lwz    r6,28(r3)
  270.     stw    r6,28(r5)
  271.  
  272.     xlate    0,r9,r3,r29,r7        # does 8-bit to EHB colour translate
  273.     xlate    1,r8,r3,r29,r7        # 4 pixels at a time
  274.     xlate    4,r11,r3,r29,r7
  275.     xlate    5,r10,r3,r29,r7
  276.  
  277.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  278.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  279.  
  280.     xlate    2,r14,r3,r29,r7
  281.     xlate    3,r15,r3,r29,r7
  282.     xlate    6,r16,r3,r29,r7
  283.     xlate    7,r17,r3,r29,r7
  284.  
  285.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  286.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  287.  
  288.     merge    r11,r16,r6,r7,0x33333333,2
  289.     merge    r10,r17,r6,r7,0x33333333,2
  290.  
  291.     merge    r11,r10,r6,r7,0x55555555,1
  292.     merge    r16,r17,r6,r7,0x55555555,1
  293.  
  294.     mr    r18,r17            # plane0
  295.     mr    r19,r16            # plane1
  296.     mr    r20,r10            # plane2
  297.     mr    r21,r11            # plane3
  298.  
  299.     merge    r9,r14,r6,r7,0x33333333,2
  300.     merge    r8,r15,r6,r7,0x33333333,2
  301.     merge    r14,r15,r6,r7,0x55555555,1
  302.  
  303.     mr    r22,r15            # plane4
  304.     mr    r23,r14            # plane5
  305. .endif
  306.  
  307.     addi    r3,r3,32
  308.     addi    r5,r5,32
  309.     mr    r26,r4            # save output address
  310.     addi    r4,r4,4            # skip 32 pixels on output
  311.  
  312.     cmplw    r3,r30
  313.     bge    final_case
  314.  
  315.  
  316. main_loop:
  317. .ifle depth-6
  318.     cmpwi    r31,0            # palette_changed?
  319.     bne    main_case
  320. .endif
  321.     lwz    r6,0(r3)        # compare next 32 pixels
  322.     lwz    r7,0(r5)
  323.     cmpw    r6,r7
  324.     bne    main_case
  325.     lwz    r6,4(r3)
  326.     lwz    r7,4(r5)
  327.     cmpw    r6,r7
  328.     bne    main_case
  329.     lwz    r6,8(r3)
  330.     lwz    r7,8(r5)
  331.     cmpw    r6,r7
  332.     bne    main_case
  333.     lwz    r6,12(r3)
  334.     lwz    r7,12(r5)
  335.     cmpw    r6,r7
  336.     bne    main_case
  337.     lwz    r6,16(r3)
  338.     lwz    r7,16(r5)
  339.     cmpw    r6,r7
  340.     bne    main_case
  341.     lwz    r6,20(r3)
  342.     lwz    r7,20(r5)
  343.     cmpw    r6,r7
  344.     bne    main_case
  345.     lwz    r6,24(r3)
  346.     lwz    r7,24(r5)
  347.     cmpw    r6,r7
  348.     bne    main_case
  349.     lwz    r6,28(r3)
  350.     lwz    r7,28(r5)
  351.     cmpw    r6,r7
  352.     bne    main_case
  353.  
  354.     addi    r4,r4,4            # skip 32 pixels on output
  355.     addi    r3,r3,32
  356.     addi    r5,r5,32
  357.  
  358.     cmplw    r3,r30
  359.     blt    main_loop
  360.     b    final_case        # exit if no more changes found
  361.  
  362.  
  363. main_case:
  364. .ifgt    depth-6
  365.     lwz    r9,0(r3)
  366.     lwz    r11,4(r3)
  367.     lwz    r8,8(r3)
  368.     lwz    r10,12(r3)
  369.     lwz    r14,2(r3)
  370.     lwz    r15,10(r3)
  371.     lwz    r16,6(r3)
  372.     lwz    r17,14(r3)
  373.  
  374.     stw    r9,0(r5)
  375.     stw    r11,4(r5)
  376.     stw    r8,8(r5)
  377.     stw    r10,12(r5)
  378.  
  379.     lwz    r6,16(r3)
  380.     rlwimi    r9,r6,16,16,31
  381.     rlwimi    r14,r6,0,16,31
  382.     lwz    r6,20(r3)
  383.     rlwimi    r11,r6,16,16,31
  384.     rlwimi    r16,r6,0,16,31
  385.     lwz    r6,24(r3)
  386.     rlwimi    r8,r6,16,16,31
  387.     rlwimi    r15,r6,0,16,31
  388.     lwz    r6,28(r3)
  389.     rlwimi    r10,r6,16,16,31
  390.     rlwimi    r17,r6,0,16,31
  391.  
  392.     sth    r9,16(r5)
  393.     sth    r8,24(r5)
  394.     sth    r11,20(r5)
  395.     sth    r10,28(r5)
  396.     sth    r14,18(r5)
  397.     sth    r15,26(r5)
  398.     sth    r16,22(r5)
  399.     sth    r17,30(r5)
  400.  
  401.     sub    r26,r26,r12
  402.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  403.     merge    r9,r8,r6,r7,0x00ff00ff,8
  404.     merge    r11,r10,r6,r7,0x00ff00ff,8
  405.  
  406.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  407.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  408.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  409.  
  410.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  411.     merge    r14,r15,r6,r7,0x00ff00ff,8
  412.     merge    r16,r17,r6,r7,0x00ff00ff,8
  413.  
  414.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  415.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  416.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  417.  
  418.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  419.     merge    r11,r16,r6,r7,0x33333333,2
  420.     merge    r10,r17,r6,r7,0x33333333,2
  421.  
  422.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  423.     merge    r11,r10,r6,r7,0x55555555,1
  424.     merge    r16,r17,r6,r7,0x55555555,1
  425.  
  426.     mr    r18,r17            # plane0
  427.     mr    r19,r16            # plane1
  428.     mr    r20,r10            # plane2
  429.     mr    r21,r11            # plane3
  430.  
  431.     stwux    r24,r26,r12        # store plane6 (r26 += plsiz)
  432.     merge    r9,r14,r6,r7,0x33333333,2
  433.     merge    r8,r15,r6,r7,0x33333333,2
  434.  
  435.     stwux    r25,r26,r12        # store plane7 (r26 += plsiz)
  436.     merge    r9,r8,r6,r7,0x55555555,1
  437.     merge    r14,r15,r6,r7,0x55555555,1
  438.  
  439.     mr    r22,r15            # plane4
  440.     mr    r23,r14            # plane5
  441.     mr    r24,r8            # plane6
  442.     mr    r25,r9            # plane7
  443.  
  444.  
  445. .else                # depth 6 code, xlate from 8-bit to 6-bit EHB
  446.     lwz    r6,0(r3)
  447.     stw    r6,0(r5)
  448.     lwz    r6,4(r3)
  449.     stw    r6,4(r5)
  450.     lwz    r6,8(r3)
  451.     stw    r6,8(r5)
  452.     lwz    r6,12(r3)
  453.     stw    r6,12(r5)
  454.     lwz    r6,16(r3)
  455.     stw    r6,16(r5)
  456.     lwz    r6,20(r3)
  457.     stw    r6,20(r5)
  458.     lwz    r6,24(r3)
  459.     stw    r6,24(r5)
  460.     lwz    r6,28(r3)
  461.     stw    r6,28(r5)
  462.  
  463.     xlate    0,r9,r3,r29,r7        # does 8-bit to EHB colour translate
  464.     xlate    1,r8,r3,r29,r7        # 4 pixels at a time
  465.     xlate    4,r11,r3,r29,r7
  466.     xlate    5,r10,r3,r29,r7
  467.  
  468.     sub    r26,r26,r12
  469.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  470.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  471.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  472.  
  473.     xlate    2,r14,r3,r29,r7
  474.     xlate    3,r15,r3,r29,r7
  475.     xlate    6,r16,r3,r29,r7
  476.     xlate    7,r17,r3,r29,r7
  477.  
  478.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  479.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  480.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  481.  
  482.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  483.     merge    r11,r16,r6,r7,0x33333333,2
  484.     merge    r10,r17,r6,r7,0x33333333,2
  485.  
  486.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  487.     merge    r11,r10,r6,r7,0x55555555,1
  488.     merge    r16,r17,r6,r7,0x55555555,1
  489.  
  490.     mr    r18,r17            # plane0
  491.     mr    r19,r16            # plane1
  492.     mr    r20,r10            # plane2
  493.     mr    r21,r11            # plane3
  494.  
  495.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  496.     merge    r9,r14,r6,r7,0x33333333,2
  497.  
  498.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  499.     merge    r8,r15,r6,r7,0x33333333,2
  500.     merge    r14,r15,r6,r7,0x55555555,1
  501.  
  502.     mr    r22,r15            # plane4
  503.     mr    r23,r14            # plane5
  504. .endif
  505.  
  506.     addi    r3,r3,32
  507.     addi    r5,r5,32
  508.  
  509.     mr    r26,r4            # save output address
  510.     addi    r4,r4,4            # skip 32 pixels on output
  511.  
  512.     cmplw    r3,r30
  513.     blt    main_loop
  514.  
  515.  
  516.  
  517. final_case:
  518.     sub    r26,r26,r12
  519.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  520.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  521.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  522.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  523.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  524.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  525. .ifgt depth-6
  526.     stwux    r24,r26,r12        # store plane6 (r26 += plsiz)
  527.     stwux    r25,r26,r12        # store plane7 (r26 += plsiz)
  528. .endif
  529.  
  530. exit:
  531. # restore non-volatile registers
  532. .ifdef    WOS
  533.     lmw    r14,24(r1)
  534.     addi    r1,r1,96
  535. .else
  536.     lmw    r14,8(r1)
  537.     addi    r1,r1,80
  538. .endif
  539.     blr
  540.