Infer REX prefix for SIMD operations; fixes #1127
- Convert recipes to have necessary size calculator - Add a missing binemit function, `put_dynrexmp3` - Modify the meta-encodings of x86 SIMD instructions to use `infer_rex()`, mostly through the `enc_both_inferred()` helper - Fix up tests that previously always emitted a REX prefix
This commit is contained in:
@@ -176,25 +176,49 @@ block0:
|
||||
|
||||
function %float_arithmetic_f32x4(f32x4, f32x4) {
|
||||
block0(v0: f32x4 [%xmm3], v1: f32x4 [%xmm5]):
|
||||
[-, %xmm3] v2 = fadd v0, v1 ; bin: 40 0f 58 dd
|
||||
[-, %xmm3] v3 = fsub v0, v1 ; bin: 40 0f 5c dd
|
||||
[-, %xmm3] v4 = fmul v0, v1 ; bin: 40 0f 59 dd
|
||||
[-, %xmm3] v5 = fdiv v0, v1 ; bin: 40 0f 5e dd
|
||||
[-, %xmm3] v6 = fmin v0, v1 ; bin: 40 0f 5d dd
|
||||
[-, %xmm3] v7 = fmax v0, v1 ; bin: 40 0f 5f dd
|
||||
[-, %xmm3] v8 = sqrt v0 ; bin: 40 0f 51 db
|
||||
[-, %xmm3] v2 = fadd v0, v1 ; bin: 0f 58 dd
|
||||
[-, %xmm3] v3 = fsub v0, v1 ; bin: 0f 5c dd
|
||||
[-, %xmm3] v4 = fmul v0, v1 ; bin: 0f 59 dd
|
||||
[-, %xmm3] v5 = fdiv v0, v1 ; bin: 0f 5e dd
|
||||
[-, %xmm3] v6 = fmin v0, v1 ; bin: 0f 5d dd
|
||||
[-, %xmm3] v7 = fmax v0, v1 ; bin: 0f 5f dd
|
||||
[-, %xmm3] v8 = sqrt v0 ; bin: 0f 51 db
|
||||
return
|
||||
}
|
||||
|
||||
function %float_arithmetic_f32x4_rex(f32x4, f32x4) {
|
||||
block0(v0: f32x4 [%xmm3], v1: f32x4 [%xmm10]):
|
||||
[-, %xmm3] v2 = fadd v0, v1 ; bin: 41 0f 58 da
|
||||
[-, %xmm3] v3 = fsub v0, v1 ; bin: 41 0f 5c da
|
||||
[-, %xmm3] v4 = fmul v0, v1 ; bin: 41 0f 59 da
|
||||
[-, %xmm3] v5 = fdiv v0, v1 ; bin: 41 0f 5e da
|
||||
[-, %xmm3] v6 = fmin v0, v1 ; bin: 41 0f 5d da
|
||||
[-, %xmm3] v7 = fmax v0, v1 ; bin: 41 0f 5f da
|
||||
[-, %xmm3] v8 = sqrt v1 ; bin: 41 0f 51 da
|
||||
return
|
||||
}
|
||||
|
||||
function %float_arithmetic_f64x2(f64x2, f64x2) {
|
||||
block0(v0: f64x2 [%xmm3], v1: f64x2 [%xmm5]):
|
||||
[-, %xmm3] v2 = fadd v0, v1 ; bin: 66 40 0f 58 dd
|
||||
[-, %xmm3] v3 = fsub v0, v1 ; bin: 66 40 0f 5c dd
|
||||
[-, %xmm3] v4 = fmul v0, v1 ; bin: 66 40 0f 59 dd
|
||||
[-, %xmm3] v5 = fdiv v0, v1 ; bin: 66 40 0f 5e dd
|
||||
[-, %xmm3] v6 = fmin v0, v1 ; bin: 66 40 0f 5d dd
|
||||
[-, %xmm3] v7 = fmax v0, v1 ; bin: 66 40 0f 5f dd
|
||||
[-, %xmm3] v8 = sqrt v0 ; bin: 66 40 0f 51 db
|
||||
[-, %xmm3] v2 = fadd v0, v1 ; bin: 66 0f 58 dd
|
||||
[-, %xmm3] v3 = fsub v0, v1 ; bin: 66 0f 5c dd
|
||||
[-, %xmm3] v4 = fmul v0, v1 ; bin: 66 0f 59 dd
|
||||
[-, %xmm3] v5 = fdiv v0, v1 ; bin: 66 0f 5e dd
|
||||
[-, %xmm3] v6 = fmin v0, v1 ; bin: 66 0f 5d dd
|
||||
[-, %xmm3] v7 = fmax v0, v1 ; bin: 66 0f 5f dd
|
||||
[-, %xmm3] v8 = sqrt v0 ; bin: 66 0f 51 db
|
||||
return
|
||||
}
|
||||
|
||||
function %float_arithmetic_f64x2_rex(f64x2, f64x2) {
|
||||
block0(v0: f64x2 [%xmm11], v1: f64x2 [%xmm13]):
|
||||
[-, %xmm11] v2 = fadd v0, v1 ; bin: 66 45 0f 58 dd
|
||||
[-, %xmm11] v3 = fsub v0, v1 ; bin: 66 45 0f 5c dd
|
||||
[-, %xmm11] v4 = fmul v0, v1 ; bin: 66 45 0f 59 dd
|
||||
[-, %xmm11] v5 = fdiv v0, v1 ; bin: 66 45 0f 5e dd
|
||||
[-, %xmm11] v6 = fmin v0, v1 ; bin: 66 45 0f 5d dd
|
||||
[-, %xmm11] v7 = fmax v0, v1 ; bin: 66 45 0f 5f dd
|
||||
[-, %xmm11] v8 = sqrt v0 ; bin: 66 45 0f 51 db
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -87,26 +87,52 @@ block0(v0: i32x4 [%xmm2], v1: i32x4 [%xmm4]):
|
||||
|
||||
function %fcmp_f32x4(f32x4, f32x4) {
|
||||
block0(v0: f32x4 [%xmm2], v1: f32x4 [%xmm4]):
|
||||
[-, %xmm2] v2 = fcmp eq v0, v1 ; bin: 40 0f c2 d4 00
|
||||
[-, %xmm2] v3 = fcmp lt v0, v1 ; bin: 40 0f c2 d4 01
|
||||
[-, %xmm2] v4 = fcmp le v0, v1 ; bin: 40 0f c2 d4 02
|
||||
[-, %xmm2] v5 = fcmp uno v0, v1 ; bin: 40 0f c2 d4 03
|
||||
[-, %xmm2] v6 = fcmp ne v0, v1 ; bin: 40 0f c2 d4 04
|
||||
[-, %xmm2] v7 = fcmp uge v0, v1 ; bin: 40 0f c2 d4 05
|
||||
[-, %xmm2] v8 = fcmp ugt v0, v1 ; bin: 40 0f c2 d4 06
|
||||
[-, %xmm2] v9 = fcmp ord v0, v1 ; bin: 40 0f c2 d4 07
|
||||
[-, %xmm2] v2 = fcmp eq v0, v1 ; bin: 0f c2 d4 00
|
||||
[-, %xmm2] v3 = fcmp lt v0, v1 ; bin: 0f c2 d4 01
|
||||
[-, %xmm2] v4 = fcmp le v0, v1 ; bin: 0f c2 d4 02
|
||||
[-, %xmm2] v5 = fcmp uno v0, v1 ; bin: 0f c2 d4 03
|
||||
[-, %xmm2] v6 = fcmp ne v0, v1 ; bin: 0f c2 d4 04
|
||||
[-, %xmm2] v7 = fcmp uge v0, v1 ; bin: 0f c2 d4 05
|
||||
[-, %xmm2] v8 = fcmp ugt v0, v1 ; bin: 0f c2 d4 06
|
||||
[-, %xmm2] v9 = fcmp ord v0, v1 ; bin: 0f c2 d4 07
|
||||
return
|
||||
}
|
||||
|
||||
function %fcmp_f32x4_rex(f32x4, f32x4) {
|
||||
block0(v0: f32x4 [%xmm8], v1: f32x4 [%xmm8]):
|
||||
[-, %xmm8] v2 = fcmp eq v0, v1 ; bin: 45 0f c2 c0 00
|
||||
[-, %xmm8] v3 = fcmp lt v0, v1 ; bin: 45 0f c2 c0 01
|
||||
[-, %xmm8] v4 = fcmp le v0, v1 ; bin: 45 0f c2 c0 02
|
||||
[-, %xmm8] v5 = fcmp uno v0, v1 ; bin: 45 0f c2 c0 03
|
||||
[-, %xmm8] v6 = fcmp ne v0, v1 ; bin: 45 0f c2 c0 04
|
||||
[-, %xmm8] v7 = fcmp uge v0, v1 ; bin: 45 0f c2 c0 05
|
||||
[-, %xmm8] v8 = fcmp ugt v0, v1 ; bin: 45 0f c2 c0 06
|
||||
[-, %xmm8] v9 = fcmp ord v0, v1 ; bin: 45 0f c2 c0 07
|
||||
return
|
||||
}
|
||||
|
||||
function %fcmp_f64x2(f64x2, f64x2) {
|
||||
block0(v0: f64x2 [%xmm2], v1: f64x2 [%xmm0]):
|
||||
[-, %xmm2] v2 = fcmp eq v0, v1 ; bin: 66 40 0f c2 d0 00
|
||||
[-, %xmm2] v3 = fcmp lt v0, v1 ; bin: 66 40 0f c2 d0 01
|
||||
[-, %xmm2] v4 = fcmp le v0, v1 ; bin: 66 40 0f c2 d0 02
|
||||
[-, %xmm2] v5 = fcmp uno v0, v1 ; bin: 66 40 0f c2 d0 03
|
||||
[-, %xmm2] v6 = fcmp ne v0, v1 ; bin: 66 40 0f c2 d0 04
|
||||
[-, %xmm2] v7 = fcmp uge v0, v1 ; bin: 66 40 0f c2 d0 05
|
||||
[-, %xmm2] v8 = fcmp ugt v0, v1 ; bin: 66 40 0f c2 d0 06
|
||||
[-, %xmm2] v9 = fcmp ord v0, v1 ; bin: 66 40 0f c2 d0 07
|
||||
[-, %xmm2] v2 = fcmp eq v0, v1 ; bin: 66 0f c2 d0 00
|
||||
[-, %xmm2] v3 = fcmp lt v0, v1 ; bin: 66 0f c2 d0 01
|
||||
[-, %xmm2] v4 = fcmp le v0, v1 ; bin: 66 0f c2 d0 02
|
||||
[-, %xmm2] v5 = fcmp uno v0, v1 ; bin: 66 0f c2 d0 03
|
||||
[-, %xmm2] v6 = fcmp ne v0, v1 ; bin: 66 0f c2 d0 04
|
||||
[-, %xmm2] v7 = fcmp uge v0, v1 ; bin: 66 0f c2 d0 05
|
||||
[-, %xmm2] v8 = fcmp ugt v0, v1 ; bin: 66 0f c2 d0 06
|
||||
[-, %xmm2] v9 = fcmp ord v0, v1 ; bin: 66 0f c2 d0 07
|
||||
return
|
||||
}
|
||||
|
||||
function %fcmp_f64x2_rex(f64x2, f64x2) {
|
||||
block0(v0: f64x2 [%xmm9], v1: f64x2 [%xmm11]):
|
||||
[-, %xmm9] v2 = fcmp eq v0, v1 ; bin: 66 45 0f c2 cb 00
|
||||
[-, %xmm9] v3 = fcmp lt v0, v1 ; bin: 66 45 0f c2 cb 01
|
||||
[-, %xmm9] v4 = fcmp le v0, v1 ; bin: 66 45 0f c2 cb 02
|
||||
[-, %xmm9] v5 = fcmp uno v0, v1 ; bin: 66 45 0f c2 cb 03
|
||||
[-, %xmm9] v6 = fcmp ne v0, v1 ; bin: 66 45 0f c2 cb 04
|
||||
[-, %xmm9] v7 = fcmp uge v0, v1 ; bin: 66 45 0f c2 cb 05
|
||||
[-, %xmm9] v8 = fcmp ugt v0, v1 ; bin: 66 45 0f c2 cb 06
|
||||
[-, %xmm9] v9 = fcmp ord v0, v1 ; bin: 66 45 0f c2 cb 07
|
||||
return
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ block0:
|
||||
function %pshufd() {
|
||||
block0:
|
||||
[-, %rax] v0 = iconst.i32 42
|
||||
[-, %xmm0] v1 = scalar_to_vector.i32x4 v0 ; bin: 66 40 0f 6e c0
|
||||
[-, %xmm0] v1 = scalar_to_vector.i32x4 v0 ; bin: 66 0f 6e c0
|
||||
[-, %xmm0] v2 = x86_pshufd v1, 0 ; bin: 66 0f 70 c0 00
|
||||
return
|
||||
}
|
||||
@@ -89,9 +89,9 @@ block0:
|
||||
function %pshufb() {
|
||||
block0:
|
||||
[-, %rax] v0 = iconst.i8 42
|
||||
[-, %xmm0] v1 = scalar_to_vector.i8x16 v0 ; bin: 66 40 0f 6e c0
|
||||
[-, %xmm0] v1 = scalar_to_vector.i8x16 v0 ; bin: 66 0f 6e c0
|
||||
[-, %rbx] v2 = iconst.i8 43
|
||||
[-, %xmm4] v3 = scalar_to_vector.i8x16 v2 ; bin: 66 40 0f 6e e3
|
||||
[-, %xmm0] v4 = x86_pshufb v1, v3 ; bin: 66 0f 38 00 c4
|
||||
[-, %xmm12] v3 = scalar_to_vector.i8x16 v2 ; bin: 66 44 0f 6e e3
|
||||
[-, %xmm0] v4 = x86_pshufb v1, v3 ; bin: 66 41 0f 38 00 c4
|
||||
return
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ block0(v0: i64 [%rax]):
|
||||
[-] store v10, v0 ; bin: heap_oob 0f 11 00
|
||||
|
||||
; use displacement
|
||||
[-, %xmm0] v11 = load.f32x4 v0+42 ; bin: heap_oob 0f 10 40 2a
|
||||
[-] store v11, v0+42 ; bin: heap_oob 0f 11 40 2a
|
||||
[-, %xmm0] v11 = load.f32x4 v0+42 ; bin: heap_oob 40 0f 10 40 2a
|
||||
[-] store v11, v0+42 ; bin: heap_oob 40 0f 11 40 2a
|
||||
|
||||
; use REX prefix
|
||||
[-, %xmm8] v12 = load.i8x16 v0 ; bin: heap_oob 44 0f 10 00
|
||||
@@ -22,16 +22,17 @@ function %load_store_complex(i64, i64) {
|
||||
block0(v0: i64 [%rax], v1: i64 [%rbx]):
|
||||
; %xmm1 corresponds to ModR/M 0x04; the 0b100 in the R/M slot indicates a SIB byte follows
|
||||
; %rax and %rbx form the SIB 0x18
|
||||
[-, %xmm1] v10 = load_complex.f64x2 v0+v1 ; bin: heap_oob 0f 10 0c 18
|
||||
[-, %xmm1] v10 = load_complex.f64x2 v0+v1 ; bin: heap_oob 40 0f 10 0c 18
|
||||
; enabling bit 6 of the ModR/M byte indicates a disp8 follows
|
||||
[-] store_complex v10, v0+v1+5 ; bin: heap_oob 0f 11 4c 18 05
|
||||
[-] store_complex v10, v0+v1+5 ; bin: heap_oob 40 0f 11 4c 18 05
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
function %copy_to_ssa() {
|
||||
block0:
|
||||
[-, %xmm1] v0 = copy_to_ssa.i64x2 %xmm3 ; bin: 0f 28 cb
|
||||
[-, %xmm1] v0 = copy_to_ssa.i64x2 %xmm3 ; bin: 40 0f 28 cb
|
||||
[-, %xmm2] v1 = copy_to_ssa.i64x2 %xmm15 ; bin: 41 0f 28 d7
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user