1 /* This file is part of the dynarmic project.
2 * Copyright (c) 2018 MerryMage
3 * SPDX-License-Identifier: 0BSD
4 */
5
6 #include "frontend/A64/translate/impl/impl.h"
7
8 namespace Dynarmic::A64 {
9
CSEL(bool sf,Reg Rm,Cond cond,Reg Rn,Reg Rd)10 bool TranslatorVisitor::CSEL(bool sf, Reg Rm, Cond cond, Reg Rn, Reg Rd) {
11 const size_t datasize = sf ? 64 : 32;
12
13 const IR::U32U64 operand1 = X(datasize, Rn);
14 const IR::U32U64 operand2 = X(datasize, Rm);
15
16 const IR::U32U64 result = ir.ConditionalSelect(cond, operand1, operand2);
17
18 X(datasize, Rd, result);
19 return true;
20 }
21
CSINC(bool sf,Reg Rm,Cond cond,Reg Rn,Reg Rd)22 bool TranslatorVisitor::CSINC(bool sf, Reg Rm, Cond cond, Reg Rn, Reg Rd) {
23 const size_t datasize = sf ? 64 : 32;
24
25 const IR::U32U64 operand1 = X(datasize, Rn);
26 const IR::U32U64 operand2 = X(datasize, Rm);
27
28 const IR::U32U64 result = ir.ConditionalSelect(cond, operand1, ir.Add(operand2, I(datasize, 1)));
29
30 X(datasize, Rd, result);
31 return true;
32 }
33
CSINV(bool sf,Reg Rm,Cond cond,Reg Rn,Reg Rd)34 bool TranslatorVisitor::CSINV(bool sf, Reg Rm, Cond cond, Reg Rn, Reg Rd) {
35 const size_t datasize = sf ? 64 : 32;
36
37 const IR::U32U64 operand1 = X(datasize, Rn);
38 const IR::U32U64 operand2 = X(datasize, Rm);
39
40 const IR::U32U64 result = ir.ConditionalSelect(cond, operand1, ir.Not(operand2));
41
42 X(datasize, Rd, result);
43 return true;
44 }
45
CSNEG(bool sf,Reg Rm,Cond cond,Reg Rn,Reg Rd)46 bool TranslatorVisitor::CSNEG(bool sf, Reg Rm, Cond cond, Reg Rn, Reg Rd) {
47 const size_t datasize = sf ? 64 : 32;
48
49 const IR::U32U64 operand1 = X(datasize, Rn);
50 const IR::U32U64 operand2 = X(datasize, Rm);
51
52 const IR::U32U64 result = ir.ConditionalSelect(cond, operand1, ir.Add(ir.Not(operand2), I(datasize, 1)));
53
54 X(datasize, Rd, result);
55 return true;
56 }
57
58 } // namespace Dynarmic::A64
59