diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 18 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 85 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips-trap.d | 11 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips.d | 11 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips@jal-svr4pic.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips@loc-swap-dis.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips@loc-swap.d | 28 |
8 files changed, 101 insertions, 71 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 5723141..c6c5ee1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,23 @@ 2011-08-09 Maciej W. Rozycki <macro@codesourcery.com> + * config/tc-mips.c (gpr_mod_mask): Remove INSN2_MOD_GPR_MB, + INSN2_MOD_GPR_MC, INSN2_MOD_GPR_ME, INSN2_MOD_GPR_MG, + INSN2_MOD_GPR_MHI, INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MM, + INSN2_MOD_GPR_MN, INSN2_MOD_GPR_MP and INSN2_MOD_GPR_MQ opcode + register use checks. + (gpr_read_mask): Add INSN2_READ_GPR_MC, INSN2_READ_GPR_ME + INSN2_READ_GPR_MG, INSN2_READ_GPR_MJ, INSN2_READ_GPR_MMN, + INSN2_READ_GPR_MP and INSN2_READ_GPR_MQ opcode register use + checks. + (gpr_write_mask): Replace INSN2_WRITE_GPR_S opcode register + use flag with INSN_WRITE_GPR_S. Add INSN2_WRITE_GPR_MB, + INSN2_WRITE_GPR_MHI, INSN2_WRITE_GPR_MJ and INSN2_WRITE_GPR_MP + opcode register use checks. + (can_swap_branch_p): Enable microMIPS branch swapping. + (append_insn): Likewise. + +2011-08-09 Maciej W. Rozycki <macro@codesourcery.com> + * config/tc-mips.c (RELAX_MICROMIPS_ENCODE): Remove forced 16-bit branch size information. (RELAX_MICROMIPS_U16BIT): Remove macro. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index eba45ec..08c1c02 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -2942,33 +2942,10 @@ gpr_mod_mask (const struct mips_cl_insn *ip) pinfo2 = ip->insn_mo->pinfo2; if (mips_opts.micromips) { - if (pinfo2 & INSN2_MOD_GPR_MB) - mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_MC) - mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)]; if (pinfo2 & INSN2_MOD_GPR_MD) mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_ME) - mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)]; if (pinfo2 & INSN2_MOD_GPR_MF) mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_MG) - mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_MHI) - { - mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)]; - mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)]; - } - if (pinfo2 & INSN2_MOD_GPR_MJ) - mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip); - if (pinfo2 & INSN2_MOD_GPR_MM) - mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_MN) - mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)]; - if (pinfo2 & INSN2_MOD_GPR_MP) - mask |= 1 << EXTRACT_OPERAND (1, MP, *ip); - if (pinfo2 & INSN2_MOD_GPR_MQ) - mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)]; if (pinfo2 & INSN2_MOD_SP) mask |= 1 << SP; } @@ -3019,6 +2996,26 @@ gpr_read_mask (const struct mips_cl_insn *ip) if (pinfo2 & INSN2_READ_GPR_Z) mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip); } + if (mips_opts.micromips) + { + if (pinfo2 & INSN2_READ_GPR_MC) + mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)]; + if (pinfo2 & INSN2_READ_GPR_ME) + mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)]; + if (pinfo2 & INSN2_READ_GPR_MG) + mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)]; + if (pinfo2 & INSN2_READ_GPR_MJ) + mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip); + if (pinfo2 & INSN2_READ_GPR_MMN) + { + mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)]; + mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)]; + } + if (pinfo2 & INSN2_READ_GPR_MP) + mask |= 1 << EXTRACT_OPERAND (1, MP, *ip); + if (pinfo2 & INSN2_READ_GPR_MQ) + mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)]; + } /* Don't include register 0. */ return mask & ~1; } @@ -3057,13 +3054,27 @@ gpr_write_mask (const struct mips_cl_insn *ip) mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip); if (pinfo & INSN_WRITE_GPR_T) mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip); - if (pinfo2 & INSN2_WRITE_GPR_S) + if (pinfo & INSN_WRITE_GPR_S) mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip); if (pinfo & INSN_WRITE_GPR_31) mask |= 1 << RA; if (pinfo2 & INSN2_WRITE_GPR_Z) mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip); } + if (mips_opts.micromips) + { + if (pinfo2 & INSN2_WRITE_GPR_MB) + mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)]; + if (pinfo2 & INSN2_WRITE_GPR_MHI) + { + mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)]; + mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)]; + } + if (pinfo2 & INSN2_WRITE_GPR_MJ) + mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip); + if (pinfo2 & INSN2_WRITE_GPR_MP) + mask |= 1 << EXTRACT_OPERAND (1, MP, *ip); + } /* Don't include register 0. */ return mask & ~1; } @@ -3666,12 +3677,9 @@ fix_loongson2f (struct mips_cl_insn * ip) static bfd_boolean can_swap_branch_p (struct mips_cl_insn *ip) { - unsigned long pinfo, pinfo2, prev_pinfo; + unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2; unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write; - /* For microMIPS, disable reordering. */ - if (mips_opts.micromips) - return FALSE; /* -O2 and above is required for this optimization. */ if (mips_optimize < 2) @@ -3771,8 +3779,11 @@ can_swap_branch_p (struct mips_cl_insn *ip) return FALSE; /* If the previous instruction uses the PC, we can not swap. */ + prev_pinfo2 = history[0].insn_mo->pinfo2; if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC)) return FALSE; + if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC)) + return FALSE; /* If the previous instruction has an incorrect size for a fixed branch delay slot in microMIPS mode, we cannot swap. */ @@ -3973,6 +3984,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, bfd_boolean relaxed_branch = FALSE; enum append_method method; bfd_boolean relax32; + int branch_disp; if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION) fix_loongson2f (ip); @@ -4164,6 +4176,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, } method = get_append_method (ip); + branch_disp = method == APPEND_SWAP ? insn_length (history) : 0; #ifdef OBJ_ELF /* The value passed to dwarf2_emit_insn is the distance between @@ -4181,8 +4194,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, and for MIPS16/microMIPS code also prevents a debugger from placing a breakpoint in the middle of the branch (and corrupting code if software breakpoints are used). */ - dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) - + (method == APPEND_SWAP ? insn_length (history) : 0)); + dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp); #endif relax32 = (mips_relax_branch @@ -4236,6 +4248,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, gas_assert (address_expr != NULL); gas_assert (!mips_relax.sequence); + relaxed_branch = TRUE; length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond); add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4, RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al, @@ -4450,25 +4463,21 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr, move_insn (ip, delay.frag, delay.where); move_insn (&delay, ip->frag, ip->where + insn_length (ip)); } - else if (mips_opts.micromips) - { - /* We don't reorder for micromips. */ - abort (); - } else if (relaxed_branch) { /* Add the delay slot instruction to the end of the current frag and shrink the fixed part of the original frag. If the branch occupies the tail of the latter, move it backwards to cover the gap. */ - delay.frag->fr_fix -= 4; + delay.frag->fr_fix -= branch_disp; if (delay.frag == ip->frag) - move_insn (ip, ip->frag, ip->where - 4); + move_insn (ip, ip->frag, ip->where - branch_disp); add_fixed_insn (&delay); } else { - move_insn (&delay, ip->frag, ip->where); + move_insn (&delay, ip->frag, + ip->where - branch_disp + insn_length (ip)); move_insn (ip, history[0].frag, history[0].where); } history[0] = *ip; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 3abf990..5e81c90 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2011-08-09 Maciej W. Rozycki <macro@codesourcery.com> + + * gas/mips/micromips.d: Update according to changes to enable + microMIPS branch swapping. + * gas/mips/micromips-trap.d: Likewise. + * gas/mips/micromips@jal-svr4pic.d: Likewise. + * gas/mips/micromips@loc-swap.d: Likewise. + * gas/mips/micromips@loc-swap-dis.d: Likewise. + 2011-08-05 David S. Miller <davem@davemloft.net> * gas/sparc/hpcvis3.d: New test. diff --git a/gas/testsuite/gas/mips/micromips-trap.d b/gas/testsuite/gas/mips/micromips-trap.d index d306597..461f23b 100644 --- a/gas/testsuite/gas/mips/micromips-trap.d +++ b/gas/testsuite/gas/mips/micromips-trap.d @@ -108,10 +108,9 @@ Disassembly of section \.text: [ 0-9a-f]+: 0c56 move v0,s6 [ 0-9a-f]+: 0ec2 move s6,v0 [ 0-9a-f]+: 0016 1150 move v0,s6 -[ 0-9a-f]+: 0002 b150 move s6,v0 [ 0-9a-f]+: cfff b [0-9a-f]+ <test\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 test -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0002 b150 move s6,v0 [ 0-9a-f]+: cfff b [0-9a-f]+ <test\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 test [ 0-9a-f]+: 0c00 nop @@ -346,10 +345,9 @@ Disassembly of section \.text: [ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 41a1 ffff lui at,0xffff [ 0-9a-f]+: 5021 0001 ori at,at,0x1 -[ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 4280 fffe bc2f [0-9a-f]+ <.*\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 test -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 4280 fffe bc2f [0-9a-f]+ <.*\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 test [ 0-9a-f]+: 0c00 nop @@ -954,9 +952,8 @@ Disassembly of section \.text: [ 0-9a-f]+: 0043 994c ins v0,v1,0x5,0xf [ 0-9a-f]+: 0043 f80c ins v0,v1,0x0,0x20 [ 0-9a-f]+: 0043 ffcc ins v0,v1,0x1f,0x1 -[ 0-9a-f]+: 03fe ffcc ins ra,s8,0x1f,0x1 [ 0-9a-f]+: 4580 jr zero -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 03fe ffcc ins ra,s8,0x1f,0x1 [ 0-9a-f]+: 4582 jr v0 [ 0-9a-f]+: 0c00 nop [ 0-9a-f]+: 4583 jr v1 @@ -5182,6 +5179,8 @@ Disassembly of section \.text: [ 0-9a-f]+: 03ff 937c wait 0x3ff [ 0-9a-f]+: 03ff 8b7c syscall 0x3ff [ 0-9a-f]+: 03ff fffa cop2 0x7fffff +[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0000 0000 nop [0-9a-f]+ <fp_test>: [ 0-9a-f]+: 5400 01a0 prefx 0x0,zero\(zero\) diff --git a/gas/testsuite/gas/mips/micromips.d b/gas/testsuite/gas/mips/micromips.d index eadd591..1de9dab 100644 --- a/gas/testsuite/gas/mips/micromips.d +++ b/gas/testsuite/gas/mips/micromips.d @@ -108,10 +108,9 @@ Disassembly of section \.text: [ 0-9a-f]+: 0c56 move v0,s6 [ 0-9a-f]+: 0ec2 move s6,v0 [ 0-9a-f]+: 0016 1150 move v0,s6 -[ 0-9a-f]+: 0002 b150 move s6,v0 [ 0-9a-f]+: cfff b [0-9a-f]+ <test\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 test -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0002 b150 move s6,v0 [ 0-9a-f]+: cfff b [0-9a-f]+ <test\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 test [ 0-9a-f]+: 0c00 nop @@ -346,10 +345,9 @@ Disassembly of section \.text: [ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 41a1 ffff lui at,0xffff [ 0-9a-f]+: 5021 0001 ori at,at,0x1 -[ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 4280 fffe bc2f [0-9a-f]+ <.*\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 test -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0023 1250 and v0,v1,at [ 0-9a-f]+: 4280 fffe bc2f [0-9a-f]+ <.*\+0x[0-9a-f]+> [ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 test [ 0-9a-f]+: 0c00 nop @@ -969,9 +967,8 @@ Disassembly of section \.text: [ 0-9a-f]+: 0043 994c ins v0,v1,0x5,0xf [ 0-9a-f]+: 0043 f80c ins v0,v1,0x0,0x20 [ 0-9a-f]+: 0043 ffcc ins v0,v1,0x1f,0x1 -[ 0-9a-f]+: 03fe ffcc ins ra,s8,0x1f,0x1 [ 0-9a-f]+: 4580 jr zero -[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 03fe ffcc ins ra,s8,0x1f,0x1 [ 0-9a-f]+: 4582 jr v0 [ 0-9a-f]+: 0c00 nop [ 0-9a-f]+: 4583 jr v1 @@ -5254,6 +5251,8 @@ Disassembly of section \.text: [ 0-9a-f]+: 03ff 937c wait 0x3ff [ 0-9a-f]+: 03ff 8b7c syscall 0x3ff [ 0-9a-f]+: 03ff fffa cop2 0x7fffff +[ 0-9a-f]+: 0c00 nop +[ 0-9a-f]+: 0000 0000 nop [0-9a-f]+ <fp_test>: [ 0-9a-f]+: 5400 01a0 prefx 0x0,zero\(zero\) diff --git a/gas/testsuite/gas/mips/micromips@jal-svr4pic.d b/gas/testsuite/gas/mips/micromips@jal-svr4pic.d index 35b2ec7..75ae1fd 100644 --- a/gas/testsuite/gas/mips/micromips@jal-svr4pic.d +++ b/gas/testsuite/gas/mips/micromips@jal-svr4pic.d @@ -39,9 +39,7 @@ Disassembly of section \.text: [0-9a-f]+ <[^>]*> 03f9 4f3c jalrs t9 [ ]*[0-9a-f]+: R_MICROMIPS_JALR external_text_label [0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> ff9d 0000 lw gp,0\(sp\) ([0-9a-f]+) <[^>]*> 9400 fffe b \1 <.*> [ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 text_label -[0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> 0c00 nop +[0-9a-f]+ <[^>]*> ff9d 0000 lw gp,0\(sp\) \.\.\. diff --git a/gas/testsuite/gas/mips/micromips@loc-swap-dis.d b/gas/testsuite/gas/mips/micromips@loc-swap-dis.d index a824676..c4c5458 100644 --- a/gas/testsuite/gas/mips/micromips@loc-swap-dis.d +++ b/gas/testsuite/gas/mips/micromips@loc-swap-dis.d @@ -11,12 +11,10 @@ Disassembly of section \.text: [0-9a-f]+ <[^>]*> 0c90 move a0,s0 [0-9a-f]+ <[^>]*> 4584 jr a0 [0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> 0ff0 move ra,s0 [0-9a-f]+ <[^>]*> 4584 jr a0 -[0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> 0c90 move a0,s0 +[0-9a-f]+ <[^>]*> 0ff0 move ra,s0 [0-9a-f]+ <[^>]*> 459f jr ra -[0-9a-f]+ <[^>]*> 0c00 nop +[0-9a-f]+ <[^>]*> 0c90 move a0,s0 [0-9a-f]+ <[^>]*> 0ff0 move ra,s0 [0-9a-f]+ <[^>]*> 459f jr ra [0-9a-f]+ <[^>]*> 0c00 nop diff --git a/gas/testsuite/gas/mips/micromips@loc-swap.d b/gas/testsuite/gas/mips/micromips@loc-swap.d index 272f6ae..28fa77a 100644 --- a/gas/testsuite/gas/mips/micromips@loc-swap.d +++ b/gas/testsuite/gas/mips/micromips@loc-swap.d @@ -45,18 +45,18 @@ Raw dump of debug contents of section \.debug_line: Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7 Special opcode 35: advance Address by 2 to 0x3 and Line by 2 to 9 Special opcode 64: advance Address by 4 to 0x7 and Line by 3 to 12 - Special opcode 35: advance Address by 2 to 0x9 and Line by 2 to 14 - Special opcode 64: advance Address by 4 to 0xd and Line by 3 to 17 - Special opcode 35: advance Address by 2 to 0xf and Line by 2 to 19 - Special opcode 64: advance Address by 4 to 0x13 and Line by 3 to 22 - Special opcode 35: advance Address by 2 to 0x15 and Line by 2 to 24 - Special opcode 64: advance Address by 4 to 0x19 and Line by 3 to 27 - Special opcode 35: advance Address by 2 to 0x1b and Line by 2 to 29 - Special opcode 92: advance Address by 6 to 0x21 and Line by 3 to 32 - Special opcode 35: advance Address by 2 to 0x23 and Line by 2 to 34 - Special opcode 92: advance Address by 6 to 0x29 and Line by 3 to 37 - Special opcode 35: advance Address by 2 to 0x2b and Line by 2 to 39 - Special opcode 120: advance Address by 8 to 0x33 and Line by 3 to 42 - Special opcode 35: advance Address by 2 to 0x35 and Line by 2 to 44 - Advance PC by 23 to 0x4c + Special opcode 7: advance Address by 0 to 0x7 and Line by 2 to 14 + Special opcode 64: advance Address by 4 to 0xb and Line by 3 to 17 + Special opcode 7: advance Address by 0 to 0xb and Line by 2 to 19 + Special opcode 64: advance Address by 4 to 0xf and Line by 3 to 22 + Special opcode 35: advance Address by 2 to 0x11 and Line by 2 to 24 + Special opcode 64: advance Address by 4 to 0x15 and Line by 3 to 27 + Special opcode 35: advance Address by 2 to 0x17 and Line by 2 to 29 + Special opcode 92: advance Address by 6 to 0x1d and Line by 3 to 32 + Special opcode 35: advance Address by 2 to 0x1f and Line by 2 to 34 + Special opcode 92: advance Address by 6 to 0x25 and Line by 3 to 37 + Special opcode 35: advance Address by 2 to 0x27 and Line by 2 to 39 + Special opcode 120: advance Address by 8 to 0x2f and Line by 3 to 42 + Special opcode 35: advance Address by 2 to 0x31 and Line by 2 to 44 + Advance PC by 23 to 0x48 Extended opcode 1: End of Sequence |