@@ -345,4 +345,225 @@ static inline bool unsigned_imm_check(unsigned long val, unsigned int bit)
345
345
return val < (1UL << bit );
346
346
}
347
347
348
+ #define DEF_EMIT_REG0I26_FORMAT (NAME , OP ) \
349
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
350
+ int offset) \
351
+ { \
352
+ unsigned int immediate_l, immediate_h; \
353
+ \
354
+ immediate_l = offset & 0xffff; \
355
+ offset >>= 16; \
356
+ immediate_h = offset & 0x3ff; \
357
+ \
358
+ insn->reg0i26_format.opcode = OP; \
359
+ insn->reg0i26_format.immediate_l = immediate_l; \
360
+ insn->reg0i26_format.immediate_h = immediate_h; \
361
+ }
362
+
363
+ DEF_EMIT_REG0I26_FORMAT (b , b_op )
364
+
365
+ #define DEF_EMIT_REG1I20_FORMAT (NAME , OP ) \
366
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
367
+ enum loongarch_gpr rd, int imm) \
368
+ { \
369
+ insn->reg1i20_format.opcode = OP; \
370
+ insn->reg1i20_format.immediate = imm; \
371
+ insn->reg1i20_format.rd = rd; \
372
+ }
373
+
374
+ DEF_EMIT_REG1I20_FORMAT (lu12iw , lu12iw_op )
375
+ DEF_EMIT_REG1I20_FORMAT (lu32id , lu32id_op )
376
+ DEF_EMIT_REG1I20_FORMAT (pcaddu18i , pcaddu18i_op )
377
+
378
+ #define DEF_EMIT_REG2_FORMAT (NAME , OP ) \
379
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
380
+ enum loongarch_gpr rd, \
381
+ enum loongarch_gpr rj) \
382
+ { \
383
+ insn->reg2_format.opcode = OP; \
384
+ insn->reg2_format.rd = rd; \
385
+ insn->reg2_format.rj = rj; \
386
+ }
387
+
388
+ DEF_EMIT_REG2_FORMAT (revb2h , revb2h_op )
389
+ DEF_EMIT_REG2_FORMAT (revb2w , revb2w_op )
390
+ DEF_EMIT_REG2_FORMAT (revbd , revbd_op )
391
+
392
+ #define DEF_EMIT_REG2I5_FORMAT (NAME , OP ) \
393
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
394
+ enum loongarch_gpr rd, \
395
+ enum loongarch_gpr rj, \
396
+ int imm) \
397
+ { \
398
+ insn->reg2i5_format.opcode = OP; \
399
+ insn->reg2i5_format.immediate = imm; \
400
+ insn->reg2i5_format.rd = rd; \
401
+ insn->reg2i5_format.rj = rj; \
402
+ }
403
+
404
+ DEF_EMIT_REG2I5_FORMAT (slliw , slliw_op )
405
+ DEF_EMIT_REG2I5_FORMAT (srliw , srliw_op )
406
+ DEF_EMIT_REG2I5_FORMAT (sraiw , sraiw_op )
407
+
408
+ #define DEF_EMIT_REG2I6_FORMAT (NAME , OP ) \
409
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
410
+ enum loongarch_gpr rd, \
411
+ enum loongarch_gpr rj, \
412
+ int imm) \
413
+ { \
414
+ insn->reg2i6_format.opcode = OP; \
415
+ insn->reg2i6_format.immediate = imm; \
416
+ insn->reg2i6_format.rd = rd; \
417
+ insn->reg2i6_format.rj = rj; \
418
+ }
419
+
420
+ DEF_EMIT_REG2I6_FORMAT (sllid , sllid_op )
421
+ DEF_EMIT_REG2I6_FORMAT (srlid , srlid_op )
422
+ DEF_EMIT_REG2I6_FORMAT (sraid , sraid_op )
423
+
424
+ #define DEF_EMIT_REG2I12_FORMAT (NAME , OP ) \
425
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
426
+ enum loongarch_gpr rd, \
427
+ enum loongarch_gpr rj, \
428
+ int imm) \
429
+ { \
430
+ insn->reg2i12_format.opcode = OP; \
431
+ insn->reg2i12_format.immediate = imm; \
432
+ insn->reg2i12_format.rd = rd; \
433
+ insn->reg2i12_format.rj = rj; \
434
+ }
435
+
436
+ DEF_EMIT_REG2I12_FORMAT (addiw , addiw_op )
437
+ DEF_EMIT_REG2I12_FORMAT (addid , addid_op )
438
+ DEF_EMIT_REG2I12_FORMAT (lu52id , lu52id_op )
439
+ DEF_EMIT_REG2I12_FORMAT (andi , andi_op )
440
+ DEF_EMIT_REG2I12_FORMAT (ori , ori_op )
441
+ DEF_EMIT_REG2I12_FORMAT (xori , xori_op )
442
+ DEF_EMIT_REG2I12_FORMAT (ldbu , ldbu_op )
443
+ DEF_EMIT_REG2I12_FORMAT (ldhu , ldhu_op )
444
+ DEF_EMIT_REG2I12_FORMAT (ldwu , ldwu_op )
445
+ DEF_EMIT_REG2I12_FORMAT (ldd , ldd_op )
446
+ DEF_EMIT_REG2I12_FORMAT (stb , stb_op )
447
+ DEF_EMIT_REG2I12_FORMAT (sth , sth_op )
448
+ DEF_EMIT_REG2I12_FORMAT (stw , stw_op )
449
+ DEF_EMIT_REG2I12_FORMAT (std , std_op )
450
+
451
+ #define DEF_EMIT_REG2I14_FORMAT (NAME , OP ) \
452
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
453
+ enum loongarch_gpr rd, \
454
+ enum loongarch_gpr rj, \
455
+ int imm) \
456
+ { \
457
+ insn->reg2i14_format.opcode = OP; \
458
+ insn->reg2i14_format.immediate = imm; \
459
+ insn->reg2i14_format.rd = rd; \
460
+ insn->reg2i14_format.rj = rj; \
461
+ }
462
+
463
+ DEF_EMIT_REG2I14_FORMAT (llw , llw_op )
464
+ DEF_EMIT_REG2I14_FORMAT (scw , scw_op )
465
+ DEF_EMIT_REG2I14_FORMAT (lld , lld_op )
466
+ DEF_EMIT_REG2I14_FORMAT (scd , scd_op )
467
+ DEF_EMIT_REG2I14_FORMAT (ldptrw , ldptrw_op )
468
+ DEF_EMIT_REG2I14_FORMAT (stptrw , stptrw_op )
469
+ DEF_EMIT_REG2I14_FORMAT (ldptrd , ldptrd_op )
470
+ DEF_EMIT_REG2I14_FORMAT (stptrd , stptrd_op )
471
+
472
+ #define DEF_EMIT_REG2I16_FORMAT (NAME , OP ) \
473
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
474
+ enum loongarch_gpr rj, \
475
+ enum loongarch_gpr rd, \
476
+ int offset) \
477
+ { \
478
+ insn->reg2i16_format.opcode = OP; \
479
+ insn->reg2i16_format.immediate = offset; \
480
+ insn->reg2i16_format.rj = rj; \
481
+ insn->reg2i16_format.rd = rd; \
482
+ }
483
+
484
+ DEF_EMIT_REG2I16_FORMAT (beq , beq_op )
485
+ DEF_EMIT_REG2I16_FORMAT (bne , bne_op )
486
+ DEF_EMIT_REG2I16_FORMAT (blt , blt_op )
487
+ DEF_EMIT_REG2I16_FORMAT (bge , bge_op )
488
+ DEF_EMIT_REG2I16_FORMAT (bltu , bltu_op )
489
+ DEF_EMIT_REG2I16_FORMAT (bgeu , bgeu_op )
490
+ DEF_EMIT_REG2I16_FORMAT (jirl , jirl_op )
491
+
492
+ #define DEF_EMIT_REG2BSTRD_FORMAT (NAME , OP ) \
493
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
494
+ enum loongarch_gpr rd, \
495
+ enum loongarch_gpr rj, \
496
+ int msbd, \
497
+ int lsbd) \
498
+ { \
499
+ insn->reg2bstrd_format.opcode = OP; \
500
+ insn->reg2bstrd_format.msbd = msbd; \
501
+ insn->reg2bstrd_format.lsbd = lsbd; \
502
+ insn->reg2bstrd_format.rj = rj; \
503
+ insn->reg2bstrd_format.rd = rd; \
504
+ }
505
+
506
+ DEF_EMIT_REG2BSTRD_FORMAT (bstrpickd , bstrpickd_op )
507
+
508
+ #define DEF_EMIT_REG3_FORMAT (NAME , OP ) \
509
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
510
+ enum loongarch_gpr rd, \
511
+ enum loongarch_gpr rj, \
512
+ enum loongarch_gpr rk) \
513
+ { \
514
+ insn->reg3_format.opcode = OP; \
515
+ insn->reg3_format.rd = rd; \
516
+ insn->reg3_format.rj = rj; \
517
+ insn->reg3_format.rk = rk; \
518
+ }
519
+
520
+ DEF_EMIT_REG3_FORMAT (addd , addd_op )
521
+ DEF_EMIT_REG3_FORMAT (subd , subd_op )
522
+ DEF_EMIT_REG3_FORMAT (muld , muld_op )
523
+ DEF_EMIT_REG3_FORMAT (divdu , divdu_op )
524
+ DEF_EMIT_REG3_FORMAT (moddu , moddu_op )
525
+ DEF_EMIT_REG3_FORMAT (and , and_op )
526
+ DEF_EMIT_REG3_FORMAT (or , or_op )
527
+ DEF_EMIT_REG3_FORMAT (xor , xor_op )
528
+ DEF_EMIT_REG3_FORMAT (sllw , sllw_op )
529
+ DEF_EMIT_REG3_FORMAT (slld , slld_op )
530
+ DEF_EMIT_REG3_FORMAT (srlw , srlw_op )
531
+ DEF_EMIT_REG3_FORMAT (srld , srld_op )
532
+ DEF_EMIT_REG3_FORMAT (sraw , sraw_op )
533
+ DEF_EMIT_REG3_FORMAT (srad , srad_op )
534
+ DEF_EMIT_REG3_FORMAT (ldxbu , ldxbu_op )
535
+ DEF_EMIT_REG3_FORMAT (ldxhu , ldxhu_op )
536
+ DEF_EMIT_REG3_FORMAT (ldxwu , ldxwu_op )
537
+ DEF_EMIT_REG3_FORMAT (ldxd , ldxd_op )
538
+ DEF_EMIT_REG3_FORMAT (stxb , stxb_op )
539
+ DEF_EMIT_REG3_FORMAT (stxh , stxh_op )
540
+ DEF_EMIT_REG3_FORMAT (stxw , stxw_op )
541
+ DEF_EMIT_REG3_FORMAT (stxd , stxd_op )
542
+ DEF_EMIT_REG3_FORMAT (amaddw , amaddw_op )
543
+ DEF_EMIT_REG3_FORMAT (amaddd , amaddd_op )
544
+ DEF_EMIT_REG3_FORMAT (amandw , amandw_op )
545
+ DEF_EMIT_REG3_FORMAT (amandd , amandd_op )
546
+ DEF_EMIT_REG3_FORMAT (amorw , amorw_op )
547
+ DEF_EMIT_REG3_FORMAT (amord , amord_op )
548
+ DEF_EMIT_REG3_FORMAT (amxorw , amxorw_op )
549
+ DEF_EMIT_REG3_FORMAT (amxord , amxord_op )
550
+ DEF_EMIT_REG3_FORMAT (amswapw , amswapw_op )
551
+ DEF_EMIT_REG3_FORMAT (amswapd , amswapd_op )
552
+
553
+ #define DEF_EMIT_REG3SA2_FORMAT (NAME , OP ) \
554
+ static inline void emit_##NAME(union loongarch_instruction *insn, \
555
+ enum loongarch_gpr rd, \
556
+ enum loongarch_gpr rj, \
557
+ enum loongarch_gpr rk, \
558
+ int imm) \
559
+ { \
560
+ insn->reg3sa2_format.opcode = OP; \
561
+ insn->reg3sa2_format.immediate = imm; \
562
+ insn->reg3sa2_format.rd = rd; \
563
+ insn->reg3sa2_format.rj = rj; \
564
+ insn->reg3sa2_format.rk = rk; \
565
+ }
566
+
567
+ DEF_EMIT_REG3SA2_FORMAT (alsld , alsld_op )
568
+
348
569
#endif /* _ASM_INST_H */
0 commit comments