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" 33c896fe29Sbellard 3431d66551SAurelien Jarno /* 32-bit helpers */ 3531d66551SAurelien Jarno 36944eea96SRichard Henderson int32_t HELPER(div_i32)(int32_t arg1, int32_t arg2) 3731d66551SAurelien Jarno { 3831d66551SAurelien Jarno return arg1 / arg2; 3931d66551SAurelien Jarno } 4031d66551SAurelien Jarno 41944eea96SRichard Henderson int32_t HELPER(rem_i32)(int32_t arg1, int32_t arg2) 4231d66551SAurelien Jarno { 4331d66551SAurelien Jarno return arg1 % arg2; 4431d66551SAurelien Jarno } 4531d66551SAurelien Jarno 46944eea96SRichard Henderson uint32_t HELPER(divu_i32)(uint32_t arg1, uint32_t arg2) 4731d66551SAurelien Jarno { 4831d66551SAurelien Jarno return arg1 / arg2; 4931d66551SAurelien Jarno } 5031d66551SAurelien Jarno 51944eea96SRichard Henderson uint32_t HELPER(remu_i32)(uint32_t arg1, uint32_t arg2) 5231d66551SAurelien Jarno { 5331d66551SAurelien Jarno return arg1 % arg2; 5431d66551SAurelien Jarno } 5531d66551SAurelien Jarno 5631d66551SAurelien Jarno /* 64-bit helpers */ 5731d66551SAurelien Jarno 58944eea96SRichard Henderson uint64_t HELPER(shl_i64)(uint64_t arg1, uint64_t arg2) 59c896fe29Sbellard { 60c896fe29Sbellard return arg1 << arg2; 61c896fe29Sbellard } 62c896fe29Sbellard 63944eea96SRichard Henderson uint64_t HELPER(shr_i64)(uint64_t arg1, uint64_t arg2) 64c896fe29Sbellard { 65c896fe29Sbellard return arg1 >> arg2; 66c896fe29Sbellard } 67c896fe29Sbellard 68944eea96SRichard Henderson int64_t HELPER(sar_i64)(int64_t arg1, int64_t arg2) 69944eea96SRichard Henderson { 70944eea96SRichard Henderson return arg1 >> arg2; 71944eea96SRichard Henderson } 72944eea96SRichard Henderson 73944eea96SRichard Henderson int64_t HELPER(div_i64)(int64_t arg1, int64_t arg2) 74c896fe29Sbellard { 75c896fe29Sbellard return arg1 / arg2; 76c896fe29Sbellard } 77c896fe29Sbellard 78944eea96SRichard Henderson int64_t HELPER(rem_i64)(int64_t arg1, int64_t arg2) 79c896fe29Sbellard { 80c7b76a0aSbalrog return arg1 % arg2; 81c896fe29Sbellard } 82c896fe29Sbellard 83944eea96SRichard Henderson uint64_t HELPER(divu_i64)(uint64_t arg1, uint64_t arg2) 84c896fe29Sbellard { 85c896fe29Sbellard return arg1 / arg2; 86c896fe29Sbellard } 87c896fe29Sbellard 88944eea96SRichard Henderson uint64_t HELPER(remu_i64)(uint64_t arg1, uint64_t arg2) 89c896fe29Sbellard { 90c7b76a0aSbalrog return arg1 % arg2; 91c896fe29Sbellard } 92696a8be6SRichard Henderson 93944eea96SRichard Henderson uint64_t HELPER(muluh_i64)(uint64_t arg1, uint64_t arg2) 94696a8be6SRichard Henderson { 95696a8be6SRichard Henderson uint64_t l, h; 96696a8be6SRichard Henderson mulu64(&l, &h, arg1, arg2); 97696a8be6SRichard Henderson return h; 98696a8be6SRichard Henderson } 99696a8be6SRichard Henderson 100944eea96SRichard Henderson int64_t HELPER(mulsh_i64)(int64_t arg1, int64_t arg2) 101696a8be6SRichard Henderson { 102696a8be6SRichard Henderson uint64_t l, h; 103696a8be6SRichard Henderson muls64(&l, &h, arg1, arg2); 104696a8be6SRichard Henderson return h; 105696a8be6SRichard Henderson } 106c482cb11SRichard Henderson 1070e28d006SRichard Henderson uint32_t HELPER(clz_i32)(uint32_t arg, uint32_t zero_val) 1080e28d006SRichard Henderson { 1090e28d006SRichard Henderson return arg ? clz32(arg) : zero_val; 1100e28d006SRichard Henderson } 1110e28d006SRichard Henderson 1120e28d006SRichard Henderson uint32_t HELPER(ctz_i32)(uint32_t arg, uint32_t zero_val) 1130e28d006SRichard Henderson { 1140e28d006SRichard Henderson return arg ? ctz32(arg) : zero_val; 1150e28d006SRichard Henderson } 1160e28d006SRichard Henderson 1170e28d006SRichard Henderson uint64_t HELPER(clz_i64)(uint64_t arg, uint64_t zero_val) 1180e28d006SRichard Henderson { 1190e28d006SRichard Henderson return arg ? clz64(arg) : zero_val; 1200e28d006SRichard Henderson } 1210e28d006SRichard Henderson 1220e28d006SRichard Henderson uint64_t HELPER(ctz_i64)(uint64_t arg, uint64_t zero_val) 1230e28d006SRichard Henderson { 1240e28d006SRichard Henderson return arg ? ctz64(arg) : zero_val; 1250e28d006SRichard Henderson } 1260e28d006SRichard Henderson 127086920c2SRichard Henderson uint32_t HELPER(clrsb_i32)(uint32_t arg) 128086920c2SRichard Henderson { 129086920c2SRichard Henderson return clrsb32(arg); 130086920c2SRichard Henderson } 131086920c2SRichard Henderson 132086920c2SRichard Henderson uint64_t HELPER(clrsb_i64)(uint64_t arg) 133086920c2SRichard Henderson { 134086920c2SRichard Henderson return clrsb64(arg); 135086920c2SRichard Henderson } 136086920c2SRichard Henderson 137a768e4e9SRichard Henderson uint32_t HELPER(ctpop_i32)(uint32_t arg) 138a768e4e9SRichard Henderson { 139a768e4e9SRichard Henderson return ctpop32(arg); 140a768e4e9SRichard Henderson } 141a768e4e9SRichard Henderson 142a768e4e9SRichard Henderson uint64_t HELPER(ctpop_i64)(uint64_t arg) 143a768e4e9SRichard Henderson { 144a768e4e9SRichard Henderson return ctpop64(arg); 145a768e4e9SRichard Henderson } 146a768e4e9SRichard Henderson 1477f11636dSEmilio G. Cota void *HELPER(lookup_tb_ptr)(CPUArchState *env) 148cedbcb01SEmilio G. Cota { 149*29a0af61SRichard Henderson CPUState *cpu = env_cpu(env); 150cedbcb01SEmilio G. Cota TranslationBlock *tb; 151cedbcb01SEmilio G. Cota target_ulong cs_base, pc; 152f6bb84d5SEmilio G. Cota uint32_t flags; 153cedbcb01SEmilio G. Cota 1544e2ca83eSEmilio G. Cota tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, curr_cflags()); 155f6bb84d5SEmilio G. Cota if (tb == NULL) { 156b1311c4aSEmilio G. Cota return tcg_ctx->code_gen_epilogue; 157b97a879dSRichard Henderson } 1587f11636dSEmilio G. Cota qemu_log_mask_and_addr(CPU_LOG_EXEC, pc, 1594fad446bSPaolo Bonzini "Chain %d: %p [" 1604fad446bSPaolo Bonzini TARGET_FMT_lx "/" TARGET_FMT_lx "/%#x] %s\n", 1614fad446bSPaolo Bonzini cpu->cpu_index, tb->tc.ptr, cs_base, pc, flags, 1627f11636dSEmilio G. Cota lookup_symbol(pc)); 163e7e168f4SEmilio G. Cota return tb->tc.ptr; 164cedbcb01SEmilio G. Cota } 165cedbcb01SEmilio G. Cota 166df79b996SRichard Henderson void HELPER(exit_atomic)(CPUArchState *env) 167df79b996SRichard Henderson { 168*29a0af61SRichard Henderson cpu_loop_exit_atomic(env_cpu(env), GETPC()); 169df79b996SRichard Henderson } 170