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