1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/t32cb16blend.S 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Copyright 2006, The Android Open Source Project 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** you may not use this file except in compliance with the License. 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** You may obtain a copy of the License at 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** See the License for the specific language governing permissions and 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** limitations under the License. 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .text 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .align 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .global scanline_t32cb16blend_arm 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian/* 269d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * .macro pixel 279d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 289d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * \DREG is a 32-bit register containing *two* original destination RGB565 299d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * pixels, with the even one in the low-16 bits, and the odd one in the 309d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * high 16 bits. 319d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 329d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * \SRC is a 32-bit 0xAABBGGRR pixel value, with pre-multiplied colors. 339d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 349d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * \FB is a target register that will contain the blended pixel values. 359d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 369d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * \ODD is either 0 or 1 and indicates if we're blending the lower or 379d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * upper 16-bit pixels in DREG into FB 389d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 399d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 409d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * clobbered: r6, r7, lr 419d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian * 429d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian */ 439d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian 449d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian.macro pixel, DREG, SRC, FB, ODD 459d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian 469d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian // SRC = 0xAABBGGRR 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r7, \SRC, lsr #24 // sA 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add r7, r7, r7, lsr #7 // sA + (sA >> 7) 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rsb r7, r7, #0x100 // sA = 0x100 - (sA+(sA>>7)) 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project1: 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 539d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian.if \ODD 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // red 569d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian mov lr, \DREG, lsr #(16 + 11) 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbb lr, r7, lr 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r6, \SRC, lsr #3 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and r6, r6, #0x1F 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add lr, r6, lr, lsr #8 619d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp lr, #0x1F 629d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrhs \FB, \FB, #(0x1F<<(16 + 11)) 639d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrlo \FB, \FB, lr, lsl #(16 + 11) 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // green 669d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian and r6, \DREG, #(0x3F<<(16 + 5)) 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbt r6, r7, r6 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov lr, \SRC, lsr #(8+2) 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and lr, lr, #0x3F 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add r6, lr, r6, lsr #(5+8) 719d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp r6, #0x3F 729d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrhs \FB, \FB, #(0x3F<<(16 + 5)) 739d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrlo \FB, \FB, r6, lsl #(16 + 5) 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // blue 769d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian and lr, \DREG, #(0x1F << 16) 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbt lr, r7, lr 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r6, \SRC, lsr #(8+8+3) 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and r6, r6, #0x1F 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add lr, r6, lr, lsr #8 819d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp lr, #0x1F 829d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrhs \FB, \FB, #(0x1F << 16) 839d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrlo \FB, \FB, lr, lsl #16 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project.else 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // red 889d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian mov lr, \DREG, lsr #11 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and lr, lr, #0x1F 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbb lr, r7, lr 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r6, \SRC, lsr #3 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and r6, r6, #0x1F 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add lr, r6, lr, lsr #8 949d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp lr, #0x1F 959d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian movhs \FB, #(0x1F<<11) 969d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian movlo \FB, lr, lsl #11 979d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // green 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and r6, \DREG, #(0x3F<<5) 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbb r6, r7, r6 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov lr, \SRC, lsr #(8+2) 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and lr, lr, #0x3F 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add r6, lr, r6, lsr #(5+8) 1059d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp r6, #0x3F 1069d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrhs \FB, \FB, #(0x3F<<5) 1079d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrlo \FB, \FB, r6, lsl #5 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // blue 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and lr, \DREG, #0x1F 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project smulbb lr, r7, lr 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r6, \SRC, lsr #(8+8+3) 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project and r6, r6, #0x1F 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add lr, r6, lr, lsr #8 1159d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian cmp lr, #0x1F 1169d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrhs \FB, \FB, #0x1F 1179d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian orrlo \FB, \FB, lr 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project.endif 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .endm 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r0: dst ptr 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r1: src ptr 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r2: count 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r3: d 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r4: s0 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r5: s1 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r6: pixel 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r7: pixel 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r8: free 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r9: free 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r10: free 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r11: free 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r12: scratch 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// r14: pixel 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectscanline_t32cb16blend_arm: 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stmfd sp!, {r4-r7, lr} 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pld [r0] 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pld [r1] 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // align DST to 32 bits 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tst r0, #0x3 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project beq aligned 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project subs r2, r2, #1 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldmlofd sp!, {r4-r7, lr} // return 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bxlo lr 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlast: 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldr r4, [r1], #4 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldrh r3, [r0] 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel r3, r4, r12, 0 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strh r12, [r0], #2 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectaligned: 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project subs r2, r2, #2 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blo 9f 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1629d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian // The main loop is unrolled twice and processes 4 pixels 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project8: ldmia r1!, {r4, r5} 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // stream the source 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pld [r1, #32] 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add r0, r0, #4 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // it's all zero, skip this pixel 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project orrs r3, r4, r5 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project beq 7f 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // load the destination 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldr r3, [r0, #-4] 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // stream the destination 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pld [r0, #32] 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel r3, r4, r12, 0 1769d881764173ce16badb6f1098ba5cf44b36f9aecMathias Agopian pixel r3, r5, r12, 1 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // effectively, we're getting write-combining by virtue of the 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // cpu's write-back cache. 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project str r12, [r0, #-4] 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 2nd iterration of the loop, don't stream anything 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project subs r2, r2, #2 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project movlt r4, r5 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blt 9f 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldmia r1!, {r4, r5} 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project add r0, r0, #4 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project orrs r3, r4, r5 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project beq 7f 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldr r3, [r0, #-4] 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel r3, r4, r12, 0 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel r3, r5, r12, 16 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project str r12, [r0, #-4] 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project7: subs r2, r2, #2 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bhs 8b 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mov r4, r5 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project9: adds r2, r2, #1 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ldmlofd sp!, {r4-r7, lr} // return 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bxlo lr 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project b last 203