• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /* Forward-declare the portable versions due to circular dependency */
18 static bool genArithOpFloatPortable(CompilationUnit *cUnit, MIR *mir,
19                                     RegLocation rlDest, RegLocation rlSrc1,
20                                     RegLocation rlSrc2);
21 
22 static bool genArithOpDoublePortable(CompilationUnit *cUnit, MIR *mir,
23                                      RegLocation rlDest, RegLocation rlSrc1,
24                                      RegLocation rlSrc2);
25 
26 static bool genConversionPortable(CompilationUnit *cUnit, MIR *mir);
27 
28 static bool handleExecuteInlineC(CompilationUnit *cUnit, MIR *mir);
29 
genConversion(CompilationUnit * cUnit,MIR * mir)30 static bool genConversion(CompilationUnit *cUnit, MIR *mir)
31 {
32     return genConversionPortable(cUnit, mir);
33 }
34 
genArithOpFloat(CompilationUnit * cUnit,MIR * mir,RegLocation rlDest,RegLocation rlSrc1,RegLocation rlSrc2)35 static bool genArithOpFloat(CompilationUnit *cUnit, MIR *mir,
36                             RegLocation rlDest, RegLocation rlSrc1,
37                             RegLocation rlSrc2)
38 {
39     return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
40 }
41 
genArithOpDouble(CompilationUnit * cUnit,MIR * mir,RegLocation rlDest,RegLocation rlSrc1,RegLocation rlSrc2)42 static bool genArithOpDouble(CompilationUnit *cUnit, MIR *mir,
43                              RegLocation rlDest, RegLocation rlSrc1,
44                              RegLocation rlSrc2)
45 {
46     return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
47 }
48 
genInlineSqrt(CompilationUnit * cUnit,MIR * mir)49 static bool genInlineSqrt(CompilationUnit *cUnit, MIR *mir)
50 {
51     return handleExecuteInlineC(cUnit, mir);
52 }
53 
genCmpFP(CompilationUnit * cUnit,MIR * mir,RegLocation rlDest,RegLocation rlSrc1,RegLocation rlSrc2)54 static bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
55                      RegLocation rlSrc1, RegLocation rlSrc2)
56 {
57     RegLocation rlResult = LOC_C_RETURN;
58     /*
59      * Don't attempt to optimize register usage since these opcodes call out to
60      * the handlers.
61      */
62     switch (mir->dalvikInsn.opcode) {
63         case OP_CMPL_FLOAT:
64             loadValueDirectFixed(cUnit, rlSrc1, r0);
65             loadValueDirectFixed(cUnit, rlSrc2, r1);
66             genDispatchToHandler(cUnit, TEMPLATE_CMPL_FLOAT);
67             storeValue(cUnit, rlDest, rlResult);
68             break;
69         case OP_CMPG_FLOAT:
70             loadValueDirectFixed(cUnit, rlSrc1, r0);
71             loadValueDirectFixed(cUnit, rlSrc2, r1);
72             genDispatchToHandler(cUnit, TEMPLATE_CMPG_FLOAT);
73             storeValue(cUnit, rlDest, rlResult);
74             break;
75         case OP_CMPL_DOUBLE:
76             loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
77             loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3);
78             genDispatchToHandler(cUnit, TEMPLATE_CMPL_DOUBLE);
79             storeValue(cUnit, rlDest, rlResult);
80             break;
81         case OP_CMPG_DOUBLE:
82             loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
83             loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3);
84             genDispatchToHandler(cUnit, TEMPLATE_CMPG_DOUBLE);
85             storeValue(cUnit, rlDest, rlResult);
86             break;
87         default:
88             return true;
89     }
90     return false;
91 }
92