$title ('BRACKET EXPRESSION')
brexpr:

/*

  modified  4/13/81  R. Silberstein

*/

do;
$include (:f1:macro.lit)
$include (:f1:brexpr.x86)
$include (:f1:ermod.ext)
$include (:f1:exglob.ext)
$eject

/* compute index expression within brackets */

bracketexpr: proc(pt) byte public;
  dcl pt address,oper based pt operandstruc,
     (firsttype,firstreg,lasttype,lastreg) byte,
     baseregi lit '0',indexregi lit'1';

  regtyp: proc(pt1,pt2) byte;
    dcl (pt1,pt2) address,(typ based pt1,regi based pt2) byte;
    if (token.type=reg) and (token.descr=wrd) then$do
      typ=baseregi;
      regi=token.value;
      if (regi=rbp) or (regi=rbx) then return true;
      typ=indexregi;
      if (regi=rsi) or (regi=rdi) then return true;
    end$if;
    return false;
  end regtyp;

  setoperflags: proc (pt1,pt2);
    dcl (pt1,pt2) address,(typ based pt1,regi based pt2) byte;
    if typ=indexregi then$do
      oper.sflag=oper.sflag or iregbit;
      IF REGI = RDI THEN OPER.BASEINDEX = OPER.BASEINDEX OR INDEXREGBIT;
    else$do
      oper.sflag=oper.sflag or bregbit;
      IF REGI = RBP THEN OPER.BASEINDEX = OPER.BASEINDEX OR BASEREGBIT;
    end$if;
  end setoperflags;

  if not regtyp(.firsttype,.firstreg) then return false;
  call setoperflags(.firsttype,.firstreg);
  call scan;
  if specialtoken('+') then$do
    call scan;
    if not regtyp(.lasttype,.lastreg) then return false;
    if firsttype=lasttype then return false;
    call setoperflags(.lasttype,.lastreg);
    call scan;
  end$if;
  if not specialtoken(rightbracket) then return false;
  call scan;
  if (oper.sflag and segmbit) = 0 then$do
    if oper.stype=number then$do
      oper.baseindex=oper.baseindex or nooverridebit;
    end$if;
  end$if;
  oper.stype=variable;
  return true;
end bracketexpr;

end$module brexpr;
