+ for my $ip($_->{first_statement} .. (@{$progs->{statements}}-1))
+ {
+ my $s = $progs->{statements}[$ip];
+ if($s->{op} eq 'STORE_V')
+ {
+ $globalflags[$s->{a}] |= GLOBALFLAG_P
+ if $s->{b} >= $_->{parm_start} and $s->{b} < $_->{parm_start} + $_->{locals};
+ $globalflags[$s->{a}+1] |= GLOBALFLAG_P
+ if $s->{b}+1 >= $_->{parm_start} and $s->{b}+1 < $_->{parm_start} + $_->{locals};
+ $globalflags[$s->{a}+2] |= GLOBALFLAG_P
+ if $s->{b}+2 >= $_->{parm_start} and $s->{b}+2 < $_->{parm_start} + $_->{locals};
+ }
+ elsif($s->{op} =~ /^STORE_/)
+ {
+ $globalflags[$s->{a}] |= GLOBALFLAG_P
+ if $s->{b} >= $_->{parm_start} and $s->{b} < $_->{parm_start} + $_->{locals};
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+
+ # parameter passing globals are only ever used in STORE_ instructions
+ for my $s(@{$progs->{statements}})
+ {
+ next
+ if $s->{op} =~ /^STORE_/;
+
+ my $c = checkop $s->{op};
+
+ for(qw(a b c))
+ {
+ my $type = $c->{$_};
+ next
+ unless defined $type;
+
+ my $ofs = $s->{$_};
+ if($type eq 'inglobal' || $type eq 'inglobalfunc' || $type eq 'outglobal')
+ {
+ $globalflags[$ofs] &= ~GLOBALFLAG_P;
+ }
+ if($type eq 'inglobalvec' || $type eq 'outglobalvec')
+ {
+ $globalflags[$ofs] &= ~GLOBALFLAG_P;
+ $globalflags[$ofs+1] &= ~GLOBALFLAG_P;
+ $globalflags[$ofs+2] &= ~GLOBALFLAG_P;
+ }
+ }