11//! Defines x64 instructions using the DSL.
22
3+ mod abs;
34mod add;
5+ mod align;
46mod and;
57mod atomic;
68mod avg;
79mod bitmanip;
10+ mod cmov;
811mod cmp;
912mod cvt;
1013mod div;
@@ -17,6 +20,7 @@ mod mul;
1720mod neg;
1821mod nop;
1922mod or;
23+ mod pack;
2024mod round;
2125mod shift;
2226mod sqrt;
@@ -31,11 +35,14 @@ use std::collections::HashMap;
3135#[ must_use]
3236pub fn list ( ) -> Vec < Inst > {
3337 let mut all = vec ! [ ] ;
38+ all. extend ( abs:: list ( ) ) ;
3439 all. extend ( add:: list ( ) ) ;
40+ all. extend ( align:: list ( ) ) ;
3541 all. extend ( and:: list ( ) ) ;
3642 all. extend ( atomic:: list ( ) ) ;
3743 all. extend ( avg:: list ( ) ) ;
3844 all. extend ( bitmanip:: list ( ) ) ;
45+ all. extend ( cmov:: list ( ) ) ;
3946 all. extend ( cmp:: list ( ) ) ;
4047 all. extend ( cvt:: list ( ) ) ;
4148 all. extend ( div:: list ( ) ) ;
@@ -48,6 +55,7 @@ pub fn list() -> Vec<Inst> {
4855 all. extend ( neg:: list ( ) ) ;
4956 all. extend ( nop:: list ( ) ) ;
5057 all. extend ( or:: list ( ) ) ;
58+ all. extend ( pack:: list ( ) ) ;
5159 all. extend ( round:: list ( ) ) ;
5260 all. extend ( shift:: list ( ) ) ;
5361 all. extend ( sqrt:: list ( ) ) ;
@@ -74,7 +82,10 @@ fn check_avx_alternates(all: &mut [Inst]) {
7482 . map ( |( index, inst) | ( inst. name ( ) . clone ( ) , index) )
7583 . collect ( ) ;
7684 for inst in all. iter ( ) . filter ( |inst| inst. alternate . is_some ( ) ) {
77- assert ! ( inst. features. is_sse( ) ) ;
85+ assert ! (
86+ inst. features. is_sse( ) ,
87+ "expected an SSE instruction: {inst}"
88+ ) ;
7889 let alternate = inst. alternate . as_ref ( ) . unwrap ( ) ;
7990 assert_eq ! ( alternate. feature, Feature :: avx) ;
8091 let avx_index = name_to_index. get ( & alternate. name ) . expect ( & format ! (
@@ -116,16 +127,54 @@ fn check_sse_matches_avx(sse_inst: &Inst, avx_inst: &Inst) {
116127 // may have slightly different operand semantics (e.g., `roundss` ->
117128 // `vroundss`) and we want to be careful about matching too freely.
118129 (
119- [ ( ReadWrite , Reg ( _) ) , ( Read , Reg ( _) | RegMem ( _) | Mem ( _) ) ] ,
130+ [
131+ ( ReadWrite | Write , Reg ( _) ) ,
132+ ( Read , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
133+ ] ,
120134 [
121135 ( Write , Reg ( _) ) ,
122136 ( Read , Reg ( _) ) ,
123137 ( Read , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
124138 ] ,
125139 ) => { }
140+ (
141+ [
142+ ( Write , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
143+ ( Read , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
144+ ] ,
145+ [
146+ ( Write , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
147+ ( Read , Reg ( _) | RegMem ( _) | Mem ( _) ) ,
148+ ] ,
149+ ) => { }
150+ (
151+ [
152+ ( Write , Reg ( _) | RegMem ( _) ) ,
153+ ( Read , Reg ( _) | RegMem ( _) ) ,
154+ ( Read , Imm ( _) ) ,
155+ ] ,
156+ [
157+ ( Write , Reg ( _) | RegMem ( _) ) ,
158+ ( Read , Reg ( _) | RegMem ( _) ) ,
159+ ( Read , Imm ( _) ) ,
160+ ] ,
161+ ) => { }
162+ (
163+ [ ( ReadWrite , Reg ( _) ) , ( Read , RegMem ( _) ) , ( Read , Imm ( _) ) ] ,
164+ [
165+ ( Write , Reg ( _) ) ,
166+ ( Read , Reg ( _) ) ,
167+ ( Read , RegMem ( _) ) ,
168+ ( Read , Imm ( _) ) ,
169+ ] ,
170+ ) => { }
126171 // We panic on other formats for now; feel free to add more patterns to
127172 // avoid this.
128- _ => panic ! ( "unmatched formats for SSE-to-AVX alternate:\n {sse_inst}\n {avx_inst}" ) ,
173+ _ => panic ! (
174+ "unmatched formats for SSE-to-AVX alternate:\n {sse_inst}\n {avx_inst}. {:?}, {:?}" ,
175+ list_ops( sse_inst) ,
176+ list_ops( avx_inst)
177+ ) ,
129178 }
130179}
131180
0 commit comments