Example #1
0
Value* Builder::createNot(Value* value) {
    if (value->isConstant()) {
        Value* dest = cloneValue(value);
        dest->doNot();
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_NOT, 0, allocValue(value->type));
    i->src1.setValue(value);
    return i->dest;
}
Example #2
0
Value* Builder::createTrunc(Value* value, Type type) {
    if (value->type == type) {
        return value;
    } else if (value->isConstant()) {
        Value* dest = cloneValue(value);
        dest->doTrunc(type);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_TRUNC, 0, allocValue(type));
    i->src1.setValue(value);
    return i->dest;
}
Example #3
0
Value* Builder::createNeg(Value* value) {
    ASSERT_TYPE_INTEGER(value);

    if (value->isConstant()) {
        Value* dest = cloneValue(value);
        dest->doNeg();
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_NEG, 0, allocValue(value->type));
    i->src1.setValue(value);
    return i->dest;
}
Example #4
0
Value* Builder::createFNeg(Value* value) {
    ASSERT_TYPE_FLOAT(value);

    if (value->isConstant()) {
        Value* dest = cloneValue(value);
        assert_always("Unimplemented");
        //dest->doFNeg();
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_FNEG, 0, allocValue(value->type));
    i->src1.setValue(value);
    return i->dest;
}
Example #5
0
// Comparison operations
Value* Builder::createCmp(Value* lhs, Value* rhs, CompareFlags flags) {
    ASSERT_TYPE_EQUAL(lhs, rhs);

    if (lhs->isConstant() && rhs->isConstant()) {
        Value* dest = cloneValue(lhs);
        dest->doCompare(rhs, flags);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_CMP, flags, allocValue(TYPE_I8));
    i->src1.setValue(lhs);
    i->src2.setValue(rhs);
    return i->dest;
}
Example #6
0
Value* Builder::createConvert(Value* value, Type type) {
    if (value->type == type) {
        return value;
    }
    if (value->isConstant()) {
        Value* dest = cloneValue(value);
        dest->doConvert(type);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_CONVERT, 0, allocValue(type));
    i->src1.setValue(value);
    return i->dest;
}
Example #7
0
Value* Builder::createDiv(Value* lhs, Value* rhs, ArithmeticFlags flags) {
    ASSERT_TYPE_INTEGER(lhs);
    ASSERT_TYPE_EQUAL(lhs, rhs);

    if (lhs->isConstant() && rhs->isConstant()) {
        Value* dest = cloneValue(lhs);
        dest->doDiv(rhs, flags);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_DIV, flags, allocValue(lhs->type));
    i->src1.setValue(lhs);
    i->src2.setValue(rhs);
    return i->dest;
}
Example #8
0
/******************************************************************************************
*
* Description :
*  Memovery Value에 값을 복제하여 삽입한다.
*
* void           *aValue,      - [IN]  삽입하려고하는 값의 포인터 (타입별 Raw Format)
*******************************************************************************************/ 
IDE_RC idpBase::insertMemoryRawValue(void *aValue) /* called by build() */
{
    void *sValue = NULL;
    
    // Multiple Flag Check
    IDE_TEST_RAISE( ((mAttr & IDP_ATTR_ML_MASK) == IDP_ATTR_ML_JUSTONE) &&
                    mMemVal.mCount == 1, only_one_error);
    
    // Store Count Check
    IDE_TEST_RAISE(mMemVal.mCount >= IDP_MAX_VALUE_COUNT,
                   no_more_insert);
    
    cloneValue(this, aValue, &sValue);
    
    /* Value Range Validation */
    IDE_TEST(checkRange(sValue) != IDE_SUCCESS);

    mMemVal.mVal[mMemVal.mCount++] = sValue;
    
    return IDE_SUCCESS;
    IDE_EXCEPTION(only_one_error);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insert() Error : "
                        "Property [%s] Can't Store Multiple Values.",
                        getName());
    }
    IDE_EXCEPTION(no_more_insert);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insert() Error : "
                        "Property [%s] Can't Store more than %"ID_UINT32_FMT
                        " Values.",
                        getName(), 
                        (UInt)IDP_MAX_VALUE_COUNT);
    }
    
    IDE_EXCEPTION_END;
    
    if (sValue != NULL)
    {
        iduMemMgr::freeRaw(sValue);
    }
    
    return IDE_FAILURE;
}
Example #9
0
Value* Builder::createFDiv(Value* lhs, Value* rhs) {
    ASSERT_TYPE_FLOAT(lhs);
    ASSERT_TYPE_EQUAL(lhs, rhs);

    if (lhs->isConstant() && rhs->isConstant()) {
        Value* dest = cloneValue(lhs);
        assert_always("Unimplemented");
        //dest->doDiv(rhs);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_FDIV, 0, allocValue(lhs->type));
    i->src1.setValue(lhs);
    i->src2.setValue(rhs);
    return i->dest;
}
Example #10
0
Value* Builder::createSub(Value* lhs, Value* rhs) {
    ASSERT_TYPE_INTEGER(lhs);
    ASSERT_TYPE_EQUAL(lhs, rhs);

    if (rhs->isConstantZero()) {
        return lhs;
    } else if (lhs->isConstant() && rhs->isConstant()) {
        Value* dest = cloneValue(lhs);
        dest->doSub(rhs);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_SUB, 0, allocValue(lhs->type));
    i->src1.setValue(lhs);
    i->src2.setValue(rhs);
    return i->dest;
}
Example #11
0
Value* Builder::createXor(Value* lhs, Value* rhs) {
    ASSERT_TYPE_EQUAL(lhs, rhs);

    if (lhs == rhs) {
        // TODO
    } else if (lhs->isConstantZero()) {
        return lhs;
    } else if (rhs->isConstantZero()) {
        return rhs;
    } else if (lhs->isConstant() && rhs->isConstant()) {
        Value* dest = cloneValue(lhs);
        dest->doXor(rhs);
        return dest;
    }

    Instruction* i = appendInstr(OPCODE_XOR, 0, allocValue(lhs->type));
    i->src1.setValue(lhs);
    i->src2.setValue(rhs);
    return i->dest;
}
Example #12
0
Value* Builder::createShrA(Value* value, Value* amount) {
    ASSERT_TYPE_INTEGER(value);
    ASSERT_TYPE_INTEGER(amount);

    if (amount->isConstantZero()) {
        return value;
    }
    if (value->isConstant() && amount->isConstant()) {
        Value* dest = cloneValue(value);
        dest->doShrA(amount);
        return dest;
    }
    if (amount->type != TYPE_I8) {
        amount = createTrunc(amount, TYPE_I8);
    }

    Instruction* i = appendInstr(OPCODE_SHRA, 0, allocValue(value->type));
    i->src1.setValue(value);
    i->src2.setValue(amount);
    return i->dest;
}
Example #13
0
/******************************************************************************************
*
* Description :
*  aSrc로 들어온 value source 위치에 Raw 형태의 aValue 
*  값을 복제하여 삽입한다.
*
*  SChar         *aValue,   - [IN] 삽입하려고하는 값의 포인터 (타입별 Raw Format)
*  idpValueSource aSrc      - [IN] 값을 삽입할 Source 위치
*                                  (default/env/pfile/spfile by asterisk, spfile by sid)
*******************************************************************************************/ 
IDE_RC idpBase::insertRawBySrc(void *aValue, idpValueSource aSrc) 
{
    void *sValue = NULL;    
    UInt sValueIdx;
    
    // Multiple Flag Check
    IDE_TEST_RAISE(((mAttr & IDP_ATTR_ML_MASK) == IDP_ATTR_ML_JUSTONE) &&
                   mSrcValArr[aSrc].mCount == 1, only_one_error);
    
    // Store Count Check
    IDE_TEST_RAISE(mSrcValArr[aSrc].mCount >= IDP_MAX_VALUE_COUNT,
                   no_more_insert);
    
    switch(aSrc)
    {
        case IDP_VALUE_FROM_PFILE:
            IDE_TEST_RAISE((mAttr & IDP_ATTR_SL_PFILE) != IDP_ATTR_SL_PFILE, 
                            err_cannot_set_from_pfile);
            break;
            
        case IDP_VALUE_FROM_SPFILE_BY_ASTERISK:
            IDE_TEST_RAISE((mAttr & IDP_ATTR_SL_SPFILE) != IDP_ATTR_SL_SPFILE, 
                            err_cannot_set_from_spfile);
            break;
            
        case IDP_VALUE_FROM_SPFILE_BY_SID:
            IDE_TEST_RAISE((mAttr & IDP_ATTR_SL_SPFILE) != IDP_ATTR_SL_SPFILE, 
                            err_cannot_set_from_spfile);
            break;        
        
        case IDP_VALUE_FROM_ENV:
            IDE_TEST_RAISE((mAttr & IDP_ATTR_SL_ENV) != IDP_ATTR_SL_ENV, 
                            err_cannot_set_from_env);
            break;
        
        default:
            //IDP_VALUE_FROM_DEFAULT NO CHECK 
            break;
    }

    cloneValue(this, aValue, &sValue);
    
    /* Value Range Validation */
    IDE_TEST(checkRange(aValue) != IDE_SUCCESS);
    
    sValueIdx = mSrcValArr[aSrc].mCount++;
    mSrcValArr[aSrc].mVal[sValueIdx] = aValue;
    
    return IDE_SUCCESS;
    
    IDE_EXCEPTION(only_one_error);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insert() Error : "
                        "Property [%s] Can't Store Multiple Values.",
                        getName());
    }
    IDE_EXCEPTION(no_more_insert);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insert() Error : "
                        "Property [%s] Can't Store more than %"ID_UINT32_FMT" Values.",
                        getName(), 
                        (UInt)IDP_MAX_VALUE_COUNT);
    }
    IDE_EXCEPTION(err_cannot_set_from_pfile);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insertBySrc() Error : "
                        "Property [%s] Can't set from PFILE.", 
                        getName());
    }
    IDE_EXCEPTION(err_cannot_set_from_spfile);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insertBySrc() Error : "
                        "Property [%s] Can't set from SPFILE.", 
                        getName());
    }
    IDE_EXCEPTION(err_cannot_set_from_env);
    {
        idlOS::snprintf(mErrorBuf, 
                        IDP_ERROR_BUF_SIZE, 
                        "idp insertBySrc() Error : "
                        "Property [%s] Can't set from ENV.", 
                        getName());
    }    
    IDE_EXCEPTION_END;
        
    if (sValue != NULL)
    {
        iduMemMgr::freeRaw(sValue);
    }
    
    return IDE_FAILURE;
}