15d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 25d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Copyright (C) 2009 The Android Open Source Project 35d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 45d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 55d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * you may not use this file except in compliance with the License. 65d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * You may obtain a copy of the License at 75d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 85d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * http://www.apache.org/licenses/LICENSE-2.0 95d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 105d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Unless required by applicable law or agreed to in writing, software 115d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * distributed under the License is distributed on an "AS IS" BASIS, 125d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * See the License for the specific language governing permissions and 145d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * limitations under the License. 155d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 165d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 175d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 185d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * This file contains codegen for the Thumb ISA and is intended to be 195d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * includes by: 205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 215d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Codegen-$(TARGET_ARCH_VARIANT).c 225d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 235d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 245d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 25b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee/* Stress mode for testing: if defined will reverse corereg/floatreg hint */ 26b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee//#define REGCLASS_STRESS_MODE 27b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee 285d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 295d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Alloc a pair of core registers, or a double. Low reg in low byte, 305d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * high reg in next byte. 315d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 325d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengint dvmCompilerAllocTypedTempPair(CompilationUnit *cUnit, 335d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng bool fpHint, int regClass) 345d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 355d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng int highReg; 365d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng int lowReg; 375d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng int res = 0; 38b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee 39b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee#if defined(REGCLASS_STRESS_MODE) 40b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee fpHint = !fpHint; 41b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee#endif 42b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee 435d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng if (((regClass == kAnyReg) && fpHint) || (regClass == kFPReg)) { 44c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee lowReg = dvmCompilerAllocTempDouble(cUnit); 455d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng highReg = lowReg + 1; 465d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng } else { 47c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee lowReg = dvmCompilerAllocTemp(cUnit); 48c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee highReg = dvmCompilerAllocTemp(cUnit); 495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng } 505d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng res = (lowReg & 0xff) | ((highReg & 0xff) << 8); 515d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return res; 525d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 535d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 545d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengint dvmCompilerAllocTypedTemp(CompilationUnit *cUnit, bool fpHint, 555d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng int regClass) 565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 57b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee#if defined(REGCLASS_STRESS_MODE) 58b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee fpHint = !fpHint; 59b6d372886d145716f1f62d39726ea06255ebe76dBill Buzbee#endif 605d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng if (((regClass == kAnyReg) && fpHint) || (regClass == kFPReg)) 61c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee return dvmCompilerAllocTempFloat(cUnit); 62c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee return dvmCompilerAllocTemp(cUnit); 635d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 64