Presentation is loading. Please wait.

Presentation is loading. Please wait.

EXPRESSION Chuen-Liang Chen Department of Computer Science

Similar presentations


Presentation on theme: "EXPRESSION Chuen-Liang Chen Department of Computer Science"— Presentation transcript:

1 EXPRESSION Chuen-Liang Chen Department of Computer Science
and Information Engineering National Taiwan University Taipei, TAIWAN

2 Introduction referring symbol table output generated code
for +, -, *, /, and, or, not, ... for address calculation semantic record representing <expression> temporary management tn -- var_level = 2, var_offset = n, indirect = F addressing mode immediate -- value direct -- base address + offset; [b,o] indirect base address + offset

3 Example symbol table example declarations I , J : Integer ; type R is
record X , Y : Integer ; end ; ARecord : R ; A1 : array ( ) of R ; A2 : array ( ) of array ( ) of Integer ; offset 0 -- J, 1 -- I, 2~3 -- ARecord, Y, X, 4~23 -- A1, 24~38 -- A2 type descriptor TD1 -- integer, TD2 -- float, TD3 -- R, TD4 -- array(1..10) of TD3, TD5 -- array(8..12) of TD1, TD6 -- array(4..6) of TD5

4 Example symbol table (1/3)
ST1 name attrs float integer I J A1 cls id id_tp TypeName A2 cls id id_tp TypeName TD1 frm sz IntegerType 1 TD2 frm sz FloatType 2 var_addr 1 var_lvl var_off indirect F A4 cls id id_tp Variable var_addr 1 var_lvl var_off indirect F A3 cls id id_tp Variable

5 Example symbol table (2/3)
ST1 name attrs R ARecord ST2 name Y X attrs A7 cls id id_tp TypeName TD3 frm sz RecordType 2 fld list var_addr 1 var_lvl var_off indirect 2 F A8 cls id id_tp Variable A5 cls id id_tp Field f_off next Ù A6 cls id id_tp Field f_off next 1 TD1

6 Example symbol table (3/3)
ST1 name attrs A1 A2 var_addr 1 var_lvl var_off indirect 4 F A9 cls id id_tp Variable TD4 frm sz ArrayType 20 bounds lower upper 1 10 e_tp TD3 TD1 var_addr 1 var_lvl var_off indirect 24 F A10 cls id id_tp Variable TD6 frm sz ArrayType 15 bounds lower upper 4 6 e_tp TD5 frm sz ArrayType 5 bounds lower upper 8 12 e_tp

7 Relevant grammar <exp> ® <rel> <exp_tail>
<exp_tail> ® <log_op> <rel> <exp_tail> <exp_tail> ® l <rel> ® <s_exp> <rel_tail> <rel_tail> ® <rel_op> <s_exp> <rel_tail> <rel_tail> ® l <s_exp> ® <u_term> <s_exp_tail> <s_exp_tail> ® <add_op> <term> <s_exp_tail> <s_exp_tail> ® l <u_term> ® <u_add_op> <term> <u_term> ® <term> <term> ® <factor> <term_tail> <term_tail> ® <mul_op> <factor> <term_tail> <term_tail> ® l <factor> ® <primary> <factor> ® <primary> ** <primary> <factor> ® not <primary> <factor> ® abs <primary> <primary> ® <literal> <primary> ® <name> <primary> ® ( <exp> ) <log_op> ® or | and <rel_op> ® = | /= | < | <= | > | >= <add_op> ® + | - | & <u_add_op> ® + | - <mul_op> ® * | / | mod <literal> ® INTL <literal> ® FLOATL <literal> ® STRlNGL <name> ® <s_name> <name_suf> <s_name> ® <id> <name_suf> ® l <name_suf> ® . <sel_suf> <name_suf> <name_suf> ® ( <exp> ) <name_suf> <sel_suf> ® <id> l QUIZ: semantic record

8 Enhanced semantic record (1/5)
enum semantic_record_kind { ..., DATAOBJECT, TOKEN }; struct semantic_record { enum semantic_record_kind record_kind; union { ... /*DATAOBJECT */ struct data_object data_object; /* TOKEN */ struct token token; }; } ; enum object_form { OBJECTVALUE, OBJECTADDRESS } typedef struct data_object { enum object_form form; type_descriptor *object_type; union { /* form == OBJECTVALUE */ struct value_type value; /* form == OBJECTADDRESS */ struct address addr; }; } data_object; struct token { token operator; }; enum value kind { INTKIND, FLOATKIND }; struct value { enum value_kind kind; union { /* kind == INTKIND */ long int_value; /* kind == FLOATKIND */ double float_value; struct address { short var_level; address_range var_offset; boolean indirect; } ;

9 Enhanced semantic record (2/5)
<operator> <literal> + Token knd token + 3 knd DataObject data_object form obj_tp value IKind i_vl 000011 OValue TD1

10 Enhanced semantic record (3/5)
<name>, ... whose address is known in compiler time I ARecord ARecord.X data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 2 F OAddr TD3 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 3 F OAddr TD1 A1 A1(6) A1(6).Y A2(5) A2(5)(9) data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 4 F OAddr TD4 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 14 F OAddr TD3 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 14 F OAddr TD1 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 29 F OAddr TD5 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 30 F OAddr TD1

11 Enhanced semantic record (4/5)
<name>, ... whose address is unknown in compiler time using tmp to store address t0 ¬ addr[ A1(J) ] t1 ¬ addr[ A1(J).Y ] t2 ¬ addr[ A2(5)(J) ] t3 ¬ addr[ A2(I)(9) ] t4 ¬ addr[ A2(I)(J) ] A1(J) A1(J).Y data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect T OAddr TD3 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD1 A2(5)(J) A2(I)(9) A2(I)(J) data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect T OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 3 T OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 4 T OAddr TD1

12 Enhanced semantic record (5/5)
<expression>, ... whose value is known in compiler time <expression>, ... whose value is unknown in compiler time using tmp to store value t5 ¬ - ARecord.X ti ¬ I - 3 an integer tmp tf ¬ I - 3.5 a float tmp - 3 5 - 3 knd DataObject data_object form obj_tp value IKind i_vl 111101 OValue TD1 knd DataObject data_object form obj_tp value IKind i_vl 000010 OValue TD1 - ARecord.X I - 3 I - 3.5 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 5 F OAddr TD1 data_object addr knd DataObject form obj_tp of ti var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp of tf var_lvl var_off indirect F OAddr TD2

13 Literal (1/3) l QUIZ: output relevant grammar <literal> ® INTL
<literal> ® FLOATL <literal> ® STRlNGL l QUIZ: output

14 Literal (2/3) relevant grammar <literal> ® INTL
<literal> ® FLOATL <literal> ® STRlNGL example -- 3 l QUIZ: action symbol & semantic routine 1 knd DataObject data_object form obj_tp value IKind i_vl 000011 OValue TD1 <l>1 INTL

15 Literal (3/3) relevant grammar with action symbols --
<literal> ® INTL #proc_literal($$) <literal> ® FLOATL #proc_literal($$) <literal> ® STRlNGL #proc_literal($$) semantic routine -- proc_literal ( ) => <literal> { take token value returned by scanner create a DATAOBJECT semantic record } put literal in symbol table } /* more machine-independent */ example -- 3 1 knd DataObject data_object form obj_tp value IKind i_vl 000011 OValue TD1 <l>1 INTL #pl

16 Simple variable (1/3) relevant grammar
<name> ® <s_name> <name_suf> <s_name> ® <id> <name_suf> ® l l QUIZ: output

17 Simple variable (2/3) relevant grammar
<name> ® <s_name> <name_suf> <s_name> ® <id> <name_suf> ® l example -- I l QUIZ: action symbol & semantic routine 2,3,4 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 <n>4 1 <sn>2 <ns>3 knd Id id I <id>1 l

18 Simple variable (3/3) relevant grammar with action symbols --
<name> ® <s_name> #cp($1,$2) <name_suf> #cp($2,$$) <s_name> ® <id> #new_name($1,$$) <name_suf> ® l semantic routine -- new_name (<id>) => <s_name> { Find <id>.id.id in the symbol table and acquire its attributes. if ( in symbol table && a variable ) <s_name> ¬ a DATAOBJECT record with appropriate information else <s_name> ¬ an ERROR record } example -- I 2,3,4 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 <n>4 1 <sn>2 #c($1,$2) <ns>3 #c($2,$$) knd Id id I <id>1 #nn l

19 Semantic routine construction process
a suggestion grammar semantic record output for each production rule generated code action symbol input/output parameters triggering place semantic routine QUIZ: other approaches QUIZ: review semantic routines constructed before

20 Record field (1/3) relevant grammar with action symbols --
<name> ® <s_name> #cp($1,$2) <name_suf> #cp($2,$$) <name_suf> ® . <sel_suf> #field_name($$,$2,$3) <name_suf> #cp($3,$$) <sel_suf> ® <id> #cp($1,$$) semantic routine -- field_name (<name_suf>, <sel_suf>) => <name_suf> { RT = <name_suf>.data_object.object_type /* record type descriptor */ AD = <name_suf>.data_object.addr /* record starting address */ FA = (id_entry of <sel_suf>.id.id in RT.fields).attrs /* field attribute record */ if (RT.form != RECORDTYPE or FA doesn’t exist) { <name_suf> ¬ an ERROR record; return; } if (AD.indirect == FALSE) { /* direct addressing */ AD.var_offset += FA.field_offset ; /* still direct addressing, same base */ } esle { /* indirect addressing */ Generate “the tmp described by AD += FA.field_offset” /* still indirect addressing, using the same tmp storage */ } <name_suf>.data_object.object_type = FA.id_type ; }

21 Record field (2/3) example -- ARecord . X generated code -- none
[1,2] + 1 Þ [1,3] 3,4 knd Id id X <n>7 <sn>1 #c($1,$2) #c($2,$$) <ns>2,6 . <ss>4 #fn <ns>5 #c($3,$$) #c($1,$$) <id>3 l 1,2 5,6,7 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 2 F OAddr TD3 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 3 F OAddr TD1

22 Example symbol table (2/3)
ST1 name attrs R ARecord ST2 name Y X attrs A7 cls id id_tp TypeName TD3 frm sz RecordType 2 fld list var_addr 1 var_lvl var_off indirect 2 F A8 cls id id_tp Variable A5 cls id id_tp Field f_off next Ù A6 cls id id_tp Field f_off next 1 TD1

23 Record field (3/3) example -- A1(J) . Y generated code
calculating t1 = addr[ A1(J) ]  + 0 */ (ADDI, 0, t1, t1) ‚ 2,3 knd Id id Y <n>7 <sn> #c($1,$2) #c($2,$$) <ns>6 <e> ) #pi <ns>1,5 #c($4,$$) . <ss>3 #fn‚ <ns>4 #c($3,$$) #c($1,$$) <id>2 l ( 1 4,5,6,7 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD3 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD1

24 Address calculation addressing mode immediate -- value
direct -- base address + offset; [b,o] indirect base address + offset address calculation -- original address + distance DV -- [ b, o ] + d' Þ [ b, o+d' ] compiler time addition IV b, o ] + d' b, o ] runtime addition DD -- [ b, o ] b', o' ] b", o" ] ID b, o ] b', o' ] b", o" ] DI -- [ b, o ] + b', o' ] b", o" ] II b, o ] + b', o' ] b", o" ] QUIZ: why new b", o" ] ? reusability?

25 Static array element (1/9)
relevant grammar with action symbols -- <name> ® <s_name> #cp($1,$2) <name_suf> #cp($2,$$) <name_suf> ® ( <exp> ) #proc_index($$,$2,$4) <name_suf> #cp($4,$$) semantic routine -- proc_index (<name_suf>, <exp>) => <name_suf> { AT = <name_suf>.data_object.object_type /* array type descriptor */ AD = <name_suf>.data_object.addr /* array starting address */ INX = data described by <exp>.data_object if (AT.form != ARRAYTYPE or INX type error or ...) { ... return; } Check INX bounds (preference: compiler time) Allocate temporary (if necessary) and Generate code to calculate address described by AD + AT.element_type.size * (INX - AT.bounds.lower) case DV: { ... } case DD: { ... } case DI: { ... } case IV: { ... } case ID: { ... } case II: { ... } update AD <name_suf>.data_object.object_type = AT.element_type; }

26 Static array element (2/9)
example -- A1 ( 6 ) case DV generated code -- none [1,4] + 2(6-1) Þ [1,14] ( <n>7 <sn>1 #c($1,$2) #c($2,$$) <ns>2,6 <e>4 ) #pi <ns>5 #c($4,$$) l <l>3 1,2 3,4 5,6,7 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 4 F OAddr TD4 knd DataObject data_object form obj_tp value IKind i_vl 000110 OValue TD1 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 14 F OAddr TD3

27 Example symbol table (3/3)
ST1 name attrs A1 A2 var_addr 1 var_lvl var_off indirect 4 F A9 cls id id_tp Variable TD4 frm sz ArrayType 20 bounds lower upper 1 10 e_tp TD3 TD1 var_addr 1 var_lvl var_off indirect 24 F A10 cls id id_tp Variable TD6 frm sz ArrayType 15 bounds lower upper 4 6 e_tp TD5 frm sz ArrayType 5 bounds lower upper 8 12 e_tp

28 Static array element (3/9)
example -- A1 ( J ) case DD generated code /* [1,4] + * */ (RANGETEST, 1, 10, J) (MULTI, J, 2, t1) (ADDI, level 1 base, t1, t1) (ADDI, 2, t1, t1)  QUIZ: compile time v.s. runtime ( <n>7 <sn>1 #c($1,$2) #c($2,$$) <ns>2,6 <e>4 ) #pi <ns>5 #c($4,$$) l <n>3 1,2 3,4 5,6,7 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 4 F OAddr TD4 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD3

29 Static array element (4/9)
<sn>1 #c($1,$2) #c($2,$$) <ns>2 <e>4 ) #pi <ns>5 #c($4,$$) ( <n>3 <e> #pi <ns> l <l> example -- A2 ( I ) ( 9 ) cases DD, IV generated code /* [1,24] + * */ (RANGETEST, 4, 6, I) (MULTI, I, 5, t1) (ADDI, level 1 base, t1, t1) (ADDI, 4, t1, t1)  1,2 3,4 5 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 24 F OAddr TD6 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD5

30 Static array element (5/9)
<sn> #c($1,$2) #c($2,$$) <ns>10 <e> ) #pi <ns>5,9 #c($4,$$) ( <e>7 #pi‚ <ns>8 l <l>6 <n> generated code (continued) + 1(9-8) * */ (ADDI, 1, t1, t1) ‚ 5 6,7 8,9,10,11 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD5 knd DataObject data_object form obj_tp value IKind i_vl 001001 OValue TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD1

31 Static array element (6/9)
<sn>1 #c($1,$2) #c($2,$$) <ns>2 <e>4 ) #pi‚ <ns>5 #c($4,$$) ( <n>3, <e> #pi <ns> l example -- A2 ( A1(J).Y ) ( J ) cases DI, ID generated code /* t1 = addr[ A1(J).Y ] */ (RANGETEST, 1, 10, J) (MULTI, J, 2, t1) (ADDI, level 1 base, t1, t1) (ADDI, 2, t1, t1) (ADDI, 0, t1, t1)  /* [1,24] + * */ (RANGETEST, 4, 5, t2) (ADDI, level 1 base, t2, t2) (ADDI, 4, t2, t2) ‚ 1,2 3,4 5 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 24 F OAddr TD6 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 1 T OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect T OAddr TD5

32 Static array element (7/9)
<sn> #c($1,$2) #c($2,$$) <ns>10 <e> ) #pi <ns>5,9 #c($4,$$) ( <n> <e>7 #piƒ <ns>8 l <n>6 generated code (continued) + * */ (RANGETEST, 8, 12, J) (MULTI, J, 1, t3) (ADDI, t2, t3, t3) (SUBI, 8, t3, t3) ƒ 5 6,7 8,9,10,11 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect T OAddr TD5 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 3 T OAddr TD1

33 Static array element (8/9)
<sn> #c($1,$2) #c($2,$$) <ns>6 <e> ) #pi <ns>1,5 #c($4,$$) ( <n> <e>3 #piƒ <ns>4 l <n>2,‚ example -- A2 ( A1(J).Y ) ( A1(J).X ) case II generated code /* t2 = addr[ A2(A1(J).Y) ] */ (ADDI, 0, t1, t1)  /* t3 = addr[ A1(J).X ] */ (RANGETEST, 1, 10, J) (MULTI, J, 2, t3) (ADDI, level 1 base, t3, t3) (ADDI, 2, t3, t3) (ADDI, 1, t3, t3) ‚ + * */ (RANGETEST, 8, 1, t4) (ADDI, t2, t4, t4) (SUBI, 8, t4, t4) ƒ 1 2,3 4,5,6,7 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect T OAddr TD5 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 3 T OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 4 T OAddr TD1

34 Static array element (9/9)
QUIZ: compare 6 cases QUIZ: other cases? QUIZ: A(I,J) v.s. A(I)(J) QUIZ: row major v.s. column major

35 Relevant grammar with action symbols (1/2)
<literal> ® INTL #proc_literal($$) <literal> ® FLOATL #proc_literal($$) <literal> ® STRlNGL #proc_literal($$) <name> ® <s_name> #cp($1,$2) <name_suf> #cp($2,$$) <s_name> ® <id> #new_name($1,$$) <name_suf> ® l <name_suf> ® . <sel_suf> #field_name($$,$2,$3) <name_suf> #cp($3,$$) <name_suf> ® ( <exp> ) #proc_index($$,$2,$4) <name_suf> #cp($4,$$) <sel_suf> ® <id> #cp($1,$$) <log_op> ® and #proc_op($$) | or #proc_op($$) <rel_op> ® = #proc_op($$) | /= #proc_op($$) | < #proc_op($$) | <= #proc_op($$) | > #proc_op($$) | >= #proc_op($$) <add_op> ® + #proc_op($$) | - #proc_op($$) | & #proc_op($$) <u_add_op> ® + #proc_op($$) | - #proc_op($$) <mul_op> ® * #proc_op($$) | / #proc_op($$) | mod #proc_op($$)

36 Relevant grammar with action symbols (2/2)
<exp> ® <rel> #cp($1,$2) <exp_tail> #cp($2,$$) <exp_tail> ® <log_op> <rel> #eval_b($$,$1,$2,$3) <exp_tail> #cp($3,$$) | l <rel> ® <s_exp> #cp($1,$2) <rel_tail> #cp($2,$$) <rel_tail> ® <rel_op> <s_exp> #eval_b($$,$1,$2,$3) <rel_tail> #cp($3,$$) | l <s_exp> ® <u_term> #cp($1,$2) <s_exp_tail> #cp($2,$$) <s_exp_tail> ® <add_op> <term> #eval_b($$,$1,$2,$3) <s_exp_tail> #cp($3,$$) | l <u_term> ® <u_add_op> <term> #eval_u($1,$2,$$) <u_term> ® <term> #cp($1,$$) <term> ® <factor> #cp($1,$2) <term_tail> #cp($2,$$) <term_tail> ® <mul_op> <factor> #eval_b($$,$1,$2,$3) <term_tail> #cp($3,$$) | l <factor> ® <primary> #cp($1,$$) <factor> ® <primary> ** #proc_op($2) <primary> #eval_b($1,$2.$3,$$) <factor> ® not #proc_op($1) <primary> #eval_u($1,$2,$$) <factor> ® abs #proc_op($1) <primary> #eval_u($1,$2,$$) <primary> ® <literal> #cp($1,$$) <primary> ® <name> #chk_data_obj($1,$$) <primary> ® ( <exp> #cp($2,$$) ) QUIZ: operation precedence QUIZ: Is a**b**c legal? l QUIZ: a+b+c v.s. a**b**c

37 Expression (1/7) semantic routines --
eval_unary (<operator>, <operand>) => <result> { select_unary_operator (<operator>.token, <operand>.data_object, &tuple_op, &result_type); if (tuple_op == NONE) <result> ¬ an ERROR record else if ( un_no_code_needed(tuple_op, &<operand>) ) { /* un_no_code_needed ( ) checks whether the unary expression * can be evaluated at compile-time. If it can, it does so and * updates <operand> to reflect the result. */ <result> ¬ <operand> } else { T = get_temporary(); generate(tuple_op, <operand>.data_object, T, ""); <result> ¬ (data_object ) { .form = OBJECTADDRESS; .object_type = /* result type */; .addr = T; } }

38 Expression (2/7) eval binary (<operand1>, <operator>, <operand2>) => <result> { select_binary_operator (<operand1>.data_object, <operator>.token, <operand2>.data_object, & tuple_op, & result_type); if (tuple_op == NONE) <result> ¬ an ERROR record else if (bi_no_code_needed(& <operand1>, tuple_op, <operand2>)) { /* bi_no_code_needed() checks whether the binary expression * can be evaluated at compile-time. If it can, it does so and * updates <operand1> to reflect the result. */ <result> ¬ <operand1> } else { T = get _temporary(); generate(tuple_op, <operand1>.data_object, <operand2>.data_object, T); <result> ¬ (data object) { .form = OBJECTADDRESS; .object_type = /* result type */; .addr = T; } }

39 Expression (3/7) example -- I := - ARecord.X + A2(A1(J).Y)(J) * 3 ;
<as> <e>28 := <n>1 #a… ; <r>26 #c(1,2) #c(2,$) <et>27 l <se>24 <rt>25 <ut>8 <set>9,23 #c(3,$) <ao>10 <t>21 <set>22 #eb„ <t>7 #eu <uao>2 - #po <f>5 <tt>6 + <f>13 #c <tt>14,20 <p>12 <mo>15 <f>18 #ebƒ <tt>19 #c(1,$) <p>4 #cdo <n>3 <n>11,‚ * <p>17 <l>16

40 Expression (4/7) generated code (UMINUS, [1,3], t0)  1 <as>
:= <n>1 #a ; <r> #c(1,2) #c(2,$) <et> <se> <rt> <ut>8 <set>9 <t>7 #eu <uao>2 - #po <f>5 <tt>6 l #c(1,$) <p>4 #cdo <n>3 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 3,4,5,6,7 8,9 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect 3 F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect F OAddr TD1 2 Token knd token -

41 Expression (5/7) generated code (continued)
/* t3 = addr[ A2(A1(J).Y)(J) ] */ ‚ 3, t4) ƒ 1 16,17,18 8,9 knd DataObject data_object form obj_tp value IKind i_vl 000011 OValue TD1 10 <se> <ut>8 #c(1,2) #c(2,$) <set>9 #c(3,$) <ao>10 <t>21 <set> #eb + #po <f>13 #c <tt>14,20 <p>12 <mo>15 <f>18 #ebƒ <tt>19 #cdo <n>11,‚ * #c(1,$) <p>17 <l>16 l Token knd token + 11,12,13,14 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 3 T OAddr TD1 19,20,21 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 4 F OAddr TD1 15 Token knd token *

42 Expression (6/7) generated code (continued)
(ADDI, t0, t4, t5) „ (ASSIGN, t5, 1, I) … 1 19,20,21 data_object addr knd DataObject form obj_tp 1 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 4 F OAddr TD1 <as> <e>28 := <n>1 #a… ; <r>26 #c(1,2) #c(2,$) <et>27 l <se>24 <rt>25 <ut>8 <set>9,23 #c(3,$) <ao>10 <t>21 <set>22 #eb„ 8,9 22~28 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect F OAddr TD1 data_object addr knd DataObject form obj_tp 2 var_lvl var_off indirect 5 F OAddr TD1 10 Token knd token +

43 Expression (7/7) generated code (summary)
/* t0 = - ARecord.X */ (UMINUS, [1,3], [2,0]) /* t1 = addr[ A1(J) ] */ (RANGETEST, 1, 10, [1,0]) (MULTI, [1,0], 2, [2,1]) (ADDI, level 1 base, [2,1], [2,1]) (ADDI, 2, [2,1], [2,1]) /* t1 = addr[ A1(J).Y ] */ (ADDI, 0, [2,1], [2,1]) /* t2 = addr[ A2(A1(J).Y) ] */ (RANGETEST, 4, 5, [2,2]) (ADDI, level 1 base, [2,2], [2,2]) (ADDI, 4, [2,2], [2,2]) /* t3 = addr[ A2(A1(J).Y)(J) ] */ (RANGETEST, 8, 12, [1,0]) (MULTI, [1,0], 1, [2,3]) (ADDI, [2,2], [2,3], [2,3]) (SUBI, 8, [2,3], [2,3]) /* t4 = A2(A1(J).Y)(J) * 3 */ 3, [2,4]) /* t5 = - ARecord.X + A2(A1(J).Y)(J) * 3 */ (ADDI, [2,0], [2,4], [2,5]) /* I = - ARecord.X + A2(A1(J).Y)(J) * 3 */ (ASSIGN, [2,5], 1, [1,1]) u QUIZ: if we put this statement within a loop, then ... u QUIZ: MIPS v.s. MFLOPS u QUIZ: lousy #copy, efficient implementation

44 Advanced features multidimensional array organization and references
records with dynamic objects variant records access-type references other uses of names in Ada record and array aggregates overload resolution QUIZ: how?

45 QUIZ QUIZ: Term Project

46 Merry X’mas Expression (3/7)
example -- I := - ARecord.X + A2(A1(J).Y)(J) * 3 ; <as> <n>1 := <e>28 #a… ; <r>26 #c(1,2) <et>27 #c(2,$) <se>24 #c(1,2) <rt>25 #c(2,$) l <ut>8 #c(1,2) <set>9,23 #c(2,$) l <uao>2 <t>7 #eu <ao>10 <t>21 #eb„ <set>22 #c(3,$) - #po <f>5 #c(1,2) <tt>6 #c(2,$) + #po <f>13 #c <tt>14,20 #c l <p>4 #c(1,$) l <p>12 #c <mo>15 <f>18 #ebƒ <tt>19 #c(3,$) <n>3 #cdo <n>11,‚ #cdo * #po <p>17 #c(1,$) l <l>16 #c(1,$)


Download ppt "EXPRESSION Chuen-Liang Chen Department of Computer Science"

Similar presentations


Ads by Google