Sort operations alphabetically

This commit is contained in:
Joëlle van Essen 2025-03-30 16:14:29 +02:00
commit 65cf4863c7
No known key found for this signature in database
GPG key ID: 28D3B5CDD4B43882
2 changed files with 348 additions and 348 deletions

View file

@ -2297,7 +2297,7 @@ impl<'a> MethodEmitContext<'a> {
], ],
)?; )?;
if data.control == Mul24Control::Hi { if data.control == Mul24Control::Hi {
// There is an important difference between NVIDIA's mul24 and AMD's mulhi.[ui]24. // There is an important difference between NVIDIA's mul24.hi and AMD's mulhi.[ui]24.
// NVIDIA: Returns bits 47..16 of the 64-bit result // NVIDIA: Returns bits 47..16 of the 64-bit result
// AMD: Returns bits 63..32 of the 64-bit result // AMD: Returns bits 63..32 of the 64-bit result
// Hence we need to compute both hi and lo, shift the results and add them together to replicate NVIDIA's mul24 // Hence we need to compute both hi and lo, shift the results and add them together to replicate NVIDIA's mul24

View file

@ -30,14 +30,195 @@ pub enum Statement<P: Operand> {
// This information is then available to a visitor. // This information is then available to a visitor.
ptx_parser_macros::generate_instruction_type!( ptx_parser_macros::generate_instruction_type!(
pub enum Instruction<T: Operand> { pub enum Instruction<T: Operand> {
Mov { Abs {
type: { &data.typ }, data: TypeFtz,
data: MovDetails, type: { Type::Scalar(data.type_) },
arguments<T>: {
dst: T,
src: T,
}
},
Activemask {
type: Type::Scalar(ScalarType::B32),
arguments<T>: {
dst: T
}
},
Add {
type: { Type::from(data.type_()) },
data: ArithDetails,
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
And {
data: ScalarType,
type: { Type::Scalar(data.clone()) },
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Atom {
type: &data.type_,
data: AtomDetails,
arguments<T>: {
dst: T,
src1: {
repr: T,
space: { data.space },
},
src2: T,
}
},
AtomCas {
type: Type::Scalar(data.type_),
data: AtomCasDetails,
arguments<T>: {
dst: T,
src1: {
repr: T,
space: { data.space },
},
src2: T,
src3: T,
}
},
Bar {
type: Type::Scalar(ScalarType::U32),
data: BarData,
arguments<T>: {
src1: T,
src2: Option<T>,
}
},
Bfe {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src3: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
}
},
Bfi {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src4: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
}
},
Bra {
type: !,
arguments<T::Ident>: {
src: T
}
},
Brev {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: { arguments<T>: {
dst: T, dst: T,
src: T src: T
} }
}, },
Call {
data: CallDetails,
arguments: CallArgs<T>,
visit: arguments.visit(data, visitor)?,
visit_mut: arguments.visit_mut(data, visitor)?,
map: Instruction::Call{ arguments: arguments.map(&data, visitor)?, data }
},
Clz {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src: T
}
},
Cos {
type: Type::Scalar(ScalarType::F32),
data: FlushToZero,
arguments<T>: {
dst: T,
src: T
}
},
Cvt {
data: CvtDetails,
arguments<T>: {
dst: {
repr: T,
type: { Type::Scalar(data.to) },
// TODO: double check
relaxed_type_check: true,
},
src: {
repr: T,
type: { Type::Scalar(data.from) },
relaxed_type_check: true,
},
}
},
Cvta {
data: CvtaDetails,
type: { Type::Scalar(ScalarType::B64) },
arguments<T>: {
dst: T,
src: T,
}
},
Div {
type: Type::Scalar(data.type_()),
data: DivDetails,
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Ex2 {
type: Type::Scalar(ScalarType::F32),
data: TypeFtz,
arguments<T>: {
dst: T,
src: T
}
},
Fma {
type: { Type::from(data.type_) },
data: ArithFloat,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: T,
}
},
Ld { Ld {
type: { &data.typ }, type: { &data.typ },
data: LdDetails, data: LdDetails,
@ -52,27 +233,54 @@ ptx_parser_macros::generate_instruction_type!(
} }
} }
}, },
Add { Lg2 {
type: Type::Scalar(ScalarType::F32),
data: FlushToZero,
arguments<T>: {
dst: T,
src: T
}
},
Mad {
type: { Type::from(data.type_()) }, type: { Type::from(data.type_()) },
data: ArithDetails, data: MadDetails,
arguments<T>: {
dst: {
repr: T,
type: { Type::from(data.dst_type()) },
},
src1: T,
src2: T,
src3: T,
}
},
Max {
type: { Type::from(data.type_()) },
data: MinMaxDetails,
arguments<T>: { arguments<T>: {
dst: T, dst: T,
src1: T, src1: T,
src2: T, src2: T,
} }
}, },
St { Membar {
type: { &data.typ }, data: MemScope
data: StData, },
Min {
type: { Type::from(data.type_()) },
data: MinMaxDetails,
arguments<T>: { arguments<T>: {
src1: { dst: T,
repr: T, src1: T,
space: { data.state_space }, src2: T,
}, }
src2: { },
repr: T, Mov {
relaxed_type_check: true, type: { &data.typ },
} data: MovDetails,
arguments<T>: {
dst: T,
src: T
} }
}, },
Mul { Mul {
@ -96,6 +304,101 @@ ptx_parser_macros::generate_instruction_type!(
src2: T, src2: T,
} }
}, },
Neg {
type: Type::Scalar(data.type_),
data: TypeFtz,
arguments<T>: {
dst: T,
src: T
}
},
Not {
data: ScalarType,
type: { Type::Scalar(data.clone()) },
arguments<T>: {
dst: T,
src: T,
}
},
Or {
data: ScalarType,
type: { Type::Scalar(data.clone()) },
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Popc {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src: T
}
},
Prmt {
type: Type::Scalar(ScalarType::B32),
data: u16,
arguments<T>: {
dst: T,
src1: T,
src2: T
}
},
PrmtSlow {
type: Type::Scalar(ScalarType::U32),
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: T
}
},
Rcp {
type: { Type::from(data.type_) },
data: RcpData,
arguments<T>: {
dst: T,
src: T,
}
},
Rem {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T
}
},
Ret {
data: RetData
},
Rsqrt {
type: { Type::from(data.type_) },
data: TypeFtz,
arguments<T>: {
dst: T,
src: T,
}
},
Selp {
type: { Type::Scalar(data.clone()) },
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: {
repr: T,
type: Type::Scalar(ScalarType::Pred)
},
}
},
Setp { Setp {
data: SetpData, data: SetpData,
arguments<T>: { arguments<T>: {
@ -142,58 +445,15 @@ ptx_parser_macros::generate_instruction_type!(
} }
} }
}, },
Not { Shl {
data: ScalarType,
type: { Type::Scalar(data.clone()) },
arguments<T>: {
dst: T,
src: T,
}
},
Or {
data: ScalarType, data: ScalarType,
type: { Type::Scalar(data.clone()) }, type: { Type::Scalar(data.clone()) },
arguments<T>: { arguments<T>: {
dst: T, dst: T,
src1: T, src1: T,
src2: T, src2: {
}
},
And {
data: ScalarType,
type: { Type::Scalar(data.clone()) },
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Bra {
type: !,
arguments<T::Ident>: {
src: T
}
},
Call {
data: CallDetails,
arguments: CallArgs<T>,
visit: arguments.visit(data, visitor)?,
visit_mut: arguments.visit_mut(data, visitor)?,
map: Instruction::Call{ arguments: arguments.map(&data, visitor)?, data }
},
Cvt {
data: CvtDetails,
arguments<T>: {
dst: {
repr: T, repr: T,
type: { Type::Scalar(data.to) }, type: { Type::Scalar(ScalarType::U32) },
// TODO: double check
relaxed_type_check: true,
},
src: {
repr: T,
type: { Type::Scalar(data.from) },
relaxed_type_check: true,
}, },
} }
}, },
@ -209,58 +469,34 @@ ptx_parser_macros::generate_instruction_type!(
}, },
} }
}, },
Shl { Sin {
data: ScalarType, type: Type::Scalar(ScalarType::F32),
type: { Type::Scalar(data.clone()) }, data: FlushToZero,
arguments<T>: { arguments<T>: {
dst: T, dst: T,
src1: T, src: T
}
},
Sqrt {
type: { Type::from(data.type_) },
data: RcpData,
arguments<T>: {
dst: T,
src: T,
}
},
St {
type: { &data.typ },
data: StData,
arguments<T>: {
src1: {
repr: T,
space: { data.state_space },
},
src2: { src2: {
repr: T, repr: T,
type: { Type::Scalar(ScalarType::U32) }, relaxed_type_check: true,
}, }
}
},
Ret {
data: RetData
},
Cvta {
data: CvtaDetails,
type: { Type::Scalar(ScalarType::B64) },
arguments<T>: {
dst: T,
src: T,
}
},
Abs {
data: TypeFtz,
type: { Type::Scalar(data.type_) },
arguments<T>: {
dst: T,
src: T,
}
},
Mad {
type: { Type::from(data.type_()) },
data: MadDetails,
arguments<T>: {
dst: {
repr: T,
type: { Type::from(data.dst_type()) },
},
src1: T,
src2: T,
src3: T,
}
},
Fma {
type: { Type::from(data.type_) },
data: ArithFloat,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: T,
} }
}, },
Sub { Sub {
@ -272,173 +508,7 @@ ptx_parser_macros::generate_instruction_type!(
src2: T, src2: T,
} }
}, },
Min { Trap { },
type: { Type::from(data.type_()) },
data: MinMaxDetails,
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Max {
type: { Type::from(data.type_()) },
data: MinMaxDetails,
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Rcp {
type: { Type::from(data.type_) },
data: RcpData,
arguments<T>: {
dst: T,
src: T,
}
},
Sqrt {
type: { Type::from(data.type_) },
data: RcpData,
arguments<T>: {
dst: T,
src: T,
}
},
Rsqrt {
type: { Type::from(data.type_) },
data: TypeFtz,
arguments<T>: {
dst: T,
src: T,
}
},
Selp {
type: { Type::Scalar(data.clone()) },
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: {
repr: T,
type: Type::Scalar(ScalarType::Pred)
},
}
},
Bar {
type: Type::Scalar(ScalarType::U32),
data: BarData,
arguments<T>: {
src1: T,
src2: Option<T>,
}
},
Atom {
type: &data.type_,
data: AtomDetails,
arguments<T>: {
dst: T,
src1: {
repr: T,
space: { data.space },
},
src2: T,
}
},
AtomCas {
type: Type::Scalar(data.type_),
data: AtomCasDetails,
arguments<T>: {
dst: T,
src1: {
repr: T,
space: { data.space },
},
src2: T,
src3: T,
}
},
Div {
type: Type::Scalar(data.type_()),
data: DivDetails,
arguments<T>: {
dst: T,
src1: T,
src2: T,
}
},
Neg {
type: Type::Scalar(data.type_),
data: TypeFtz,
arguments<T>: {
dst: T,
src: T
}
},
Sin {
type: Type::Scalar(ScalarType::F32),
data: FlushToZero,
arguments<T>: {
dst: T,
src: T
}
},
Cos {
type: Type::Scalar(ScalarType::F32),
data: FlushToZero,
arguments<T>: {
dst: T,
src: T
}
},
Lg2 {
type: Type::Scalar(ScalarType::F32),
data: FlushToZero,
arguments<T>: {
dst: T,
src: T
}
},
Ex2 {
type: Type::Scalar(ScalarType::F32),
data: TypeFtz,
arguments<T>: {
dst: T,
src: T
}
},
Clz {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src: T
}
},
Brev {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src: T
}
},
Popc {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src: T
}
},
Xor { Xor {
type: Type::Scalar(data.clone()), type: Type::Scalar(data.clone()),
data: ScalarType, data: ScalarType,
@ -448,76 +518,6 @@ ptx_parser_macros::generate_instruction_type!(
src2: T src2: T
} }
}, },
Rem {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T
}
},
Bfe {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src3: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
}
},
Bfi {
type: Type::Scalar(data.clone()),
data: ScalarType,
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
src4: {
repr: T,
type: Type::Scalar(ScalarType::U32)
},
}
},
PrmtSlow {
type: Type::Scalar(ScalarType::U32),
arguments<T>: {
dst: T,
src1: T,
src2: T,
src3: T
}
},
Prmt {
type: Type::Scalar(ScalarType::B32),
data: u16,
arguments<T>: {
dst: T,
src1: T,
src2: T
}
},
Activemask {
type: Type::Scalar(ScalarType::B32),
arguments<T>: {
dst: T
}
},
Membar {
data: MemScope
},
Trap { }
} }
); );