1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-21 17:24:39 +00:00

Removed signed byte register usage by allowing the fragment binding to also look at the variable type.

This commit is contained in:
Jesper Gravgaard 2017-12-10 19:53:14 +01:00
parent 69dba6ea27
commit e2aa0cd7e0
6 changed files with 83 additions and 64 deletions

View File

@ -218,8 +218,9 @@ public class AsmFragmentSignature {
// Find value if it is already bound // Find value if it is already bound
for (String name : bindings.keySet()) { for (String name : bindings.keySet()) {
Value bound = bindings.get(name); Value bound = bindings.get(name);
if (bound.equals(value)) if (bound.equals(value)) {
return name; return name;
}
} }
if (value instanceof Variable) { if (value instanceof Variable) {
@ -231,19 +232,57 @@ public class AsmFragmentSignature {
if (bound instanceof Variable) { if (bound instanceof Variable) {
Registers.Register boundRegister = ((Variable) bound).getAllocation(); Registers.Register boundRegister = ((Variable) bound).getAllocation();
if (boundRegister != null && boundRegister.equals(register)) { if (boundRegister != null && boundRegister.equals(register)) {
return name; if (SymbolTypeInference.typeMatch(((Variable) bound).getType(), variable.getType())) {
return name;
}
} }
} }
} }
// Create a new suitable name // Create a new suitable name
if (Registers.RegisterType.ZP_BYTE.equals(register.getType())) { if (Registers.RegisterType.ZP_BYTE.equals(register.getType())) {
String name = "zpby" + nextZpByteIdx++; SymbolType varType = ((Variable) value).getType();
bindings.put(name, value); if (SymbolType.isByte(varType)) {
return name; String name = "zpby" + nextZpByteIdx++;
} else if (Registers.RegisterType.ZP_SBYTE.equals(register.getType())) { bindings.put(name, value);
String name = "zpsby" + nextZpSByteIdx++; return name;
bindings.put(name, value); } else if (SymbolType.isSByte(varType)) {
return name; String name = "zpsby" + nextZpSByteIdx++;
bindings.put(name, value);
return name;
}
} else if (Registers.RegisterType.REG_X_BYTE.equals(register.getType())) {
SymbolType varType = ((Variable) value).getType();
if (SymbolType.isByte(varType)) {
String name = "xby";
bindings.put(name, value);
return name;
} else if (SymbolType.isSByte(varType)) {
String name = "xsby";
bindings.put(name, value);
return name;
}
} else if (Registers.RegisterType.REG_Y_BYTE.equals(register.getType())) {
SymbolType varType = ((Variable) value).getType();
if (SymbolType.isByte(varType)) {
String name = "yby";
bindings.put(name, value);
return name;
} else if (SymbolType.isSByte(varType)) {
String name = "ysby";
bindings.put(name, value);
return name;
}
} else if (Registers.RegisterType.REG_A_BYTE.equals(register.getType())) {
SymbolType varType = ((Variable) value).getType();
if (SymbolType.isByte(varType)) {
String name = "aby";
bindings.put(name, value);
return name;
} else if (SymbolType.isSByte(varType)) {
String name = "asby";
bindings.put(name, value);
return name;
}
} else if (Registers.RegisterType.ZP_WORD.equals(register.getType())) { } else if (Registers.RegisterType.ZP_WORD.equals(register.getType())) {
String name = "zpwo" + nextZpWordIdx++; String name = "zpwo" + nextZpWordIdx++;
bindings.put(name, value); bindings.put(name, value);
@ -252,30 +291,6 @@ public class AsmFragmentSignature {
String name = "zpbo" + nextZpBoolIdx++; String name = "zpbo" + nextZpBoolIdx++;
bindings.put(name, value); bindings.put(name, value);
return name; return name;
} else if (Registers.RegisterType.REG_X_BYTE.equals(register.getType())) {
String name = "xby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.REG_Y_BYTE.equals(register.getType())) {
String name = "yby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.REG_A_BYTE.equals(register.getType())) {
String name = "aby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.REG_X_SBYTE.equals(register.getType())) {
String name = "xsby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.REG_Y_SBYTE.equals(register.getType())) {
String name = "ysby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.REG_A_SBYTE.equals(register.getType())) {
String name = "asby";
bindings.put(name, value);
return name;
} else if (Registers.RegisterType.ZP_PTR_BYTE.equals(register.getType())) { } else if (Registers.RegisterType.ZP_PTR_BYTE.equals(register.getType())) {
String name = "zpptrby" + nextZpPtrIdx++; String name = "zpptrby" + nextZpPtrIdx++;
bindings.put(name, value); bindings.put(name, value);
@ -287,7 +302,7 @@ public class AsmFragmentSignature {
SymbolType constType; SymbolType constType;
if (value instanceof ConstantVar) { if (value instanceof ConstantVar) {
constType = ((ConstantVar) value).getType(); constType = ((ConstantVar) value).getType();
} else if(value instanceof ConstantValue) { } else if (value instanceof ConstantValue) {
constType = SymbolTypeInference.inferType(program.getScope(), (ConstantValue) value); constType = SymbolTypeInference.inferType(program.getScope(), (ConstantValue) value);
} else { } else {
throw new RuntimeException("Unhandled constant type " + value); throw new RuntimeException("Unhandled constant type " + value);

View File

@ -137,7 +137,7 @@ public class Pass4RegistersFinalize extends Pass2Base {
if (SymbolType.isByte(varType)) { if (SymbolType.isByte(varType)) {
return new Registers.RegisterZpByte(currentZp++); return new Registers.RegisterZpByte(currentZp++);
} else if (SymbolType.isSByte(varType)) { } else if (SymbolType.isSByte(varType)) {
return new Registers.RegisterZpSignedByte(currentZp++); return new Registers.RegisterZpByte(currentZp++);
} else if (SymbolType.isWord(varType)) { } else if (SymbolType.isWord(varType)) {
Registers.RegisterZpWord registerZpWord = Registers.RegisterZpWord registerZpWord =
new Registers.RegisterZpWord(currentZp); new Registers.RegisterZpWord(currentZp);

View File

@ -1483,8 +1483,8 @@ Complete equivalence classes
Allocated zp ZP_BYTE:2 [ main::b#2 main::b#1 ] Allocated zp ZP_BYTE:2 [ main::b#2 main::b#1 ]
Allocated zp ZP_BYTE:3 [ w::i#2 w::i#1 ] Allocated zp ZP_BYTE:3 [ w::i#2 w::i#1 ]
Allocated zp ZP_BYTE:4 [ main::b2#0 ] Allocated zp ZP_BYTE:4 [ main::b2#0 ]
Allocated zp ZP_SBYTE:5 [ main::$1 ] Allocated zp ZP_BYTE:5 [ main::$1 ]
Allocated zp ZP_SBYTE:6 [ main::sb#0 ] Allocated zp ZP_BYTE:6 [ main::sb#0 ]
Allocated zp ZP_BYTE:7 [ main::$3 ] Allocated zp ZP_BYTE:7 [ main::$3 ]
Allocated zp ZP_BYTE:8 [ w::b2#0 ] Allocated zp ZP_BYTE:8 [ w::b2#0 ]
INITIAL ASM INITIAL ASM
@ -1641,17 +1641,17 @@ Statement [21] *((const byte*) SCREEN4#0 + (byte) w::i#2) ← (byte) w::b2#0 [ w
Potential registers zp ZP_BYTE:2 [ main::b#2 main::b#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:2 [ main::b#2 main::b#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ w::i#2 w::i#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:3 [ w::i#2 w::i#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::b2#0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:4 [ main::b2#0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_SBYTE:5 [ main::$1 ] : zp ZP_SBYTE:5 , reg sbyte a , reg sbyte x , reg sbyte y , Potential registers zp ZP_BYTE:5 [ main::$1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_SBYTE:6 [ main::sb#0 ] : zp ZP_SBYTE:6 , reg sbyte a , reg sbyte x , reg sbyte y , Potential registers zp ZP_BYTE:6 [ main::sb#0 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ main::$3 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:7 [ main::$3 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ w::b2#0 ] : zp ZP_BYTE:8 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:8 [ w::b2#0 ] : zp ZP_BYTE:8 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [main] 25.93: zp ZP_BYTE:2 [ main::b#2 main::b#1 ] 22: zp ZP_BYTE:4 [ main::b2#0 ] 22: zp ZP_SBYTE:5 [ main::$1 ] 22: zp ZP_SBYTE:6 [ main::sb#0 ] 22: zp ZP_BYTE:7 [ main::$3 ] Uplift Scope [main] 25.93: zp ZP_BYTE:2 [ main::b#2 main::b#1 ] 22: zp ZP_BYTE:4 [ main::b2#0 ] 22: zp ZP_BYTE:5 [ main::$1 ] 22: zp ZP_BYTE:6 [ main::sb#0 ] 22: zp ZP_BYTE:7 [ main::$3 ]
Uplift Scope [w] 30.25: zp ZP_BYTE:3 [ w::i#2 w::i#1 ] 11: zp ZP_BYTE:8 [ w::b2#0 ] Uplift Scope [w] 30.25: zp ZP_BYTE:3 [ w::i#2 w::i#1 ] 11: zp ZP_BYTE:8 [ w::b2#0 ]
Uplift Scope [] Uplift Scope []
Uplifting [main] best 1056 combination reg byte x [ main::b#2 main::b#1 ] reg byte a [ main::b2#0 ] reg sbyte a [ main::$1 ] reg sbyte a [ main::sb#0 ] reg byte a [ main::$3 ] Uplifting [main] best 1056 combination reg byte x [ main::b#2 main::b#1 ] reg byte a [ main::b2#0 ] reg byte a [ main::$1 ] reg byte a [ main::sb#0 ] reg byte a [ main::$3 ]
Uplifting [w] best 876 combination reg byte y [ w::i#2 w::i#1 ] reg byte x [ w::b2#0 ] Uplifting [w] best 876 combination reg byte y [ w::i#2 w::i#1 ] reg byte x [ w::b2#0 ]
Uplifting [] best 876 combination Uplifting [] best 876 combination
Removing instruction jmp b2 Removing instruction jmp b2
@ -2085,7 +2085,7 @@ FINAL SYMBOL TABLE
(byte*) SCREEN4 (byte*) SCREEN4
(const byte*) SCREEN4#0 SCREEN4 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 9 (const byte*) SCREEN4#0 SCREEN4 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 9
(void()) main() (void()) main()
(signed byte~) main::$1 reg sbyte a 22.0 (signed byte~) main::$1 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0 (byte~) main::$3 reg byte a 22.0
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
@ -2096,7 +2096,7 @@ FINAL SYMBOL TABLE
(byte) main::b2 (byte) main::b2
(byte) main::b2#0 reg byte a 22.0 (byte) main::b2#0 reg byte a 22.0
(signed byte) main::sb (signed byte) main::sb
(signed byte) main::sb#0 reg sbyte a 22.0 (signed byte) main::sb#0 reg byte a 22.0
(void()) w() (void()) w()
(label) w::@1 (label) w::@1
(label) w::@return (label) w::@return
@ -2115,8 +2115,8 @@ FINAL SYMBOL TABLE
reg byte x [ main::b#2 main::b#1 ] reg byte x [ main::b#2 main::b#1 ]
reg byte y [ w::i#2 w::i#1 ] reg byte y [ w::i#2 w::i#1 ]
reg byte a [ main::b2#0 ] reg byte a [ main::b2#0 ]
reg sbyte a [ main::$1 ] reg byte a [ main::$1 ]
reg sbyte a [ main::sb#0 ] reg byte a [ main::sb#0 ]
reg byte a [ main::$3 ] reg byte a [ main::$3 ]
reg byte x [ w::b2#0 ] reg byte x [ w::b2#0 ]

View File

@ -10,7 +10,7 @@
(byte*) SCREEN4 (byte*) SCREEN4
(const byte*) SCREEN4#0 SCREEN4 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 9 (const byte*) SCREEN4#0 SCREEN4 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 9
(void()) main() (void()) main()
(signed byte~) main::$1 reg sbyte a 22.0 (signed byte~) main::$1 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0 (byte~) main::$3 reg byte a 22.0
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
@ -21,7 +21,7 @@
(byte) main::b2 (byte) main::b2
(byte) main::b2#0 reg byte a 22.0 (byte) main::b2#0 reg byte a 22.0
(signed byte) main::sb (signed byte) main::sb
(signed byte) main::sb#0 reg sbyte a 22.0 (signed byte) main::sb#0 reg byte a 22.0
(void()) w() (void()) w()
(label) w::@1 (label) w::@1
(label) w::@return (label) w::@return
@ -40,7 +40,7 @@
reg byte x [ main::b#2 main::b#1 ] reg byte x [ main::b#2 main::b#1 ]
reg byte y [ w::i#2 w::i#1 ] reg byte y [ w::i#2 w::i#1 ]
reg byte a [ main::b2#0 ] reg byte a [ main::b2#0 ]
reg sbyte a [ main::$1 ] reg byte a [ main::$1 ]
reg sbyte a [ main::sb#0 ] reg byte a [ main::sb#0 ]
reg byte a [ main::$3 ] reg byte a [ main::$3 ]
reg byte x [ w::b2#0 ] reg byte x [ w::b2#0 ]

View File

@ -658,7 +658,7 @@ Complete equivalence classes
[ main::i#2 main::i#1 ] [ main::i#2 main::i#1 ]
[ main::j#2 main::j#1 ] [ main::j#2 main::j#1 ]
[ main::$2 ] [ main::$2 ]
Allocated zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::j#2 main::j#1 ] Allocated zp ZP_BYTE:3 [ main::j#2 main::j#1 ]
Allocated zp ZP_BYTE:4 [ main::$2 ] Allocated zp ZP_BYTE:4 [ main::$2 ]
INITIAL ASM INITIAL ASM
@ -734,33 +734,37 @@ main: {
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment xsby_lt_coby1_then_la1 allocation: reg sbyte x [ main::i#2 main::i#1 ] Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment xsby_lt_coby1_then_la1 allocation: reg byte x [ main::i#2 main::i#1 ]
Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment ysby_lt_coby1_then_la1 allocation: reg sbyte y [ main::i#2 main::i#1 ] Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment ysby_lt_coby1_then_la1 allocation: reg byte y [ main::i#2 main::i#1 ]
MISSING FRAGMENTS MISSING FRAGMENTS
xsby_lt_coby1_then_la1 xsby_lt_coby1_then_la1
ysby_lt_coby1_then_la1 ysby_lt_coby1_then_la1
Statement [6] if((signed byte) main::i#2<(byte/signed byte/word/signed word) 127) goto main::@2 [ main::i#2 main::j#2 ] ( main:2 [ main::i#2 main::j#2 ] ) always clobbers reg byte a Statement [6] if((signed byte) main::i#2<(byte/signed byte/word/signed word) 127) goto main::@2 [ main::i#2 main::j#2 ] ( main:2 [ main::i#2 main::j#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::j#2 main::j#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::j#2 main::j#1 ]
Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment xsby_lt_coby1_then_la1 allocation: reg sbyte x [ main::i#2 main::i#1 ] Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment xsby_lt_coby1_then_la1 allocation: reg byte x [ main::i#2 main::i#1 ]
Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment ysby_lt_coby1_then_la1 allocation: reg sbyte y [ main::i#2 main::i#1 ] Potential register analysis [6] if(main::i#2<127) goto main::@2 missing fragment ysby_lt_coby1_then_la1 allocation: reg byte y [ main::i#2 main::i#1 ]
MISSING FRAGMENTS MISSING FRAGMENTS
xsby_lt_coby1_then_la1 xsby_lt_coby1_then_la1
ysby_lt_coby1_then_la1 ysby_lt_coby1_then_la1
Statement [6] if((signed byte) main::i#2<(byte/signed byte/word/signed word) 127) goto main::@2 [ main::i#2 main::j#2 ] ( main:2 [ main::i#2 main::j#2 ] ) always clobbers reg byte a Statement [6] if((signed byte) main::i#2<(byte/signed byte/word/signed word) 127) goto main::@2 [ main::i#2 main::j#2 ] ( main:2 [ main::i#2 main::j#2 ] ) always clobbers reg byte a
Potential registers zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] : zp ZP_SBYTE:2 , reg sbyte a , reg sbyte x , reg sbyte y , Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::j#2 main::j#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:3 [ main::j#2 main::j#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$2 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:4 [ main::$2 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [main] 28.6: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 22: zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:4 [ main::$2 ] Uplift Scope [main] 28.6: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 22: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:4 [ main::$2 ]
Uplift Scope [] Uplift Scope []
Uplifting [main] best 468 combination reg byte x [ main::j#2 main::j#1 ] zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] reg byte a [ main::$2 ] Uplifting [main] best 468 combination reg byte x [ main::j#2 main::j#1 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ] reg byte a [ main::$2 ]
Uplifting [] best 468 combination Uplifting [] best 468 combination
MISSING FRAGMENTS MISSING FRAGMENTS
asby=_inc_asby
xsby_lt_coby1_then_la1 xsby_lt_coby1_then_la1
ysby_lt_coby1_then_la1 ysby_lt_coby1_then_la1
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [main] best 468 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
MISSING FRAGMENTS
ysby_lt_coby1_then_la1
Removing instruction jmp b1 Removing instruction jmp b1
Removing instruction jmp bend Removing instruction jmp bend
Removing instruction jmp b1 Removing instruction jmp b1
@ -960,15 +964,15 @@ FINAL SYMBOL TABLE
(label) main::@2 (label) main::@2
(label) main::@return (label) main::@return
(signed byte) main::i (signed byte) main::i
(signed byte) main::i#1 i zp ZP_SBYTE:2 11.0 (signed byte) main::i#1 i zp ZP_BYTE:2 11.0
(signed byte) main::i#2 i zp ZP_SBYTE:2 11.0 (signed byte) main::i#2 i zp ZP_BYTE:2 11.0
(byte) main::j (byte) main::j
(byte) main::j#1 reg byte x 22.0 (byte) main::j#1 reg byte x 22.0
(byte) main::j#2 reg byte x 6.6000000000000005 (byte) main::j#2 reg byte x 6.6000000000000005
(byte[]) main::screen (byte[]) main::screen
(const byte[]) main::screen#0 screen = ((byte*))(word/signed word) 1024 (const byte[]) main::screen#0 screen = ((byte*))(word/signed word) 1024
zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
reg byte x [ main::j#2 main::j#1 ] reg byte x [ main::j#2 main::j#1 ]
reg byte a [ main::$2 ] reg byte a [ main::$2 ]

View File

@ -7,14 +7,14 @@
(label) main::@2 (label) main::@2
(label) main::@return (label) main::@return
(signed byte) main::i (signed byte) main::i
(signed byte) main::i#1 i zp ZP_SBYTE:2 11.0 (signed byte) main::i#1 i zp ZP_BYTE:2 11.0
(signed byte) main::i#2 i zp ZP_SBYTE:2 11.0 (signed byte) main::i#2 i zp ZP_BYTE:2 11.0
(byte) main::j (byte) main::j
(byte) main::j#1 reg byte x 22.0 (byte) main::j#1 reg byte x 22.0
(byte) main::j#2 reg byte x 6.6000000000000005 (byte) main::j#2 reg byte x 6.6000000000000005
(byte[]) main::screen (byte[]) main::screen
(const byte[]) main::screen#0 screen = ((byte*))(word/signed word) 1024 (const byte[]) main::screen#0 screen = ((byte*))(word/signed word) 1024
zp ZP_SBYTE:2 [ main::i#2 main::i#1 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
reg byte x [ main::j#2 main::j#1 ] reg byte x [ main::j#2 main::j#1 ]
reg byte a [ main::$2 ] reg byte a [ main::$2 ]