18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Tiny Code Generator for QEMU 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2008 Fabrice Bellard 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions: 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE. 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint gen_new_label(void); 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_op0(TCGOpcode opc) 2986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 3086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 3186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 3286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 33f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1) 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 35975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 36975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 39f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1) 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 41975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 42975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 45f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1) 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 47975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 48975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg1; 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 51f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2) 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 53975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 54975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 55975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 58f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2) 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 60975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 61975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 62975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 65f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2) 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 67975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 68975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 69975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg2; 705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 72f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2) 735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 74975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 75975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 76975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg2; 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 79f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2) 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 81975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 82975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg1; 83975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg2; 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 86f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3) 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 89975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 90975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 91975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 92975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 95f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3) 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 98975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 99975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 100975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 101975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 104f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1, 105f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg2, TCGArg arg3) 1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 107975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 108975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 109975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 110975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg3; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 113f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1, 114f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg2, TCGArg arg3) 1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 116975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 117975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 118975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 119975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg3; 1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 122f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val, 123f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_ptr base, TCGArg offset) 1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 125975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 126975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(val); 127975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_PTR(base); 128975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = offset; 1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 131f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val, 132f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_ptr base, TCGArg offset) 1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 134975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 135975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(val); 136975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_PTR(base); 137975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = offset; 1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 140f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3, TCGv_i32 arg4) 1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 143975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 144975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 145975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 146975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 147975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 150f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3, TCGv_i64 arg4) 1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 153975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 154975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 155975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 156975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 157975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 160f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3, TCGArg arg4) 1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 163975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 164975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 165975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 166975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 167975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 170f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 1715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3, TCGArg arg4) 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 173975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 174975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 175975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 176975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 177975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 180f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 1815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGArg arg3, TCGArg arg4) 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 183975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 184975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 185975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 186975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg3; 187975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 190f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 1915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGArg arg3, TCGArg arg4) 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 193975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 194975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 195975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 196975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg3; 197975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 200f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 2015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5) 2025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 203975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 204975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 205975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 206975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 207975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 208975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5); 2095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 211f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 2125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5) 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 214975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 215975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 216975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 217975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 218975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 219975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 222f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5) 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 225975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 226975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 227975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 228975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 229975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 230975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 233f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5) 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 236975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 237975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 238975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 239975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 240975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 241975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 2425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 244f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1, 245f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg2, TCGv_i32 arg3, 246f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGArg arg4, TCGArg arg5) 247f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 248975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 249975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 250975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 251975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 252975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 253975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 254f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 255f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 256f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1, 257f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg2, TCGv_i64 arg3, 258f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGArg arg4, TCGArg arg5) 259f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 260975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 261975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 262975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 263975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 264975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg4; 265975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 266f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 267f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 268f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5, 2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 arg6) 2715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 272975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 273975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 274975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 275975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 276975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 277975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5); 278975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg6); 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 281f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 2825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5, 2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 arg6) 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 285975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 286975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 287975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 288975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 289975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 290975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5); 291975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg6); 2925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 294f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 295b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i32 arg3, TCGv_i32 arg4, 296b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i32 arg5, TCGArg arg6) 297b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 298975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 299975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 300975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 301975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 302975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 303975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg5); 304975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg6; 305b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 306b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 307f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 308b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i64 arg3, TCGv_i64 arg4, 309b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i64 arg5, TCGArg arg6) 310b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 311975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 312975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 313975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 314975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 315975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 316975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg5); 317975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg6; 318b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 319b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 320f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1, 321f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg2, TCGv_i32 arg3, 322f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg4, TCGArg arg5, TCGArg arg6) 3235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 324975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 325975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg1); 326975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg2); 327975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg3); 328975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(arg4); 329975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 330975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg6; 3315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 333f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1, 334f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg2, TCGv_i64 arg3, 335f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg4, TCGArg arg5, TCGArg arg6) 3365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 337975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opc_ptr++ = opc; 338975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg1); 339975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg2); 340975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg3); 341975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(arg4); 342975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg5; 343975bba804aed54452f774cdbf79a7b4732fc7696David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = arg6; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 34686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_add_param_i32(TCGv_i32 val) 34786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 34886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(val); 34986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 35086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 35186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_add_param_i64(TCGv_i64 val) 35286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 35386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 35486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(TCGV_LOW(val)); 35586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(TCGV_HIGH(val)); 35686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 35786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I64(val); 35886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif 35986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 36086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void gen_set_label(int n) 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_op1i(INDEX_op_set_label, n); 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_br(int label) 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_op1i(INDEX_op_br, label); 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!TCGV_EQUAL_I32(ret, arg)) 3745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg); 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 382f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner/* A version of dh_sizemask from def-helper.h that doesn't rely on 383f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner preprocessor magic. */ 384f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline int tcg_gen_sizemask(int n, int is_64bit, int is_signed) 385f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 386f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner return (is_64bit << n*2) | (is_signed << (n*2 + 1)); 387f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 388f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* helper calls */ 3905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_helperN(void *func, int flags, int sizemask, 3915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGArg ret, int nargs, TCGArg *args) 3925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 3935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_ptr fn; 39486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner fn = tcg_const_ptr(func); 3955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret, 3965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nargs, args); 3975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_ptr(fn); 3985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 400f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner/* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently 40186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner reserved for helpers in tcg-runtime.c. These helpers all do not read 40286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner globals and do not have side effects, hence the call to tcg_gen_callN() 40386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner with TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS. This may need 40486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner to be adjusted if these functions start to be used with other helpers. */ 405f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret, 406f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 a, TCGv_i32 b) 407f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 408f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_ptr fn; 409f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGArg args[2]; 41086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner fn = tcg_const_ptr(func); 411f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner args[0] = GET_TCGV_I32(a); 412f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner args[1] = GET_TCGV_I32(b); 41386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_callN(&tcg_ctx, fn, 41486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS, 41586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask, GET_TCGV_I32(ret), 2, args); 416f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_temp_free_ptr(fn); 417f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 418f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 419f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret, 4205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 a, TCGv_i64 b) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_ptr fn; 4235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGArg args[2]; 42486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner fn = tcg_const_ptr(func); 4255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner args[0] = GET_TCGV_I64(a); 4265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner args[1] = GET_TCGV_I64(b); 42786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_callN(&tcg_ctx, fn, 42886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS, 42986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask, GET_TCGV_I64(ret), 2, args); 4305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_ptr(fn); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 32 bit ops */ 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset); 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset); 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset); 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset); 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset); 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* some cases can be optimized here */ 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_add_i32(ret, arg1, t0); 4885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2); 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2) 4985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 4995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg1); 5005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sub_i32(ret, t0, arg2); 5015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 5025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 5035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 5045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* some cases can be optimized here */ 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_sub_i32(ret, arg1, t0); 5125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I32(arg1, arg2)) { 5195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, arg1); 5205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 5215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2); 5225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 52586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, uint32_t arg2) 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 52786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0; 52886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 52986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner switch (arg2) { 53086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0: 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(ret, 0); 53286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 53386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffffffffu: 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 53586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 53686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffu: 53786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Don't recurse with tcg_gen_ext8u_i32. */ 53886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8u_i32) { 53986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg1); 54086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 54186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 54286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner break; 54386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffffu: 54486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16u_i32) { 54586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg1); 54686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 54786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 54886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner break; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 55086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_const_i32(arg2); 55186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(ret, arg1, t0); 55286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I32(arg1, arg2)) { 5585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, arg1); 5595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 5605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2); 5615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 56686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 56786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (arg2 == -1) { 56886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(ret, -1); 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (arg2 == 0) { 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_or_i32(ret, arg1, t0); 5745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I32(arg1, arg2)) { 5815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_movi_i32(ret, 0); 5825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 5835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2); 5845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 58986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 59286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (arg2 == -1 && TCG_TARGET_HAS_not_i32) { 59386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Don't recurse with tcg_gen_not_i32. */ 59486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg1); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_xor_i32(ret, arg1, t0); 5985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2); 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 6125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shl_i32(ret, arg1, t0); 6145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2); 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 6285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shr_i32(ret, arg1, t0); 6305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2); 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(ret, arg1); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 6445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_sar_i32(ret, arg1, t0); 6465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 650f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1, 651f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg2, int label_index) 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 65386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 65486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_br(label_index); 65586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond != TCG_COND_NEVER) { 65686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index); 65786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 660f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1, 661f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int32_t arg2, int label_index) 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 66386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 66486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_br(label_index); 66586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond != TCG_COND_NEVER) { 66686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 66786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_brcond_i32(cond, arg1, t0, label_index); 66886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 66986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 672f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret, 673b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i32 arg1, TCGv_i32 arg2) 674b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 67586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 67686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(ret, 1); 67786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond == TCG_COND_NEVER) { 67886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(ret, 0); 67986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 68086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond); 68186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 682b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 683b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 684f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret, 685f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i32 arg1, int32_t arg2) 686b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 68786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 68886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(ret, 1); 68986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond == TCG_COND_NEVER) { 69086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(ret, 0); 69186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 69286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 69386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_setcond_i32(cond, ret, arg1, t0); 69486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 69586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 696b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 697b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 6985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2); 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mul_i32(ret, arg1, t0); 7075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 710f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 711f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 71286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_div_i32) { 71386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2); 71486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i32) { 71586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 71686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(t0, arg1, 31); 71786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2); 71886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 71986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 72086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 72186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 32-bit and signed. */ 72286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 0, 1); 72386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 0, 1); 72486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 0, 1); 72586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper32(tcg_helper_div_i32, sizemask, ret, arg1, arg2); 72686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 727f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 728f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 729f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 730f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 73186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rem_i32) { 73286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2); 73386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div_i32) { 73486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 73586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_div_i32, t0, arg1, arg2); 73686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i32(t0, t0, arg2); 73786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i32(ret, arg1, t0); 73886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 73986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i32) { 74086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 74186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(t0, arg1, 31); 74286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2); 74386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 74486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 74586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 74686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 32-bit and signed. */ 74786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 0, 1); 74886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 0, 1); 74986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 0, 1); 75086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper32(tcg_helper_rem_i32, sizemask, ret, arg1, arg2); 75186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 752f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 753f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 754f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 755f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 75686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_div_i32) { 75786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2); 75886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i32) { 75986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 76086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(t0, 0); 76186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2); 76286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 76386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 76486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 76586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 32-bit and unsigned. */ 76686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 0, 0); 76786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 0, 0); 76886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 0, 0); 76986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper32(tcg_helper_divu_i32, sizemask, ret, arg1, arg2); 77086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 771f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 772f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 773f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 774f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 77586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rem_i32) { 77686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2); 77786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div_i32) { 77886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 77986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_divu_i32, t0, arg1, arg2); 78086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i32(t0, t0, arg2); 78186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i32(ret, arg1, t0); 78286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 78386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i32) { 78486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 78586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(t0, 0); 78686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2); 78786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 78886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 78986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 79086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 32-bit and unsigned. */ 79186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 0, 0); 79286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 0, 0); 79386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 0, 0); 79486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper32(tcg_helper_remu_i32, sizemask, ret, arg1, arg2); 79586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 796f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg) 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!TCGV_EQUAL_I64(ret, arg)) { 8035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_movi_i32(TCGV_LOW(ret), arg); 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32); 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, 8155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset); 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, 8225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset); 8255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31); 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, 8295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset); 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2, 8365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset); 8395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2, 8435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2, 8505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 8535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, 8575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* since arg2 and ret have different types, they cannot be the 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project same temporary */ 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TCG_TARGET_WORDS_BIGENDIAN 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset); 8635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4); 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 8655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4); 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2, 8715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset); 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2, 8775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset); 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2, 8835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset); 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, 8895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_target_long offset) 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TCG_TARGET_WORDS_BIGENDIAN 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset); 8935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4); 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 8955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset); 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4); 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), 9035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 9045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGV_HIGH(arg2)); 90586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace add2 with two moves. */ 90686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), 9125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 9135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGV_HIGH(arg2)); 91486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace sub2 with two moves. */ 91586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: use generic code when basic block handling is OK or CPU 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project specific code (x86) */ 9565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 958f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 959f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 960f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 961f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 962f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 963f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 964f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_shl_i64, sizemask, ret, arg1, arg2); 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 974f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 975f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 976f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 977f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 978f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 979f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 980f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_shr_i64, sizemask, ret, arg1, arg2); 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0); 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 990f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 991f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 992f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 993f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 994f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 995f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 996f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_sar_i64, sizemask, ret, arg1, arg2); 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1); 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1004f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, 1005f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg2, int label_index) 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 100786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 100886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_br(label_index); 100986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond != TCG_COND_NEVER) { 101086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6ii_i32(INDEX_op_brcond2_i32, 101186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 101286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_HIGH(arg2), cond, label_index); 101386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1016f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret, 1017b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i64 arg1, TCGv_i64 arg2) 1018b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 101986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 102086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(TCGV_LOW(ret), 1); 102186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond == TCG_COND_NEVER) { 102286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(TCGV_LOW(ret), 0); 102386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 102486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret), 102586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg1), TCGV_HIGH(arg1), 102686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg2), TCGV_HIGH(arg2), cond); 102786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1028b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 1029b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 1030b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 10315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0; 10345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t1; 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t0 = tcg_temp_new_i64(); 10375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t1 = tcg_temp_new_i32(); 10385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 103986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_mulu2_i32) { 104086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0), 104186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg1), TCGV_LOW(arg2)); 104286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace mulu2 with two moves. */ 104386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 104486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 104586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(TCG_TARGET_HAS_muluh_i32); 104686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_mul_i32, TCGV_LOW(t0), 104786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg1), TCGV_LOW(arg2)); 104886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_muluh_i32, TCGV_HIGH(t0), 104986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg1), TCGV_LOW(arg2)); 105086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 10515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2)); 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1); 10545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2)); 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1); 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, t0); 10585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 10595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t1); 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1064f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 1065f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 1066f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 1067f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 1068f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 1069f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1070f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2); 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1075f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 1076f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 1077f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 1078f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 1079f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 1080f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1081f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2); 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1086f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 1087f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and unsigned. */ 1088f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 0); 1089f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 0); 1090f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 0); 1091f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1092f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2); 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1097f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int sizemask = 0; 1098f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner /* Return value and both arguments are 64-bit and unsigned. */ 1099f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 0); 1100f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 0); 1101f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 0); 1102f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1103f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2); 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg) 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!TCGV_EQUAL_I64(ret, arg)) 11115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg); 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg); 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 111986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset); 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 112586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset); 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 113186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset); 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 113786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2, 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset); 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 114386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2, 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset); 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 114986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2, 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset); 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 115586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset) 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset); 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 116086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2, 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset); 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 116686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2, 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset); 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 117286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2, 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_target_long offset) 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset); 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 117886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset) 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset); 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2); 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2); 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I64(arg1, arg2)) { 11965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 11975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 11985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2); 11995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 120286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, uint64_t arg2) 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 120486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0; 120586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 120686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner switch (arg2) { 120786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0: 120886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(ret, 0); 120986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 121086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffffffffffffffffull: 121186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 121286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 121386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffull: 121486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Don't recurse with tcg_gen_ext8u_i32. */ 121586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8u_i64) { 121686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg1); 121786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 121886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 121986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner break; 122086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffffu: 122186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16u_i64) { 122286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg1); 122386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 122486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 122586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner break; 122686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner case 0xffffffffull: 122786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext32u_i64) { 122886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg1); 122986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 123086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 123186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner break; 123286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 123386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_const_i64(arg2); 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_and_i64(ret, arg1, t0); 12355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I64(arg1, arg2)) { 12415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 12425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2); 12445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 124986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 125086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (arg2 == -1) { 125186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(ret, -1); 125286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (arg2 == 0) { 125386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 125486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 125586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 125686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, arg1, t0); 125786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 125886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (TCGV_EQUAL_I64(arg1, arg2)) { 12645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_movi_i64(ret, 0); 12655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2); 12675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 127286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Some cases can be optimized here. */ 127386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (arg2 == 0) { 127486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 127586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (arg2 == -1 && TCG_TARGET_HAS_not_i64) { 127686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Don't recurse with tcg_gen_not_i64. */ 127786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg1); 127886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 127986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 128086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_xor_i64(ret, arg1, t0); 128186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 128286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2); 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i64(ret, arg1); 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 12955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shl_i64(ret, arg1, t0); 12975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2); 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i64(ret, arg1); 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_shr_i64(ret, arg1, t0); 13135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2); 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg2 == 0) { 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i64(ret, arg1); 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_sar_i64(ret, arg1, t0); 13295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1333f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, 1334f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg2, int label_index) 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 133686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 133786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_br(label_index); 133886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond != TCG_COND_NEVER) { 133986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index); 134086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1343f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret, 1344b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i64 arg1, TCGv_i64 arg2) 1345b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 134686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 134786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(ret, 1); 134886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond == TCG_COND_NEVER) { 134986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(ret, 0); 135086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 135186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond); 135286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1353b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 1354b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 13555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2); 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1360f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1361f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 136286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_div_i64) { 136386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2); 136486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i64) { 136586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 136686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(t0, arg1, 63); 136786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2); 136886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 136986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 137086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 137186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 137286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 137386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 137486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 137586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2); 137686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1377f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 1378f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1379f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1380f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 138186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rem_i64) { 138286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2); 138386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div_i64) { 138486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 138586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_div_i64, t0, arg1, arg2); 138686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, t0, arg2); 138786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(ret, arg1, t0); 138886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 138986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i64) { 139086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 139186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(t0, arg1, 63); 139286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2); 139386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 139486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 139586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 139686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 139786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 139886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 139986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 140086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2); 140186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1402f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 1403f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1404f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1405f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 140686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_div_i64) { 140786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2); 140886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i64) { 140986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 141086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(t0, 0); 141186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2); 141286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 141386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 141486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 141586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and unsigned. */ 141686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 0); 141786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 0); 141886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 0); 141986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2); 142086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1421f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 1422f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 1423f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1424f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 142586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rem_i64) { 142686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2); 142786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div_i64) { 142886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 142986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_divu_i64, t0, arg1, arg2); 143086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, t0, arg2); 143186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(ret, arg1, t0); 143286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 143386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_div2_i64) { 143486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 143586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i64(t0, 0); 143686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2); 143786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 143886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 143986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 144086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and unsigned. */ 144186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 0); 144286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 0); 144386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 0); 144486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2); 144586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 1446f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 144786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif /* TCG_TARGET_REG_BITS == 32 */ 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 14505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 14515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 14525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 14535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 14545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 14555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 14565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_add_i64(ret, arg1, t0); 14575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 14585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 14595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 14605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2) 14625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 14635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg1); 14645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sub_i64(ret, t0, arg2); 14655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 14665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 14675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 14695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 14705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 14715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 14725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 14735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 14745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 14755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sub_i64(ret, arg1, t0); 14765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 14775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 14785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1479f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1, 1480f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner int64_t arg2, int label_index) 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 148286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (cond == TCG_COND_ALWAYS) { 148386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_br(label_index); 148486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (cond != TCG_COND_NEVER) { 148586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 148686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_brcond_i64(cond, arg1, t0, label_index); 148786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 148886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1491f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret, 1492f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner TCGv_i64 arg1, int64_t arg2) 1493b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner{ 1494b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 1495b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_setcond_i64(cond, ret, arg1, t0); 1496b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_temp_free_i64(t0); 1497b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner} 1498b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner 14995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 15005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 15015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 15025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mul_i64(ret, arg1, t0); 15035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 15045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 15055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 15065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***************************************/ 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* optional operations */ 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg) 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 151286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8s_i32) { 151386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg); 151486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 151586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(ret, arg, 24); 151686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(ret, ret, 24); 151786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg) 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 152286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16s_i32) { 152386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg); 152486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 152586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(ret, arg, 16); 152686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(ret, ret, 16); 152786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg) 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 153286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8u_i32) { 153386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg); 153486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 153586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(ret, arg, 0xffu); 153686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg) 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 154186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16u_i32) { 154286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg); 154386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 154486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(ret, arg, 0xffffu); 154586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Note: we assume the two high bytes are set to zero */ 15495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg) 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 155186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_bswap16_i32) { 155286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg); 155386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 155486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 155586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 155686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext8u_i32(t0, arg); 155786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(t0, t0, 8); 155886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i32(ret, arg, 8); 155986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, ret, t0); 156086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 156186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg) 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 156686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_bswap32_i32) { 156786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg); 156886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 156986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0, t1; 157086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i32(); 157186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i32(); 157286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 157386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(t0, arg, 24); 157486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 157586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(t1, arg, 0x0000ff00); 157686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(t1, t1, 8); 157786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(t0, t0, t1); 157886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 157986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i32(t1, arg, 8); 158086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(t1, t1, 0x0000ff00); 158186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(t0, t0, t1); 158286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 158386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i32(t1, arg, 24); 158486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, t0, t1); 158586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 158686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 158786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32 15915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg) 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 15945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg) 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg) 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg) 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg) 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg) 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg) 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, TCGV_LOW(arg)); 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), arg); 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 16395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 16405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), arg); 16415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 16425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 16445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Note: we assume the six high bytes are set to zero */ 16455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) 16465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 16475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 16485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 16515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Note: we assume the four high bytes are set to zero */ 16525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 16555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0, t1; 16615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t0 = tcg_temp_new_i32(); 16625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t1 = tcg_temp_new_i32(); 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_bswap32_i32(t0, TCGV_LOW(arg)); 16655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg)); 16665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), t1); 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_mov_i32(TCGV_HIGH(ret), t0); 16685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 16695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t1); 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg) 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 167586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8s_i64) { 167686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg); 167786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 167886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(ret, arg, 56); 167986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(ret, ret, 56); 168086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg) 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 168586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16s_i64) { 168686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg); 168786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 168886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(ret, arg, 48); 168986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(ret, ret, 48); 169086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg) 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 169586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext32s_i64) { 169686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg); 169786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 169886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(ret, arg, 32); 169986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(ret, ret, 32); 170086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg) 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 170586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext8u_i64) { 170686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg); 170786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 170886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(ret, arg, 0xffu); 170986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg) 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 171486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext16u_i64) { 171586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg); 171686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 171786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(ret, arg, 0xffffu); 171886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg) 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 172386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_ext32u_i64) { 172486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg); 172586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 172686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(ret, arg, 0xffffffffu); 172786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Note: we assume the target supports move between 32 and 64 bit 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project registers. This will probably break MIPS64 targets. */ 17325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg) 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg))); 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Note: we assume the target supports move between 32 and 64 bit 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project registers */ 17395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1741b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Note: we assume the target supports move between 32 and 64 bit 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project registers */ 17465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); 17495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 17505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Note: we assume the six high bytes are set to zero */ 17525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) 17535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 175486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_bswap16_i64) { 175586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg); 175686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 175786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 17585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 175986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext8u_i64(t0, arg); 176086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t0, t0, 8); 176186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(ret, arg, 8); 176286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, ret, t0); 176386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 176486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Note: we assume the four high bytes are set to zero */ 17685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) 17698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 177086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_bswap32_i64) { 177186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg); 177286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 177386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0, t1; 177486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i64(); 177586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i64(); 17765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 177786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t0, arg, 24); 177886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext32u_i64(t0, t0); 17795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 178086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, arg, 0x0000ff00); 178186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, t1, 8); 178286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 17835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 178486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 8); 178586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, t1, 0x0000ff00); 178686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 17875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 178886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 24); 178986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, t0, t1); 179086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 179186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 179286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 17935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 17945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) 17965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 179786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_bswap64_i64) { 179886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg); 179986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 180086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 180186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 180286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 180386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t0, arg, 56); 180486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 180586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, arg, 0x0000ff00); 180686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, t1, 40); 180786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 180886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 180986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, arg, 0x00ff0000); 181086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, t1, 24); 181186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 181286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 181386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, arg, 0xff000000); 181486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, t1, 8); 181586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 181686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 181786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 8); 181886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, t1, 0xff000000); 181986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 182086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 182186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 24); 182286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, t1, 0x00ff0000); 182386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 182486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 182586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 40); 182686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, t1, 0x0000ff00); 182786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(t0, t0, t1); 182886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 182986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t1, arg, 56); 183086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, t0, t1); 183186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 183286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 183386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg) 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 184086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_neg_i32) { 184186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg); 184286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 184386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(0); 184486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i32(ret, t0, arg); 184586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 184686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 18478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg) 18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 185186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_neg_i64) { 185286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg); 185386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 185486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(0); 185586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(ret, t0, arg); 185686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 185786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 18588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg) 18618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 186286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_not_i32) { 186386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg); 186486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 186586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_xori_i32(ret, arg, -1); 186686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg) 18708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 187186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 187286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_not_i64) { 187386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg); 187486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 187586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_xori_i64(ret, arg, -1); 187686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 187786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 1878f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_not_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1879f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_not_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 18805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_discard_i32(TCGv_i32 arg) 18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op1_i32(INDEX_op_discard, arg); 18868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_discard_i64(TCGv_i64 arg) 18898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 189086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 18915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_discard_i32(TCGV_LOW(arg)); 18928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tcg_gen_discard_i32(TCGV_HIGH(arg)); 18938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 18945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_op1_i64(INDEX_op_discard, arg); 18955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 18965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 18975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 18985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 18995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 190086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_andc_i32) { 190186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2); 190286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 190386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 190486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i32(t0, arg2); 190586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(ret, arg1, t0); 190686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 190786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 19085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 19115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 191286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 191386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_andc_i64) { 191486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2); 191586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 191686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 191786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i64(t0, arg2); 191886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i64(ret, arg1, t0); 191986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 192086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 192186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 1922b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1923b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1924b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#endif 19255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 19285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 192986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_eqv_i32) { 193086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_eqv_i32, ret, arg1, arg2); 193186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 193286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_xor_i32(ret, arg1, arg2); 193386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i32(ret, ret); 193486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 19355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 19385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 193986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 194086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_eqv_i64) { 194186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_eqv_i64, ret, arg1, arg2); 194286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 194386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_xor_i64(ret, arg1, arg2); 194486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i64(ret, ret); 194586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 194686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 1947f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_eqv_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1948f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_eqv_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1949f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif 19505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 19535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 195486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_nand_i32) { 195586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_nand_i32, ret, arg1, arg2); 195686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 195786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(ret, arg1, arg2); 195886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i32(ret, ret); 195986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 19605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 19635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 196486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 196586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_nand_i64) { 196686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_nand_i64, ret, arg1, arg2); 196786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 196886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i64(ret, arg1, arg2); 196986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i64(ret, ret); 197086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 197186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 1972f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_nand_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1973f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_nand_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1974f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif 19755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 19785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 197986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_nor_i32) { 198086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_nor_i32, ret, arg1, arg2); 198186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 198286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, arg1, arg2); 198386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i32(ret, ret); 198486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 19855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 19885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 198986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 199086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_nor_i64) { 199186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_nor_i64, ret, arg1, arg2); 199286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 199386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, arg1, arg2); 199486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i64(ret, ret); 199586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 199686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 1997f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_nor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1998f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner tcg_gen_nor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1999f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#endif 20005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 20035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 200486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_orc_i32) { 200586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2); 200686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 200786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 200886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i32(t0, arg2); 200986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, arg1, t0); 201086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 201186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 20125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 20155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 201686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 64 201786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_orc_i64) { 201886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2); 201986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 202086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 202186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_not_i64(t0, arg2); 202286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, arg1, t0); 202386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 202486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 202586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 2026b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 2027b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 2028b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#endif 20295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 20325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 203386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rot_i32) { 203486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2); 203586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 203686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0, t1; 20375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 203886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i32(); 203986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i32(); 204086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shl_i32(t0, arg1, arg2); 204186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_subfi_i32(t1, 32, arg2); 204286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shr_i32(t1, arg1, t1); 204386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, t0, t1); 204486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 204586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 204686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 20475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 20508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 205186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rot_i64) { 205286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2); 205386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 205486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0, t1; 205586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i64(); 205686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i64(); 205786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shl_i64(t0, arg1, arg2); 205886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_subfi_i64(t1, 64, arg2); 205986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shr_i64(t1, arg1, t1); 206086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, t0, t1); 206186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 206286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 206386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 20648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 20655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 20675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 20685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 20695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 20705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, arg1); 207186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_rot_i32) { 20725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0 = tcg_const_i32(arg2); 20735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_rotl_i32(ret, arg1, t0); 20745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 207586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 20765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i32 t0, t1; 20775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t0 = tcg_temp_new_i32(); 20785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t1 = tcg_temp_new_i32(); 20795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_shli_i32(t0, arg1, arg2); 20805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_shri_i32(t1, arg1, 32 - arg2); 20815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_or_i32(ret, t0, t1); 20825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t0); 20835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i32(t1); 20845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 20885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 20895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 20905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 20915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 209286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_rot_i64) { 20935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0 = tcg_const_i64(arg2); 20945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_rotl_i64(ret, arg1, t0); 20955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 209686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 20975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner TCGv_i64 t0, t1; 20985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t0 = tcg_temp_new_i64(); 20995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner t1 = tcg_temp_new_i64(); 21005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_shli_i64(t0, arg1, arg2); 21015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_shri_i64(t1, arg1, 64 - arg2); 21025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_or_i64(ret, t0, t1); 21035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t0); 21045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_temp_free_i64(t1); 21055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 21065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 21075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 21095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 211086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rot_i32) { 211186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2); 211286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 211386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0, t1; 21145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 211586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i32(); 211686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i32(); 211786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shr_i32(t0, arg1, arg2); 211886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_subfi_i32(t1, 32, arg2); 211986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shl_i32(t1, arg1, t1); 212086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, t0, t1); 212186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 212286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 212386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 21245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 21255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 21275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 212886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_rot_i64) { 212986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2); 213086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 213186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0, t1; 213286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t0 = tcg_temp_new_i64(); 213386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i64(); 213486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shr_i64(t0, arg1, arg2); 213586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_subfi_i64(t1, 64, arg2); 213686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shl_i64(t1, arg1, t1); 213786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, t0, t1); 213886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 213986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 214086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 21415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 21425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 21445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 21455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 21465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 21475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i32(ret, arg1); 21485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 21495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_rotli_i32(ret, arg1, 32 - arg2); 21505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 21515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 21525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 21545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 21555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* some cases can be optimized here */ 21565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (arg2 == 0) { 21575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_mov_i64(ret, arg1); 21585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 21595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_gen_rotli_i64(ret, arg1, 64 - arg2); 21605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 21615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 21628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2163f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, 216486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 arg2, unsigned int ofs, 216586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner unsigned int len) 2166f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 216786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner uint32_t mask; 216886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t1; 2169f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 217086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(ofs < 32); 217186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(len <= 32); 217286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(ofs + len <= 32); 2173f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 217486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs == 0 && len == 32) { 217586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(ret, arg2); 217686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 217786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 217886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_deposit_i32 && TCG_TARGET_deposit_i32_valid(ofs, len)) { 217986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len); 218086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 218186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 218286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 218386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner mask = (1u << len) - 1; 218486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i32(); 218586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 218686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs + len < 32) { 218786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(t1, arg2, mask); 218886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(t1, t1, ofs); 218986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 219086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i32(t1, arg2, ofs); 219186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 219286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i32(ret, arg1, ~(mask << ofs)); 219386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, ret, t1); 219486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 219586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 2196f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner} 2197f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 2198f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turnerstatic inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, 219986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 arg2, unsigned int ofs, 220086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner unsigned int len) 2201f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner{ 220286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner uint64_t mask; 220386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1; 2204f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 220586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(ofs < 64); 220686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(len <= 64); 220786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(ofs + len <= 64); 2208f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 220986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs == 0 && len == 64) { 221086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(ret, arg2); 221186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 221286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 221386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(ofs, len)) { 221486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len); 221586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 221686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 2217f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner 221886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 221986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs >= 32) { 222086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_deposit_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), 222186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg2), ofs - 32, len); 222286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1)); 222386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 222486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 222586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs + len <= 32) { 222686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_deposit_i32(TCGV_LOW(ret), TCGV_LOW(arg1), 222786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(arg2), ofs, len); 222886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1)); 222986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner return; 223086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 22328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 223386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner mask = (1ull << len) - 1; 223486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner t1 = tcg_temp_new_i64(); 223586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 223686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (ofs + len < 64) { 223786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(t1, arg2, mask); 223886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, t1, ofs); 223986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 224086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(t1, arg2, ofs); 224186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 224286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andi_i64(ret, arg1, ~(mask << ofs)); 224386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, ret, t1); 224486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 224586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 224686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 224786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 224886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, 224986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 high) 225086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 225186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 225286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(TCGV_LOW(dest), low); 225386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(TCGV_HIGH(dest), high); 22545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 225586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 tmp = tcg_temp_new_i64(); 225686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* These extensions are only needed for type correctness. 225786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner We may be able to do better given target specific information. */ 225886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extu_i32_i64(tmp, high); 225986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extu_i32_i64(dest, low); 226086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* If deposit is available, use it. Otherwise use the extra 226186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner knowledge that we have of the zero-extensions above. */ 226286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(32, 32)) { 226386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_deposit_i64(dest, dest, tmp, 32, 32); 226486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 226586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shli_i64(tmp, tmp, 32); 226686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(dest, dest, tmp); 226786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 226886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(tmp); 22695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 227086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 22715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 227286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, 227386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 high) 22748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 227586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_deposit_i64(dest, low, high, 32, 32); 227686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 227786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 227886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_extr_i64_i32(TCGv_i32 lo, TCGv_i32 hi, TCGv_i64 arg) 227986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 228086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 228186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(lo, TCGV_LOW(arg)); 228286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(hi, TCGV_HIGH(arg)); 22838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 228486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 228586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_trunc_i64_i32(lo, arg); 228686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(t0, arg, 32); 228786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_trunc_i64_i32(hi, t0); 228886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 22898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 22908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 229286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg) 22938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 229486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext32u_i64(lo, arg); 229586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_shri_i64(hi, arg, 32); 22968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 22978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 229886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_movcond_i32(TCGCond cond, TCGv_i32 ret, 229986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 c1, TCGv_i32 c2, 230086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 v1, TCGv_i32 v2) 23018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 230286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_movcond_i32) { 230386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6i_i32(INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond); 230486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 230586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 230686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t1 = tcg_temp_new_i32(); 230786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_setcond_i32(cond, t0, c1, c2); 230886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_neg_i32(t0, t0); 230986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(t1, v1, t0); 231086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andc_i32(ret, v2, t0); 231186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(ret, ret, t1); 231286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 231386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 231486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 23158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 231786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_movcond_i64(TCGCond cond, TCGv_i64 ret, 231886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 c1, TCGv_i64 c2, 231986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 v1, TCGv_i64 v2) 23208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 232186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TCG_TARGET_REG_BITS == 32 232286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 232386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t1 = tcg_temp_new_i32(); 232486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6i_i32(INDEX_op_setcond2_i32, t0, 232586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(c1), TCGV_HIGH(c1), 232686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(c2), TCGV_HIGH(c2), cond); 232786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 232886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_movcond_i32) { 232986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movi_i32(t1, 0); 233086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movcond_i32(TCG_COND_NE, TCGV_LOW(ret), t0, t1, 233186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_LOW(v1), TCGV_LOW(v2)); 233286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_movcond_i32(TCG_COND_NE, TCGV_HIGH(ret), t0, t1, 233386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGV_HIGH(v1), TCGV_HIGH(v2)); 233486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 233586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_neg_i32(t0, t0); 233686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 233786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(t1, TCGV_LOW(v1), t0); 233886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(v2), t0); 233986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(ret), t1); 234086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 234186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(t1, TCGV_HIGH(v1), t0); 234286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(v2), t0); 234386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), t1); 234486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 234586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 234686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 23478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 234886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_movcond_i64) { 234986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6i_i64(INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond); 235086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 235186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 235286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 235386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_setcond_i64(cond, t0, c1, c2); 235486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_neg_i64(t0, t0); 235586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i64(t1, v1, t0); 235686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_andc_i64(ret, v2, t0); 235786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_or_i64(ret, ret, t1); 235886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 235986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 236086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 236486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_add2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al, 236586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh) 23668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 236786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_add2_i32) { 236886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6_i32(INDEX_op_add2_i32, rl, rh, al, ah, bl, bh); 236986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace add2 with two moves. */ 237086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 237186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 237286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 237386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 237486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_concat_i32_i64(t0, al, ah); 237586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_concat_i32_i64(t1, bl, bh); 237686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i64(t0, t0, t1); 237786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extr_i64_i32(rl, rh, t0); 237886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 237986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 238086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 23818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 23828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 238386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_sub2_i32(TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al, 238486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh) 23858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 238686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_sub2_i32) { 238786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6_i32(INDEX_op_sub2_i32, rl, rh, al, ah, bl, bh); 238886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace sub2 with two moves. */ 238986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 239086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 239186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 239286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 239386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_concat_i32_i64(t0, al, ah); 239486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_concat_i32_i64(t1, bl, bh); 239586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(t0, t0, t1); 239686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extr_i64_i32(rl, rh, t0); 239786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 239886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 239986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 24008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 24018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 240286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_mulu2_i32(TCGv_i32 rl, TCGv_i32 rh, 240386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 arg1, TCGv_i32 arg2) 24048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 240586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_mulu2_i32) { 240686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i32(INDEX_op_mulu2_i32, rl, rh, arg1, arg2); 240786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace mulu2 with two moves. */ 240886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 240986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_muluh_i32) { 241086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t = tcg_temp_new_i32(); 241186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_mul_i32, t, arg1, arg2); 241286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_muluh_i32, rh, arg1, arg2); 241386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(rl, t); 241486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t); 241586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 241686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 241786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 241886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extu_i32_i64(t0, arg1); 241986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extu_i32_i64(t1, arg2); 242086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, t0, t1); 242186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extr_i64_i32(rl, rh, t0); 242286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 242386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 242486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 24258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 24268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 242786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_muls2_i32(TCGv_i32 rl, TCGv_i32 rh, 242886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 arg1, TCGv_i32 arg2) 242986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 243086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_muls2_i32) { 243186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i32(INDEX_op_muls2_i32, rl, rh, arg1, arg2); 243286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace muls2 with two moves. */ 243386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 243486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_mulsh_i32) { 243586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t = tcg_temp_new_i32(); 243686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_mul_i32, t, arg1, arg2); 243786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i32(INDEX_op_mulsh_i32, rh, arg1, arg2); 243886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(rl, t); 243986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t); 244086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_REG_BITS == 32 && TCG_TARGET_HAS_mulu2_i32) { 244186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t0 = tcg_temp_new_i32(); 244286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t1 = tcg_temp_new_i32(); 244386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t2 = tcg_temp_new_i32(); 244486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i32 t3 = tcg_temp_new_i32(); 244586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i32(INDEX_op_mulu2_i32, t0, t1, arg1, arg2); 244686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace mulu2 with two moves. */ 244786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 244886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Adjust for negative inputs. */ 244986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(t2, arg1, 31); 245086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i32(t3, arg2, 31); 245186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(t2, t2, arg2); 245286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i32(t3, t3, arg1); 245386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i32(rh, t1, t2); 245486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i32(rh, rh, t3); 245586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(rl, t0); 245686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t0); 245786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t1); 245886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t2); 245986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i32(t3); 246086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 246186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 246286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 246386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext_i32_i64(t0, arg1); 246486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext_i32_i64(t1, arg2); 246586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, t0, t1); 246686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_extr_i64_i32(rl, rh, t0); 246786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 246886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 246986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 24708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 24718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 247286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_add2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al, 247386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh) 24748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 247586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_add2_i64) { 247686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6_i64(INDEX_op_add2_i64, rl, rh, al, ah, bl, bh); 247786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace add2 with two moves. */ 247886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 247986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 248086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 248186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 248286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i64(t0, al, bl); 248386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_setcond_i64(TCG_COND_LTU, t1, t0, al); 248486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i64(rh, ah, bh); 248586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i64(rh, rh, t1); 248686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t0); 248786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 248886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 248986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 24908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 24918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 249286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_sub2_i64(TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al, 249386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh) 24948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 249586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_sub2_i64) { 249686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op6_i64(INDEX_op_sub2_i64, rl, rh, al, ah, bl, bh); 249786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace sub2 with two moves. */ 249886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 249986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 250086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 250186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 250286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(t0, al, bl); 250386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_setcond_i64(TCG_COND_LTU, t1, al, bl); 250486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(rh, ah, bh); 250586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(rh, rh, t1); 250686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t0); 250786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 250886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 250986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 25108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 25118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 251286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_mulu2_i64(TCGv_i64 rl, TCGv_i64 rh, 251386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 arg1, TCGv_i64 arg2) 251486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner{ 251586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_mulu2_i64) { 251686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i64(INDEX_op_mulu2_i64, rl, rh, arg1, arg2); 251786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace mulu2 with two moves. */ 251886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 251986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_muluh_i64) { 252086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t = tcg_temp_new_i64(); 252186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_mul_i64, t, arg1, arg2); 252286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_muluh_i64, rh, arg1, arg2); 252386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t); 252486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t); 252586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_mulu2_i64) { 252686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 252786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t1 = tcg_temp_new_i64(); 252886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t2 = tcg_temp_new_i64(); 252986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t3 = tcg_temp_new_i64(); 253086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i64(INDEX_op_mulu2_i64, t0, t1, arg1, arg2); 253186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace mulu2 with two moves. */ 253286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 253386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Adjust for negative inputs. */ 253486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(t2, arg1, 63); 253586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sari_i64(t3, arg2, 63); 253686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i64(t2, t2, arg2); 253786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_and_i64(t3, t3, arg1); 253886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(rh, t1, t2); 253986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_sub_i64(rh, rh, t3); 254086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t0); 254186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 254286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t1); 254386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t2); 254486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t3); 254586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 254686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 254786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 254886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and unsigned. */ 254986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 0); 255086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 0); 255186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 0); 255286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, arg1, arg2); 255386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_muluh_i64, sizemask, rh, arg1, arg2); 255486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t0); 255586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 255686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 255786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 255886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 255986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_muls2_i64(TCGv_i64 rl, TCGv_i64 rh, 256086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 arg1, TCGv_i64 arg2) 25618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 256286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner if (TCG_TARGET_HAS_muls2_i64) { 256386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op4_i64(INDEX_op_muls2_i64, rl, rh, arg1, arg2); 256486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Allow the optimizer room to replace muls2 with two moves. */ 256586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op0(INDEX_op_nop); 256686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else if (TCG_TARGET_HAS_mulsh_i64) { 256786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t = tcg_temp_new_i64(); 256886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_mul_i64, t, arg1, arg2); 256986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op3_i64(INDEX_op_mulsh_i64, rh, arg1, arg2); 257086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t); 257186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t); 257286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } else { 257386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner TCGv_i64 t0 = tcg_temp_new_i64(); 257486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner int sizemask = 0; 257586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Return value and both arguments are 64-bit and signed. */ 257686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(0, 1, 1); 257786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(1, 1, 1); 257886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner sizemask |= tcg_gen_sizemask(2, 1, 1); 257986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mul_i64(t0, arg1, arg2); 258086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_helper64(tcg_helper_mulsh_i64, sizemask, rh, arg1, arg2); 258186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i64(rl, t0); 258286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_temp_free_i64(t0); 258386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner } 258486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner} 258586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 258686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/***************************************/ 258786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* QEMU specific operations. Their type depend on the QEMU CPU 258886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner type. */ 258986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifndef TARGET_LONG_BITS 259086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#error must include QEMU headers 259186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif 259286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner 25938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_LONG_BITS == 32 259486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGv TCGv_i32 259586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_new() tcg_temp_new_i32() 259686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_global_reg_new tcg_global_reg_new_i32 259786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_global_mem_new tcg_global_mem_new_i32 259886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_local_new() tcg_temp_local_new_i32() 259986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_free tcg_temp_free_i32 260086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_UNUSED(x) TCGV_UNUSED_I32(x) 260186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I32(x) 260286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b) 260386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_add_param_tl tcg_add_param_i32 260486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i32 260586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i32 26068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 260786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGv TCGv_i64 260886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_new() tcg_temp_new_i64() 260986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_global_reg_new tcg_global_reg_new_i64 261086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_global_mem_new tcg_global_mem_new_i64 261186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_local_new() tcg_temp_local_new_i64() 261286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_temp_free tcg_temp_free_i64 261386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_UNUSED(x) TCGV_UNUSED_I64(x) 261486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I64(x) 261586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b) 261686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_add_param_tl tcg_add_param_i64 261786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i64 261886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i64 26198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 26208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 262186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner/* debug info: write the PC of the corresponding QEMU CPU instruction */ 262286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_debug_insn_start(uint64_t pc) 26238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 262486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* XXX: must really use a 32 bit size for TCGArg in all cases */ 262586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS 262686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op2ii(INDEX_op_debug_insn_start, 262786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner (uint32_t)(pc), (uint32_t)(pc >> 32)); 26288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 262986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op1i(INDEX_op_debug_insn_start, pc); 26308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 26318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 263386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_exit_tb(uintptr_t val) 26348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 263586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op1i(INDEX_op_exit_tb, val); 26368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 263886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnerstatic inline void tcg_gen_goto_tb(unsigned idx) 26398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 264086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* We only support two chained exits. */ 264186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert(idx <= 1); 264286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#ifdef CONFIG_DEBUG_TCG 264386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner /* Verify that we havn't seen this numbered exit before. */ 264486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_debug_assert((tcg_ctx.goto_tb_issue_mask & (1 << idx)) == 0); 264586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_ctx.goto_tb_issue_mask |= 1 << idx; 26468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 264786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_op1i(INDEX_op_goto_tb, idx); 26488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 265186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_gen_qemu_ld_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp); 265286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_gen_qemu_st_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp); 265386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_gen_qemu_ld_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp); 265486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turnervoid tcg_gen_qemu_st_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp); 26558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index) 26578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 265886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_UB); 26598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index) 26628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 266386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_SB); 26648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index) 26678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 266886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TEUW); 26698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index) 26728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 267386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TESW); 26748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index) 26778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 267886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TEUL); 26798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index) 26828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 268386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_TESL); 26848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index) 26878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 268886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_ld_i64(ret, addr, mem_index, MO_TEQ); 26898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index) 26928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 269386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_UB); 26948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 26958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 26968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index) 26978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 269886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_TEUW); 26998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 27008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index) 27028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 270386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_st_tl(arg, addr, mem_index, MO_TEUL); 27048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 27058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index) 27078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 270886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_qemu_st_i64(arg, addr, mem_index, MO_TEQ); 27098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 27108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_LONG_BITS == 64 27128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_movi_tl tcg_gen_movi_i64 27138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_mov_tl tcg_gen_mov_i64 27148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld8u_tl tcg_gen_ld8u_i64 27158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld8s_tl tcg_gen_ld8s_i64 27168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld16u_tl tcg_gen_ld16u_i64 27178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld16s_tl tcg_gen_ld16s_i64 27188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld32u_tl tcg_gen_ld32u_i64 27198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld32s_tl tcg_gen_ld32s_i64 27208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld_tl tcg_gen_ld_i64 27218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st8_tl tcg_gen_st8_i64 27228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st16_tl tcg_gen_st16_i64 27238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st32_tl tcg_gen_st32_i64 27248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st_tl tcg_gen_st_i64 27258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_add_tl tcg_gen_add_i64 27268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_addi_tl tcg_gen_addi_i64 27278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sub_tl tcg_gen_sub_i64 27288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_neg_tl tcg_gen_neg_i64 27295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_subfi_tl tcg_gen_subfi_i64 27308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_subi_tl tcg_gen_subi_i64 27318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_and_tl tcg_gen_and_i64 27328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_andi_tl tcg_gen_andi_i64 27338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_or_tl tcg_gen_or_i64 27348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ori_tl tcg_gen_ori_i64 27358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_xor_tl tcg_gen_xor_i64 27368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_xori_tl tcg_gen_xori_i64 27378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_not_tl tcg_gen_not_i64 27388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shl_tl tcg_gen_shl_i64 27398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shli_tl tcg_gen_shli_i64 27408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shr_tl tcg_gen_shr_i64 27418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shri_tl tcg_gen_shri_i64 27428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sar_tl tcg_gen_sar_i64 27438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sari_tl tcg_gen_sari_i64 27448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_brcond_tl tcg_gen_brcond_i64 27458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_brcondi_tl tcg_gen_brcondi_i64 2746b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_gen_setcond_tl tcg_gen_setcond_i64 2747b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_gen_setcondi_tl tcg_gen_setcondi_i64 27488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_mul_tl tcg_gen_mul_i64 27498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_muli_tl tcg_gen_muli_i64 27505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_div_tl tcg_gen_div_i64 27515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rem_tl tcg_gen_rem_i64 27525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_divu_tl tcg_gen_divu_i64 27535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_remu_tl tcg_gen_remu_i64 27548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_discard_tl tcg_gen_discard_i64 27558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32 27568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_trunc_i64_tl tcg_gen_mov_i64 27578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64 27588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64 27598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_extu_tl_i64 tcg_gen_mov_i64 27608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext_tl_i64 tcg_gen_mov_i64 27618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext8u_tl tcg_gen_ext8u_i64 27628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext8s_tl tcg_gen_ext8s_i64 27638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext16u_tl tcg_gen_ext16u_i64 27648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext16s_tl tcg_gen_ext16s_i64 27658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext32u_tl tcg_gen_ext32u_i64 27668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext32s_tl tcg_gen_ext32s_i64 27675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_bswap16_tl tcg_gen_bswap16_i64 27685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_bswap32_tl tcg_gen_bswap32_i64 27695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_bswap64_tl tcg_gen_bswap64_i64 27705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64 277186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_extr_i64_tl tcg_gen_extr32_i64 27725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_andc_tl tcg_gen_andc_i64 27735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_eqv_tl tcg_gen_eqv_i64 27745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_nand_tl tcg_gen_nand_i64 27755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_nor_tl tcg_gen_nor_i64 27765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_orc_tl tcg_gen_orc_i64 27775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotl_tl tcg_gen_rotl_i64 27785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotli_tl tcg_gen_rotli_i64 27795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotr_tl tcg_gen_rotr_i64 27805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotri_tl tcg_gen_rotri_i64 2781f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define tcg_gen_deposit_tl tcg_gen_deposit_i64 27828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_const_tl tcg_const_i64 27835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_const_local_tl tcg_const_local_i64 278486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_movcond_tl tcg_gen_movcond_i64 278586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_add2_tl tcg_gen_add2_i64 278686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_sub2_tl tcg_gen_sub2_i64 278786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_mulu2_tl tcg_gen_mulu2_i64 278886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_muls2_tl tcg_gen_muls2_i64 27898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 27908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_movi_tl tcg_gen_movi_i32 27918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_mov_tl tcg_gen_mov_i32 27928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld8u_tl tcg_gen_ld8u_i32 27938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld8s_tl tcg_gen_ld8s_i32 27948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld16u_tl tcg_gen_ld16u_i32 27958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld16s_tl tcg_gen_ld16s_i32 27968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld32u_tl tcg_gen_ld_i32 27978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld32s_tl tcg_gen_ld_i32 27988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ld_tl tcg_gen_ld_i32 27998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st8_tl tcg_gen_st8_i32 28008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st16_tl tcg_gen_st16_i32 28018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st32_tl tcg_gen_st_i32 28028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_st_tl tcg_gen_st_i32 28038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_add_tl tcg_gen_add_i32 28048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_addi_tl tcg_gen_addi_i32 28058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sub_tl tcg_gen_sub_i32 28068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_neg_tl tcg_gen_neg_i32 28075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_subfi_tl tcg_gen_subfi_i32 28088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_subi_tl tcg_gen_subi_i32 28098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_and_tl tcg_gen_and_i32 28108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_andi_tl tcg_gen_andi_i32 28118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_or_tl tcg_gen_or_i32 28128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ori_tl tcg_gen_ori_i32 28138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_xor_tl tcg_gen_xor_i32 28148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_xori_tl tcg_gen_xori_i32 28158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_not_tl tcg_gen_not_i32 28168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shl_tl tcg_gen_shl_i32 28178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shli_tl tcg_gen_shli_i32 28188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shr_tl tcg_gen_shr_i32 28198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_shri_tl tcg_gen_shri_i32 28208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sar_tl tcg_gen_sar_i32 28218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_sari_tl tcg_gen_sari_i32 28228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_brcond_tl tcg_gen_brcond_i32 28238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_brcondi_tl tcg_gen_brcondi_i32 2824b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_gen_setcond_tl tcg_gen_setcond_i32 2825b9317727862dd690cc67bb51f71991c404f9e4f6David 'Digit' Turner#define tcg_gen_setcondi_tl tcg_gen_setcondi_i32 28268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_mul_tl tcg_gen_mul_i32 28278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_muli_tl tcg_gen_muli_i32 28285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_div_tl tcg_gen_div_i32 28295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rem_tl tcg_gen_rem_i32 28305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_divu_tl tcg_gen_divu_i32 28315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_remu_tl tcg_gen_remu_i32 28328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_discard_tl tcg_gen_discard_i32 28338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32 28348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32 28358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_extu_i32_tl tcg_gen_mov_i32 28368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext_i32_tl tcg_gen_mov_i32 28378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64 28388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64 28398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext8u_tl tcg_gen_ext8u_i32 28408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext8s_tl tcg_gen_ext8s_i32 28418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext16u_tl tcg_gen_ext16u_i32 28428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext16s_tl tcg_gen_ext16s_i32 28438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext32u_tl tcg_gen_mov_i32 28448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_gen_ext32s_tl tcg_gen_mov_i32 28455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_bswap16_tl tcg_gen_bswap16_i32 28465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_bswap32_tl tcg_gen_bswap32_i32 28475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64 284886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_extr_tl_i64 tcg_gen_extr_i32_i64 28495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_andc_tl tcg_gen_andc_i32 28505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_eqv_tl tcg_gen_eqv_i32 28515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_nand_tl tcg_gen_nand_i32 28525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_nor_tl tcg_gen_nor_i32 28535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_orc_tl tcg_gen_orc_i32 28545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotl_tl tcg_gen_rotl_i32 28555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotli_tl tcg_gen_rotli_i32 28565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotr_tl tcg_gen_rotr_i32 28575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_gen_rotri_tl tcg_gen_rotri_i32 2858f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define tcg_gen_deposit_tl tcg_gen_deposit_i32 28598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tcg_const_tl tcg_const_i32 28605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define tcg_const_local_tl tcg_const_local_i32 286186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_movcond_tl tcg_gen_movcond_i32 286286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_add2_tl tcg_gen_add2_i32 286386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_sub2_tl tcg_gen_sub2_i32 286486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_mulu2_tl tcg_gen_mulu2_i32 286586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#define tcg_gen_muls2_tl tcg_gen_muls2_i32 28668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TCG_TARGET_REG_BITS == 32 286986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_ld_ptr(R, A, O) \ 287086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ld_i32(TCGV_PTR_TO_NAT(R), (A), (O)) 287186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_discard_ptr(A) \ 287286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_discard_i32(TCGV_PTR_TO_NAT(A)) 287386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_add_ptr(R, A, B) \ 287486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i32(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B)) 287586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_addi_ptr(R, A, B) \ 287686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_addi_i32(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B)) 287786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_ext_i32_ptr(R, A) \ 287886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_mov_i32(TCGV_PTR_TO_NAT(R), (A)) 287986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#else 288086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_ld_ptr(R, A, O) \ 288186b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ld_i64(TCGV_PTR_TO_NAT(R), (A), (O)) 288286b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_discard_ptr(A) \ 288386b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_discard_i64(TCGV_PTR_TO_NAT(A)) 288486b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_add_ptr(R, A, B) \ 288586b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_add_i64(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B)) 288686b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_addi_ptr(R, A, B) \ 288786b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_addi_i64(TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B)) 288886b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner# define tcg_gen_ext_i32_ptr(R, A) \ 288986b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner tcg_gen_ext_i32_i64(TCGV_PTR_TO_NAT(R), (A)) 289086b1fb06ee6ef53d8961ce96343ba4aa37518840David 'Digit' Turner#endif /* TCG_TARGET_REG_BITS == 32 */ 2891