void DoMod( void ) { stack_entry *left; union { signed_64 s; unsigned_64 u; } dummy; left = StkEntry( 1 ); BinOp( left, ExprSP ); switch( left->info.kind ) { case TK_BOOL: case TK_ENUM: case TK_CHAR: case TK_INTEGER: if( U64Test( &ExprSP->v.uint ) == 0 ) { Error( ERR_NONE, LIT_ENG( ERR_ZERO_MOD ) ); } if( (left->info.modifier & TM_MOD_MASK) == TM_UNSIGNED ) { U64Div( &left->v.uint, &ExprSP->v.uint, &dummy.u, &left->v.uint ); } else { I64Div( &left->v.sint, &ExprSP->v.sint, &dummy.s, &left->v.sint ); } break; default: Error( ERR_NONE, LIT_ENG( ERR_ILL_TYPE ) ); break; } CombineEntries( left, left, ExprSP ); }
void DoDiv( void ) { stack_entry *left; xreal re, im, mag, t1, t2; left = StkEntry( 1 ); BinOp( left, ExprSP ); switch( left->info.kind ) { case TK_BOOL: case TK_ENUM: case TK_CHAR: case TK_INTEGER: if( U64Test( &ExprSP->v.uint ) == 0 ) { Error( ERR_NONE, LIT_ENG( ERR_ZERO_DIV ) ); } if( (left->info.modifier & TM_MOD_MASK) == TM_UNSIGNED ) { U64Div( &left->v.uint, &ExprSP->v.uint, &left->v.uint, NULL ); } else { I64Div( &left->v.sint, &ExprSP->v.sint, &left->v.sint, NULL ); } break; case TK_REAL: DToLD( 0.0, &t1 ); if( LDCmp( &ExprSP->v.real, &t1 ) == 0 ) { Error( ERR_NONE, LIT_ENG( ERR_ZERO_DIV ) ); } LDDiv( &left->v.real, &ExprSP->v.real, &left->v.real ); break; case TK_COMPLEX: DToLD( 0.0, &t1 ); if( LDCmp( &ExprSP->v.cmplx.re, &t1 ) == 0 && LDCmp( &ExprSP->v.cmplx.im, &t1 ) == 0 ) { Error( ERR_NONE, LIT_ENG( ERR_ZERO_DIV ) ); } /* (a,b)/(c,d) = (ac+bd,bc-ad) / (c^2+d^2) */ LDMul( &ExprSP->v.cmplx.re, &ExprSP->v.cmplx.re, &t1 ); LDMul( &ExprSP->v.cmplx.im, &ExprSP->v.cmplx.im, &t2 ); LDAdd( &t1, &t2, &mag ); LDMul( &left->v.cmplx.re, &ExprSP->v.cmplx.re, &t1 ); LDMul( &left->v.cmplx.im, &ExprSP->v.cmplx.im, &t2 ); LDAdd( &t1, &t2, &re ); LDMul( &left->v.cmplx.im, &ExprSP->v.cmplx.re, &t1 ); LDMul( &left->v.cmplx.re, &ExprSP->v.cmplx.im, &t2 ); LDSub( &t1, &t2, &im ); LDDiv( &re, &mag, &left->v.cmplx.re ); LDDiv( &im, &mag, &left->v.cmplx.im ); break; default: Error( ERR_NONE, LIT_ENG( ERR_ILL_TYPE ) ); break; } CombineEntries( left, left, ExprSP ); }
static bool IsNullConst( TREEPTR tree ) { bool rc = false; if( tree->op.opr == OPR_PUSHINT ) { uint64 val64 = LongValue64( tree ); rc = ( U64Test( &val64 ) == 0 ); } return( rc ); }
void ProcIf( void ) { const char *start; size_t len; const char *true_start; size_t true_len; unsigned_64 res; cmd_list *cmd; bool have_true; true_len = 0; have_true = false; for( ;; ) { if( have_true ) { ChkExpr(); U64Clear( res ); } else { res = ReqU64Expr(); } if( !ScanQuote( &start, &len ) ) { Error( ERR_LOC, LIT_ENG( ERR_WANT_COMMAND_LIST ) ); } if( U64Test( &res ) != 0 ) { true_start = start; true_len = len; have_true = true; } if( ScanCmd( ElseifTab ) < 0 ) { break; } } ScanCmd( ElseTab ); /* optional else */ if( ScanQuote( &start, &len ) && !have_true ) { true_start = start; true_len = len; } ReqEOC(); if( true_len != 0 ) { cmd = AllocCmdList( true_start, true_len ); PushCmdList( cmd ); CopyInpFlags(); FreeCmdList( cmd ); } }
void ProcWhile( void ) { char *start; unsigned len; unsigned_64 res; cmd_list *cmd; res = ReqU64Expr(); if( !ScanQuote( &start, &len ) || len == 0 ) { Error( ERR_LOC, LIT( ERR_WANT_COMMAND_LIST ) ); } ReqEOC(); if( U64Test( &res ) != 0 ) { cmd = AllocCmdList( start, len ); ReScan( CmdStart ); PushCmdList( cmd ); CopyInpFlags(); FreeCmdList( cmd ); } }
OVL_EXTERN bool ConvFP6( stack_entry *entry, conv_class from ) { address tmp; tmp = DefAddrSpaceForAddr( Context.execution ); switch( from ) { case U1: case U2: case U4: case U8: if( (entry->flags & SF_CONST) && U64Test( &entry->v.uint ) == 0 ) tmp = NilAddr; //NYI: 64 bit offsets tmp.mach.offset = U32FetchTrunc( entry->v.uint ); break; case I1: case I2: case I4: case I8: if( (entry->flags & SF_CONST) && I64Test( &entry->v.sint ) == 0 ) tmp = NilAddr; //NYI: 64 bit offsets tmp.mach.offset = U32FetchTrunc( entry->v.sint ); break; case NP2: case NP4: /* near pointers already have correct segment information filled in */ tmp = entry->v.addr; break; case FP4: case FP6: case HP4: tmp = entry->v.addr; break; default: return( FALSE ); } entry->v.addr = tmp; return( TRUE ); }