The complete ASL owner is shown directly below.
12345pure func HardwareNumericFloatingOrderKey(6 data_type: TileDataType,7 value: Word) => (boolean, Word)8begin9 if !TileNumericEncodingValid(data_type, value) then10 return (FALSE, Zeros{PTO_XLEN});11 end;12
13 case data_type of14 when TileDataType_FP64 =>15 if value[63] == '1' then16 return (TRUE, NOT(value));17 else18 return (TRUE,19 value XOR (Zeros{PTO_XLEN} + 0x8000000000000000));20 end;21 when TileDataType_FP32, TileDataType_TF32, TileDataType_HF32 =>22 let raw = value[31:0];23 let key =24 if raw[31] == '1' then NOT(raw)25 else raw XOR (Zeros{32} + 0x80000000);26 return (TRUE, ZeroExtend{PTO_XLEN}(key));27 when TileDataType_FP16, TileDataType_BF16 =>28 let raw = value[15:0];29 let key =30 if raw[15] == '1' then NOT(raw)31 else raw XOR (Zeros{16} + 0x8000);32 return (TRUE, ZeroExtend{PTO_XLEN}(key));33 when TileDataType_E4M3, TileDataType_E5M2 =>34 let raw = value[7:0];35 let key =36 if raw[7] == '1' then NOT(raw)37 else raw XOR (Zeros{8} + 0x80);38 return (TRUE, ZeroExtend{PTO_XLEN}(key));39 otherwise =>40 return (FALSE, Zeros{PTO_XLEN});41 end;42end;43
444546pure func HardwareNumericFloatingMinMax(47 maximum: boolean,48 data_type: TileDataType,49 left: Word,50 right: Word) => (boolean, Word, boolean)51begin52 let (special, special_result, invalid) =53 HardwareNumericMinMaxSpecial(maximum, data_type, left, right);54 if special then55 return (TRUE, special_result, invalid);56 end;57
58 let (left_available, left_key) =59 HardwareNumericFloatingOrderKey(data_type, left);60 let (right_available, right_key) =61 HardwareNumericFloatingOrderKey(data_type, right);62 if !left_available || !right_available then63 return (FALSE, Zeros{PTO_XLEN}, FALSE);64 end;65
66 if maximum then67 if UInt(left_key) >= UInt(right_key) then68 return (TRUE, left, FALSE);69 else70 return (TRUE, right, FALSE);71 end;72 elsif UInt(left_key) <= UInt(right_key) then73 return (TRUE, left, FALSE);74 else75 return (TRUE, right, FALSE);76 end;77end;78