From 4f2177e41f2f15629a5ecfc70921ebc5dcc96b58 Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 14 Oct 2016 23:19:02 +0200 Subject: [PATCH] Reworked loads and stores; it's now *different*, maybe not better. --- mach/proto/mcg/table | 133 ++++++++++++++++++++++++++++--------------- 1 file changed, 86 insertions(+), 47 deletions(-) diff --git a/mach/proto/mcg/table b/mach/proto/mcg/table index 88fc59159..4653e2d60 100644 --- a/mach/proto/mcg/table +++ b/mach/proto/mcg/table @@ -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; -- 2.34.1