1 /*
2 * Copyright (c) 2024 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
EncodeCast(Reg dst,bool dstSigned,Reg src,bool srcSigned)104 void Encoder::EncodeCast([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src,
105 [[maybe_unused]] bool srcSigned)
106 {
107 SetFalseResult();
108 }
EncodeCastToBool(Reg dst,Reg src)109 void Encoder::EncodeCastToBool([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
110 {
111 SetFalseResult();
112 }
113
EncodeMin(Reg dst,bool dstSigned,Reg src0,Reg src1)114 void Encoder::EncodeMin([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
115 [[maybe_unused]] Reg src1)
116 {
117 SetFalseResult();
118 }
119
EncodeDiv(Reg dst,bool dstSigned,Reg src0,Reg src1)120 void Encoder::EncodeDiv([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
121 [[maybe_unused]] Reg src1)
122 {
123 SetFalseResult();
124 }
125
EncodeMod(Reg dst,bool dstSigned,Reg src0,Reg src1)126 void Encoder::EncodeMod([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
127 [[maybe_unused]] Reg src1)
128 {
129 SetFalseResult();
130 }
131
EncodeDiv(Reg dst,Reg src0,Imm imm,bool isSigned)132 void Encoder::EncodeDiv([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Imm imm,
133 [[maybe_unused]] bool isSigned)
134 {
135 SetFalseResult();
136 }
137
EncodeMod(Reg dst,Reg src0,Imm imm,bool isSigned)138 void Encoder::EncodeMod([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Imm imm,
139 [[maybe_unused]] bool isSigned)
140 {
141 SetFalseResult();
142 }
143
EncodeMax(Reg dst,bool dstSigned,Reg src0,Reg src1)144 void Encoder::EncodeMax([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] Reg src0,
145 [[maybe_unused]] Reg src1)
146 {
147 SetFalseResult();
148 }
EncodeMov(Reg dst,Imm src)149 void Encoder::EncodeMov([[maybe_unused]] Reg dst, [[maybe_unused]] Imm src)
150 {
151 SetFalseResult();
152 }
153
EncodeLdr(Reg dst,bool dstSigned,MemRef mem)154 void Encoder::EncodeLdr([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] MemRef mem)
155 {
156 SetFalseResult();
157 }
158
EncodeLdrAcquire(Reg dst,bool dstSigned,MemRef mem)159 void Encoder::EncodeLdrAcquire([[maybe_unused]] Reg dst, [[maybe_unused]] bool dstSigned, [[maybe_unused]] MemRef mem)
160 {
161 SetFalseResult();
162 }
EncodeStr(Reg src,MemRef mem)163 void Encoder::EncodeStr([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
164 {
165 SetFalseResult();
166 }
EncodeStrRelease(Reg src,MemRef mem)167 void Encoder::EncodeStrRelease([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
168 {
169 SetFalseResult();
170 }
EncodeLdrExclusive(Reg dst,Reg addr,bool acquire)171 void Encoder::EncodeLdrExclusive([[maybe_unused]] Reg dst, [[maybe_unused]] Reg addr, [[maybe_unused]] bool acquire)
172 {
173 SetFalseResult();
174 }
175
EncodeStrExclusive(Reg dst,Reg src,Reg addr,bool release)176 void Encoder::EncodeStrExclusive([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src, [[maybe_unused]] Reg addr,
177 [[maybe_unused]] bool release)
178 {
179 SetFalseResult();
180 }
181
182 // zerod high part: [reg.size, 64)
EncodeStrz(Reg src,MemRef mem)183 void Encoder::EncodeStrz([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
184 {
185 SetFalseResult();
186 }
Push(Reg src,MemRef mem)187 void Encoder::Push([[maybe_unused]] Reg src, [[maybe_unused]] MemRef mem)
188 {
189 SetFalseResult();
190 }
191
EncodeSti(int64_t src,uint8_t srcSizeBytes,MemRef mem)192 void Encoder::EncodeSti([[maybe_unused]] int64_t src, [[maybe_unused]] uint8_t srcSizeBytes,
193 [[maybe_unused]] MemRef mem)
194 {
195 SetFalseResult();
196 }
EncodeSti(double src,MemRef mem)197 void Encoder::EncodeSti([[maybe_unused]] double src, [[maybe_unused]] MemRef mem)
198 {
199 SetFalseResult();
200 }
EncodeSti(float src,MemRef mem)201 void Encoder::EncodeSti([[maybe_unused]] float src, [[maybe_unused]] MemRef mem)
202 {
203 SetFalseResult();
204 }
205
EncodeMemCopy(MemRef memFrom,MemRef memTo,size_t size)206 void Encoder::EncodeMemCopy([[maybe_unused]] MemRef memFrom, [[maybe_unused]] MemRef memTo,
207 [[maybe_unused]] size_t size)
208 {
209 SetFalseResult();
210 }
211
EncodeMemCopyz(MemRef memFrom,MemRef memTo,size_t size)212 void Encoder::EncodeMemCopyz([[maybe_unused]] MemRef memFrom, [[maybe_unused]] MemRef memTo,
213 [[maybe_unused]] size_t size)
214 {
215 SetFalseResult();
216 }
217
EncodeCmp(Reg dst,Reg src0,Reg src1,Condition cc)218 void Encoder::EncodeCmp([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
219 [[maybe_unused]] Condition cc)
220 {
221 SetFalseResult();
222 }
223
EncodeCompare(Reg dst,Reg src0,Reg src1,Condition cc)224 void Encoder::EncodeCompare([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
225 [[maybe_unused]] Condition cc)
226 {
227 SetFalseResult();
228 }
229
EncodeCompareTest(Reg dst,Reg src0,Reg src1,Condition cc)230 void Encoder::EncodeCompareTest([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
231 [[maybe_unused]] Condition cc)
232 {
233 SetFalseResult();
234 }
235
EncodeAtomicByteOr(Reg addr,Reg value,bool fastEncoding)236 void Encoder::EncodeAtomicByteOr([[maybe_unused]] Reg addr, [[maybe_unused]] Reg value,
237 [[maybe_unused]] bool fastEncoding)
238 {
239 SetFalseResult();
240 }
241
EncodeCompressedStringCharAt(ArgsCompressedStringCharAt && args)242 void Encoder::EncodeCompressedStringCharAt([[maybe_unused]] ArgsCompressedStringCharAt &&args)
243 {
244 SetFalseResult();
245 }
246
EncodeCompressedStringCharAtI(ArgsCompressedStringCharAtI && args)247 void Encoder::EncodeCompressedStringCharAtI([[maybe_unused]] ArgsCompressedStringCharAtI &&args)
248 {
249 SetFalseResult();
250 }
251
EncodeSelect(ArgsSelect && args)252 void Encoder::EncodeSelect([[maybe_unused]] ArgsSelect &&args)
253 {
254 SetFalseResult();
255 }
256
EncodeSelectTest(ArgsSelect && args)257 void Encoder::EncodeSelectTest([[maybe_unused]] ArgsSelect &&args)
258 {
259 SetFalseResult();
260 }
261
EncodeIsInf(Reg dst,Reg src0)262 void Encoder::EncodeIsInf([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
263 {
264 SetFalseResult();
265 }
266
EncodeIsInteger(Reg dst,Reg src0)267 void Encoder::EncodeIsInteger([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
268 {
269 SetFalseResult();
270 }
271
EncodeIsSafeInteger(Reg dst,Reg src0)272 void Encoder::EncodeIsSafeInteger([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0)
273 {
274 SetFalseResult();
275 }
276
EncodeReverseBytes(Reg dst,Reg src)277 void Encoder::EncodeReverseBytes([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
278 {
279 SetFalseResult();
280 }
281
EncodeReverseHalfWords(Reg dst,Reg src)282 void Encoder::EncodeReverseHalfWords([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
283 {
284 SetFalseResult();
285 }
286
EncodeReverseBits(Reg dst,Reg src)287 void Encoder::EncodeReverseBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
288 {
289 SetFalseResult();
290 }
291
EncodeBitCount(Reg dst,Reg src)292 void Encoder::EncodeBitCount([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
293 {
294 SetFalseResult();
295 }
296
EncodeRotate(Reg dst,Reg src1,Reg src2,bool isRor)297 void Encoder::EncodeRotate([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src1, [[maybe_unused]] Reg src2,
298 [[maybe_unused]] bool isRor)
299 {
300 SetFalseResult();
301 }
302
EncodeSignum(Reg dst,Reg src)303 void Encoder::EncodeSignum([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
304 {
305 SetFalseResult();
306 }
307
EncodeCountLeadingZeroBits(Reg dst,Reg src)308 void Encoder::EncodeCountLeadingZeroBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
309 {
310 SetFalseResult();
311 }
312
EncodeCountTrailingZeroBits(Reg dst,Reg src)313 void Encoder::EncodeCountTrailingZeroBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
314 {
315 SetFalseResult();
316 }
317
EncodeCeil(Reg dst,Reg src)318 void Encoder::EncodeCeil([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
319 {
320 SetFalseResult();
321 }
322
EncodeFloor(Reg dst,Reg src)323 void Encoder::EncodeFloor([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
324 {
325 SetFalseResult();
326 }
327
EncodeRint(Reg dst,Reg src)328 void Encoder::EncodeRint([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
329 {
330 SetFalseResult();
331 }
332
EncodeTrunc(Reg dst,Reg src)333 void Encoder::EncodeTrunc([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
334 {
335 SetFalseResult();
336 }
337
EncodeRoundAway(Reg dst,Reg src)338 void Encoder::EncodeRoundAway([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
339 {
340 SetFalseResult();
341 }
342
EncodeRoundToPInf(Reg dst,Reg src)343 void Encoder::EncodeRoundToPInf([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
344 {
345 SetFalseResult();
346 }
347
EncodeSelect(ArgsSelectImm && args)348 void Encoder::EncodeSelect([[maybe_unused]] ArgsSelectImm &&args)
349 {
350 SetFalseResult();
351 }
352
EncodeSelectTest(ArgsSelectImm && args)353 void Encoder::EncodeSelectTest([[maybe_unused]] ArgsSelectImm &&args)
354 {
355 SetFalseResult();
356 }
357
EncodeGetTypeSize(Reg size,Reg type)358 void Encoder::EncodeGetTypeSize([[maybe_unused]] Reg size, [[maybe_unused]] Reg type)
359 {
360 SetFalseResult();
361 }
362
EncodeLdp(Reg dst0,Reg dst1,bool dstSigned,MemRef mem)363 void Encoder::EncodeLdp([[maybe_unused]] Reg dst0, [[maybe_unused]] Reg dst1, [[maybe_unused]] bool dstSigned,
364 [[maybe_unused]] MemRef mem)
365 {
366 SetFalseResult();
367 }
368
EncodeStp(Reg src0,Reg src1,MemRef mem)369 void Encoder::EncodeStp([[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1, [[maybe_unused]] MemRef mem)
370 {
371 SetFalseResult();
372 }
373
EncodeMAdd(Reg dst,Reg src0,Reg src1,Reg src2)374 void Encoder::EncodeMAdd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
375 [[maybe_unused]] Reg src2)
376 {
377 SetFalseResult();
378 }
379
EncodeMSub(Reg dst,Reg src0,Reg src1,Reg src2)380 void Encoder::EncodeMSub([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1,
381 [[maybe_unused]] Reg src2)
382 {
383 SetFalseResult();
384 }
385
EncodeMNeg(Reg dst,Reg src0,Reg src1)386 void Encoder::EncodeMNeg([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
387 {
388 SetFalseResult();
389 }
390
EncodeOrNot(Reg dst,Reg src0,Reg src1)391 void Encoder::EncodeOrNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
392 {
393 SetFalseResult();
394 }
395
EncodeAndNot(Reg dst,Reg src0,Reg src1)396 void Encoder::EncodeAndNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
397 {
398 SetFalseResult();
399 }
400
EncodeXorNot(Reg dst,Reg src0,Reg src1)401 void Encoder::EncodeXorNot([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src0, [[maybe_unused]] Reg src1)
402 {
403 SetFalseResult();
404 }
405
EncodeNeg(Reg dst,Shift src)406 void Encoder::EncodeNeg([[maybe_unused]] Reg dst, [[maybe_unused]] Shift src)
407 {
408 SetFalseResult();
409 }
410
EncodeFpToBits(Reg dst,Reg src)411 void Encoder::EncodeFpToBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
412 {
413 SetFalseResult();
414 }
415
EncodeMoveBitsRaw(Reg dst,Reg src)416 void Encoder::EncodeMoveBitsRaw([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
417 {
418 SetFalseResult();
419 }
420
EncodeExtractBits(Reg dst,Reg src,Imm imm1,Imm imm2)421 void Encoder::EncodeExtractBits([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src, [[maybe_unused]] Imm imm1,
422 [[maybe_unused]] Imm imm2)
423 {
424 success_ = false;
425 }
426
EncodeCrc32Update(Reg dst,Reg crcReg,Reg valReg)427 void Encoder::EncodeCrc32Update([[maybe_unused]] Reg dst, [[maybe_unused]] Reg crcReg, [[maybe_unused]] Reg valReg)
428 {
429 SetFalseResult();
430 }
431
EncodeStackOverflowCheck(ssize_t offset)432 void Encoder::EncodeStackOverflowCheck([[maybe_unused]] ssize_t offset)
433 {
434 SetFalseResult();
435 }
436
IsValid() const437 bool Encoder::IsValid() const
438 {
439 return false;
440 }
441
GetResult() const442 bool Encoder::GetResult() const
443 {
444 return success_;
445 }
446
SetFalseResult()447 void Encoder::SetFalseResult()
448 {
449 success_ = false;
450 }
451
CanEncodeImmAddSubCmp(int64_t imm,uint32_t size,bool signedCompare)452 bool Encoder::CanEncodeImmAddSubCmp([[maybe_unused]] int64_t imm, [[maybe_unused]] uint32_t size,
453 [[maybe_unused]] bool signedCompare)
454 {
455 return false;
456 }
457
CanEncodeImmMulDivMod(uint64_t imm,uint32_t size)458 bool Encoder::CanEncodeImmMulDivMod([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
459 {
460 return false;
461 }
462
CanOptimizeImmDivMod(uint64_t imm,bool isSigned) const463 bool Encoder::CanOptimizeImmDivMod([[maybe_unused]] uint64_t imm, [[maybe_unused]] bool isSigned) const
464 {
465 return false;
466 }
467
CanEncodeImmLogical(uint64_t imm,uint32_t size)468 bool Encoder::CanEncodeImmLogical([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
469 {
470 return false;
471 }
472
CanEncodeScale(uint64_t imm,uint32_t size)473 bool Encoder::CanEncodeScale([[maybe_unused]] uint64_t imm, [[maybe_unused]] uint32_t size)
474 {
475 return false;
476 }
477
CanEncodeShift(uint32_t size)478 bool Encoder::CanEncodeShift([[maybe_unused]] uint32_t size)
479 {
480 return true;
481 }
CanEncodeBitCount()482 bool Encoder::CanEncodeBitCount()
483 {
484 return false;
485 }
486
CanEncodeMAdd()487 bool Encoder::CanEncodeMAdd()
488 {
489 return false;
490 }
491
CanEncodeMSub()492 bool Encoder::CanEncodeMSub()
493 {
494 return false;
495 }
496
CanEncodeMNeg()497 bool Encoder::CanEncodeMNeg()
498 {
499 return false;
500 }
501
CanEncodeOrNot()502 bool Encoder::CanEncodeOrNot()
503 {
504 return false;
505 }
506
CanEncodeAndNot()507 bool Encoder::CanEncodeAndNot()
508 {
509 return false;
510 }
511
CanEncodeXorNot()512 bool Encoder::CanEncodeXorNot()
513 {
514 return false;
515 }
516
CanEncodeShiftedOperand(ShiftOpcode opcode,ShiftType shiftType)517 bool Encoder::CanEncodeShiftedOperand([[maybe_unused]] ShiftOpcode opcode, [[maybe_unused]] ShiftType shiftType)
518 {
519 return false;
520 }
521
CanEncodeCompressedStringCharAt()522 bool Encoder::CanEncodeCompressedStringCharAt()
523 {
524 return false;
525 }
526
CanEncodeCompressedStringCharAtI()527 bool Encoder::CanEncodeCompressedStringCharAtI()
528 {
529 return false;
530 }
531
CanEncodeFloatSelect()532 bool Encoder::CanEncodeFloatSelect()
533 {
534 return false;
535 }
536
EncodeCompareAndSwap(Reg dst,Reg obj,Reg offset,Reg val,Reg newval)537 void Encoder::EncodeCompareAndSwap([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
538 [[maybe_unused]] Reg val, [[maybe_unused]] Reg newval)
539 {
540 SetFalseResult();
541 }
542
EncodeCompareAndSwap(Reg dst,Reg addr,Reg val,Reg newval)543 void Encoder::EncodeCompareAndSwap([[maybe_unused]] Reg dst, [[maybe_unused]] Reg addr, [[maybe_unused]] Reg val,
544 [[maybe_unused]] Reg newval)
545 {
546 SetFalseResult();
547 }
548
EncodeUnsafeGetAndSet(Reg dst,Reg obj,Reg offset,Reg val)549 void Encoder::EncodeUnsafeGetAndSet([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
550 [[maybe_unused]] Reg val)
551 {
552 SetFalseResult();
553 }
554
EncodeUnsafeGetAndAdd(Reg dst,Reg obj,Reg offset,Reg val,Reg tmp)555 void Encoder::EncodeUnsafeGetAndAdd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg obj, [[maybe_unused]] Reg offset,
556 [[maybe_unused]] Reg val, [[maybe_unused]] Reg tmp)
557 {
558 SetFalseResult();
559 }
560
EncodeMemoryBarrier(memory_order::Order order)561 void Encoder::EncodeMemoryBarrier([[maybe_unused]] memory_order::Order order)
562 {
563 SetFalseResult();
564 }
565
GetCursorOffset() const566 size_t Encoder::GetCursorOffset() const
567 {
568 return 0;
569 }
570
EncodeCompressEightUtf16ToUtf8CharsUsingSimd(Reg srcAddr,Reg dstAddr)571 void Encoder::EncodeCompressEightUtf16ToUtf8CharsUsingSimd([[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg dstAddr)
572 {
573 SetFalseResult();
574 }
575
EncodeCompressSixteenUtf16ToUtf8CharsUsingSimd(Reg srcAddr,Reg dstAddr)576 void Encoder::EncodeCompressSixteenUtf16ToUtf8CharsUsingSimd([[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg dstAddr)
577 {
578 SetFalseResult();
579 }
580
EncodeMemCharU8X32UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)581 void Encoder::EncodeMemCharU8X32UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
582 [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
583 {
584 SetFalseResult();
585 }
586
EncodeMemCharU16X16UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)587 void Encoder::EncodeMemCharU16X16UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
588 [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
589 {
590 SetFalseResult();
591 }
592
EncodeMemCharU8X16UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)593 void Encoder::EncodeMemCharU8X16UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
594 [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
595 {
596 SetFalseResult();
597 }
598
EncodeMemCharU16X8UsingSimd(Reg dst,Reg ch,Reg srcAddr,Reg tmp)599 void Encoder::EncodeMemCharU16X8UsingSimd([[maybe_unused]] Reg dst, [[maybe_unused]] Reg ch,
600 [[maybe_unused]] Reg srcAddr, [[maybe_unused]] Reg tmp)
601 {
602 SetFalseResult();
603 }
604
EncodeUnsignedExtendBytesToShorts(Reg dst,Reg src)605 void Encoder::EncodeUnsignedExtendBytesToShorts([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
606 {
607 SetFalseResult();
608 }
609
SaveRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)610 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
611 [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
612 {
613 SetFalseResult();
614 }
615
LoadRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)616 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
617 [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
618 {
619 SetFalseResult();
620 }
621
SaveRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)622 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
623 [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
624 {
625 SetFalseResult();
626 }
627
LoadRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)628 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
629 [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
630 {
631 SetFalseResult();
632 }
633
PushRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)634 void Encoder::PushRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
635 {
636 ASSERT(GetArch() != Arch::AARCH64 || isAligned);
637 PushRegisters(regs, false);
638 PushRegisters(fpRegs, true);
639
640 bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
641 if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
642 EncodeSub(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
643 }
644 }
645
PopRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)646 void Encoder::PopRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
647 {
648 bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
649 if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
650 EncodeAdd(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
651 }
652
653 PopRegisters(fpRegs, true);
654 PopRegisters(regs, false);
655 }
656
PushRegisters(RegMask registers,bool isFp)657 void Encoder::PushRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
658 {
659 SetFalseResult();
660 }
661
PopRegisters(RegMask registers,bool isFp)662 void Encoder::PopRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
663 {
664 SetFalseResult();
665 }
666
GetRegfile() const667 RegistersDescription *Encoder::GetRegfile() const
668 {
669 ASSERT(regfile_ != nullptr);
670 return regfile_;
671 }
672
SetRegfile(RegistersDescription * regfile)673 void Encoder::SetRegfile(RegistersDescription *regfile)
674 {
675 regfile_ = regfile;
676 }
677
AcquireScratchRegister(compiler::TypeInfo type)678 compiler::Reg Encoder::AcquireScratchRegister([[maybe_unused]] compiler::TypeInfo type)
679 {
680 return compiler::Reg();
681 }
AcquireScratchRegister(compiler::Reg reg)682 void Encoder::AcquireScratchRegister([[maybe_unused]] compiler::Reg reg)
683 {
684 SetFalseResult();
685 }
686
ReleaseScratchRegister(compiler::Reg reg)687 void Encoder::ReleaseScratchRegister([[maybe_unused]] compiler::Reg reg)
688 {
689 SetFalseResult();
690 }
691
MakeCall(compiler::RelocationInfo * relocation)692 void Encoder::MakeCall([[maybe_unused]] compiler::RelocationInfo *relocation)
693 {
694 SetFalseResult();
695 }
696
MakeCall(compiler::LabelHolder::LabelId id)697 void Encoder::MakeCall([[maybe_unused]] compiler::LabelHolder::LabelId id)
698 {
699 SetFalseResult();
700 }
701
MakeCall(const void * entryPoint)702 void Encoder::MakeCall([[maybe_unused]] const void *entryPoint)
703 {
704 SetFalseResult();
705 }
706
MakeCall(Reg reg)707 void Encoder::MakeCall([[maybe_unused]] Reg reg)
708 {
709 SetFalseResult();
710 }
711
MakeCall(compiler::MemRef entryPoint)712 void Encoder::MakeCall([[maybe_unused]] compiler::MemRef entryPoint)
713 {
714 SetFalseResult();
715 }
716
CanMakeCallByOffset(intptr_t offset)717 bool Encoder::CanMakeCallByOffset([[maybe_unused]] intptr_t offset)
718 {
719 return false;
720 }
721
MakeCallAot(intptr_t offset)722 void Encoder::MakeCallAot([[maybe_unused]] intptr_t offset)
723 {
724 SetFalseResult();
725 }
726
MakeCallByOffset(intptr_t offset)727 void Encoder::MakeCallByOffset([[maybe_unused]] intptr_t offset)
728 {
729 SetFalseResult();
730 }
731
MakeLoadAotTable(intptr_t offset,compiler::Reg reg)732 void Encoder::MakeLoadAotTable([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg reg)
733 {
734 SetFalseResult();
735 }
736
MakeLoadAotTableAddr(intptr_t offset,compiler::Reg addr,compiler::Reg val)737 void Encoder::MakeLoadAotTableAddr([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg addr,
738 [[maybe_unused]] compiler::Reg val)
739 {
740 SetFalseResult();
741 }
742
743 // Encode unconditional branch
EncodeJump(compiler::LabelHolder::LabelId id)744 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id)
745 {
746 SetFalseResult();
747 }
748
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Condition cond)749 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
750 [[maybe_unused]] compiler::Condition cond)
751 {
752 SetFalseResult();
753 }
754
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)755 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
756 [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
757 {
758 SetFalseResult();
759 }
760
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)761 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
762 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
763 {
764 SetFalseResult();
765 }
766
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)767 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
768 [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
769 {
770 SetFalseResult();
771 }
772
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)773 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
774 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
775 {
776 SetFalseResult();
777 }
778
779 // Encode jump by register value
EncodeJump(compiler::Reg reg)780 void Encoder::EncodeJump([[maybe_unused]] compiler::Reg reg)
781 {
782 SetFalseResult();
783 }
784
EncodeJump(RelocationInfo * relocation)785 void Encoder::EncodeJump([[maybe_unused]] RelocationInfo *relocation)
786 {
787 SetFalseResult();
788 }
789
EncodeBitTestAndBranch(compiler::LabelHolder::LabelId id,compiler::Reg reg,uint32_t bitPos,bool bitValue)790 void Encoder::EncodeBitTestAndBranch([[maybe_unused]] compiler::LabelHolder::LabelId id,
791 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] uint32_t bitPos,
792 [[maybe_unused]] bool bitValue)
793 {
794 SetFalseResult();
795 }
796
EncodeAbort()797 void Encoder::EncodeAbort()
798 {
799 SetFalseResult();
800 }
801
EncodeReturn()802 void Encoder::EncodeReturn()
803 {
804 SetFalseResult();
805 }
806
SetFrameLayout(CFrameLayout fl)807 void Encoder::SetFrameLayout(CFrameLayout fl)
808 {
809 frameLayout_ = fl;
810 }
811
GetFrameLayout() const812 const CFrameLayout &Encoder::GetFrameLayout() const
813 {
814 return frameLayout_;
815 }
816
GetLiveTmpRegMask()817 RegMask Encoder::GetLiveTmpRegMask()
818 {
819 return liveTmpRegs_;
820 }
821
GetLiveTmpFpRegMask()822 VRegMask Encoder::GetLiveTmpFpRegMask()
823 {
824 return liveTmpFpRegs_;
825 }
826
AddRegInLiveMask(Reg reg)827 void Encoder::AddRegInLiveMask(Reg reg)
828 {
829 if (!reg.IsValid()) {
830 return;
831 }
832 if (reg.IsScalar()) {
833 liveTmpRegs_.set(reg.GetId(), true);
834 } else {
835 ASSERT(reg.IsFloat());
836 liveTmpFpRegs_.set(reg.GetId(), true);
837 }
838 }
839
RemoveRegFromLiveMask(Reg reg)840 void Encoder::RemoveRegFromLiveMask(Reg reg)
841 {
842 if (!reg.IsValid()) {
843 return;
844 }
845 if (reg.IsScalar()) {
846 liveTmpRegs_.set(reg.GetId(), false);
847 } else {
848 ASSERT(reg.IsFloat());
849 liveTmpFpRegs_.set(reg.GetId(), false);
850 }
851 }
852
SetCodeOffset(size_t offset)853 void Encoder::SetCodeOffset(size_t offset)
854 {
855 codeOffset_ = offset;
856 }
857
GetCodeOffset() const858 size_t Encoder::GetCodeOffset() const
859 {
860 return codeOffset_;
861 }
862
EnableLrAsTempReg(bool value)863 void Encoder::EnableLrAsTempReg(bool value)
864 {
865 enableLrAsTempReg_ = value;
866 }
867
IsLrAsTempRegEnabled() const868 bool Encoder::IsLrAsTempRegEnabled() const
869 {
870 return enableLrAsTempReg_;
871 }
872
IsLrAsTempRegEnabledAndReleased() const873 bool Encoder::IsLrAsTempRegEnabledAndReleased() const
874 {
875 return IsLrAsTempRegEnabled() && IsScratchRegisterReleased(GetTarget().GetLinkReg());
876 }
877
SetFrameSize(size_t size)878 void Encoder::SetFrameSize(size_t size)
879 {
880 frameSize_ = size;
881 }
882
GetFrameSize() const883 size_t Encoder::GetFrameSize() const
884 {
885 return frameSize_;
886 }
887
IsScratchRegisterReleased(compiler::Reg reg) const888 bool Encoder::IsScratchRegisterReleased([[maybe_unused]] compiler::Reg reg) const
889 {
890 return false;
891 }
892
GetScratchRegistersCount() const893 size_t Encoder::GetScratchRegistersCount() const
894 {
895 return GetScratchRegistersMask().Count();
896 }
897
GetScratchRegistersWithLrCount() const898 size_t Encoder::GetScratchRegistersWithLrCount() const
899 {
900 return GetScratchRegistersCount() + static_cast<size_t>(IsLrAsTempRegEnabledAndReleased());
901 }
902
GetScratchRegistersMask() const903 RegMask Encoder::GetScratchRegistersMask() const
904 {
905 return 0;
906 }
907
GetScratchFPRegistersCount() const908 size_t Encoder::GetScratchFPRegistersCount() const
909 {
910 return GetScratchFpRegistersMask().Count();
911 }
912
GetScratchFpRegistersMask() const913 RegMask Encoder::GetScratchFpRegistersMask() const
914 {
915 return 0;
916 }
917
918 // Get Scratch registers, that currently are not allocated
GetAvailableScratchRegisters() const919 RegMask Encoder::GetAvailableScratchRegisters() const
920 {
921 return 0;
922 }
923
924 // Get Floating Point Scratch registers, that currently are not allocated
GetAvailableScratchFpRegisters() const925 VRegMask Encoder::GetAvailableScratchFpRegisters() const
926 {
927 return 0;
928 }
929
MaxArchInstPerEncoded()930 size_t Encoder::MaxArchInstPerEncoded()
931 {
932 static constexpr size_t MAX_ARCH_INST_PER_ENCODE = 32;
933 return MAX_ARCH_INST_PER_ENCODE;
934 }
935
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg)936 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg)
937 {
938 SetRegister(mask, vmask, reg, true);
939 }
940
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg,bool val) const941 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg, bool val) const
942 {
943 if (!reg.IsValid()) {
944 return;
945 }
946 if (reg.IsScalar()) {
947 ASSERT(mask != nullptr);
948 mask->set(reg.GetId(), val);
949 } else {
950 ASSERT(vmask != nullptr);
951 ASSERT(reg.IsFloat());
952 if (vmask != nullptr) {
953 vmask->set(reg.GetId(), val);
954 }
955 }
956 }
957
GetRefType()958 compiler::TypeInfo Encoder::GetRefType()
959 {
960 return compiler::TypeInfo();
961 }
962
963 /// Label-holder interfaces
CreateLabel()964 LabelHolder::LabelId Encoder::CreateLabel()
965 {
966 auto labels = GetLabels();
967 ASSERT(labels != nullptr);
968 return labels->CreateLabel();
969 }
970
BindLabel(LabelHolder::LabelId id)971 void Encoder::BindLabel(LabelHolder::LabelId id)
972 {
973 auto labels = GetLabels();
974 ASSERT(labels != nullptr);
975 ASSERT(labels->Size() > id);
976 labels->BindLabel(id);
977 }
978
GetLabels() const979 LabelHolder *Encoder::GetLabels() const
980 {
981 return nullptr;
982 }
983 } // namespace ark::compiler
984