@@ -1403,9 +1403,6 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
1403
1403
}
1404
1404
1405
1405
byteCodeState . instructions . Add ( new LLI_NegateRegister ( rightRegisterIndex ) ) ;
1406
-
1407
- if ( right . type is PtrCType )
1408
-
1409
1406
byteCodeState . instructions . Add ( new LLI_AddRegister ( leftRegisterIndex , rightRegisterIndex ) ) ;
1410
1407
1411
1408
left . remainingReferences -- ;
@@ -1935,7 +1932,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
1935
1932
1936
1933
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
1937
1934
{
1938
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( rvalue , stackSize ) ;
1935
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( rvalue , stackSize ) ;
1939
1936
1940
1937
if ( lvalue is CNamedValue || lvalue is CGlobalValueReference )
1941
1938
{
@@ -1990,7 +1987,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
1990
1987
1991
1988
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
1992
1989
{
1993
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( rvalue , stackSize ) ;
1990
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( rvalue , stackSize ) ;
1994
1991
1995
1992
if ( lvalue is CNamedValue || lvalue is CGlobalValueReference )
1996
1993
{
@@ -2047,7 +2044,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
2047
2044
2048
2045
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
2049
2046
{
2050
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( rvalue , stackSize ) ;
2047
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( rvalue , stackSize ) ;
2051
2048
2052
2049
if ( lvalue is CNamedValue || lvalue is CGlobalValueReference )
2053
2050
{
@@ -2104,7 +2101,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
2104
2101
2105
2102
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
2106
2103
{
2107
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( rvalue , stackSize ) ;
2104
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( rvalue , stackSize ) ;
2108
2105
2109
2106
if ( lvalue is CNamedValue || lvalue is CGlobalValueReference )
2110
2107
{
@@ -2161,7 +2158,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
2161
2158
2162
2159
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
2163
2160
{
2164
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( right , stackSize ) ;
2161
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( right , stackSize ) ;
2165
2162
2166
2163
if ( left is CNamedValue || left is CGlobalValueReference )
2167
2164
{
@@ -2216,7 +2213,7 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
2216
2213
2217
2214
using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
2218
2215
{
2219
- int rvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( right , stackSize ) ;
2216
+ int rvalueRegisterIndex = byteCodeState . MoveValueToAnyRegister ( right , stackSize ) ;
2220
2217
2221
2218
if ( left is CNamedValue || left is CGlobalValueReference )
2222
2219
{
@@ -2334,4 +2331,52 @@ public override void GetLLInstructions(ref ByteCodeState byteCodeState)
2334
2331
}
2335
2332
}
2336
2333
}
2334
+
2335
+ public class CInstruction_Negate : CInstruction
2336
+ {
2337
+ CValue value ;
2338
+ SharedValue < long > stackSize ;
2339
+ CValue resultingValue ;
2340
+
2341
+ public CInstruction_Negate ( CValue value , SharedValue < long > stackSize , out CValue resultingValue , string file , int line ) : base ( file , line )
2342
+ {
2343
+ if ( value . type is BuiltInCType && ( value . type as BuiltInCType ) . IsUnsigned ( ) )
2344
+ Compiler . Error ( $ "Attempting to negate unsigned value '{ value } '. This requires a cast.", file , line ) ;
2345
+
2346
+ this . value = value ;
2347
+ this . stackSize = stackSize ;
2348
+
2349
+ this . resultingValue = new CValue ( file , line , value . type , false , true ) { description = $ "-({ value } )" } ;
2350
+
2351
+ resultingValue = this . resultingValue ;
2352
+ }
2353
+
2354
+ public override void GetLLInstructions ( ref ByteCodeState byteCodeState )
2355
+ {
2356
+ if ( ! value . isInitialized )
2357
+ Compiler . Error ( $ "Cannot perform operator on uninitialized lvalue { value } .", file , line ) ;
2358
+
2359
+ int lvalueRegisterIndex = byteCodeState . CopyValueToAnyRegister ( value , stackSize ) ;
2360
+
2361
+ using ( var registerLock = byteCodeState . LockRegister ( lvalueRegisterIndex ) )
2362
+ {
2363
+ if ( value is CNamedValue || value is CGlobalValueReference )
2364
+ {
2365
+ if ( value is CNamedValue )
2366
+ byteCodeState . MoveValueToHome ( value as CNamedValue , stackSize ) ;
2367
+ else if ( value is CGlobalValueReference )
2368
+ throw new NotImplementedException ( ) ;
2369
+ }
2370
+
2371
+ byteCodeState . instructions . Add ( new LLI_NegateRegister ( lvalueRegisterIndex ) ) ;
2372
+
2373
+ value . remainingReferences -- ;
2374
+
2375
+ byteCodeState . registers [ lvalueRegisterIndex ] = resultingValue ;
2376
+ resultingValue . hasPosition = true ;
2377
+ resultingValue . position . inRegister = true ;
2378
+ resultingValue . position . registerIndex = lvalueRegisterIndex ;
2379
+ }
2380
+ }
2381
+ }
2337
2382
}
0 commit comments