@@ -4,6 +4,7 @@ const expect = std.testing.expect;
4
4
5
5
const Allocator = std .mem .Allocator ;
6
6
const ArrayList = std .ArrayList ;
7
+ const Mir = @import ("Mir.zig" );
7
8
8
9
/// EFLAGS condition codes
9
10
pub const Condition = enum (u5 ) {
@@ -359,11 +360,20 @@ pub const Register = enum(u8) {
359
360
360
361
ah , ch , dh , bh ,
361
362
362
- ymm0 , ymm1 , ymm2 , ymm3 , ymm4 , ymm5 , ymm6 , ymm7 ,
363
- ymm8 , ymm9 , ymm10 , ymm11 , ymm12 , ymm13 , ymm14 , ymm15 ,
363
+ zmm0 , zmm1 , zmm2 , zmm3 , zmm4 , zmm5 , zmm6 , zmm7 ,
364
+ zmm8 , zmm9 , zmm10 , zmm11 , zmm12 , zmm13 , zmm14 , zmm15 ,
365
+ zmm16 , zmm17 ,zmm18 , zmm19 , zmm20 , zmm21 , zmm22 , zmm23 ,
366
+ zmm24 , zmm25 ,zmm26 , zmm27 , zmm28 , zmm29 , zmm30 , zmm31 ,
364
367
365
- xmm0 , xmm1 , xmm2 , xmm3 , xmm4 , xmm5 , xmm6 , xmm7 ,
366
- xmm8 , xmm9 , xmm10 , xmm11 , xmm12 , xmm13 , xmm14 , xmm15 ,
368
+ ymm0 , ymm1 , ymm2 , ymm3 , ymm4 , ymm5 , ymm6 , ymm7 ,
369
+ ymm8 , ymm9 , ymm10 , ymm11 , ymm12 , ymm13 , ymm14 , ymm15 ,
370
+ ymm16 , ymm17 ,ymm18 , ymm19 , ymm20 , ymm21 , ymm22 , ymm23 ,
371
+ ymm24 , ymm25 ,ymm26 , ymm27 , ymm28 , ymm29 , ymm30 , ymm31 ,
372
+
373
+ xmm0 , xmm1 , xmm2 , xmm3 , xmm4 , xmm5 , xmm6 , xmm7 ,
374
+ xmm8 , xmm9 , xmm10 , xmm11 , xmm12 , xmm13 , xmm14 , xmm15 ,
375
+ xmm16 , xmm17 ,xmm18 , xmm19 , xmm20 , xmm21 , xmm22 , xmm23 ,
376
+ xmm24 , xmm25 ,xmm26 , xmm27 , xmm28 , xmm29 , xmm30 , xmm31 ,
367
377
368
378
mm0 , mm1 , mm2 , mm3 , mm4 , mm5 , mm6 , mm7 ,
369
379
@@ -403,8 +413,9 @@ pub const Register = enum(u8) {
403
413
@intFromEnum (Register .al ) ... @intFromEnum (Register .r15b ) = > .general_purpose ,
404
414
@intFromEnum (Register .ah ) ... @intFromEnum (Register .bh ) = > .gphi ,
405
415
406
- @intFromEnum (Register .ymm0 ) ... @intFromEnum (Register .ymm15 ) = > .sse ,
407
- @intFromEnum (Register .xmm0 ) ... @intFromEnum (Register .xmm15 ) = > .sse ,
416
+ @intFromEnum (Register .zmm0 ) ... @intFromEnum (Register .zmm31 ) = > .sse ,
417
+ @intFromEnum (Register .ymm0 ) ... @intFromEnum (Register .ymm31 ) = > .sse ,
418
+ @intFromEnum (Register .xmm0 ) ... @intFromEnum (Register .xmm31 ) = > .sse ,
408
419
@intFromEnum (Register .mm0 ) ... @intFromEnum (Register .mm7 ) = > .mmx ,
409
420
@intFromEnum (Register .st0 ) ... @intFromEnum (Register .st7 ) = > .x87 ,
410
421
@@ -427,13 +438,14 @@ pub const Register = enum(u8) {
427
438
@intFromEnum (Register .al ) ... @intFromEnum (Register .r15b ) = > @intFromEnum (Register .al ),
428
439
@intFromEnum (Register .ah ) ... @intFromEnum (Register .bh ) = > @intFromEnum (Register .ah ),
429
440
430
- @intFromEnum (Register .ymm0 ) ... @intFromEnum (Register .ymm15 ) = > @intFromEnum (Register .ymm0 ) - 16 ,
431
- @intFromEnum (Register .xmm0 ) ... @intFromEnum (Register .xmm15 ) = > @intFromEnum (Register .xmm0 ) - 16 ,
432
- @intFromEnum (Register .mm0 ) ... @intFromEnum (Register .mm7 ) = > @intFromEnum (Register .mm0 ) - 32 ,
433
- @intFromEnum (Register .st0 ) ... @intFromEnum (Register .st7 ) = > @intFromEnum (Register .st0 ) - 40 ,
434
- @intFromEnum (Register .es ) ... @intFromEnum (Register .gs ) = > @intFromEnum (Register .es ) - 48 ,
435
- @intFromEnum (Register .cr0 ) ... @intFromEnum (Register .cr15 ) = > @intFromEnum (Register .cr0 ) - 54 ,
436
- @intFromEnum (Register .dr0 ) ... @intFromEnum (Register .dr15 ) = > @intFromEnum (Register .dr0 ) - 70 ,
441
+ @intFromEnum (Register .zmm0 ) ... @intFromEnum (Register .zmm31 ) = > @intFromEnum (Register .zmm0 ) - 16 ,
442
+ @intFromEnum (Register .ymm0 ) ... @intFromEnum (Register .ymm31 ) = > @intFromEnum (Register .ymm0 ) - 16 ,
443
+ @intFromEnum (Register .xmm0 ) ... @intFromEnum (Register .xmm31 ) = > @intFromEnum (Register .xmm0 ) - 16 ,
444
+ @intFromEnum (Register .mm0 ) ... @intFromEnum (Register .mm7 ) = > @intFromEnum (Register .mm0 ) - 48 ,
445
+ @intFromEnum (Register .st0 ) ... @intFromEnum (Register .st7 ) = > @intFromEnum (Register .st0 ) - 56 ,
446
+ @intFromEnum (Register .es ) ... @intFromEnum (Register .gs ) = > @intFromEnum (Register .es ) - 64 ,
447
+ @intFromEnum (Register .cr0 ) ... @intFromEnum (Register .cr15 ) = > @intFromEnum (Register .cr0 ) - 70 ,
448
+ @intFromEnum (Register .dr0 ) ... @intFromEnum (Register .dr15 ) = > @intFromEnum (Register .dr0 ) - 86 ,
437
449
438
450
else = > unreachable ,
439
451
// zig fmt: on
@@ -450,6 +462,7 @@ pub const Register = enum(u8) {
450
462
@intFromEnum (Register .al ) ... @intFromEnum (Register .r15b ) = > 8 ,
451
463
@intFromEnum (Register .ah ) ... @intFromEnum (Register .bh ) = > 8 ,
452
464
465
+ @intFromEnum (Register .zmm0 ) ... @intFromEnum (Register .zmm15 ) = > 512 ,
453
466
@intFromEnum (Register .ymm0 ) ... @intFromEnum (Register .ymm15 ) = > 256 ,
454
467
@intFromEnum (Register .xmm0 ) ... @intFromEnum (Register .xmm15 ) = > 128 ,
455
468
@intFromEnum (Register .mm0 ) ... @intFromEnum (Register .mm7 ) = > 64 ,
@@ -473,8 +486,9 @@ pub const Register = enum(u8) {
473
486
@intFromEnum (Register .r8w ) ... @intFromEnum (Register .r15w ) = > true ,
474
487
@intFromEnum (Register .r8b ) ... @intFromEnum (Register .r15b ) = > true ,
475
488
476
- @intFromEnum (Register .ymm8 ) ... @intFromEnum (Register .ymm15 ) = > true ,
477
- @intFromEnum (Register .xmm8 ) ... @intFromEnum (Register .xmm15 ) = > true ,
489
+ @intFromEnum (Register .zmm8 ) ... @intFromEnum (Register .zmm31 ) = > true ,
490
+ @intFromEnum (Register .ymm8 ) ... @intFromEnum (Register .ymm31 ) = > true ,
491
+ @intFromEnum (Register .xmm8 ) ... @intFromEnum (Register .xmm31 ) = > true ,
478
492
479
493
@intFromEnum (Register .cr8 ) ... @intFromEnum (Register .cr15 ) = > true ,
480
494
@intFromEnum (Register .dr8 ) ... @intFromEnum (Register .dr15 ) = > true ,
@@ -484,7 +498,7 @@ pub const Register = enum(u8) {
484
498
};
485
499
}
486
500
487
- pub fn enc (reg : Register ) u4 {
501
+ pub fn enc (reg : Register ) u5 {
488
502
const base = switch (@intFromEnum (reg )) {
489
503
// zig fmt: off
490
504
@intFromEnum (Register .rax ) ... @intFromEnum (Register .r15 ) = > @intFromEnum (Register .rax ),
@@ -509,10 +523,6 @@ pub const Register = enum(u8) {
509
523
return @truncate (@intFromEnum (reg ) - base );
510
524
}
511
525
512
- pub fn lowEnc (reg : Register ) u3 {
513
- return @truncate (reg .enc ());
514
- }
515
-
516
526
pub fn toBitSize (reg : Register , bit_size : u64 ) Register {
517
527
return switch (bit_size ) {
518
528
8 = > reg .to8 (),
@@ -557,11 +567,12 @@ pub const Register = enum(u8) {
557
567
};
558
568
}
559
569
560
- fn sseBase (reg : Register ) u7 {
570
+ fn sseBase (reg : Register ) u8 {
561
571
assert (reg .class () == .sse );
562
572
return switch (@intFromEnum (reg )) {
563
- @intFromEnum (Register .ymm0 )... @intFromEnum (Register .ymm15 ) = > @intFromEnum (Register .ymm0 ),
564
- @intFromEnum (Register .xmm0 )... @intFromEnum (Register .xmm15 ) = > @intFromEnum (Register .xmm0 ),
573
+ @intFromEnum (Register .zmm0 )... @intFromEnum (Register .zmm31 ) = > @intFromEnum (Register .zmm0 ),
574
+ @intFromEnum (Register .ymm0 )... @intFromEnum (Register .ymm31 ) = > @intFromEnum (Register .ymm0 ),
575
+ @intFromEnum (Register .xmm0 )... @intFromEnum (Register .xmm31 ) = > @intFromEnum (Register .xmm0 ),
565
576
else = > unreachable ,
566
577
};
567
578
}
@@ -678,15 +689,9 @@ pub const Memory = struct {
678
689
frame : FrameIndex ,
679
690
table ,
680
691
reloc : u32 ,
692
+ rip_inst : Mir.Inst.Index ,
681
693
682
694
pub const Tag = @typeInfo (Base ).@"union" .tag_type .? ;
683
-
684
- pub fn isExtended (self : Base ) bool {
685
- return switch (self ) {
686
- .none , .frame , .table , .reloc = > false , // rsp, rbp, and rip are not extended
687
- .reg = > | reg | reg .isExtended (),
688
- };
689
- }
690
695
};
691
696
692
697
pub const Mod = union (enum (u1 )) {
0 commit comments