1*dfc6aa5cSAndroid Build Coastguard Worker; 2*dfc6aa5cSAndroid Build Coastguard Worker; jquant.asm - sample data conversion and quantization (3DNow! & MMX) 3*dfc6aa5cSAndroid Build Coastguard Worker; 4*dfc6aa5cSAndroid Build Coastguard Worker; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB 5*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 2016, D. R. Commander. 6*dfc6aa5cSAndroid Build Coastguard Worker; 7*dfc6aa5cSAndroid Build Coastguard Worker; Based on the x86 SIMD extension for IJG JPEG library 8*dfc6aa5cSAndroid Build Coastguard Worker; Copyright (C) 1999-2006, MIYASAKA Masaru. 9*dfc6aa5cSAndroid Build Coastguard Worker; For conditions of distribution and use, see copyright notice in jsimdext.inc 10*dfc6aa5cSAndroid Build Coastguard Worker; 11*dfc6aa5cSAndroid Build Coastguard Worker; This file should be assembled with NASM (Netwide Assembler), 12*dfc6aa5cSAndroid Build Coastguard Worker; can *not* be assembled with Microsoft's MASM or any compatible 13*dfc6aa5cSAndroid Build Coastguard Worker; assembler (including Borland's Turbo Assembler). 14*dfc6aa5cSAndroid Build Coastguard Worker; NASM is available from http://nasm.sourceforge.net/ or 15*dfc6aa5cSAndroid Build Coastguard Worker; http://sourceforge.net/project/showfiles.php?group_id=6208 16*dfc6aa5cSAndroid Build Coastguard Worker 17*dfc6aa5cSAndroid Build Coastguard Worker%include "jsimdext.inc" 18*dfc6aa5cSAndroid Build Coastguard Worker%include "jdct.inc" 19*dfc6aa5cSAndroid Build Coastguard Worker 20*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 21*dfc6aa5cSAndroid Build Coastguard Worker SECTION SEG_TEXT 22*dfc6aa5cSAndroid Build Coastguard Worker BITS 32 23*dfc6aa5cSAndroid Build Coastguard Worker; 24*dfc6aa5cSAndroid Build Coastguard Worker; Load data into workspace, applying unsigned->signed conversion 25*dfc6aa5cSAndroid Build Coastguard Worker; 26*dfc6aa5cSAndroid Build Coastguard Worker; GLOBAL(void) 27*dfc6aa5cSAndroid Build Coastguard Worker; jsimd_convsamp_float_3dnow(JSAMPARRAY sample_data, JDIMENSION start_col, 28*dfc6aa5cSAndroid Build Coastguard Worker; FAST_FLOAT *workspace); 29*dfc6aa5cSAndroid Build Coastguard Worker; 30*dfc6aa5cSAndroid Build Coastguard Worker 31*dfc6aa5cSAndroid Build Coastguard Worker%define sample_data ebp + 8 ; JSAMPARRAY sample_data 32*dfc6aa5cSAndroid Build Coastguard Worker%define start_col ebp + 12 ; JDIMENSION start_col 33*dfc6aa5cSAndroid Build Coastguard Worker%define workspace ebp + 16 ; FAST_FLOAT *workspace 34*dfc6aa5cSAndroid Build Coastguard Worker 35*dfc6aa5cSAndroid Build Coastguard Worker align 32 36*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL_FUNCTION(jsimd_convsamp_float_3dnow) 37*dfc6aa5cSAndroid Build Coastguard Worker 38*dfc6aa5cSAndroid Build Coastguard WorkerEXTN(jsimd_convsamp_float_3dnow): 39*dfc6aa5cSAndroid Build Coastguard Worker push ebp 40*dfc6aa5cSAndroid Build Coastguard Worker mov ebp, esp 41*dfc6aa5cSAndroid Build Coastguard Worker push ebx 42*dfc6aa5cSAndroid Build Coastguard Worker; push ecx ; need not be preserved 43*dfc6aa5cSAndroid Build Coastguard Worker; push edx ; need not be preserved 44*dfc6aa5cSAndroid Build Coastguard Worker push esi 45*dfc6aa5cSAndroid Build Coastguard Worker push edi 46*dfc6aa5cSAndroid Build Coastguard Worker 47*dfc6aa5cSAndroid Build Coastguard Worker pcmpeqw mm7, mm7 48*dfc6aa5cSAndroid Build Coastguard Worker psllw mm7, 7 49*dfc6aa5cSAndroid Build Coastguard Worker packsswb mm7, mm7 ; mm7 = PB_CENTERJSAMPLE (0x808080..) 50*dfc6aa5cSAndroid Build Coastguard Worker 51*dfc6aa5cSAndroid Build Coastguard Worker mov esi, JSAMPARRAY [sample_data] ; (JSAMPROW *) 52*dfc6aa5cSAndroid Build Coastguard Worker mov eax, JDIMENSION [start_col] 53*dfc6aa5cSAndroid Build Coastguard Worker mov edi, POINTER [workspace] ; (DCTELEM *) 54*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, DCTSIZE/2 55*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 56*dfc6aa5cSAndroid Build Coastguard Worker.convloop: 57*dfc6aa5cSAndroid Build Coastguard Worker mov ebx, JSAMPROW [esi+0*SIZEOF_JSAMPROW] ; (JSAMPLE *) 58*dfc6aa5cSAndroid Build Coastguard Worker mov edx, JSAMPROW [esi+1*SIZEOF_JSAMPROW] ; (JSAMPLE *) 59*dfc6aa5cSAndroid Build Coastguard Worker 60*dfc6aa5cSAndroid Build Coastguard Worker movq mm0, MMWORD [ebx+eax*SIZEOF_JSAMPLE] 61*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, MMWORD [edx+eax*SIZEOF_JSAMPLE] 62*dfc6aa5cSAndroid Build Coastguard Worker 63*dfc6aa5cSAndroid Build Coastguard Worker psubb mm0, mm7 ; mm0=(01234567) 64*dfc6aa5cSAndroid Build Coastguard Worker psubb mm1, mm7 ; mm1=(89ABCDEF) 65*dfc6aa5cSAndroid Build Coastguard Worker 66*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mm2, mm0 ; mm2=(*0*1*2*3) 67*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mm0, mm0 ; mm0=(*4*5*6*7) 68*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mm3, mm1 ; mm3=(*8*9*A*B) 69*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mm1, mm1 ; mm1=(*C*D*E*F) 70*dfc6aa5cSAndroid Build Coastguard Worker 71*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm4, mm2 ; mm4=(***0***1) 72*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm2, mm2 ; mm2=(***2***3) 73*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm5, mm0 ; mm5=(***4***5) 74*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm0, mm0 ; mm0=(***6***7) 75*dfc6aa5cSAndroid Build Coastguard Worker 76*dfc6aa5cSAndroid Build Coastguard Worker psrad mm4, (DWORD_BIT-BYTE_BIT) ; mm4=(01) 77*dfc6aa5cSAndroid Build Coastguard Worker psrad mm2, (DWORD_BIT-BYTE_BIT) ; mm2=(23) 78*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm4, mm4 79*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm2, mm2 80*dfc6aa5cSAndroid Build Coastguard Worker psrad mm5, (DWORD_BIT-BYTE_BIT) ; mm5=(45) 81*dfc6aa5cSAndroid Build Coastguard Worker psrad mm0, (DWORD_BIT-BYTE_BIT) ; mm0=(67) 82*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm5, mm5 83*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm0, mm0 84*dfc6aa5cSAndroid Build Coastguard Worker 85*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,0,edi,SIZEOF_FAST_FLOAT)], mm4 86*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,1,edi,SIZEOF_FAST_FLOAT)], mm2 87*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,2,edi,SIZEOF_FAST_FLOAT)], mm5 88*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,3,edi,SIZEOF_FAST_FLOAT)], mm0 89*dfc6aa5cSAndroid Build Coastguard Worker 90*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm6, mm3 ; mm6=(***8***9) 91*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm3, mm3 ; mm3=(***A***B) 92*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm4, mm1 ; mm4=(***C***D) 93*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm1, mm1 ; mm1=(***E***F) 94*dfc6aa5cSAndroid Build Coastguard Worker 95*dfc6aa5cSAndroid Build Coastguard Worker psrad mm6, (DWORD_BIT-BYTE_BIT) ; mm6=(89) 96*dfc6aa5cSAndroid Build Coastguard Worker psrad mm3, (DWORD_BIT-BYTE_BIT) ; mm3=(AB) 97*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm6, mm6 98*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm3, mm3 99*dfc6aa5cSAndroid Build Coastguard Worker psrad mm4, (DWORD_BIT-BYTE_BIT) ; mm4=(CD) 100*dfc6aa5cSAndroid Build Coastguard Worker psrad mm1, (DWORD_BIT-BYTE_BIT) ; mm1=(EF) 101*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm4, mm4 102*dfc6aa5cSAndroid Build Coastguard Worker pi2fd mm1, mm1 103*dfc6aa5cSAndroid Build Coastguard Worker 104*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,0,edi,SIZEOF_FAST_FLOAT)], mm6 105*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,1,edi,SIZEOF_FAST_FLOAT)], mm3 106*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,2,edi,SIZEOF_FAST_FLOAT)], mm4 107*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,3,edi,SIZEOF_FAST_FLOAT)], mm1 108*dfc6aa5cSAndroid Build Coastguard Worker 109*dfc6aa5cSAndroid Build Coastguard Worker add esi, byte 2*SIZEOF_JSAMPROW 110*dfc6aa5cSAndroid Build Coastguard Worker add edi, byte 2*DCTSIZE*SIZEOF_FAST_FLOAT 111*dfc6aa5cSAndroid Build Coastguard Worker dec ecx 112*dfc6aa5cSAndroid Build Coastguard Worker jnz near .convloop 113*dfc6aa5cSAndroid Build Coastguard Worker 114*dfc6aa5cSAndroid Build Coastguard Worker femms ; empty MMX/3DNow! state 115*dfc6aa5cSAndroid Build Coastguard Worker 116*dfc6aa5cSAndroid Build Coastguard Worker pop edi 117*dfc6aa5cSAndroid Build Coastguard Worker pop esi 118*dfc6aa5cSAndroid Build Coastguard Worker; pop edx ; need not be preserved 119*dfc6aa5cSAndroid Build Coastguard Worker; pop ecx ; need not be preserved 120*dfc6aa5cSAndroid Build Coastguard Worker pop ebx 121*dfc6aa5cSAndroid Build Coastguard Worker pop ebp 122*dfc6aa5cSAndroid Build Coastguard Worker ret 123*dfc6aa5cSAndroid Build Coastguard Worker 124*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 125*dfc6aa5cSAndroid Build Coastguard Worker; 126*dfc6aa5cSAndroid Build Coastguard Worker; Quantize/descale the coefficients, and store into coef_block 127*dfc6aa5cSAndroid Build Coastguard Worker; 128*dfc6aa5cSAndroid Build Coastguard Worker; GLOBAL(void) 129*dfc6aa5cSAndroid Build Coastguard Worker; jsimd_quantize_float_3dnow(JCOEFPTR coef_block, FAST_FLOAT *divisors, 130*dfc6aa5cSAndroid Build Coastguard Worker; FAST_FLOAT *workspace); 131*dfc6aa5cSAndroid Build Coastguard Worker; 132*dfc6aa5cSAndroid Build Coastguard Worker 133*dfc6aa5cSAndroid Build Coastguard Worker%define coef_block ebp + 8 ; JCOEFPTR coef_block 134*dfc6aa5cSAndroid Build Coastguard Worker%define divisors ebp + 12 ; FAST_FLOAT *divisors 135*dfc6aa5cSAndroid Build Coastguard Worker%define workspace ebp + 16 ; FAST_FLOAT *workspace 136*dfc6aa5cSAndroid Build Coastguard Worker 137*dfc6aa5cSAndroid Build Coastguard Worker align 32 138*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL_FUNCTION(jsimd_quantize_float_3dnow) 139*dfc6aa5cSAndroid Build Coastguard Worker 140*dfc6aa5cSAndroid Build Coastguard WorkerEXTN(jsimd_quantize_float_3dnow): 141*dfc6aa5cSAndroid Build Coastguard Worker push ebp 142*dfc6aa5cSAndroid Build Coastguard Worker mov ebp, esp 143*dfc6aa5cSAndroid Build Coastguard Worker; push ebx ; unused 144*dfc6aa5cSAndroid Build Coastguard Worker; push ecx ; unused 145*dfc6aa5cSAndroid Build Coastguard Worker; push edx ; need not be preserved 146*dfc6aa5cSAndroid Build Coastguard Worker push esi 147*dfc6aa5cSAndroid Build Coastguard Worker push edi 148*dfc6aa5cSAndroid Build Coastguard Worker 149*dfc6aa5cSAndroid Build Coastguard Worker mov eax, 0x4B400000 ; (float)0x00C00000 (rndint_magic) 150*dfc6aa5cSAndroid Build Coastguard Worker movd mm7, eax 151*dfc6aa5cSAndroid Build Coastguard Worker punpckldq mm7, mm7 ; mm7={12582912.0F 12582912.0F} 152*dfc6aa5cSAndroid Build Coastguard Worker 153*dfc6aa5cSAndroid Build Coastguard Worker mov esi, POINTER [workspace] 154*dfc6aa5cSAndroid Build Coastguard Worker mov edx, POINTER [divisors] 155*dfc6aa5cSAndroid Build Coastguard Worker mov edi, JCOEFPTR [coef_block] 156*dfc6aa5cSAndroid Build Coastguard Worker mov eax, DCTSIZE2/16 157*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 158*dfc6aa5cSAndroid Build Coastguard Worker.quantloop: 159*dfc6aa5cSAndroid Build Coastguard Worker movq mm0, MMWORD [MMBLOCK(0,0,esi,SIZEOF_FAST_FLOAT)] 160*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, MMWORD [MMBLOCK(0,1,esi,SIZEOF_FAST_FLOAT)] 161*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm0, MMWORD [MMBLOCK(0,0,edx,SIZEOF_FAST_FLOAT)] 162*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm1, MMWORD [MMBLOCK(0,1,edx,SIZEOF_FAST_FLOAT)] 163*dfc6aa5cSAndroid Build Coastguard Worker movq mm2, MMWORD [MMBLOCK(0,2,esi,SIZEOF_FAST_FLOAT)] 164*dfc6aa5cSAndroid Build Coastguard Worker movq mm3, MMWORD [MMBLOCK(0,3,esi,SIZEOF_FAST_FLOAT)] 165*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm2, MMWORD [MMBLOCK(0,2,edx,SIZEOF_FAST_FLOAT)] 166*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm3, MMWORD [MMBLOCK(0,3,edx,SIZEOF_FAST_FLOAT)] 167*dfc6aa5cSAndroid Build Coastguard Worker 168*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm0, mm7 ; mm0=(00 ** 01 **) 169*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm1, mm7 ; mm1=(02 ** 03 **) 170*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm2, mm7 ; mm0=(04 ** 05 **) 171*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm3, mm7 ; mm1=(06 ** 07 **) 172*dfc6aa5cSAndroid Build Coastguard Worker 173*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, mm0 174*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm0, mm1 ; mm0=(00 02 ** **) 175*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm4, mm1 ; mm4=(01 03 ** **) 176*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, mm2 177*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm2, mm3 ; mm2=(04 06 ** **) 178*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm5, mm3 ; mm5=(05 07 ** **) 179*dfc6aa5cSAndroid Build Coastguard Worker 180*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm0, mm4 ; mm0=(00 01 02 03) 181*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm2, mm5 ; mm2=(04 05 06 07) 182*dfc6aa5cSAndroid Build Coastguard Worker 183*dfc6aa5cSAndroid Build Coastguard Worker movq mm6, MMWORD [MMBLOCK(1,0,esi,SIZEOF_FAST_FLOAT)] 184*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, MMWORD [MMBLOCK(1,1,esi,SIZEOF_FAST_FLOAT)] 185*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm6, MMWORD [MMBLOCK(1,0,edx,SIZEOF_FAST_FLOAT)] 186*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm1, MMWORD [MMBLOCK(1,1,edx,SIZEOF_FAST_FLOAT)] 187*dfc6aa5cSAndroid Build Coastguard Worker movq mm3, MMWORD [MMBLOCK(1,2,esi,SIZEOF_FAST_FLOAT)] 188*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, MMWORD [MMBLOCK(1,3,esi,SIZEOF_FAST_FLOAT)] 189*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm3, MMWORD [MMBLOCK(1,2,edx,SIZEOF_FAST_FLOAT)] 190*dfc6aa5cSAndroid Build Coastguard Worker pfmul mm4, MMWORD [MMBLOCK(1,3,edx,SIZEOF_FAST_FLOAT)] 191*dfc6aa5cSAndroid Build Coastguard Worker 192*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm6, mm7 ; mm0=(10 ** 11 **) 193*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm1, mm7 ; mm4=(12 ** 13 **) 194*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm3, mm7 ; mm0=(14 ** 15 **) 195*dfc6aa5cSAndroid Build Coastguard Worker pfadd mm4, mm7 ; mm4=(16 ** 17 **) 196*dfc6aa5cSAndroid Build Coastguard Worker 197*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, mm6 198*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm6, mm1 ; mm6=(10 12 ** **) 199*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm5, mm1 ; mm5=(11 13 ** **) 200*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, mm3 201*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm3, mm4 ; mm3=(14 16 ** **) 202*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm1, mm4 ; mm1=(15 17 ** **) 203*dfc6aa5cSAndroid Build Coastguard Worker 204*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm6, mm5 ; mm6=(10 11 12 13) 205*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm3, mm1 ; mm3=(14 15 16 17) 206*dfc6aa5cSAndroid Build Coastguard Worker 207*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,0,edi,SIZEOF_JCOEF)], mm0 208*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(0,1,edi,SIZEOF_JCOEF)], mm2 209*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,0,edi,SIZEOF_JCOEF)], mm6 210*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [MMBLOCK(1,1,edi,SIZEOF_JCOEF)], mm3 211*dfc6aa5cSAndroid Build Coastguard Worker 212*dfc6aa5cSAndroid Build Coastguard Worker add esi, byte 16*SIZEOF_FAST_FLOAT 213*dfc6aa5cSAndroid Build Coastguard Worker add edx, byte 16*SIZEOF_FAST_FLOAT 214*dfc6aa5cSAndroid Build Coastguard Worker add edi, byte 16*SIZEOF_JCOEF 215*dfc6aa5cSAndroid Build Coastguard Worker dec eax 216*dfc6aa5cSAndroid Build Coastguard Worker jnz near .quantloop 217*dfc6aa5cSAndroid Build Coastguard Worker 218*dfc6aa5cSAndroid Build Coastguard Worker femms ; empty MMX/3DNow! state 219*dfc6aa5cSAndroid Build Coastguard Worker 220*dfc6aa5cSAndroid Build Coastguard Worker pop edi 221*dfc6aa5cSAndroid Build Coastguard Worker pop esi 222*dfc6aa5cSAndroid Build Coastguard Worker; pop edx ; need not be preserved 223*dfc6aa5cSAndroid Build Coastguard Worker; pop ecx ; unused 224*dfc6aa5cSAndroid Build Coastguard Worker; pop ebx ; unused 225*dfc6aa5cSAndroid Build Coastguard Worker pop ebp 226*dfc6aa5cSAndroid Build Coastguard Worker ret 227*dfc6aa5cSAndroid Build Coastguard Worker 228*dfc6aa5cSAndroid Build Coastguard Worker; For some reason, the OS X linker does not honor the request to align the 229*dfc6aa5cSAndroid Build Coastguard Worker; segment unless we do this. 230*dfc6aa5cSAndroid Build Coastguard Worker align 32 231