@@ -63,13 +63,22 @@ AssemblyBuilderA64::~AssemblyBuilderA64()
63
63
64
64
void AssemblyBuilderA64::mov (RegisterA64 dst, RegisterA64 src)
65
65
{
66
- CODEGEN_ASSERT (dst.kind == KindA64::w || dst.kind == KindA64::x || dst == sp);
67
- CODEGEN_ASSERT (dst.kind == src.kind || (dst.kind == KindA64::x && src == sp) || (dst == sp && src.kind == KindA64::x));
66
+ if (dst.kind != KindA64::q)
67
+ {
68
+ CODEGEN_ASSERT (dst.kind == KindA64::w || dst.kind == KindA64::x || dst == sp);
69
+ CODEGEN_ASSERT (dst.kind == src.kind || (dst.kind == KindA64::x && src == sp) || (dst == sp && src.kind == KindA64::x));
68
70
69
- if (dst == sp || src == sp)
70
- placeR1 (" mov" , dst, src, 0b00'100010'0'000000000000 );
71
+ if (dst == sp || src == sp)
72
+ placeR1 (" mov" , dst, src, 0b00'100010'0'000000000000 );
73
+ else
74
+ placeSR2 (" mov" , dst, src, 0b01'01010 );
75
+ }
71
76
else
72
- placeSR2 (" mov" , dst, src, 0b01'01010 );
77
+ {
78
+ CODEGEN_ASSERT (dst.kind == src.kind );
79
+
80
+ placeR1 (" mov" , dst, src, 0b10'01110'10'1'00000'00011'1 | (src.index << 6 ));
81
+ }
73
82
}
74
83
75
84
void AssemblyBuilderA64::mov (RegisterA64 dst, int src)
@@ -575,12 +584,18 @@ void AssemblyBuilderA64::fadd(RegisterA64 dst, RegisterA64 src1, RegisterA64 src
575
584
576
585
placeR3 (" fadd" , dst, src1, src2, 0b11110'01'1 , 0b0010'10 );
577
586
}
578
- else
587
+ else if (dst. kind == KindA64::s)
579
588
{
580
- CODEGEN_ASSERT (dst. kind == KindA64::s && src1.kind == KindA64::s && src2.kind == KindA64::s);
589
+ CODEGEN_ASSERT (src1.kind == KindA64::s && src2.kind == KindA64::s);
581
590
582
591
placeR3 (" fadd" , dst, src1, src2, 0b11110'00'1 , 0b0010'10 );
583
592
}
593
+ else
594
+ {
595
+ CODEGEN_ASSERT (dst.kind == KindA64::q && src1.kind == KindA64::q && src2.kind == KindA64::q);
596
+
597
+ placeVR (" fadd" , dst, src1, src2, 0b0'01110'0'0'1 , 0b11010'1 );
598
+ }
584
599
}
585
600
586
601
void AssemblyBuilderA64::fdiv (RegisterA64 dst, RegisterA64 src1, RegisterA64 src2)
@@ -591,12 +606,18 @@ void AssemblyBuilderA64::fdiv(RegisterA64 dst, RegisterA64 src1, RegisterA64 src
591
606
592
607
placeR3 (" fdiv" , dst, src1, src2, 0b11110'01'1 , 0b0001'10 );
593
608
}
594
- else
609
+ else if (dst. kind == KindA64::s)
595
610
{
596
- CODEGEN_ASSERT (dst. kind == KindA64::s && src1.kind == KindA64::s && src2.kind == KindA64::s);
611
+ CODEGEN_ASSERT (src1.kind == KindA64::s && src2.kind == KindA64::s);
597
612
598
613
placeR3 (" fdiv" , dst, src1, src2, 0b11110'00'1 , 0b0001'10 );
599
614
}
615
+ else
616
+ {
617
+ CODEGEN_ASSERT (dst.kind == KindA64::q && src1.kind == KindA64::q && src2.kind == KindA64::q);
618
+
619
+ placeVR (" fdiv" , dst, src1, src2, 0b1'01110'00'1 , 0b11111'1 );
620
+ }
600
621
}
601
622
602
623
void AssemblyBuilderA64::fmul (RegisterA64 dst, RegisterA64 src1, RegisterA64 src2)
@@ -607,12 +628,18 @@ void AssemblyBuilderA64::fmul(RegisterA64 dst, RegisterA64 src1, RegisterA64 src
607
628
608
629
placeR3 (" fmul" , dst, src1, src2, 0b11110'01'1 , 0b0000'10 );
609
630
}
610
- else
631
+ else if (dst. kind == KindA64::s)
611
632
{
612
- CODEGEN_ASSERT (dst. kind == KindA64::s && src1.kind == KindA64::s && src2.kind == KindA64::s);
633
+ CODEGEN_ASSERT (src1.kind == KindA64::s && src2.kind == KindA64::s);
613
634
614
635
placeR3 (" fmul" , dst, src1, src2, 0b11110'00'1 , 0b0000'10 );
615
636
}
637
+ else
638
+ {
639
+ CODEGEN_ASSERT (dst.kind == KindA64::q && src1.kind == KindA64::q && src2.kind == KindA64::q);
640
+
641
+ placeVR (" fmul" , dst, src1, src2, 0b1'01110'00'1 , 0b11011'1 );
642
+ }
616
643
}
617
644
618
645
void AssemblyBuilderA64::fneg (RegisterA64 dst, RegisterA64 src)
@@ -623,12 +650,18 @@ void AssemblyBuilderA64::fneg(RegisterA64 dst, RegisterA64 src)
623
650
624
651
placeR1 (" fneg" , dst, src, 0b000'11110'01'1'0000'10'10000 );
625
652
}
626
- else
653
+ else if (dst. kind == KindA64::s)
627
654
{
628
- CODEGEN_ASSERT (dst. kind == KindA64::s && src.kind == KindA64::s);
655
+ CODEGEN_ASSERT (src.kind == KindA64::s);
629
656
630
657
placeR1 (" fneg" , dst, src, 0b000'11110'00'1'0000'10'10000 );
631
658
}
659
+ else
660
+ {
661
+ CODEGEN_ASSERT (dst.kind == KindA64::q && src.kind == KindA64::q);
662
+
663
+ placeR1 (" fneg" , dst, src, 0b011'01110'1'0'10000'01111'10 );
664
+ }
632
665
}
633
666
634
667
void AssemblyBuilderA64::fsqrt (RegisterA64 dst, RegisterA64 src)
@@ -646,12 +679,18 @@ void AssemblyBuilderA64::fsub(RegisterA64 dst, RegisterA64 src1, RegisterA64 src
646
679
647
680
placeR3 (" fsub" , dst, src1, src2, 0b11110'01'1 , 0b0011'10 );
648
681
}
649
- else
682
+ else if (dst. kind == KindA64::s)
650
683
{
651
- CODEGEN_ASSERT (dst. kind == KindA64::s && src1.kind == KindA64::s && src2.kind == KindA64::s);
684
+ CODEGEN_ASSERT (src1.kind == KindA64::s && src2.kind == KindA64::s);
652
685
653
686
placeR3 (" fsub" , dst, src1, src2, 0b11110'00'1 , 0b0011'10 );
654
687
}
688
+ else
689
+ {
690
+ CODEGEN_ASSERT (dst.kind == KindA64::q && src1.kind == KindA64::q && src2.kind == KindA64::q);
691
+
692
+ placeVR (" fsub" , dst, src1, src2, 0b0'01110'10'1 , 0b11010'1 );
693
+ }
655
694
}
656
695
657
696
void AssemblyBuilderA64::ins_4s (RegisterA64 dst, RegisterA64 src, uint8_t index)
@@ -952,18 +991,6 @@ void AssemblyBuilderA64::placeR3(const char* name, RegisterA64 dst, RegisterA64
952
991
commit ();
953
992
}
954
993
955
- void AssemblyBuilderA64::placeR3 (const char * name, RegisterA64 dst, RegisterA64 src1, RegisterA64 src2, uint8_t sizes, uint8_t op, uint8_t op2)
956
- {
957
- if (logText)
958
- log (name, dst, src1, src2);
959
-
960
- CODEGEN_ASSERT (dst.kind == KindA64::w || dst.kind == KindA64::x || dst.kind == KindA64::d || dst.kind == KindA64::q);
961
- CODEGEN_ASSERT (dst.kind == src1.kind && dst.kind == src2.kind );
962
-
963
- place (dst.index | (src1.index << 5 ) | (op2 << 10 ) | (src2.index << 16 ) | (op << 21 ) | (sizes << 29 ));
964
- commit ();
965
- }
966
-
967
994
void AssemblyBuilderA64::placeR1 (const char * name, RegisterA64 dst, RegisterA64 src, uint32_t op)
968
995
{
969
996
if (logText)
@@ -1226,6 +1253,17 @@ void AssemblyBuilderA64::placeER(const char* name, RegisterA64 dst, RegisterA64
1226
1253
commit ();
1227
1254
}
1228
1255
1256
+ void AssemblyBuilderA64::placeVR (const char * name, RegisterA64 dst, RegisterA64 src1, RegisterA64 src2, uint16_t op, uint8_t op2)
1257
+ {
1258
+ if (logText)
1259
+ logAppend (" %-12sv%d.4s,v%d.4s,v%d.4s\n " , name, dst.index , src1.index , src2.index );
1260
+
1261
+ CODEGEN_ASSERT (dst.kind == KindA64::q && dst.kind == src1.kind && dst.kind == src2.kind );
1262
+
1263
+ place (dst.index | (src1.index << 5 ) | (op2 << 10 ) | (src2.index << 16 ) | (op << 21 ) | (1 << 30 ));
1264
+ commit ();
1265
+ }
1266
+
1229
1267
void AssemblyBuilderA64::place (uint32_t word)
1230
1268
{
1231
1269
CODEGEN_ASSERT (codePos < codeEnd);
0 commit comments