Home | History | Annotate | Download | only in FP
      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 decalraton 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 genConversion(CompilationUnit *cUnit, MIR *mir)
     29 {
     30     return genConversionPortable(cUnit, mir);
     31 }
     32 
     33 static bool genArithOpFloat(CompilationUnit *cUnit, MIR *mir,
     34                             RegLocation rlDest, RegLocation rlSrc1,
     35                             RegLocation rlSrc2)
     36 {
     37     return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
     38 }
     39 
     40 static bool genArithOpDouble(CompilationUnit *cUnit, MIR *mir,
     41                              RegLocation rlDest, RegLocation rlSrc1,
     42                              RegLocation rlSrc2)
     43 {
     44     return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
     45 }
     46 
     47 static bool genInlineSqrt(CompilationUnit *cUnit, MIR *mir)
     48 {
     49     return false;   /* punt to C handler */
     50 }
     51 
     52 static bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
     53                      RegLocation rlSrc1, RegLocation rlSrc2)
     54 {
     55     RegLocation rlResult = LOC_C_RETURN;
     56     /*
     57      * Don't attempt to optimize register usage since these opcodes call out to
     58      * the handlers.
     59      */
     60     switch (mir->dalvikInsn.opCode) {
     61         case OP_CMPL_FLOAT:
     62             loadValueDirectFixed(cUnit, rlSrc1, r0);
     63             loadValueDirectFixed(cUnit, rlSrc2, r1);
     64             genDispatchToHandler(cUnit, TEMPLATE_CMPL_FLOAT);
     65             storeValue(cUnit, rlDest, rlResult);
     66             break;
     67         case OP_CMPG_FLOAT:
     68             loadValueDirectFixed(cUnit, rlSrc1, r0);
     69             loadValueDirectFixed(cUnit, rlSrc2, r1);
     70             genDispatchToHandler(cUnit, TEMPLATE_CMPG_FLOAT);
     71             storeValue(cUnit, rlDest, rlResult);
     72             break;
     73         case OP_CMPL_DOUBLE:
     74             loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
     75             loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3);
     76             genDispatchToHandler(cUnit, TEMPLATE_CMPL_DOUBLE);
     77             storeValue(cUnit, rlDest, rlResult);
     78             break;
     79         case OP_CMPG_DOUBLE:
     80             loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
     81             loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3);
     82             genDispatchToHandler(cUnit, TEMPLATE_CMPG_DOUBLE);
     83             storeValue(cUnit, rlDest, rlResult);
     84             break;
     85         default:
     86             return true;
     87     }
     88     return false;
     89 }
     90