1 /* 2 * Tiny Code Generator for QEMU 3 * 4 * Copyright (c) 2008 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 #include "tcg.h" 25 26 int gen_new_label(void); 27 28 static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1) 29 { 30 *gen_opc_ptr++ = opc; 31 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 32 } 33 34 static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1) 35 { 36 *gen_opc_ptr++ = opc; 37 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 38 } 39 40 static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1) 41 { 42 *gen_opc_ptr++ = opc; 43 *gen_opparam_ptr++ = arg1; 44 } 45 46 static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2) 47 { 48 *gen_opc_ptr++ = opc; 49 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 50 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 51 } 52 53 static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2) 54 { 55 *gen_opc_ptr++ = opc; 56 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 57 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 58 } 59 60 static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2) 61 { 62 *gen_opc_ptr++ = opc; 63 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 64 *gen_opparam_ptr++ = arg2; 65 } 66 67 static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2) 68 { 69 *gen_opc_ptr++ = opc; 70 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 71 *gen_opparam_ptr++ = arg2; 72 } 73 74 static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2) 75 { 76 *gen_opc_ptr++ = opc; 77 *gen_opparam_ptr++ = arg1; 78 *gen_opparam_ptr++ = arg2; 79 } 80 81 static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 82 TCGv_i32 arg3) 83 { 84 *gen_opc_ptr++ = opc; 85 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 86 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 87 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 88 } 89 90 static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 91 TCGv_i64 arg3) 92 { 93 *gen_opc_ptr++ = opc; 94 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 95 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 96 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 97 } 98 99 static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1, 100 TCGv_i32 arg2, TCGArg arg3) 101 { 102 *gen_opc_ptr++ = opc; 103 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 104 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 105 *gen_opparam_ptr++ = arg3; 106 } 107 108 static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1, 109 TCGv_i64 arg2, TCGArg arg3) 110 { 111 *gen_opc_ptr++ = opc; 112 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 113 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 114 *gen_opparam_ptr++ = arg3; 115 } 116 117 static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val, 118 TCGv_ptr base, TCGArg offset) 119 { 120 *gen_opc_ptr++ = opc; 121 *gen_opparam_ptr++ = GET_TCGV_I32(val); 122 *gen_opparam_ptr++ = GET_TCGV_PTR(base); 123 *gen_opparam_ptr++ = offset; 124 } 125 126 static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val, 127 TCGv_ptr base, TCGArg offset) 128 { 129 *gen_opc_ptr++ = opc; 130 *gen_opparam_ptr++ = GET_TCGV_I64(val); 131 *gen_opparam_ptr++ = GET_TCGV_PTR(base); 132 *gen_opparam_ptr++ = offset; 133 } 134 135 static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val, 136 TCGv_i32 addr, TCGArg mem_index) 137 { 138 *gen_opc_ptr++ = opc; 139 *gen_opparam_ptr++ = GET_TCGV_I64(val); 140 *gen_opparam_ptr++ = GET_TCGV_I32(addr); 141 *gen_opparam_ptr++ = mem_index; 142 } 143 144 static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val, 145 TCGv_i64 addr, TCGArg mem_index) 146 { 147 *gen_opc_ptr++ = opc; 148 *gen_opparam_ptr++ = GET_TCGV_I64(val); 149 *gen_opparam_ptr++ = GET_TCGV_I64(addr); 150 *gen_opparam_ptr++ = mem_index; 151 } 152 153 static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 154 TCGv_i32 arg3, TCGv_i32 arg4) 155 { 156 *gen_opc_ptr++ = opc; 157 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 158 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 159 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 160 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 161 } 162 163 static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 164 TCGv_i64 arg3, TCGv_i64 arg4) 165 { 166 *gen_opc_ptr++ = opc; 167 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 168 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 169 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 170 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 171 } 172 173 static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 174 TCGv_i32 arg3, TCGArg arg4) 175 { 176 *gen_opc_ptr++ = opc; 177 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 178 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 179 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 180 *gen_opparam_ptr++ = arg4; 181 } 182 183 static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 184 TCGv_i64 arg3, TCGArg arg4) 185 { 186 *gen_opc_ptr++ = opc; 187 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 188 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 189 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 190 *gen_opparam_ptr++ = arg4; 191 } 192 193 static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 194 TCGArg arg3, TCGArg arg4) 195 { 196 *gen_opc_ptr++ = opc; 197 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 198 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 199 *gen_opparam_ptr++ = arg3; 200 *gen_opparam_ptr++ = arg4; 201 } 202 203 static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 204 TCGArg arg3, TCGArg arg4) 205 { 206 *gen_opc_ptr++ = opc; 207 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 208 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 209 *gen_opparam_ptr++ = arg3; 210 *gen_opparam_ptr++ = arg4; 211 } 212 213 static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 214 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5) 215 { 216 *gen_opc_ptr++ = opc; 217 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 218 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 219 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 220 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 221 *gen_opparam_ptr++ = GET_TCGV_I32(arg5); 222 } 223 224 static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 225 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5) 226 { 227 *gen_opc_ptr++ = opc; 228 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 229 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 230 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 231 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 232 *gen_opparam_ptr++ = GET_TCGV_I64(arg5); 233 } 234 235 static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 236 TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5) 237 { 238 *gen_opc_ptr++ = opc; 239 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 240 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 241 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 242 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 243 *gen_opparam_ptr++ = arg5; 244 } 245 246 static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 247 TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5) 248 { 249 *gen_opc_ptr++ = opc; 250 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 251 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 252 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 253 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 254 *gen_opparam_ptr++ = arg5; 255 } 256 257 static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1, 258 TCGv_i32 arg2, TCGv_i32 arg3, 259 TCGArg arg4, TCGArg arg5) 260 { 261 *gen_opc_ptr++ = opc; 262 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 263 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 264 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 265 *gen_opparam_ptr++ = arg4; 266 *gen_opparam_ptr++ = arg5; 267 } 268 269 static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1, 270 TCGv_i64 arg2, TCGv_i64 arg3, 271 TCGArg arg4, TCGArg arg5) 272 { 273 *gen_opc_ptr++ = opc; 274 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 275 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 276 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 277 *gen_opparam_ptr++ = arg4; 278 *gen_opparam_ptr++ = arg5; 279 } 280 281 static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 282 TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5, 283 TCGv_i32 arg6) 284 { 285 *gen_opc_ptr++ = opc; 286 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 287 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 288 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 289 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 290 *gen_opparam_ptr++ = GET_TCGV_I32(arg5); 291 *gen_opparam_ptr++ = GET_TCGV_I32(arg6); 292 } 293 294 static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 295 TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5, 296 TCGv_i64 arg6) 297 { 298 *gen_opc_ptr++ = opc; 299 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 300 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 301 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 302 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 303 *gen_opparam_ptr++ = GET_TCGV_I64(arg5); 304 *gen_opparam_ptr++ = GET_TCGV_I64(arg6); 305 } 306 307 static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, 308 TCGv_i32 arg3, TCGv_i32 arg4, 309 TCGv_i32 arg5, TCGArg arg6) 310 { 311 *gen_opc_ptr++ = opc; 312 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 313 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 314 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 315 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 316 *gen_opparam_ptr++ = GET_TCGV_I32(arg5); 317 *gen_opparam_ptr++ = arg6; 318 } 319 320 static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, 321 TCGv_i64 arg3, TCGv_i64 arg4, 322 TCGv_i64 arg5, TCGArg arg6) 323 { 324 *gen_opc_ptr++ = opc; 325 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 326 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 327 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 328 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 329 *gen_opparam_ptr++ = GET_TCGV_I64(arg5); 330 *gen_opparam_ptr++ = arg6; 331 } 332 333 static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1, 334 TCGv_i32 arg2, TCGv_i32 arg3, 335 TCGv_i32 arg4, TCGArg arg5, TCGArg arg6) 336 { 337 *gen_opc_ptr++ = opc; 338 *gen_opparam_ptr++ = GET_TCGV_I32(arg1); 339 *gen_opparam_ptr++ = GET_TCGV_I32(arg2); 340 *gen_opparam_ptr++ = GET_TCGV_I32(arg3); 341 *gen_opparam_ptr++ = GET_TCGV_I32(arg4); 342 *gen_opparam_ptr++ = arg5; 343 *gen_opparam_ptr++ = arg6; 344 } 345 346 static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1, 347 TCGv_i64 arg2, TCGv_i64 arg3, 348 TCGv_i64 arg4, TCGArg arg5, TCGArg arg6) 349 { 350 *gen_opc_ptr++ = opc; 351 *gen_opparam_ptr++ = GET_TCGV_I64(arg1); 352 *gen_opparam_ptr++ = GET_TCGV_I64(arg2); 353 *gen_opparam_ptr++ = GET_TCGV_I64(arg3); 354 *gen_opparam_ptr++ = GET_TCGV_I64(arg4); 355 *gen_opparam_ptr++ = arg5; 356 *gen_opparam_ptr++ = arg6; 357 } 358 359 static inline void gen_set_label(int n) 360 { 361 tcg_gen_op1i(INDEX_op_set_label, n); 362 } 363 364 static inline void tcg_gen_br(int label) 365 { 366 tcg_gen_op1i(INDEX_op_br, label); 367 } 368 369 static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) 370 { 371 if (!TCGV_EQUAL_I32(ret, arg)) 372 tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg); 373 } 374 375 static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) 376 { 377 tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg); 378 } 379 380 /* A version of dh_sizemask from def-helper.h that doesn't rely on 381 preprocessor magic. */ 382 static inline int tcg_gen_sizemask(int n, int is_64bit, int is_signed) 383 { 384 return (is_64bit << n*2) | (is_signed << (n*2 + 1)); 385 } 386 387 /* helper calls */ 388 static inline void tcg_gen_helperN(void *func, int flags, int sizemask, 389 TCGArg ret, int nargs, TCGArg *args) 390 { 391 TCGv_ptr fn; 392 fn = tcg_const_ptr((tcg_target_long)func); 393 tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret, 394 nargs, args); 395 tcg_temp_free_ptr(fn); 396 } 397 398 /* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently 399 reserved for helpers in tcg-runtime.c. These helpers are all const 400 and pure, hence the call to tcg_gen_callN() with TCG_CALL_CONST | 401 TCG_CALL_PURE. This may need to be adjusted if these functions 402 start to be used with other helpers. */ 403 static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret, 404 TCGv_i32 a, TCGv_i32 b) 405 { 406 TCGv_ptr fn; 407 TCGArg args[2]; 408 fn = tcg_const_ptr((tcg_target_long)func); 409 args[0] = GET_TCGV_I32(a); 410 args[1] = GET_TCGV_I32(b); 411 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask, 412 GET_TCGV_I32(ret), 2, args); 413 tcg_temp_free_ptr(fn); 414 } 415 416 static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret, 417 TCGv_i64 a, TCGv_i64 b) 418 { 419 TCGv_ptr fn; 420 TCGArg args[2]; 421 fn = tcg_const_ptr((tcg_target_long)func); 422 args[0] = GET_TCGV_I64(a); 423 args[1] = GET_TCGV_I64(b); 424 tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask, 425 GET_TCGV_I64(ret), 2, args); 426 tcg_temp_free_ptr(fn); 427 } 428 429 /* 32 bit ops */ 430 431 static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 432 { 433 tcg_gen_ldst_op_i32(INDEX_op_ld8u_i32, ret, arg2, offset); 434 } 435 436 static inline void tcg_gen_ld8s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 437 { 438 tcg_gen_ldst_op_i32(INDEX_op_ld8s_i32, ret, arg2, offset); 439 } 440 441 static inline void tcg_gen_ld16u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 442 { 443 tcg_gen_ldst_op_i32(INDEX_op_ld16u_i32, ret, arg2, offset); 444 } 445 446 static inline void tcg_gen_ld16s_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 447 { 448 tcg_gen_ldst_op_i32(INDEX_op_ld16s_i32, ret, arg2, offset); 449 } 450 451 static inline void tcg_gen_ld_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) 452 { 453 tcg_gen_ldst_op_i32(INDEX_op_ld_i32, ret, arg2, offset); 454 } 455 456 static inline void tcg_gen_st8_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 457 { 458 tcg_gen_ldst_op_i32(INDEX_op_st8_i32, arg1, arg2, offset); 459 } 460 461 static inline void tcg_gen_st16_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 462 { 463 tcg_gen_ldst_op_i32(INDEX_op_st16_i32, arg1, arg2, offset); 464 } 465 466 static inline void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) 467 { 468 tcg_gen_ldst_op_i32(INDEX_op_st_i32, arg1, arg2, offset); 469 } 470 471 static inline void tcg_gen_add_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 472 { 473 tcg_gen_op3_i32(INDEX_op_add_i32, ret, arg1, arg2); 474 } 475 476 static inline void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 477 { 478 /* some cases can be optimized here */ 479 if (arg2 == 0) { 480 tcg_gen_mov_i32(ret, arg1); 481 } else { 482 TCGv_i32 t0 = tcg_const_i32(arg2); 483 tcg_gen_add_i32(ret, arg1, t0); 484 tcg_temp_free_i32(t0); 485 } 486 } 487 488 static inline void tcg_gen_sub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 489 { 490 tcg_gen_op3_i32(INDEX_op_sub_i32, ret, arg1, arg2); 491 } 492 493 static inline void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2) 494 { 495 TCGv_i32 t0 = tcg_const_i32(arg1); 496 tcg_gen_sub_i32(ret, t0, arg2); 497 tcg_temp_free_i32(t0); 498 } 499 500 static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 501 { 502 /* some cases can be optimized here */ 503 if (arg2 == 0) { 504 tcg_gen_mov_i32(ret, arg1); 505 } else { 506 TCGv_i32 t0 = tcg_const_i32(arg2); 507 tcg_gen_sub_i32(ret, arg1, t0); 508 tcg_temp_free_i32(t0); 509 } 510 } 511 512 static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 513 { 514 if (TCGV_EQUAL_I32(arg1, arg2)) { 515 tcg_gen_mov_i32(ret, arg1); 516 } else { 517 tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2); 518 } 519 } 520 521 static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 522 { 523 /* some cases can be optimized here */ 524 if (arg2 == 0) { 525 tcg_gen_movi_i32(ret, 0); 526 } else if (arg2 == 0xffffffff) { 527 tcg_gen_mov_i32(ret, arg1); 528 } else { 529 TCGv_i32 t0 = tcg_const_i32(arg2); 530 tcg_gen_and_i32(ret, arg1, t0); 531 tcg_temp_free_i32(t0); 532 } 533 } 534 535 static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 536 { 537 if (TCGV_EQUAL_I32(arg1, arg2)) { 538 tcg_gen_mov_i32(ret, arg1); 539 } else { 540 tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2); 541 } 542 } 543 544 static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 545 { 546 /* some cases can be optimized here */ 547 if (arg2 == 0xffffffff) { 548 tcg_gen_movi_i32(ret, 0xffffffff); 549 } else if (arg2 == 0) { 550 tcg_gen_mov_i32(ret, arg1); 551 } else { 552 TCGv_i32 t0 = tcg_const_i32(arg2); 553 tcg_gen_or_i32(ret, arg1, t0); 554 tcg_temp_free_i32(t0); 555 } 556 } 557 558 static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 559 { 560 if (TCGV_EQUAL_I32(arg1, arg2)) { 561 tcg_gen_movi_i32(ret, 0); 562 } else { 563 tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2); 564 } 565 } 566 567 static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 568 { 569 /* some cases can be optimized here */ 570 if (arg2 == 0) { 571 tcg_gen_mov_i32(ret, arg1); 572 } else { 573 TCGv_i32 t0 = tcg_const_i32(arg2); 574 tcg_gen_xor_i32(ret, arg1, t0); 575 tcg_temp_free_i32(t0); 576 } 577 } 578 579 static inline void tcg_gen_shl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 580 { 581 tcg_gen_op3_i32(INDEX_op_shl_i32, ret, arg1, arg2); 582 } 583 584 static inline void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 585 { 586 if (arg2 == 0) { 587 tcg_gen_mov_i32(ret, arg1); 588 } else { 589 TCGv_i32 t0 = tcg_const_i32(arg2); 590 tcg_gen_shl_i32(ret, arg1, t0); 591 tcg_temp_free_i32(t0); 592 } 593 } 594 595 static inline void tcg_gen_shr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 596 { 597 tcg_gen_op3_i32(INDEX_op_shr_i32, ret, arg1, arg2); 598 } 599 600 static inline void tcg_gen_shri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 601 { 602 if (arg2 == 0) { 603 tcg_gen_mov_i32(ret, arg1); 604 } else { 605 TCGv_i32 t0 = tcg_const_i32(arg2); 606 tcg_gen_shr_i32(ret, arg1, t0); 607 tcg_temp_free_i32(t0); 608 } 609 } 610 611 static inline void tcg_gen_sar_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 612 { 613 tcg_gen_op3_i32(INDEX_op_sar_i32, ret, arg1, arg2); 614 } 615 616 static inline void tcg_gen_sari_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 617 { 618 if (arg2 == 0) { 619 tcg_gen_mov_i32(ret, arg1); 620 } else { 621 TCGv_i32 t0 = tcg_const_i32(arg2); 622 tcg_gen_sar_i32(ret, arg1, t0); 623 tcg_temp_free_i32(t0); 624 } 625 } 626 627 static inline void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1, 628 TCGv_i32 arg2, int label_index) 629 { 630 tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_index); 631 } 632 633 static inline void tcg_gen_brcondi_i32(TCGCond cond, TCGv_i32 arg1, 634 int32_t arg2, int label_index) 635 { 636 TCGv_i32 t0 = tcg_const_i32(arg2); 637 tcg_gen_brcond_i32(cond, arg1, t0, label_index); 638 tcg_temp_free_i32(t0); 639 } 640 641 static inline void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret, 642 TCGv_i32 arg1, TCGv_i32 arg2) 643 { 644 tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond); 645 } 646 647 static inline void tcg_gen_setcondi_i32(TCGCond cond, TCGv_i32 ret, 648 TCGv_i32 arg1, int32_t arg2) 649 { 650 TCGv_i32 t0 = tcg_const_i32(arg2); 651 tcg_gen_setcond_i32(cond, ret, arg1, t0); 652 tcg_temp_free_i32(t0); 653 } 654 655 static inline void tcg_gen_mul_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 656 { 657 tcg_gen_op3_i32(INDEX_op_mul_i32, ret, arg1, arg2); 658 } 659 660 static inline void tcg_gen_muli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 661 { 662 TCGv_i32 t0 = tcg_const_i32(arg2); 663 tcg_gen_mul_i32(ret, arg1, t0); 664 tcg_temp_free_i32(t0); 665 } 666 667 #ifdef TCG_TARGET_HAS_div_i32 668 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 669 { 670 tcg_gen_op3_i32(INDEX_op_div_i32, ret, arg1, arg2); 671 } 672 673 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 674 { 675 tcg_gen_op3_i32(INDEX_op_rem_i32, ret, arg1, arg2); 676 } 677 678 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 679 { 680 tcg_gen_op3_i32(INDEX_op_divu_i32, ret, arg1, arg2); 681 } 682 683 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 684 { 685 tcg_gen_op3_i32(INDEX_op_remu_i32, ret, arg1, arg2); 686 } 687 #elif defined(TCG_TARGET_HAS_div2_i32) 688 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 689 { 690 TCGv_i32 t0; 691 t0 = tcg_temp_new_i32(); 692 tcg_gen_sari_i32(t0, arg1, 31); 693 tcg_gen_op5_i32(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2); 694 tcg_temp_free_i32(t0); 695 } 696 697 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 698 { 699 TCGv_i32 t0; 700 t0 = tcg_temp_new_i32(); 701 tcg_gen_sari_i32(t0, arg1, 31); 702 tcg_gen_op5_i32(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2); 703 tcg_temp_free_i32(t0); 704 } 705 706 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 707 { 708 TCGv_i32 t0; 709 t0 = tcg_temp_new_i32(); 710 tcg_gen_movi_i32(t0, 0); 711 tcg_gen_op5_i32(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2); 712 tcg_temp_free_i32(t0); 713 } 714 715 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 716 { 717 TCGv_i32 t0; 718 t0 = tcg_temp_new_i32(); 719 tcg_gen_movi_i32(t0, 0); 720 tcg_gen_op5_i32(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2); 721 tcg_temp_free_i32(t0); 722 } 723 #else 724 static inline void tcg_gen_div_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 725 { 726 int sizemask = 0; 727 /* Return value and both arguments are 32-bit and signed. */ 728 sizemask |= tcg_gen_sizemask(0, 0, 1); 729 sizemask |= tcg_gen_sizemask(1, 0, 1); 730 sizemask |= tcg_gen_sizemask(2, 0, 1); 731 732 tcg_gen_helper32(tcg_helper_div_i32, sizemask, ret, arg1, arg2); 733 } 734 735 static inline void tcg_gen_rem_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 736 { 737 int sizemask = 0; 738 /* Return value and both arguments are 32-bit and signed. */ 739 sizemask |= tcg_gen_sizemask(0, 0, 1); 740 sizemask |= tcg_gen_sizemask(1, 0, 1); 741 sizemask |= tcg_gen_sizemask(2, 0, 1); 742 743 tcg_gen_helper32(tcg_helper_rem_i32, sizemask, ret, arg1, arg2); 744 } 745 746 static inline void tcg_gen_divu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 747 { 748 int sizemask = 0; 749 /* Return value and both arguments are 32-bit and unsigned. */ 750 sizemask |= tcg_gen_sizemask(0, 0, 0); 751 sizemask |= tcg_gen_sizemask(1, 0, 0); 752 sizemask |= tcg_gen_sizemask(2, 0, 0); 753 754 tcg_gen_helper32(tcg_helper_divu_i32, sizemask, ret, arg1, arg2); 755 } 756 757 static inline void tcg_gen_remu_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 758 { 759 int sizemask = 0; 760 /* Return value and both arguments are 32-bit and unsigned. */ 761 sizemask |= tcg_gen_sizemask(0, 0, 0); 762 sizemask |= tcg_gen_sizemask(1, 0, 0); 763 sizemask |= tcg_gen_sizemask(2, 0, 0); 764 765 tcg_gen_helper32(tcg_helper_remu_i32, sizemask, ret, arg1, arg2); 766 } 767 #endif 768 769 #if TCG_TARGET_REG_BITS == 32 770 771 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg) 772 { 773 if (!TCGV_EQUAL_I64(ret, arg)) { 774 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 775 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 776 } 777 } 778 779 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) 780 { 781 tcg_gen_movi_i32(TCGV_LOW(ret), arg); 782 tcg_gen_movi_i32(TCGV_HIGH(ret), arg >> 32); 783 } 784 785 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, 786 tcg_target_long offset) 787 { 788 tcg_gen_ld8u_i32(TCGV_LOW(ret), arg2, offset); 789 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 790 } 791 792 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, 793 tcg_target_long offset) 794 { 795 tcg_gen_ld8s_i32(TCGV_LOW(ret), arg2, offset); 796 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_HIGH(ret), 31); 797 } 798 799 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, 800 tcg_target_long offset) 801 { 802 tcg_gen_ld16u_i32(TCGV_LOW(ret), arg2, offset); 803 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 804 } 805 806 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_ptr arg2, 807 tcg_target_long offset) 808 { 809 tcg_gen_ld16s_i32(TCGV_LOW(ret), arg2, offset); 810 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 811 } 812 813 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_ptr arg2, 814 tcg_target_long offset) 815 { 816 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 817 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 818 } 819 820 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_ptr arg2, 821 tcg_target_long offset) 822 { 823 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 824 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 825 } 826 827 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, 828 tcg_target_long offset) 829 { 830 /* since arg2 and ret have different types, they cannot be the 831 same temporary */ 832 #ifdef TCG_TARGET_WORDS_BIGENDIAN 833 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset); 834 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4); 835 #else 836 tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset); 837 tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset + 4); 838 #endif 839 } 840 841 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_ptr arg2, 842 tcg_target_long offset) 843 { 844 tcg_gen_st8_i32(TCGV_LOW(arg1), arg2, offset); 845 } 846 847 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_ptr arg2, 848 tcg_target_long offset) 849 { 850 tcg_gen_st16_i32(TCGV_LOW(arg1), arg2, offset); 851 } 852 853 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_ptr arg2, 854 tcg_target_long offset) 855 { 856 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset); 857 } 858 859 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, 860 tcg_target_long offset) 861 { 862 #ifdef TCG_TARGET_WORDS_BIGENDIAN 863 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset); 864 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4); 865 #else 866 tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset); 867 tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset + 4); 868 #endif 869 } 870 871 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 872 { 873 tcg_gen_op6_i32(INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), 874 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 875 TCGV_HIGH(arg2)); 876 } 877 878 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 879 { 880 tcg_gen_op6_i32(INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), 881 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 882 TCGV_HIGH(arg2)); 883 } 884 885 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 886 { 887 tcg_gen_and_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 888 tcg_gen_and_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 889 } 890 891 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 892 { 893 tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 894 tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 895 } 896 897 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 898 { 899 tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 900 tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 901 } 902 903 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 904 { 905 tcg_gen_ori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 906 tcg_gen_ori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 907 } 908 909 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 910 { 911 tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 912 tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 913 } 914 915 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 916 { 917 tcg_gen_xori_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2); 918 tcg_gen_xori_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); 919 } 920 921 /* XXX: use generic code when basic block handling is OK or CPU 922 specific code (x86) */ 923 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 924 { 925 int sizemask = 0; 926 /* Return value and both arguments are 64-bit and signed. */ 927 sizemask |= tcg_gen_sizemask(0, 1, 1); 928 sizemask |= tcg_gen_sizemask(1, 1, 1); 929 sizemask |= tcg_gen_sizemask(2, 1, 1); 930 931 tcg_gen_helper64(tcg_helper_shl_i64, sizemask, ret, arg1, arg2); 932 } 933 934 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 935 { 936 tcg_gen_shifti_i64(ret, arg1, arg2, 0, 0); 937 } 938 939 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 940 { 941 int sizemask = 0; 942 /* Return value and both arguments are 64-bit and signed. */ 943 sizemask |= tcg_gen_sizemask(0, 1, 1); 944 sizemask |= tcg_gen_sizemask(1, 1, 1); 945 sizemask |= tcg_gen_sizemask(2, 1, 1); 946 947 tcg_gen_helper64(tcg_helper_shr_i64, sizemask, ret, arg1, arg2); 948 } 949 950 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 951 { 952 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 0); 953 } 954 955 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 956 { 957 int sizemask = 0; 958 /* Return value and both arguments are 64-bit and signed. */ 959 sizemask |= tcg_gen_sizemask(0, 1, 1); 960 sizemask |= tcg_gen_sizemask(1, 1, 1); 961 sizemask |= tcg_gen_sizemask(2, 1, 1); 962 963 tcg_gen_helper64(tcg_helper_sar_i64, sizemask, ret, arg1, arg2); 964 } 965 966 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 967 { 968 tcg_gen_shifti_i64(ret, arg1, arg2, 1, 1); 969 } 970 971 static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, 972 TCGv_i64 arg2, int label_index) 973 { 974 tcg_gen_op6ii_i32(INDEX_op_brcond2_i32, 975 TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), 976 TCGV_HIGH(arg2), cond, label_index); 977 } 978 979 static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret, 980 TCGv_i64 arg1, TCGv_i64 arg2) 981 { 982 tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret), 983 TCGV_LOW(arg1), TCGV_HIGH(arg1), 984 TCGV_LOW(arg2), TCGV_HIGH(arg2), cond); 985 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 986 } 987 988 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 989 { 990 TCGv_i64 t0; 991 TCGv_i32 t1; 992 993 t0 = tcg_temp_new_i64(); 994 t1 = tcg_temp_new_i32(); 995 996 tcg_gen_op4_i32(INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0), 997 TCGV_LOW(arg1), TCGV_LOW(arg2)); 998 999 tcg_gen_mul_i32(t1, TCGV_LOW(arg1), TCGV_HIGH(arg2)); 1000 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1); 1001 tcg_gen_mul_i32(t1, TCGV_HIGH(arg1), TCGV_LOW(arg2)); 1002 tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1); 1003 1004 tcg_gen_mov_i64(ret, t0); 1005 tcg_temp_free_i64(t0); 1006 tcg_temp_free_i32(t1); 1007 } 1008 1009 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1010 { 1011 int sizemask = 0; 1012 /* Return value and both arguments are 64-bit and signed. */ 1013 sizemask |= tcg_gen_sizemask(0, 1, 1); 1014 sizemask |= tcg_gen_sizemask(1, 1, 1); 1015 sizemask |= tcg_gen_sizemask(2, 1, 1); 1016 1017 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2); 1018 } 1019 1020 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1021 { 1022 int sizemask = 0; 1023 /* Return value and both arguments are 64-bit and signed. */ 1024 sizemask |= tcg_gen_sizemask(0, 1, 1); 1025 sizemask |= tcg_gen_sizemask(1, 1, 1); 1026 sizemask |= tcg_gen_sizemask(2, 1, 1); 1027 1028 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2); 1029 } 1030 1031 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1032 { 1033 int sizemask = 0; 1034 /* Return value and both arguments are 64-bit and unsigned. */ 1035 sizemask |= tcg_gen_sizemask(0, 1, 0); 1036 sizemask |= tcg_gen_sizemask(1, 1, 0); 1037 sizemask |= tcg_gen_sizemask(2, 1, 0); 1038 1039 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2); 1040 } 1041 1042 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1043 { 1044 int sizemask = 0; 1045 /* Return value and both arguments are 64-bit and unsigned. */ 1046 sizemask |= tcg_gen_sizemask(0, 1, 0); 1047 sizemask |= tcg_gen_sizemask(1, 1, 0); 1048 sizemask |= tcg_gen_sizemask(2, 1, 0); 1049 1050 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2); 1051 } 1052 1053 #else 1054 1055 static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg) 1056 { 1057 if (!TCGV_EQUAL_I64(ret, arg)) 1058 tcg_gen_op2_i64(INDEX_op_mov_i64, ret, arg); 1059 } 1060 1061 static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) 1062 { 1063 tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg); 1064 } 1065 1066 static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_i64 arg2, 1067 tcg_target_long offset) 1068 { 1069 tcg_gen_ldst_op_i64(INDEX_op_ld8u_i64, ret, arg2, offset); 1070 } 1071 1072 static inline void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_i64 arg2, 1073 tcg_target_long offset) 1074 { 1075 tcg_gen_ldst_op_i64(INDEX_op_ld8s_i64, ret, arg2, offset); 1076 } 1077 1078 static inline void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_i64 arg2, 1079 tcg_target_long offset) 1080 { 1081 tcg_gen_ldst_op_i64(INDEX_op_ld16u_i64, ret, arg2, offset); 1082 } 1083 1084 static inline void tcg_gen_ld16s_i64(TCGv_i64 ret, TCGv_i64 arg2, 1085 tcg_target_long offset) 1086 { 1087 tcg_gen_ldst_op_i64(INDEX_op_ld16s_i64, ret, arg2, offset); 1088 } 1089 1090 static inline void tcg_gen_ld32u_i64(TCGv_i64 ret, TCGv_i64 arg2, 1091 tcg_target_long offset) 1092 { 1093 tcg_gen_ldst_op_i64(INDEX_op_ld32u_i64, ret, arg2, offset); 1094 } 1095 1096 static inline void tcg_gen_ld32s_i64(TCGv_i64 ret, TCGv_i64 arg2, 1097 tcg_target_long offset) 1098 { 1099 tcg_gen_ldst_op_i64(INDEX_op_ld32s_i64, ret, arg2, offset); 1100 } 1101 1102 static inline void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_i64 arg2, tcg_target_long offset) 1103 { 1104 tcg_gen_ldst_op_i64(INDEX_op_ld_i64, ret, arg2, offset); 1105 } 1106 1107 static inline void tcg_gen_st8_i64(TCGv_i64 arg1, TCGv_i64 arg2, 1108 tcg_target_long offset) 1109 { 1110 tcg_gen_ldst_op_i64(INDEX_op_st8_i64, arg1, arg2, offset); 1111 } 1112 1113 static inline void tcg_gen_st16_i64(TCGv_i64 arg1, TCGv_i64 arg2, 1114 tcg_target_long offset) 1115 { 1116 tcg_gen_ldst_op_i64(INDEX_op_st16_i64, arg1, arg2, offset); 1117 } 1118 1119 static inline void tcg_gen_st32_i64(TCGv_i64 arg1, TCGv_i64 arg2, 1120 tcg_target_long offset) 1121 { 1122 tcg_gen_ldst_op_i64(INDEX_op_st32_i64, arg1, arg2, offset); 1123 } 1124 1125 static inline void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_i64 arg2, tcg_target_long offset) 1126 { 1127 tcg_gen_ldst_op_i64(INDEX_op_st_i64, arg1, arg2, offset); 1128 } 1129 1130 static inline void tcg_gen_add_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1131 { 1132 tcg_gen_op3_i64(INDEX_op_add_i64, ret, arg1, arg2); 1133 } 1134 1135 static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1136 { 1137 tcg_gen_op3_i64(INDEX_op_sub_i64, ret, arg1, arg2); 1138 } 1139 1140 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1141 { 1142 if (TCGV_EQUAL_I64(arg1, arg2)) { 1143 tcg_gen_mov_i64(ret, arg1); 1144 } else { 1145 tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2); 1146 } 1147 } 1148 1149 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1150 { 1151 TCGv_i64 t0 = tcg_const_i64(arg2); 1152 tcg_gen_and_i64(ret, arg1, t0); 1153 tcg_temp_free_i64(t0); 1154 } 1155 1156 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1157 { 1158 if (TCGV_EQUAL_I64(arg1, arg2)) { 1159 tcg_gen_mov_i64(ret, arg1); 1160 } else { 1161 tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2); 1162 } 1163 } 1164 1165 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1166 { 1167 TCGv_i64 t0 = tcg_const_i64(arg2); 1168 tcg_gen_or_i64(ret, arg1, t0); 1169 tcg_temp_free_i64(t0); 1170 } 1171 1172 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1173 { 1174 if (TCGV_EQUAL_I64(arg1, arg2)) { 1175 tcg_gen_movi_i64(ret, 0); 1176 } else { 1177 tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2); 1178 } 1179 } 1180 1181 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1182 { 1183 TCGv_i64 t0 = tcg_const_i64(arg2); 1184 tcg_gen_xor_i64(ret, arg1, t0); 1185 tcg_temp_free_i64(t0); 1186 } 1187 1188 static inline void tcg_gen_shl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1189 { 1190 tcg_gen_op3_i64(INDEX_op_shl_i64, ret, arg1, arg2); 1191 } 1192 1193 static inline void tcg_gen_shli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1194 { 1195 if (arg2 == 0) { 1196 tcg_gen_mov_i64(ret, arg1); 1197 } else { 1198 TCGv_i64 t0 = tcg_const_i64(arg2); 1199 tcg_gen_shl_i64(ret, arg1, t0); 1200 tcg_temp_free_i64(t0); 1201 } 1202 } 1203 1204 static inline void tcg_gen_shr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1205 { 1206 tcg_gen_op3_i64(INDEX_op_shr_i64, ret, arg1, arg2); 1207 } 1208 1209 static inline void tcg_gen_shri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1210 { 1211 if (arg2 == 0) { 1212 tcg_gen_mov_i64(ret, arg1); 1213 } else { 1214 TCGv_i64 t0 = tcg_const_i64(arg2); 1215 tcg_gen_shr_i64(ret, arg1, t0); 1216 tcg_temp_free_i64(t0); 1217 } 1218 } 1219 1220 static inline void tcg_gen_sar_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1221 { 1222 tcg_gen_op3_i64(INDEX_op_sar_i64, ret, arg1, arg2); 1223 } 1224 1225 static inline void tcg_gen_sari_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1226 { 1227 if (arg2 == 0) { 1228 tcg_gen_mov_i64(ret, arg1); 1229 } else { 1230 TCGv_i64 t0 = tcg_const_i64(arg2); 1231 tcg_gen_sar_i64(ret, arg1, t0); 1232 tcg_temp_free_i64(t0); 1233 } 1234 } 1235 1236 static inline void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, 1237 TCGv_i64 arg2, int label_index) 1238 { 1239 tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, label_index); 1240 } 1241 1242 static inline void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret, 1243 TCGv_i64 arg1, TCGv_i64 arg2) 1244 { 1245 tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond); 1246 } 1247 1248 static inline void tcg_gen_mul_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1249 { 1250 tcg_gen_op3_i64(INDEX_op_mul_i64, ret, arg1, arg2); 1251 } 1252 1253 #ifdef TCG_TARGET_HAS_div_i64 1254 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1255 { 1256 tcg_gen_op3_i64(INDEX_op_div_i64, ret, arg1, arg2); 1257 } 1258 1259 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1260 { 1261 tcg_gen_op3_i64(INDEX_op_rem_i64, ret, arg1, arg2); 1262 } 1263 1264 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1265 { 1266 tcg_gen_op3_i64(INDEX_op_divu_i64, ret, arg1, arg2); 1267 } 1268 1269 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1270 { 1271 tcg_gen_op3_i64(INDEX_op_remu_i64, ret, arg1, arg2); 1272 } 1273 #elif defined(TCG_TARGET_HAS_div2_i64) 1274 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1275 { 1276 TCGv_i64 t0; 1277 t0 = tcg_temp_new_i64(); 1278 tcg_gen_sari_i64(t0, arg1, 63); 1279 tcg_gen_op5_i64(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2); 1280 tcg_temp_free_i64(t0); 1281 } 1282 1283 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1284 { 1285 TCGv_i64 t0; 1286 t0 = tcg_temp_new_i64(); 1287 tcg_gen_sari_i64(t0, arg1, 63); 1288 tcg_gen_op5_i64(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2); 1289 tcg_temp_free_i64(t0); 1290 } 1291 1292 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1293 { 1294 TCGv_i64 t0; 1295 t0 = tcg_temp_new_i64(); 1296 tcg_gen_movi_i64(t0, 0); 1297 tcg_gen_op5_i64(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2); 1298 tcg_temp_free_i64(t0); 1299 } 1300 1301 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1302 { 1303 TCGv_i64 t0; 1304 t0 = tcg_temp_new_i64(); 1305 tcg_gen_movi_i64(t0, 0); 1306 tcg_gen_op5_i64(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2); 1307 tcg_temp_free_i64(t0); 1308 } 1309 #else 1310 static inline void tcg_gen_div_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1311 { 1312 int sizemask = 0; 1313 /* Return value and both arguments are 64-bit and signed. */ 1314 sizemask |= tcg_gen_sizemask(0, 1, 1); 1315 sizemask |= tcg_gen_sizemask(1, 1, 1); 1316 sizemask |= tcg_gen_sizemask(2, 1, 1); 1317 1318 tcg_gen_helper64(tcg_helper_div_i64, sizemask, ret, arg1, arg2); 1319 } 1320 1321 static inline void tcg_gen_rem_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1322 { 1323 int sizemask = 0; 1324 /* Return value and both arguments are 64-bit and signed. */ 1325 sizemask |= tcg_gen_sizemask(0, 1, 1); 1326 sizemask |= tcg_gen_sizemask(1, 1, 1); 1327 sizemask |= tcg_gen_sizemask(2, 1, 1); 1328 1329 tcg_gen_helper64(tcg_helper_rem_i64, sizemask, ret, arg1, arg2); 1330 } 1331 1332 static inline void tcg_gen_divu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1333 { 1334 int sizemask = 0; 1335 /* Return value and both arguments are 64-bit and unsigned. */ 1336 sizemask |= tcg_gen_sizemask(0, 1, 0); 1337 sizemask |= tcg_gen_sizemask(1, 1, 0); 1338 sizemask |= tcg_gen_sizemask(2, 1, 0); 1339 1340 tcg_gen_helper64(tcg_helper_divu_i64, sizemask, ret, arg1, arg2); 1341 } 1342 1343 static inline void tcg_gen_remu_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1344 { 1345 int sizemask = 0; 1346 /* Return value and both arguments are 64-bit and unsigned. */ 1347 sizemask |= tcg_gen_sizemask(0, 1, 0); 1348 sizemask |= tcg_gen_sizemask(1, 1, 0); 1349 sizemask |= tcg_gen_sizemask(2, 1, 0); 1350 1351 tcg_gen_helper64(tcg_helper_remu_i64, sizemask, ret, arg1, arg2); 1352 } 1353 #endif 1354 1355 #endif 1356 1357 static inline void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1358 { 1359 /* some cases can be optimized here */ 1360 if (arg2 == 0) { 1361 tcg_gen_mov_i64(ret, arg1); 1362 } else { 1363 TCGv_i64 t0 = tcg_const_i64(arg2); 1364 tcg_gen_add_i64(ret, arg1, t0); 1365 tcg_temp_free_i64(t0); 1366 } 1367 } 1368 1369 static inline void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2) 1370 { 1371 TCGv_i64 t0 = tcg_const_i64(arg1); 1372 tcg_gen_sub_i64(ret, t0, arg2); 1373 tcg_temp_free_i64(t0); 1374 } 1375 1376 static inline void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1377 { 1378 /* some cases can be optimized here */ 1379 if (arg2 == 0) { 1380 tcg_gen_mov_i64(ret, arg1); 1381 } else { 1382 TCGv_i64 t0 = tcg_const_i64(arg2); 1383 tcg_gen_sub_i64(ret, arg1, t0); 1384 tcg_temp_free_i64(t0); 1385 } 1386 } 1387 static inline void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1, 1388 int64_t arg2, int label_index) 1389 { 1390 TCGv_i64 t0 = tcg_const_i64(arg2); 1391 tcg_gen_brcond_i64(cond, arg1, t0, label_index); 1392 tcg_temp_free_i64(t0); 1393 } 1394 1395 static inline void tcg_gen_setcondi_i64(TCGCond cond, TCGv_i64 ret, 1396 TCGv_i64 arg1, int64_t arg2) 1397 { 1398 TCGv_i64 t0 = tcg_const_i64(arg2); 1399 tcg_gen_setcond_i64(cond, ret, arg1, t0); 1400 tcg_temp_free_i64(t0); 1401 } 1402 1403 static inline void tcg_gen_muli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 1404 { 1405 TCGv_i64 t0 = tcg_const_i64(arg2); 1406 tcg_gen_mul_i64(ret, arg1, t0); 1407 tcg_temp_free_i64(t0); 1408 } 1409 1410 1411 /***************************************/ 1412 /* optional operations */ 1413 1414 static inline void tcg_gen_ext8s_i32(TCGv_i32 ret, TCGv_i32 arg) 1415 { 1416 #ifdef TCG_TARGET_HAS_ext8s_i32 1417 tcg_gen_op2_i32(INDEX_op_ext8s_i32, ret, arg); 1418 #else 1419 tcg_gen_shli_i32(ret, arg, 24); 1420 tcg_gen_sari_i32(ret, ret, 24); 1421 #endif 1422 } 1423 1424 static inline void tcg_gen_ext16s_i32(TCGv_i32 ret, TCGv_i32 arg) 1425 { 1426 #ifdef TCG_TARGET_HAS_ext16s_i32 1427 tcg_gen_op2_i32(INDEX_op_ext16s_i32, ret, arg); 1428 #else 1429 tcg_gen_shli_i32(ret, arg, 16); 1430 tcg_gen_sari_i32(ret, ret, 16); 1431 #endif 1432 } 1433 1434 static inline void tcg_gen_ext8u_i32(TCGv_i32 ret, TCGv_i32 arg) 1435 { 1436 #ifdef TCG_TARGET_HAS_ext8u_i32 1437 tcg_gen_op2_i32(INDEX_op_ext8u_i32, ret, arg); 1438 #else 1439 tcg_gen_andi_i32(ret, arg, 0xffu); 1440 #endif 1441 } 1442 1443 static inline void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg) 1444 { 1445 #ifdef TCG_TARGET_HAS_ext16u_i32 1446 tcg_gen_op2_i32(INDEX_op_ext16u_i32, ret, arg); 1447 #else 1448 tcg_gen_andi_i32(ret, arg, 0xffffu); 1449 #endif 1450 } 1451 1452 /* Note: we assume the two high bytes are set to zero */ 1453 static inline void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg) 1454 { 1455 #ifdef TCG_TARGET_HAS_bswap16_i32 1456 tcg_gen_op2_i32(INDEX_op_bswap16_i32, ret, arg); 1457 #else 1458 TCGv_i32 t0 = tcg_temp_new_i32(); 1459 1460 tcg_gen_ext8u_i32(t0, arg); 1461 tcg_gen_shli_i32(t0, t0, 8); 1462 tcg_gen_shri_i32(ret, arg, 8); 1463 tcg_gen_or_i32(ret, ret, t0); 1464 tcg_temp_free_i32(t0); 1465 #endif 1466 } 1467 1468 static inline void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg) 1469 { 1470 #ifdef TCG_TARGET_HAS_bswap32_i32 1471 tcg_gen_op2_i32(INDEX_op_bswap32_i32, ret, arg); 1472 #else 1473 TCGv_i32 t0, t1; 1474 t0 = tcg_temp_new_i32(); 1475 t1 = tcg_temp_new_i32(); 1476 1477 tcg_gen_shli_i32(t0, arg, 24); 1478 1479 tcg_gen_andi_i32(t1, arg, 0x0000ff00); 1480 tcg_gen_shli_i32(t1, t1, 8); 1481 tcg_gen_or_i32(t0, t0, t1); 1482 1483 tcg_gen_shri_i32(t1, arg, 8); 1484 tcg_gen_andi_i32(t1, t1, 0x0000ff00); 1485 tcg_gen_or_i32(t0, t0, t1); 1486 1487 tcg_gen_shri_i32(t1, arg, 24); 1488 tcg_gen_or_i32(ret, t0, t1); 1489 tcg_temp_free_i32(t0); 1490 tcg_temp_free_i32(t1); 1491 #endif 1492 } 1493 1494 #if TCG_TARGET_REG_BITS == 32 1495 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg) 1496 { 1497 tcg_gen_ext8s_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1498 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 1499 } 1500 1501 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg) 1502 { 1503 tcg_gen_ext16s_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1504 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 1505 } 1506 1507 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg) 1508 { 1509 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1510 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 1511 } 1512 1513 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg) 1514 { 1515 tcg_gen_ext8u_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1516 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 1517 } 1518 1519 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg) 1520 { 1521 tcg_gen_ext16u_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1522 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 1523 } 1524 1525 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg) 1526 { 1527 tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1528 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 1529 } 1530 1531 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg) 1532 { 1533 tcg_gen_mov_i32(ret, TCGV_LOW(arg)); 1534 } 1535 1536 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 1537 { 1538 tcg_gen_mov_i32(TCGV_LOW(ret), arg); 1539 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 1540 } 1541 1542 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 1543 { 1544 tcg_gen_mov_i32(TCGV_LOW(ret), arg); 1545 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 1546 } 1547 1548 /* Note: we assume the six high bytes are set to zero */ 1549 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) 1550 { 1551 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 1552 tcg_gen_bswap16_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1553 } 1554 1555 /* Note: we assume the four high bytes are set to zero */ 1556 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) 1557 { 1558 tcg_gen_mov_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 1559 tcg_gen_bswap32_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1560 } 1561 1562 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) 1563 { 1564 TCGv_i32 t0, t1; 1565 t0 = tcg_temp_new_i32(); 1566 t1 = tcg_temp_new_i32(); 1567 1568 tcg_gen_bswap32_i32(t0, TCGV_LOW(arg)); 1569 tcg_gen_bswap32_i32(t1, TCGV_HIGH(arg)); 1570 tcg_gen_mov_i32(TCGV_LOW(ret), t1); 1571 tcg_gen_mov_i32(TCGV_HIGH(ret), t0); 1572 tcg_temp_free_i32(t0); 1573 tcg_temp_free_i32(t1); 1574 } 1575 #else 1576 1577 static inline void tcg_gen_ext8s_i64(TCGv_i64 ret, TCGv_i64 arg) 1578 { 1579 #ifdef TCG_TARGET_HAS_ext8s_i64 1580 tcg_gen_op2_i64(INDEX_op_ext8s_i64, ret, arg); 1581 #else 1582 tcg_gen_shli_i64(ret, arg, 56); 1583 tcg_gen_sari_i64(ret, ret, 56); 1584 #endif 1585 } 1586 1587 static inline void tcg_gen_ext16s_i64(TCGv_i64 ret, TCGv_i64 arg) 1588 { 1589 #ifdef TCG_TARGET_HAS_ext16s_i64 1590 tcg_gen_op2_i64(INDEX_op_ext16s_i64, ret, arg); 1591 #else 1592 tcg_gen_shli_i64(ret, arg, 48); 1593 tcg_gen_sari_i64(ret, ret, 48); 1594 #endif 1595 } 1596 1597 static inline void tcg_gen_ext32s_i64(TCGv_i64 ret, TCGv_i64 arg) 1598 { 1599 #ifdef TCG_TARGET_HAS_ext32s_i64 1600 tcg_gen_op2_i64(INDEX_op_ext32s_i64, ret, arg); 1601 #else 1602 tcg_gen_shli_i64(ret, arg, 32); 1603 tcg_gen_sari_i64(ret, ret, 32); 1604 #endif 1605 } 1606 1607 static inline void tcg_gen_ext8u_i64(TCGv_i64 ret, TCGv_i64 arg) 1608 { 1609 #ifdef TCG_TARGET_HAS_ext8u_i64 1610 tcg_gen_op2_i64(INDEX_op_ext8u_i64, ret, arg); 1611 #else 1612 tcg_gen_andi_i64(ret, arg, 0xffu); 1613 #endif 1614 } 1615 1616 static inline void tcg_gen_ext16u_i64(TCGv_i64 ret, TCGv_i64 arg) 1617 { 1618 #ifdef TCG_TARGET_HAS_ext16u_i64 1619 tcg_gen_op2_i64(INDEX_op_ext16u_i64, ret, arg); 1620 #else 1621 tcg_gen_andi_i64(ret, arg, 0xffffu); 1622 #endif 1623 } 1624 1625 static inline void tcg_gen_ext32u_i64(TCGv_i64 ret, TCGv_i64 arg) 1626 { 1627 #ifdef TCG_TARGET_HAS_ext32u_i64 1628 tcg_gen_op2_i64(INDEX_op_ext32u_i64, ret, arg); 1629 #else 1630 tcg_gen_andi_i64(ret, arg, 0xffffffffu); 1631 #endif 1632 } 1633 1634 /* Note: we assume the target supports move between 32 and 64 bit 1635 registers. This will probably break MIPS64 targets. */ 1636 static inline void tcg_gen_trunc_i64_i32(TCGv_i32 ret, TCGv_i64 arg) 1637 { 1638 tcg_gen_mov_i32(ret, MAKE_TCGV_I32(GET_TCGV_I64(arg))); 1639 } 1640 1641 /* Note: we assume the target supports move between 32 and 64 bit 1642 registers */ 1643 static inline void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 1644 { 1645 tcg_gen_ext32u_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); 1646 } 1647 1648 /* Note: we assume the target supports move between 32 and 64 bit 1649 registers */ 1650 static inline void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg) 1651 { 1652 tcg_gen_ext32s_i64(ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); 1653 } 1654 1655 /* Note: we assume the six high bytes are set to zero */ 1656 static inline void tcg_gen_bswap16_i64(TCGv_i64 ret, TCGv_i64 arg) 1657 { 1658 #ifdef TCG_TARGET_HAS_bswap16_i64 1659 tcg_gen_op2_i64(INDEX_op_bswap16_i64, ret, arg); 1660 #else 1661 TCGv_i64 t0 = tcg_temp_new_i64(); 1662 1663 tcg_gen_ext8u_i64(t0, arg); 1664 tcg_gen_shli_i64(t0, t0, 8); 1665 tcg_gen_shri_i64(ret, arg, 8); 1666 tcg_gen_or_i64(ret, ret, t0); 1667 tcg_temp_free_i64(t0); 1668 #endif 1669 } 1670 1671 /* Note: we assume the four high bytes are set to zero */ 1672 static inline void tcg_gen_bswap32_i64(TCGv_i64 ret, TCGv_i64 arg) 1673 { 1674 #ifdef TCG_TARGET_HAS_bswap32_i64 1675 tcg_gen_op2_i64(INDEX_op_bswap32_i64, ret, arg); 1676 #else 1677 TCGv_i64 t0, t1; 1678 t0 = tcg_temp_new_i64(); 1679 t1 = tcg_temp_new_i64(); 1680 1681 tcg_gen_shli_i64(t0, arg, 24); 1682 tcg_gen_ext32u_i64(t0, t0); 1683 1684 tcg_gen_andi_i64(t1, arg, 0x0000ff00); 1685 tcg_gen_shli_i64(t1, t1, 8); 1686 tcg_gen_or_i64(t0, t0, t1); 1687 1688 tcg_gen_shri_i64(t1, arg, 8); 1689 tcg_gen_andi_i64(t1, t1, 0x0000ff00); 1690 tcg_gen_or_i64(t0, t0, t1); 1691 1692 tcg_gen_shri_i64(t1, arg, 24); 1693 tcg_gen_or_i64(ret, t0, t1); 1694 tcg_temp_free_i64(t0); 1695 tcg_temp_free_i64(t1); 1696 #endif 1697 } 1698 1699 static inline void tcg_gen_bswap64_i64(TCGv_i64 ret, TCGv_i64 arg) 1700 { 1701 #ifdef TCG_TARGET_HAS_bswap64_i64 1702 tcg_gen_op2_i64(INDEX_op_bswap64_i64, ret, arg); 1703 #else 1704 TCGv_i64 t0 = tcg_temp_new_i64(); 1705 TCGv_i64 t1 = tcg_temp_new_i64(); 1706 1707 tcg_gen_shli_i64(t0, arg, 56); 1708 1709 tcg_gen_andi_i64(t1, arg, 0x0000ff00); 1710 tcg_gen_shli_i64(t1, t1, 40); 1711 tcg_gen_or_i64(t0, t0, t1); 1712 1713 tcg_gen_andi_i64(t1, arg, 0x00ff0000); 1714 tcg_gen_shli_i64(t1, t1, 24); 1715 tcg_gen_or_i64(t0, t0, t1); 1716 1717 tcg_gen_andi_i64(t1, arg, 0xff000000); 1718 tcg_gen_shli_i64(t1, t1, 8); 1719 tcg_gen_or_i64(t0, t0, t1); 1720 1721 tcg_gen_shri_i64(t1, arg, 8); 1722 tcg_gen_andi_i64(t1, t1, 0xff000000); 1723 tcg_gen_or_i64(t0, t0, t1); 1724 1725 tcg_gen_shri_i64(t1, arg, 24); 1726 tcg_gen_andi_i64(t1, t1, 0x00ff0000); 1727 tcg_gen_or_i64(t0, t0, t1); 1728 1729 tcg_gen_shri_i64(t1, arg, 40); 1730 tcg_gen_andi_i64(t1, t1, 0x0000ff00); 1731 tcg_gen_or_i64(t0, t0, t1); 1732 1733 tcg_gen_shri_i64(t1, arg, 56); 1734 tcg_gen_or_i64(ret, t0, t1); 1735 tcg_temp_free_i64(t0); 1736 tcg_temp_free_i64(t1); 1737 #endif 1738 } 1739 1740 #endif 1741 1742 static inline void tcg_gen_neg_i32(TCGv_i32 ret, TCGv_i32 arg) 1743 { 1744 #ifdef TCG_TARGET_HAS_neg_i32 1745 tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg); 1746 #else 1747 TCGv_i32 t0 = tcg_const_i32(0); 1748 tcg_gen_sub_i32(ret, t0, arg); 1749 tcg_temp_free_i32(t0); 1750 #endif 1751 } 1752 1753 static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg) 1754 { 1755 #ifdef TCG_TARGET_HAS_neg_i64 1756 tcg_gen_op2_i64(INDEX_op_neg_i64, ret, arg); 1757 #else 1758 TCGv_i64 t0 = tcg_const_i64(0); 1759 tcg_gen_sub_i64(ret, t0, arg); 1760 tcg_temp_free_i64(t0); 1761 #endif 1762 } 1763 1764 static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg) 1765 { 1766 #ifdef TCG_TARGET_HAS_not_i32 1767 tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg); 1768 #else 1769 tcg_gen_xori_i32(ret, arg, -1); 1770 #endif 1771 } 1772 1773 static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg) 1774 { 1775 #ifdef TCG_TARGET_HAS_not_i64 1776 tcg_gen_op2_i64(INDEX_op_not_i64, ret, arg); 1777 #elif defined(TCG_TARGET_HAS_not_i32) && TCG_TARGET_REG_BITS == 32 1778 tcg_gen_not_i32(TCGV_LOW(ret), TCGV_LOW(arg)); 1779 tcg_gen_not_i32(TCGV_HIGH(ret), TCGV_HIGH(arg)); 1780 #else 1781 tcg_gen_xori_i64(ret, arg, -1); 1782 #endif 1783 } 1784 1785 static inline void tcg_gen_discard_i32(TCGv_i32 arg) 1786 { 1787 tcg_gen_op1_i32(INDEX_op_discard, arg); 1788 } 1789 1790 #if TCG_TARGET_REG_BITS == 32 1791 static inline void tcg_gen_discard_i64(TCGv_i64 arg) 1792 { 1793 tcg_gen_discard_i32(TCGV_LOW(arg)); 1794 tcg_gen_discard_i32(TCGV_HIGH(arg)); 1795 } 1796 #else 1797 static inline void tcg_gen_discard_i64(TCGv_i64 arg) 1798 { 1799 tcg_gen_op1_i64(INDEX_op_discard, arg); 1800 } 1801 #endif 1802 1803 static inline void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high) 1804 { 1805 #if TCG_TARGET_REG_BITS == 32 1806 tcg_gen_mov_i32(TCGV_LOW(dest), low); 1807 tcg_gen_mov_i32(TCGV_HIGH(dest), high); 1808 #else 1809 TCGv_i64 tmp = tcg_temp_new_i64(); 1810 /* This extension is only needed for type correctness. 1811 We may be able to do better given target specific information. */ 1812 tcg_gen_extu_i32_i64(tmp, high); 1813 tcg_gen_shli_i64(tmp, tmp, 32); 1814 tcg_gen_extu_i32_i64(dest, low); 1815 tcg_gen_or_i64(dest, dest, tmp); 1816 tcg_temp_free_i64(tmp); 1817 #endif 1818 } 1819 1820 static inline void tcg_gen_concat32_i64(TCGv_i64 dest, TCGv_i64 low, TCGv_i64 high) 1821 { 1822 #if TCG_TARGET_REG_BITS == 32 1823 tcg_gen_concat_i32_i64(dest, TCGV_LOW(low), TCGV_LOW(high)); 1824 #else 1825 TCGv_i64 tmp = tcg_temp_new_i64(); 1826 tcg_gen_ext32u_i64(dest, low); 1827 tcg_gen_shli_i64(tmp, high, 32); 1828 tcg_gen_or_i64(dest, dest, tmp); 1829 tcg_temp_free_i64(tmp); 1830 #endif 1831 } 1832 1833 static inline void tcg_gen_andc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1834 { 1835 #ifdef TCG_TARGET_HAS_andc_i32 1836 tcg_gen_op3_i32(INDEX_op_andc_i32, ret, arg1, arg2); 1837 #else 1838 TCGv_i32 t0; 1839 t0 = tcg_temp_new_i32(); 1840 tcg_gen_not_i32(t0, arg2); 1841 tcg_gen_and_i32(ret, arg1, t0); 1842 tcg_temp_free_i32(t0); 1843 #endif 1844 } 1845 1846 static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1847 { 1848 #ifdef TCG_TARGET_HAS_andc_i64 1849 tcg_gen_op3_i64(INDEX_op_andc_i64, ret, arg1, arg2); 1850 #elif defined(TCG_TARGET_HAS_andc_i32) && TCG_TARGET_REG_BITS == 32 1851 tcg_gen_andc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1852 tcg_gen_andc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1853 #else 1854 TCGv_i64 t0; 1855 t0 = tcg_temp_new_i64(); 1856 tcg_gen_not_i64(t0, arg2); 1857 tcg_gen_and_i64(ret, arg1, t0); 1858 tcg_temp_free_i64(t0); 1859 #endif 1860 } 1861 1862 static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1863 { 1864 #ifdef TCG_TARGET_HAS_eqv_i32 1865 tcg_gen_op3_i32(INDEX_op_eqv_i32, ret, arg1, arg2); 1866 #else 1867 tcg_gen_xor_i32(ret, arg1, arg2); 1868 tcg_gen_not_i32(ret, ret); 1869 #endif 1870 } 1871 1872 static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1873 { 1874 #ifdef TCG_TARGET_HAS_eqv_i64 1875 tcg_gen_op3_i64(INDEX_op_eqv_i64, ret, arg1, arg2); 1876 #elif defined(TCG_TARGET_HAS_eqv_i32) && TCG_TARGET_REG_BITS == 32 1877 tcg_gen_eqv_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1878 tcg_gen_eqv_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1879 #else 1880 tcg_gen_xor_i64(ret, arg1, arg2); 1881 tcg_gen_not_i64(ret, ret); 1882 #endif 1883 } 1884 1885 static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1886 { 1887 #ifdef TCG_TARGET_HAS_nand_i32 1888 tcg_gen_op3_i32(INDEX_op_nand_i32, ret, arg1, arg2); 1889 #else 1890 tcg_gen_and_i32(ret, arg1, arg2); 1891 tcg_gen_not_i32(ret, ret); 1892 #endif 1893 } 1894 1895 static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1896 { 1897 #ifdef TCG_TARGET_HAS_nand_i64 1898 tcg_gen_op3_i64(INDEX_op_nand_i64, ret, arg1, arg2); 1899 #elif defined(TCG_TARGET_HAS_nand_i32) && TCG_TARGET_REG_BITS == 32 1900 tcg_gen_nand_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1901 tcg_gen_nand_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1902 #else 1903 tcg_gen_and_i64(ret, arg1, arg2); 1904 tcg_gen_not_i64(ret, ret); 1905 #endif 1906 } 1907 1908 static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1909 { 1910 #ifdef TCG_TARGET_HAS_nor_i32 1911 tcg_gen_op3_i32(INDEX_op_nor_i32, ret, arg1, arg2); 1912 #else 1913 tcg_gen_or_i32(ret, arg1, arg2); 1914 tcg_gen_not_i32(ret, ret); 1915 #endif 1916 } 1917 1918 static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1919 { 1920 #ifdef TCG_TARGET_HAS_nor_i64 1921 tcg_gen_op3_i64(INDEX_op_nor_i64, ret, arg1, arg2); 1922 #elif defined(TCG_TARGET_HAS_nor_i32) && TCG_TARGET_REG_BITS == 32 1923 tcg_gen_nor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1924 tcg_gen_nor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1925 #else 1926 tcg_gen_or_i64(ret, arg1, arg2); 1927 tcg_gen_not_i64(ret, ret); 1928 #endif 1929 } 1930 1931 static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1932 { 1933 #ifdef TCG_TARGET_HAS_orc_i32 1934 tcg_gen_op3_i32(INDEX_op_orc_i32, ret, arg1, arg2); 1935 #else 1936 TCGv_i32 t0; 1937 t0 = tcg_temp_new_i32(); 1938 tcg_gen_not_i32(t0, arg2); 1939 tcg_gen_or_i32(ret, arg1, t0); 1940 tcg_temp_free_i32(t0); 1941 #endif 1942 } 1943 1944 static inline void tcg_gen_orc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1945 { 1946 #ifdef TCG_TARGET_HAS_orc_i64 1947 tcg_gen_op3_i64(INDEX_op_orc_i64, ret, arg1, arg2); 1948 #elif defined(TCG_TARGET_HAS_orc_i32) && TCG_TARGET_REG_BITS == 32 1949 tcg_gen_orc_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); 1950 tcg_gen_orc_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); 1951 #else 1952 TCGv_i64 t0; 1953 t0 = tcg_temp_new_i64(); 1954 tcg_gen_not_i64(t0, arg2); 1955 tcg_gen_or_i64(ret, arg1, t0); 1956 tcg_temp_free_i64(t0); 1957 #endif 1958 } 1959 1960 static inline void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 1961 { 1962 #ifdef TCG_TARGET_HAS_rot_i32 1963 tcg_gen_op3_i32(INDEX_op_rotl_i32, ret, arg1, arg2); 1964 #else 1965 TCGv_i32 t0, t1; 1966 1967 t0 = tcg_temp_new_i32(); 1968 t1 = tcg_temp_new_i32(); 1969 tcg_gen_shl_i32(t0, arg1, arg2); 1970 tcg_gen_subfi_i32(t1, 32, arg2); 1971 tcg_gen_shr_i32(t1, arg1, t1); 1972 tcg_gen_or_i32(ret, t0, t1); 1973 tcg_temp_free_i32(t0); 1974 tcg_temp_free_i32(t1); 1975 #endif 1976 } 1977 1978 static inline void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 1979 { 1980 #ifdef TCG_TARGET_HAS_rot_i64 1981 tcg_gen_op3_i64(INDEX_op_rotl_i64, ret, arg1, arg2); 1982 #else 1983 TCGv_i64 t0, t1; 1984 1985 t0 = tcg_temp_new_i64(); 1986 t1 = tcg_temp_new_i64(); 1987 tcg_gen_shl_i64(t0, arg1, arg2); 1988 tcg_gen_subfi_i64(t1, 64, arg2); 1989 tcg_gen_shr_i64(t1, arg1, t1); 1990 tcg_gen_or_i64(ret, t0, t1); 1991 tcg_temp_free_i64(t0); 1992 tcg_temp_free_i64(t1); 1993 #endif 1994 } 1995 1996 static inline void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 1997 { 1998 /* some cases can be optimized here */ 1999 if (arg2 == 0) { 2000 tcg_gen_mov_i32(ret, arg1); 2001 } else { 2002 #ifdef TCG_TARGET_HAS_rot_i32 2003 TCGv_i32 t0 = tcg_const_i32(arg2); 2004 tcg_gen_rotl_i32(ret, arg1, t0); 2005 tcg_temp_free_i32(t0); 2006 #else 2007 TCGv_i32 t0, t1; 2008 t0 = tcg_temp_new_i32(); 2009 t1 = tcg_temp_new_i32(); 2010 tcg_gen_shli_i32(t0, arg1, arg2); 2011 tcg_gen_shri_i32(t1, arg1, 32 - arg2); 2012 tcg_gen_or_i32(ret, t0, t1); 2013 tcg_temp_free_i32(t0); 2014 tcg_temp_free_i32(t1); 2015 #endif 2016 } 2017 } 2018 2019 static inline void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 2020 { 2021 /* some cases can be optimized here */ 2022 if (arg2 == 0) { 2023 tcg_gen_mov_i64(ret, arg1); 2024 } else { 2025 #ifdef TCG_TARGET_HAS_rot_i64 2026 TCGv_i64 t0 = tcg_const_i64(arg2); 2027 tcg_gen_rotl_i64(ret, arg1, t0); 2028 tcg_temp_free_i64(t0); 2029 #else 2030 TCGv_i64 t0, t1; 2031 t0 = tcg_temp_new_i64(); 2032 t1 = tcg_temp_new_i64(); 2033 tcg_gen_shli_i64(t0, arg1, arg2); 2034 tcg_gen_shri_i64(t1, arg1, 64 - arg2); 2035 tcg_gen_or_i64(ret, t0, t1); 2036 tcg_temp_free_i64(t0); 2037 tcg_temp_free_i64(t1); 2038 #endif 2039 } 2040 } 2041 2042 static inline void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) 2043 { 2044 #ifdef TCG_TARGET_HAS_rot_i32 2045 tcg_gen_op3_i32(INDEX_op_rotr_i32, ret, arg1, arg2); 2046 #else 2047 TCGv_i32 t0, t1; 2048 2049 t0 = tcg_temp_new_i32(); 2050 t1 = tcg_temp_new_i32(); 2051 tcg_gen_shr_i32(t0, arg1, arg2); 2052 tcg_gen_subfi_i32(t1, 32, arg2); 2053 tcg_gen_shl_i32(t1, arg1, t1); 2054 tcg_gen_or_i32(ret, t0, t1); 2055 tcg_temp_free_i32(t0); 2056 tcg_temp_free_i32(t1); 2057 #endif 2058 } 2059 2060 static inline void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) 2061 { 2062 #ifdef TCG_TARGET_HAS_rot_i64 2063 tcg_gen_op3_i64(INDEX_op_rotr_i64, ret, arg1, arg2); 2064 #else 2065 TCGv_i64 t0, t1; 2066 2067 t0 = tcg_temp_new_i64(); 2068 t1 = tcg_temp_new_i64(); 2069 tcg_gen_shr_i64(t0, arg1, arg2); 2070 tcg_gen_subfi_i64(t1, 64, arg2); 2071 tcg_gen_shl_i64(t1, arg1, t1); 2072 tcg_gen_or_i64(ret, t0, t1); 2073 tcg_temp_free_i64(t0); 2074 tcg_temp_free_i64(t1); 2075 #endif 2076 } 2077 2078 static inline void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) 2079 { 2080 /* some cases can be optimized here */ 2081 if (arg2 == 0) { 2082 tcg_gen_mov_i32(ret, arg1); 2083 } else { 2084 tcg_gen_rotli_i32(ret, arg1, 32 - arg2); 2085 } 2086 } 2087 2088 static inline void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) 2089 { 2090 /* some cases can be optimized here */ 2091 if (arg2 == 0) { 2092 tcg_gen_mov_i64(ret, arg1); 2093 } else { 2094 tcg_gen_rotli_i64(ret, arg1, 64 - arg2); 2095 } 2096 } 2097 2098 static inline void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, 2099 TCGv_i32 arg2, unsigned int ofs, 2100 unsigned int len) 2101 { 2102 #ifdef TCG_TARGET_HAS_deposit_i32 2103 tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len); 2104 #else 2105 uint32_t mask = (1u << len) - 1; 2106 TCGv_i32 t1 = tcg_temp_new_i32 (); 2107 2108 tcg_gen_andi_i32(t1, arg2, mask); 2109 tcg_gen_shli_i32(t1, t1, ofs); 2110 tcg_gen_andi_i32(ret, arg1, ~(mask << ofs)); 2111 tcg_gen_or_i32(ret, ret, t1); 2112 2113 tcg_temp_free_i32(t1); 2114 #endif 2115 } 2116 2117 static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, 2118 TCGv_i64 arg2, unsigned int ofs, 2119 unsigned int len) 2120 { 2121 #ifdef TCG_TARGET_HAS_deposit_i64 2122 tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len); 2123 #else 2124 uint64_t mask = (1ull << len) - 1; 2125 TCGv_i64 t1 = tcg_temp_new_i64 (); 2126 2127 tcg_gen_andi_i64(t1, arg2, mask); 2128 tcg_gen_shli_i64(t1, t1, ofs); 2129 tcg_gen_andi_i64(ret, arg1, ~(mask << ofs)); 2130 tcg_gen_or_i64(ret, ret, t1); 2131 2132 tcg_temp_free_i64(t1); 2133 #endif 2134 } 2135 2136 /***************************************/ 2137 /* QEMU specific operations. Their type depend on the QEMU CPU 2138 type. */ 2139 #ifndef TARGET_LONG_BITS 2140 #error must include QEMU headers 2141 #endif 2142 2143 #if TARGET_LONG_BITS == 32 2144 #define TCGv TCGv_i32 2145 #define tcg_temp_new() tcg_temp_new_i32() 2146 #define tcg_global_reg_new tcg_global_reg_new_i32 2147 #define tcg_global_mem_new tcg_global_mem_new_i32 2148 #define tcg_temp_local_new() tcg_temp_local_new_i32() 2149 #define tcg_temp_free tcg_temp_free_i32 2150 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i32 2151 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i32 2152 #define TCGV_UNUSED(x) TCGV_UNUSED_I32(x) 2153 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b) 2154 #else 2155 #define TCGv TCGv_i64 2156 #define tcg_temp_new() tcg_temp_new_i64() 2157 #define tcg_global_reg_new tcg_global_reg_new_i64 2158 #define tcg_global_mem_new tcg_global_mem_new_i64 2159 #define tcg_temp_local_new() tcg_temp_local_new_i64() 2160 #define tcg_temp_free tcg_temp_free_i64 2161 #define tcg_gen_qemu_ldst_op tcg_gen_op3i_i64 2162 #define tcg_gen_qemu_ldst_op_i64 tcg_gen_qemu_ldst_op_i64_i64 2163 #define TCGV_UNUSED(x) TCGV_UNUSED_I64(x) 2164 #define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b) 2165 #endif 2166 2167 /* debug info: write the PC of the corresponding QEMU CPU instruction */ 2168 static inline void tcg_gen_debug_insn_start(uint64_t pc) 2169 { 2170 /* XXX: must really use a 32 bit size for TCGArg in all cases */ 2171 #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS 2172 tcg_gen_op2ii(INDEX_op_debug_insn_start, 2173 (uint32_t)(pc), (uint32_t)(pc >> 32)); 2174 #else 2175 tcg_gen_op1i(INDEX_op_debug_insn_start, pc); 2176 #endif 2177 } 2178 2179 static inline void tcg_gen_exit_tb(tcg_target_long val) 2180 { 2181 tcg_gen_op1i(INDEX_op_exit_tb, val); 2182 } 2183 2184 static inline void tcg_gen_goto_tb(int idx) 2185 { 2186 tcg_gen_op1i(INDEX_op_goto_tb, idx); 2187 } 2188 2189 #if TCG_TARGET_REG_BITS == 32 2190 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index) 2191 { 2192 #if TARGET_LONG_BITS == 32 2193 tcg_gen_op3i_i32(INDEX_op_qemu_ld8u, ret, addr, mem_index); 2194 #else 2195 tcg_gen_op4i_i32(INDEX_op_qemu_ld8u, TCGV_LOW(ret), TCGV_LOW(addr), 2196 TCGV_HIGH(addr), mem_index); 2197 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 2198 #endif 2199 } 2200 2201 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index) 2202 { 2203 #if TARGET_LONG_BITS == 32 2204 tcg_gen_op3i_i32(INDEX_op_qemu_ld8s, ret, addr, mem_index); 2205 #else 2206 tcg_gen_op4i_i32(INDEX_op_qemu_ld8s, TCGV_LOW(ret), TCGV_LOW(addr), 2207 TCGV_HIGH(addr), mem_index); 2208 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 2209 #endif 2210 } 2211 2212 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index) 2213 { 2214 #if TARGET_LONG_BITS == 32 2215 tcg_gen_op3i_i32(INDEX_op_qemu_ld16u, ret, addr, mem_index); 2216 #else 2217 tcg_gen_op4i_i32(INDEX_op_qemu_ld16u, TCGV_LOW(ret), TCGV_LOW(addr), 2218 TCGV_HIGH(addr), mem_index); 2219 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 2220 #endif 2221 } 2222 2223 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index) 2224 { 2225 #if TARGET_LONG_BITS == 32 2226 tcg_gen_op3i_i32(INDEX_op_qemu_ld16s, ret, addr, mem_index); 2227 #else 2228 tcg_gen_op4i_i32(INDEX_op_qemu_ld16s, TCGV_LOW(ret), TCGV_LOW(addr), 2229 TCGV_HIGH(addr), mem_index); 2230 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 2231 #endif 2232 } 2233 2234 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index) 2235 { 2236 #if TARGET_LONG_BITS == 32 2237 tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index); 2238 #else 2239 tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr), 2240 TCGV_HIGH(addr), mem_index); 2241 tcg_gen_movi_i32(TCGV_HIGH(ret), 0); 2242 #endif 2243 } 2244 2245 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index) 2246 { 2247 #if TARGET_LONG_BITS == 32 2248 tcg_gen_op3i_i32(INDEX_op_qemu_ld32, ret, addr, mem_index); 2249 #else 2250 tcg_gen_op4i_i32(INDEX_op_qemu_ld32, TCGV_LOW(ret), TCGV_LOW(addr), 2251 TCGV_HIGH(addr), mem_index); 2252 tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31); 2253 #endif 2254 } 2255 2256 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index) 2257 { 2258 #if TARGET_LONG_BITS == 32 2259 tcg_gen_op4i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), addr, mem_index); 2260 #else 2261 tcg_gen_op5i_i32(INDEX_op_qemu_ld64, TCGV_LOW(ret), TCGV_HIGH(ret), 2262 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index); 2263 #endif 2264 } 2265 2266 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index) 2267 { 2268 #if TARGET_LONG_BITS == 32 2269 tcg_gen_op3i_i32(INDEX_op_qemu_st8, arg, addr, mem_index); 2270 #else 2271 tcg_gen_op4i_i32(INDEX_op_qemu_st8, TCGV_LOW(arg), TCGV_LOW(addr), 2272 TCGV_HIGH(addr), mem_index); 2273 #endif 2274 } 2275 2276 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index) 2277 { 2278 #if TARGET_LONG_BITS == 32 2279 tcg_gen_op3i_i32(INDEX_op_qemu_st16, arg, addr, mem_index); 2280 #else 2281 tcg_gen_op4i_i32(INDEX_op_qemu_st16, TCGV_LOW(arg), TCGV_LOW(addr), 2282 TCGV_HIGH(addr), mem_index); 2283 #endif 2284 } 2285 2286 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index) 2287 { 2288 #if TARGET_LONG_BITS == 32 2289 tcg_gen_op3i_i32(INDEX_op_qemu_st32, arg, addr, mem_index); 2290 #else 2291 tcg_gen_op4i_i32(INDEX_op_qemu_st32, TCGV_LOW(arg), TCGV_LOW(addr), 2292 TCGV_HIGH(addr), mem_index); 2293 #endif 2294 } 2295 2296 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index) 2297 { 2298 #if TARGET_LONG_BITS == 32 2299 tcg_gen_op4i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), addr, 2300 mem_index); 2301 #else 2302 tcg_gen_op5i_i32(INDEX_op_qemu_st64, TCGV_LOW(arg), TCGV_HIGH(arg), 2303 TCGV_LOW(addr), TCGV_HIGH(addr), mem_index); 2304 #endif 2305 } 2306 2307 #define tcg_gen_ld_ptr tcg_gen_ld_i32 2308 #define tcg_gen_discard_ptr tcg_gen_discard_i32 2309 2310 #else /* TCG_TARGET_REG_BITS == 32 */ 2311 2312 static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index) 2313 { 2314 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8u, ret, addr, mem_index); 2315 } 2316 2317 static inline void tcg_gen_qemu_ld8s(TCGv ret, TCGv addr, int mem_index) 2318 { 2319 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld8s, ret, addr, mem_index); 2320 } 2321 2322 static inline void tcg_gen_qemu_ld16u(TCGv ret, TCGv addr, int mem_index) 2323 { 2324 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16u, ret, addr, mem_index); 2325 } 2326 2327 static inline void tcg_gen_qemu_ld16s(TCGv ret, TCGv addr, int mem_index) 2328 { 2329 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld16s, ret, addr, mem_index); 2330 } 2331 2332 static inline void tcg_gen_qemu_ld32u(TCGv ret, TCGv addr, int mem_index) 2333 { 2334 #if TARGET_LONG_BITS == 32 2335 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index); 2336 #else 2337 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32u, ret, addr, mem_index); 2338 #endif 2339 } 2340 2341 static inline void tcg_gen_qemu_ld32s(TCGv ret, TCGv addr, int mem_index) 2342 { 2343 #if TARGET_LONG_BITS == 32 2344 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32, ret, addr, mem_index); 2345 #else 2346 tcg_gen_qemu_ldst_op(INDEX_op_qemu_ld32s, ret, addr, mem_index); 2347 #endif 2348 } 2349 2350 static inline void tcg_gen_qemu_ld64(TCGv_i64 ret, TCGv addr, int mem_index) 2351 { 2352 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_ld64, ret, addr, mem_index); 2353 } 2354 2355 static inline void tcg_gen_qemu_st8(TCGv arg, TCGv addr, int mem_index) 2356 { 2357 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st8, arg, addr, mem_index); 2358 } 2359 2360 static inline void tcg_gen_qemu_st16(TCGv arg, TCGv addr, int mem_index) 2361 { 2362 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st16, arg, addr, mem_index); 2363 } 2364 2365 static inline void tcg_gen_qemu_st32(TCGv arg, TCGv addr, int mem_index) 2366 { 2367 tcg_gen_qemu_ldst_op(INDEX_op_qemu_st32, arg, addr, mem_index); 2368 } 2369 2370 static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index) 2371 { 2372 tcg_gen_qemu_ldst_op_i64(INDEX_op_qemu_st64, arg, addr, mem_index); 2373 } 2374 2375 #define tcg_gen_ld_ptr tcg_gen_ld_i64 2376 #define tcg_gen_discard_ptr tcg_gen_discard_i64 2377 2378 #endif /* TCG_TARGET_REG_BITS != 32 */ 2379 2380 #if TARGET_LONG_BITS == 64 2381 #define tcg_gen_movi_tl tcg_gen_movi_i64 2382 #define tcg_gen_mov_tl tcg_gen_mov_i64 2383 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i64 2384 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i64 2385 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i64 2386 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i64 2387 #define tcg_gen_ld32u_tl tcg_gen_ld32u_i64 2388 #define tcg_gen_ld32s_tl tcg_gen_ld32s_i64 2389 #define tcg_gen_ld_tl tcg_gen_ld_i64 2390 #define tcg_gen_st8_tl tcg_gen_st8_i64 2391 #define tcg_gen_st16_tl tcg_gen_st16_i64 2392 #define tcg_gen_st32_tl tcg_gen_st32_i64 2393 #define tcg_gen_st_tl tcg_gen_st_i64 2394 #define tcg_gen_add_tl tcg_gen_add_i64 2395 #define tcg_gen_addi_tl tcg_gen_addi_i64 2396 #define tcg_gen_sub_tl tcg_gen_sub_i64 2397 #define tcg_gen_neg_tl tcg_gen_neg_i64 2398 #define tcg_gen_subfi_tl tcg_gen_subfi_i64 2399 #define tcg_gen_subi_tl tcg_gen_subi_i64 2400 #define tcg_gen_and_tl tcg_gen_and_i64 2401 #define tcg_gen_andi_tl tcg_gen_andi_i64 2402 #define tcg_gen_or_tl tcg_gen_or_i64 2403 #define tcg_gen_ori_tl tcg_gen_ori_i64 2404 #define tcg_gen_xor_tl tcg_gen_xor_i64 2405 #define tcg_gen_xori_tl tcg_gen_xori_i64 2406 #define tcg_gen_not_tl tcg_gen_not_i64 2407 #define tcg_gen_shl_tl tcg_gen_shl_i64 2408 #define tcg_gen_shli_tl tcg_gen_shli_i64 2409 #define tcg_gen_shr_tl tcg_gen_shr_i64 2410 #define tcg_gen_shri_tl tcg_gen_shri_i64 2411 #define tcg_gen_sar_tl tcg_gen_sar_i64 2412 #define tcg_gen_sari_tl tcg_gen_sari_i64 2413 #define tcg_gen_brcond_tl tcg_gen_brcond_i64 2414 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i64 2415 #define tcg_gen_setcond_tl tcg_gen_setcond_i64 2416 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i64 2417 #define tcg_gen_mul_tl tcg_gen_mul_i64 2418 #define tcg_gen_muli_tl tcg_gen_muli_i64 2419 #define tcg_gen_div_tl tcg_gen_div_i64 2420 #define tcg_gen_rem_tl tcg_gen_rem_i64 2421 #define tcg_gen_divu_tl tcg_gen_divu_i64 2422 #define tcg_gen_remu_tl tcg_gen_remu_i64 2423 #define tcg_gen_discard_tl tcg_gen_discard_i64 2424 #define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32 2425 #define tcg_gen_trunc_i64_tl tcg_gen_mov_i64 2426 #define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64 2427 #define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64 2428 #define tcg_gen_extu_tl_i64 tcg_gen_mov_i64 2429 #define tcg_gen_ext_tl_i64 tcg_gen_mov_i64 2430 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i64 2431 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i64 2432 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i64 2433 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i64 2434 #define tcg_gen_ext32u_tl tcg_gen_ext32u_i64 2435 #define tcg_gen_ext32s_tl tcg_gen_ext32s_i64 2436 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i64 2437 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i64 2438 #define tcg_gen_bswap64_tl tcg_gen_bswap64_i64 2439 #define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64 2440 #define tcg_gen_andc_tl tcg_gen_andc_i64 2441 #define tcg_gen_eqv_tl tcg_gen_eqv_i64 2442 #define tcg_gen_nand_tl tcg_gen_nand_i64 2443 #define tcg_gen_nor_tl tcg_gen_nor_i64 2444 #define tcg_gen_orc_tl tcg_gen_orc_i64 2445 #define tcg_gen_rotl_tl tcg_gen_rotl_i64 2446 #define tcg_gen_rotli_tl tcg_gen_rotli_i64 2447 #define tcg_gen_rotr_tl tcg_gen_rotr_i64 2448 #define tcg_gen_rotri_tl tcg_gen_rotri_i64 2449 #define tcg_gen_deposit_tl tcg_gen_deposit_i64 2450 #define tcg_const_tl tcg_const_i64 2451 #define tcg_const_local_tl tcg_const_local_i64 2452 #else 2453 #define tcg_gen_movi_tl tcg_gen_movi_i32 2454 #define tcg_gen_mov_tl tcg_gen_mov_i32 2455 #define tcg_gen_ld8u_tl tcg_gen_ld8u_i32 2456 #define tcg_gen_ld8s_tl tcg_gen_ld8s_i32 2457 #define tcg_gen_ld16u_tl tcg_gen_ld16u_i32 2458 #define tcg_gen_ld16s_tl tcg_gen_ld16s_i32 2459 #define tcg_gen_ld32u_tl tcg_gen_ld_i32 2460 #define tcg_gen_ld32s_tl tcg_gen_ld_i32 2461 #define tcg_gen_ld_tl tcg_gen_ld_i32 2462 #define tcg_gen_st8_tl tcg_gen_st8_i32 2463 #define tcg_gen_st16_tl tcg_gen_st16_i32 2464 #define tcg_gen_st32_tl tcg_gen_st_i32 2465 #define tcg_gen_st_tl tcg_gen_st_i32 2466 #define tcg_gen_add_tl tcg_gen_add_i32 2467 #define tcg_gen_addi_tl tcg_gen_addi_i32 2468 #define tcg_gen_sub_tl tcg_gen_sub_i32 2469 #define tcg_gen_neg_tl tcg_gen_neg_i32 2470 #define tcg_gen_subfi_tl tcg_gen_subfi_i32 2471 #define tcg_gen_subi_tl tcg_gen_subi_i32 2472 #define tcg_gen_and_tl tcg_gen_and_i32 2473 #define tcg_gen_andi_tl tcg_gen_andi_i32 2474 #define tcg_gen_or_tl tcg_gen_or_i32 2475 #define tcg_gen_ori_tl tcg_gen_ori_i32 2476 #define tcg_gen_xor_tl tcg_gen_xor_i32 2477 #define tcg_gen_xori_tl tcg_gen_xori_i32 2478 #define tcg_gen_not_tl tcg_gen_not_i32 2479 #define tcg_gen_shl_tl tcg_gen_shl_i32 2480 #define tcg_gen_shli_tl tcg_gen_shli_i32 2481 #define tcg_gen_shr_tl tcg_gen_shr_i32 2482 #define tcg_gen_shri_tl tcg_gen_shri_i32 2483 #define tcg_gen_sar_tl tcg_gen_sar_i32 2484 #define tcg_gen_sari_tl tcg_gen_sari_i32 2485 #define tcg_gen_brcond_tl tcg_gen_brcond_i32 2486 #define tcg_gen_brcondi_tl tcg_gen_brcondi_i32 2487 #define tcg_gen_setcond_tl tcg_gen_setcond_i32 2488 #define tcg_gen_setcondi_tl tcg_gen_setcondi_i32 2489 #define tcg_gen_mul_tl tcg_gen_mul_i32 2490 #define tcg_gen_muli_tl tcg_gen_muli_i32 2491 #define tcg_gen_div_tl tcg_gen_div_i32 2492 #define tcg_gen_rem_tl tcg_gen_rem_i32 2493 #define tcg_gen_divu_tl tcg_gen_divu_i32 2494 #define tcg_gen_remu_tl tcg_gen_remu_i32 2495 #define tcg_gen_discard_tl tcg_gen_discard_i32 2496 #define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32 2497 #define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32 2498 #define tcg_gen_extu_i32_tl tcg_gen_mov_i32 2499 #define tcg_gen_ext_i32_tl tcg_gen_mov_i32 2500 #define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64 2501 #define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64 2502 #define tcg_gen_ext8u_tl tcg_gen_ext8u_i32 2503 #define tcg_gen_ext8s_tl tcg_gen_ext8s_i32 2504 #define tcg_gen_ext16u_tl tcg_gen_ext16u_i32 2505 #define tcg_gen_ext16s_tl tcg_gen_ext16s_i32 2506 #define tcg_gen_ext32u_tl tcg_gen_mov_i32 2507 #define tcg_gen_ext32s_tl tcg_gen_mov_i32 2508 #define tcg_gen_bswap16_tl tcg_gen_bswap16_i32 2509 #define tcg_gen_bswap32_tl tcg_gen_bswap32_i32 2510 #define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64 2511 #define tcg_gen_andc_tl tcg_gen_andc_i32 2512 #define tcg_gen_eqv_tl tcg_gen_eqv_i32 2513 #define tcg_gen_nand_tl tcg_gen_nand_i32 2514 #define tcg_gen_nor_tl tcg_gen_nor_i32 2515 #define tcg_gen_orc_tl tcg_gen_orc_i32 2516 #define tcg_gen_rotl_tl tcg_gen_rotl_i32 2517 #define tcg_gen_rotli_tl tcg_gen_rotli_i32 2518 #define tcg_gen_rotr_tl tcg_gen_rotr_i32 2519 #define tcg_gen_rotri_tl tcg_gen_rotri_i32 2520 #define tcg_gen_deposit_tl tcg_gen_deposit_i32 2521 #define tcg_const_tl tcg_const_i32 2522 #define tcg_const_local_tl tcg_const_local_i32 2523 #endif 2524 2525 #if TCG_TARGET_REG_BITS == 32 2526 #define tcg_gen_add_ptr tcg_gen_add_i32 2527 #define tcg_gen_addi_ptr tcg_gen_addi_i32 2528 #define tcg_gen_ext_i32_ptr tcg_gen_mov_i32 2529 #else /* TCG_TARGET_REG_BITS == 32 */ 2530 #define tcg_gen_add_ptr tcg_gen_add_i64 2531 #define tcg_gen_addi_ptr tcg_gen_addi_i64 2532 #define tcg_gen_ext_i32_ptr tcg_gen_ext_i32_i64 2533 #endif /* TCG_TARGET_REG_BITS != 32 */ 2534