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