Reworked loads and stores; it's now *different*, maybe not better.
authorDavid Given <dg@cowlark.com>
Fri, 14 Oct 2016 21:19:02 +0000 (23:19 +0200)
committerDavid Given <dg@cowlark.com>
Fri, 14 Oct 2016 21:19:02 +0000 (23:19 +0200)
mach/proto/mcg/table

index 88fc591..4653e2d 100644 (file)
@@ -77,8 +77,10 @@ REGISTERS
 DECLARATIONS
 
        cr;
-    ubyte;
-    ushort;
+    ubyteX;   /* bottom 8 bits valid, the rest undefined */
+    ubyte0;  /* bottom 8 bits valid, the rest 0 */
+    ushortX;  /* bottom 16 bits valid, the rest undefined */
+    ushort0; /* bottom 16 bits valid, the rest 0 */
 
        address fragment;
 
@@ -134,19 +136,19 @@ PATTERNS
                emit "stw %value, %addr"
                cost 4;
 
-       STORE2(addr:address, value:(int)ushort)
+       STORE2(addr:address, value:(int)ushortX)
                emit "sth %value, %addr"
                cost 4;
 
-    STORE2(ADD4(left:(int)reg, right:(int)reg), value:(int)ushort)
+    STORE2(ADD4(left:(int)reg, right:(int)reg), value:(int)ushortX)
         emit "sthx %value, %left, %right"
         cost 4;
 
-    STORE1(addr:address, value:(int)ubyte)
+    STORE1(addr:address, value:(int)ubyteX)
                emit "stb %value, %addr"
                cost 4;
 
-    STORE1(ADD4(left:(int)reg, right:(int)reg), value:(int)ubyte)
+    STORE1(ADD4(left:(int)reg, right:(int)reg), value:(int)ubyteX)
         emit "stbx %value, %left, %right"
         cost 4;
 
@@ -156,54 +158,107 @@ PATTERNS
                emit "lwz %out, %addr"
                cost 4;
 
-       out:(int)ushort = LOAD2(addr:address)
+       out:(int)ushort0 = LOAD2(addr:address)
                emit "lhz %out, %addr"
                cost 4;
 
-       out:(int)ubyte = LOAD1(addr:address)
+       out:(int)ubyte0 = LOAD1(addr:address)
                emit "lbz %out, %addr"
                cost 4;
 
-    /* Conversions to ubyte and ushort */
+    /* ubyte intrinsics */
 
-    out:(int)ubyte = in:(int)reg
+    out:(int)ubyteX = in:(int)ubyte0
         with %out == %in
-        emit "! reg -> ubyte"
+        emit "! ubyte0 -> ubyteX"
         cost 1;
 
-    out:(int)ubyte = CIU41(value:(int)reg)
-        with %out == %value
-        emit "! CIU41(reg) -> ubyte"
-        cost 1;
+    out:(int)ubyte0 = in:(int)ubyteX
+        emit "andi %out, %in, 0xff ! ubyteX -> ubyte0"
+        cost 4;
 
-    out:(int)ubyte = CIU41(CII14(CIU41(value:(int)reg)))
-        with %out == %value
-        emit "! CIU41(CII14(CIU41(reg))) -> ubyte"
-        cost 1;
+    out:(int)reg = in:(int)ubyte0
+        with %out == %in
+        emit "! ubyte0 -> reg"
+        cost 4;
 
-    out:(int)ushort = in:(int)reg
+    out:(int)ubyteX = in:(int)reg
         with %out == %in
-        emit "! reg -> ushort"
+        emit "! reg -> ubyteX"
         cost 1;
 
-    out:(int)ushort = CIU42(value:(int)reg)
-        with %out == %value
-        emit "! CIU42(reg) -> ushort"
+    /* ushort intrinsics */
+
+    out:(int)ushortX = in:(int)ushort0
+        with %out == %in
+        emit "! ushort0 -> ushortX"
         cost 1;
 
-    out:(int)ushort = CIU42(CII24(CIU42(value:(int)reg)))
-        with %out == %value
-        emit "! CIU42(CII24(CIU42(reg))) -> ushort"
+    out:(int)ushort0 = in:(int)ushortX
+        emit "andi %out, %in, 0xff ! ushortX -> ushort0"
+        cost 4;
+
+    out:(int)reg = in:(int)ushort0
+        with %out == %in
+        emit "! ushort0 -> reg"
+        cost 4;
+
+    out:(int)ushortX = in:(int)reg
+        with %out == %in
+        emit "! reg -> ushortX"
         cost 1;
 
-    /* Conversions from ubyte and ushort */
+       /* byte conversions */
 
-    out:(int)reg = CIU14(in:(int)ubyte)
+    out:(int)ubyte0 = CIU14(in:(int)ubyte0)
+        with %out == %in
+        emit "! CIU14(ubyte0) -> ubyte0"
+        cost 1;
+        
+    out:(int)ubyte0 = CIU41(in:(int)ubyte0)
+        with %out == %in
+        emit "! CIU41(ubyte0) -> ubyte0"
+        cost 1;
+        
+    out:(int)ubyteX = CIU41(in:(int)ubyteX)
+        with %out == %in
+        emit "! CIU41(ubyteX) -> ubyteX"
+        cost 1;
+        
+    out:(int)reg = CII14(in:(int)ubyte0)
         with %out == %in
-        emit "! CIU14"
+        emit "! CII14(ubyte0) -> reg"
+        cost 4;
+        
+    out:(int)reg = CII14(in:(int)ubyteX)
+        emit "extsb %out, %in ! CII14(ubyteX) -> reg"
         cost 4;
 
-       
+    /* short conversions */
+
+    out:(int)ushort0 = CIU24(in:(int)ushort0)
+        with %out == %in
+        emit "! CIU24(ushort0) -> ushort0"
+        cost 1;
+        
+    out:(int)ushort0 = CIU42(in:(int)ushort0)
+        with %out == %in
+        emit "! CIU42(ushort0) -> ushort0"
+        cost 1;
+        
+    out:(int)ushortX = CIU42(in:(int)ushortX)
+        with %out == %in
+        emit "! CIU42(ushortX) -> ushortX"
+        cost 1;
+        
+    out:(int)reg = CII24(in:(int)ushort0)
+        with %out == %in
+        emit "! CII24(ushort0) -> reg"
+        cost 4;
+        
+    out:(int)reg = CII24(in:(int)ushortX)
+        emit "extsh %out, %in"
+        cost 4;
 
 
 /* Locals */
@@ -304,22 +359,6 @@ PATTERNS
 
 /* Conversions */
 
-       out:(int)reg = CII14(CIU41(value:(int)reg))
-               emit "extsb %out, %value"
-               cost 4;
-
-       out:(int)reg = CII24(CIU42(value:(int)reg))
-               emit "extsh %out, %value"
-               cost 4;
-
-       out:(int)reg = CIU41(in:(int)reg)
-               emit "andi %out, %in, 0xff"
-               cost 4;
-
-       out:(int)reg = CIU42(in:(int)reg)
-               emit "andi %out, %in, 0xffff"
-               cost 4;
-
     out:(int)reg = CIU44(in:(int)reg)
         emit "mr %out, %in ! ciu44"
         cost 4;