struct kvm_lapic *apic = vcpu->arch.apic;
        u64 val;
 
-       if (apic_x2apic_mode(apic)) {
-               if (KVM_BUG_ON(kvm_lapic_msr_read(apic, offset, &val), vcpu->kvm))
-                       return;
-       } else {
-               val = kvm_lapic_get_reg(apic, offset);
-       }
-
        /*
         * ICR is a single 64-bit register when x2APIC is enabled.  For legacy
         * xAPIC, ICR writes need to go down the common (slightly slower) path
         * to get the upper half from ICR2.
         */
        if (apic_x2apic_mode(apic) && offset == APIC_ICR) {
+               val = kvm_lapic_get_reg64(apic, APIC_ICR);
                kvm_apic_send_ipi(apic, (u32)val, (u32)(val >> 32));
                trace_kvm_apic_write(APIC_ICR, val);
        } else {
                /* TODO: optimize to just emulate side effect w/o one more write */
+               val = kvm_lapic_get_reg(apic, offset);
                kvm_lapic_reg_write(apic, offset, (u32)val);
        }
 }