source: proto/s2k/trunk/framework/src/toolchain/b2k/lang/builtin/B2KBuiltinsTranslator.java @ 4109

Last change on this file since 4109 was 4109, checked in by ksherdy, 4 years ago

s2k sk to b2k IDISA translation support.

File size: 7.4 KB
Line 
1package toolchain.b2k.lang.builtin;
2
3import static toolchain.b2k.lang.paramBuiltin.idisa.IDISABuiltin.*;
4import static toolchain.b2k.lang.type.PrimitiveType.BITBLOCK_SIZE;
5
6import java.util.List;
7import b2k.ast.*;
8import b2k.inputHandler.*;
9import b2k.ast.IntegerConstantNode;
10import toolchain.b2k.ast.Accessors;
11import toolchain.b2k.ast.Generators;
12import toolchain.b2k.ast.Mutators;
13import toolchain.b2k.lang.builtin.B2KBuiltins;
14import toolchain.s2k.transformer.visitors.S2K2B2K.Context;
15
16
17// Translate s2k builtin calls from s2k to b2k.
18// Command Pattern, with the benefit that the
19// client does not instantiate the commands.
20
21public enum B2KBuiltinsTranslator {
22   
23        CARRY_TRANSLATION {     
24                public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
25           
26                    Locator locator = Generators.makeToken(snode.getToken());
27                   
28            String b2kBlkCallFuncName     = context.getCode(builtin);
29            ASTNode b2kBlkFuncCall        = Generators.makeFuncCallNode(locator, b2kBlkCallFuncName, arrayFromList(args));
30            ASTNode srliValue             = Generators.makeIntegerConstantNode(locator, BITBLOCK_SIZE - 1);
31           
32            return Generators.makeIdisaFuncCallNode(locator, BITBLOCK_SRLI, BITBLOCK_SIZE, srliValue, b2kBlkFuncCall);
33                }
34        },
35
36        ADVANCEN_TRANSLATION {
37                public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
38                    Locator locator = Generators.makeTextLocation(snode.getLocation());
39                       
40                    ASTNode formatValue                 = args.remove(1);
41                    String value                        = Accessors.lexeme(formatValue);
42                    String templateCode                 = context.getCode(builtin);
43
44                    String b2kBlkCallFuncName           = String.format(templateCode, value);         
45                    ASTNode b2kBlkFuncCall              = Generators.makeFuncCallNode(locator, b2kBlkCallFuncName, arrayFromList(args));
46                    ASTNode srliValue                   = Generators.makeIntegerConstantNode(locator, BITBLOCK_SIZE - 1);
47                   
48                    return Generators.makeIdisaFuncCallNode(locator, BITBLOCK_SRLI, BITBLOCK_SIZE, srliValue, b2kBlkFuncCall);
49                }
50        },
51       
52        SCANTO_FIRST_TRANSLATION {
53        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
54            Locator locator = Generators.makeToken(snode.getToken());           
55           
56            if(context.isFinalBlockMode()) { 
57                args.set(0, Generators.makeExprOrNotEofMaskCall(locator, args.get(0)));
58            }
59           
60            return CARRY_TRANSLATION.translate(B2KBuiltins.FLOW_SCAN_TO_FIRST, snode, context, args);
61        }
62        },
63       
64        SCANTO_TRANSLATION {
65        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
66            Locator locator = Generators.makeToken(snode.getToken());           
67           
68            args.set(1, translateScanToArgs(locator, context, args.get(1)));
69           
70            return CARRY_TRANSLATION.translate(B2KBuiltins.FLOW_SCAN_THRU, snode, context, args);
71        }
72    },
73
74    ADVANCE_THEN_SCANTO_TRANSLATION {
75        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
76            Locator locator = Generators.makeToken(snode.getToken());
77           
78            args.set(1, translateScanToArgs(locator, context, args.get(1)));   
79           
80            return CARRY_TRANSLATION.translate(B2KBuiltins.FLOW_ADVANCE_THEN_SCAN_THRU, snode, context, args);
81        }
82
83    }, 
84   
85    ASSERT_ZERO_TRANSLATION {
86        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
87           
88            Locator locator = Generators.makeToken(snode.getToken());
89           
90            ASTNode errorStream                     = args.get(0);
91            ASTNode errorMsg                        = args.get(1);
92           
93            String assert0CallName                  = context.getBuiltinEncoder().getCode(B2KBuiltins.FLOW_ASSERT_ZERO);
94
95            ASTNode assert0Call                     = Generators.makeFuncCallNode(locator, assert0CallName, errorStream, errorMsg);
96
97            BlockStmtNode blockStmt                 = Generators.makeBlockStmtNode(locator, assert0Call);
98            IfStmtNode replacement                  = Generators.makeIfStmtNode(locator, errorStream.deepCopy(), blockStmt);
99
100            Mutators.surroundConditionWithBitBlockAny(replacement, Accessors.condition(replacement));
101
102            return replacement;
103        }
104    },
105   
106    ATEOF_TRANSLATION {
107        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
108            Locator locator = Generators.makeToken(snode.getToken());
109           
110            if(context.isFinalBlockMode()) { 
111               
112                return Generators.makeExprAndCEofMaskCall(locator, args.get(0));
113            } else {
114               
115                FieldWidthNode fieldWidth = Generators.makeIdisaFieldWidthNode(locator, 1);
116                ASTNode value = Generators.makeIntegerConstantNode(locator, 0);
117                return Generators.makeIdisaFuncCallNode(locator, SIMD_CONSTANT, fieldWidth, value);       
118            }
119        } 
120    },
121
122    INFILE_TRANSLATION {
123               
124        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
125            Locator locator = Generators.makeToken(snode.getToken());
126           
127            if(context.isFinalBlockMode()) {
128                return Generators.makeExprAndEofMaskCall(locator, args.get(0));
129            } else {
130                return args.get(0);
131            }
132        }
133    },
134
135    MASK_TRANSLATION {
136        public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode snode, Context context, List<ASTNode> args) {
137           
138            Locator locator = Generators.makeToken(snode.getToken());
139            IntegerConstantNode n       = (IntegerConstantNode)args.get(0);
140            ASTNode fieldWidth          = Generators.makeIdisaFieldWidthNode(locator, Accessors.intValue(n));
141            ASTNode maskValue           = args.get(1);
142            return Generators.makeIdisaFuncCallNode(locator, SIMD_CONSTANT, (FieldWidthNode) fieldWidth, maskValue); 
143        }
144    },
145   
146    NULL_TRANSLATION {
147        @SuppressWarnings("unused")
148                public ASTNode translate() {
149                throw new RuntimeException("B2K builtin translation not unimplemented.");
150        }
151    };
152
153    // Interface
154    public ASTNode translate(B2KBuiltins builtin, s2k.ast.FuncCallNode node, Context context, List<ASTNode> args) {
155        assert false : "'pablo_blk_' S2KBuiltin translate not implemented for S2KBuitin: " + this.name();
156        return null;
157    }
158
159    // Helpers
160    private static ASTNode translateScanToArgs(Locator locator, Context context, ASTNode arg) {
161
162        if(context.isFinalBlockMode()) { 
163            return Generators.makeEofMaskAndCExprCall(locator, arg.deepCopy());
164        } else {
165            return Generators.makeIdisaFuncCallNode(locator, SIMD_NOT, BITBLOCK_SIZE, arg.deepCopy());
166        }
167
168    }
169
170    private static ASTNode[] arrayFromList(List<ASTNode> list) {
171        return list.toArray(new ASTNode [list.size()]);
172    }
173   
174   
175       
176   
177}
Note: See TracBrowser for help on using the repository browser.