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 170b7926b9becc0f849ded05a33bb192113f6839afElliott Hughes/* Forward-declare the portable versions due to circular dependency */ 185d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genArithOpFloatPortable(CompilationUnit *cUnit, MIR *mir, 195d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlDest, RegLocation rlSrc1, 205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlSrc2); 215d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 225d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genArithOpDoublePortable(CompilationUnit *cUnit, MIR *mir, 235d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlDest, RegLocation rlSrc1, 245d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlSrc2); 255d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 265d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genConversionPortable(CompilationUnit *cUnit, MIR *mir); 275d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 280b7926b9becc0f849ded05a33bb192113f6839afElliott Hughesstatic bool handleExecuteInlineC(CompilationUnit *cUnit, MIR *mir); 290b7926b9becc0f849ded05a33bb192113f6839afElliott Hughes 305d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genConversion(CompilationUnit *cUnit, MIR *mir) 315d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 325d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return genConversionPortable(cUnit, mir); 335d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 345d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 355d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genArithOpFloat(CompilationUnit *cUnit, MIR *mir, 365d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlDest, RegLocation rlSrc1, 375d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlSrc2) 385d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 395d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2); 405d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 415d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 425d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genArithOpDouble(CompilationUnit *cUnit, MIR *mir, 435d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlDest, RegLocation rlSrc1, 445d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlSrc2) 455d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 465d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2); 475d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 485d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genInlineSqrt(CompilationUnit *cUnit, MIR *mir) 505d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 517e914f110323165e7f683eece444ef83a499596dElliott Hughes return handleExecuteInlineC(cUnit, mir); 525d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 535d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 545d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengstatic bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest, 555d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlSrc1, RegLocation rlSrc2) 565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 575d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng RegLocation rlResult = LOC_C_RETURN; 585d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng /* 595d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Don't attempt to optimize register usage since these opcodes call out to 605d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * the handlers. 615d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 629a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein switch (mir->dalvikInsn.opcode) { 635d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng case OP_CMPL_FLOAT: 645d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectFixed(cUnit, rlSrc1, r0); 655d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectFixed(cUnit, rlSrc2, r1); 665d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng genDispatchToHandler(cUnit, TEMPLATE_CMPL_FLOAT); 675d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng storeValue(cUnit, rlDest, rlResult); 685d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng break; 695d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng case OP_CMPG_FLOAT: 705d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectFixed(cUnit, rlSrc1, r0); 715d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectFixed(cUnit, rlSrc2, r1); 725d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng genDispatchToHandler(cUnit, TEMPLATE_CMPG_FLOAT); 735d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng storeValue(cUnit, rlDest, rlResult); 745d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng break; 755d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng case OP_CMPL_DOUBLE: 765d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1); 775d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3); 785d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng genDispatchToHandler(cUnit, TEMPLATE_CMPL_DOUBLE); 795d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng storeValue(cUnit, rlDest, rlResult); 805d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng break; 815d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng case OP_CMPG_DOUBLE: 825d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1); 835d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng loadValueDirectWideFixed(cUnit, rlSrc2, r2, r3); 845d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng genDispatchToHandler(cUnit, TEMPLATE_CMPG_DOUBLE); 855d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng storeValue(cUnit, rlDest, rlResult); 865d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng break; 875d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng default: 885d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return true; 895d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng } 905d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return false; 915d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 92