• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "encode.h"
17 
18 namespace ark::compiler {
19 
GetAllocator() const20 ArenaAllocator *Encoder::GetAllocator() const
21 {
22     return allocator_;
23 }
24 
IsLabelValid(LabelHolder::LabelId label)25 bool Encoder::IsLabelValid(LabelHolder::LabelId label)
26 {
27     return label != LabelHolder::INVALID_LABEL;
28 }
29 
GetTarget() const30 Target Encoder::GetTarget() const
31 {
32     return target_;
33 }
34 
GetArch() const35 Arch Encoder::GetArch() const
36 {
37     return GetTarget().GetArch();
38 }
39 
IsJsNumberCast() const40 bool Encoder::IsJsNumberCast() const
41 {
42     return jsNumberCast_;
43 }
44 
SetIsJsNumberCast(bool v)45 void Encoder::SetIsJsNumberCast(bool v)
46 {
47     jsNumberCast_ = v;
48 }
DisasmInstr(std::ostream & stream,size_t pc,ssize_t codeOffset) const49 size_t Encoder::DisasmInstr([[maybe_unused]] std::ostream &stream, [[maybe_unused]] size_t pc,
50                             [[maybe_unused]] ssize_t codeOffset) const
51 {
52     return 0;
53 }
54 
BufferData() const55 void *Encoder::BufferData() const
56 {
57     return nullptr;
58 }
59 
BufferSize() const60 size_t Encoder::BufferSize() const
61 {
62     return 0;
63 }
64 
InitMasm()65 bool Encoder::InitMasm()
66 {
67     return true;
68 }
EncodeNop()69 void Encoder::EncodeNop()
70 {
71     SetFalseResult();
72 }
73 
EncodeAddOverflow(compiler::LabelHolder::LabelId id,Reg dst,Reg src0,Reg src1,Condition cc)74 void Encoder::EncodeAddOverflow([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] Reg dst,
75                                 [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1, [[maybe_unused]] Condition cc)
76 {
77     SetFalseResult();
78 }
79 
EncodeSubOverflow(compiler::LabelHolder::LabelId id,Reg dst,Reg src0,Reg src1,Condition cc)80 void Encoder::EncodeSubOverflow([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] Reg dst,
81                                 [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1, [[maybe_unused]] Condition cc)
82 {
83     SetFalseResult();
84 }
85 
EncodeMulOverflow(compiler::LabelHolder::LabelId id,Reg dst,Reg src0,Reg src1,Condition cc)86 void Encoder::EncodeMulOverflow([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] Reg dst,
87                                 [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1, [[maybe_unused]] Condition cc)
88 {
89     SetFalseResult();
90 }
91 
EncodeNegOverflowAndZero(compiler::LabelHolder::LabelId id,Reg dst,Reg src)92 void Encoder::EncodeNegOverflowAndZero([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] Reg dst,
93                                        [[maybe_unused]] Reg src)
94 {
95     SetFalseResult();
96 }
97 
EncodeFastPathDynamicCast(Reg dst,Reg src,LabelHolder::LabelId slow)98 void Encoder::EncodeFastPathDynamicCast([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src,
99                                         [[maybe_unused]] LabelHolder::LabelId slow)
100 {
101     SetFalseResult();
102 }
103 
EncodeJsDoubleToCharCast(Reg dst,Reg src)104 void Encoder::EncodeJsDoubleToCharCast([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
105 {
106     SetFalseResult();
107 }
108 
EncodeJsDoubleToCharCast(Reg dst,Reg src,Reg tmp,uint32_t failureResult)109 void Encoder::EncodeJsDoubleToCharCast([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src, [[maybe_unused]] Reg tmp,
110                                        [[maybe_unused]] uint32_t failureResult)
111 {
112     SetFalseResult();
113 }
114 
EncodeCast(Reg dst,bool dstSigned,Reg src,bool srcSigned)115 void Encoder::EncodeCast([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src,
116                          [[maybe_unused]] bool srcSigned)
117 {
118     SetFalseResult();
119 }
EncodeCastToBool(Reg dst,Reg src)120 void Encoder::EncodeCastToBool([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
121 {
122     SetFalseResult();
123 }
124 
EncodeMin(Reg dst,bool dstSigned,Reg src0,Reg src1)125 void Encoder::EncodeMin([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
126                         [[maybe_unused]] Reg src1)
127 {
128     SetFalseResult();
129 }
130 
EncodeDiv(Reg dst,bool dstSigned,Reg src0,Reg src1)131 void Encoder::EncodeDiv([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
132                         [[maybe_unused]] Reg src1)
133 {
134     SetFalseResult();
135 }
136 
EncodeMod(Reg dst,bool dstSigned,Reg src0,Reg src1)137 void Encoder::EncodeMod([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
138                         [[maybe_unused]] Reg src1)
139 {
140     SetFalseResult();
141 }
142 
EncodeDiv(Reg dst,Reg src0,Imm imm,bool isSigned)143 void Encoder::EncodeDiv([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Imm imm,
144                         [[maybe_unused]] bool isSigned)
145 {
146     SetFalseResult();
147 }
148 
EncodeMod(Reg dst,Reg src0,Imm imm,bool isSigned)149 void Encoder::EncodeMod([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Imm imm,
150                         [[maybe_unused]] bool isSigned)
151 {
152     SetFalseResult();
153 }
154 
EncodeMax(Reg dst,bool dstSigned,Reg src0,Reg src1)155 void Encoder::EncodeMax([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
156                         [[maybe_unused]] Reg src1)
157 {
158     SetFalseResult();
159 }
EncodeMov(Reg dst,Imm src)160 void Encoder::EncodeMov([[maybe_unused]] Reg dst, [[maybe_unused]] Imm src)
161 {
162     SetFalseResult();
163 }
164 
EncodeLdr(Reg dst,bool dstSigned,MemRef mem)165 void Encoder::EncodeLdr([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] MemRef mem)
166 {
167     SetFalseResult();
168 }
169 
EncodeLdrAcquire(Reg dst,bool dstSigned,MemRef mem)170 void Encoder::EncodeLdrAcquire([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] MemRef mem)
171 {
172     SetFalseResult();
173 }
EncodeStr(Reg src,MemRef mem)174 void Encoder::EncodeStr([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
175 {
176     SetFalseResult();
177 }
EncodeStrRelease(Reg src,MemRef mem)178 void Encoder::EncodeStrRelease([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
179 {
180     SetFalseResult();
181 }
EncodeLdrExclusive(Reg dst,Reg addr,bool acquire)182 void Encoder::EncodeLdrExclusive([[maybe_unused]] Reg dst, [[maybe_unused]] Reg addr, [[maybe_unused]] bool acquire)
183 {
184     SetFalseResult();
185 }
186 
EncodeStrExclusive(Reg dst,Reg src,Reg addr,bool release)187 void Encoder::EncodeStrExclusive([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src, [[maybe_unused]] Reg addr,
188                                  [[maybe_unused]] bool release)
189 {
190     SetFalseResult();
191 }
192 
193 // zerod high part: [reg.size, 64)
EncodeStrz(Reg src,MemRef mem)194 void Encoder::EncodeStrz([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
195 {
196     SetFalseResult();
197 }
Push(Reg src,MemRef mem)198 void Encoder::Push([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
199 {
200     SetFalseResult();
201 }
202 
EncodeSti(int64_t src,uint8_t srcSizeBytes,MemRef mem)203 void Encoder::EncodeSti([[maybe_unused]] int64_t src, [[maybe_unused]] uint8_t srcSizeBytes,
204                         [[maybe_unused]] MemRef mem)
205 {
206     SetFalseResult();
207 }
EncodeSti(double src,MemRef mem)208 void Encoder::EncodeSti([[maybe_unused]] double src, [[maybe_unused]] MemRef mem)
209 {
210     SetFalseResult();
211 }
EncodeSti(float src,MemRef mem)212 void Encoder::EncodeSti([[maybe_unused]] float src, [[maybe_unused]] MemRef mem)
213 {
214     SetFalseResult();
215 }
216 
EncodeMemCopy(MemRef memFrom,MemRef memTo,size_t size)217 void Encoder::EncodeMemCopy([[maybe_unused]] MemRef memFrom, [[maybe_unused]] MemRef memTo,
218                             [[maybe_unused]] size_t size)
219 {
220     SetFalseResult();
221 }
222 
EncodeMemCopyz(MemRef memFrom,MemRef memTo,size_t size)223 void Encoder::EncodeMemCopyz([[maybe_unused]] MemRef memFrom, [[maybe_unused]] MemRef memTo,
224                              [[maybe_unused]] size_t size)
225 {
226     SetFalseResult();
227 }
228 
EncodeCmp(Reg dst,Reg src0,Reg src1,Condition cc)229 void Encoder::EncodeCmp([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
230                         [[maybe_unused]] Condition cc)
231 {
232     SetFalseResult();
233 }
234 
EncodeCompare(Reg dst,Reg src0,Reg src1,Condition cc)235 void Encoder::EncodeCompare([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
236                             [[maybe_unused]] Condition cc)
237 {
238     SetFalseResult();
239 }
240 
EncodeCompareTest(Reg dst,Reg src0,Reg src1,Condition cc)241 void Encoder::EncodeCompareTest([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
242                                 [[maybe_unused]] Condition cc)
243 {
244     SetFalseResult();
245 }
246 
EncodeAtomicByteOr(Reg addr,Reg value,bool fastEncoding)247 void Encoder::EncodeAtomicByteOr([[maybe_unused]] Reg addr, [[maybe_unused]] Reg value,
248                                  [[maybe_unused]] bool fastEncoding)
249 {
250     SetFalseResult();
251 }
252 
EncodeCompressedStringCharAt(ArgsCompressedStringCharAt && args)253 void Encoder::EncodeCompressedStringCharAt([[maybe_unused]] ArgsCompressedStringCharAt &&args)
254 {
255     SetFalseResult();
256 }
257 
EncodeCompressedStringCharAtI(ArgsCompressedStringCharAtI && args)258 void Encoder::EncodeCompressedStringCharAtI([[maybe_unused]] ArgsCompressedStringCharAtI &&args)
259 {
260     SetFalseResult();
261 }
262 
EncodeSelect(ArgsSelect && args)263 void Encoder::EncodeSelect([[maybe_unused]] ArgsSelect &&args)
264 {
265     SetFalseResult();
266 }
267 
EncodeSelectTest(ArgsSelect && args)268 void Encoder::EncodeSelectTest([[maybe_unused]] ArgsSelect &&args)
269 {
270     SetFalseResult();
271 }
272 
EncodeIsInf(Reg dst,Reg src0)273 void Encoder::EncodeIsInf([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
274 {
275     SetFalseResult();
276 }
277 
EncodeIsInteger(Reg dst,Reg src0)278 void Encoder::EncodeIsInteger([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
279 {
280     SetFalseResult();
281 }
282 
EncodeIsSafeInteger(Reg dst,Reg src0)283 void Encoder::EncodeIsSafeInteger([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
284 {
285     SetFalseResult();
286 }
287 
EncodeReverseBytes(Reg dst,Reg src)288 void Encoder::EncodeReverseBytes([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
289 {
290     SetFalseResult();
291 }
292 
EncodeReverseHalfWords(Reg dst,Reg src)293 void Encoder::EncodeReverseHalfWords([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
294 {
295     SetFalseResult();
296 }
297 
EncodeReverseBits(Reg dst,Reg src)298 void Encoder::EncodeReverseBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
299 {
300     SetFalseResult();
301 }
302 
EncodeBitCount(Reg dst,Reg src)303 void Encoder::EncodeBitCount([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
304 {
305     SetFalseResult();
306 }
307 
EncodeRotate(Reg dst,Reg src1,Reg src2,bool isRor)308 void Encoder::EncodeRotate([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src1, [[maybe_unused]] Reg src2,
309                            [[maybe_unused]] bool isRor)
310 {
311     SetFalseResult();
312 }
313 
EncodeSignum(Reg dst,Reg src)314 void Encoder::EncodeSignum([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
315 {
316     SetFalseResult();
317 }
318 
EncodeCountLeadingZeroBits(Reg dst,Reg src)319 void Encoder::EncodeCountLeadingZeroBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
320 {
321     SetFalseResult();
322 }
323 
EncodeCountTrailingZeroBits(Reg dst,Reg src)324 void Encoder::EncodeCountTrailingZeroBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
325 {
326     SetFalseResult();
327 }
328 
EncodeCeil(Reg dst,Reg src)329 void Encoder::EncodeCeil([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
330 {
331     SetFalseResult();
332 }
333 
EncodeFloor(Reg dst,Reg src)334 void Encoder::EncodeFloor([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
335 {
336     SetFalseResult();
337 }
338 
EncodeRint(Reg dst,Reg src)339 void Encoder::EncodeRint([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
340 {
341     SetFalseResult();
342 }
343 
EncodeTrunc(Reg dst,Reg src)344 void Encoder::EncodeTrunc([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
345 {
346     SetFalseResult();
347 }
348 
EncodeRoundAway(Reg dst,Reg src)349 void Encoder::EncodeRoundAway([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
350 {
351     SetFalseResult();
352 }
353 
EncodeRoundToPInfReturnFloat(Reg dst,Reg src)354 void Encoder::EncodeRoundToPInfReturnFloat([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
355 {
356     SetFalseResult();
357 }
358 
EncodeRoundToPInfReturnScalar(Reg dst,Reg src)359 void Encoder::EncodeRoundToPInfReturnScalar([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
360 {
361     SetFalseResult();
362 }
363 
EncodeSelect(ArgsSelectImm && args)364 void Encoder::EncodeSelect([[maybe_unused]] ArgsSelectImm &&args)
365 {
366     SetFalseResult();
367 }
368 
EncodeSelectTest(ArgsSelectImm && args)369 void Encoder::EncodeSelectTest([[maybe_unused]] ArgsSelectImm &&args)
370 {
371     SetFalseResult();
372 }
373 
EncodeGetTypeSize(Reg size,Reg type)374 void Encoder::EncodeGetTypeSize([[maybe_unused]] Reg size, [[maybe_unused]] Reg type)
375 {
376     SetFalseResult();
377 }
378 
EncodeLdp(Reg dst0,Reg dst1,bool dstSigned,MemRef mem)379 void Encoder::EncodeLdp([[maybe_unused]] Reg dst0, [[maybe_unused]] Reg dst1, [[maybe_unused]] bool dstSigned,
380                         [[maybe_unused]] MemRef mem)
381 {
382     SetFalseResult();
383 }
384 
EncodeStp(Reg src0,Reg src1,MemRef mem)385 void Encoder::EncodeStp([[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1, [[maybe_unused]] MemRef mem)
386 {
387     SetFalseResult();
388 }
389 
EncodeMAdd(Reg dst,Reg src0,Reg src1,Reg src2)390 void Encoder::EncodeMAdd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
391                          [[maybe_unused]] Reg src2)
392 {
393     SetFalseResult();
394 }
395 
EncodeMSub(Reg dst,Reg src0,Reg src1,Reg src2)396 void Encoder::EncodeMSub([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
397                          [[maybe_unused]] Reg src2)
398 {
399     SetFalseResult();
400 }
401 
EncodeMNeg(Reg dst,Reg src0,Reg src1)402 void Encoder::EncodeMNeg([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
403 {
404     SetFalseResult();
405 }
406 
EncodeOrNot(Reg dst,Reg src0,Reg src1)407 void Encoder::EncodeOrNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
408 {
409     SetFalseResult();
410 }
411 
EncodeAndNot(Reg dst,Reg src0,Reg src1)412 void Encoder::EncodeAndNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
413 {
414     SetFalseResult();
415 }
416 
EncodeXorNot(Reg dst,Reg src0,Reg src1)417 void Encoder::EncodeXorNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
418 {
419     SetFalseResult();
420 }
421 
EncodeNeg(Reg dst,Shift src)422 void Encoder::EncodeNeg([[maybe_unused]] Reg dst, [[maybe_unused]] Shift src)
423 {
424     SetFalseResult();
425 }
426 
EncodeFpToBits(Reg dst,Reg src)427 void Encoder::EncodeFpToBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
428 {
429     SetFalseResult();
430 }
431 
EncodeMoveBitsRaw(Reg dst,Reg src)432 void Encoder::EncodeMoveBitsRaw([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
433 {
434     SetFalseResult();
435 }
436 
EncodeExtractBits(Reg dst,Reg src,Imm imm1,Imm imm2)437 void Encoder::EncodeExtractBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src, [[maybe_unused]] Imm imm1,
438                                 [[maybe_unused]] Imm imm2)
439 {
440     success_ = false;
441 }
442 
EncodeCrc32Update(Reg dst,Reg crcReg,Reg valReg)443 void Encoder::EncodeCrc32Update([[maybe_unused]] Reg dst, [[maybe_unused]] Reg crcReg, [[maybe_unused]] Reg valReg)
444 {
445     SetFalseResult();
446 }
447 
EncodeStackOverflowCheck(ssize_t offset)448 void Encoder::EncodeStackOverflowCheck([[maybe_unused]] ssize_t offset)
449 {
450     SetFalseResult();
451 }
452 
IsValid() const453 bool Encoder::IsValid() const
454 {
455     return false;
456 }
457 
GetResult() const458 bool Encoder::GetResult() const
459 {
460     return success_;
461 }
462 
SetFalseResult()463 void Encoder::SetFalseResult()
464 {
465     success_ = false;
466 }
467 
CanEncodeImmAddSubCmp(int64_t imm,uint32_t size,bool signedCompare)468 bool Encoder::CanEncodeImmAddSubCmp([[maybe_unused]] int64_t imm, [[maybe_unused]] uint32_t size,
469                                     [[maybe_unused]] bool signedCompare)
470 {
471     return false;
472 }
473 
CanEncodeImmMulDivMod(uint64_t imm,uint32_t size)474 bool Encoder::CanEncodeImmMulDivMod([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
475 {
476     return false;
477 }
478 
CanOptimizeImmDivMod(uint64_t imm,bool isSigned) const479 bool Encoder::CanOptimizeImmDivMod([[maybe_unused]] uint64_t imm, [[maybe_unused]] bool isSigned) const
480 {
481     return false;
482 }
483 
CanEncodeImmLogical(uint64_t imm,uint32_t size)484 bool Encoder::CanEncodeImmLogical([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
485 {
486     return false;
487 }
488 
CanEncodeScale(uint64_t imm,uint32_t size)489 bool Encoder::CanEncodeScale([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
490 {
491     return false;
492 }
493 
CanEncodeShift(uint32_t size)494 bool Encoder::CanEncodeShift([[maybe_unused]] uint32_t size)
495 {
496     return true;
497 }
CanEncodeBitCount()498 bool Encoder::CanEncodeBitCount()
499 {
500     return false;
501 }
502 
CanEncodeMAdd()503 bool Encoder::CanEncodeMAdd()
504 {
505     return false;
506 }
507 
CanEncodeMSub()508 bool Encoder::CanEncodeMSub()
509 {
510     return false;
511 }
512 
CanEncodeMNeg()513 bool Encoder::CanEncodeMNeg()
514 {
515     return false;
516 }
517 
CanEncodeOrNot()518 bool Encoder::CanEncodeOrNot()
519 {
520     return false;
521 }
522 
CanEncodeAndNot()523 bool Encoder::CanEncodeAndNot()
524 {
525     return false;
526 }
527 
CanEncodeXorNot()528 bool Encoder::CanEncodeXorNot()
529 {
530     return false;
531 }
532 
CanEncodeShiftedOperand(ShiftOpcode opcode,ShiftType shiftType)533 bool Encoder::CanEncodeShiftedOperand([[maybe_unused]] ShiftOpcode opcode, [[maybe_unused]] ShiftType shiftType)
534 {
535     return false;
536 }
537 
CanEncodeCompressedStringCharAt()538 bool Encoder::CanEncodeCompressedStringCharAt()
539 {
540     return false;
541 }
542 
CanEncodeCompressedStringCharAtI()543 bool Encoder::CanEncodeCompressedStringCharAtI()
544 {
545     return false;
546 }
547 
CanEncodeFloatSelect()548 bool Encoder::CanEncodeFloatSelect()
549 {
550     return false;
551 }
552 
EncodeCompareAndSwap(Reg dst,Reg obj,Reg offset,Reg val,Reg newval)553 void Encoder::EncodeCompareAndSwap([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
554                                    [[maybe_unused]] Reg val, [[maybe_unused]] Reg newval)
555 {
556     SetFalseResult();
557 }
558 
EncodeCompareAndSwap(Reg dst,Reg addr,Reg val,Reg newval)559 void Encoder::EncodeCompareAndSwap([[maybe_unused]] Reg dst, [[maybe_unused]] Reg addr, [[maybe_unused]] Reg val,
560                                    [[maybe_unused]] Reg newval)
561 {
562     SetFalseResult();
563 }
564 
EncodeUnsafeGetAndSet(Reg dst,Reg obj,Reg offset,Reg val)565 void Encoder::EncodeUnsafeGetAndSet([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
566                                     [[maybe_unused]] Reg val)
567 {
568     SetFalseResult();
569 }
570 
EncodeUnsafeGetAndAdd(Reg dst,Reg obj,Reg offset,Reg val,Reg tmp)571 void Encoder::EncodeUnsafeGetAndAdd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
572                                     [[maybe_unused]] Reg val, [[maybe_unused]] Reg tmp)
573 {
574     SetFalseResult();
575 }
576 
EncodeMemoryBarrier(memory_order::Order order)577 void Encoder::EncodeMemoryBarrier([[maybe_unused]] memory_order::Order order)
578 {
579     SetFalseResult();
580 }
581 
GetCursorOffset() const582 size_t Encoder::GetCursorOffset() const
583 {
584     return 0;
585 }
586 
EncodeCompressEightUtf16ToUtf8CharsUsingSimd(Reg srcAddr,Reg dstAddr)587 void Encoder::EncodeCompressEightUtf16ToUtf8CharsUsingSimd([[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg dstAddr)
588 {
589     SetFalseResult();
590 }
591 
EncodeCompressSixteenUtf16ToUtf8CharsUsingSimd(Reg srcAddr,Reg dstAddr)592 void Encoder::EncodeCompressSixteenUtf16ToUtf8CharsUsingSimd([[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg dstAddr)
593 {
594     SetFalseResult();
595 }
596 
EncodeMemCharU8X32UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)597 void Encoder::EncodeMemCharU8X32UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
598                                           [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
599 {
600     SetFalseResult();
601 }
602 
EncodeMemCharU16X16UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)603 void Encoder::EncodeMemCharU16X16UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
604                                            [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
605 {
606     SetFalseResult();
607 }
608 
EncodeMemCharU8X16UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)609 void Encoder::EncodeMemCharU8X16UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
610                                           [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
611 {
612     SetFalseResult();
613 }
614 
EncodeMemCharU16X8UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)615 void Encoder::EncodeMemCharU16X8UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
616                                           [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
617 {
618     SetFalseResult();
619 }
620 
EncodeUnsignedExtendBytesToShorts(Reg dst,Reg src)621 void Encoder::EncodeUnsignedExtendBytesToShorts([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
622 {
623     SetFalseResult();
624 }
625 
SaveRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)626 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
627                             [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
628 {
629     SetFalseResult();
630 }
631 
LoadRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)632 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
633                             [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
634 {
635     SetFalseResult();
636 }
637 
SaveRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)638 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
639                             [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
640 {
641     SetFalseResult();
642 }
643 
LoadRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)644 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
645                             [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
646 {
647     SetFalseResult();
648 }
649 
PushRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)650 void Encoder::PushRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
651 {
652     ASSERT(GetArch() != Arch::AARCH64 || isAligned);
653     PushRegisters(regs, false);
654     PushRegisters(fpRegs, true);
655 
656     bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
657     if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
658         EncodeSub(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
659     }
660 }
661 
PopRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)662 void Encoder::PopRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
663 {
664     bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
665     if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
666         EncodeAdd(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
667     }
668 
669     PopRegisters(fpRegs, true);
670     PopRegisters(regs, false);
671 }
672 
PushRegisters(RegMask registers,bool isFp)673 void Encoder::PushRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
674 {
675     SetFalseResult();
676 }
677 
PopRegisters(RegMask registers,bool isFp)678 void Encoder::PopRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
679 {
680     SetFalseResult();
681 }
682 
GetRegfile() const683 RegistersDescription *Encoder::GetRegfile() const
684 {
685     ASSERT(regfile_ != nullptr);
686     return regfile_;
687 }
688 
SetRegfile(RegistersDescription * regfile)689 void Encoder::SetRegfile(RegistersDescription *regfile)
690 {
691     regfile_ = regfile;
692 }
693 
AcquireScratchRegister(compiler::TypeInfo type)694 compiler::Reg Encoder::AcquireScratchRegister([[maybe_unused]] compiler::TypeInfo type)
695 {
696     return compiler::Reg();
697 }
AcquireScratchRegister(compiler::Reg reg)698 void Encoder::AcquireScratchRegister([[maybe_unused]] compiler::Reg reg)
699 {
700     SetFalseResult();
701 }
702 
ReleaseScratchRegister(compiler::Reg reg)703 void Encoder::ReleaseScratchRegister([[maybe_unused]] compiler::Reg reg)
704 {
705     SetFalseResult();
706 }
707 
MakeCall(compiler::RelocationInfo * relocation)708 void Encoder::MakeCall([[maybe_unused]] compiler::RelocationInfo *relocation)
709 {
710     SetFalseResult();
711 }
712 
MakeCall(compiler::LabelHolder::LabelId id)713 void Encoder::MakeCall([[maybe_unused]] compiler::LabelHolder::LabelId id)
714 {
715     SetFalseResult();
716 }
717 
MakeCall(const void * entryPoint)718 void Encoder::MakeCall([[maybe_unused]] const void *entryPoint)
719 {
720     SetFalseResult();
721 }
722 
MakeCall(Reg reg)723 void Encoder::MakeCall([[maybe_unused]] Reg reg)
724 {
725     SetFalseResult();
726 }
727 
MakeCall(compiler::MemRef entryPoint)728 void Encoder::MakeCall([[maybe_unused]] compiler::MemRef entryPoint)
729 {
730     SetFalseResult();
731 }
732 
CanMakeCallByOffset(intptr_t offset)733 bool Encoder::CanMakeCallByOffset([[maybe_unused]] intptr_t offset)
734 {
735     return false;
736 }
737 
MakeCallAot(intptr_t offset)738 void Encoder::MakeCallAot([[maybe_unused]] intptr_t offset)
739 {
740     SetFalseResult();
741 }
742 
MakeCallByOffset(intptr_t offset)743 void Encoder::MakeCallByOffset([[maybe_unused]] intptr_t offset)
744 {
745     SetFalseResult();
746 }
747 
MakeLoadAotTable(intptr_t offset,compiler::Reg reg)748 void Encoder::MakeLoadAotTable([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg reg)
749 {
750     SetFalseResult();
751 }
752 
MakeLoadAotTableAddr(intptr_t offset,compiler::Reg addr,compiler::Reg val)753 void Encoder::MakeLoadAotTableAddr([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg addr,
754                                    [[maybe_unused]] compiler::Reg val)
755 {
756     SetFalseResult();
757 }
758 
759 // Encode unconditional branch
EncodeJump(compiler::LabelHolder::LabelId id)760 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id)
761 {
762     SetFalseResult();
763 }
764 
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Condition cond)765 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
766                          [[maybe_unused]] compiler::Condition cond)
767 {
768     SetFalseResult();
769 }
770 
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)771 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
772                          [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
773 {
774     SetFalseResult();
775 }
776 
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)777 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
778                          [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
779 {
780     SetFalseResult();
781 }
782 
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)783 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
784                              [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
785 {
786     SetFalseResult();
787 }
788 
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)789 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
790                              [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
791 {
792     SetFalseResult();
793 }
794 
795 // Encode jump by register value
EncodeJump(compiler::Reg reg)796 void Encoder::EncodeJump([[maybe_unused]] compiler::Reg reg)
797 {
798     SetFalseResult();
799 }
800 
EncodeJump(RelocationInfo * relocation)801 void Encoder::EncodeJump([[maybe_unused]] RelocationInfo *relocation)
802 {
803     SetFalseResult();
804 }
805 
EncodeBitTestAndBranch(compiler::LabelHolder::LabelId id,compiler::Reg reg,uint32_t bitPos,bool bitValue)806 void Encoder::EncodeBitTestAndBranch([[maybe_unused]] compiler::LabelHolder::LabelId id,
807                                      [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] uint32_t bitPos,
808                                      [[maybe_unused]] bool bitValue)
809 {
810     SetFalseResult();
811 }
812 
EncodeAbort()813 void Encoder::EncodeAbort()
814 {
815     SetFalseResult();
816 }
817 
EncodeReturn()818 void Encoder::EncodeReturn()
819 {
820     SetFalseResult();
821 }
822 
EncodeGetCurrentPc(Reg dst)823 void Encoder::EncodeGetCurrentPc([[maybe_unused]] Reg dst)
824 {
825     SetFalseResult();
826 }
827 
SetFrameLayout(CFrameLayout fl)828 void Encoder::SetFrameLayout(CFrameLayout fl)
829 {
830     frameLayout_ = fl;
831 }
832 
GetFrameLayout() const833 const CFrameLayout &Encoder::GetFrameLayout() const
834 {
835     return frameLayout_;
836 }
837 
GetLiveTmpRegMask()838 RegMask Encoder::GetLiveTmpRegMask()
839 {
840     return liveTmpRegs_;
841 }
842 
GetLiveTmpFpRegMask()843 VRegMask Encoder::GetLiveTmpFpRegMask()
844 {
845     return liveTmpFpRegs_;
846 }
847 
AddRegInLiveMask(Reg reg)848 void Encoder::AddRegInLiveMask(Reg reg)
849 {
850     if (!reg.IsValid()) {
851         return;
852     }
853     if (reg.IsScalar()) {
854         liveTmpRegs_.set(reg.GetId(), true);
855     } else {
856         ASSERT(reg.IsFloat());
857         liveTmpFpRegs_.set(reg.GetId(), true);
858     }
859 }
860 
RemoveRegFromLiveMask(Reg reg)861 void Encoder::RemoveRegFromLiveMask(Reg reg)
862 {
863     if (!reg.IsValid()) {
864         return;
865     }
866     if (reg.IsScalar()) {
867         liveTmpRegs_.set(reg.GetId(), false);
868     } else {
869         ASSERT(reg.IsFloat());
870         liveTmpFpRegs_.set(reg.GetId(), false);
871     }
872 }
873 
SetCodeOffset(size_t offset)874 void Encoder::SetCodeOffset(size_t offset)
875 {
876     codeOffset_ = offset;
877 }
878 
GetCodeOffset() const879 size_t Encoder::GetCodeOffset() const
880 {
881     return codeOffset_;
882 }
883 
EnableLrAsTempReg(bool value)884 void Encoder::EnableLrAsTempReg(bool value)
885 {
886     enableLrAsTempReg_ = value;
887 }
888 
IsLrAsTempRegEnabled() const889 bool Encoder::IsLrAsTempRegEnabled() const
890 {
891     return enableLrAsTempReg_;
892 }
893 
IsLrAsTempRegEnabledAndReleased() const894 bool Encoder::IsLrAsTempRegEnabledAndReleased() const
895 {
896     return IsLrAsTempRegEnabled() && IsScratchRegisterReleased(GetTarget().GetLinkReg());
897 }
898 
SetFrameSize(size_t size)899 void Encoder::SetFrameSize(size_t size)
900 {
901     frameSize_ = size;
902 }
903 
GetFrameSize() const904 size_t Encoder::GetFrameSize() const
905 {
906     return frameSize_;
907 }
908 
IsScratchRegisterReleased(compiler::Reg reg) const909 bool Encoder::IsScratchRegisterReleased([[maybe_unused]] compiler::Reg reg) const
910 {
911     return false;
912 }
913 
GetScratchRegistersCount() const914 size_t Encoder::GetScratchRegistersCount() const
915 {
916     return GetScratchRegistersMask().Count();
917 }
918 
GetScratchRegistersWithLrCount() const919 size_t Encoder::GetScratchRegistersWithLrCount() const
920 {
921     return GetScratchRegistersCount() + static_cast<size_t>(IsLrAsTempRegEnabledAndReleased());
922 }
923 
GetScratchRegistersMask() const924 RegMask Encoder::GetScratchRegistersMask() const
925 {
926     return 0;
927 }
928 
GetScratchFPRegistersCount() const929 size_t Encoder::GetScratchFPRegistersCount() const
930 {
931     return GetScratchFpRegistersMask().Count();
932 }
933 
GetScratchFpRegistersMask() const934 RegMask Encoder::GetScratchFpRegistersMask() const
935 {
936     return 0;
937 }
938 
939 // Get Scratch registers, that currently are not allocated
GetAvailableScratchRegisters() const940 RegMask Encoder::GetAvailableScratchRegisters() const
941 {
942     return 0;
943 }
944 
945 // Get Floating Point Scratch registers, that currently are not allocated
GetAvailableScratchFpRegisters() const946 VRegMask Encoder::GetAvailableScratchFpRegisters() const
947 {
948     return 0;
949 }
950 
MaxArchInstPerEncoded()951 size_t Encoder::MaxArchInstPerEncoded()
952 {
953     static constexpr size_t MAX_ARCH_INST_PER_ENCODE = 32;
954     return MAX_ARCH_INST_PER_ENCODE;
955 }
956 
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg)957 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg)
958 {
959     SetRegister(mask, vmask, reg, true);
960 }
961 
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg,bool val) const962 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg, bool val) const
963 {
964     if (!reg.IsValid()) {
965         return;
966     }
967     if (reg.IsScalar()) {
968         ASSERT(mask != nullptr);
969         mask->set(reg.GetId(), val);
970     } else {
971         ASSERT(vmask != nullptr);
972         ASSERT(reg.IsFloat());
973         if (vmask != nullptr) {
974             vmask->set(reg.GetId(), val);
975         }
976     }
977 }
978 
GetRefType()979 compiler::TypeInfo Encoder::GetRefType()
980 {
981     return compiler::TypeInfo();
982 }
983 
984 /// Label-holder interfaces
CreateLabel()985 LabelHolder::LabelId Encoder::CreateLabel()
986 {
987     auto labels = GetLabels();
988     ASSERT(labels != nullptr);
989     return labels->CreateLabel();
990 }
991 
BindLabel(LabelHolder::LabelId id)992 void Encoder::BindLabel(LabelHolder::LabelId id)
993 {
994     auto labels = GetLabels();
995     ASSERT(labels != nullptr);
996     ASSERT(labels->Size() > id);
997     labels->BindLabel(id);
998 }
999 
GetLabels() const1000 LabelHolder *Encoder::GetLabels() const
1001 {
1002     return nullptr;
1003 }
1004 }  // namespace ark::compiler
1005