1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/codeflinger/ARMAssemblerInterface.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
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h>
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/log.h>
259857d99eecc389389da261a72461322d5cfb8eebMathias Agopian#include "ARMAssemblerInterface.h"
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android {
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectARMAssemblerInterface::~ARMAssemblerInterface()
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// --------------------------------------------------------------------
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// The following two functions are static and used for initializers
382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// in the original ARM code. The above versions (without __), are now
392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// virtual, and can be overridden in the MIPS code. But since these are
402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// needed at initialization time, they must be static. Not thrilled with
412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// this implementation, but it works...
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Linduint32_t ARMAssemblerInterface::__immed12_pre(int32_t immed12, int W)
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800,
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        "LDR(B)/STR(B)/PLD immediate too big (%08x)",
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        immed12);
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return (1<<24) | (((uint32_t(immed12)>>31)^1)<<23) |
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ((W&1)<<21) | (abs(immed12)&0x7FF);
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Linduint32_t ARMAssemblerInterface::__immed8_pre(int32_t immed8, int W)
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t offset = abs(immed8);
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100,
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)",
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        immed8);
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return  (1<<24) | (1<<22) | (((uint32_t(immed8)>>31)^1)<<23) |
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ((W&1)<<21) | (((offset&0xF0)<<4)|(offset&0xF));
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
64bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat// The following four functions are required for address manipulation
65bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat// These are virtual functions, which can be overridden by architectures
66bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat// that need special handling of address values (e.g. 64-bit arch)
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhatvoid ARMAssemblerInterface::ADDR_LDR(int cc, int Rd,
69bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat     int Rn, uint32_t offset)
70bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat{
71bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat    LDR(cc, Rd, Rn, offset);
72bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat}
73bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhatvoid ARMAssemblerInterface::ADDR_STR(int cc, int Rd,
74bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat     int Rn, uint32_t offset)
75bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat{
76bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat    STR(cc, Rd, Rn, offset);
77bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat}
78bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhatvoid ARMAssemblerInterface::ADDR_ADD(int cc, int s,
79bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat     int Rd, int Rn, uint32_t Op2)
80bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat{
81bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat    dataProcessing(opADD, cc, s, Rd, Rn, Op2);
82bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat}
83bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhatvoid ARMAssemblerInterface::ADDR_SUB(int cc, int s,
84bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat     int Rd, int Rn, uint32_t Op2)
85bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat{
86bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat    dataProcessing(opSUB, cc, s, Rd, Rn, Op2);
87bfc6dc4ca8d5a1ee498e80a18350b91519a5412cAshok Bhat}
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
90