You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
3 years ago
|
#include "fh_error.h"
|
||
|
#include "fh_config.h"
|
||
3 years ago
|
#include "fh_runtime.h"
|
||
|
#include "fh_stack.h"
|
||
3 years ago
|
#include "fh_print.h"
|
||
3 years ago
|
|
||
|
/** Pop from data stack */
|
||
|
enum fh_error ds_pop(struct fh_thread_s *fh, uint32_t *out)
|
||
|
{
|
||
|
if (fh->data_stack_top == 0) {
|
||
|
LOG("DS pop UNDERFLOW");
|
||
|
return FH_ERR_DS_UNDERFLOW;
|
||
|
}
|
||
|
*out = fh->data_stack[--fh->data_stack_top];
|
||
|
LOG("DS pop %d", *out);
|
||
|
return FH_OK;
|
||
|
}
|
||
|
|
||
|
/** Pop from return stack */
|
||
|
enum fh_error rs_pop(struct fh_thread_s *fh, uint32_t *out)
|
||
|
{
|
||
|
if (fh->return_stack_top == 0) {
|
||
|
LOG("RS pop UNDERFLOW");
|
||
|
return FH_ERR_RS_UNDERFLOW;
|
||
|
}
|
||
|
*out = fh->return_stack[--fh->return_stack_top];
|
||
|
LOG("RS pop %d", *out);
|
||
|
return FH_OK;
|
||
|
}
|
||
|
|
||
|
/** Pop from control stack */
|
||
|
enum fh_error cs_pop(struct fh_thread_s *fh, uint32_t *out)
|
||
|
{
|
||
|
if (fh->control_stack_top == 0) {
|
||
|
LOG("CS pop UNDERFLOW");
|
||
|
return FH_ERR_CS_UNDERFLOW;
|
||
|
}
|
||
|
*out = fh->control_stack[--fh->control_stack_top];
|
||
|
LOG("CS pop %d", *out);
|
||
|
return FH_OK;
|
||
|
}
|
||
|
|
||
|
#define UPDATE_HWM(hwm, top) \
|
||
|
do { \
|
||
|
if((hwm) < (top)) { \
|
||
|
(hwm) = (top); \
|
||
|
} \
|
||
|
} while(0)
|
||
|
|
||
|
/** Push to data stack */
|
||
|
enum fh_error ds_push(struct fh_thread_s *fh, uint32_t in)
|
||
|
{
|
||
|
LOG("DS push %d", in);
|
||
|
if (fh->data_stack_top == DATA_STACK_DEPTH) {
|
||
|
return FH_ERR_DS_OVERFLOW;
|
||
|
}
|
||
|
fh->data_stack[fh->data_stack_top++] = in;
|
||
|
UPDATE_HWM(fh->data_stack_hwm, fh->data_stack_top);
|
||
|
return FH_OK;
|
||
|
}
|
||
|
|
||
|
/** Push to return stack */
|
||
|
enum fh_error rs_push(struct fh_thread_s *fh, uint32_t in)
|
||
|
{
|
||
|
LOG("RS push %d", in);
|
||
|
if (fh->return_stack_top == RETURN_STACK_DEPTH) {
|
||
|
return FH_ERR_RS_OVERFLOW;
|
||
|
}
|
||
|
fh->return_stack[fh->return_stack_top++] = in;
|
||
|
UPDATE_HWM(fh->return_stack_hwm, fh->return_stack_top);
|
||
|
return FH_OK;
|
||
|
}
|
||
|
|
||
|
/** Push to control stack */
|
||
|
enum fh_error cs_push(struct fh_thread_s *fh, uint32_t in)
|
||
|
{
|
||
|
LOG("CS push %d", in);
|
||
|
if (fh->control_stack_top == CONTROL_STACK_DEPTH) {
|
||
|
return FH_ERR_CS_OVERFLOW;
|
||
|
}
|
||
|
fh->control_stack[fh->control_stack_top++] = in;
|
||
|
UPDATE_HWM(fh->control_stack_hwm, fh->control_stack_top);
|
||
|
return FH_OK;
|
||
|
}
|