10c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// Copyright (C) 2007-2008 ARM Limited 378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// 478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// Licensed under the Apache License, Version 2.0 (the "License"); 578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// you may not use this file except in compliance with the License. 678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// You may obtain a copy of the License at 778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// 878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// http://www.apache.org/licenses/LICENSE-2.0 978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// 1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// Unless required by applicable law or agreed to in writing, software 1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// distributed under the License is distributed on an "AS IS" BASIS, 1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// See the License for the specific language governing permissions and 1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// limitations under the License. 1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// 1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar;// 170c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 180c1bc742181ded4930842b46e9507372f0b1b963James Dong;// File Name: armVCM4P10_Average_4x_Align_unsafe_s.s 190c1bc742181ded4930842b46e9507372f0b1b963James Dong;// OpenMAX DL: v1.0.2 200c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Revision: 12290 210c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Date: Wednesday, April 9, 2008 220c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 230c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 240c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 250c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 260c1bc742181ded4930842b46e9507372f0b1b963James Dong 270c1bc742181ded4930842b46e9507372f0b1b963James Dong 280c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Functions: 290c1bc742181ded4930842b46e9507372f0b1b963James Dong;// armVCM4P10_Average_4x4_Align<ALIGNMENT>_unsafe 300c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 310c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Implements Average of 4x4 with equation c = (a+b+1)>>1. 320c1bc742181ded4930842b46e9507372f0b1b963James Dong;// First operand will be at offset ALIGNMENT from aligned address 330c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Second operand will be at aligned location and will be used as output. 340c1bc742181ded4930842b46e9507372f0b1b963James Dong;// destination pointed by (pDst) for vertical interpolation. 350c1bc742181ded4930842b46e9507372f0b1b963James Dong;// This function needs to copy 4 bytes in horizontal direction 360c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 370c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers used as input for this function 380c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r0,r1,r2,r3 where r2 containings aligned memory pointer and r3 step size 390c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 400c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers preserved for top level function 410c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r4,r5,r6,r8,r9,r14 420c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 430c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers modified by the function 440c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r7,r10,r11,r12 450c1bc742181ded4930842b46e9507372f0b1b963James Dong;// 460c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Output registers 470c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r2 - pointer to the aligned location 480c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r3 - step size to this aligned location 490c1bc742181ded4930842b46e9507372f0b1b963James Dong 500c1bc742181ded4930842b46e9507372f0b1b963James Dong INCLUDE omxtypes_s.h 510c1bc742181ded4930842b46e9507372f0b1b963James Dong INCLUDE armCOMM_s.h 520c1bc742181ded4930842b46e9507372f0b1b963James Dong 530c1bc742181ded4930842b46e9507372f0b1b963James Dong M_VARIANTS ARM1136JS 540c1bc742181ded4930842b46e9507372f0b1b963James Dong 550c1bc742181ded4930842b46e9507372f0b1b963James Dong EXPORT armVCM4P10_Average_4x4_Align0_unsafe 560c1bc742181ded4930842b46e9507372f0b1b963James Dong EXPORT armVCM4P10_Average_4x4_Align2_unsafe 570c1bc742181ded4930842b46e9507372f0b1b963James Dong EXPORT armVCM4P10_Average_4x4_Align3_unsafe 580c1bc742181ded4930842b46e9507372f0b1b963James Dong 590c1bc742181ded4930842b46e9507372f0b1b963James DongDEBUG_ON SETL {FALSE} 600c1bc742181ded4930842b46e9507372f0b1b963James Dong 610c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Declare input registers 620c1bc742181ded4930842b46e9507372f0b1b963James DongpPred0 RN 0 630c1bc742181ded4930842b46e9507372f0b1b963James DongiPredStep0 RN 1 640c1bc742181ded4930842b46e9507372f0b1b963James DongpPred1 RN 2 650c1bc742181ded4930842b46e9507372f0b1b963James DongiPredStep1 RN 3 660c1bc742181ded4930842b46e9507372f0b1b963James DongpDstPred RN 2 670c1bc742181ded4930842b46e9507372f0b1b963James DongiDstStep RN 3 680c1bc742181ded4930842b46e9507372f0b1b963James Dong 690c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Declare other intermediate registers 700c1bc742181ded4930842b46e9507372f0b1b963James DongiPredA0 RN 10 710c1bc742181ded4930842b46e9507372f0b1b963James DongiPredA1 RN 11 720c1bc742181ded4930842b46e9507372f0b1b963James DongiPredB0 RN 12 730c1bc742181ded4930842b46e9507372f0b1b963James DongiPredB1 RN 14 740c1bc742181ded4930842b46e9507372f0b1b963James DongTemp1 RN 4 750c1bc742181ded4930842b46e9507372f0b1b963James DongTemp2 RN 5 760c1bc742181ded4930842b46e9507372f0b1b963James DongResultA RN 5 770c1bc742181ded4930842b46e9507372f0b1b963James DongResultB RN 4 780c1bc742181ded4930842b46e9507372f0b1b963James Dongr0x80808080 RN 7 790c1bc742181ded4930842b46e9507372f0b1b963James Dong 800c1bc742181ded4930842b46e9507372f0b1b963James Dong IF ARM1136JS 810c1bc742181ded4930842b46e9507372f0b1b963James Dong 820c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// This function calculates average of 4x4 block 830c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// pPred0 is at alignment offset 0 and pPred1 is alignment 4 840c1bc742181ded4930842b46e9507372f0b1b963James Dong 850c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Function header 860c1bc742181ded4930842b46e9507372f0b1b963James Dong M_START armVCM4P10_Average_4x4_Align0_unsafe, r6 870c1bc742181ded4930842b46e9507372f0b1b963James Dong 880c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Code start 890c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR r0x80808080, =0x80808080 900c1bc742181ded4930842b46e9507372f0b1b963James Dong 910c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 1st load 920c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB0, [pPred1] 930c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 940c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB1, [pPred1, iPredStep1] 950c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 960c1bc742181ded4930842b46e9507372f0b1b963James Dong 970c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// (a+b+1)/2 = (a+256-(255-b))/2 = (a-(255-b))/2 + 128 980c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 990c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 2nd load 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB0, [pPred1] 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB1, [pPred1, iPredStep1] 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 1210c1bc742181ded4930842b46e9507372f0b1b963James DongEnd0 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong M_END 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// This function calculates average of 4x4 block 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// pPred0 is at alignment offset 2 and pPred1 is alignment 4 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Function header 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong M_START armVCM4P10_Average_4x4_Align2_unsafe, r6 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Code start 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR r0x80808080, =0x80808080 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 1st load 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp1, [pPred0, #4] 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB0, [pPred1] 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredB1, [pPred1, iPredStep1] 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR Temp2, [pPred0, #4] 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA0, iPredA0, LSR #16 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA0, iPredA0, Temp1, LSL #16 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA1, iPredA1, LSR #16 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA1, iPredA1, Temp2, LSL #16 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// (a+b+1)/2 = (a+256-(255-b))/2 = (a-(255-b))/2 + 128 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 2nd load 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp1, [pPred0, #4] 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB0, [pPred1] 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB1, [pPred1, iPredStep1] 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp2, [pPred0, #4] 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA0, iPredA0, LSR #16 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA0, iPredA0, Temp1, LSL #16 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA1, iPredA1, LSR #16 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA1, iPredA1, Temp2, LSL #16 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 1750c1bc742181ded4930842b46e9507372f0b1b963James DongEnd2 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong M_END 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// This function calculates average of 4x4 block 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// pPred0 is at alignment offset 3 and pPred1 is alignment 4 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Function header 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong M_START armVCM4P10_Average_4x4_Align3_unsafe, r6 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// Code start 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR r0x80808080, =0x80808080 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 1st load 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp1, [pPred0, #4] 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB0, [pPred1] 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB1, [pPred1, iPredStep1] 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp2, [pPred0, #4] 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA0, iPredA0, LSR #24 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA0, iPredA0, Temp1, LSL #8 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA1, iPredA1, LSR #24 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA1, iPredA1, Temp2, LSL #8 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong ;// 2nd load 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp1, [pPred0, #4] 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA0, [pPred0], iPredStep0 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB0, [pPred1] 2130c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR iPredB1, [pPred1, iPredStep1] 2140c1bc742181ded4930842b46e9507372f0b1b963James Dong LDR Temp2, [pPred0, #4] 2150c1bc742181ded4930842b46e9507372f0b1b963James Dong M_LDR iPredA1, [pPred0], iPredStep0 2160c1bc742181ded4930842b46e9507372f0b1b963James Dong 2170c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB0, iPredB0 2180c1bc742181ded4930842b46e9507372f0b1b963James Dong MVN iPredB1, iPredB1 2190c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA0, iPredA0, LSR #24 2200c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA0, iPredA0, Temp1, LSL #8 2210c1bc742181ded4930842b46e9507372f0b1b963James Dong MOV iPredA1, iPredA1, LSR #24 2220c1bc742181ded4930842b46e9507372f0b1b963James Dong ORR iPredA1, iPredA1, Temp2, LSL #8 2230c1bc742181ded4930842b46e9507372f0b1b963James Dong 2240c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultA, iPredA0, iPredB0 2250c1bc742181ded4930842b46e9507372f0b1b963James Dong UHSUB8 ResultB, iPredA1, iPredB1 2260c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultA, ResultA, r0x80808080 2270c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultA, [pDstPred], iDstStep 2280c1bc742181ded4930842b46e9507372f0b1b963James Dong EOR ResultB, ResultB, r0x80808080 2290c1bc742181ded4930842b46e9507372f0b1b963James Dong M_STR ResultB, [pDstPred], iDstStep 2300c1bc742181ded4930842b46e9507372f0b1b963James DongEnd3 2310c1bc742181ded4930842b46e9507372f0b1b963James Dong M_END 2320c1bc742181ded4930842b46e9507372f0b1b963James Dong 2330c1bc742181ded4930842b46e9507372f0b1b963James Dong ENDIF 2340c1bc742181ded4930842b46e9507372f0b1b963James Dong 2350c1bc742181ded4930842b46e9507372f0b1b963James Dong END 23678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar 237