1*dfc6aa5cSAndroid Build Coastguard Worker; 2*dfc6aa5cSAndroid Build Coastguard Worker; jccolext.asm - colorspace conversion (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 "jcolsamp.inc" 18*dfc6aa5cSAndroid Build Coastguard Worker 19*dfc6aa5cSAndroid Build Coastguard Worker; -------------------------------------------------------------------------- 20*dfc6aa5cSAndroid Build Coastguard Worker; 21*dfc6aa5cSAndroid Build Coastguard Worker; Convert some rows of samples to the output colorspace. 22*dfc6aa5cSAndroid Build Coastguard Worker; 23*dfc6aa5cSAndroid Build Coastguard Worker; GLOBAL(void) 24*dfc6aa5cSAndroid Build Coastguard Worker; jsimd_rgb_ycc_convert_mmx(JDIMENSION img_width, JSAMPARRAY input_buf, 25*dfc6aa5cSAndroid Build Coastguard Worker; JSAMPIMAGE output_buf, JDIMENSION output_row, 26*dfc6aa5cSAndroid Build Coastguard Worker; int num_rows); 27*dfc6aa5cSAndroid Build Coastguard Worker; 28*dfc6aa5cSAndroid Build Coastguard Worker 29*dfc6aa5cSAndroid Build Coastguard Worker%define img_width(b) (b) + 8 ; JDIMENSION img_width 30*dfc6aa5cSAndroid Build Coastguard Worker%define input_buf(b) (b) + 12 ; JSAMPARRAY input_buf 31*dfc6aa5cSAndroid Build Coastguard Worker%define output_buf(b) (b) + 16 ; JSAMPIMAGE output_buf 32*dfc6aa5cSAndroid Build Coastguard Worker%define output_row(b) (b) + 20 ; JDIMENSION output_row 33*dfc6aa5cSAndroid Build Coastguard Worker%define num_rows(b) (b) + 24 ; int num_rows 34*dfc6aa5cSAndroid Build Coastguard Worker 35*dfc6aa5cSAndroid Build Coastguard Worker%define original_ebp ebp + 0 36*dfc6aa5cSAndroid Build Coastguard Worker%define wk(i) ebp - (WK_NUM - (i)) * SIZEOF_MMWORD 37*dfc6aa5cSAndroid Build Coastguard Worker ; mmword wk[WK_NUM] 38*dfc6aa5cSAndroid Build Coastguard Worker%define WK_NUM 8 39*dfc6aa5cSAndroid Build Coastguard Worker%define gotptr wk(0) - SIZEOF_POINTER ; void * gotptr 40*dfc6aa5cSAndroid Build Coastguard Worker 41*dfc6aa5cSAndroid Build Coastguard Worker align 32 42*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL_FUNCTION(jsimd_rgb_ycc_convert_mmx) 43*dfc6aa5cSAndroid Build Coastguard Worker 44*dfc6aa5cSAndroid Build Coastguard WorkerEXTN(jsimd_rgb_ycc_convert_mmx): 45*dfc6aa5cSAndroid Build Coastguard Worker push ebp 46*dfc6aa5cSAndroid Build Coastguard Worker mov eax, esp ; eax = original ebp 47*dfc6aa5cSAndroid Build Coastguard Worker sub esp, byte 4 48*dfc6aa5cSAndroid Build Coastguard Worker and esp, byte (-SIZEOF_MMWORD) ; align to 64 bits 49*dfc6aa5cSAndroid Build Coastguard Worker mov [esp], eax 50*dfc6aa5cSAndroid Build Coastguard Worker mov ebp, esp ; ebp = aligned ebp 51*dfc6aa5cSAndroid Build Coastguard Worker lea esp, [wk(0)] 52*dfc6aa5cSAndroid Build Coastguard Worker pushpic eax ; make a room for GOT address 53*dfc6aa5cSAndroid Build Coastguard Worker push ebx 54*dfc6aa5cSAndroid Build Coastguard Worker; push ecx ; need not be preserved 55*dfc6aa5cSAndroid Build Coastguard Worker; push edx ; need not be preserved 56*dfc6aa5cSAndroid Build Coastguard Worker push esi 57*dfc6aa5cSAndroid Build Coastguard Worker push edi 58*dfc6aa5cSAndroid Build Coastguard Worker 59*dfc6aa5cSAndroid Build Coastguard Worker get_GOT ebx ; get GOT address 60*dfc6aa5cSAndroid Build Coastguard Worker movpic POINTER [gotptr], ebx ; save GOT address 61*dfc6aa5cSAndroid Build Coastguard Worker 62*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, JDIMENSION [img_width(eax)] ; num_cols 63*dfc6aa5cSAndroid Build Coastguard Worker test ecx, ecx 64*dfc6aa5cSAndroid Build Coastguard Worker jz near .return 65*dfc6aa5cSAndroid Build Coastguard Worker 66*dfc6aa5cSAndroid Build Coastguard Worker push ecx 67*dfc6aa5cSAndroid Build Coastguard Worker 68*dfc6aa5cSAndroid Build Coastguard Worker mov esi, JSAMPIMAGE [output_buf(eax)] 69*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, JDIMENSION [output_row(eax)] 70*dfc6aa5cSAndroid Build Coastguard Worker mov edi, JSAMPARRAY [esi+0*SIZEOF_JSAMPARRAY] 71*dfc6aa5cSAndroid Build Coastguard Worker mov ebx, JSAMPARRAY [esi+1*SIZEOF_JSAMPARRAY] 72*dfc6aa5cSAndroid Build Coastguard Worker mov edx, JSAMPARRAY [esi+2*SIZEOF_JSAMPARRAY] 73*dfc6aa5cSAndroid Build Coastguard Worker lea edi, [edi+ecx*SIZEOF_JSAMPROW] 74*dfc6aa5cSAndroid Build Coastguard Worker lea ebx, [ebx+ecx*SIZEOF_JSAMPROW] 75*dfc6aa5cSAndroid Build Coastguard Worker lea edx, [edx+ecx*SIZEOF_JSAMPROW] 76*dfc6aa5cSAndroid Build Coastguard Worker 77*dfc6aa5cSAndroid Build Coastguard Worker pop ecx 78*dfc6aa5cSAndroid Build Coastguard Worker 79*dfc6aa5cSAndroid Build Coastguard Worker mov esi, JSAMPARRAY [input_buf(eax)] 80*dfc6aa5cSAndroid Build Coastguard Worker mov eax, INT [num_rows(eax)] 81*dfc6aa5cSAndroid Build Coastguard Worker test eax, eax 82*dfc6aa5cSAndroid Build Coastguard Worker jle near .return 83*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 84*dfc6aa5cSAndroid Build Coastguard Worker.rowloop: 85*dfc6aa5cSAndroid Build Coastguard Worker pushpic eax 86*dfc6aa5cSAndroid Build Coastguard Worker push edx 87*dfc6aa5cSAndroid Build Coastguard Worker push ebx 88*dfc6aa5cSAndroid Build Coastguard Worker push edi 89*dfc6aa5cSAndroid Build Coastguard Worker push esi 90*dfc6aa5cSAndroid Build Coastguard Worker push ecx ; col 91*dfc6aa5cSAndroid Build Coastguard Worker 92*dfc6aa5cSAndroid Build Coastguard Worker mov esi, JSAMPROW [esi] ; inptr 93*dfc6aa5cSAndroid Build Coastguard Worker mov edi, JSAMPROW [edi] ; outptr0 94*dfc6aa5cSAndroid Build Coastguard Worker mov ebx, JSAMPROW [ebx] ; outptr1 95*dfc6aa5cSAndroid Build Coastguard Worker mov edx, JSAMPROW [edx] ; outptr2 96*dfc6aa5cSAndroid Build Coastguard Worker movpic eax, POINTER [gotptr] ; load GOT address (eax) 97*dfc6aa5cSAndroid Build Coastguard Worker 98*dfc6aa5cSAndroid Build Coastguard Worker cmp ecx, byte SIZEOF_MMWORD 99*dfc6aa5cSAndroid Build Coastguard Worker jae short .columnloop 100*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 101*dfc6aa5cSAndroid Build Coastguard Worker 102*dfc6aa5cSAndroid Build Coastguard Worker%if RGB_PIXELSIZE == 3 ; --------------- 103*dfc6aa5cSAndroid Build Coastguard Worker 104*dfc6aa5cSAndroid Build Coastguard Worker.column_ld1: 105*dfc6aa5cSAndroid Build Coastguard Worker push eax 106*dfc6aa5cSAndroid Build Coastguard Worker push edx 107*dfc6aa5cSAndroid Build Coastguard Worker lea ecx, [ecx+ecx*2] ; imul ecx,RGB_PIXELSIZE 108*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_BYTE 109*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld2 110*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_BYTE 111*dfc6aa5cSAndroid Build Coastguard Worker xor eax, eax 112*dfc6aa5cSAndroid Build Coastguard Worker mov al, byte [esi+ecx] 113*dfc6aa5cSAndroid Build Coastguard Worker.column_ld2: 114*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_WORD 115*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld4 116*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_WORD 117*dfc6aa5cSAndroid Build Coastguard Worker xor edx, edx 118*dfc6aa5cSAndroid Build Coastguard Worker mov dx, word [esi+ecx] 119*dfc6aa5cSAndroid Build Coastguard Worker shl eax, WORD_BIT 120*dfc6aa5cSAndroid Build Coastguard Worker or eax, edx 121*dfc6aa5cSAndroid Build Coastguard Worker.column_ld4: 122*dfc6aa5cSAndroid Build Coastguard Worker movd mmA, eax 123*dfc6aa5cSAndroid Build Coastguard Worker pop edx 124*dfc6aa5cSAndroid Build Coastguard Worker pop eax 125*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_DWORD 126*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld8 127*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_DWORD 128*dfc6aa5cSAndroid Build Coastguard Worker movd mmG, dword [esi+ecx] 129*dfc6aa5cSAndroid Build Coastguard Worker psllq mmA, DWORD_BIT 130*dfc6aa5cSAndroid Build Coastguard Worker por mmA, mmG 131*dfc6aa5cSAndroid Build Coastguard Worker.column_ld8: 132*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_MMWORD 133*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld16 134*dfc6aa5cSAndroid Build Coastguard Worker movq mmG, mmA 135*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+0*SIZEOF_MMWORD] 136*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, SIZEOF_MMWORD 137*dfc6aa5cSAndroid Build Coastguard Worker jmp short .rgb_ycc_cnv 138*dfc6aa5cSAndroid Build Coastguard Worker.column_ld16: 139*dfc6aa5cSAndroid Build Coastguard Worker test cl, 2*SIZEOF_MMWORD 140*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, SIZEOF_MMWORD 141*dfc6aa5cSAndroid Build Coastguard Worker jz short .rgb_ycc_cnv 142*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, mmA 143*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+0*SIZEOF_MMWORD] 144*dfc6aa5cSAndroid Build Coastguard Worker movq mmG, MMWORD [esi+1*SIZEOF_MMWORD] 145*dfc6aa5cSAndroid Build Coastguard Worker jmp short .rgb_ycc_cnv 146*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 147*dfc6aa5cSAndroid Build Coastguard Worker 148*dfc6aa5cSAndroid Build Coastguard Worker.columnloop: 149*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+0*SIZEOF_MMWORD] 150*dfc6aa5cSAndroid Build Coastguard Worker movq mmG, MMWORD [esi+1*SIZEOF_MMWORD] 151*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, MMWORD [esi+2*SIZEOF_MMWORD] 152*dfc6aa5cSAndroid Build Coastguard Worker 153*dfc6aa5cSAndroid Build Coastguard Worker.rgb_ycc_cnv: 154*dfc6aa5cSAndroid Build Coastguard Worker ; mmA=(00 10 20 01 11 21 02 12) 155*dfc6aa5cSAndroid Build Coastguard Worker ; mmG=(22 03 13 23 04 14 24 05) 156*dfc6aa5cSAndroid Build Coastguard Worker ; mmF=(15 25 06 16 26 07 17 27) 157*dfc6aa5cSAndroid Build Coastguard Worker 158*dfc6aa5cSAndroid Build Coastguard Worker movq mmD, mmA 159*dfc6aa5cSAndroid Build Coastguard Worker psllq mmA, 4*BYTE_BIT ; mmA=(-- -- -- -- 00 10 20 01) 160*dfc6aa5cSAndroid Build Coastguard Worker psrlq mmD, 4*BYTE_BIT ; mmD=(11 21 02 12 -- -- -- --) 161*dfc6aa5cSAndroid Build Coastguard Worker 162*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmA, mmG ; mmA=(00 04 10 14 20 24 01 05) 163*dfc6aa5cSAndroid Build Coastguard Worker psllq mmG, 4*BYTE_BIT ; mmG=(-- -- -- -- 22 03 13 23) 164*dfc6aa5cSAndroid Build Coastguard Worker 165*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmD, mmF ; mmD=(11 15 21 25 02 06 12 16) 166*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmG, mmF ; mmG=(22 26 03 07 13 17 23 27) 167*dfc6aa5cSAndroid Build Coastguard Worker 168*dfc6aa5cSAndroid Build Coastguard Worker movq mmE, mmA 169*dfc6aa5cSAndroid Build Coastguard Worker psllq mmA, 4*BYTE_BIT ; mmA=(-- -- -- -- 00 04 10 14) 170*dfc6aa5cSAndroid Build Coastguard Worker psrlq mmE, 4*BYTE_BIT ; mmE=(20 24 01 05 -- -- -- --) 171*dfc6aa5cSAndroid Build Coastguard Worker 172*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmA, mmD ; mmA=(00 02 04 06 10 12 14 16) 173*dfc6aa5cSAndroid Build Coastguard Worker psllq mmD, 4*BYTE_BIT ; mmD=(-- -- -- -- 11 15 21 25) 174*dfc6aa5cSAndroid Build Coastguard Worker 175*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmE, mmG ; mmE=(20 22 24 26 01 03 05 07) 176*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmD, mmG ; mmD=(11 13 15 17 21 23 25 27) 177*dfc6aa5cSAndroid Build Coastguard Worker 178*dfc6aa5cSAndroid Build Coastguard Worker pxor mmH, mmH 179*dfc6aa5cSAndroid Build Coastguard Worker 180*dfc6aa5cSAndroid Build Coastguard Worker movq mmC, mmA 181*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmA, mmH ; mmA=(00 02 04 06) 182*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmC, mmH ; mmC=(10 12 14 16) 183*dfc6aa5cSAndroid Build Coastguard Worker 184*dfc6aa5cSAndroid Build Coastguard Worker movq mmB, mmE 185*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmE, mmH ; mmE=(20 22 24 26) 186*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmB, mmH ; mmB=(01 03 05 07) 187*dfc6aa5cSAndroid Build Coastguard Worker 188*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, mmD 189*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmD, mmH ; mmD=(11 13 15 17) 190*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmF, mmH ; mmF=(21 23 25 27) 191*dfc6aa5cSAndroid Build Coastguard Worker 192*dfc6aa5cSAndroid Build Coastguard Worker%else ; RGB_PIXELSIZE == 4 ; ----------- 193*dfc6aa5cSAndroid Build Coastguard Worker 194*dfc6aa5cSAndroid Build Coastguard Worker.column_ld1: 195*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_MMWORD/8 196*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld2 197*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_MMWORD/8 198*dfc6aa5cSAndroid Build Coastguard Worker movd mmA, dword [esi+ecx*RGB_PIXELSIZE] 199*dfc6aa5cSAndroid Build Coastguard Worker.column_ld2: 200*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_MMWORD/4 201*dfc6aa5cSAndroid Build Coastguard Worker jz short .column_ld4 202*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_MMWORD/4 203*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, mmA 204*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+ecx*RGB_PIXELSIZE] 205*dfc6aa5cSAndroid Build Coastguard Worker.column_ld4: 206*dfc6aa5cSAndroid Build Coastguard Worker test cl, SIZEOF_MMWORD/2 207*dfc6aa5cSAndroid Build Coastguard Worker mov ecx, SIZEOF_MMWORD 208*dfc6aa5cSAndroid Build Coastguard Worker jz short .rgb_ycc_cnv 209*dfc6aa5cSAndroid Build Coastguard Worker movq mmD, mmA 210*dfc6aa5cSAndroid Build Coastguard Worker movq mmC, mmF 211*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+0*SIZEOF_MMWORD] 212*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, MMWORD [esi+1*SIZEOF_MMWORD] 213*dfc6aa5cSAndroid Build Coastguard Worker jmp short .rgb_ycc_cnv 214*dfc6aa5cSAndroid Build Coastguard Worker alignx 16, 7 215*dfc6aa5cSAndroid Build Coastguard Worker 216*dfc6aa5cSAndroid Build Coastguard Worker.columnloop: 217*dfc6aa5cSAndroid Build Coastguard Worker movq mmA, MMWORD [esi+0*SIZEOF_MMWORD] 218*dfc6aa5cSAndroid Build Coastguard Worker movq mmF, MMWORD [esi+1*SIZEOF_MMWORD] 219*dfc6aa5cSAndroid Build Coastguard Worker movq mmD, MMWORD [esi+2*SIZEOF_MMWORD] 220*dfc6aa5cSAndroid Build Coastguard Worker movq mmC, MMWORD [esi+3*SIZEOF_MMWORD] 221*dfc6aa5cSAndroid Build Coastguard Worker 222*dfc6aa5cSAndroid Build Coastguard Worker.rgb_ycc_cnv: 223*dfc6aa5cSAndroid Build Coastguard Worker ; mmA=(00 10 20 30 01 11 21 31) 224*dfc6aa5cSAndroid Build Coastguard Worker ; mmF=(02 12 22 32 03 13 23 33) 225*dfc6aa5cSAndroid Build Coastguard Worker ; mmD=(04 14 24 34 05 15 25 35) 226*dfc6aa5cSAndroid Build Coastguard Worker ; mmC=(06 16 26 36 07 17 27 37) 227*dfc6aa5cSAndroid Build Coastguard Worker 228*dfc6aa5cSAndroid Build Coastguard Worker movq mmB, mmA 229*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmA, mmF ; mmA=(00 02 10 12 20 22 30 32) 230*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmB, mmF ; mmB=(01 03 11 13 21 23 31 33) 231*dfc6aa5cSAndroid Build Coastguard Worker 232*dfc6aa5cSAndroid Build Coastguard Worker movq mmG, mmD 233*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmD, mmC ; mmD=(04 06 14 16 24 26 34 36) 234*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmG, mmC ; mmG=(05 07 15 17 25 27 35 37) 235*dfc6aa5cSAndroid Build Coastguard Worker 236*dfc6aa5cSAndroid Build Coastguard Worker movq mmE, mmA 237*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mmA, mmD ; mmA=(00 02 04 06 10 12 14 16) 238*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mmE, mmD ; mmE=(20 22 24 26 30 32 34 36) 239*dfc6aa5cSAndroid Build Coastguard Worker 240*dfc6aa5cSAndroid Build Coastguard Worker movq mmH, mmB 241*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mmB, mmG ; mmB=(01 03 05 07 11 13 15 17) 242*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mmH, mmG ; mmH=(21 23 25 27 31 33 35 37) 243*dfc6aa5cSAndroid Build Coastguard Worker 244*dfc6aa5cSAndroid Build Coastguard Worker pxor mmF, mmF 245*dfc6aa5cSAndroid Build Coastguard Worker 246*dfc6aa5cSAndroid Build Coastguard Worker movq mmC, mmA 247*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmA, mmF ; mmA=(00 02 04 06) 248*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmC, mmF ; mmC=(10 12 14 16) 249*dfc6aa5cSAndroid Build Coastguard Worker 250*dfc6aa5cSAndroid Build Coastguard Worker movq mmD, mmB 251*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmB, mmF ; mmB=(01 03 05 07) 252*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmD, mmF ; mmD=(11 13 15 17) 253*dfc6aa5cSAndroid Build Coastguard Worker 254*dfc6aa5cSAndroid Build Coastguard Worker movq mmG, mmE 255*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmE, mmF ; mmE=(20 22 24 26) 256*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmG, mmF ; mmG=(30 32 34 36) 257*dfc6aa5cSAndroid Build Coastguard Worker 258*dfc6aa5cSAndroid Build Coastguard Worker punpcklbw mmF, mmH 259*dfc6aa5cSAndroid Build Coastguard Worker punpckhbw mmH, mmH 260*dfc6aa5cSAndroid Build Coastguard Worker psrlw mmF, BYTE_BIT ; mmF=(21 23 25 27) 261*dfc6aa5cSAndroid Build Coastguard Worker psrlw mmH, BYTE_BIT ; mmH=(31 33 35 37) 262*dfc6aa5cSAndroid Build Coastguard Worker 263*dfc6aa5cSAndroid Build Coastguard Worker%endif ; RGB_PIXELSIZE ; --------------- 264*dfc6aa5cSAndroid Build Coastguard Worker 265*dfc6aa5cSAndroid Build Coastguard Worker ; mm0=(R0 R2 R4 R6)=RE, mm2=(G0 G2 G4 G6)=GE, mm4=(B0 B2 B4 B6)=BE 266*dfc6aa5cSAndroid Build Coastguard Worker ; mm1=(R1 R3 R5 R7)=RO, mm3=(G1 G3 G5 G7)=GO, mm5=(B1 B3 B5 B7)=BO 267*dfc6aa5cSAndroid Build Coastguard Worker 268*dfc6aa5cSAndroid Build Coastguard Worker ; (Original) 269*dfc6aa5cSAndroid Build Coastguard Worker ; Y = 0.29900 * R + 0.58700 * G + 0.11400 * B 270*dfc6aa5cSAndroid Build Coastguard Worker ; Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE 271*dfc6aa5cSAndroid Build Coastguard Worker ; Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE 272*dfc6aa5cSAndroid Build Coastguard Worker ; 273*dfc6aa5cSAndroid Build Coastguard Worker ; (This implementation) 274*dfc6aa5cSAndroid Build Coastguard Worker ; Y = 0.29900 * R + 0.33700 * G + 0.11400 * B + 0.25000 * G 275*dfc6aa5cSAndroid Build Coastguard Worker ; Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE 276*dfc6aa5cSAndroid Build Coastguard Worker ; Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE 277*dfc6aa5cSAndroid Build Coastguard Worker 278*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(0)], mm0 ; wk(0)=RE 279*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(1)], mm1 ; wk(1)=RO 280*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(2)], mm4 ; wk(2)=BE 281*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(3)], mm5 ; wk(3)=BO 282*dfc6aa5cSAndroid Build Coastguard Worker 283*dfc6aa5cSAndroid Build Coastguard Worker movq mm6, mm1 284*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm1, mm3 285*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm6, mm3 286*dfc6aa5cSAndroid Build Coastguard Worker movq mm7, mm1 287*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, mm6 288*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm1, [GOTOFF(eax,PW_F0299_F0337)] ; mm1=ROL*FIX(0.299)+GOL*FIX(0.337) 289*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm6, [GOTOFF(eax,PW_F0299_F0337)] ; mm6=ROH*FIX(0.299)+GOH*FIX(0.337) 290*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm7, [GOTOFF(eax,PW_MF016_MF033)] ; mm7=ROL*-FIX(0.168)+GOL*-FIX(0.331) 291*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm4, [GOTOFF(eax,PW_MF016_MF033)] ; mm4=ROH*-FIX(0.168)+GOH*-FIX(0.331) 292*dfc6aa5cSAndroid Build Coastguard Worker 293*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(4)], mm1 ; wk(4)=ROL*FIX(0.299)+GOL*FIX(0.337) 294*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(5)], mm6 ; wk(5)=ROH*FIX(0.299)+GOH*FIX(0.337) 295*dfc6aa5cSAndroid Build Coastguard Worker 296*dfc6aa5cSAndroid Build Coastguard Worker pxor mm1, mm1 297*dfc6aa5cSAndroid Build Coastguard Worker pxor mm6, mm6 298*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm1, mm5 ; mm1=BOL 299*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm6, mm5 ; mm6=BOH 300*dfc6aa5cSAndroid Build Coastguard Worker psrld mm1, 1 ; mm1=BOL*FIX(0.500) 301*dfc6aa5cSAndroid Build Coastguard Worker psrld mm6, 1 ; mm6=BOH*FIX(0.500) 302*dfc6aa5cSAndroid Build Coastguard Worker 303*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, [GOTOFF(eax,PD_ONEHALFM1_CJ)] ; mm5=[PD_ONEHALFM1_CJ] 304*dfc6aa5cSAndroid Build Coastguard Worker 305*dfc6aa5cSAndroid Build Coastguard Worker paddd mm7, mm1 306*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm6 307*dfc6aa5cSAndroid Build Coastguard Worker paddd mm7, mm5 308*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm5 309*dfc6aa5cSAndroid Build Coastguard Worker psrld mm7, SCALEBITS ; mm7=CbOL 310*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, SCALEBITS ; mm4=CbOH 311*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm7, mm4 ; mm7=CbO 312*dfc6aa5cSAndroid Build Coastguard Worker 313*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, MMWORD [wk(2)] ; mm1=BE 314*dfc6aa5cSAndroid Build Coastguard Worker 315*dfc6aa5cSAndroid Build Coastguard Worker movq mm6, mm0 316*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm0, mm2 317*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm6, mm2 318*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, mm0 319*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, mm6 320*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm0, [GOTOFF(eax,PW_F0299_F0337)] ; mm0=REL*FIX(0.299)+GEL*FIX(0.337) 321*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm6, [GOTOFF(eax,PW_F0299_F0337)] ; mm6=REH*FIX(0.299)+GEH*FIX(0.337) 322*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm5, [GOTOFF(eax,PW_MF016_MF033)] ; mm5=REL*-FIX(0.168)+GEL*-FIX(0.331) 323*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm4, [GOTOFF(eax,PW_MF016_MF033)] ; mm4=REH*-FIX(0.168)+GEH*-FIX(0.331) 324*dfc6aa5cSAndroid Build Coastguard Worker 325*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(6)], mm0 ; wk(6)=REL*FIX(0.299)+GEL*FIX(0.337) 326*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [wk(7)], mm6 ; wk(7)=REH*FIX(0.299)+GEH*FIX(0.337) 327*dfc6aa5cSAndroid Build Coastguard Worker 328*dfc6aa5cSAndroid Build Coastguard Worker pxor mm0, mm0 329*dfc6aa5cSAndroid Build Coastguard Worker pxor mm6, mm6 330*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm0, mm1 ; mm0=BEL 331*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm6, mm1 ; mm6=BEH 332*dfc6aa5cSAndroid Build Coastguard Worker psrld mm0, 1 ; mm0=BEL*FIX(0.500) 333*dfc6aa5cSAndroid Build Coastguard Worker psrld mm6, 1 ; mm6=BEH*FIX(0.500) 334*dfc6aa5cSAndroid Build Coastguard Worker 335*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, [GOTOFF(eax,PD_ONEHALFM1_CJ)] ; mm1=[PD_ONEHALFM1_CJ] 336*dfc6aa5cSAndroid Build Coastguard Worker 337*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm0 338*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm6 339*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm1 340*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm1 341*dfc6aa5cSAndroid Build Coastguard Worker psrld mm5, SCALEBITS ; mm5=CbEL 342*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, SCALEBITS ; mm4=CbEH 343*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm5, mm4 ; mm5=CbE 344*dfc6aa5cSAndroid Build Coastguard Worker 345*dfc6aa5cSAndroid Build Coastguard Worker psllw mm7, BYTE_BIT 346*dfc6aa5cSAndroid Build Coastguard Worker por mm5, mm7 ; mm5=Cb 347*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [ebx], mm5 ; Save Cb 348*dfc6aa5cSAndroid Build Coastguard Worker 349*dfc6aa5cSAndroid Build Coastguard Worker movq mm0, MMWORD [wk(3)] ; mm0=BO 350*dfc6aa5cSAndroid Build Coastguard Worker movq mm6, MMWORD [wk(2)] ; mm6=BE 351*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, MMWORD [wk(1)] ; mm1=RO 352*dfc6aa5cSAndroid Build Coastguard Worker 353*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, mm0 354*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm0, mm3 355*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm4, mm3 356*dfc6aa5cSAndroid Build Coastguard Worker movq mm7, mm0 357*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, mm4 358*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm0, [GOTOFF(eax,PW_F0114_F0250)] ; mm0=BOL*FIX(0.114)+GOL*FIX(0.250) 359*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm4, [GOTOFF(eax,PW_F0114_F0250)] ; mm4=BOH*FIX(0.114)+GOH*FIX(0.250) 360*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm7, [GOTOFF(eax,PW_MF008_MF041)] ; mm7=BOL*-FIX(0.081)+GOL*-FIX(0.418) 361*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm5, [GOTOFF(eax,PW_MF008_MF041)] ; mm5=BOH*-FIX(0.081)+GOH*-FIX(0.418) 362*dfc6aa5cSAndroid Build Coastguard Worker 363*dfc6aa5cSAndroid Build Coastguard Worker movq mm3, [GOTOFF(eax,PD_ONEHALF)] ; mm3=[PD_ONEHALF] 364*dfc6aa5cSAndroid Build Coastguard Worker 365*dfc6aa5cSAndroid Build Coastguard Worker paddd mm0, MMWORD [wk(4)] 366*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, MMWORD [wk(5)] 367*dfc6aa5cSAndroid Build Coastguard Worker paddd mm0, mm3 368*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm3 369*dfc6aa5cSAndroid Build Coastguard Worker psrld mm0, SCALEBITS ; mm0=YOL 370*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, SCALEBITS ; mm4=YOH 371*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm0, mm4 ; mm0=YO 372*dfc6aa5cSAndroid Build Coastguard Worker 373*dfc6aa5cSAndroid Build Coastguard Worker pxor mm3, mm3 374*dfc6aa5cSAndroid Build Coastguard Worker pxor mm4, mm4 375*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm3, mm1 ; mm3=ROL 376*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm4, mm1 ; mm4=ROH 377*dfc6aa5cSAndroid Build Coastguard Worker psrld mm3, 1 ; mm3=ROL*FIX(0.500) 378*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, 1 ; mm4=ROH*FIX(0.500) 379*dfc6aa5cSAndroid Build Coastguard Worker 380*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, [GOTOFF(eax,PD_ONEHALFM1_CJ)] ; mm1=[PD_ONEHALFM1_CJ] 381*dfc6aa5cSAndroid Build Coastguard Worker 382*dfc6aa5cSAndroid Build Coastguard Worker paddd mm7, mm3 383*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm4 384*dfc6aa5cSAndroid Build Coastguard Worker paddd mm7, mm1 385*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm1 386*dfc6aa5cSAndroid Build Coastguard Worker psrld mm7, SCALEBITS ; mm7=CrOL 387*dfc6aa5cSAndroid Build Coastguard Worker psrld mm5, SCALEBITS ; mm5=CrOH 388*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm7, mm5 ; mm7=CrO 389*dfc6aa5cSAndroid Build Coastguard Worker 390*dfc6aa5cSAndroid Build Coastguard Worker movq mm3, MMWORD [wk(0)] ; mm3=RE 391*dfc6aa5cSAndroid Build Coastguard Worker 392*dfc6aa5cSAndroid Build Coastguard Worker movq mm4, mm6 393*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm6, mm2 394*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm4, mm2 395*dfc6aa5cSAndroid Build Coastguard Worker movq mm1, mm6 396*dfc6aa5cSAndroid Build Coastguard Worker movq mm5, mm4 397*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm6, [GOTOFF(eax,PW_F0114_F0250)] ; mm6=BEL*FIX(0.114)+GEL*FIX(0.250) 398*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm4, [GOTOFF(eax,PW_F0114_F0250)] ; mm4=BEH*FIX(0.114)+GEH*FIX(0.250) 399*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm1, [GOTOFF(eax,PW_MF008_MF041)] ; mm1=BEL*-FIX(0.081)+GEL*-FIX(0.418) 400*dfc6aa5cSAndroid Build Coastguard Worker pmaddwd mm5, [GOTOFF(eax,PW_MF008_MF041)] ; mm5=BEH*-FIX(0.081)+GEH*-FIX(0.418) 401*dfc6aa5cSAndroid Build Coastguard Worker 402*dfc6aa5cSAndroid Build Coastguard Worker movq mm2, [GOTOFF(eax,PD_ONEHALF)] ; mm2=[PD_ONEHALF] 403*dfc6aa5cSAndroid Build Coastguard Worker 404*dfc6aa5cSAndroid Build Coastguard Worker paddd mm6, MMWORD [wk(6)] 405*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, MMWORD [wk(7)] 406*dfc6aa5cSAndroid Build Coastguard Worker paddd mm6, mm2 407*dfc6aa5cSAndroid Build Coastguard Worker paddd mm4, mm2 408*dfc6aa5cSAndroid Build Coastguard Worker psrld mm6, SCALEBITS ; mm6=YEL 409*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, SCALEBITS ; mm4=YEH 410*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm6, mm4 ; mm6=YE 411*dfc6aa5cSAndroid Build Coastguard Worker 412*dfc6aa5cSAndroid Build Coastguard Worker psllw mm0, BYTE_BIT 413*dfc6aa5cSAndroid Build Coastguard Worker por mm6, mm0 ; mm6=Y 414*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [edi], mm6 ; Save Y 415*dfc6aa5cSAndroid Build Coastguard Worker 416*dfc6aa5cSAndroid Build Coastguard Worker pxor mm2, mm2 417*dfc6aa5cSAndroid Build Coastguard Worker pxor mm4, mm4 418*dfc6aa5cSAndroid Build Coastguard Worker punpcklwd mm2, mm3 ; mm2=REL 419*dfc6aa5cSAndroid Build Coastguard Worker punpckhwd mm4, mm3 ; mm4=REH 420*dfc6aa5cSAndroid Build Coastguard Worker psrld mm2, 1 ; mm2=REL*FIX(0.500) 421*dfc6aa5cSAndroid Build Coastguard Worker psrld mm4, 1 ; mm4=REH*FIX(0.500) 422*dfc6aa5cSAndroid Build Coastguard Worker 423*dfc6aa5cSAndroid Build Coastguard Worker movq mm0, [GOTOFF(eax,PD_ONEHALFM1_CJ)] ; mm0=[PD_ONEHALFM1_CJ] 424*dfc6aa5cSAndroid Build Coastguard Worker 425*dfc6aa5cSAndroid Build Coastguard Worker paddd mm1, mm2 426*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm4 427*dfc6aa5cSAndroid Build Coastguard Worker paddd mm1, mm0 428*dfc6aa5cSAndroid Build Coastguard Worker paddd mm5, mm0 429*dfc6aa5cSAndroid Build Coastguard Worker psrld mm1, SCALEBITS ; mm1=CrEL 430*dfc6aa5cSAndroid Build Coastguard Worker psrld mm5, SCALEBITS ; mm5=CrEH 431*dfc6aa5cSAndroid Build Coastguard Worker packssdw mm1, mm5 ; mm1=CrE 432*dfc6aa5cSAndroid Build Coastguard Worker 433*dfc6aa5cSAndroid Build Coastguard Worker psllw mm7, BYTE_BIT 434*dfc6aa5cSAndroid Build Coastguard Worker por mm1, mm7 ; mm1=Cr 435*dfc6aa5cSAndroid Build Coastguard Worker movq MMWORD [edx], mm1 ; Save Cr 436*dfc6aa5cSAndroid Build Coastguard Worker 437*dfc6aa5cSAndroid Build Coastguard Worker sub ecx, byte SIZEOF_MMWORD 438*dfc6aa5cSAndroid Build Coastguard Worker add esi, byte RGB_PIXELSIZE*SIZEOF_MMWORD ; inptr 439*dfc6aa5cSAndroid Build Coastguard Worker add edi, byte SIZEOF_MMWORD ; outptr0 440*dfc6aa5cSAndroid Build Coastguard Worker add ebx, byte SIZEOF_MMWORD ; outptr1 441*dfc6aa5cSAndroid Build Coastguard Worker add edx, byte SIZEOF_MMWORD ; outptr2 442*dfc6aa5cSAndroid Build Coastguard Worker cmp ecx, byte SIZEOF_MMWORD 443*dfc6aa5cSAndroid Build Coastguard Worker jae near .columnloop 444*dfc6aa5cSAndroid Build Coastguard Worker test ecx, ecx 445*dfc6aa5cSAndroid Build Coastguard Worker jnz near .column_ld1 446*dfc6aa5cSAndroid Build Coastguard Worker 447*dfc6aa5cSAndroid Build Coastguard Worker pop ecx ; col 448*dfc6aa5cSAndroid Build Coastguard Worker pop esi 449*dfc6aa5cSAndroid Build Coastguard Worker pop edi 450*dfc6aa5cSAndroid Build Coastguard Worker pop ebx 451*dfc6aa5cSAndroid Build Coastguard Worker pop edx 452*dfc6aa5cSAndroid Build Coastguard Worker poppic eax 453*dfc6aa5cSAndroid Build Coastguard Worker 454*dfc6aa5cSAndroid Build Coastguard Worker add esi, byte SIZEOF_JSAMPROW ; input_buf 455*dfc6aa5cSAndroid Build Coastguard Worker add edi, byte SIZEOF_JSAMPROW 456*dfc6aa5cSAndroid Build Coastguard Worker add ebx, byte SIZEOF_JSAMPROW 457*dfc6aa5cSAndroid Build Coastguard Worker add edx, byte SIZEOF_JSAMPROW 458*dfc6aa5cSAndroid Build Coastguard Worker dec eax ; num_rows 459*dfc6aa5cSAndroid Build Coastguard Worker jg near .rowloop 460*dfc6aa5cSAndroid Build Coastguard Worker 461*dfc6aa5cSAndroid Build Coastguard Worker emms ; empty MMX state 462*dfc6aa5cSAndroid Build Coastguard Worker 463*dfc6aa5cSAndroid Build Coastguard Worker.return: 464*dfc6aa5cSAndroid Build Coastguard Worker pop edi 465*dfc6aa5cSAndroid Build Coastguard Worker pop esi 466*dfc6aa5cSAndroid Build Coastguard Worker; pop edx ; need not be preserved 467*dfc6aa5cSAndroid Build Coastguard Worker; pop ecx ; need not be preserved 468*dfc6aa5cSAndroid Build Coastguard Worker pop ebx 469*dfc6aa5cSAndroid Build Coastguard Worker mov esp, ebp ; esp <- aligned ebp 470*dfc6aa5cSAndroid Build Coastguard Worker pop esp ; esp <- original ebp 471*dfc6aa5cSAndroid Build Coastguard Worker pop ebp 472*dfc6aa5cSAndroid Build Coastguard Worker ret 473*dfc6aa5cSAndroid Build Coastguard Worker 474*dfc6aa5cSAndroid Build Coastguard Worker; For some reason, the OS X linker does not honor the request to align the 475*dfc6aa5cSAndroid Build Coastguard Worker; segment unless we do this. 476*dfc6aa5cSAndroid Build Coastguard Worker align 32 477