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
EncodeUnsignedExtendBytesToShorts(Reg dst,Reg src)581 void Encoder::EncodeUnsignedExtendBytesToShorts([[maybe_unused]] Reg dst, [[maybe_unused]] Reg src)
582 {
583 SetFalseResult();
584 }
585
SaveRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)586 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
587 [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
588 {
589 SetFalseResult();
590 }
591
LoadRegisters(RegMask registers,ssize_t slot,size_t startReg,bool isFp)592 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] ssize_t slot,
593 [[maybe_unused]] size_t startReg, [[maybe_unused]] bool isFp)
594 {
595 SetFalseResult();
596 }
597
SaveRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)598 void Encoder::SaveRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
599 [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
600 {
601 SetFalseResult();
602 }
603
LoadRegisters(RegMask registers,bool isFp,ssize_t slot,Reg base,RegMask mask)604 void Encoder::LoadRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp,
605 [[maybe_unused]] ssize_t slot, [[maybe_unused]] Reg base, [[maybe_unused]] RegMask mask)
606 {
607 SetFalseResult();
608 }
609
PushRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)610 void Encoder::PushRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
611 {
612 ASSERT(GetArch() != Arch::AARCH64 || isAligned);
613 PushRegisters(regs, false);
614 PushRegisters(fpRegs, true);
615
616 bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
617 if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
618 EncodeSub(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
619 }
620 }
621
PopRegisters(RegMask regs,VRegMask fpRegs,bool isAligned)622 void Encoder::PopRegisters(RegMask regs, VRegMask fpRegs, bool isAligned)
623 {
624 bool isEven {(regs.Count() + fpRegs.Count()) % 2U == 0U};
625 if (GetArch() != Arch::AARCH64 && isEven != isAligned) {
626 EncodeAdd(GetTarget().GetStackReg(), GetTarget().GetStackReg(), Imm(GetTarget().WordSize()));
627 }
628
629 PopRegisters(fpRegs, true);
630 PopRegisters(regs, false);
631 }
632
PushRegisters(RegMask registers,bool isFp)633 void Encoder::PushRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
634 {
635 SetFalseResult();
636 }
637
PopRegisters(RegMask registers,bool isFp)638 void Encoder::PopRegisters([[maybe_unused]] RegMask registers, [[maybe_unused]] bool isFp)
639 {
640 SetFalseResult();
641 }
642
GetRegfile() const643 RegistersDescription *Encoder::GetRegfile() const
644 {
645 ASSERT(regfile_ != nullptr);
646 return regfile_;
647 }
648
SetRegfile(RegistersDescription * regfile)649 void Encoder::SetRegfile(RegistersDescription *regfile)
650 {
651 regfile_ = regfile;
652 }
653
AcquireScratchRegister(compiler::TypeInfo type)654 compiler::Reg Encoder::AcquireScratchRegister([[maybe_unused]] compiler::TypeInfo type)
655 {
656 return compiler::Reg();
657 }
AcquireScratchRegister(compiler::Reg reg)658 void Encoder::AcquireScratchRegister([[maybe_unused]] compiler::Reg reg)
659 {
660 SetFalseResult();
661 }
662
ReleaseScratchRegister(compiler::Reg reg)663 void Encoder::ReleaseScratchRegister([[maybe_unused]] compiler::Reg reg)
664 {
665 SetFalseResult();
666 }
667
MakeCall(compiler::RelocationInfo * relocation)668 void Encoder::MakeCall([[maybe_unused]] compiler::RelocationInfo *relocation)
669 {
670 SetFalseResult();
671 }
672
MakeCall(compiler::LabelHolder::LabelId id)673 void Encoder::MakeCall([[maybe_unused]] compiler::LabelHolder::LabelId id)
674 {
675 SetFalseResult();
676 }
677
MakeCall(const void * entryPoint)678 void Encoder::MakeCall([[maybe_unused]] const void *entryPoint)
679 {
680 SetFalseResult();
681 }
682
MakeCall(Reg reg)683 void Encoder::MakeCall([[maybe_unused]] Reg reg)
684 {
685 SetFalseResult();
686 }
687
MakeCall(compiler::MemRef entryPoint)688 void Encoder::MakeCall([[maybe_unused]] compiler::MemRef entryPoint)
689 {
690 SetFalseResult();
691 }
692
CanMakeCallByOffset(intptr_t offset)693 bool Encoder::CanMakeCallByOffset([[maybe_unused]] intptr_t offset)
694 {
695 return false;
696 }
697
MakeCallAot(intptr_t offset)698 void Encoder::MakeCallAot([[maybe_unused]] intptr_t offset)
699 {
700 SetFalseResult();
701 }
702
MakeCallByOffset(intptr_t offset)703 void Encoder::MakeCallByOffset([[maybe_unused]] intptr_t offset)
704 {
705 SetFalseResult();
706 }
707
MakeLoadAotTable(intptr_t offset,compiler::Reg reg)708 void Encoder::MakeLoadAotTable([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg reg)
709 {
710 SetFalseResult();
711 }
712
MakeLoadAotTableAddr(intptr_t offset,compiler::Reg addr,compiler::Reg val)713 void Encoder::MakeLoadAotTableAddr([[maybe_unused]] intptr_t offset, [[maybe_unused]] compiler::Reg addr,
714 [[maybe_unused]] compiler::Reg val)
715 {
716 SetFalseResult();
717 }
718
719 // Encode unconditional branch
EncodeJump(compiler::LabelHolder::LabelId id)720 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id)
721 {
722 SetFalseResult();
723 }
724
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Condition cond)725 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
726 [[maybe_unused]] compiler::Condition cond)
727 {
728 SetFalseResult();
729 }
730
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)731 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
732 [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
733 {
734 SetFalseResult();
735 }
736
EncodeJump(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)737 void Encoder::EncodeJump([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
738 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
739 {
740 SetFalseResult();
741 }
742
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg reg,compiler::Imm imm,compiler::Condition c)743 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg reg,
744 [[maybe_unused]] compiler::Imm imm, [[maybe_unused]] compiler::Condition c)
745 {
746 SetFalseResult();
747 }
748
EncodeJumpTest(compiler::LabelHolder::LabelId id,compiler::Reg r,compiler::Reg reg,compiler::Condition c)749 void Encoder::EncodeJumpTest([[maybe_unused]] compiler::LabelHolder::LabelId id, [[maybe_unused]] compiler::Reg r,
750 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] compiler::Condition c)
751 {
752 SetFalseResult();
753 }
754
755 // Encode jump by register value
EncodeJump(compiler::Reg reg)756 void Encoder::EncodeJump([[maybe_unused]] compiler::Reg reg)
757 {
758 SetFalseResult();
759 }
760
EncodeJump(RelocationInfo * relocation)761 void Encoder::EncodeJump([[maybe_unused]] RelocationInfo *relocation)
762 {
763 SetFalseResult();
764 }
765
EncodeBitTestAndBranch(compiler::LabelHolder::LabelId id,compiler::Reg reg,uint32_t bitPos,bool bitValue)766 void Encoder::EncodeBitTestAndBranch([[maybe_unused]] compiler::LabelHolder::LabelId id,
767 [[maybe_unused]] compiler::Reg reg, [[maybe_unused]] uint32_t bitPos,
768 [[maybe_unused]] bool bitValue)
769 {
770 SetFalseResult();
771 }
772
EncodeAbort()773 void Encoder::EncodeAbort()
774 {
775 SetFalseResult();
776 }
777
EncodeReturn()778 void Encoder::EncodeReturn()
779 {
780 SetFalseResult();
781 }
782
SetFrameLayout(CFrameLayout fl)783 void Encoder::SetFrameLayout(CFrameLayout fl)
784 {
785 frameLayout_ = fl;
786 }
787
GetFrameLayout() const788 const CFrameLayout &Encoder::GetFrameLayout() const
789 {
790 return frameLayout_;
791 }
792
GetLiveTmpRegMask()793 RegMask Encoder::GetLiveTmpRegMask()
794 {
795 return liveTmpRegs_;
796 }
797
GetLiveTmpFpRegMask()798 VRegMask Encoder::GetLiveTmpFpRegMask()
799 {
800 return liveTmpFpRegs_;
801 }
802
AddRegInLiveMask(Reg reg)803 void Encoder::AddRegInLiveMask(Reg reg)
804 {
805 if (!reg.IsValid()) {
806 return;
807 }
808 if (reg.IsScalar()) {
809 liveTmpRegs_.set(reg.GetId(), true);
810 } else {
811 ASSERT(reg.IsFloat());
812 liveTmpFpRegs_.set(reg.GetId(), true);
813 }
814 }
815
RemoveRegFromLiveMask(Reg reg)816 void Encoder::RemoveRegFromLiveMask(Reg reg)
817 {
818 if (!reg.IsValid()) {
819 return;
820 }
821 if (reg.IsScalar()) {
822 liveTmpRegs_.set(reg.GetId(), false);
823 } else {
824 ASSERT(reg.IsFloat());
825 liveTmpFpRegs_.set(reg.GetId(), false);
826 }
827 }
828
SetCodeOffset(size_t offset)829 void Encoder::SetCodeOffset(size_t offset)
830 {
831 codeOffset_ = offset;
832 }
833
GetCodeOffset() const834 size_t Encoder::GetCodeOffset() const
835 {
836 return codeOffset_;
837 }
838
EnableLrAsTempReg(bool value)839 void Encoder::EnableLrAsTempReg(bool value)
840 {
841 enableLrAsTempReg_ = value;
842 }
843
IsLrAsTempRegEnabled() const844 bool Encoder::IsLrAsTempRegEnabled() const
845 {
846 return enableLrAsTempReg_;
847 }
848
IsLrAsTempRegEnabledAndReleased() const849 bool Encoder::IsLrAsTempRegEnabledAndReleased() const
850 {
851 return IsLrAsTempRegEnabled() && IsScratchRegisterReleased(GetTarget().GetLinkReg());
852 }
853
SetFrameSize(size_t size)854 void Encoder::SetFrameSize(size_t size)
855 {
856 frameSize_ = size;
857 }
858
GetFrameSize() const859 size_t Encoder::GetFrameSize() const
860 {
861 return frameSize_;
862 }
863
IsScratchRegisterReleased(compiler::Reg reg) const864 bool Encoder::IsScratchRegisterReleased([[maybe_unused]] compiler::Reg reg) const
865 {
866 return false;
867 }
868
GetScratchRegistersCount() const869 size_t Encoder::GetScratchRegistersCount() const
870 {
871 return GetScratchRegistersMask().Count();
872 }
873
GetScratchRegistersWithLrCount() const874 size_t Encoder::GetScratchRegistersWithLrCount() const
875 {
876 return GetScratchRegistersCount() + static_cast<size_t>(IsLrAsTempRegEnabledAndReleased());
877 }
878
GetScratchRegistersMask() const879 RegMask Encoder::GetScratchRegistersMask() const
880 {
881 return 0;
882 }
883
GetScratchFPRegistersCount() const884 size_t Encoder::GetScratchFPRegistersCount() const
885 {
886 return GetScratchFpRegistersMask().Count();
887 }
888
GetScratchFpRegistersMask() const889 RegMask Encoder::GetScratchFpRegistersMask() const
890 {
891 return 0;
892 }
893
894 // Get Scratch registers, that currently are not allocated
GetAvailableScratchRegisters() const895 RegMask Encoder::GetAvailableScratchRegisters() const
896 {
897 return 0;
898 }
899
900 // Get Floating Point Scratch registers, that currently are not allocated
GetAvailableScratchFpRegisters() const901 VRegMask Encoder::GetAvailableScratchFpRegisters() const
902 {
903 return 0;
904 }
905
MaxArchInstPerEncoded()906 size_t Encoder::MaxArchInstPerEncoded()
907 {
908 static constexpr size_t MAX_ARCH_INST_PER_ENCODE = 32;
909 return MAX_ARCH_INST_PER_ENCODE;
910 }
911
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg)912 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg)
913 {
914 SetRegister(mask, vmask, reg, true);
915 }
916
SetRegister(RegMask * mask,VRegMask * vmask,Reg reg,bool val) const917 void Encoder::SetRegister(RegMask *mask, VRegMask *vmask, Reg reg, bool val) const
918 {
919 if (!reg.IsValid()) {
920 return;
921 }
922 if (reg.IsScalar()) {
923 ASSERT(mask != nullptr);
924 mask->set(reg.GetId(), val);
925 } else {
926 ASSERT(vmask != nullptr);
927 ASSERT(reg.IsFloat());
928 if (vmask != nullptr) {
929 vmask->set(reg.GetId(), val);
930 }
931 }
932 }
933
GetRefType()934 compiler::TypeInfo Encoder::GetRefType()
935 {
936 return compiler::TypeInfo();
937 }
938
939 /// Label-holder interfaces
CreateLabel()940 LabelHolder::LabelId Encoder::CreateLabel()
941 {
942 auto labels = GetLabels();
943 ASSERT(labels != nullptr);
944 return labels->CreateLabel();
945 }
946
BindLabel(LabelHolder::LabelId id)947 void Encoder::BindLabel(LabelHolder::LabelId id)
948 {
949 auto labels = GetLabels();
950 ASSERT(labels != nullptr);
951 ASSERT(labels->Size() > id);
952 labels->BindLabel(id);
953 }
954
GetLabels() const955 LabelHolder *Encoder::GetLabels() const
956 {
957 return nullptr;
958 }
959 } // namespace ark::compiler
960