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