1c896fe29Sbellard /* 2c896fe29Sbellard * Tiny Code Generator for QEMU 3c896fe29Sbellard * 4c896fe29Sbellard * Copyright (c) 2008 Fabrice Bellard 5c896fe29Sbellard * 6c896fe29Sbellard * Permission is hereby granted, free of charge, to any person obtaining a copy 7c896fe29Sbellard * of this software and associated documentation files (the "Software"), to deal 8c896fe29Sbellard * in the Software without restriction, including without limitation the rights 9c896fe29Sbellard * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10c896fe29Sbellard * copies of the Software, and to permit persons to whom the Software is 11c896fe29Sbellard * furnished to do so, subject to the following conditions: 12c896fe29Sbellard * 13c896fe29Sbellard * The above copyright notice and this permission notice shall be included in 14c896fe29Sbellard * all copies or substantial portions of the Software. 15c896fe29Sbellard * 16c896fe29Sbellard * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17c896fe29Sbellard * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18c896fe29Sbellard * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19c896fe29Sbellard * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20c896fe29Sbellard * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21c896fe29Sbellard * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22c896fe29Sbellard * THE SOFTWARE. 23c896fe29Sbellard */ 24d38ea87aSPeter Maydell #include "qemu/osdep.h" 25696a8be6SRichard Henderson #include "qemu/host-utils.h" 26c482cb11SRichard Henderson #include "cpu.h" 27*c213ee2dSRichard Henderson #include "exec/helper-proto-common.h" 28c482cb11SRichard Henderson #include "exec/cpu_ldst.h" 29c482cb11SRichard Henderson #include "exec/exec-all.h" 30cedbcb01SEmilio G. Cota #include "disas/disas.h" 31cedbcb01SEmilio G. Cota #include "exec/log.h" 32dcb32f1dSPhilippe Mathieu-Daudé #include "tcg/tcg.h" 33c896fe29Sbellard 34d53106c9SRichard Henderson #define HELPER_H "accel/tcg/tcg-runtime.h" 35d53106c9SRichard Henderson #include "exec/helper-info.c.inc" 36d53106c9SRichard Henderson #undef HELPER_H 37d53106c9SRichard Henderson 3831d66551SAurelien Jarno /* 32-bit helpers */ 3931d66551SAurelien Jarno 40944eea96SRichard Henderson int32_t HELPER(div_i32)(int32_t arg1, int32_t arg2) 4131d66551SAurelien Jarno { 4231d66551SAurelien Jarno return arg1 / arg2; 4331d66551SAurelien Jarno } 4431d66551SAurelien Jarno 45944eea96SRichard Henderson int32_t HELPER(rem_i32)(int32_t arg1, int32_t arg2) 4631d66551SAurelien Jarno { 4731d66551SAurelien Jarno return arg1 % arg2; 4831d66551SAurelien Jarno } 4931d66551SAurelien Jarno 50944eea96SRichard Henderson uint32_t HELPER(divu_i32)(uint32_t arg1, uint32_t arg2) 5131d66551SAurelien Jarno { 5231d66551SAurelien Jarno return arg1 / arg2; 5331d66551SAurelien Jarno } 5431d66551SAurelien Jarno 55944eea96SRichard Henderson uint32_t HELPER(remu_i32)(uint32_t arg1, uint32_t arg2) 5631d66551SAurelien Jarno { 5731d66551SAurelien Jarno return arg1 % arg2; 5831d66551SAurelien Jarno } 5931d66551SAurelien Jarno 6031d66551SAurelien Jarno /* 64-bit helpers */ 6131d66551SAurelien Jarno 62944eea96SRichard Henderson uint64_t HELPER(shl_i64)(uint64_t arg1, uint64_t arg2) 63c896fe29Sbellard { 64c896fe29Sbellard return arg1 << arg2; 65c896fe29Sbellard } 66c896fe29Sbellard 67944eea96SRichard Henderson uint64_t HELPER(shr_i64)(uint64_t arg1, uint64_t arg2) 68c896fe29Sbellard { 69c896fe29Sbellard return arg1 >> arg2; 70c896fe29Sbellard } 71c896fe29Sbellard 72944eea96SRichard Henderson int64_t HELPER(sar_i64)(int64_t arg1, int64_t arg2) 73944eea96SRichard Henderson { 74944eea96SRichard Henderson return arg1 >> arg2; 75944eea96SRichard Henderson } 76944eea96SRichard Henderson 77944eea96SRichard Henderson int64_t HELPER(div_i64)(int64_t arg1, int64_t arg2) 78c896fe29Sbellard { 79c896fe29Sbellard return arg1 / arg2; 80c896fe29Sbellard } 81c896fe29Sbellard 82944eea96SRichard Henderson int64_t HELPER(rem_i64)(int64_t arg1, int64_t arg2) 83c896fe29Sbellard { 84c7b76a0aSbalrog return arg1 % arg2; 85c896fe29Sbellard } 86c896fe29Sbellard 87944eea96SRichard Henderson uint64_t HELPER(divu_i64)(uint64_t arg1, uint64_t arg2) 88c896fe29Sbellard { 89c896fe29Sbellard return arg1 / arg2; 90c896fe29Sbellard } 91c896fe29Sbellard 92944eea96SRichard Henderson uint64_t HELPER(remu_i64)(uint64_t arg1, uint64_t arg2) 93c896fe29Sbellard { 94c7b76a0aSbalrog return arg1 % arg2; 95c896fe29Sbellard } 96696a8be6SRichard Henderson 97944eea96SRichard Henderson uint64_t HELPER(muluh_i64)(uint64_t arg1, uint64_t arg2) 98696a8be6SRichard Henderson { 99696a8be6SRichard Henderson uint64_t l, h; 100696a8be6SRichard Henderson mulu64(&l, &h, arg1, arg2); 101696a8be6SRichard Henderson return h; 102696a8be6SRichard Henderson } 103696a8be6SRichard Henderson 104944eea96SRichard Henderson int64_t HELPER(mulsh_i64)(int64_t arg1, int64_t arg2) 105696a8be6SRichard Henderson { 106696a8be6SRichard Henderson uint64_t l, h; 107696a8be6SRichard Henderson muls64(&l, &h, arg1, arg2); 108696a8be6SRichard Henderson return h; 109696a8be6SRichard Henderson } 110c482cb11SRichard Henderson 1110e28d006SRichard Henderson uint32_t HELPER(clz_i32)(uint32_t arg, uint32_t zero_val) 1120e28d006SRichard Henderson { 1130e28d006SRichard Henderson return arg ? clz32(arg) : zero_val; 1140e28d006SRichard Henderson } 1150e28d006SRichard Henderson 1160e28d006SRichard Henderson uint32_t HELPER(ctz_i32)(uint32_t arg, uint32_t zero_val) 1170e28d006SRichard Henderson { 1180e28d006SRichard Henderson return arg ? ctz32(arg) : zero_val; 1190e28d006SRichard Henderson } 1200e28d006SRichard Henderson 1210e28d006SRichard Henderson uint64_t HELPER(clz_i64)(uint64_t arg, uint64_t zero_val) 1220e28d006SRichard Henderson { 1230e28d006SRichard Henderson return arg ? clz64(arg) : zero_val; 1240e28d006SRichard Henderson } 1250e28d006SRichard Henderson 1260e28d006SRichard Henderson uint64_t HELPER(ctz_i64)(uint64_t arg, uint64_t zero_val) 1270e28d006SRichard Henderson { 1280e28d006SRichard Henderson return arg ? ctz64(arg) : zero_val; 1290e28d006SRichard Henderson } 1300e28d006SRichard Henderson 131086920c2SRichard Henderson uint32_t HELPER(clrsb_i32)(uint32_t arg) 132086920c2SRichard Henderson { 133086920c2SRichard Henderson return clrsb32(arg); 134086920c2SRichard Henderson } 135086920c2SRichard Henderson 136086920c2SRichard Henderson uint64_t HELPER(clrsb_i64)(uint64_t arg) 137086920c2SRichard Henderson { 138086920c2SRichard Henderson return clrsb64(arg); 139086920c2SRichard Henderson } 140086920c2SRichard Henderson 141a768e4e9SRichard Henderson uint32_t HELPER(ctpop_i32)(uint32_t arg) 142a768e4e9SRichard Henderson { 143a768e4e9SRichard Henderson return ctpop32(arg); 144a768e4e9SRichard Henderson } 145a768e4e9SRichard Henderson 146a768e4e9SRichard Henderson uint64_t HELPER(ctpop_i64)(uint64_t arg) 147a768e4e9SRichard Henderson { 148a768e4e9SRichard Henderson return ctpop64(arg); 149a768e4e9SRichard Henderson } 150a768e4e9SRichard Henderson 151df79b996SRichard Henderson void HELPER(exit_atomic)(CPUArchState *env) 152df79b996SRichard Henderson { 15329a0af61SRichard Henderson cpu_loop_exit_atomic(env_cpu(env), GETPC()); 154df79b996SRichard Henderson } 155