x64: clean up regalloc-related semantics on several instructions. (#4811)
* x64: clean up regalloc-related semantics on several instructions. This PR removes all uses of "modify" operands on instructions in the x64 backend, and also removes all uses of "pinned vregs", or vregs that are explicitly tied to particular physical registers. In place of both of these mechanisms, which are legacies of the old regalloc design and supported via compatibility code, the backend now uses operand constraints. This is more flexible as it allows the regalloc to see the liveranges and constraints without "reverse-engineering" move instructions. Eventually, after removing all such uses (including in other backends and by the ABI code), we can remove the compatibility code in regalloc2, significantly simplifying its liverange-construction frontend and thus allowing for higher confidence in correctness as well as possibly a bit more compilation speed. Curiously, there are a few extra move instructions now; they are likely poor splitting decisions and I can try to chase these down later. * Fix cranelift-codegen tests. * Review feedback.
This commit is contained in:
@@ -205,9 +205,8 @@ block2:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r8d
|
||||
; cmpl $2, %edi
|
||||
; br_table %rdi
|
||||
; br_table %rdi, %r9, %r10
|
||||
; block1:
|
||||
; jmp label3
|
||||
; block2:
|
||||
|
||||
@@ -10,8 +10,9 @@ target x86_64
|
||||
function %i8(i8, i8) -> i8 {
|
||||
block0(v0: i8, v1: i8):
|
||||
v2 = srem.i8 v0, v1
|
||||
; check: movq %rdi, %rax
|
||||
; nextln: movl $$0, %edx
|
||||
; check: xorl %r11d, %r11d, %r11d
|
||||
; nextln: movq %rdi, %rax
|
||||
; nextln: movq %r11, %rdx
|
||||
; nextln: srem_seq %al, %dl, %sil, %al, %dl, tmp=(none)
|
||||
; nextln: shrq $$8, %rax, %rax
|
||||
|
||||
@@ -21,8 +22,9 @@ block0(v0: i8, v1: i8):
|
||||
function %i16(i16, i16) -> i16 {
|
||||
block0(v0: i16, v1: i16):
|
||||
v2 = srem.i16 v0, v1
|
||||
; check: movq %rdi, %rax
|
||||
; nextln: movl $$0, %edx
|
||||
; check: xorl %r11d, %r11d, %r11d
|
||||
; nextln: movq %rdi, %rax
|
||||
; nextln: movq %r11, %rdx
|
||||
; nextln: srem_seq %ax, %dx, %si, %ax, %dx, tmp=(none)
|
||||
; nextln: movq %rdx, %rax
|
||||
|
||||
@@ -32,8 +34,9 @@ block0(v0: i16, v1: i16):
|
||||
function %i32(i32, i32) -> i32 {
|
||||
block0(v0: i32, v1: i32):
|
||||
v2 = srem.i32 v0, v1
|
||||
; check: movq %rdi, %rax
|
||||
; nextln: movl $$0, %edx
|
||||
; check: xorl %r11d, %r11d, %r11d
|
||||
; nextln: movq %rdi, %rax
|
||||
; nextln: movq %r11, %rdx
|
||||
; nextln: srem_seq %eax, %edx, %esi, %eax, %edx, tmp=(none)
|
||||
; nextln: movq %rdx, %rax
|
||||
|
||||
@@ -43,8 +46,9 @@ block0(v0: i32, v1: i32):
|
||||
function %i64(i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64):
|
||||
v2 = srem.i64 v0, v1
|
||||
; check: movq %rdi, %rax
|
||||
; nextln: movl $$0, %edx
|
||||
; check: xorl %r11d, %r11d, %r11d
|
||||
; nextln: movq %rdi, %rax
|
||||
; nextln: movq %r11, %rdx
|
||||
; nextln: srem_seq %rax, %rdx, %rsi, %rax, %rdx, tmp=(none)
|
||||
; nextln: movq %rdx, %rax
|
||||
|
||||
|
||||
@@ -146,16 +146,16 @@ block0(v0: i8, v1: i16, v2: i32, v3: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movzbq %dil, %rax
|
||||
; cvtsi2ss %rax, %xmm0
|
||||
; movzwq %si, %rax
|
||||
; cvtsi2ss %rax, %xmm6
|
||||
; movl %edx, %eax
|
||||
; cvtsi2ss %rax, %xmm7
|
||||
; u64_to_f32_seq %rcx, %xmm4, %r8, %rdx
|
||||
; movzbq %dil, %rdi
|
||||
; cvtsi2ss %rdi, %xmm0
|
||||
; movzwq %si, %rdi
|
||||
; cvtsi2ss %rdi, %xmm5
|
||||
; movl %edx, %edi
|
||||
; cvtsi2ss %rdi, %xmm6
|
||||
; u64_to_f32_seq %rcx, %xmm2, %rdi, %rax
|
||||
; addss %xmm0, %xmm5, %xmm0
|
||||
; addss %xmm0, %xmm6, %xmm0
|
||||
; addss %xmm0, %xmm7, %xmm0
|
||||
; addss %xmm0, %xmm4, %xmm0
|
||||
; addss %xmm0, %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -209,7 +209,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_uint32_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float32_to_uint32_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -223,7 +223,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_uint64_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float32_to_uint64_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -237,7 +237,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_uint32_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float64_to_uint32_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -251,7 +251,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_uint64_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float64_to_uint64_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -265,7 +265,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_uint32_sat_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float32_to_uint32_sat_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -279,7 +279,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_uint64_sat_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float32_to_uint64_sat_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -293,7 +293,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_uint32_sat_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float64_to_uint32_sat_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -307,7 +307,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_uint64_sat_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float64_to_uint64_sat_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -321,7 +321,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_sint32_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float32_to_sint32_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -335,7 +335,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_sint64_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float32_to_sint64_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -349,7 +349,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_sint32_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float64_to_sint32_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -363,7 +363,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_sint64_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float64_to_sint64_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -377,7 +377,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_sint32_sat_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float32_to_sint32_sat_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -391,7 +391,7 @@ block0(v0: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float32_to_sint64_sat_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float32_to_sint64_sat_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -405,7 +405,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_sint32_sat_seq %xmm0, %eax, %r10, %xmm6
|
||||
; cvt_float64_to_sint32_sat_seq %xmm0, %eax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -419,7 +419,7 @@ block0(v0: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; cvt_float64_to_sint64_sat_seq %xmm0, %rax, %r10, %xmm6
|
||||
; cvt_float64_to_sint64_sat_seq %xmm0, %rax, %r8, %xmm4
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
|
||||
@@ -11,8 +11,9 @@ block0(v0: i8, v1: i8):
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; cbw %al, %dl
|
||||
; idiv %al, (none), %sil, %al, %dl
|
||||
; cbw %al, %al
|
||||
; movq %rax, %rdi
|
||||
; idiv %al, (none), %sil, %al, (none)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -28,6 +29,7 @@ block0(v0: i16, v1: i16):
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; cwd %ax, %dx
|
||||
; movq %rdx, %r8
|
||||
; idiv %ax, %dx, %si, %ax, %dx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -44,6 +46,7 @@ block0(v0: i32, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; cdq %eax, %edx
|
||||
; movq %rdx, %r8
|
||||
; idiv %eax, %edx, %esi, %eax, %edx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -60,6 +63,7 @@ block0(v0: i64, v1: i64):
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; cqo %rax, %rdx
|
||||
; movq %rdx, %r8
|
||||
; idiv %rax, %rdx, %rsi, %rax, %rdx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
|
||||
@@ -12,9 +12,10 @@ block0(v0: i8x16, v1: i8x16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movdqa %xmm0, %xmm9
|
||||
; movdqa %xmm0, %xmm6
|
||||
; load_const VCodeConstant(0), %xmm0
|
||||
; vpermi2b %xmm1, %xmm0, %xmm9
|
||||
; movdqa %xmm6, %xmm8
|
||||
; vpermi2b %xmm1, %xmm8, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -31,11 +32,12 @@ block0(v0: i8x16, v1: i8x16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movdqa %xmm0, %xmm12
|
||||
; movdqa %xmm0, %xmm9
|
||||
; load_const VCodeConstant(1), %xmm0
|
||||
; load_const VCodeConstant(0), %xmm7
|
||||
; vpermi2b %xmm1, %xmm7, %xmm12
|
||||
; andps %xmm0, %xmm7, %xmm0
|
||||
; load_const VCodeConstant(0), %xmm8
|
||||
; movdqa %xmm9, %xmm11
|
||||
; vpermi2b %xmm1, %xmm11, %xmm8, %xmm8
|
||||
; andps %xmm0, %xmm8, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -49,9 +51,10 @@ block0(v0: i8x16, v1: i8x16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movdqa %xmm0, %xmm9
|
||||
; movdqa %xmm0, %xmm6
|
||||
; load_const VCodeConstant(0), %xmm0
|
||||
; vpermi2b %xmm1, %xmm0, %xmm9
|
||||
; movdqa %xmm6, %xmm8
|
||||
; vpermi2b %xmm1, %xmm8, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
|
||||
@@ -10,8 +10,9 @@ block0(v0: i8, v1: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; xorl %r11d, %r11d, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; srem_seq %al, %dl, %sil, %al, %dl, tmp=(none)
|
||||
; shrq $8, %rax, %rax
|
||||
; movq %rbp, %rsp
|
||||
@@ -27,8 +28,9 @@ block0(v0: i16, v1: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; xorl %r11d, %r11d, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; srem_seq %ax, %dx, %si, %ax, %dx, tmp=(none)
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
@@ -44,8 +46,9 @@ block0(v0: i32, v1: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; xorl %r11d, %r11d, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; srem_seq %eax, %edx, %esi, %eax, %edx, tmp=(none)
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
@@ -61,8 +64,9 @@ block0(v0: i64, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; xorl %r11d, %r11d, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; srem_seq %rax, %rdx, %rsi, %rax, %rdx, tmp=(none)
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
|
||||
@@ -10,9 +10,9 @@ block0(v0: i8, v1: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; movzbl %al, %eax
|
||||
; div %al, (none), %sil, %al, %dl
|
||||
; movzbl %dil, %r10d
|
||||
; movq %r10, %rax
|
||||
; div %al, (none), %sil, %al, (none)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -26,8 +26,9 @@ block0(v0: i16, v1: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %ax, %dx, %si, %ax, %dx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -42,8 +43,9 @@ block0(v0: i32, v1: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %eax, %edx, %esi, %eax, %edx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -58,8 +60,9 @@ block0(v0: i64, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %rax, %rdx, %rsi, %rax, %rdx
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
|
||||
@@ -10,9 +10,9 @@ block0(v0: i8, v1: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %rax
|
||||
; movzbl %al, %eax
|
||||
; div %al, (none), %sil, %al, %dl
|
||||
; movzbl %dil, %r10d
|
||||
; movq %r10, %rax
|
||||
; div %al, (none), %sil, %al, (none)
|
||||
; shrq $8, %rax, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -27,8 +27,9 @@ block0(v0: i16, v1: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %ax, %dx, %si, %ax, %dx
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
@@ -44,8 +45,9 @@ block0(v0: i32, v1: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %eax, %edx, %esi, %eax, %edx
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
@@ -61,8 +63,9 @@ block0(v0: i64, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $0, %r11d
|
||||
; movq %rdi, %rax
|
||||
; movl $0, %edx
|
||||
; movq %r11, %rdx
|
||||
; div %rax, %rdx, %rsi, %rax, %rdx
|
||||
; movq %rdx, %rax
|
||||
; movq %rbp, %rsp
|
||||
|
||||
Reference in New Issue
Block a user