@@ -111,10 +111,10 @@ fn insert_stack_store(
111111 Ok ( ( ) )
112112}
113113
114- fn insert_fcmp (
114+ fn insert_cmp (
115115 fgen : & mut FunctionGenerator ,
116116 builder : & mut FunctionBuilder ,
117- _opcode : Opcode ,
117+ opcode : Opcode ,
118118 args : & ' static [ Type ] ,
119119 rets : & ' static [ Type ] ,
120120) -> Result < ( ) > {
@@ -124,9 +124,13 @@ fn insert_fcmp(
124124 let rhs = fgen. get_variable_of_type ( args[ 1 ] ) ?;
125125 let rhs = builder. use_var ( rhs) ;
126126
127- let cc = * fgen. u . choose ( FloatCC :: all ( ) ) ?;
128-
129- let res = builder. ins ( ) . fcmp ( cc, lhs, rhs) ;
127+ let res = if opcode == Opcode :: Fcmp {
128+ let cc = * fgen. u . choose ( FloatCC :: all ( ) ) ?;
129+ builder. ins ( ) . fcmp ( cc, lhs, rhs)
130+ } else {
131+ let cc = * fgen. u . choose ( IntCC :: all ( ) ) ?;
132+ builder. ins ( ) . icmp ( cc, lhs, rhs)
133+ } ;
130134
131135 let var = fgen. get_variable_of_type ( rets[ 0 ] ) ?;
132136 builder. def_var ( var, res) ;
@@ -415,8 +419,16 @@ const OPCODE_SIGNATURES: &'static [(
415419 ( Opcode :: Nearest , & [ F32 ] , & [ F32 ] , insert_opcode) ,
416420 ( Opcode :: Nearest , & [ F64 ] , & [ F64 ] , insert_opcode) ,
417421 // Fcmp
418- ( Opcode :: Fcmp , & [ F32 , F32 ] , & [ B1 ] , insert_fcmp) ,
419- ( Opcode :: Fcmp , & [ F64 , F64 ] , & [ B1 ] , insert_fcmp) ,
422+ ( Opcode :: Fcmp , & [ F32 , F32 ] , & [ B1 ] , insert_cmp) ,
423+ ( Opcode :: Fcmp , & [ F64 , F64 ] , & [ B1 ] , insert_cmp) ,
424+ // Icmp
425+ ( Opcode :: Icmp , & [ I8 , I8 ] , & [ B1 ] , insert_cmp) ,
426+ ( Opcode :: Icmp , & [ I16 , I16 ] , & [ B1 ] , insert_cmp) ,
427+ ( Opcode :: Icmp , & [ I32 , I32 ] , & [ B1 ] , insert_cmp) ,
428+ ( Opcode :: Icmp , & [ I64 , I64 ] , & [ B1 ] , insert_cmp) ,
429+ // TODO: icmp of/nof broken for i128 on x86_64
430+ // See: https://github.com/bytecodealliance/wasmtime/issues/4406
431+ // (Opcode::Icmp, &[I128, I128], &[B1], insert_cmp),
420432 // Stack Access
421433 ( Opcode :: StackStore , & [ I8 ] , & [ ] , insert_stack_store) ,
422434 ( Opcode :: StackStore , & [ I16 ] , & [ ] , insert_stack_store) ,
@@ -688,7 +700,7 @@ where
688700
689701 fn generate_bricmp ( & mut self , builder : & mut FunctionBuilder ) -> Result < ( ) > {
690702 let ( block, args) = self . generate_target_block ( builder) ?;
691- let cond = * fgen . u . choose ( IntCC :: all ( ) ) ?;
703+ let cond = * self . u . choose ( IntCC :: all ( ) ) ?;
692704
693705 let bricmp_types = [
694706 I8 , I16 , I32 ,
0 commit comments