/*---------------------------------------------------------*\ Ficheiro: SGNBTROM.C Alteração: 03-05-96 Alterado por: A.Esteves \*---------------------------------------------------------*/ #include "datadef.h" /* CALCULO DO BIT DE SINAL */ void overf_this (void) { WORD aux[SIZE]; /* cy = alu_output ( overflow ) */ /* tag = alu_output ( sum ) */ switch (linhas) { case 111 : /* MD0 MD1 CY_IN */ tag[0] = cy[0] ^ (md0[0] ^ md1[0]); tag[1] = cy[1] ^ (md0[1] ^ md1[1]); cy[0] = ~(md0[0] ^ md1[0]) & (md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(md0[1] ^ md1[1]) & (md0[1] ^ cy[1]) & ms[1]; break; case 131 : /* MD0 NOT_MD1 CY_IN */ tag[0] = cy[0] ^ (md0[0] ^ (~md1[0])); tag[1] = cy[1] ^ (md0[1] ^ (~md1[1])); cy[0] = ~(md0[0] ^ (~md1[0])) & (md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(md0[1] ^ (~md1[1])) & (md0[1] ^ cy[1]) & ms[1]; break; case 141 : /* MD0 TAG_IN CY_IN */ aux[0] = tag[0]; aux[1] = tag[1]; tag[0] = cy[0] ^ (md0[0] ^ tag[0]); tag[1] = cy[1] ^ (md0[1] ^ tag[1]); cy[0] = ~(md0[0] ^ aux[0]) & (md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(md0[1] ^ aux[1]) & (md0[1] ^ cy[1]) & ms[1]; /* case 151 : MD0 NOT_TAG_IN CY_IN aux[0] = tag[0]; aux[1] = tag[1]; tag[0] = cy[0] ^ (md0[0] ^ (~tag[0])); tag[1] = cy[1] ^ (md0[1] ^ (~tag[1])); cy[0] = ~(md0[0] ^ (~aux[0])) & (md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(md0[1] ^ (~aux[1])) & (md0[1] ^ cy[1]) & ms[1]; break; */ case 311 : /* NOT_MD0 MD1 CY_IN */ tag[0] = cy[0] ^ (~md0[0] ^ md1[0]); tag[1] = cy[1] ^ (~md0[1] ^ md1[1]); cy[0] = ~(~md0[0] ^ md1[0]) & (~md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(~md0[1] ^ md1[1]) & (~md0[1] ^ cy[1]) & ms[1]; break; case 331 : /* NOT_MD0 NOT_MD1 CY_IN */ tag[0] = cy[0] ^ (~md0[0] ^ ~md1[0]); tag[1] = cy[1] ^ (~md0[1] ^ ~md1[1]); cy[0] = ~(~md0[0] ^ ~md1[0]) & (~md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(~md0[1] ^ ~md1[1]) & (~md0[1] ^ cy[1]) & ms[1]; break; case 341 : /* NOT_MD0 TAG_IN CY_IN */ aux[0] = tag[0]; aux[1] = tag[1]; tag[0] = cy[0] ^ (~md0[0] ^ tag[0]); tag[1] = cy[1] ^ (~md0[1] ^ tag[1]); cy[0] = ~(~md0[0] ^ aux[0]) & (~md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(~md0[1] ^ aux[1]) & (~md0[1] ^ cy[1]) & ms[1]; break; case 351 : /* NOT_MD0 NOT_TAG_IN CY_IN */ aux[0] = tag[0]; aux[1] = tag[1]; tag[0] = cy[0] ^ (~md0[0] ^ ~tag[0]); tag[1] = cy[1] ^ (~md0[1] ^ ~tag[1]); cy[0] = ~(~md0[0] ^ ~aux[0]) & (~md0[0] ^ cy[0]) & ms[0]; cy[1] = ~(~md0[1] ^ ~aux[1]) & (~md0[1] ^ cy[1]) & ms[1]; break; default: erro("\nERRO na funcao overf_this(). \n"); break; } } /*###############################################################*/ void overf_above (void) { /* cy = alu_output ( overflow ) */ /* tag = alu_output ( sum ) */ /* tag_rout -> above Isto implica que o valor da tag do PE vizinho sera' fornecido como o valor do MD1. Igual 'a funcao overf_this excepto que e' feito uma "migracao" das tags dos PEs "de cima" para os seus vizinhos. */ TagAbove(); /* Preparar as tags */ switch (linhas) /* Nao se invoca logo overf_this por questoes de validacao */ { case 141 : /* MD0 TAG_IN CY_IN */ /* case 151 : */ /* MD0 NOT_TAG_IN CY_IN */ case 341 : /* NOT_MD0 TAG_IN CY_IN */ case 351 : /* NOT_MD0 NOT_TAG_IN CY_IN */ overf_this(); break; default : erro("\nErro na funcao overf_above(). \n"); break; } } /*###############################################################*/ void overf_below (void) { /* cy = alu_output ( overflow ) */ /* tag = alu_output ( sum ) */ /* tag_rout -> below Isto implica que o valor da tag do PE vizinho sera' fornecido como o valor do MD1. Igual 'a funcao overf_this excepto que e' feito uma "migracao" das tags dos PEs "de baixo" para os seus vizinhos. */ TagBelow(); /* Preparar as tags */ switch (linhas) /* Nao se invoca logo overf_this por questoes de validacao */ { case 141 : /* MD0 TAG_IN CY_IN */ /* case 151 : */ /* MD0 NOT_TAG_IN CY_IN */ case 341 : /* NOT_MD0 TAG_IN CY_IN */ case 351 : /* NOT_MD0 NOT_TAG_IN CY_IN */ overf_this(); break; default : erro("\nErro na funcao overf_below(). \n"); break; } } /*###############################################################*/ void overf_image (void) { /* cy = alu_output ( overflow ) */ /* tag = alu_output ( sum ) */ /* tag_rout -> image Igual 'a funcao overf_this excepto que e' feito uma atribuicao dos valores vindos do VSR para a tag. */ TagImage(); /* Preparar as tags */ switch (linhas) /* Nao se invoca logo overf_this por questoes de validacao */ { case 141 : /* MD0 TAG_IN CY_IN */ /* case 151 :*/ /* MD0 NOT_TAG_IN CY_IN */ case 341 : /* NOT_MD0 TAG_IN CY_IN */ case 351 : /* NOT_MD0 NOT_TAG_IN CY_IN */ overf_this(); break; default : erro("\nErro na funcao overf_image(). \n"); break; } } /*###############################################################*/ void overfholdms (void) { /* cy = alu_output ( overflow ) */ /* tag = alu_output ( sum ) */ ms[0]=msbak[0]; /* Hold ms */ ms[1]=msbak[1]; overf_this (); /* A funcao overfholdms invoca overf_this depois de restaurar ms */ }