Skip to content

Commit b1ed9b3

Browse files
authored
cranelift(x64): Make xmm{8..15} registers non-preferred (bytecodealliance#7089)
These registers require an additional byte to reference when encoded in certain AVX instruction formats (and maybe other situations as well?) so prefer xmm{0..7} when they are available and only fall back to xmm{8..15} when register pressure is higher.
1 parent d127a14 commit b1ed9b3

18 files changed

+416
-400
lines changed

cranelift/codegen/src/isa/x64/abi.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,8 @@ fn create_reg_env_systemv(enable_pinned_reg: bool) -> MachineEnv {
12431243
preg(regs::r10()),
12441244
preg(regs::r11()),
12451245
],
1246-
// Preferred XMMs: all of them.
1246+
// Preferred XMMs: the first 8, which can have smaller encodings
1247+
// with AVX instructions.
12471248
vec![
12481249
preg(regs::xmm0()),
12491250
preg(regs::xmm1()),
@@ -1253,14 +1254,6 @@ fn create_reg_env_systemv(enable_pinned_reg: bool) -> MachineEnv {
12531254
preg(regs::xmm5()),
12541255
preg(regs::xmm6()),
12551256
preg(regs::xmm7()),
1256-
preg(regs::xmm8()),
1257-
preg(regs::xmm9()),
1258-
preg(regs::xmm10()),
1259-
preg(regs::xmm11()),
1260-
preg(regs::xmm12()),
1261-
preg(regs::xmm13()),
1262-
preg(regs::xmm14()),
1263-
preg(regs::xmm15()),
12641257
],
12651258
// The Vector Regclass is unused
12661259
vec![],
@@ -1273,8 +1266,18 @@ fn create_reg_env_systemv(enable_pinned_reg: bool) -> MachineEnv {
12731266
preg(regs::r13()),
12741267
preg(regs::r14()),
12751268
],
1276-
// Non-preferred XMMs: none.
1277-
vec![],
1269+
// Non-preferred XMMs: the last 8 registers, which can have larger
1270+
// encodings with AVX instructions.
1271+
vec![
1272+
preg(regs::xmm8()),
1273+
preg(regs::xmm9()),
1274+
preg(regs::xmm10()),
1275+
preg(regs::xmm11()),
1276+
preg(regs::xmm12()),
1277+
preg(regs::xmm13()),
1278+
preg(regs::xmm14()),
1279+
preg(regs::xmm15()),
1280+
],
12781281
// The Vector Regclass is unused
12791282
vec![],
12801283
],

cranelift/filetests/filetests/isa/x64/call-conv.clif

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ block0(
202202
; movq %rax, %rdi
203203
; movq 16(%rbp), %r10
204204
; movq 24(%rbp), %r11
205-
; movss 32(%rbp), %xmm9
206-
; movsd 40(%rbp), %xmm8
205+
; movss 32(%rbp), %xmm11
206+
; movsd 40(%rbp), %xmm13
207207
; subq %rsp, $144, %rsp
208208
; virtual_sp_offset_adjust 144
209209
; movq %r8, 32(%rsp)
@@ -218,8 +218,8 @@ block0(
218218
; movsd %xmm7, 104(%rsp)
219219
; movq %r10, 112(%rsp)
220220
; movl %r11d, 120(%rsp)
221-
; movss %xmm9, 128(%rsp)
222-
; movsd %xmm8, 136(%rsp)
221+
; movss %xmm11, 128(%rsp)
222+
; movsd %xmm13, 136(%rsp)
223223
; movq %rdi, %r9
224224
; movq %rcx, %r8
225225
; movq %rsi, %rcx
@@ -242,8 +242,8 @@ block0(
242242
; movq %rax, %rdi
243243
; movq 0x10(%rbp), %r10
244244
; movq 0x18(%rbp), %r11
245-
; movss 0x20(%rbp), %xmm9
246-
; movsd 0x28(%rbp), %xmm8
245+
; movss 0x20(%rbp), %xmm11
246+
; movsd 0x28(%rbp), %xmm13
247247
; subq $0x90, %rsp
248248
; movq %r8, 0x20(%rsp)
249249
; movq %r9, 0x28(%rsp)
@@ -257,8 +257,8 @@ block0(
257257
; movsd %xmm7, 0x68(%rsp)
258258
; movq %r10, 0x70(%rsp)
259259
; movl %r11d, 0x78(%rsp)
260-
; movss %xmm9, 0x80(%rsp)
261-
; movsd %xmm8, 0x88(%rsp)
260+
; movss %xmm11, 0x80(%rsp)
261+
; movsd %xmm13, 0x88(%rsp)
262262
; movq %rdi, %r9
263263
; movq %rcx, %r8
264264
; movq %rsi, %rcx
@@ -330,7 +330,7 @@ block0(v0: i32, v1: f32, v2: i64, v3: f64, v4: i32, v5: i32, v6: i32, v7: f32, v
330330
; block0:
331331
; movq %rsi, %r9
332332
; movq %rdi, %rsi
333-
; movdqa %xmm1, %xmm12
333+
; movdqa %xmm1, %xmm6
334334
; movdqa %xmm0, %xmm1
335335
; subq %rsp, $96, %rsp
336336
; virtual_sp_offset_adjust 96
@@ -343,7 +343,7 @@ block0(v0: i32, v1: f32, v2: i64, v3: f64, v4: i32, v5: i32, v6: i32, v7: f32, v
343343
; movsd %xmm5, 80(%rsp)
344344
; movq %rsi, %rcx
345345
; movq %r9, %r8
346-
; movdqa %xmm12, %xmm3
346+
; movdqa %xmm6, %xmm3
347347
; call *%rcx
348348
; addq %rsp, $96, %rsp
349349
; virtual_sp_offset_adjust -96
@@ -358,7 +358,7 @@ block0(v0: i32, v1: f32, v2: i64, v3: f64, v4: i32, v5: i32, v6: i32, v7: f32, v
358358
; block1: ; offset 0x4
359359
; movq %rsi, %r9
360360
; movq %rdi, %rsi
361-
; movdqa %xmm1, %xmm12
361+
; movdqa %xmm1, %xmm6
362362
; movdqa %xmm0, %xmm1
363363
; subq $0x60, %rsp
364364
; movl %edx, 0x20(%rsp)
@@ -370,7 +370,7 @@ block0(v0: i32, v1: f32, v2: i64, v3: f64, v4: i32, v5: i32, v6: i32, v7: f32, v
370370
; movsd %xmm5, 0x50(%rsp)
371371
; movq %rsi, %rcx
372372
; movq %r9, %r8
373-
; movdqa %xmm12, %xmm3
373+
; movdqa %xmm6, %xmm3
374374
; callq *%rcx
375375
; addq $0x60, %rsp
376376
; movq %rbp, %rsp

cranelift/filetests/filetests/isa/x64/cmp-mem-bug.clif

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ block0(v0: f64, v1: i64):
5454
; pushq %rbp
5555
; movq %rsp, %rbp
5656
; block0:
57-
; movsd 0(%rdi), %xmm9
58-
; ucomisd %xmm9, %xmm0
57+
; movsd 0(%rdi), %xmm1
58+
; ucomisd %xmm1, %xmm0
5959
; setnp %dil
6060
; setz %al
6161
; andl %edi, %eax, %edi
6262
; movzbq %dil, %rax
63-
; ucomisd %xmm9, %xmm0
63+
; ucomisd %xmm1, %xmm0
6464
; movdqa %xmm0, %xmm2
6565
; movsd %xmm0, %xmm0; jnp $next; movsd %xmm2, %xmm0; $next:
6666
; movsd %xmm0, %xmm0; jz $next; movsd %xmm2, %xmm0; $next:
@@ -73,17 +73,17 @@ block0(v0: f64, v1: i64):
7373
; pushq %rbp
7474
; movq %rsp, %rbp
7575
; block1: ; offset 0x4
76-
; movsd (%rdi), %xmm9 ; trap: heap_oob
77-
; ucomisd %xmm9, %xmm0
76+
; movsd (%rdi), %xmm1 ; trap: heap_oob
77+
; ucomisd %xmm1, %xmm0
7878
; setnp %dil
7979
; sete %al
8080
; andl %eax, %edi
8181
; movzbq %dil, %rax
82-
; ucomisd %xmm9, %xmm0
82+
; ucomisd %xmm1, %xmm0
8383
; movdqa %xmm0, %xmm2
84-
; jnp 0x2f
84+
; jnp 0x2c
8585
; movsd %xmm2, %xmm0
86-
; je 0x39
86+
; je 0x36
8787
; movsd %xmm2, %xmm0
8888
; movq %rbp, %rsp
8989
; popq %rbp

cranelift/filetests/filetests/isa/x64/fastcall.clif

Lines changed: 86 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -356,51 +356,53 @@ block0(v0: i64):
356356
; unwind SaveReg { clobber_offset: 144, reg: p15f }
357357
; block0:
358358
; movsd 0(%rcx), %xmm0
359-
; movsd 8(%rcx), %xmm10
360-
; movdqu %xmm10, rsp(48 + virtual offset)
361-
; movsd 16(%rcx), %xmm5
362-
; movsd 24(%rcx), %xmm14
363-
; movdqu %xmm14, rsp(32 + virtual offset)
364-
; movsd 32(%rcx), %xmm13
365-
; movsd 40(%rcx), %xmm15
366-
; movdqu %xmm15, rsp(16 + virtual offset)
359+
; movsd 8(%rcx), %xmm8
360+
; movdqu %xmm8, rsp(48 + virtual offset)
361+
; movsd 16(%rcx), %xmm10
362+
; movdqu %xmm10, rsp(0 + virtual offset)
363+
; movsd 24(%rcx), %xmm9
364+
; movdqa %xmm9, %xmm10
365+
; movsd 32(%rcx), %xmm5
366+
; movsd 40(%rcx), %xmm6
367+
; movdqu %xmm6, rsp(32 + virtual offset)
367368
; movsd 48(%rcx), %xmm7
368-
; movsd 56(%rcx), %xmm8
369-
; movdqu %xmm8, rsp(0 + virtual offset)
370-
; movsd 64(%rcx), %xmm12
371-
; movsd 72(%rcx), %xmm2
372-
; movsd 80(%rcx), %xmm9
373-
; movsd 88(%rcx), %xmm4
369+
; movsd 56(%rcx), %xmm12
370+
; movdqu %xmm12, rsp(16 + virtual offset)
371+
; movsd 64(%rcx), %xmm4
372+
; movsd 72(%rcx), %xmm12
373+
; movsd 80(%rcx), %xmm1
374+
; movsd 88(%rcx), %xmm14
374375
; movsd 96(%rcx), %xmm3
375-
; movsd 104(%rcx), %xmm8
376+
; movsd 104(%rcx), %xmm15
376377
; movsd 112(%rcx), %xmm11
377-
; movsd 120(%rcx), %xmm10
378-
; movsd 128(%rcx), %xmm6
379-
; movsd 136(%rcx), %xmm14
380-
; movsd 144(%rcx), %xmm1
381-
; movdqu rsp(48 + virtual offset), %xmm15
382-
; addsd %xmm0, %xmm15, %xmm0
383-
; movdqu rsp(32 + virtual offset), %xmm15
384-
; addsd %xmm5, %xmm15, %xmm5
385-
; movdqu rsp(16 + virtual offset), %xmm15
386-
; addsd %xmm13, %xmm15, %xmm13
387-
; movdqu rsp(0 + virtual offset), %xmm15
388-
; addsd %xmm7, %xmm15, %xmm7
389-
; addsd %xmm12, %xmm2, %xmm12
390-
; addsd %xmm9, %xmm4, %xmm9
391-
; addsd %xmm3, %xmm8, %xmm3
392-
; addsd %xmm11, %xmm10, %xmm11
393-
; addsd %xmm6, %xmm14, %xmm6
394-
; addsd %xmm1, 152(%rcx), %xmm1
395-
; addsd %xmm0, %xmm5, %xmm0
396-
; addsd %xmm13, %xmm7, %xmm13
397-
; addsd %xmm12, %xmm9, %xmm12
398-
; addsd %xmm3, %xmm11, %xmm3
399-
; addsd %xmm6, %xmm1, %xmm6
400-
; addsd %xmm0, %xmm13, %xmm0
401-
; addsd %xmm12, %xmm3, %xmm12
402-
; addsd %xmm0, %xmm12, %xmm0
378+
; movsd 120(%rcx), %xmm8
379+
; movsd 128(%rcx), %xmm2
380+
; movsd 136(%rcx), %xmm9
381+
; movsd 144(%rcx), %xmm13
382+
; movdqu rsp(48 + virtual offset), %xmm6
403383
; addsd %xmm0, %xmm6, %xmm0
384+
; movdqa %xmm10, %xmm6
385+
; movdqu rsp(0 + virtual offset), %xmm10
386+
; addsd %xmm10, %xmm6, %xmm10
387+
; movdqu rsp(32 + virtual offset), %xmm6
388+
; addsd %xmm5, %xmm6, %xmm5
389+
; movdqu rsp(16 + virtual offset), %xmm6
390+
; addsd %xmm7, %xmm6, %xmm7
391+
; addsd %xmm4, %xmm12, %xmm4
392+
; addsd %xmm1, %xmm14, %xmm1
393+
; addsd %xmm3, %xmm15, %xmm3
394+
; addsd %xmm11, %xmm8, %xmm11
395+
; addsd %xmm2, %xmm9, %xmm2
396+
; addsd %xmm13, 152(%rcx), %xmm13
397+
; addsd %xmm0, %xmm10, %xmm0
398+
; addsd %xmm5, %xmm7, %xmm5
399+
; addsd %xmm4, %xmm1, %xmm4
400+
; addsd %xmm3, %xmm11, %xmm3
401+
; addsd %xmm2, %xmm13, %xmm2
402+
; addsd %xmm0, %xmm5, %xmm0
403+
; addsd %xmm4, %xmm3, %xmm4
404+
; addsd %xmm0, %xmm4, %xmm0
405+
; addsd %xmm0, %xmm2, %xmm0
404406
; movdqu 64(%rsp), %xmm6
405407
; movdqu 80(%rsp), %xmm7
406408
; movdqu 96(%rsp), %xmm8
@@ -433,51 +435,53 @@ block0(v0: i64):
433435
; movdqu %xmm15, 0xd0(%rsp)
434436
; block1: ; offset 0x61
435437
; movsd (%rcx), %xmm0 ; trap: heap_oob
436-
; movsd 8(%rcx), %xmm10 ; trap: heap_oob
437-
; movdqu %xmm10, 0x30(%rsp)
438-
; movsd 0x10(%rcx), %xmm5 ; trap: heap_oob
439-
; movsd 0x18(%rcx), %xmm14 ; trap: heap_oob
440-
; movdqu %xmm14, 0x20(%rsp)
441-
; movsd 0x20(%rcx), %xmm13 ; trap: heap_oob
442-
; movsd 0x28(%rcx), %xmm15 ; trap: heap_oob
443-
; movdqu %xmm15, 0x10(%rsp)
438+
; movsd 8(%rcx), %xmm8 ; trap: heap_oob
439+
; movdqu %xmm8, 0x30(%rsp)
440+
; movsd 0x10(%rcx), %xmm10 ; trap: heap_oob
441+
; movdqu %xmm10, (%rsp)
442+
; movsd 0x18(%rcx), %xmm9 ; trap: heap_oob
443+
; movdqa %xmm9, %xmm10
444+
; movsd 0x20(%rcx), %xmm5 ; trap: heap_oob
445+
; movsd 0x28(%rcx), %xmm6 ; trap: heap_oob
446+
; movdqu %xmm6, 0x20(%rsp)
444447
; movsd 0x30(%rcx), %xmm7 ; trap: heap_oob
445-
; movsd 0x38(%rcx), %xmm8 ; trap: heap_oob
446-
; movdqu %xmm8, (%rsp)
447-
; movsd 0x40(%rcx), %xmm12 ; trap: heap_oob
448-
; movsd 0x48(%rcx), %xmm2 ; trap: heap_oob
449-
; movsd 0x50(%rcx), %xmm9 ; trap: heap_oob
450-
; movsd 0x58(%rcx), %xmm4 ; trap: heap_oob
448+
; movsd 0x38(%rcx), %xmm12 ; trap: heap_oob
449+
; movdqu %xmm12, 0x10(%rsp)
450+
; movsd 0x40(%rcx), %xmm4 ; trap: heap_oob
451+
; movsd 0x48(%rcx), %xmm12 ; trap: heap_oob
452+
; movsd 0x50(%rcx), %xmm1 ; trap: heap_oob
453+
; movsd 0x58(%rcx), %xmm14 ; trap: heap_oob
451454
; movsd 0x60(%rcx), %xmm3 ; trap: heap_oob
452-
; movsd 0x68(%rcx), %xmm8 ; trap: heap_oob
455+
; movsd 0x68(%rcx), %xmm15 ; trap: heap_oob
453456
; movsd 0x70(%rcx), %xmm11 ; trap: heap_oob
454-
; movsd 0x78(%rcx), %xmm10 ; trap: heap_oob
455-
; movsd 0x80(%rcx), %xmm6 ; trap: heap_oob
456-
; movsd 0x88(%rcx), %xmm14 ; trap: heap_oob
457-
; movsd 0x90(%rcx), %xmm1 ; trap: heap_oob
458-
; movdqu 0x30(%rsp), %xmm15
459-
; addsd %xmm15, %xmm0
460-
; movdqu 0x20(%rsp), %xmm15
461-
; addsd %xmm15, %xmm5
462-
; movdqu 0x10(%rsp), %xmm15
463-
; addsd %xmm15, %xmm13
464-
; movdqu (%rsp), %xmm15
465-
; addsd %xmm15, %xmm7
466-
; addsd %xmm2, %xmm12
467-
; addsd %xmm4, %xmm9
468-
; addsd %xmm8, %xmm3
469-
; addsd %xmm10, %xmm11
470-
; addsd %xmm14, %xmm6
471-
; addsd 0x98(%rcx), %xmm1 ; trap: heap_oob
472-
; addsd %xmm5, %xmm0
473-
; addsd %xmm7, %xmm13
474-
; addsd %xmm9, %xmm12
475-
; addsd %xmm11, %xmm3
476-
; addsd %xmm1, %xmm6
477-
; addsd %xmm13, %xmm0
478-
; addsd %xmm3, %xmm12
479-
; addsd %xmm12, %xmm0
457+
; movsd 0x78(%rcx), %xmm8 ; trap: heap_oob
458+
; movsd 0x80(%rcx), %xmm2 ; trap: heap_oob
459+
; movsd 0x88(%rcx), %xmm9 ; trap: heap_oob
460+
; movsd 0x90(%rcx), %xmm13 ; trap: heap_oob
461+
; movdqu 0x30(%rsp), %xmm6
480462
; addsd %xmm6, %xmm0
463+
; movdqa %xmm10, %xmm6
464+
; movdqu (%rsp), %xmm10
465+
; addsd %xmm6, %xmm10
466+
; movdqu 0x20(%rsp), %xmm6
467+
; addsd %xmm6, %xmm5
468+
; movdqu 0x10(%rsp), %xmm6
469+
; addsd %xmm6, %xmm7
470+
; addsd %xmm12, %xmm4
471+
; addsd %xmm14, %xmm1
472+
; addsd %xmm15, %xmm3
473+
; addsd %xmm8, %xmm11
474+
; addsd %xmm9, %xmm2
475+
; addsd 0x98(%rcx), %xmm13 ; trap: heap_oob
476+
; addsd %xmm10, %xmm0
477+
; addsd %xmm7, %xmm5
478+
; addsd %xmm1, %xmm4
479+
; addsd %xmm11, %xmm3
480+
; addsd %xmm13, %xmm2
481+
; addsd %xmm5, %xmm0
482+
; addsd %xmm3, %xmm4
483+
; addsd %xmm4, %xmm0
484+
; addsd %xmm2, %xmm0
481485
; movdqu 0x40(%rsp), %xmm6
482486
; movdqu 0x50(%rsp), %xmm7
483487
; movdqu 0x60(%rsp), %xmm8

0 commit comments

Comments
 (0)