void ARMCore::thumbDataLo(uint4 opcode, uint3 ird, uint3 irm) { auto &rd = r[ird], rm = r[irm]; r[15] += 2; if(opcode == 2) { SOut r = lsl(rd, rm); bitf(true, rd = r, r); } // lsls else if(opcode == 3) { SOut r = lsr(rd, rm); bitf(true, rd = r, r); } // lsrs else if(opcode == 4) { SOut r = asr(rd, rm); bitf(true, rd = r, r); } // asrs else if(opcode == 7) { SOut r = ror(rd, rm); bitf(true, rd = r, r); } // rors else if(opcode == 9) sumf(true, rd = -rm, 0, ~rm); // negs else if(opcode == 13) bitf(true, rd = rm * rd, {rm*rd, Cf}); // muls else alu(2*opcode+1, rd, rd, {rm,Cf}); // others are same as ARM }
void ARMCore::thumbShiftImm(uint2 opcode, uint3 ird, uint3 irm, uint5 rs) { auto &rd = r[ird]; r[15] += 2; SOut r = shiftImm(irm, opcode, rs); bitf(true, rd = r, r); // lsl, lsr, asr }
void ARMCore::thumbDataImm(uint2 opcode, uint3 ird, uint8 rm) { auto &rd = r[ird], rn = rd; r[15] += 2; if(opcode == 0) bitf(true, rd = rm, {rm, Cf}); // movs if(opcode == 1) sumf(true, rn-rm, rn, ~rm); // cmps if(opcode == 2) sumf(true, rd = rn+rm, rn, rm); // adds if(opcode == 3) sumf(true, rd = rn-rm, rn, ~rm); // subs }
static void ch7006_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *drm_mode, struct drm_display_mode *adjusted_mode) { struct i2c_client *client = drm_i2c_encoder_get_client(encoder); struct ch7006_priv *priv = to_ch7006_priv(encoder); struct ch7006_encoder_params *params = &priv->params; struct ch7006_state *state = &priv->state; uint8_t *regs = state->regs; struct ch7006_mode *mode = priv->mode; struct ch7006_tv_norm_info *norm = &ch7006_tv_norms[priv->norm]; int start_active; ch7006_dbg(client, "\n"); regs[CH7006_DISPMODE] = norm->dispmode | mode->dispmode; regs[CH7006_BWIDTH] = 0; regs[CH7006_INPUT_FORMAT] = bitf(CH7006_INPUT_FORMAT_FORMAT, params->input_format); regs[CH7006_CLKMODE] = CH7006_CLKMODE_SUBC_LOCK | bitf(CH7006_CLKMODE_XCM, params->xcm) | bitf(CH7006_CLKMODE_PCM, params->pcm); if (params->clock_mode) regs[CH7006_CLKMODE] |= CH7006_CLKMODE_MASTER; if (params->clock_edge) regs[CH7006_CLKMODE] |= CH7006_CLKMODE_POS_EDGE; start_active = (drm_mode->htotal & ~0x7) - (drm_mode->hsync_start & ~0x7); regs[CH7006_POV] = bitf(CH7006_POV_START_ACTIVE_8, start_active); regs[CH7006_START_ACTIVE] = bitf(CH7006_START_ACTIVE_0, start_active); regs[CH7006_INPUT_SYNC] = 0; if (params->sync_direction) regs[CH7006_INPUT_SYNC] |= CH7006_INPUT_SYNC_OUTPUT; if (params->sync_encoding) regs[CH7006_INPUT_SYNC] |= CH7006_INPUT_SYNC_EMBEDDED; if (drm_mode->flags & DRM_MODE_FLAG_PVSYNC) regs[CH7006_INPUT_SYNC] |= CH7006_INPUT_SYNC_PVSYNC; if (drm_mode->flags & DRM_MODE_FLAG_PHSYNC) regs[CH7006_INPUT_SYNC] |= CH7006_INPUT_SYNC_PHSYNC; regs[CH7006_DETECT] = 0; regs[CH7006_BCLKOUT] = 0; regs[CH7006_SUBC_INC3] = 0; if (params->pout_level) regs[CH7006_SUBC_INC3] |= CH7006_SUBC_INC3_POUT_3_3V; regs[CH7006_SUBC_INC4] = 0; if (params->active_detect) regs[CH7006_SUBC_INC4] |= CH7006_SUBC_INC4_DS_INPUT; regs[CH7006_PLL_CONTROL] = priv->saved_state.regs[CH7006_PLL_CONTROL]; ch7006_setup_levels(encoder); ch7006_setup_subcarrier(encoder); ch7006_setup_pll(encoder); ch7006_setup_power_state(encoder); ch7006_setup_properties(encoder); ch7006_state_load(client, state); }