It has no effect on the output ($shiftx doesn't perform any sign
extension whatsoever), so an attempt to use it should be caught early.
                        }
 
                        if (cell->type.in(ID($shift), ID($shiftx))) {
-                               param_bool(ID::A_SIGNED);
+                               if (cell->type == ID($shiftx)) {
+                                       param_bool(ID::A_SIGNED, /*expected=*/false);
+                               } else {
+                                       param_bool(ID::A_SIGNED);
+                               }
                                param_bool(ID::B_SIGNED);
                                port(ID::A, param(ID::A_WIDTH));
                                port(ID::B, param(ID::B_WIDTH));
 
                cell->setPort(ID::Y, wire);
        }
 
+       if (cell_type.in(ID($shiftx))) {
+               cell->parameters[ID::A_SIGNED] = false;
+       }
+
        if (cell_type.in(ID($shl), ID($shr), ID($sshl), ID($sshr))) {
                cell->parameters[ID::B_SIGNED] = false;
        }