1 // BranchMisc.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../../C/CpuArch.h"
6
7 #include "../Common/StreamUtils.h"
8
9 #include "BranchMisc.h"
10
11 namespace NCompress {
12 namespace NBranch {
13
Init()14 Z7_COM7F_IMF(CCoder::Init())
15 {
16 _pc = 0;
17 return S_OK;
18 }
19
20
Z7_COM7F_IMF2(UInt32, CCoder::Filter(Byte *data, UInt32 size))21 Z7_COM7F_IMF2(UInt32, CCoder::Filter(Byte *data, UInt32 size))
22 {
23 const UInt32 processed = (UInt32)(size_t)(BraFunc(data, size, _pc) - data);
24 _pc += processed;
25 return processed;
26 }
27
28
29 namespace NArm64 {
30
31 #ifndef Z7_EXTRACT_ONLY
32
Init()33 Z7_COM7F_IMF(CEncoder::Init())
34 {
35 _pc = _pc_Init;
36 return S_OK;
37 }
38
Z7_COM7F_IMF2(UInt32, CEncoder::Filter(Byte *data, UInt32 size))39 Z7_COM7F_IMF2(UInt32, CEncoder::Filter(Byte *data, UInt32 size))
40 {
41 const UInt32 processed = (UInt32)(size_t)(Z7_BRANCH_CONV_ENC(ARM64)(data, size, _pc) - data);
42 _pc += processed;
43 return processed;
44 }
45
SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)46 Z7_COM7F_IMF(CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps))
47 {
48 UInt32 pc = 0;
49 for (UInt32 i = 0; i < numProps; i++)
50 {
51 const PROPID propID = propIDs[i];
52 if (propID == NCoderPropID::kDefaultProp ||
53 propID == NCoderPropID::kBranchOffset)
54 {
55 const PROPVARIANT &prop = props[i];
56 if (prop.vt != VT_UI4)
57 return E_INVALIDARG;
58 pc = prop.ulVal;
59 if ((pc & 3) != 0)
60 return E_INVALIDARG;
61 }
62 }
63 _pc_Init = pc;
64 return S_OK;
65 }
66
67
WriteCoderProperties(ISequentialOutStream *outStream)68 Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream))
69 {
70 if (_pc_Init == 0)
71 return S_OK;
72 Byte buf[4];
73 SetUi32(buf, _pc_Init)
74 return WriteStream(outStream, buf, 4);
75 }
76
77 #endif
78
79
Init()80 Z7_COM7F_IMF(CDecoder::Init())
81 {
82 _pc = _pc_Init;
83 return S_OK;
84 }
85
Z7_COM7F_IMF2(UInt32, CDecoder::Filter(Byte *data, UInt32 size))86 Z7_COM7F_IMF2(UInt32, CDecoder::Filter(Byte *data, UInt32 size))
87 {
88 const UInt32 processed = (UInt32)(size_t)(Z7_BRANCH_CONV_DEC(ARM64)(data, size, _pc) - data);
89 _pc += processed;
90 return processed;
91 }
92
SetDecoderProperties2(const Byte *props, UInt32 size)93 Z7_COM7F_IMF(CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size))
94 {
95 UInt32 val = 0;
96 if (size != 0)
97 {
98 if (size != 4)
99 return E_NOTIMPL;
100 val = GetUi32(props);
101 if ((val & 3) != 0)
102 return E_NOTIMPL;
103 }
104 _pc_Init = val;
105 return S_OK;
106 }
107
108 }
109
110 }}
111