未验证 提交 a65ace76 编写于 作者: J Jérémie Chassaing 提交者: GitHub

Perf: Implement branchless compare (#13187)

* Perf: Implement branchless compare

* Use simple subtraction for compare where possible

* Fix typo in comments

* Fix comparison for int16

* Fix baseline tests

* Updated tests baselines + guide for TEST_UPDATE_BSL

* Updated GenericComparison baselines + DEVGUIDE

* Return -1/0/1 for compare

* Use cgt-clt for byteOrder

* Fix compare tests to reflect actual emitted code

* Constant optimizations for cgt/clt returning int value
Co-authored-by: NVlad Zarytovskii <vzaritovsky@hotmail.com>
Co-authored-by: NKevin Ransom (msft) <codecutter@hotmail.com>
上级 7b46dad6
......@@ -142,16 +142,35 @@ are updated using scripts or utilities that allow the following environment vari
Windows:
CMD:
```shell
set TEST_UPDATE_BSL=1
```
PowerShell:
```shell
$env:TEST_UPDATE_BSL=1
```
Linux/macOS:
```shell
export TEST_UPDATE_BSL=1
```
Next, run a build script build (debug or release, desktop or coreclr, depending which baselines you need to update), and test as described [above](#Testing-from-the-command-line). For example:
`./Build.cmd -c Release -testCoreClr` to update Release CoreCLR baselines.
or
`./Build.cmd -c Release -testDesktop` to update Release .NET Framework baselines.
> **Note**
> Please note, that by default, **Release** version of IL baseline baseline tests will be running in CI, so when updating baseline files, make sure to add `-c Release` flag to the build command.
## Automated Source Code Formatting
Some of the code in this repository is formatted automatically by [Fantomas](https://github.com/fsprojects/fantomas). To format all files use:
......
......@@ -882,7 +882,7 @@ let mkAssemblyCodeValueInfo g instrs argvals tys =
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 = a2)
| _ -> UnknownValue
| [ AI_clt ], [a;b], _ ->
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.bool_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkBoolVal g (a1 < a2)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 < a2)
......@@ -890,6 +890,54 @@ let mkAssemblyCodeValueInfo g instrs argvals tys =
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkBoolVal g (a1 < a2)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkBoolVal g (a1 < a2)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.int32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.uint32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.int16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.uint16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.sbyte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| _ -> UnknownValue
| [ AI_clt ], [a;b], [ty] when typeEquiv g ty g.byte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Bool a1, _), ConstValue(Const.Bool a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| _ -> UnknownValue
| [ AI_conv DT_U1 ], [a], [ty] when typeEquiv g ty g.byte_ty ->
match stripValue a with
......@@ -995,6 +1043,55 @@ let mkAssemblyCodeValueInfo g instrs argvals tys =
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 < a2)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 < a2)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.int32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt32Val g (if a1 < a2 then 1 else 0)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.uint32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt32Val g (if a1 < a2 then 1u else 0u)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.int16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt16Val g (if a1 < a2 then 1s else 0s)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.uint16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt16Val g (if a1 < a2 then 1us else 0us)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.sbyte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt8Val g (if a1 < a2 then 1y else 0y)
| _ -> UnknownValue
| [ AI_clt_un ], [a;b], [ty] when typeEquiv g ty g.byte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt8Val g (if a1 < a2 then 1uy else 0uy)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.bool_ty ->
match stripValue a, stripValue b with
......@@ -1003,6 +1100,48 @@ let mkAssemblyCodeValueInfo g instrs argvals tys =
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkBoolVal g (a1 > a2)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkBoolVal g (a1 > a2)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.int32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.uint32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.int16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.uint16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.sbyte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| _ -> UnknownValue
| [ AI_cgt ], [a;b], [ty] when typeEquiv g ty g.byte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.SByte a1, _), ConstValue(Const.SByte a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.Int16 a1, _), ConstValue(Const.Int16 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.Int32 a1, _), ConstValue(Const.Int32 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.Int64 a1, _), ConstValue(Const.Int64 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.bool_ty ->
match stripValue a, stripValue b with
......@@ -1012,6 +1151,55 @@ let mkAssemblyCodeValueInfo g instrs argvals tys =
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkBoolVal g (a1 > a2)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkBoolVal g (a1 > a2)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.int32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt32Val g (if a1 > a2 then 1 else 0)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.uint32_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt32Val g (if a1 > a2 then 1u else 0u)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.int16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt16Val g (if a1 > a2 then 1s else 0s)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.uint16_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt16Val g (if a1 > a2 then 1us else 0us)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.sbyte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkInt8Val g (if a1 > a2 then 1y else 0y)
| _ -> UnknownValue
| [ AI_cgt_un ], [a;b], [ty] when typeEquiv g ty g.byte_ty ->
match stripValue a, stripValue b with
| ConstValue(Const.Char a1, _), ConstValue(Const.Char a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.Byte a1, _), ConstValue(Const.Byte a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.UInt16 a1, _), ConstValue(Const.UInt16 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.UInt32 a1, _), ConstValue(Const.UInt32 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| ConstValue(Const.UInt64 a1, _), ConstValue(Const.UInt64 a2, _) -> mkUInt8Val g (if a1 > a2 then 1uy else 0uy)
| _ -> UnknownValue
| [ AI_shl ], [a;n], _ ->
match stripValue a, stripValue n with
......
......@@ -472,9 +472,9 @@ namespace Microsoft.FSharp.Core
let inline floatEq (x:float) (y:float) = (# "ceq" x y : bool #)
let inline float32Eq (x:float32) (y:float32) = (# "ceq" x y : bool #)
let inline charEq (x:char) (y:char) = (# "ceq" x y : bool #)
let inline intOrder (x:int) (y:int) = if (# "clt" x y : bool #) then (0-1) else (# "cgt" x y : int #)
let inline int64Order (x:int64) (y:int64) = if (# "clt" x y : bool #) then (0-1) else (# "cgt" x y : int #)
let inline byteOrder (x:byte) (y:byte) = if (# "clt" x y : bool #) then (0-1) else (# "cgt" x y : int #)
let inline intOrder (x:int) (y:int) = (# "cgt" x y : int #) - (# "clt" x y : int #)
let inline int64Order (x:int64) (y:int64) = (# "cgt" x y : int #) - (# "clt" x y : int #)
let inline byteOrder (x:byte) (y:byte) = (# "cgt" x y: int #) - (# "clt" x y: int #)
let inline byteEq (x:byte) (y:byte) = (# "ceq" x y : bool #)
let inline int64 (x:int) = (# "conv.i8" x : int64 #)
let inline int32 (x:int64) = (# "conv.i4" x : int32 #)
......@@ -914,10 +914,10 @@ namespace Microsoft.FSharp.Core
x.CompareTo(yobj)
| (:? nativeint as x),(:? nativeint as y) ->
if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
(# "cgt" x y : int #) - (# "clt" x y : int #)
| (:? unativeint as x),(:? unativeint as y) ->
if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
(# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
| _,(:? IStructuralComparable as yc) ->
let res = yc.CompareTo(xobj,comp)
......@@ -1059,17 +1059,25 @@ namespace Microsoft.FSharp.Core
//
let inline GenericComparisonWithComparerFast<'T> (comp:IComparer) (x:'T) (y:'T) : int =
GenericComparisonWithComparerIntrinsic comp x y
when 'T : bool = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : sbyte = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int16 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int32 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int64 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : nativeint = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : byte = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint16 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint32 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint64 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : unativeint = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : bool =
// bool is already 1 for True or 0 for False
// x - y gives:
// compare true false -> 1 - 0 -> 1
// compare false true -> 0 - 1 -> -1
// compare true true -> 1 - 1 -> 0
// compare false false -> 0 - 0 -> 0
(# "" x : int #) - (# "" y : int #)
when 'T : sbyte = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int16 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int32 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int64 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : nativeint = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : byte = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint16 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint32 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint64 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : unativeint = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
// Note, these bail out to GenericComparisonWithComparerIntrinsic if called with NaN values, because clt and cgt and ceq all return "false" for that case.
when 'T : float = if (# "clt" x y : bool #) then (-1)
elif (# "cgt" x y : bool #) then (1)
......@@ -1079,7 +1087,7 @@ namespace Microsoft.FSharp.Core
elif (# "cgt" x y : bool #) then (1)
elif (# "ceq" x y : bool #) then (0)
else GenericComparisonWithComparerIntrinsic comp x y
when 'T : char = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : char = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : string =
// NOTE: we don't have to null check here because System.String.CompareOrdinal
// gives reliable results on null values.
......@@ -1137,17 +1145,25 @@ namespace Microsoft.FSharp.Core
/// for known cases.
let inline GenericComparisonFast<'T> (x:'T) (y:'T) : int =
GenericComparisonIntrinsic x y
when 'T : bool = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : sbyte = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int16 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int32 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : int64 = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : nativeint = if (# "clt" x y : bool #) then (-1) else (# "cgt" x y : int #)
when 'T : byte = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint16 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint32 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : uint64 = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : unativeint = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : bool =
// bool is already 1 for True or 0 for False
// x - y gives:
// compare true false -> 1 - 0 -> 1
// compare false true -> 0 - 1 -> -1
// compare true true -> 1 - 1 -> 0
// compare false false -> 0 - 0 -> 0
(# "" x : int #) - (# "" y : int #)
when 'T : sbyte = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int16 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int32 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : int64 = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : nativeint = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : byte = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint16 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint32 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : uint64 = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : unativeint = (# "cgt.un" x y : int #) - (# "clt.un" x y : int #)
when 'T : float = if (# "clt" x y : bool #) then (-1)
elif (# "cgt" x y : bool #) then (1)
elif (# "ceq" x y : bool #) then (0)
......@@ -1158,7 +1174,7 @@ namespace Microsoft.FSharp.Core
elif (# "ceq" x y : bool #) then (0)
elif (# "ceq" y y : bool #) then (-1)
else (# "ceq" x x : int #)
when 'T : char = if (# "clt.un" x y : bool #) then (-1) else (# "cgt.un" x y : int #)
when 'T : char = (# "cgt" x y : int #) - (# "clt" x y : int #)
when 'T : string =
// NOTE: we don't have to null check here because System.String.CompareOrdinal
// gives reliable results on null values.
......@@ -4771,17 +4787,24 @@ namespace Microsoft.FSharp.Core
[<CompiledName("Compare")>]
let inline compare (e1: ^T) (e2: ^T) : int =
(if e1 < e2 then -1 elif e1 > e2 then 1 else 0)
when ^T : bool = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : sbyte = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : int16 = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : int32 = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : int64 = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : nativeint = if (# "clt" e1 e2 : bool #) then (-1) else (# "cgt" e1 e2 : int #)
when ^T : byte = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : uint16 = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : uint32 = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : uint64 = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : unativeint = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : bool =
// bool is already 1 for true or 0 for false
// e1 - e2 gives:
// compare true false -> 1 - 0 -> 1
// compare false true -> 0 - 1 -> -1
// compare true true -> 1 - 1 -> 0
// compare false false -> 0 - 0 -> 0
(# "" e1 : int #) - (# "" e2 : int #)
when ^T : sbyte = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : int16 = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : int32 = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : int64 = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : nativeint = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : byte = (# "cgt.un" e1 e2 : int #) - (# "clt.un" e1 e2 : int #)
when ^T : uint16 = (# "cgt.un" e1 e2 : int #) - (# "clt.un" e1 e2 : int #)
when ^T : uint32 = (# "cgt.un" e1 e2 : int #) - (# "clt.un" e1 e2 : int #)
when ^T : uint64 = (# "cgt.un" e1 e2 : int #) - (# "clt.un" e1 e2 : int #)
when ^T : unativeint = (# "cgt.un" e1 e2 : int #) - (# "clt.un" e1 e2 : int #)
when ^T : float = if (# "clt" e1 e2 : bool #) then (-1)
elif (# "cgt" e1 e2 : bool #) then (1)
elif (# "ceq" e1 e2 : bool #) then (0)
......@@ -4792,7 +4815,7 @@ namespace Microsoft.FSharp.Core
elif (# "ceq" e1 e2 : bool #) then (0)
elif (# "ceq" e2 e2 : bool #) then (-1)
else (# "ceq" e1 e1 : int #)
when ^T : char = if (# "clt.un" e1 e2 : bool #) then (-1) else (# "cgt.un" e1 e2 : int #)
when ^T : char = (# "cgt" e1 e2 : int #) - (# "clt" e1 e2 : int #)
when ^T : string =
// NOTE: we don't have to null check here because String.CompareOrdinal
// gives reliable results on null values.
......
......@@ -28,22 +28,22 @@
}
.mresource public FSharpSignatureData.Compare01
{
// Offset: 0x00000000 Length: 0x00000258
// Offset: 0x00000000 Length: 0x00000248
// WARNING: managed resource file FSharpSignatureData.Compare01 created
}
.mresource public FSharpOptimizationData.Compare01
{
// Offset: 0x00000260 Length: 0x000000B2
// Offset: 0x00000250 Length: 0x000000B2
// WARNING: managed resource file FSharpOptimizationData.Compare01 created
}
.module Compare01.exe
// MVID: {624F9D3B-7932-7F19-A745-03833B9D4F62}
// MVID: {629EFC18-7932-7F19-A745-038318FC9E62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03860000
// Image base: 0x006A0000
// =============== CLASS MEMBERS DECLARATION ===================
......@@ -58,42 +58,29 @@
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static void f4() cil managed
{
// Code size 36 (0x24)
// Code size 23 (0x17)
.maxstack 4
.locals init (int32 V_0,
int32 V_1,
int32 V_2)
int32 V_1)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br.s IL_001b
IL_0008: ldc.i4.1
IL_0009: ldc.i4.1
IL_000a: cgt
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brfalse.s IL_0014
IL_0010: ldloc.2
IL_0011: nop
IL_0012: br.s IL_0016
IL_0014: ldc.i4.m1
IL_0015: nop
IL_0016: stloc.0
IL_0017: ldloc.1
IL_0018: ldc.i4.1
IL_0019: add
IL_001a: stloc.1
IL_001b: ldloc.1
IL_001c: ldc.i4 0x989681
IL_0021: blt.s IL_0008
IL_0023: ret
IL_0006: br.s IL_000e
IL_0008: ldc.i4.m1
IL_0009: stloc.0
IL_000a: ldloc.1
IL_000b: ldc.i4.1
IL_000c: add
IL_000d: stloc.1
IL_000e: ldloc.1
IL_000f: ldc.i4 0x989681
IL_0014: blt.s IL_0008
IL_0016: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -117,4 +104,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare01_fsx\Compare01.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare01_fsx\Compare01.res
......@@ -4,10 +4,10 @@
// Metadata version: v4.0.30319
.assembly extern mscorlib
.assembly extern System.Runtime
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 6:0:0:0
}
.assembly extern FSharp.Core
{
......@@ -21,91 +21,66 @@
int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 )
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.mresource public FSharpSignatureData.Compare02
{
// Offset: 0x00000000 Length: 0x0000025F
// Offset: 0x00000000 Length: 0x0000024F
// WARNING: managed resource file FSharpSignatureData.Compare02 created
}
.mresource public FSharpOptimizationData.Compare02
{
// Offset: 0x00000268 Length: 0x000000B9
// Offset: 0x00000258 Length: 0x000000B9
// WARNING: managed resource file FSharpOptimizationData.Compare02 created
}
.module Compare02.exe
// MVID: {624F9D3B-7915-7F19-A745-03833B9D4F62}
// MVID: {629F023F-DFF8-1315-A745-03833F029F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03E40000
// Image base: 0x00000285F4090000
// =============== CLASS MEMBERS DECLARATION ===================
.class public abstract auto ansi sealed Compare02
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class abstract auto ansi sealed nested public CompareMicroPerfAndCodeGenerationTests
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static void f4_triple() cil managed
{
// Code size 48 (0x30)
// Code size 23 (0x17)
.maxstack 4
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3)
int32 V_1)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br.s IL_0027
IL_0008: ldc.i4.1
IL_0009: ldc.i4.1
IL_000a: cgt
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brfalse.s IL_0014
IL_0010: ldloc.2
IL_0011: nop
IL_0012: br.s IL_0022
IL_0014: ldc.i4.2
IL_0015: ldc.i4.2
IL_0016: cgt
IL_0018: stloc.3
IL_0019: ldloc.3
IL_001a: brfalse.s IL_0020
IL_001c: ldloc.3
IL_001d: nop
IL_001e: br.s IL_0022
IL_0020: ldc.i4.m1
IL_0021: nop
IL_0022: stloc.0
IL_0023: ldloc.1
IL_0024: ldc.i4.1
IL_0025: add
IL_0026: stloc.1
IL_0027: ldloc.1
IL_0028: ldc.i4 0x989681
IL_002d: blt.s IL_0008
IL_002f: ret
IL_0006: br.s IL_000e
IL_0008: ldc.i4.m1
IL_0009: stloc.0
IL_000a: ldloc.1
IL_000b: ldc.i4.1
IL_000c: add
IL_000d: stloc.1
IL_000e: ldloc.1
IL_000f: ldc.i4 0x989681
IL_0014: blt.s IL_0008
IL_0016: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4_triple
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -113,7 +88,7 @@
} // end of class Compare02
.class private abstract auto ansi sealed '<StartupCode$Compare02>'.$Compare02$fsx
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.method public static void main@() cil managed
{
......@@ -129,4 +104,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare02_fsx\Compare02.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Compare02_fsx\Compare02.res
......@@ -33,22 +33,22 @@
}
.mresource public FSharpSignatureData.Compare03
{
// Offset: 0x00000000 Length: 0x0000026A
// Offset: 0x00000000 Length: 0x0000025A
// WARNING: managed resource file FSharpSignatureData.Compare03 created
}
.mresource public FSharpOptimizationData.Compare03
{
// Offset: 0x00000270 Length: 0x000000B9
// Offset: 0x00000260 Length: 0x000000B9
// WARNING: managed resource file FSharpOptimizationData.Compare03 created
}
.module Compare03.exe
// MVID: {624F9E44-79F4-7F19-A745-0383449E4F62}
// MVID: {629F0A77-79F4-7F19-A745-0383770A9F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03180000
// Image base: 0x03150000
// =============== CLASS MEMBERS DECLARATION ===================
......@@ -63,70 +63,33 @@
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static int32 f4_tuple4() cil managed
{
// Code size 78 (0x4e)
// Code size 38 (0x26)
.maxstack 4
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3,
int32 V_4)
int32 V_1)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br.s IL_0044
IL_0008: ldc.i4.1
IL_0009: ldc.i4.1
IL_000a: cgt
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brfalse.s IL_0014
IL_0010: ldloc.2
IL_0011: nop
IL_0012: br.s IL_003f
IL_0014: ldc.i4.2
IL_0015: ldc.i4.2
IL_0016: cgt
IL_0018: stloc.3
IL_0019: ldloc.3
IL_001a: brfalse.s IL_0020
IL_001c: ldloc.3
IL_001d: nop
IL_001e: br.s IL_003f
IL_0020: ldc.i4.4
IL_0021: ldc.i4.4
IL_0022: cgt
IL_0024: stloc.s V_4
IL_0026: ldloc.s V_4
IL_0028: brfalse.s IL_002f
IL_002a: ldloc.s V_4
IL_002c: nop
IL_002d: br.s IL_003f
IL_002f: ldstr "five"
IL_0034: ldstr "5"
IL_0039: call int32 [netstandard]System.String::CompareOrdinal(string,
IL_0006: br.s IL_001c
IL_0008: ldstr "five"
IL_000d: ldstr "5"
IL_0012: call int32 [netstandard]System.String::CompareOrdinal(string,
string)
IL_003e: nop
IL_003f: stloc.0
IL_0040: ldloc.1
IL_0041: ldc.i4.1
IL_0042: add
IL_0043: stloc.1
IL_0044: ldloc.1
IL_0045: ldc.i4 0x989681
IL_004a: blt.s IL_0008
IL_004c: ldloc.0
IL_004d: ret
IL_0017: stloc.0
IL_0018: ldloc.1
IL_0019: ldc.i4.1
IL_001a: add
IL_001b: stloc.1
IL_001c: ldloc.1
IL_001d: ldc.i4 0x989681
IL_0022: blt.s IL_0008
IL_0024: ldloc.0
IL_0025: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4_tuple4
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -150,4 +113,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare03_fsx\Compare03.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare03_fsx\Compare03.res
......@@ -33,22 +33,22 @@
}
.mresource public FSharpSignatureData.Compare03
{
// Offset: 0x00000000 Length: 0x0000026A
// Offset: 0x00000000 Length: 0x0000025A
// WARNING: managed resource file FSharpSignatureData.Compare03 created
}
.mresource public FSharpOptimizationData.Compare03
{
// Offset: 0x00000270 Length: 0x000000B9
// Offset: 0x00000260 Length: 0x000000B9
// WARNING: managed resource file FSharpOptimizationData.Compare03 created
}
.module Compare03.exe
// MVID: {624F9DB5-C542-34BD-A745-0383B59D4F62}
// MVID: {629F023F-32CA-B31A-A745-03833F029F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x000001540B310000
// Image base: 0x000002145FFA0000
// =============== CLASS MEMBERS DECLARATION ===================
......@@ -63,70 +63,33 @@
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static int32 f4_tuple4() cil managed
{
// Code size 78 (0x4e)
// Code size 38 (0x26)
.maxstack 4
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3,
int32 V_4)
int32 V_1)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br.s IL_0044
IL_0008: ldc.i4.1
IL_0009: ldc.i4.1
IL_000a: cgt
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brfalse.s IL_0014
IL_0010: ldloc.2
IL_0011: nop
IL_0012: br.s IL_003f
IL_0014: ldc.i4.2
IL_0015: ldc.i4.2
IL_0016: cgt
IL_0018: stloc.3
IL_0019: ldloc.3
IL_001a: brfalse.s IL_0020
IL_001c: ldloc.3
IL_001d: nop
IL_001e: br.s IL_003f
IL_0020: ldc.i4.4
IL_0021: ldc.i4.4
IL_0022: cgt
IL_0024: stloc.s V_4
IL_0026: ldloc.s V_4
IL_0028: brfalse.s IL_002f
IL_002a: ldloc.s V_4
IL_002c: nop
IL_002d: br.s IL_003f
IL_002f: ldstr "five"
IL_0034: ldstr "5"
IL_0039: call int32 [netstandard]System.String::CompareOrdinal(string,
IL_0006: br.s IL_001c
IL_0008: ldstr "five"
IL_000d: ldstr "5"
IL_0012: call int32 [netstandard]System.String::CompareOrdinal(string,
string)
IL_003e: nop
IL_003f: stloc.0
IL_0040: ldloc.1
IL_0041: ldc.i4.1
IL_0042: add
IL_0043: stloc.1
IL_0044: ldloc.1
IL_0045: ldc.i4 0x989681
IL_004a: blt.s IL_0008
IL_004c: ldloc.0
IL_004d: ret
IL_0017: stloc.0
IL_0018: ldloc.1
IL_0019: ldc.i4.1
IL_001a: add
IL_001b: stloc.1
IL_001c: ldloc.1
IL_001d: ldc.i4 0x989681
IL_0022: blt.s IL_0008
IL_0024: ldloc.0
IL_0025: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4_tuple4
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -150,4 +113,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Compare03_fsx\Compare03.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Compare03_fsx\Compare03.res
......@@ -33,22 +33,22 @@
}
.mresource public FSharpSignatureData.Compare04
{
// Offset: 0x00000000 Length: 0x0000026E
// Offset: 0x00000000 Length: 0x0000025A
// WARNING: managed resource file FSharpSignatureData.Compare04 created
}
.mresource public FSharpOptimizationData.Compare04
{
// Offset: 0x00000278 Length: 0x000000B9
// Offset: 0x00000260 Length: 0x000000B9
// WARNING: managed resource file FSharpOptimizationData.Compare04 created
}
.module Compare04.exe
// MVID: {624FC1D8-79CF-7F19-A745-0383D8C14F62}
// MVID: {629F0A77-79CF-7F19-A745-0383770A9F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03B30000
// Image base: 0x029E0000
// =============== CLASS MEMBERS DECLARATION ===================
......@@ -63,112 +63,76 @@
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static int32 f4_tuple5() cil managed
{
// Code size 210 (0xd2)
// Code size 159 (0x9f)
.maxstack 5
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3,
int32 V_4,
int32 V_5)
int32 V_2)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br IL_00c5
IL_000b: ldc.i4.1
IL_000c: ldc.i4.1
IL_000d: cgt
IL_000f: stloc.2
IL_0010: ldloc.2
IL_0011: brfalse.s IL_001a
IL_0013: ldloc.2
IL_0014: nop
IL_0015: br IL_00c0
IL_001a: ldc.i4.2
IL_001b: ldc.i4.2
IL_001c: cgt
IL_001e: stloc.3
IL_001f: ldloc.3
IL_0020: brfalse.s IL_0029
IL_0022: ldloc.3
IL_0023: nop
IL_0024: br IL_00c0
IL_0029: ldc.i4.4
IL_002a: ldc.i4.4
IL_002b: cgt
IL_002d: stloc.s V_4
IL_002f: ldloc.s V_4
IL_0031: brfalse.s IL_003b
IL_0033: ldloc.s V_4
IL_0035: nop
IL_0036: br IL_00c0
IL_003b: ldstr "5"
IL_0040: ldstr "5"
IL_0045: call int32 [netstandard]System.String::CompareOrdinal(string,
IL_0006: br IL_0092
IL_000b: ldstr "5"
IL_0010: ldstr "5"
IL_0015: call int32 [netstandard]System.String::CompareOrdinal(string,
string)
IL_004a: stloc.s V_5
IL_004c: ldloc.s V_5
IL_004e: brfalse.s IL_0055
IL_0050: ldloc.s V_5
IL_0052: nop
IL_0053: br.s IL_00c0
IL_0055: ldc.r8 6.0999999999999996
IL_005e: ldc.r8 7.0999999999999996
IL_0067: clt
IL_0069: brfalse.s IL_006f
IL_006b: ldc.i4.m1
IL_006c: nop
IL_006d: br.s IL_00c0
IL_006f: ldc.r8 6.0999999999999996
IL_0078: ldc.r8 7.0999999999999996
IL_0081: cgt
IL_0083: brfalse.s IL_0089
IL_0085: ldc.i4.1
IL_0086: nop
IL_0087: br.s IL_00c0
IL_0089: ldc.r8 6.0999999999999996
IL_0092: ldc.r8 7.0999999999999996
IL_009b: ceq
IL_009d: brfalse.s IL_00a3
IL_009f: ldc.i4.0
IL_00a0: nop
IL_00a1: br.s IL_00c0
IL_00a3: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_00a8: ldc.r8 6.0999999999999996
IL_00b1: ldc.r8 7.0999999999999996
IL_00ba: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonWithComparerIntrinsic<float64>(class [mscorlib]System.Collections.IComparer,
IL_001a: stloc.2
IL_001b: ldloc.2
IL_001c: brfalse.s IL_0022
IL_001e: ldloc.2
IL_001f: nop
IL_0020: br.s IL_008d
IL_0022: ldc.r8 6.0999999999999996
IL_002b: ldc.r8 7.0999999999999996
IL_0034: clt
IL_0036: brfalse.s IL_003c
IL_0038: ldc.i4.m1
IL_0039: nop
IL_003a: br.s IL_008d
IL_003c: ldc.r8 6.0999999999999996
IL_0045: ldc.r8 7.0999999999999996
IL_004e: cgt
IL_0050: brfalse.s IL_0056
IL_0052: ldc.i4.1
IL_0053: nop
IL_0054: br.s IL_008d
IL_0056: ldc.r8 6.0999999999999996
IL_005f: ldc.r8 7.0999999999999996
IL_0068: ceq
IL_006a: brfalse.s IL_0070
IL_006c: ldc.i4.0
IL_006d: nop
IL_006e: br.s IL_008d
IL_0070: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0075: ldc.r8 6.0999999999999996
IL_007e: ldc.r8 7.0999999999999996
IL_0087: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonWithComparerIntrinsic<float64>(class [mscorlib]System.Collections.IComparer,
!!0,
!!0)
IL_00bf: nop
IL_00c0: stloc.0
IL_00c1: ldloc.1
IL_00c2: ldc.i4.1
IL_00c3: add
IL_00c4: stloc.1
IL_00c5: ldloc.1
IL_00c6: ldc.i4 0x989681
IL_00cb: blt IL_000b
IL_00d0: ldloc.0
IL_00d1: ret
IL_008c: nop
IL_008d: stloc.0
IL_008e: ldloc.1
IL_008f: ldc.i4.1
IL_0090: add
IL_0091: stloc.1
IL_0092: ldloc.1
IL_0093: ldc.i4 0x989681
IL_0098: blt IL_000b
IL_009d: ldloc.0
IL_009e: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4_tuple5
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -192,4 +156,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file C:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Release\net472\tests\EmittedIL\GenericComparison\Compare04_fsx\Compare04.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare04_fsx\Compare04.res
......@@ -33,22 +33,22 @@
}
.mresource public FSharpSignatureData.Compare04
{
// Offset: 0x00000000 Length: 0x0000026E
// Offset: 0x00000000 Length: 0x0000025A
// WARNING: managed resource file FSharpSignatureData.Compare04 created
}
.mresource public FSharpOptimizationData.Compare04
{
// Offset: 0x00000278 Length: 0x000000B9
// Offset: 0x00000260 Length: 0x000000B9
// WARNING: managed resource file FSharpOptimizationData.Compare04 created
}
.module Compare04.exe
// MVID: {624FC26D-B3E3-57E7-A745-03836DC24F62}
// MVID: {629F023F-7AE0-AE2A-A745-03833F029F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x000001F437780000
// Image base: 0x000001BE779D0000
// =============== CLASS MEMBERS DECLARATION ===================
......@@ -63,112 +63,76 @@
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.method public static int32 f4_tuple5() cil managed
{
// Code size 210 (0xd2)
// Code size 159 (0x9f)
.maxstack 5
.locals init (int32 V_0,
int32 V_1,
int32 V_2,
int32 V_3,
int32 V_4,
int32 V_5)
int32 V_2)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: nop
IL_0003: nop
IL_0004: ldc.i4.0
IL_0005: stloc.1
IL_0006: br IL_00c5
IL_000b: ldc.i4.1
IL_000c: ldc.i4.1
IL_000d: cgt
IL_000f: stloc.2
IL_0010: ldloc.2
IL_0011: brfalse.s IL_001a
IL_0013: ldloc.2
IL_0014: nop
IL_0015: br IL_00c0
IL_001a: ldc.i4.2
IL_001b: ldc.i4.2
IL_001c: cgt
IL_001e: stloc.3
IL_001f: ldloc.3
IL_0020: brfalse.s IL_0029
IL_0022: ldloc.3
IL_0023: nop
IL_0024: br IL_00c0
IL_0029: ldc.i4.4
IL_002a: ldc.i4.4
IL_002b: cgt
IL_002d: stloc.s V_4
IL_002f: ldloc.s V_4
IL_0031: brfalse.s IL_003b
IL_0033: ldloc.s V_4
IL_0035: nop
IL_0036: br IL_00c0
IL_003b: ldstr "5"
IL_0040: ldstr "5"
IL_0045: call int32 [netstandard]System.String::CompareOrdinal(string,
IL_0006: br IL_0092
IL_000b: ldstr "5"
IL_0010: ldstr "5"
IL_0015: call int32 [netstandard]System.String::CompareOrdinal(string,
string)
IL_004a: stloc.s V_5
IL_004c: ldloc.s V_5
IL_004e: brfalse.s IL_0055
IL_0050: ldloc.s V_5
IL_0052: nop
IL_0053: br.s IL_00c0
IL_0055: ldc.r8 6.0999999999999996
IL_005e: ldc.r8 7.0999999999999996
IL_0067: clt
IL_0069: brfalse.s IL_006f
IL_006b: ldc.i4.m1
IL_006c: nop
IL_006d: br.s IL_00c0
IL_006f: ldc.r8 6.0999999999999996
IL_0078: ldc.r8 7.0999999999999996
IL_0081: cgt
IL_0083: brfalse.s IL_0089
IL_0085: ldc.i4.1
IL_0086: nop
IL_0087: br.s IL_00c0
IL_0089: ldc.r8 6.0999999999999996
IL_0092: ldc.r8 7.0999999999999996
IL_009b: ceq
IL_009d: brfalse.s IL_00a3
IL_009f: ldc.i4.0
IL_00a0: nop
IL_00a1: br.s IL_00c0
IL_00a3: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_00a8: ldc.r8 6.0999999999999996
IL_00b1: ldc.r8 7.0999999999999996
IL_00ba: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonWithComparerIntrinsic<float64>(class [System.Runtime]System.Collections.IComparer,
IL_001a: stloc.2
IL_001b: ldloc.2
IL_001c: brfalse.s IL_0022
IL_001e: ldloc.2
IL_001f: nop
IL_0020: br.s IL_008d
IL_0022: ldc.r8 6.0999999999999996
IL_002b: ldc.r8 7.0999999999999996
IL_0034: clt
IL_0036: brfalse.s IL_003c
IL_0038: ldc.i4.m1
IL_0039: nop
IL_003a: br.s IL_008d
IL_003c: ldc.r8 6.0999999999999996
IL_0045: ldc.r8 7.0999999999999996
IL_004e: cgt
IL_0050: brfalse.s IL_0056
IL_0052: ldc.i4.1
IL_0053: nop
IL_0054: br.s IL_008d
IL_0056: ldc.r8 6.0999999999999996
IL_005f: ldc.r8 7.0999999999999996
IL_0068: ceq
IL_006a: brfalse.s IL_0070
IL_006c: ldc.i4.0
IL_006d: nop
IL_006e: br.s IL_008d
IL_0070: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0075: ldc.r8 6.0999999999999996
IL_007e: ldc.r8 7.0999999999999996
IL_0087: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonWithComparerIntrinsic<float64>(class [System.Runtime]System.Collections.IComparer,
!!0,
!!0)
IL_00bf: nop
IL_00c0: stloc.0
IL_00c1: ldloc.1
IL_00c2: ldc.i4.1
IL_00c3: add
IL_00c4: stloc.1
IL_00c5: ldloc.1
IL_00c6: ldc.i4 0x989681
IL_00cb: blt IL_000b
IL_00d0: ldloc.0
IL_00d1: ret
IL_008c: nop
IL_008d: stloc.0
IL_008e: ldloc.1
IL_008f: ldc.i4.1
IL_0090: add
IL_0091: stloc.1
IL_0092: ldloc.1
IL_0093: ldc.i4 0x989681
IL_0098: blt IL_000b
IL_009d: ldloc.0
IL_009e: ret
} // end of method CompareMicroPerfAndCodeGenerationTests::f4_tuple5
} // end of class CompareMicroPerfAndCodeGenerationTests
......@@ -192,4 +156,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file C:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Release\net6.0\tests\EmittedIL\GenericComparison\Compare04_fsx\Compare04.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Compare04_fsx\Compare04.res
......@@ -4,10 +4,10 @@
// Metadata version: v4.0.30319
.assembly extern mscorlib
.assembly extern System.Runtime
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 6:0:0:0
}
.assembly extern FSharp.Core
{
......@@ -21,54 +21,54 @@
int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 )
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.mresource public FSharpSignatureData.Compare06
{
// Offset: 0x00000000 Length: 0x00000706
// Offset: 0x00000000 Length: 0x000006FC
// WARNING: managed resource file FSharpSignatureData.Compare06 created
}
.mresource public FSharpOptimizationData.Compare06
{
// Offset: 0x00000710 Length: 0x000003BC
// Offset: 0x00000700 Length: 0x000003C8
// WARNING: managed resource file FSharpOptimizationData.Compare06 created
}
.module Compare06.exe
// MVID: {624F9D3B-7991-7F19-A745-03833B9D4F62}
// MVID: {628F4C90-FEB0-939C-A745-0383904C8F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03080000
// Image base: 0x000001E44D5F0000
// =============== CLASS MEMBERS DECLARATION ===================
.class public abstract auto ansi sealed Compare06
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class abstract auto ansi sealed nested public CompareMicroPerfAndCodeGenerationTests
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class auto ansi serializable sealed nested public KeyR
extends [mscorlib]System.Object
implements class [mscorlib]System.IEquatable`1<class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR>,
[mscorlib]System.Collections.IStructuralEquatable,
class [mscorlib]System.IComparable`1<class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR>,
[mscorlib]System.IComparable,
[mscorlib]System.Collections.IStructuralComparable
extends [System.Runtime]System.Object
implements class [System.Runtime]System.IEquatable`1<class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR>,
[System.Runtime]System.Collections.IStructuralEquatable,
class [System.Runtime]System.IComparable`1<class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR>,
[System.Runtime]System.IComparable,
[System.Runtime]System.Collections.IStructuralComparable
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 02 00 00 00 00 00 )
.field assembly int32 key1@
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.field assembly int32 key2@
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.method public hidebysig specialname
instance int32 get_key1() cil managed
{
......@@ -96,7 +96,7 @@
// Code size 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -109,7 +109,7 @@
.method public strict virtual instance string
ToString() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 22 (0x16)
.maxstack 8
IL_0000: ldstr "%+A"
......@@ -123,20 +123,20 @@
.method public hidebysig virtual final
instance int32 CompareTo(class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 92 (0x5c)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 87 (0x57)
.maxstack 5
.locals init (int32 V_0,
class [mscorlib]System.Collections.IComparer V_1,
class [System.Runtime]System.Collections.IComparer V_1,
int32 V_2,
int32 V_3)
IL_0000: ldarg.0
IL_0001: brfalse.s IL_0055
IL_0001: brfalse.s IL_0050
IL_0003: ldarg.1
IL_0004: brfalse.s IL_0053
IL_0004: brfalse.s IL_004e
IL_0006: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0006: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_000b: stloc.1
IL_000c: ldarg.0
IL_000d: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -146,68 +146,60 @@
IL_0019: stloc.3
IL_001a: ldloc.2
IL_001b: ldloc.3
IL_001c: bge.s IL_0022
IL_001e: ldc.i4.m1
IL_001f: nop
IL_0020: br.s IL_0027
IL_001c: cgt
IL_001e: ldloc.2
IL_001f: ldloc.3
IL_0020: clt
IL_0022: sub
IL_0023: stloc.0
IL_0024: ldloc.0
IL_0025: ldc.i4.0
IL_0026: bge.s IL_002a
IL_0022: ldloc.2
IL_0023: ldloc.3
IL_0024: cgt
IL_0026: nop
IL_0027: stloc.0
IL_0028: ldloc.0
IL_0029: ldc.i4.0
IL_002a: bge.s IL_002e
IL_0029: ret
IL_002c: ldloc.0
IL_002d: ret
IL_002a: ldloc.0
IL_002b: ldc.i4.0
IL_002c: ble.s IL_0030
IL_002e: ldloc.0
IL_002f: ldc.i4.0
IL_0030: ble.s IL_0034
IL_0032: ldloc.0
IL_0033: ret
IL_0034: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0039: stloc.1
IL_003a: ldarg.0
IL_003b: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0040: stloc.2
IL_0041: ldarg.1
IL_0042: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0047: stloc.3
IL_002f: ret
IL_0030: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0035: stloc.1
IL_0036: ldarg.0
IL_0037: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_003c: stloc.2
IL_003d: ldarg.1
IL_003e: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0043: stloc.3
IL_0044: ldloc.2
IL_0045: ldloc.3
IL_0046: cgt
IL_0048: ldloc.2
IL_0049: ldloc.3
IL_004a: bge.s IL_004e
IL_004c: ldc.i4.m1
IL_004a: clt
IL_004c: sub
IL_004d: ret
IL_004e: ldloc.2
IL_004f: ldloc.3
IL_0050: cgt
IL_0052: ret
IL_0053: ldc.i4.1
IL_0054: ret
IL_004e: ldc.i4.1
IL_004f: ret
IL_0055: ldarg.1
IL_0056: brfalse.s IL_005a
IL_0050: ldarg.1
IL_0051: brfalse.s IL_0055
IL_0058: ldc.i4.m1
IL_0059: ret
IL_0053: ldc.i4.m1
IL_0054: ret
IL_005a: ldc.i4.0
IL_005b: ret
IL_0055: ldc.i4.0
IL_0056: ret
} // end of method KeyR::CompareTo
.method public hidebysig virtual final
instance int32 CompareTo(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
......@@ -219,11 +211,11 @@
.method public hidebysig virtual final
instance int32 CompareTo(object obj,
class [mscorlib]System.Collections.IComparer comp) cil managed
class [System.Runtime]System.Collections.IComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 97 (0x61)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 92 (0x5c)
.maxstack 5
.locals init (class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR V_0,
int32 V_1,
int32 V_2,
......@@ -232,11 +224,11 @@
IL_0001: unbox.any Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR
IL_0006: stloc.0
IL_0007: ldarg.0
IL_0008: brfalse.s IL_0055
IL_0008: brfalse.s IL_0050
IL_000a: ldarg.1
IL_000b: unbox.any Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR
IL_0010: brfalse.s IL_0053
IL_0010: brfalse.s IL_004e
IL_0012: ldarg.0
IL_0013: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -246,67 +238,59 @@
IL_001f: stloc.3
IL_0020: ldloc.2
IL_0021: ldloc.3
IL_0022: bge.s IL_0028
IL_0024: ldc.i4.m1
IL_0025: nop
IL_0026: br.s IL_002d
IL_0022: cgt
IL_0024: ldloc.2
IL_0025: ldloc.3
IL_0026: clt
IL_0028: sub
IL_0029: stloc.1
IL_002a: ldloc.1
IL_002b: ldc.i4.0
IL_002c: bge.s IL_0030
IL_0028: ldloc.2
IL_0029: ldloc.3
IL_002a: cgt
IL_002c: nop
IL_002d: stloc.1
IL_002e: ldloc.1
IL_002f: ldc.i4.0
IL_0030: bge.s IL_0034
IL_002f: ret
IL_0032: ldloc.1
IL_0033: ret
IL_0030: ldloc.1
IL_0031: ldc.i4.0
IL_0032: ble.s IL_0036
IL_0034: ldloc.1
IL_0035: ldc.i4.0
IL_0036: ble.s IL_003a
IL_0038: ldloc.1
IL_0039: ret
IL_003a: ldarg.0
IL_003b: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0040: stloc.2
IL_0041: ldloc.0
IL_0042: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0047: stloc.3
IL_0035: ret
IL_0036: ldarg.0
IL_0037: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_003c: stloc.2
IL_003d: ldloc.0
IL_003e: ldfld int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0043: stloc.3
IL_0044: ldloc.2
IL_0045: ldloc.3
IL_0046: cgt
IL_0048: ldloc.2
IL_0049: ldloc.3
IL_004a: bge.s IL_004e
IL_004c: ldc.i4.m1
IL_004a: clt
IL_004c: sub
IL_004d: ret
IL_004e: ldloc.2
IL_004f: ldloc.3
IL_0050: cgt
IL_0052: ret
IL_0053: ldc.i4.1
IL_0054: ret
IL_004e: ldc.i4.1
IL_004f: ret
IL_0055: ldarg.1
IL_0056: unbox.any Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR
IL_005b: brfalse.s IL_005f
IL_0050: ldarg.1
IL_0051: unbox.any Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR
IL_0056: brfalse.s IL_005a
IL_005d: ldc.i4.m1
IL_005e: ret
IL_0058: ldc.i4.m1
IL_0059: ret
IL_005f: ldc.i4.0
IL_0060: ret
IL_005a: ldc.i4.0
IL_005b: ret
} // end of method KeyR::CompareTo
.method public hidebysig virtual final
instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
instance int32 GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 51 (0x33)
.maxstack 7
.locals init (int32 V_0)
......@@ -351,20 +335,20 @@
.method public hidebysig virtual final
instance int32 GetHashCode() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: callvirt instance int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer)
IL_0001: call class [System.Runtime]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: callvirt instance int32 Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR::GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer)
IL_000b: ret
} // end of method KeyR::GetHashCode
.method public hidebysig virtual final
instance bool Equals(object obj,
class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 54 (0x36)
.maxstack 4
.locals init (class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR V_0)
......@@ -407,7 +391,7 @@
.method public hidebysig virtual final
instance bool Equals(class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 47 (0x2f)
.maxstack 8
IL_0000: ldarg.0
......@@ -446,7 +430,7 @@
.method public hidebysig virtual final
instance bool Equals(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 20 (0x14)
.maxstack 4
.locals init (class Compare06/CompareMicroPerfAndCodeGenerationTests/KeyR V_0)
......@@ -523,7 +507,7 @@
} // end of class Compare06
.class private abstract auto ansi sealed '<StartupCode$Compare06>'.$Compare06$fsx
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.method public static void main@() cil managed
{
......@@ -539,4 +523,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Compare06_fsx\Compare06.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Compare06_fsx\Compare06.res
......@@ -4,10 +4,10 @@
// Metadata version: v4.0.30319
.assembly extern mscorlib
.assembly extern System.Runtime
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 6:0:0:0
}
.assembly extern FSharp.Core
{
......@@ -21,54 +21,54 @@
int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 )
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.mresource public FSharpSignatureData.Equals05
{
// Offset: 0x00000000 Length: 0x00000701
// Offset: 0x00000000 Length: 0x000006F7
// WARNING: managed resource file FSharpSignatureData.Equals05 created
}
.mresource public FSharpOptimizationData.Equals05
{
// Offset: 0x00000708 Length: 0x000003B9
// Offset: 0x00000700 Length: 0x000003C5
// WARNING: managed resource file FSharpOptimizationData.Equals05 created
}
.module Equals05.exe
// MVID: {624F9D3B-EB3D-46ED-A745-03833B9D4F62}
// MVID: {628F4C90-28FA-85D1-A745-0383904C8F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03C00000
// Image base: 0x000001B974410000
// =============== CLASS MEMBERS DECLARATION ===================
.class public abstract auto ansi sealed Equals05
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class abstract auto ansi sealed nested public EqualsMicroPerfAndCodeGenerationTests
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class auto ansi serializable sealed nested public KeyR
extends [mscorlib]System.Object
implements class [mscorlib]System.IEquatable`1<class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR>,
[mscorlib]System.Collections.IStructuralEquatable,
class [mscorlib]System.IComparable`1<class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR>,
[mscorlib]System.IComparable,
[mscorlib]System.Collections.IStructuralComparable
extends [System.Runtime]System.Object
implements class [System.Runtime]System.IEquatable`1<class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR>,
[System.Runtime]System.Collections.IStructuralEquatable,
class [System.Runtime]System.IComparable`1<class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR>,
[System.Runtime]System.IComparable,
[System.Runtime]System.Collections.IStructuralComparable
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 02 00 00 00 00 00 )
.field assembly int32 key1@
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.field assembly int32 key2@
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
.method public hidebysig specialname
instance int32 get_key1() cil managed
{
......@@ -96,7 +96,7 @@
// Code size 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -109,7 +109,7 @@
.method public strict virtual instance string
ToString() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 22 (0x16)
.maxstack 8
IL_0000: ldstr "%+A"
......@@ -123,20 +123,20 @@
.method public hidebysig virtual final
instance int32 CompareTo(class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 92 (0x5c)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 87 (0x57)
.maxstack 5
.locals init (int32 V_0,
class [mscorlib]System.Collections.IComparer V_1,
class [System.Runtime]System.Collections.IComparer V_1,
int32 V_2,
int32 V_3)
IL_0000: ldarg.0
IL_0001: brfalse.s IL_0055
IL_0001: brfalse.s IL_0050
IL_0003: ldarg.1
IL_0004: brfalse.s IL_0053
IL_0004: brfalse.s IL_004e
IL_0006: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0006: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_000b: stloc.1
IL_000c: ldarg.0
IL_000d: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -146,68 +146,60 @@
IL_0019: stloc.3
IL_001a: ldloc.2
IL_001b: ldloc.3
IL_001c: bge.s IL_0022
IL_001e: ldc.i4.m1
IL_001f: nop
IL_0020: br.s IL_0027
IL_001c: cgt
IL_001e: ldloc.2
IL_001f: ldloc.3
IL_0020: clt
IL_0022: sub
IL_0023: stloc.0
IL_0024: ldloc.0
IL_0025: ldc.i4.0
IL_0026: bge.s IL_002a
IL_0022: ldloc.2
IL_0023: ldloc.3
IL_0024: cgt
IL_0026: nop
IL_0027: stloc.0
IL_0028: ldloc.0
IL_0029: ldc.i4.0
IL_002a: bge.s IL_002e
IL_0029: ret
IL_002c: ldloc.0
IL_002d: ret
IL_002a: ldloc.0
IL_002b: ldc.i4.0
IL_002c: ble.s IL_0030
IL_002e: ldloc.0
IL_002f: ldc.i4.0
IL_0030: ble.s IL_0034
IL_0032: ldloc.0
IL_0033: ret
IL_0034: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0039: stloc.1
IL_003a: ldarg.0
IL_003b: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0040: stloc.2
IL_0041: ldarg.1
IL_0042: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0047: stloc.3
IL_002f: ret
IL_0030: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0035: stloc.1
IL_0036: ldarg.0
IL_0037: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_003c: stloc.2
IL_003d: ldarg.1
IL_003e: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0043: stloc.3
IL_0044: ldloc.2
IL_0045: ldloc.3
IL_0046: cgt
IL_0048: ldloc.2
IL_0049: ldloc.3
IL_004a: bge.s IL_004e
IL_004c: ldc.i4.m1
IL_004a: clt
IL_004c: sub
IL_004d: ret
IL_004e: ldloc.2
IL_004f: ldloc.3
IL_0050: cgt
IL_0052: ret
IL_0053: ldc.i4.1
IL_0054: ret
IL_004e: ldc.i4.1
IL_004f: ret
IL_0055: ldarg.1
IL_0056: brfalse.s IL_005a
IL_0050: ldarg.1
IL_0051: brfalse.s IL_0055
IL_0058: ldc.i4.m1
IL_0059: ret
IL_0053: ldc.i4.m1
IL_0054: ret
IL_005a: ldc.i4.0
IL_005b: ret
IL_0055: ldc.i4.0
IL_0056: ret
} // end of method KeyR::CompareTo
.method public hidebysig virtual final
instance int32 CompareTo(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
......@@ -219,11 +211,11 @@
.method public hidebysig virtual final
instance int32 CompareTo(object obj,
class [mscorlib]System.Collections.IComparer comp) cil managed
class [System.Runtime]System.Collections.IComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 97 (0x61)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 92 (0x5c)
.maxstack 5
.locals init (class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR V_0,
int32 V_1,
int32 V_2,
......@@ -232,11 +224,11 @@
IL_0001: unbox.any Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR
IL_0006: stloc.0
IL_0007: ldarg.0
IL_0008: brfalse.s IL_0055
IL_0008: brfalse.s IL_0050
IL_000a: ldarg.1
IL_000b: unbox.any Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR
IL_0010: brfalse.s IL_0053
IL_0010: brfalse.s IL_004e
IL_0012: ldarg.0
IL_0013: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key1@
......@@ -246,67 +238,59 @@
IL_001f: stloc.3
IL_0020: ldloc.2
IL_0021: ldloc.3
IL_0022: bge.s IL_0028
IL_0024: ldc.i4.m1
IL_0025: nop
IL_0026: br.s IL_002d
IL_0022: cgt
IL_0024: ldloc.2
IL_0025: ldloc.3
IL_0026: clt
IL_0028: sub
IL_0029: stloc.1
IL_002a: ldloc.1
IL_002b: ldc.i4.0
IL_002c: bge.s IL_0030
IL_0028: ldloc.2
IL_0029: ldloc.3
IL_002a: cgt
IL_002c: nop
IL_002d: stloc.1
IL_002e: ldloc.1
IL_002f: ldc.i4.0
IL_0030: bge.s IL_0034
IL_002f: ret
IL_0032: ldloc.1
IL_0033: ret
IL_0030: ldloc.1
IL_0031: ldc.i4.0
IL_0032: ble.s IL_0036
IL_0034: ldloc.1
IL_0035: ldc.i4.0
IL_0036: ble.s IL_003a
IL_0038: ldloc.1
IL_0039: ret
IL_003a: ldarg.0
IL_003b: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0040: stloc.2
IL_0041: ldloc.0
IL_0042: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0047: stloc.3
IL_0035: ret
IL_0036: ldarg.0
IL_0037: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_003c: stloc.2
IL_003d: ldloc.0
IL_003e: ldfld int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::key2@
IL_0043: stloc.3
IL_0044: ldloc.2
IL_0045: ldloc.3
IL_0046: cgt
IL_0048: ldloc.2
IL_0049: ldloc.3
IL_004a: bge.s IL_004e
IL_004c: ldc.i4.m1
IL_004a: clt
IL_004c: sub
IL_004d: ret
IL_004e: ldloc.2
IL_004f: ldloc.3
IL_0050: cgt
IL_0052: ret
IL_0053: ldc.i4.1
IL_0054: ret
IL_004e: ldc.i4.1
IL_004f: ret
IL_0055: ldarg.1
IL_0056: unbox.any Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR
IL_005b: brfalse.s IL_005f
IL_0050: ldarg.1
IL_0051: unbox.any Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR
IL_0056: brfalse.s IL_005a
IL_005d: ldc.i4.m1
IL_005e: ret
IL_0058: ldc.i4.m1
IL_0059: ret
IL_005f: ldc.i4.0
IL_0060: ret
IL_005a: ldc.i4.0
IL_005b: ret
} // end of method KeyR::CompareTo
.method public hidebysig virtual final
instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
instance int32 GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 51 (0x33)
.maxstack 7
.locals init (int32 V_0)
......@@ -351,20 +335,20 @@
.method public hidebysig virtual final
instance int32 GetHashCode() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: callvirt instance int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer)
IL_0001: call class [System.Runtime]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: callvirt instance int32 Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer)
IL_000b: ret
} // end of method KeyR::GetHashCode
.method public hidebysig virtual final
instance bool Equals(object obj,
class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 54 (0x36)
.maxstack 4
.locals init (class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR V_0)
......@@ -407,7 +391,7 @@
.method public hidebysig virtual final
instance bool Equals(class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 47 (0x2f)
.maxstack 8
IL_0000: ldarg.0
......@@ -446,7 +430,7 @@
.method public hidebysig virtual final
instance bool Equals(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 20 (0x14)
.maxstack 4
.locals init (class Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR V_0)
......@@ -505,9 +489,9 @@
IL_0016: ldloc.1
IL_0017: ldloc.2
IL_0018: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0018: call class [System.Runtime]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_001d: callvirt instance bool Equals05/EqualsMicroPerfAndCodeGenerationTests/KeyR::Equals(object,
class [mscorlib]System.Collections.IEqualityComparer)
class [System.Runtime]System.Collections.IEqualityComparer)
IL_0022: stloc.0
IL_0023: ldloc.3
IL_0024: ldc.i4.1
......@@ -525,7 +509,7 @@
} // end of class Equals05
.class private abstract auto ansi sealed '<StartupCode$Equals05>'.$Equals05$fsx
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.method public static void main@() cil managed
{
......@@ -541,4 +525,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file c:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net472\tests\EmittedIL\GenericComparison\Equals05_fsx\Equals05.res
// WARNING: Created Win32 resource file C:\dev\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Debug\net6.0\tests\EmittedIL\GenericComparison\Equals05_fsx\Equals05.res
......@@ -4,10 +4,10 @@
// Metadata version: v4.0.30319
.assembly extern mscorlib
.assembly extern System.Runtime
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 6:0:0:0
}
.assembly extern FSharp.Core
{
......@@ -21,60 +21,60 @@
int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 )
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 01 00 00 00 00 )
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 03 01 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.mresource public FSharpSignatureData.Structs01
{
// Offset: 0x00000000 Length: 0x0000077C
// Offset: 0x00000000 Length: 0x0000078C
// WARNING: managed resource file FSharpSignatureData.Structs01 created
}
.mresource public FSharpOptimizationData.Structs01
{
// Offset: 0x00000780 Length: 0x00000231
// Offset: 0x00000790 Length: 0x00000237
// WARNING: managed resource file FSharpOptimizationData.Structs01 created
}
.module Structs01.exe
// MVID: {624E382D-701F-5E27-A745-03832D384E62}
// MVID: {628FBBC7-63FE-A29D-A745-0383C7BB8F62}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03890000
// Image base: 0x0000026623040000
// =============== CLASS MEMBERS DECLARATION ===================
.class public abstract auto ansi sealed Experiment.Test
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class sequential ansi serializable sealed nested public Test
extends [mscorlib]System.ValueType
implements class [mscorlib]System.IEquatable`1<valuetype Experiment.Test/Test>,
[mscorlib]System.Collections.IStructuralEquatable,
class [mscorlib]System.IComparable`1<valuetype Experiment.Test/Test>,
[mscorlib]System.IComparable,
[mscorlib]System.Collections.IStructuralComparable
extends [System.Runtime]System.ValueType
implements class [System.Runtime]System.IEquatable`1<valuetype Experiment.Test/Test>,
[System.Runtime]System.Collections.IStructuralEquatable,
class [System.Runtime]System.IComparable`1<valuetype Experiment.Test/Test>,
[System.Runtime]System.IComparable,
[System.Runtime]System.Collections.IStructuralComparable
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 03 00 00 00 00 00 )
.field public int32 Field
.method public hidebysig virtual final
instance int32 CompareTo(valuetype Experiment.Test/Test obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 34 (0x22)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 33 (0x21)
.maxstack 5
.locals init (valuetype Experiment.Test/Test& V_0,
class [mscorlib]System.Collections.IComparer V_1,
class [System.Runtime]System.Collections.IComparer V_1,
int32 V_2,
int32 V_3)
IL_0000: ldarga.s obj
IL_0002: stloc.0
IL_0003: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0003: call class [System.Runtime]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer()
IL_0008: stloc.1
IL_0009: ldarg.0
IL_000a: ldfld int32 Experiment.Test/Test::Field
......@@ -84,21 +84,18 @@
IL_0016: stloc.3
IL_0017: ldloc.2
IL_0018: ldloc.3
IL_0019: bge.s IL_001d
IL_001b: ldc.i4.m1
IL_001c: ret
IL_001d: ldloc.2
IL_001e: ldloc.3
IL_001f: cgt
IL_0021: ret
IL_0019: cgt
IL_001b: ldloc.2
IL_001c: ldloc.3
IL_001d: clt
IL_001f: sub
IL_0020: ret
} // end of method Test::CompareTo
.method public hidebysig virtual final
instance int32 CompareTo(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
......@@ -110,14 +107,14 @@
.method public hidebysig virtual final
instance int32 CompareTo(object obj,
class [mscorlib]System.Collections.IComparer comp) cil managed
class [System.Runtime]System.Collections.IComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 40 (0x28)
.maxstack 4
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 39 (0x27)
.maxstack 5
.locals init (valuetype Experiment.Test/Test V_0,
valuetype Experiment.Test/Test& V_1,
class [mscorlib]System.Collections.IComparer V_2,
class [System.Runtime]System.Collections.IComparer V_2,
int32 V_3,
int32 V_4)
IL_0000: ldarg.1
......@@ -135,25 +132,22 @@
IL_0019: stloc.s V_4
IL_001b: ldloc.3
IL_001c: ldloc.s V_4
IL_001e: bge.s IL_0022
IL_0020: ldc.i4.m1
IL_0021: ret
IL_0022: ldloc.3
IL_0023: ldloc.s V_4
IL_0025: cgt
IL_0027: ret
IL_001e: cgt
IL_0020: ldloc.3
IL_0021: ldloc.s V_4
IL_0023: clt
IL_0025: sub
IL_0026: ret
} // end of method Test::CompareTo
.method public hidebysig virtual final
instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
instance int32 GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 27 (0x1b)
.maxstack 7
.locals init (int32 V_0,
class [mscorlib]System.Collections.IEqualityComparer V_1)
class [System.Runtime]System.Collections.IEqualityComparer V_1)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4 0x9e3779b9
......@@ -178,26 +172,26 @@
.method public hidebysig virtual final
instance int32 GetHashCode() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: call instance int32 Experiment.Test/Test::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer)
IL_0001: call class [System.Runtime]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer()
IL_0006: call instance int32 Experiment.Test/Test::GetHashCode(class [System.Runtime]System.Collections.IEqualityComparer)
IL_000b: ret
} // end of method Test::GetHashCode
.method public hidebysig virtual final
instance bool Equals(object obj,
class [mscorlib]System.Collections.IEqualityComparer comp) cil managed
class [System.Runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 42 (0x2a)
.maxstack 4
.locals init (object V_0,
valuetype Experiment.Test/Test V_1,
valuetype Experiment.Test/Test& V_2,
class [mscorlib]System.Collections.IEqualityComparer V_3)
class [System.Runtime]System.Collections.IEqualityComparer V_3)
IL_0000: ldarg.1
IL_0001: stloc.0
IL_0002: ldloc.0
......@@ -238,7 +232,7 @@
.method public hidebysig virtual final
instance bool Equals(valuetype Experiment.Test/Test obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 18 (0x12)
.maxstack 4
.locals init (valuetype Experiment.Test/Test& V_0)
......@@ -255,7 +249,7 @@
.method public hidebysig virtual final
instance bool Equals(object obj) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 30 (0x1e)
.maxstack 4
.locals init (object V_0,
......@@ -298,7 +292,7 @@
} // end of class Experiment.Test
.class private abstract auto ansi sealed '<StartupCode$Structs01>.$Experiment'.Test
extends [mscorlib]System.Object
extends [System.Runtime]System.Object
{
.method public static void main@() cil managed
{
......@@ -314,4 +308,4 @@
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file C:\kevinransom\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Release\net472\tests\EmittedIL\Misc\Structs01_fs\Structs01.res
// WARNING: Created Win32 resource file C:\Users\vzari\code\fsharp\artifacts\bin\FSharp.Compiler.ComponentTests\Release\net6.0\tests\EmittedIL\Misc\Structs01_fs\Structs01.res
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册