load_store.cpp revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/codeflinger/load_store.cpp 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#include <assert.h> 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/log.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/GGLAssembler.h" 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::store(const pointer_t& addr, const pixel_t& s, uint32_t flags) 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int bits = addr.size; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int inc = (flags & WRITE_BACK)?1:0; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (bits) { 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 32: 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) STR(AL, s.reg, addr.reg, immed12_post(4)); 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else STR(AL, s.reg, addr.reg); 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 24: 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 24 bits formats are a little special and used only for RGB 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 0x00BBGGRR is unpacked as R,G,B 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STRB(AL, s.reg, addr.reg, immed12_pre(0)); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 8)); 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STRB(AL, s.reg, addr.reg, immed12_pre(1)); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 8)); 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project STRB(AL, s.reg, addr.reg, immed12_pre(2)); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!(s.flags & CORRUPTIBLE)) { 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 16)); 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ADD(AL, 0, addr.reg, addr.reg, imm(3)); 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 16: 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) STRH(AL, s.reg, addr.reg, immed8_post(2)); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else STRH(AL, s.reg, addr.reg); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 8: 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) STRB(AL, s.reg, addr.reg, immed12_post(1)); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else STRB(AL, s.reg, addr.reg); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::load(const pointer_t& addr, const pixel_t& s, uint32_t flags) 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Scratch scratches(registerFile()); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int s0; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int bits = addr.size; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int inc = (flags & WRITE_BACK)?1:0; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (bits) { 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 32: 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) LDR(AL, s.reg, addr.reg, immed12_post(4)); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else LDR(AL, s.reg, addr.reg); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 24: 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 24 bits formats are a little special and used only for RGB 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // R,G,B is packed as 0x00BBGGRR 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s0 = scratches.obtain(); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s.reg != addr.reg) { 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s.reg, addr.reg, immed12_pre(0)); // R 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s0, addr.reg, immed12_pre(1)); // G 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, s.reg, s.reg, reg_imm(s0, LSL, 8)); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s0, addr.reg, immed12_pre(2)); // B 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, s.reg, s.reg, reg_imm(s0, LSL, 16)); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int s1 = scratches.obtain(); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s1, addr.reg, immed12_pre(0)); // R 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s0, addr.reg, immed12_pre(1)); // G 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, s1, s1, reg_imm(s0, LSL, 8)); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LDRB(AL, s0, addr.reg, immed12_pre(2)); // B 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, s.reg, s1, reg_imm(s0, LSL, 16)); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ADD(AL, 0, addr.reg, addr.reg, imm(3)); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 16: 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) LDRH(AL, s.reg, addr.reg, immed8_post(2)); 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else LDRH(AL, s.reg, addr.reg); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 8: 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (inc) LDRB(AL, s.reg, addr.reg, immed12_post(1)); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else LDRB(AL, s.reg, addr.reg); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::extract(integer_t& d, int s, int h, int l, int bits) 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int maskLen = h-l; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assert(maskLen<=8); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assert(h); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (h != bits) { 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int mask = ((1<<maskLen)-1) << l; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isValidImmediate(mask)) { 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project AND(AL, 0, d.reg, s, imm(mask)); // component = packed & mask; 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (isValidImmediate(~mask)) { 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project BIC(AL, 0, d.reg, s, imm(~mask)); // component = packed & mask; 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(s, LSL, 32-h)); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project l += 32-h; 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project h = 32; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = d.reg; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (l) { 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(s, LSR, l)); // component = packed >> l; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = d.reg; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s != d.reg) { 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, s); 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d.s = maskLen; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::extract(integer_t& d, const pixel_t& s, int component) 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project extract(d, s.reg, 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.format.c[component].h, 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.format.c[component].l, 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.size()); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::extract(component_t& d, const pixel_t& s, int component) 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project integer_t r(d.reg, 32, d.flags); 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project extract(r, s.reg, 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.format.c[component].h, 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.format.c[component].l, 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.size()); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = component_t(r); 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::expand(integer_t& d, const component_t& s, int dbits) 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s.l || (s.flags & CLEAR_HI)) { 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project extract(d, s.reg, s.h, s.l, 32); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project expand(d, d, dbits); 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project expand(d, integer_t(s.reg, s.size(), s.flags), dbits); 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::expand(component_t& d, const component_t& s, int dbits) 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project integer_t r(d.reg, 32, d.flags); 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project expand(r, s, dbits); 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = component_t(r); 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::expand(integer_t& dst, const integer_t& src, int dbits) 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assert(src.size()); 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sbits = src.size(); 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int s = src.reg; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int d = dst.reg; 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // be sure to set 'dst' after we read 'src' as they may be identical 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst.s = dbits; 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst.flags = 0; 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dbits<=sbits) { 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s != d) { 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d, s); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sbits == 1) { 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project RSB(AL, 0, d, s, reg_imm(s, LSL, dbits)); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // d = (s<<dbits) - s; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dbits % sbits) { 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d, reg_imm(s, LSL, dbits-sbits)); 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // d = s << (dbits-sbits); 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dbits -= sbits; 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d, d, reg_imm(d, LSR, sbits)); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // d |= d >> sbits; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dbits -= sbits; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbits *= 2; 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while(dbits>0); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dbits -= sbits; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d, s, reg_imm(s, LSL, sbits)); 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // d |= d<<sbits; 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = d; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dbits -= sbits; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sbits*2 < dbits) { 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbits *= 2; 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while(dbits>0); 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid GGLAssembler::downshift( 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t& d, int component, component_t s, const reg_t& dither) 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const needs_t& needs = mBuilderContext.needs; 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Scratch scratches(registerFile()); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sh = s.h; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sl = s.l; 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int maskHiBits = (sh!=32) ? ((s.flags & CLEAR_HI)?1:0) : 0; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int maskLoBits = (sl!=0) ? ((s.flags & CLEAR_LO)?1:0) : 0; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sbits = sh - sl; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dh = d.format.c[component].h; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dl = d.format.c[component].l; 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dbits = dh - dl; 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dithering = 0; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOGE_IF(sbits<dbits, "sbits (%d) < dbits (%d) in downshift", sbits, dbits); 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sbits>dbits) { 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // see if we need to dither 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dithering = mDithering; 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ireg = d.reg; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!(d.flags & FIRST)) { 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s.flags & CORRUPTIBLE) { 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ireg = s.reg; 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ireg = scratches.obtain(); 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d.flags &= ~FIRST; 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (maskHiBits) { 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we need to mask the high bits (and possibly the lowbits too) 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // and we might be able to use immediate mask. 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!dithering) { 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we don't do this if we only have maskLoBits because we can 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // do it more efficiently below (in the case where dl=0) 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int offset = sh - dbits; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dbits<=8 && offset >= 0) { 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t mask = ((1<<dbits)-1) << offset; 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isValidImmediate(mask) || isValidImmediate(~mask)) { 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project build_and_immediate(ireg, s.reg, mask, 32); 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sl = offset; 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.reg = ireg; 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sbits = dbits; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project maskLoBits = maskHiBits = 0; 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // in the dithering case though, we need to preserve the lower bits 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t mask = ((1<<sbits)-1) << sl; 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (isValidImmediate(mask) || isValidImmediate(~mask)) { 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project build_and_immediate(ireg, s.reg, mask, 32); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.reg = ireg; 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project maskLoBits = maskHiBits = 0; 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // XXX: we could special case (maskHiBits & !maskLoBits) 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // like we do for maskLoBits below, but it happens very rarely 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // that we have maskHiBits only and the conditions necessary to lead 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // to better code (like doing d |= s << 24) 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (maskHiBits) { 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, ireg, reg_imm(s.reg, LSL, 32-sh)); 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sl += 32-sh; 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh = 32; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.reg = ireg; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project maskHiBits = 0; 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Downsampling should be performed as follows: 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V * ((1<<dbits)-1) / ((1<<sbits)-1) 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V * [(1<<dbits)/((1<<sbits)-1) - 1/((1<<sbits)-1)] 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V * [1/((1<<sbits)-1)>>dbits - 1/((1<<sbits)-1)] 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V/((1<<(sbits-dbits))-(1>>dbits)) - (V>>sbits)/((1<<sbits)-1)>>sbits 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V/((1<<(sbits-dbits))-(1>>dbits)) - (V>>sbits)/(1-(1>>sbits)) 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // By approximating (1>>dbits) and (1>>sbits) to 0: 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // V>>(sbits-dbits) - V>>sbits 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // A good approximation is V>>(sbits-dbits), 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // but better one (needed for dithering) is: 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (V>>(sbits-dbits)<<sbits - V)>>sbits 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (V<<dbits - V)>>sbits 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (V - V>>dbits)>>(sbits-dbits) 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Dithering is done here 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dithering) { 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project comment("dithering"); 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sl) { 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, ireg, reg_imm(s.reg, LSR, sl)); 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sh -= sl; 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sl = 0; 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.reg = ireg; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // scaling (V-V>>dbits) 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SUB(AL, 0, ireg, s.reg, reg_imm(s.reg, LSR, dbits)); 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int shift = (GGL_DITHER_BITS - (sbits-dbits)); 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (shift>0) ADD(AL, 0, ireg, ireg, reg_imm(dither.reg, LSR, shift)); 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (shift<0) ADD(AL, 0, ireg, ireg, reg_imm(dither.reg, LSL,-shift)); 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else ADD(AL, 0, ireg, ireg, dither.reg); 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s.reg = ireg; 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((maskLoBits|dithering) && (sh > dbits)) { 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int shift = sh-dbits; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dl) { 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, ireg, reg_imm(s.reg, LSR, shift)); 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ireg == d.reg) { 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(ireg, LSL, dl)); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d.reg, d.reg, reg_imm(ireg, LSL, dl)); 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ireg == d.reg) { 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(s.reg, LSR, shift)); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSR, shift)); 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int shift = sh-dh; 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (shift>0) { 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ireg == d.reg) { 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(s.reg, LSR, shift)); 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSR, shift)); 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (shift<0) { 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ireg == d.reg) { 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, reg_imm(s.reg, LSL, -shift)); 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSL, -shift)); 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ireg == d.reg) { 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (s.reg != d.reg) { 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project MOV(AL, 0, d.reg, s.reg); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ORR(AL, 0, d.reg, d.reg, s.reg); 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 379