refactor to reduce repeats
This commit is contained in:
		
							parent
							
								
									bf2609c6ee
								
							
						
					
					
						commit
						29a6a3d471
					
				
							
								
								
									
										47
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										47
									
								
								src/vm.c
								
								
								
								
							| 
						 | 
				
			
			@ -14,6 +14,13 @@ const char radix_set[11] = "0123456789";
 | 
			
		|||
    return pc;                                                                 \
 | 
			
		||||
  } while (0)
 | 
			
		||||
 | 
			
		||||
#define MATH_OP(accessor, op)                                                  \
 | 
			
		||||
  do {                                                                         \
 | 
			
		||||
    memory[dest_addr].accessor =                                               \
 | 
			
		||||
        memory[src1_addr].accessor op memory[src2_addr].accessor;              \
 | 
			
		||||
    return pc;                                                                 \
 | 
			
		||||
  } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * String copy in data memory.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -47,45 +54,25 @@ uint32_t step_vm(Word *memory, uint32_t memory_size, uint32_t pc) {
 | 
			
		|||
  case OP_HALT:
 | 
			
		||||
    return 0;
 | 
			
		||||
  case OP_ADD_INT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].i + memory[src2_addr].i;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(i, +);
 | 
			
		||||
  case OP_SUB_INT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].i - memory[src2_addr].i;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(i, -);
 | 
			
		||||
  case OP_MUL_INT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].i * memory[src2_addr].i;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(i, *);
 | 
			
		||||
  case OP_DIV_INT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].i / memory[src2_addr].i;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(i, /);
 | 
			
		||||
  case OP_ADD_UINT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].u + memory[src2_addr].u;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(u, +);
 | 
			
		||||
  case OP_SUB_UINT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].u - memory[src2_addr].u;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(u, -);
 | 
			
		||||
  case OP_MUL_UINT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].u * memory[src2_addr].u;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(u, *);
 | 
			
		||||
  case OP_DIV_UINT:
 | 
			
		||||
    memory[dest_addr].u = memory[src1_addr].u / memory[src2_addr].u;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(u, /);
 | 
			
		||||
  case OP_ADD_REAL:
 | 
			
		||||
    memory[dest_addr].q = memory[src1_addr].q + memory[src2_addr].q;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(q, +);
 | 
			
		||||
  case OP_SUB_REAL:
 | 
			
		||||
    memory[dest_addr].q = memory[src1_addr].q - memory[src2_addr].q;
 | 
			
		||||
    return pc;
 | 
			
		||||
 | 
			
		||||
    MATH_OP(q, -);
 | 
			
		||||
  case OP_MUL_REAL: {
 | 
			
		||||
    int32_t a = memory[src1_addr].q;
 | 
			
		||||
    int32_t b = memory[src2_addr].q;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue