From bfc6dc4ca8d5a1ee498e80a18350b91519a5412c Mon Sep 17 00:00:00 2001 From: Ashok Bhat Date: Thu, 21 Feb 2013 10:27:40 +0000 Subject: Pixelflinger: Support for handling 64-bit addresses in GGL Assembler GGLAssembler assumes addresses to be 32-bit and uses ARM 32-bit instructions to load/store/manipulate addresses. To support, 64-bit architectures, following changes has been done 1. ARMAssemblerInterface has been extended to support four new operations ADDR_LDR, ADDR_STR, ADDR_SUB, ADDR_ADD. Base class implements these virtual functions to use 32bit equivalent function. This avoids existing 32-bit Assembler backend implementations like ARMAssembler and MIPSAssembler from mapping the new functions to existing equivalent routines. This also allows 64-bit Architectures like AArch64 to override the function in their assembler backend implementations. 2. GGLAssembler code (spread over GGLAssembler.cpp, GGLAssembler.h and texturing.cpp) has been changed to use the new operations for address operations. Change-Id: I3d7eace4691e3e47cef737d97ac67ce6ef4fb18d Signed-off-by: Ashok Bhat --- .../codeflinger/ARMAssemblerInterface.cpp | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libpixelflinger/codeflinger/ARMAssemblerInterface.cpp') diff --git a/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp b/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp index 073633c..5041999 100644 --- a/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp +++ b/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp @@ -61,6 +61,29 @@ uint32_t ARMAssemblerInterface::__immed8_pre(int32_t immed8, int W) ((W&1)<<21) | (((offset&0xF0)<<4)|(offset&0xF)); } +// The following four functions are required for address manipulation +// These are virtual functions, which can be overridden by architectures +// that need special handling of address values (e.g. 64-bit arch) +void ARMAssemblerInterface::ADDR_LDR(int cc, int Rd, + int Rn, uint32_t offset) +{ + LDR(cc, Rd, Rn, offset); +} +void ARMAssemblerInterface::ADDR_STR(int cc, int Rd, + int Rn, uint32_t offset) +{ + STR(cc, Rd, Rn, offset); +} +void ARMAssemblerInterface::ADDR_ADD(int cc, int s, + int Rd, int Rn, uint32_t Op2) +{ + dataProcessing(opADD, cc, s, Rd, Rn, Op2); +} +void ARMAssemblerInterface::ADDR_SUB(int cc, int s, + int Rd, int Rn, uint32_t Op2) +{ + dataProcessing(opSUB, cc, s, Rd, Rn, Op2); +} }; // namespace android -- cgit v1.1