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