Lines Matching full:rvalue
186 RValue convertAtomicTempToRValue(Address addr, AggValueSlot resultSlot,
189 /// \brief Converts a rvalue to integer value.
190 llvm::Value *convertRValueToInt(RValue RVal) const;
192 RValue ConvertIntToValueOrAtomic(llvm::Value *IntVal,
197 void emitCopyIntoMemory(RValue rvalue) const;
212 RValue EmitAtomicLoad(AggValueSlot ResultSlot, SourceLocation Loc,
224 std::pair<RValue, llvm::Value *> EmitAtomicCompareExchange(
225 RValue Expected, RValue Desired,
234 const llvm::function_ref<RValue(RValue)> &UpdateOp,
238 void EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
242 Address materializeRValue(RValue rvalue) const;
274 const llvm::function_ref<RValue(RValue)> &UpdateOp,
278 const llvm::function_ref<RValue(RValue)> &UpdateOp,
281 void EmitAtomicUpdateLibcall(llvm::AtomicOrdering AO, RValue UpdateRVal,
284 void EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRal,
321 static RValue emitAtomicLibcall(CodeGenFunction &CGF,
665 Args.add(RValue::get(Val), ValTy);
668 Args.add(RValue::get(CGF.EmitCastToVoidPtr(Val)),
673 RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
695 return RValue::get(nullptr);
844 Args.add(RValue::get(llvm::ConstantInt::get(SizeTy, Size)),
848 Args.add(RValue::get(EmitCastToVoidPtr(Ptr.getPointer())),
875 Args.add(RValue::get(EmitCastToVoidPtr(Val1.getPointer())),
879 Args.add(RValue::get(Order), getContext().IntTy);
990 Args.add(RValue::get(EmitCastToVoidPtr(Dest.getPointer())),
995 Args.add(RValue::get(Order),
1003 RValue Res = emitAtomicLibcall(*this, LibCallName, RetTy, Args);
1025 return RValue::get(nullptr);
1075 return RValue::get(nullptr);
1146 return RValue::get(nullptr);
1175 RValue AtomicInfo::convertAtomicTempToRValue(Address addr,
1192 // Get RValue from temp memory as atomic for non-simple lvalues
1193 return RValue::get(CGF.Builder.CreateLoad(addr));
1208 RValue
1224 return RValue::get(CGF.EmitFromMemory(IntVal, ValueTy));
1226 return RValue::get(CGF.Builder.CreateIntToPtr(IntVal, ValTy));
1228 return RValue::get(CGF.Builder.CreateBitCast(IntVal, ValTy));
1255 Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1256 Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1258 Args.add(RValue::get(CGF.EmitCastToVoidPtr(AddForLoaded)),
1260 Args.add(RValue::get(
1304 RValue CodeGenFunction::EmitAtomicLoad(LValue LV, SourceLocation SL,
1317 RValue AtomicInfo::EmitAtomicLoad(AggValueSlot ResultSlot, SourceLocation Loc,
1341 return RValue::getAggregate(Address::invalid(), false);
1350 RValue CodeGenFunction::EmitAtomicLoad(LValue src, SourceLocation loc,
1360 void AtomicInfo::emitCopyIntoMemory(RValue rvalue) const {
1362 // If we have an r-value, the rvalue should be of the atomic type,
1365 if (rvalue.isAggregate()) {
1367 rvalue.getAggregateAddress(),
1369 (rvalue.isVolatileQualified()
1382 // Okay, store the rvalue in.
1383 if (rvalue.isScalar()) {
1384 CGF.EmitStoreOfScalar(rvalue.getScalarVal(), TempLVal, /*init*/ true);
1386 CGF.EmitStoreOfComplex(rvalue.getComplexVal(), TempLVal, /*init*/ true);
1393 Address AtomicInfo::materializeRValue(RValue rvalue) const {
1396 if (rvalue.isAggregate())
1397 return rvalue.getAggregateAddress();
1402 Atomics.emitCopyIntoMemory(rvalue);
1406 llvm::Value *AtomicInfo::convertRValueToInt(RValue RVal) const {
1458 Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1459 Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1461 Args.add(RValue::get(CGF.EmitCastToVoidPtr(ExpectedAddr)),
1463 Args.add(RValue::get(CGF.EmitCastToVoidPtr(DesiredAddr)),
1465 Args.add(RValue::get(llvm::ConstantInt::get(
1468 Args.add(RValue::get(llvm::ConstantInt::get(
1477 std::pair<RValue, llvm::Value *> AtomicInfo::EmitAtomicCompareExchange(
1478 RValue Expected, RValue Desired, llvm::AtomicOrdering Success,
1511 EmitAtomicUpdateValue(CodeGenFunction &CGF, AtomicInfo &Atomics, RValue OldRVal,
1512 const llvm::function_ref<RValue(RValue)> &UpdateOp,
1514 RValue UpRVal;
1554 RValue NewRVal = UpdateOp(UpRVal);
1565 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1594 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1626 RValue UpdateRVal, Address DesiredAddr) {
1653 RValue UpdateRVal, bool IsVolatile) {
1677 void AtomicInfo::EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRVal,
1707 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1716 void AtomicInfo::EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
1725 void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue lvalue,
1735 return EmitAtomicStore(rvalue, lvalue, AO, IsVolatile, isInit);
1743 void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
1748 assert(!rvalue.isAggregate() ||
1749 rvalue.getAggregateAddress().getElementType()
1758 atomics.emitCopyIntoMemory(rvalue);
1765 Address srcAddr = atomics.materializeRValue(rvalue);
1769 args.add(RValue::get(atomics.getAtomicSizeValue()),
1771 args.add(RValue::get(EmitCastToVoidPtr(atomics.getAtomicPointer())),
1773 args.add(RValue::get(EmitCastToVoidPtr(srcAddr.getPointer())),
1775 args.add(RValue::get(llvm::ConstantInt::get(
1783 llvm::Value *intValue = atomics.convertRValueToInt(rvalue);
1805 atomics.EmitAtomicUpdate(AO, rvalue, IsVolatile);
1810 std::pair<RValue, llvm::Value *> CodeGenFunction::EmitAtomicCompareExchange(
1811 LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc,
1830 const llvm::function_ref<RValue(RValue)> &UpdateOp, bool IsVolatile) {
1841 atomics.emitCopyIntoMemory(RValue::get(value));
1847 atomics.emitCopyIntoMemory(RValue::getComplex(value));