/////////////////////////////////////////////////////////////////////////
//
//  Copyright (C) 2001-2012  The Bochs Project
//  Copyright (C) 2017 Google Inc.
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA B 02110-1301 USA
/////////////////////////////////////////////////////////////////////////
/*
 * flags functions
 */

#include "qemu/osdep.h"

#include "qemu-common.h"
#include "panic.h"
#include "cpu.h"
#include "x86_flags.h"
#include "x86.h"


/* this is basically bocsh code */

#define LF_SIGN_BIT     31

#define LF_BIT_SD      (0)          /* lazy Sign Flag Delta            */
#define LF_BIT_AF      (3)          /* lazy Adjust flag                */
#define LF_BIT_PDB     (8)          /* lazy Parity Delta Byte (8 bits) */
#define LF_BIT_CF      (31)         /* lazy Carry Flag                 */
#define LF_BIT_PO      (30)         /* lazy Partial Overflow = CF ^ OF */

#define LF_MASK_SD     (0x01 << LF_BIT_SD)
#define LF_MASK_AF     (0x01 << LF_BIT_AF)
#define LF_MASK_PDB    (0xFF << LF_BIT_PDB)
#define LF_MASK_CF     (0x01 << LF_BIT_CF)
#define LF_MASK_PO     (0x01 << LF_BIT_PO)

#define ADD_COUT_VEC(op1, op2, result) \
   (((op1) & (op2)) | (((op1) | (op2)) & (~(result))))

#define SUB_COUT_VEC(op1, op2, result) \
   (((~(op1)) & (op2)) | (((~(op1)) ^ (op2)) & (result)))

#define GET_ADD_OVERFLOW(op1, op2, result, mask) \
   ((((op1) ^ (result)) & ((op2) ^ (result))) & (mask))

/* ******************* */
/* OSZAPC */
/* ******************* */

/* size, carries, result */
#define SET_FLAGS_OSZAPC_SIZE(size, lf_carries, lf_result) { \
    target_ulong temp = ((lf_carries) & (LF_MASK_AF)) | \
    (((lf_carries) >> (size - 2)) << LF_BIT_PO); \
    env->hvf_emul->lflags.result = (target_ulong)(int##size##_t)(lf_result); \
    if ((size) == 64) { \
        temp = ((lf_carries) & ~(LF_MASK_PDB | LF_MASK_SD)); \
    } else if ((size) == 32) { \
        temp = ((lf_carries) & ~(LF_MASK_PDB | LF_MASK_SD)); \
    } else if ((size) == 16) { \
        temp = ((lf_carries) & (LF_MASK_AF)) | ((lf_carries) << 16); \
    } else if ((size) == 8)  { \
        temp = ((lf_carries) & (LF_MASK_AF)) | ((lf_carries) << 24); \
    } else { \
        VM_PANIC("unimplemented");  \
    } \
    env->hvf_emul->lflags.auxbits = (target_ulong)(uint32_t)temp; \
}

/* carries, result */
#define SET_FLAGS_OSZAPC_8(carries, result) \
    SET_FLAGS_OSZAPC_SIZE(8, carries, result)
#define SET_FLAGS_OSZAPC_16(carries, result) \
    SET_FLAGS_OSZAPC_SIZE(16, carries, result)
#define SET_FLAGS_OSZAPC_32(carries, result) \
    SET_FLAGS_OSZAPC_SIZE(32, carries, result)
#define SET_FLAGS_OSZAPC_64(carries, result) \
    SET_FLAGS_OSZAPC_SIZE(64, carries, result)

/* ******************* */
/* OSZAP */
/* ******************* */
/* size, carries, result */
#define SET_FLAGS_OSZAP_SIZE(size, lf_carries, lf_result) { \
    target_ulong temp = ((lf_carries) & (LF_MASK_AF)) | \
    (((lf_carries) >> (size - 2)) << LF_BIT_PO); \
    if ((size) == 64) { \
        temp = ((lf_carries) & ~(LF_MASK_PDB | LF_MASK_SD)); \
    } else if ((size) == 32) { \
        temp = ((lf_carries) & ~(LF_MASK_PDB | LF_MASK_SD)); \
    } else if ((size) == 16) { \
        temp = ((lf_carries) & (LF_MASK_AF)) | ((lf_carries) << 16); \
    } else if ((size) == 8) { \
        temp = ((lf_carries) & (LF_MASK_AF)) | ((lf_carries) << 24); \
    } else { \
        VM_PANIC("unimplemented");      \
    } \
    env->hvf_emul->lflags.result = (target_ulong)(int##size##_t)(lf_result); \
    target_ulong delta_c = (env->hvf_emul->lflags.auxbits ^ temp) & LF_MASK_CF; \
    delta_c ^= (delta_c >> 1); \
    env->hvf_emul->lflags.auxbits = (target_ulong)(uint32_t)(temp ^ delta_c); \
}

/* carries, result */
#define SET_FLAGS_OSZAP_8(carries, result) \
    SET_FLAGS_OSZAP_SIZE(8, carries, result)
#define SET_FLAGS_OSZAP_16(carries, result) \
    SET_FLAGS_OSZAP_SIZE(16, carries, result)
#define SET_FLAGS_OSZAP_32(carries, result) \
    SET_FLAGS_OSZAP_SIZE(32, carries, result)
#define SET_FLAGS_OSZAP_64(carries, result) \
    SET_FLAGS_OSZAP_SIZE(64, carries, result)

void SET_FLAGS_OxxxxC(CPUX86State *env, uint32_t new_of, uint32_t new_cf)
{
    uint32_t temp_po = new_of ^ new_cf;
    env->hvf_emul->lflags.auxbits &= ~(LF_MASK_PO | LF_MASK_CF);
    env->hvf_emul->lflags.auxbits |= (temp_po << LF_BIT_PO) |
                                     (new_cf << LF_BIT_CF);
}

void SET_FLAGS_OSZAPC_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
                            uint64_t diff)
{
    SET_FLAGS_OSZAPC_64(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
                            uint32_t diff)
{
    SET_FLAGS_OSZAPC_32(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
                            uint16_t diff)
{
    SET_FLAGS_OSZAPC_16(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
                            uint8_t diff)
{
    SET_FLAGS_OSZAPC_8(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
                            uint64_t diff)
{
    SET_FLAGS_OSZAPC_64(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
                            uint32_t diff)
{
    SET_FLAGS_OSZAPC_32(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
                            uint16_t diff)
{
    SET_FLAGS_OSZAPC_16(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAPC_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
                            uint8_t diff)
{
    SET_FLAGS_OSZAPC_8(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
                            uint64_t diff)
{
    SET_FLAGS_OSZAP_64(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
                            uint32_t diff)
{
    SET_FLAGS_OSZAP_32(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
                            uint16_t diff)
{
    SET_FLAGS_OSZAP_16(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
                            uint8_t diff)
{
    SET_FLAGS_OSZAP_8(SUB_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
                            uint64_t diff)
{
    SET_FLAGS_OSZAP_64(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
                            uint32_t diff)
{
    SET_FLAGS_OSZAP_32(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
                            uint16_t diff)
{
    SET_FLAGS_OSZAP_16(ADD_COUT_VEC(v1, v2, diff), diff);
}

void SET_FLAGS_OSZAP_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
                            uint8_t diff)
{
    SET_FLAGS_OSZAP_8(ADD_COUT_VEC(v1, v2, diff), diff);
}


void SET_FLAGS_OSZAPC_LOGIC64(CPUX86State *env, uint64_t v1, uint64_t v2,
                              uint64_t diff)
{
    SET_FLAGS_OSZAPC_64(0UL, diff);
}

void SET_FLAGS_OSZAPC_LOGIC32(CPUX86State *env, uint32_t v1, uint32_t v2,
                              uint32_t diff)
{
    SET_FLAGS_OSZAPC_32(0, diff);
}

void SET_FLAGS_OSZAPC_LOGIC16(CPUX86State *env, uint16_t v1, uint16_t v2,
                              uint16_t diff)
{
    SET_FLAGS_OSZAPC_16(0, diff);
}

void SET_FLAGS_OSZAPC_LOGIC8(CPUX86State *env, uint8_t v1, uint8_t v2,
                             uint8_t diff)
{
    SET_FLAGS_OSZAPC_8(0, diff);
}

bool get_PF(CPUX86State *env)
{
    uint32_t temp = (255 & env->hvf_emul->lflags.result);
    temp = temp ^ (255 & (env->hvf_emul->lflags.auxbits >> LF_BIT_PDB));
    temp = (temp ^ (temp >> 4)) & 0x0F;
    return (0x9669U >> temp) & 1;
}

void set_PF(CPUX86State *env, bool val)
{
    uint32_t temp = (255 & env->hvf_emul->lflags.result) ^ (!val);
    env->hvf_emul->lflags.auxbits &= ~(LF_MASK_PDB);
    env->hvf_emul->lflags.auxbits |= (temp << LF_BIT_PDB);
}

bool get_OF(CPUX86State *env)
{
    return ((env->hvf_emul->lflags.auxbits + (1U << LF_BIT_PO)) >> LF_BIT_CF) & 1;
}

bool get_CF(CPUX86State *env)
{
    return (env->hvf_emul->lflags.auxbits >> LF_BIT_CF) & 1;
}

void set_OF(CPUX86State *env, bool val)
{
    bool old_cf = get_CF(env);
    SET_FLAGS_OxxxxC(env, val, old_cf);
}

void set_CF(CPUX86State *env, bool val)
{
    bool old_of = get_OF(env);
    SET_FLAGS_OxxxxC(env, old_of, val);
}

bool get_AF(CPUX86State *env)
{
    return (env->hvf_emul->lflags.auxbits >> LF_BIT_AF) & 1;
}

void set_AF(CPUX86State *env, bool val)
{
    env->hvf_emul->lflags.auxbits &= ~(LF_MASK_AF);
    env->hvf_emul->lflags.auxbits |= val << LF_BIT_AF;
}

bool get_ZF(CPUX86State *env)
{
    return !env->hvf_emul->lflags.result;
}

void set_ZF(CPUX86State *env, bool val)
{
    if (val) {
        env->hvf_emul->lflags.auxbits ^=
         (((env->hvf_emul->lflags.result >> LF_SIGN_BIT) & 1) << LF_BIT_SD);
        /* merge the parity bits into the Parity Delta Byte */
        uint32_t temp_pdb = (255 & env->hvf_emul->lflags.result);
        env->hvf_emul->lflags.auxbits ^= (temp_pdb << LF_BIT_PDB);
        /* now zero the .result value */
        env->hvf_emul->lflags.result = 0;
    } else {
        env->hvf_emul->lflags.result |= (1 << 8);
    }
}

bool get_SF(CPUX86State *env)
{
    return ((env->hvf_emul->lflags.result >> LF_SIGN_BIT) ^
            (env->hvf_emul->lflags.auxbits >> LF_BIT_SD)) & 1;
}

void set_SF(CPUX86State *env, bool val)
{
    bool temp_sf = get_SF(env);
    env->hvf_emul->lflags.auxbits ^= (temp_sf ^ val) << LF_BIT_SD;
}

void lflags_to_rflags(CPUX86State *env)
{
    env->hvf_emul->rflags.cf = get_CF(env);
    env->hvf_emul->rflags.pf = get_PF(env);
    env->hvf_emul->rflags.af = get_AF(env);
    env->hvf_emul->rflags.zf = get_ZF(env);
    env->hvf_emul->rflags.sf = get_SF(env);
    env->hvf_emul->rflags.of = get_OF(env);
}

void rflags_to_lflags(CPUX86State *env)
{
    env->hvf_emul->lflags.auxbits = env->hvf_emul->lflags.result = 0;
    set_OF(env, env->hvf_emul->rflags.of);
    set_SF(env, env->hvf_emul->rflags.sf);
    set_ZF(env, env->hvf_emul->rflags.zf);
    set_AF(env, env->hvf_emul->rflags.af);
    set_PF(env, env->hvf_emul->rflags.pf);
    set_CF(env, env->hvf_emul->rflags.cf);
}
