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