| 3260 | } |
| 3261 | |
| 3262 | void BeMCContext::CreateMemSet(const BeMCOperand& addr, uint8 val, int size, int align) |
| 3263 | { |
| 3264 | if ((size == 8) || (size == 4) || (size == 2) || (size == 1)) |
| 3265 | { |
| 3266 | BeType* type = NULL; |
| 3267 | BeMCOperand zeroVal; |
| 3268 | zeroVal.mImmediate = 0; |
| 3269 | |
| 3270 | switch (size) |
| 3271 | { |
| 3272 | case 8: |
| 3273 | type = mModule->mContext->GetPrimitiveType(BeTypeCode_Int64); |
| 3274 | zeroVal.mKind = BeMCOperandKind_Immediate_i64; |
| 3275 | zeroVal.mImmediate = ((int64)val << 56) | ((int64)val << 48) | ((int64)val << 40) | ((int64)val << 32) | |
| 3276 | (val << 24) | (val << 16) | (val << 8) | val; |
| 3277 | break; |
| 3278 | case 4: |
| 3279 | type = mModule->mContext->GetPrimitiveType(BeTypeCode_Int32); |
| 3280 | zeroVal.mKind = BeMCOperandKind_Immediate_i32; |
| 3281 | zeroVal.mImmediate = (val << 24) | (val << 16) | (val << 8) | val; |
| 3282 | break; |
| 3283 | case 2: |
| 3284 | type = mModule->mContext->GetPrimitiveType(BeTypeCode_Int16); |
| 3285 | zeroVal.mKind = BeMCOperandKind_Immediate_i16; |
| 3286 | zeroVal.mImmediate = (val << 8) | val; |
| 3287 | break; |
| 3288 | case 1: |
| 3289 | type = mModule->mContext->GetPrimitiveType(BeTypeCode_Int8); |
| 3290 | zeroVal.mKind = BeMCOperandKind_Immediate_i8; |
| 3291 | zeroVal.mImmediate = val; |
| 3292 | break; |
| 3293 | } |
| 3294 | |
| 3295 | auto ptrType = mModule->mContext->GetPointerTo(type); |
| 3296 | |
| 3297 | auto result = AllocVirtualReg(ptrType); |
| 3298 | CreateDefineVReg(result); |
| 3299 | auto vregInfo = GetVRegInfo(result); |
| 3300 | vregInfo->mRelTo = addr; |
| 3301 | vregInfo->mIsExpr = true; |
| 3302 | |
| 3303 | BeMCOperand dest; |
| 3304 | dest.mKind = BeMCOperandKind_VRegLoad; |
| 3305 | dest.mVRegIdx = result.mVRegIdx; |
| 3306 | |
| 3307 | AllocInst(BeMCInstKind_Mov, dest, zeroVal); |
| 3308 | return; |
| 3309 | } |
| 3310 | |
| 3311 | if (addr.IsVRegAny()) |
| 3312 | { |
| 3313 | auto vregInfo = GetVRegInfo(addr); |
| 3314 | if (!vregInfo->mIsRetVal) |
| 3315 | vregInfo->mForceMem = true; |
| 3316 | CheckForce(vregInfo); |
| 3317 | } |
| 3318 | |
| 3319 | if (size <= 256) |
nothing calls this directly
no test coverage detected