static inline Value * arch_6502_pull16(cpu_t *cpu, BasicBlock *bb) { Value *lo = PULL; Value *hi = PULL; return (OR(ZEXT16(lo), SHL(ZEXT16(hi), CONST16(8)))); }
// adds src + v + c and stores it in dst Value * arch_adc(cpu_t *cpu, Value *dst, Value *src, Value *v, bool plus_carry, bool plus_one, BasicBlock *bb) { Value *c; if (plus_carry) c = LOAD(cpu->ptr_C); else if (plus_one) c = CONST1(1); else c = CONST1(0); if (SIZE(v) == 8) { /* calculate intermediate result */ Value *v1 = ADD(ADD(ZEXT16(LOAD(src)), ZEXT16(v)), ZEXT16(c)); /* get C */ STORE(TRUNC1(LSHR(v1, CONST16(8))), cpu->ptr_C); /* get result */ v1 = TRUNC8(v1); if (dst) STORE(v1, dst); return v1; } else { //XXX TODO use llvm.uadd.with.overflow.* //XXX consider using it for 8 bit also, if possible printf("TODO: %s() can't do anything but 8 bits yet!\n", __func__); exit(1); } }