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