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" 27c482cb11SRichard Henderson #include "exec/helper-proto.h" 28c482cb11SRichard Henderson #include "exec/cpu_ldst.h" 29c482cb11SRichard Henderson #include "exec/exec-all.h" 30f6bb84d5SEmilio G. Cota #include "exec/tb-lookup.h" 31cedbcb01SEmilio G. Cota #include "disas/disas.h" 32cedbcb01SEmilio G. Cota #include "exec/log.h" 33*dcb32f1dSPhilippe Mathieu-Daudé #include "tcg/tcg.h" 34c896fe29Sbellard 3531d66551SAurelien Jarno /* 32-bit helpers */ 3631d66551SAurelien Jarno 37944eea96SRichard Henderson int32_t HELPER(div_i32)(int32_t arg1, int32_t arg2) 3831d66551SAurelien Jarno { 3931d66551SAurelien Jarno return arg1 / arg2; 4031d66551SAurelien Jarno } 4131d66551SAurelien Jarno 42944eea96SRichard Henderson int32_t HELPER(rem_i32)(int32_t arg1, int32_t arg2) 4331d66551SAurelien Jarno { 4431d66551SAurelien Jarno return arg1 % arg2; 4531d66551SAurelien Jarno } 4631d66551SAurelien Jarno 47944eea96SRichard Henderson uint32_t HELPER(divu_i32)(uint32_t arg1, uint32_t arg2) 4831d66551SAurelien Jarno { 4931d66551SAurelien Jarno return arg1 / arg2; 5031d66551SAurelien Jarno } 5131d66551SAurelien Jarno 52944eea96SRichard Henderson uint32_t HELPER(remu_i32)(uint32_t arg1, uint32_t arg2) 5331d66551SAurelien Jarno { 5431d66551SAurelien Jarno return arg1 % arg2; 5531d66551SAurelien Jarno } 5631d66551SAurelien Jarno 5731d66551SAurelien Jarno /* 64-bit helpers */ 5831d66551SAurelien Jarno 59944eea96SRichard Henderson uint64_t HELPER(shl_i64)(uint64_t arg1, uint64_t arg2) 60c896fe29Sbellard { 61c896fe29Sbellard return arg1 << arg2; 62c896fe29Sbellard } 63c896fe29Sbellard 64944eea96SRichard Henderson uint64_t HELPER(shr_i64)(uint64_t arg1, uint64_t arg2) 65c896fe29Sbellard { 66c896fe29Sbellard return arg1 >> arg2; 67c896fe29Sbellard } 68c896fe29Sbellard 69944eea96SRichard Henderson int64_t HELPER(sar_i64)(int64_t arg1, int64_t arg2) 70944eea96SRichard Henderson { 71944eea96SRichard Henderson return arg1 >> arg2; 72944eea96SRichard Henderson } 73944eea96SRichard Henderson 74944eea96SRichard Henderson int64_t HELPER(div_i64)(int64_t arg1, int64_t arg2) 75c896fe29Sbellard { 76c896fe29Sbellard return arg1 / arg2; 77c896fe29Sbellard } 78c896fe29Sbellard 79944eea96SRichard Henderson int64_t HELPER(rem_i64)(int64_t arg1, int64_t arg2) 80c896fe29Sbellard { 81c7b76a0aSbalrog return arg1 % arg2; 82c896fe29Sbellard } 83c896fe29Sbellard 84944eea96SRichard Henderson uint64_t HELPER(divu_i64)(uint64_t arg1, uint64_t arg2) 85c896fe29Sbellard { 86c896fe29Sbellard return arg1 / arg2; 87c896fe29Sbellard } 88c896fe29Sbellard 89944eea96SRichard Henderson uint64_t HELPER(remu_i64)(uint64_t arg1, uint64_t arg2) 90c896fe29Sbellard { 91c7b76a0aSbalrog return arg1 % arg2; 92c896fe29Sbellard } 93696a8be6SRichard Henderson 94944eea96SRichard Henderson uint64_t HELPER(muluh_i64)(uint64_t arg1, uint64_t arg2) 95696a8be6SRichard Henderson { 96696a8be6SRichard Henderson uint64_t l, h; 97696a8be6SRichard Henderson mulu64(&l, &h, arg1, arg2); 98696a8be6SRichard Henderson return h; 99696a8be6SRichard Henderson } 100696a8be6SRichard Henderson 101944eea96SRichard Henderson int64_t HELPER(mulsh_i64)(int64_t arg1, int64_t arg2) 102696a8be6SRichard Henderson { 103696a8be6SRichard Henderson uint64_t l, h; 104696a8be6SRichard Henderson muls64(&l, &h, arg1, arg2); 105696a8be6SRichard Henderson return h; 106696a8be6SRichard Henderson } 107c482cb11SRichard Henderson 1080e28d006SRichard Henderson uint32_t HELPER(clz_i32)(uint32_t arg, uint32_t zero_val) 1090e28d006SRichard Henderson { 1100e28d006SRichard Henderson return arg ? clz32(arg) : zero_val; 1110e28d006SRichard Henderson } 1120e28d006SRichard Henderson 1130e28d006SRichard Henderson uint32_t HELPER(ctz_i32)(uint32_t arg, uint32_t zero_val) 1140e28d006SRichard Henderson { 1150e28d006SRichard Henderson return arg ? ctz32(arg) : zero_val; 1160e28d006SRichard Henderson } 1170e28d006SRichard Henderson 1180e28d006SRichard Henderson uint64_t HELPER(clz_i64)(uint64_t arg, uint64_t zero_val) 1190e28d006SRichard Henderson { 1200e28d006SRichard Henderson return arg ? clz64(arg) : zero_val; 1210e28d006SRichard Henderson } 1220e28d006SRichard Henderson 1230e28d006SRichard Henderson uint64_t HELPER(ctz_i64)(uint64_t arg, uint64_t zero_val) 1240e28d006SRichard Henderson { 1250e28d006SRichard Henderson return arg ? ctz64(arg) : zero_val; 1260e28d006SRichard Henderson } 1270e28d006SRichard Henderson 128086920c2SRichard Henderson uint32_t HELPER(clrsb_i32)(uint32_t arg) 129086920c2SRichard Henderson { 130086920c2SRichard Henderson return clrsb32(arg); 131086920c2SRichard Henderson } 132086920c2SRichard Henderson 133086920c2SRichard Henderson uint64_t HELPER(clrsb_i64)(uint64_t arg) 134086920c2SRichard Henderson { 135086920c2SRichard Henderson return clrsb64(arg); 136086920c2SRichard Henderson } 137086920c2SRichard Henderson 138a768e4e9SRichard Henderson uint32_t HELPER(ctpop_i32)(uint32_t arg) 139a768e4e9SRichard Henderson { 140a768e4e9SRichard Henderson return ctpop32(arg); 141a768e4e9SRichard Henderson } 142a768e4e9SRichard Henderson 143a768e4e9SRichard Henderson uint64_t HELPER(ctpop_i64)(uint64_t arg) 144a768e4e9SRichard Henderson { 145a768e4e9SRichard Henderson return ctpop64(arg); 146a768e4e9SRichard Henderson } 147a768e4e9SRichard Henderson 1487f11636dSEmilio G. Cota void *HELPER(lookup_tb_ptr)(CPUArchState *env) 149cedbcb01SEmilio G. Cota { 15029a0af61SRichard Henderson CPUState *cpu = env_cpu(env); 151cedbcb01SEmilio G. Cota TranslationBlock *tb; 152cedbcb01SEmilio G. Cota target_ulong cs_base, pc; 153f6bb84d5SEmilio G. Cota uint32_t flags; 154cedbcb01SEmilio G. Cota 1554e2ca83eSEmilio G. Cota tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, curr_cflags()); 156f6bb84d5SEmilio G. Cota if (tb == NULL) { 157b1311c4aSEmilio G. Cota return tcg_ctx->code_gen_epilogue; 158b97a879dSRichard Henderson } 1597f11636dSEmilio G. Cota qemu_log_mask_and_addr(CPU_LOG_EXEC, pc, 1604fad446bSPaolo Bonzini "Chain %d: %p [" 1614fad446bSPaolo Bonzini TARGET_FMT_lx "/" TARGET_FMT_lx "/%#x] %s\n", 1624fad446bSPaolo Bonzini cpu->cpu_index, tb->tc.ptr, cs_base, pc, flags, 1637f11636dSEmilio G. Cota lookup_symbol(pc)); 164e7e168f4SEmilio G. Cota return tb->tc.ptr; 165cedbcb01SEmilio G. Cota } 166cedbcb01SEmilio G. Cota 167df79b996SRichard Henderson void HELPER(exit_atomic)(CPUArchState *env) 168df79b996SRichard Henderson { 16929a0af61SRichard Henderson cpu_loop_exit_atomic(env_cpu(env), GETPC()); 170df79b996SRichard Henderson } 171