xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/Rar3Vm.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Rar3Vm.h
2*f6dc9357SAndroid Build Coastguard Worker // According to unRAR license, this code may not be used to develop
3*f6dc9357SAndroid Build Coastguard Worker // a program that creates RAR archives
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_RAR3_VM_H
6*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_RAR3_VM_H
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/CpuArch.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyVector.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #define Z7_RARVM_STANDARD_FILTERS
13*f6dc9357SAndroid Build Coastguard Worker // #define Z7_RARVM_VM_ENABLE
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
16*f6dc9357SAndroid Build Coastguard Worker namespace NRar3 {
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker class CMemBitDecoder
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   const Byte *_data;
21*f6dc9357SAndroid Build Coastguard Worker   UInt32 _bitSize;
22*f6dc9357SAndroid Build Coastguard Worker   UInt32 _bitPos;
23*f6dc9357SAndroid Build Coastguard Worker public:
Init(const Byte * data,UInt32 byteSize)24*f6dc9357SAndroid Build Coastguard Worker   void Init(const Byte *data, UInt32 byteSize)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     _data = data;
27*f6dc9357SAndroid Build Coastguard Worker     _bitSize = (byteSize << 3);
28*f6dc9357SAndroid Build Coastguard Worker     _bitPos = 0;
29*f6dc9357SAndroid Build Coastguard Worker   }
30*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadBits(unsigned numBits);
31*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadBit();
Avail()32*f6dc9357SAndroid Build Coastguard Worker   bool Avail() const { return (_bitPos < _bitSize); }
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadEncodedUInt32();
35*f6dc9357SAndroid Build Coastguard Worker };
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker namespace NVm {
38*f6dc9357SAndroid Build Coastguard Worker 
GetValue32(const void * addr)39*f6dc9357SAndroid Build Coastguard Worker inline UInt32 GetValue32(const void *addr) { return GetUi32(addr); }
SetValue32(void * addr,UInt32 value)40*f6dc9357SAndroid Build Coastguard Worker inline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value) }
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumRegBits = 3;
43*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumRegs = 1 << kNumRegBits;
44*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumGpRegs = kNumRegs - 1;
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker const UInt32 kSpaceSize = 0x40000;
47*f6dc9357SAndroid Build Coastguard Worker const UInt32 kSpaceMask = kSpaceSize - 1;
48*f6dc9357SAndroid Build Coastguard Worker const UInt32 kGlobalOffset = 0x3C000;
49*f6dc9357SAndroid Build Coastguard Worker const UInt32 kGlobalSize = 0x2000;
50*f6dc9357SAndroid Build Coastguard Worker const UInt32 kFixedGlobalSize = 64;
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker namespace NGlobalOffset
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kBlockSize = 0x1C;
55*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kBlockPos  = 0x20;
56*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kExecCount = 0x2C;
57*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kGlobalMemOutSize = 0x30;
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_RARVM_VM_ENABLE
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker enum ECommand
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker   CMD_MOV,  CMD_CMP,  CMD_ADD,  CMD_SUB,  CMD_JZ,   CMD_JNZ,  CMD_INC,  CMD_DEC,
66*f6dc9357SAndroid Build Coastguard Worker   CMD_JMP,  CMD_XOR,  CMD_AND,  CMD_OR,   CMD_TEST, CMD_JS,   CMD_JNS,  CMD_JB,
67*f6dc9357SAndroid Build Coastguard Worker   CMD_JBE,  CMD_JA,   CMD_JAE,  CMD_PUSH, CMD_POP,  CMD_CALL, CMD_RET,  CMD_NOT,
68*f6dc9357SAndroid Build Coastguard Worker   CMD_SHL,  CMD_SHR,  CMD_SAR,  CMD_NEG,  CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF,
69*f6dc9357SAndroid Build Coastguard Worker   CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL,  CMD_DIV,  CMD_ADC,  CMD_SBB,  CMD_PRINT,
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker   CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB,
72*f6dc9357SAndroid Build Coastguard Worker   CMD_XORB, CMD_ANDB, CMD_ORB,  CMD_TESTB,CMD_NEGB,
73*f6dc9357SAndroid Build Coastguard Worker   CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB
74*f6dc9357SAndroid Build Coastguard Worker };
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker enum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE};
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker // Addr in COperand object can link (point) to CVm object!!!
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker struct COperand
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker   EOpType Type;
83*f6dc9357SAndroid Build Coastguard Worker   UInt32 Data;
84*f6dc9357SAndroid Build Coastguard Worker   UInt32 Base;
COperandCOperand85*f6dc9357SAndroid Build Coastguard Worker   COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {}
86*f6dc9357SAndroid Build Coastguard Worker };
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker struct CCommand
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker   ECommand OpCode;
91*f6dc9357SAndroid Build Coastguard Worker   bool ByteMode;
92*f6dc9357SAndroid Build Coastguard Worker   COperand Op1, Op2;
93*f6dc9357SAndroid Build Coastguard Worker };
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker #endif
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker struct CBlockRef
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker   UInt32 Offset;
101*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
102*f6dc9357SAndroid Build Coastguard Worker };
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker class CProgram
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_RARVM_VM_ENABLE
108*f6dc9357SAndroid Build Coastguard Worker   void ReadProgram(const Byte *code, UInt32 codeSize);
109*f6dc9357SAndroid Build Coastguard Worker public:
110*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CCommand> Commands;
111*f6dc9357SAndroid Build Coastguard Worker   #endif
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker public:
114*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_RARVM_STANDARD_FILTERS
115*f6dc9357SAndroid Build Coastguard Worker   int StandardFilterIndex;
116*f6dc9357SAndroid Build Coastguard Worker   #endif
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker   bool IsSupported;
119*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<Byte> StaticData;
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker   bool PrepareProgram(const Byte *code, UInt32 codeSize);
122*f6dc9357SAndroid Build Coastguard Worker };
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker struct CProgramInitState
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker   UInt32 InitR[kNumGpRegs];
128*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<Byte> GlobalData;
129*f6dc9357SAndroid Build Coastguard Worker 
AllocateEmptyFixedGlobalCProgramInitState130*f6dc9357SAndroid Build Coastguard Worker   void AllocateEmptyFixedGlobal()
131*f6dc9357SAndroid Build Coastguard Worker   {
132*f6dc9357SAndroid Build Coastguard Worker     GlobalData.ClearAndSetSize(NVm::kFixedGlobalSize);
133*f6dc9357SAndroid Build Coastguard Worker     memset(&GlobalData[0], 0, NVm::kFixedGlobalSize);
134*f6dc9357SAndroid Build Coastguard Worker   }
135*f6dc9357SAndroid Build Coastguard Worker };
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker class CVm
139*f6dc9357SAndroid Build Coastguard Worker {
GetValue(bool byteMode,const void * addr)140*f6dc9357SAndroid Build Coastguard Worker   static UInt32 GetValue(bool byteMode, const void *addr)
141*f6dc9357SAndroid Build Coastguard Worker   {
142*f6dc9357SAndroid Build Coastguard Worker     if (byteMode)
143*f6dc9357SAndroid Build Coastguard Worker       return(*(const Byte *)addr);
144*f6dc9357SAndroid Build Coastguard Worker     else
145*f6dc9357SAndroid Build Coastguard Worker       return GetUi32(addr);
146*f6dc9357SAndroid Build Coastguard Worker   }
147*f6dc9357SAndroid Build Coastguard Worker 
SetValue(bool byteMode,void * addr,UInt32 value)148*f6dc9357SAndroid Build Coastguard Worker   static void SetValue(bool byteMode, void *addr, UInt32 value)
149*f6dc9357SAndroid Build Coastguard Worker   {
150*f6dc9357SAndroid Build Coastguard Worker     if (byteMode)
151*f6dc9357SAndroid Build Coastguard Worker       *(Byte *)addr = (Byte)value;
152*f6dc9357SAndroid Build Coastguard Worker     else
153*f6dc9357SAndroid Build Coastguard Worker       SetUi32(addr, value)
154*f6dc9357SAndroid Build Coastguard Worker   }
155*f6dc9357SAndroid Build Coastguard Worker 
GetFixedGlobalValue32(UInt32 globalOffset)156*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); }
157*f6dc9357SAndroid Build Coastguard Worker 
SetBlockSize(UInt32 v)158*f6dc9357SAndroid Build Coastguard Worker   void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); }
SetBlockPos(UInt32 v)159*f6dc9357SAndroid Build Coastguard Worker   void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); }
160*f6dc9357SAndroid Build Coastguard Worker public:
SetValue(void * addr,UInt32 value)161*f6dc9357SAndroid Build Coastguard Worker   static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); }
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker private:
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_RARVM_VM_ENABLE
166*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetOperand32(const COperand *op) const;
167*f6dc9357SAndroid Build Coastguard Worker   void SetOperand32(const COperand *op, UInt32 val);
168*f6dc9357SAndroid Build Coastguard Worker   Byte GetOperand8(const COperand *op) const;
169*f6dc9357SAndroid Build Coastguard Worker   void SetOperand8(const COperand *op, Byte val);
170*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetOperand(bool byteMode, const COperand *op) const;
171*f6dc9357SAndroid Build Coastguard Worker   void SetOperand(bool byteMode, const COperand *op, UInt32 val);
172*f6dc9357SAndroid Build Coastguard Worker   bool ExecuteCode(const CProgram *prg);
173*f6dc9357SAndroid Build Coastguard Worker   #endif
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_RARVM_STANDARD_FILTERS
176*f6dc9357SAndroid Build Coastguard Worker   bool ExecuteStandardFilter(unsigned filterIndex);
177*f6dc9357SAndroid Build Coastguard Worker   #endif
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker   Byte *Mem;
180*f6dc9357SAndroid Build Coastguard Worker   UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization)
181*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;
182*f6dc9357SAndroid Build Coastguard Worker 
183*f6dc9357SAndroid Build Coastguard Worker public:
184*f6dc9357SAndroid Build Coastguard Worker   CVm();
185*f6dc9357SAndroid Build Coastguard Worker   ~CVm();
186*f6dc9357SAndroid Build Coastguard Worker   bool Create();
187*f6dc9357SAndroid Build Coastguard Worker   void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize);
188*f6dc9357SAndroid Build Coastguard Worker   bool Execute(CProgram *prg, const CProgramInitState *initState,
189*f6dc9357SAndroid Build Coastguard Worker       CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData);
GetDataPointer(UInt32 offset)190*f6dc9357SAndroid Build Coastguard Worker   const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; }
191*f6dc9357SAndroid Build Coastguard Worker };
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker #endif
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker }}}
196