Lines Matching refs:RValue
186 RValue convertAtomicTempToRValue(Address addr, AggValueSlot resultSlot,
189 /// 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 *>
225 EmitAtomicCompareExchange(RValue Expected, RValue Desired,
236 const llvm::function_ref<RValue(RValue)> &UpdateOp,
240 void EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
244 Address materializeRValue(RValue rvalue) const;
275 const llvm::function_ref<RValue(RValue)> &UpdateOp,
279 const llvm::function_ref<RValue(RValue)> &UpdateOp,
282 void EmitAtomicUpdateLibcall(llvm::AtomicOrdering AO, RValue UpdateRVal,
285 void EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRal,
303 static RValue emitAtomicLibcall(CodeGenFunction &CGF,
777 Args.add(RValue::get(Val), ValTy);
780 Args.add(RValue::get(CGF.EmitCastToVoidPtr(Val)),
785 RValue
801 return RValue::get(nullptr);
1033 Args.add(RValue::get(llvm::ConstantInt::get(SizeTy, Size)),
1053 Args.add(RValue::get(CastToGenericAddrSpace(
1086 RValue::get(CastToGenericAddrSpace(
1091 Args.add(RValue::get(Order), getContext().IntTy);
1239 Args.add(RValue::get(EmitCastToVoidPtr(Dest.getPointer())),
1244 Args.add(RValue::get(Order),
1247 Args.add(RValue::get(Scope), getContext().IntTy);
1254 RValue Res = emitAtomicLibcall(*this, LibCallName, RetTy, Args);
1281 return RValue::get(nullptr);
1332 return RValue::get(nullptr);
1404 return RValue::get(nullptr);
1434 RValue AtomicInfo::convertAtomicTempToRValue(Address addr,
1451 // Get RValue from temp memory as atomic for non-simple lvalues
1452 return RValue::get(CGF.Builder.CreateLoad(addr));
1467 RValue AtomicInfo::ConvertIntToValueOrAtomic(llvm::Value *IntVal,
1483 return RValue::get(CGF.EmitFromMemory(IntVal, ValueTy));
1485 return RValue::get(CGF.Builder.CreateIntToPtr(IntVal, ValTy));
1487 return RValue::get(CGF.Builder.CreateBitCast(IntVal, ValTy));
1514 Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1515 Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1517 Args.add(RValue::get(CGF.EmitCastToVoidPtr(AddForLoaded)),
1520 RValue::get(llvm::ConstantInt::get(CGF.IntTy, (int)llvm::toCABI(AO))),
1555 RValue CodeGenFunction::EmitAtomicLoad(LValue LV, SourceLocation SL,
1568 RValue AtomicInfo::EmitAtomicLoad(AggValueSlot ResultSlot, SourceLocation Loc,
1592 return RValue::getAggregate(Address::invalid(), false);
1601 RValue CodeGenFunction::EmitAtomicLoad(LValue src, SourceLocation loc,
1611 void AtomicInfo::emitCopyIntoMemory(RValue rvalue) const {
1613 // If we have an r-value, the rvalue should be of the atomic type,
1616 if (rvalue.isAggregate()) {
1618 LValue Src = CGF.MakeAddrLValue(rvalue.getAggregateAddress(),
1620 bool IsVolatile = rvalue.isVolatileQualified() ||
1635 // Okay, store the rvalue in.
1636 if (rvalue.isScalar()) {
1637 CGF.EmitStoreOfScalar(rvalue.getScalarVal(), TempLVal, /*init*/ true);
1639 CGF.EmitStoreOfComplex(rvalue.getComplexVal(), TempLVal, /*init*/ true);
1646 Address AtomicInfo::materializeRValue(RValue rvalue) const {
1649 if (rvalue.isAggregate())
1650 return rvalue.getAggregateAddress();
1655 Atomics.emitCopyIntoMemory(rvalue);
1659 llvm::Value *AtomicInfo::convertRValueToInt(RValue RVal) const {
1711 Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1712 Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1714 Args.add(RValue::get(CGF.EmitCastToVoidPtr(ExpectedAddr)),
1716 Args.add(RValue::get(CGF.EmitCastToVoidPtr(DesiredAddr)),
1718 Args.add(RValue::get(
1721 Args.add(RValue::get(
1730 std::pair<RValue, llvm::Value *> AtomicInfo::EmitAtomicCompareExchange(
1731 RValue Expected, RValue Desired, llvm::AtomicOrdering Success,
1765 EmitAtomicUpdateValue(CodeGenFunction &CGF, AtomicInfo &Atomics, RValue OldRVal,
1766 const llvm::function_ref<RValue(RValue)> &UpdateOp,
1768 RValue UpRVal;
1809 RValue NewRVal = UpdateOp(UpRVal);
1820 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1849 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1881 RValue UpdateRVal, Address DesiredAddr) {
1907 RValue UpdateRVal, bool IsVolatile) {
1931 void AtomicInfo::EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRVal,
1961 llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1970 void AtomicInfo::EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
1979 void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue lvalue,
1989 return EmitAtomicStore(rvalue, lvalue, AO, IsVolatile, isInit);
1997 void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
2002 assert(!rvalue.isAggregate() ||
2003 rvalue.getAggregateAddress().getElementType() ==
2012 atomics.emitCopyIntoMemory(rvalue);
2019 Address srcAddr = atomics.materializeRValue(rvalue);
2023 args.add(RValue::get(atomics.getAtomicSizeValue()),
2025 args.add(RValue::get(EmitCastToVoidPtr(atomics.getAtomicPointer())),
2027 args.add(RValue::get(EmitCastToVoidPtr(srcAddr.getPointer())),
2030 RValue::get(llvm::ConstantInt::get(IntTy, (int)llvm::toCABI(AO))),
2037 llvm::Value *intValue = atomics.convertRValueToInt(rvalue);
2062 atomics.EmitAtomicUpdate(AO, rvalue, IsVolatile);
2067 std::pair<RValue, llvm::Value *> CodeGenFunction::EmitAtomicCompareExchange(
2068 LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc,
2087 const llvm::function_ref<RValue(RValue)> &UpdateOp, bool IsVolatile) {
2098 atomics.emitCopyIntoMemory(RValue::get(value));
2104 atomics.emitCopyIntoMemory(RValue::getComplex(value));