Skip to content

Commit f0b083c

Browse files
committed
Legalize [u|s]widen_high for x86
Use `x86_palignr` and `[u|s]widen_low` for legalizing this instruction.
1 parent c8ddf8a commit f0b083c

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

cranelift/codegen/meta/src/isa/x86/legalize.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,13 +407,18 @@ fn define_simd(
407407
let umax = insts.by_name("umax");
408408
let umin = insts.by_name("umin");
409409
let snarrow = insts.by_name("snarrow");
410+
let swiden_high = insts.by_name("swiden_high");
411+
let swiden_low = insts.by_name("swiden_low");
410412
let ushr_imm = insts.by_name("ushr_imm");
411413
let ushr = insts.by_name("ushr");
414+
let uwiden_high = insts.by_name("uwiden_high");
415+
let uwiden_low = insts.by_name("uwiden_low");
412416
let vconst = insts.by_name("vconst");
413417
let vall_true = insts.by_name("vall_true");
414418
let vany_true = insts.by_name("vany_true");
415419
let vselect = insts.by_name("vselect");
416420

421+
let x86_palignr = x86_instructions.by_name("x86_palignr");
417422
let x86_pmaxs = x86_instructions.by_name("x86_pmaxs");
418423
let x86_pmaxu = x86_instructions.by_name("x86_pmaxu");
419424
let x86_pmins = x86_instructions.by_name("x86_pmins");
@@ -786,6 +791,26 @@ fn define_simd(
786791
);
787792
}
788793

794+
// SIMD widen
795+
for ty in &[I8, I16] {
796+
let swiden_high = swiden_high.bind(vector(*ty, sse_vector_size));
797+
narrow.legalize(
798+
def!(b = swiden_high(a)),
799+
vec![
800+
def!(c = x86_palignr(a, a, uimm8_eight)),
801+
def!(b = swiden_low(c)),
802+
],
803+
);
804+
let uwiden_high = uwiden_high.bind(vector(*ty, sse_vector_size));
805+
narrow.legalize(
806+
def!(b = uwiden_high(a)),
807+
vec![
808+
def!(c = x86_palignr(a, a, uimm8_eight)),
809+
def!(b = uwiden_low(c)),
810+
],
811+
);
812+
}
813+
789814
narrow.custom_legalize(shuffle, "convert_shuffle");
790815
narrow.custom_legalize(extractlane, "convert_extractlane");
791816
narrow.custom_legalize(insertlane, "convert_insertlane");

cranelift/filetests/filetests/isa/x86/simd-conversion-legalize.clif

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,19 @@ block0(v0:f32x4):
5252
; nextln: v1 = iadd v12, v11
5353
return v1
5454
}
55+
56+
function %uwiden_high(i8x16) -> i16x8 {
57+
block0(v0: i8x16):
58+
v1 = uwiden_high v0
59+
; check: v2 = x86_palignr v0, v0, 8
60+
; nextln: v1 = uwiden_low v2
61+
return v1
62+
}
63+
64+
function %swiden_high(i16x8) -> i32x4 {
65+
block0(v0: i16x8):
66+
v1 = swiden_high v0
67+
; check: v2 = x86_palignr v0, v0, 8
68+
; nextln: v1 = swiden_low v2
69+
return v1
70+
}

0 commit comments

Comments
 (0)