/*  Copyright (c) 2019 ACK Project.
 *  See the copyright notice in the ACK home directory,
 *  in the file "Copyright".
 *
 */
#ifndef CODE_H_
#define CODE_H_

#include "em_arith.h"
#include "em_label.h"

struct def;
struct node;
struct type;
struct desig;

void routine_label(register struct def * df);
void RomString(register struct node *nd);
void RomReal(register struct node *nd);
void BssVar(void);
arith CodeBeginBlock(register struct def *df);
void CodeEndBlock(register struct def *df, arith StackAdjustment);
void CodeExpr(register struct node *nd, register struct desig *ds,
		label true_label);
void CodeCall(register struct node *nd);
void RangeCheck(register struct type *tpl, register struct type *tpr);

/*	Generate code to push the value of the expression "nd"
    on the stack.
*/
void CodePExpr(register struct node *nd);

/*	Generate code to push the address of the designator "nd"
    on the stack.
 */
void CodeDAddress(struct node *nd);

/*	Generate code to store the expression on the stack
    into the designator "nd".
 */
void CodeDStore(register struct node *nd);

/* Generate code to convert long to int */
void Long2Int(void);
/* Generate code to convert int to long */
void Int2Long(void);
/* Generate code to convert int to real */
void Int2Real(arith size);
/* Generate code to convert real to int */
void Real2Int(void);





#endif /* CODE_H_ */