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