ghidra/Ghidra/Processors/PowerPC/data/languages/evx.sinc

130 lines
3.1 KiB
Plaintext

@include "Scalar_SPFP.sinc"
@ifdef IS_ISA
@include "SPE_APU.sinc"
@endif
define pcodeop vectorExclusiveOr;
define pcodeop vectorMergeHigh;
define pcodeop vectorMergeLow;
define pcodeop vectorLoadDoubleWordIntoDoubleWordIndexed;
define pcodeop vectorStoreDoubleOfDoubleIndexed;
define pcodeop initializeAccumulator;
define pcodeop vectorShiftRightWordSigned;
define pcodeop vectorShiftRightWordUnsigned;
:evxor vrD_64_0,vrA_64_0,vrB_64_0 is OP=4 & vrD_64_0 & vrA_64_0 & vrB_64_0 & XOP_0_10=534
{
vrD_64_0 = vrA_64_0 ^ vrB_64_0;
}
:evmergehi S,A,B is OP=4 & S & A & B & XOP_0_10=556
{
vectorMergeHigh(S,A,B);
}
:evmergelo S,A,B is OP=4 & S & A & B & XOP_0_10=557
{
vectorMergeLow(S,A,B);
}
:evldd RT,dUI16PlusRAOrZeroAddress is OP=4 & RT & dUI16PlusRAOrZeroAddress & XOP_0_10=769
{
ea:$(REGISTER_SIZE) = dUI16PlusRAOrZeroAddress;
RT = *:8 ($(EATRUNC));
}
:evlddx RT,RA_OR_ZERO,RB is OP=4 & RT & RA_OR_ZERO & RB & XOP_0_10=768
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + RB;
RT = *:8 ($(EATRUNC));
}
@ifndef IS_ISA
:evsrws S,A,B is OP=4 & S & A & B & XOP_0_10=545
{
vectorShiftRightWordSigned(S,A,B);
}
@endif
@ifndef IS_ISA
:evsrwu S,A,B is OP=4 & S & A & B & XOP_0_10=544
{
vectorShiftRightWordUnsigned(S,A,B);
}
@endif
:evstdd RS,dUI16PlusRAOrZeroAddress is OP=4 & RS & dUI16PlusRAOrZeroAddress & XOP_0_10=801
{
ea:$(REGISTER_SIZE) = dUI16PlusRAOrZeroAddress;
*:8 ($(EATRUNC)) = RS;
}
:evstddx RS,RA_OR_ZERO,RB is OP=4 & RS & RA_OR_ZERO & RB & XOP_0_10=800
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + RB;
*:8 ($(EATRUNC)) = RS;
}
:evmra RT,RA is OP=4 & RT & RA & BITS_11_15=0 & XOP_0_10=1220
{
ACC = zext(RA);
RT = RA;
}
# evmergehilo rD,rA,rB 010 0010 1110
define pcodeop VectorMergeHighLow;
:evmergehilo D,A,B is OP=4 & A & B & D & XOP_0_10=558 {
local lo = (A & 0x00000000FFFFFFFF);
local hi = ((A & 0xFFFFFFFF00000000) >> 32);
#local b_lo:$(REGISTER_SIZE) = (B & 0x00000000FFFFFFFF);
local b_hi:$(REGISTER_SIZE) = ((B & 0xFFFFFFFF00000000) >> 32);
lo = lo;
hi = b_hi;
D = ((hi << 32) | lo);
}
# evmergelohi rD,rA,rB 010 0010 1111
:evmergelohi D,A,B is OP=4 & D & A & B & XOP_0_10=559 {
local lo = (A & 0x00000000FFFFFFFF);
local hi = ((A & 0xFFFFFFFF00000000) >> 32);
local b_lo:$(REGISTER_SIZE) = (B & 0x00000000FFFFFFFF);
#local b_hi:$(REGISTER_SIZE) = ((B & 0xFFFFFFFF00000000) >> 32);
lo = lo;
hi = b_lo;
D = ((hi << 32) | lo);
}
# evstwwe rS,rA,UIMM 011 0011 1001
:evstwwe RS,dUI16PlusRAOrZeroAddress is OP=4 & RS & dUI16PlusRAOrZeroAddress & XOP_0_10=0x339
{
ea:$(REGISTER_SIZE) = dUI16PlusRAOrZeroAddress;
*:4 ($(EATRUNC)) = RS:4;
}
# evstwwex rS,rA,rB 011 0011 1000
:evstwwex RS,RA_OR_ZERO,RB is OP=4 & RS & RA_OR_ZERO & RB & XOP_0_10=0x338
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + RB;
*:4 ($(EATRUNC)) = RS:4;
}
:lvx vrD, RA_OR_ZERO, RB is OP=31 & vrD & RA_OR_ZERO & RB & XOP_1_10=103 & BIT_0=0
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + RB;
vrD = *:16 ($(EATRUNC));
}
:stvx vrS, RA_OR_ZERO, RB is OP=31 & vrS & RA_OR_ZERO & RB & XOP_1_10=231 & BIT_0=0
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + RB;
*:16 ($(EATRUNC)) = vrS;
}