Compare commits

..
Author SHA1 Message Date
Moonchild 44d17e4ee7 Replace strnlen with memchr. See code comment. 2026-08-15 10:19:41 +02:00
Moonchild 26cc7c3126 Revert "Refactor string utils in MFBT."
This reverts commit cea1b66ba5.
2026-08-15 09:49:46 +02:00
Moonchild cea1b66ba5 Refactor string utils in MFBT.
This adds an Apple carveout for strnlen for OS X < 10.7 and renames the
ToString.h header to StringUtils.h to better reflect the more generic
collection of functions in it, instead of a 1-file-1-method header.
2026-08-13 16:42:35 +02:00
130 changed files with 1126 additions and 4070 deletions

No files matched your search

@@ -276,7 +276,6 @@ NotificationController::DropMutationEvent(AccTreeMutationEvent* aEvent)
MOZ_ASSERT(hideEvent);
if (hideEvent->NeedsShutdown()) {
mDocument->UncacheChildrenInSubtree(aEvent->GetAccessible());
mDocument->ShutdownChildrenInSubtree(aEvent->GetAccessible());
}
}
-2
View File
@@ -1307,8 +1307,6 @@ DocAccessible::UnbindFromDocument(Accessible* aAccessible)
{
NS_ASSERTION(mAccessibleCache.GetWeak(aAccessible->UniqueID()),
"Unbinding the unbound accessible!");
MOZ_ASSERT(!mARIAOwnsHash.Contains(aAccessible),
"Container still lingering in mARIAOwnsHash");
// Fire focus event on accessible having DOM focus if active item was removed
// from the tree.
+1
View File
@@ -23,6 +23,7 @@ SOURCES += [
'DocAccessibleWrap.cpp',
'EnumVariant.cpp',
'HTMLTableAccessibleWrap.cpp',
'HTMLWin32ObjectAccessible.cpp',
'HyperTextAccessibleWrap.cpp',
'ImageAccessibleWrap.cpp',
'IUnknownImpl.cpp',
+1 -1
View File
@@ -26,6 +26,6 @@
global DATA_SYMBOL
%endif
SECTION .rodata data readable align=16
SECTION .rodata align=16
DATA_SYMBOL:
incbin ICU_DATA_FILE
-6
View File
@@ -6,13 +6,7 @@
.section .note.GNU-stack,"",%progbits
#endif
.global ICU_DATA_SYMBOL
#if defined(__APPLE__)
.const
#elif defined(__GNUC__) && !defined(XP_SOLARIS)
.section .rodata
#else
.data
#endif
.balign 16
ICU_DATA_SYMBOL:
.incbin ICU_DATA_FILE
-2
View File
@@ -17,8 +17,6 @@ DEFINES.update(
UCONFIG_NO_LEGACY_CONVERSION = True,
UCONFIG_NO_TRANSLITERATION = True,
UCONFIG_NO_REGULAR_EXPRESSIONS = True,
UCONFIG_NO_BREAK_ITERATION = True,
UCONFIG_NO_MF2 = True,
# We don't need to pass data to and from legacy char* APIs.
U_CHARSET_IS_UTF8 = True,
-1
View File
@@ -31,7 +31,6 @@ public:
void
Unfollow();
/* Should this be WeakRef? */
RefPtr<AbortSignal> mFollowingSignal;
};
-99
View File
@@ -5,19 +5,13 @@
#include "DocumentOrShadowRoot.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/CSSStyleSheet.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/CSSStyleSheetBinding.h"
#include "mozilla/dom/StyleSheetList.h"
#include "mozilla/dom/ToJSValue.h"
#include "nsDocument.h"
#include "nsFocusManager.h"
#include "ShadowRoot.h"
#include "XULDocument.h"
#include "nsLayoutUtils.h"
#include "nsSVGUtils.h"
#include "jsapi.h"
class nsINode;
class nsIDocument;
@@ -49,99 +43,6 @@ DocumentOrShadowRoot::EnsureDOMStyleSheets()
return *mDOMStyleSheets;
}
void
DocumentOrShadowRoot::GetAdoptedStyleSheets(
JSContext* aCx,
JS::MutableHandle<JSObject*> aResult,
ErrorResult& aRv) const
{
JS::Rooted<JS::Value> value(aCx);
if (!ToJSValue(aCx, mAdoptedStyleSheets, &value)) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return;
}
MOZ_ASSERT(value.isObject());
aResult.set(&value.toObject());
}
void
DocumentOrShadowRoot::SetAdoptedStyleSheets(
JSContext* aCx,
JS::Handle<JSObject*> aSheets,
ErrorResult& aRv)
{
bool isArray = false;
if (!JS_IsArrayObject(aCx, aSheets, &isArray)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
if (!isArray) {
aRv.ThrowTypeError<MSG_NOT_SEQUENCE>(
NS_LITERAL_STRING("DocumentOrShadowRoot.adoptedStyleSheets"));
return;
}
uint32_t length = 0;
if (!JS_GetArrayLength(aCx, aSheets, &length)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
nsIDocument* document = AsNode().OwnerDoc();
nsTArray<RefPtr<CSSStyleSheet>> newSheets;
if (!newSheets.SetCapacity(length, fallible)) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return;
}
JS::Rooted<JS::Value> value(aCx);
for (uint32_t i = 0; i < length; ++i) {
if (!JS_GetElement(aCx, aSheets, i, &value)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
if (!value.isObject()) {
aRv.ThrowTypeError<MSG_DOES_NOT_IMPLEMENT_INTERFACE>(
NS_LITERAL_STRING("Element of DocumentOrShadowRoot.adoptedStyleSheets"),
NS_LITERAL_STRING("CSSStyleSheet"));
return;
}
RefPtr<CSSStyleSheet> sheet;
nsresult rv = UnwrapObject<prototypes::id::CSSStyleSheet,
CSSStyleSheet>(&value.toObject(), sheet);
if (NS_FAILED(rv)) {
aRv.ThrowTypeError<MSG_DOES_NOT_IMPLEMENT_INTERFACE>(
NS_LITERAL_STRING("Element of DocumentOrShadowRoot.adoptedStyleSheets"),
NS_LITERAL_STRING("CSSStyleSheet"));
return;
}
if (!sheet->IsConstructed() || sheet->ConstructorDocument() != document) {
aRv.Throw(NS_ERROR_DOM_NOT_ALLOWED_ERR);
return;
}
newSheets.AppendElement(sheet);
}
nsTArray<RefPtr<CSSStyleSheet>> oldSheets;
oldSheets.SwapElements(mAdoptedStyleSheets);
mAdoptedStyleSheets.SwapElements(newSheets);
if (mKind == Kind::Document) {
static_cast<nsDocument&>(AsNode()).AdoptedStyleSheetsChanged(oldSheets,
mAdoptedStyleSheets);
return;
}
static_cast<ShadowRoot&>(AsNode()).AdoptedStyleSheetsChanged(oldSheets,
mAdoptedStyleSheets);
}
Element*
DocumentOrShadowRoot::GetElementById(const nsAString& aElementId)
{
-16
View File
@@ -11,14 +11,11 @@
#include "nsContentListDeclarations.h"
#include "nsNameSpaceManager.h"
#include "mozilla/dom/NameSpaceConstants.h"
#include "js/RootingAPI.h"
class nsContentList;
class nsINode;
namespace mozilla {
class CSSStyleSheet;
class ErrorResult;
class StyleSheet;
namespace dom {
@@ -86,18 +83,6 @@ public:
StyleSheetList& EnsureDOMStyleSheets();
void GetAdoptedStyleSheets(JSContext* aCx,
JS::MutableHandle<JSObject*> aResult,
mozilla::ErrorResult& aRv) const;
void SetAdoptedStyleSheets(JSContext* aCx,
JS::Handle<JSObject*> aSheets,
mozilla::ErrorResult& aRv);
const nsTArray<RefPtr<mozilla::CSSStyleSheet>>& AdoptedStyleSheets() const
{
return mAdoptedStyleSheets;
}
Element* GetElementById(const nsAString& aElementId);
/**
@@ -166,7 +151,6 @@ protected:
Element* GetRetargetedFocusedElement();
nsTArray<RefPtr<mozilla::StyleSheet>> mStyleSheets;
nsTArray<RefPtr<mozilla::CSSStyleSheet>> mAdoptedStyleSheets;
RefPtr<mozilla::dom::StyleSheetList> mDOMStyleSheets;
/*
+4 -53
View File
@@ -18,7 +18,6 @@
#include "mozilla/dom/StyleSheetList.h"
#include "nsXBLPrototypeBinding.h"
#include "mozilla/BasicEvents.h"
#include "mozilla/CSSStyleSheet.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/StyleSheet.h"
#include "mozilla/StyleSheetInlines.h"
@@ -31,7 +30,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(ShadowRoot)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ShadowRoot,
DocumentFragment)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMStyleSheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAdoptedStyleSheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAssociatedBinding)
for (auto iter = tmp->mIdentifierMap.ConstIter(); !iter.Done();
iter.Next()) {
@@ -44,10 +42,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ShadowRoot)
tmp->GetHost()->RemoveMutationObserver(tmp);
}
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDOMStyleSheets)
for (CSSStyleSheet* sheet : tmp->mAdoptedStyleSheets) {
sheet->RemoveAdopter(tmp);
}
tmp->mAdoptedStyleSheets.Clear();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mAssociatedBinding)
tmp->mIdentifierMap.Clear();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(DocumentFragment)
@@ -96,11 +90,6 @@ ShadowRoot::~ShadowRoot()
host->RemoveMutationObserver(this);
}
for (CSSStyleSheet* sheet : mAdoptedStyleSheets) {
sheet->RemoveAdopter(this);
}
mAdoptedStyleSheets.Clear();
UnsetFlags(NODE_IS_IN_SHADOW_TREE);
// nsINode destructor expects mSubtreeRoot == this.
@@ -281,20 +270,15 @@ ShadowRoot::InsertSheet(StyleSheet* aSheet,
linkingElement->SetStyleSheet(aSheet); // This sets the ownerNode on the sheet
MOZ_DIAGNOSTIC_ASSERT(mProtoBinding->SheetCount() ==
DocumentOrShadowRoot::SheetCount() +
mAdoptedStyleSheets.Length());
MOZ_DIAGNOSTIC_ASSERT(mProtoBinding->SheetCount() == DocumentOrShadowRoot::SheetCount());
#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
// FIXME(emilio, bug 1425759): For now we keep regular sheets duplicated;
// adopted sheets are stored as a suffix on the proto binding only.
// FIXME(emilio, bug 1425759): For now we keep them duplicated, the proto
// binding will disappear soon (tm).
{
size_t i = 0;
for (RefPtr<StyleSheet>& sheet : mStyleSheets) {
MOZ_DIAGNOSTIC_ASSERT(sheet.get() == mProtoBinding->StyleSheetAt(i++));
}
for (RefPtr<CSSStyleSheet>& sheet : mAdoptedStyleSheets) {
MOZ_DIAGNOSTIC_ASSERT(sheet.get() == mProtoBinding->StyleSheetAt(i++));
}
}
#endif
@@ -303,7 +287,7 @@ ShadowRoot::InsertSheet(StyleSheet* aSheet,
for (size_t i = 0; i <= SheetCount(); i++) {
if (i == SheetCount()) {
AppendStyleSheet(*aSheet);
mProtoBinding->InsertStyleSheetAt(i, aSheet);
mProtoBinding->AppendStyleSheet(aSheet);
break;
}
@@ -338,39 +322,6 @@ ShadowRoot::RemoveSheet(StyleSheet* aSheet)
}
}
void
ShadowRoot::AdoptedStyleSheetsChanged(
const nsTArray<RefPtr<CSSStyleSheet>>& aOldSheets,
const nsTArray<RefPtr<CSSStyleSheet>>& aNewSheets)
{
OwnerDoc()->BeginUpdate(UPDATE_STYLE);
bool applicableChange = false;
for (size_t i = 0; i < aOldSheets.Length(); ++i) {
CSSStyleSheet* sheet = aOldSheets[i];
if (aOldSheets.IndexOf(sheet) == i) {
mProtoBinding->RemoveStyleSheet(sheet);
}
applicableChange = applicableChange || sheet->IsApplicable();
sheet->RemoveAdopter(this);
}
for (size_t i = 0; i < aNewSheets.Length(); ++i) {
CSSStyleSheet* sheet = aNewSheets[i];
sheet->AddAdopter(this);
if (aNewSheets.IndexOf(sheet) == i) {
mProtoBinding->AppendStyleSheet(sheet);
}
applicableChange = applicableChange || sheet->IsApplicable();
}
if (applicableChange) {
StyleSheetChanged();
}
OwnerDoc()->EndUpdate(UPDATE_STYLE);
}
void
ShadowRoot::AddToIdTable(Element* aElement, nsIAtom* aId)
{
+1 -4
View File
@@ -21,7 +21,6 @@ class nsXBLPrototypeBinding;
namespace mozilla {
class CSSStyleSheet;
class EventChainPreVisitor;
namespace dom {
@@ -60,9 +59,6 @@ public:
// [deprecated] Shadow DOM v0
void InsertSheet(StyleSheet* aSheet, nsIContent* aLinkingContent);
void RemoveSheet(StyleSheet* aSheet);
void AdoptedStyleSheetsChanged(
const nsTArray<RefPtr<mozilla::CSSStyleSheet>>& aOldSheets,
const nsTArray<RefPtr<mozilla::CSSStyleSheet>>& aNewSheets);
StyleSheetList* StyleSheets()
{
return &DocumentOrShadowRoot::EnsureDOMStyleSheets();
@@ -177,3 +173,4 @@ protected:
} // namespace mozilla
#endif // mozilla_dom_shadowroot_h__
-2
View File
@@ -40,14 +40,12 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(Timeout)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Timeout)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mTimer)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mScriptHandler)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Timeout)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTimer)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScriptHandler)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
-16
View File
@@ -25,22 +25,6 @@ VisualViewport::~VisualViewport()
{
}
NS_IMPL_CYCLE_COLLECTION_CLASS(VisualViewport)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VisualViewport,
DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VisualViewport,
DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(VisualViewport)
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(VisualViewport, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(VisualViewport, DOMEventTargetHelper)
/* virtual */
JSObject*
VisualViewport::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
-3
View File
@@ -21,9 +21,6 @@ class VisualViewport final: public mozilla::DOMEventTargetHelper
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VisualViewport, DOMEventTargetHelper)
explicit VisualViewport(nsPIDOMWindowInner* aWindow);
explicit VisualViewport(nsIGlobalObject* aGlobal);
-60
View File
@@ -13,7 +13,6 @@
#include "mozilla/ArrayUtils.h"
#include "mozilla/AutoRestore.h"
#include "mozilla/BinarySearch.h"
#include "mozilla/CSSStyleSheet.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/EffectSet.h"
#include "mozilla/IntegerRange.h"
@@ -1403,10 +1402,6 @@ nsDocument::~nsDocument()
for (StyleSheet* sheet : mStyleSheets) {
sheet->ClearAssociatedDocument();
}
for (CSSStyleSheet* sheet : mAdoptedStyleSheets) {
sheet->RemoveAdopter(this);
}
mAdoptedStyleSheets.Clear();
for (auto& sheets : mAdditionalSheets) {
for (StyleSheet* sheet : sheets) {
sheet->ClearAssociatedDocument();
@@ -1640,7 +1635,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
// Traverse all our nsCOMArrays.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStyleSheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAdoptedStyleSheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOnDemandBuiltInUASheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPreloadingImages)
@@ -1746,11 +1740,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDocument)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDOMStyleSheets)
for (CSSStyleSheet* sheet : tmp->mAdoptedStyleSheets) {
sheet->RemoveAdopter(tmp);
}
tmp->mAdoptedStyleSheets.Clear();
if (tmp->mStyleSheetSetList) {
tmp->mStyleSheetSetList->Disconnect();
tmp->mStyleSheetSetList = nullptr;
@@ -2216,12 +2205,6 @@ nsDocument::FillStyleSet(nsStyleSet* aStyleSet)
AppendSheetsToStyleSet(aStyleSet, mAdditionalSheets[eAuthorSheet],
SheetType::Doc);
for (CSSStyleSheet* sheet : mAdoptedStyleSheets) {
if (sheet->IsApplicable()) {
aStyleSet->AppendStyleSheet(SheetType::Doc, sheet);
}
}
mStyleSetFilled = true;
}
@@ -3889,37 +3872,6 @@ nsDocument::RemoveStyleSheetFromStyleSets(StyleSheet* aSheet)
}
}
void
nsDocument::AdoptedStyleSheetsChanged(
const nsTArray<RefPtr<CSSStyleSheet>>& aOldSheets,
const nsTArray<RefPtr<CSSStyleSheet>>& aNewSheets)
{
BeginUpdate(UPDATE_STYLE);
nsCOMPtr<nsIPresShell> shell = GetShell();
nsStyleSet* styleSet = shell ? shell->StyleSet() : nullptr;
for (size_t i = 0; i < aOldSheets.Length(); ++i) {
CSSStyleSheet* sheet = aOldSheets[i];
if (styleSet && sheet->IsApplicable() &&
aOldSheets.IndexOf(sheet) == i) {
styleSet->RemoveStyleSheet(SheetType::Doc, sheet);
}
sheet->RemoveAdopter(this);
}
for (size_t i = 0; i < aNewSheets.Length(); ++i) {
CSSStyleSheet* sheet = aNewSheets[i];
sheet->AddAdopter(this);
if (styleSet && sheet->IsApplicable() &&
aNewSheets.IndexOf(sheet) == i) {
styleSet->AppendStyleSheet(SheetType::Doc, sheet);
}
}
EndUpdate(UPDATE_STYLE);
}
void
nsDocument::RemoveStyleSheet(StyleSheet* aSheet)
{
@@ -4009,18 +3961,6 @@ nsDocument::SetStyleSheetApplicableState(StyleSheet* aSheet,
} else {
RemoveStyleSheetFromStyleSets(aSheet);
}
} else if (mAdoptedStyleSheets.IndexOf(aSheet->AsConcrete()) !=
mAdoptedStyleSheets.NoIndex) {
nsCOMPtr<nsIPresShell> shell = GetShell();
if (shell) {
if (aApplicable) {
shell->StyleSet()->AppendStyleSheet(SheetType::Doc,
aSheet->AsConcrete());
} else {
shell->StyleSet()->RemoveStyleSheet(SheetType::Doc,
aSheet->AsConcrete());
}
}
}
// We have to always notify, since this will be called for sheets
-4
View File
@@ -95,7 +95,6 @@ class nsISecurityConsoleMessage;
class nsPIBoxObject;
namespace mozilla {
class CSSStyleSheet;
class EventChainPreVisitor;
namespace dom {
class BoxObject;
@@ -472,9 +471,6 @@ public:
nsTArray<RefPtr<mozilla::StyleSheet>>& aNewSheets) override;
virtual void AddStyleSheetToStyleSets(mozilla::StyleSheet* aSheet);
virtual void RemoveStyleSheetFromStyleSets(mozilla::StyleSheet* aSheet);
void AdoptedStyleSheetsChanged(
const nsTArray<RefPtr<mozilla::CSSStyleSheet>>& aOldSheets,
const nsTArray<RefPtr<mozilla::CSSStyleSheet>>& aNewSheets);
virtual void InsertStyleSheetAt(mozilla::StyleSheet* aSheet,
size_t aIndex) override;
+1 -2
View File
@@ -1738,9 +1738,8 @@ nsFocusManager::Blur(nsPIDOMWindowOuter* aWindowToClear,
if (mActiveWindow)
window->UpdateCommands(NS_LITERAL_STRING("focus"), nullptr, 0);
nsCOMPtr<nsIDocument> doc = content->GetComposedDoc();
SendFocusOrBlurEvent(eBlur, presShell,
doc, content, 1,
content->GetComposedDoc(), content, 1,
false, false, aContentToFocus);
}
+3 -21
View File
@@ -2176,7 +2176,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGlobalWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHistory)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCustomElements)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVisualViewport)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocalStorage)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionStorage)
@@ -2255,7 +2254,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindow)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocation)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mHistory)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCustomElements)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mVisualViewport)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocalStorage)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionStorage)
if (tmp->mApplicationCache) {
@@ -6164,6 +6162,7 @@ nsGlobalWindow::CheckSecurityWidthAndHeight(int32_t* aWidth, int32_t* aHeight, b
// This one is easy. Just ensure the variable is greater than 100;
if ((aWidth && *aWidth < 100) || (aHeight && *aHeight < 100)) {
// Check security state for use in determing window dimensions
if (!nsContentUtils::IsCallerChrome()) {
//sec check failed
if (aWidth && *aWidth < 100) {
@@ -6174,21 +6173,6 @@ nsGlobalWindow::CheckSecurityWidthAndHeight(int32_t* aWidth, int32_t* aHeight, b
}
}
}
// Check for the screen dimensions and keep the size in the range of the
// screen size the window is on. We allow twice the screen size because the
// size we get for a screen is not always accurate, on Wayland in particular,
// and all we need is to keep the size in a reasonable range.
nsCOMPtr<nsIDOMScreen> screen = GetScreen();
int32_t screenWidth, screenHeight;
screen->GetAvailWidth(&screenWidth);
screen->GetAvailHeight(&screenHeight);
if (aWidth && *aWidth > 2 * screenWidth) {
*aWidth = 2 * screenWidth;
}
if (aHeight && *aHeight > 2 * screenHeight) {
*aHeight = 2 * screenHeight;
}
}
// NOTE: Arguments to this function should have values in device pixels
@@ -8107,10 +8091,8 @@ nsGlobalWindow::ResizeByOuter(int32_t aWidthDif, int32_t aHeightDif,
nsIntSize cssSize(DevToCSSIntPixels(nsIntSize(width, height)));
// The deltas come from content and can be large enough to overflow a 32-bit
// add, so do the arithmetic in 64 bits and keep the result in range.
cssSize.width = int32_t(std::clamp<int64_t>(int64_t(cssSize.width) + aWidthDif, 0, INT32_MAX));
cssSize.height = int32_t(std::clamp<int64_t>(int64_t(cssSize.height) + aHeightDif, 0, INT32_MAX));
cssSize.width += aWidthDif;
cssSize.height += aHeightDif;
CheckSecurityWidthAndHeight(&cssSize.width, &cssSize.height, aCallerIsChrome);
-3
View File
@@ -46,9 +46,6 @@ nsIDocument::FindDocStyleSheetInsertionPoint(
break;
}
}
if (sheet->IsConstructed()) {
break;
}
if (sheet == GetFirstAdditionalAuthorSheet()) {
break;
}
+3 -6
View File
@@ -682,19 +682,16 @@ DataTransfer::SetDataAtInternal(const nsAString& aFormat, nsIVariant* aData,
return NS_ERROR_DOM_INDEX_SIZE_ERR;
}
nsAutoString format;
GetRealFormat(aFormat, format);
// Don't allow the custom type to be assigned.
if (format.EqualsLiteral(kCustomTypesMime)) {
if (aFormat.EqualsLiteral(kCustomTypesMime)) {
return NS_ERROR_TYPE_ERR;
}
if (!PrincipalMaySetData(format, aData, aSubjectPrincipal)) {
if (!PrincipalMaySetData(aFormat, aData, aSubjectPrincipal)) {
return NS_ERROR_DOM_SECURITY_ERR;
}
return SetDataWithPrincipal(format, aData, aIndex, aSubjectPrincipal);
return SetDataWithPrincipal(aFormat, aData, aIndex, aSubjectPrincipal);
}
void
+1 -2
View File
@@ -29,19 +29,18 @@ using namespace workers;
NS_IMPL_CYCLE_COLLECTING_ADDREF(Request)
NS_IMPL_CYCLE_COLLECTING_RELEASE(Request)
NS_IMPL_CYCLE_COLLECTION_CLASS(Request)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Request)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mHeaders)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSignal)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Request)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHeaders)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSignal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Request)
+1 -2
View File
@@ -30,12 +30,12 @@ namespace dom {
NS_IMPL_CYCLE_COLLECTING_ADDREF(Response)
NS_IMPL_CYCLE_COLLECTING_RELEASE(Response)
NS_IMPL_CYCLE_COLLECTION_CLASS(Response)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Response)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mHeaders)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSignal)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchStreamReader)
tmp->mReadableStreamBody = nullptr;
@@ -47,7 +47,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Response)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHeaders)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSignal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchStreamReader)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
-4
View File
@@ -1132,7 +1132,6 @@ void HTMLMediaElement::AbortExistingLoads()
RemoveMediaElementFromURITable();
mLoadingSrc = nullptr;
mCORSMode = CORS_NONE;
mMediaSource = nullptr;
if (mNetworkState == nsIDOMHTMLMediaElement::NETWORK_LOADING ||
@@ -1371,9 +1370,6 @@ void HTMLMediaElement::SelectResource()
// If we have a 'src' attribute, use that exclusively.
nsAutoString src;
if (mSrcAttrStream) {
// Media provider objects use local mode, so a previous URL load's CORS
// mode does not apply.
mCORSMode = CORS_NONE;
SetupSrcMediaStreamPlayback(mSrcAttrStream);
} else if (GetAttr(kNameSpaceID_None, nsGkAtoms::src, src)) {
nsCOMPtr<nsIURI> uri;
+5 -5
View File
@@ -117,6 +117,11 @@ public:
int32_t Index();
protected:
virtual ~HTMLOptionElement();
virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
/**
* Get the select content element that contains this option, this
* intentionally does not return nsresult, all we care about is if
@@ -124,11 +129,6 @@ public:
*/
HTMLSelectElement* GetSelect();
protected:
virtual ~HTMLOptionElement();
virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
bool mSelectedChanged;
bool mIsSelected;
+3 -3
View File
@@ -732,10 +732,10 @@ bool
HTMLSelectElement::MatchSelectedOptions(Element* aElement,
int32_t /* unused */,
nsIAtom* /* unused */,
void* aData)
void* /* unused*/)
{
HTMLOptionElement* option = HTMLOptionElement::FromContent(aElement);
return option && option->Selected() && option->GetSelect() == static_cast<HTMLSelectElement*>(aData);
return option && option->Selected();
}
nsIHTMLCollection*
@@ -743,7 +743,7 @@ HTMLSelectElement::SelectedOptions()
{
if (!mSelectedOptions) {
mSelectedOptions = new nsContentList(this, MatchSelectedOptions, nullptr,
this, /* deep */ true);
nullptr, /* deep */ true);
}
return mSelectedOptions;
}
-25
View File
@@ -1415,7 +1415,6 @@ BackgroundFactoryRequestChild::BackgroundFactoryRequestChild(
uint64_t aRequestedVersion)
: BackgroundRequestChildBase(aOpenRequest)
, mFactory(aFactory)
, mDatabaseActor(nullptr)
, mRequestedVersion(aRequestedVersion)
, mIsDeleteOp(aIsDeleteOp)
{
@@ -1440,15 +1439,6 @@ BackgroundFactoryRequestChild::GetOpenDBRequest() const
return static_cast<IDBOpenDBRequest*>(mRequest.get());
}
void
BackgroundFactoryRequestChild::SetDatabaseActor(BackgroundDatabaseChild* aActor)
{
AssertIsOnOwningThread();
MOZ_ASSERT(!aActor || !mDatabaseActor);
mDatabaseActor = aActor;
}
bool
BackgroundFactoryRequestChild::HandleResponse(nsresult aResponse)
{
@@ -1460,11 +1450,6 @@ BackgroundFactoryRequestChild::HandleResponse(nsresult aResponse)
DispatchErrorEvent(mRequest, aResponse);
if (mDatabaseActor) {
mDatabaseActor->ReleaseDOMObject();
MOZ_ASSERT(!mDatabaseActor);
}
return true;
}
@@ -1483,7 +1468,6 @@ BackgroundFactoryRequestChild::HandleResponse(
IDBDatabase* database = databaseActor->GetDOMObject();
if (!database) {
databaseActor->EnsureDOMObject();
MOZ_ASSERT(mDatabaseActor);
database = databaseActor->GetDOMObject();
MOZ_ASSERT(database);
@@ -1491,8 +1475,6 @@ BackgroundFactoryRequestChild::HandleResponse(
MOZ_ASSERT(!database->IsClosed());
}
MOZ_ASSERT(mDatabaseActor == databaseActor);
if (database->IsClosed()) {
// If the database was closed already, which is only possible if we fired an
// "upgradeneeded" event, then we shouldn't fire a "success" event here.
@@ -1505,7 +1487,6 @@ BackgroundFactoryRequestChild::HandleResponse(
}
databaseActor->ReleaseDOMObject();
MOZ_ASSERT(!mDatabaseActor);
return true;
}
@@ -1526,8 +1507,6 @@ BackgroundFactoryRequestChild::HandleResponse(
DispatchSuccessEvent(&helper, successEvent);
MOZ_ASSERT(!mDatabaseActor);
return true;
}
@@ -1758,8 +1737,6 @@ BackgroundDatabaseChild::EnsureDOMObject()
mDatabase = mTemporaryStrongDatabase;
mSpec.forget();
mOpenRequestActor->SetDatabaseActor(this);
}
void
@@ -1771,8 +1748,6 @@ BackgroundDatabaseChild::ReleaseDOMObject()
MOZ_ASSERT(mOpenRequestActor);
MOZ_ASSERT(mDatabase == mTemporaryStrongDatabase);
mOpenRequestActor->SetDatabaseActor(nullptr);
mOpenRequestActor = nullptr;
// This may be the final reference to the IDBDatabase object so we may end up
-17
View File
@@ -254,20 +254,6 @@ class BackgroundFactoryRequestChild final
friend class PermissionRequestParent;
RefPtr<IDBFactory> mFactory;
// Normally when opening of a database is successful, we receive a database
// actor in request response, so we can use it to call ReleaseDOMObject()
// which clears temporary strong reference to IDBDatabase.
// However, when there's an error, we don't receive a database actor and
// IDBRequest::mTransaction is already cleared (must be). So the only way how
// to call ReleaseDOMObject() is to have a back-reference to database actor.
// This creates a weak ref cycle between
// BackgroundFactoryRequestChild (using mDatabaseActor member) and
// BackgroundDatabaseChild actor (using mOpenRequestActor member).
// mDatabaseActor is set in EnsureDOMObject() and cleared in
// ReleaseDOMObject().
BackgroundDatabaseChild* mDatabaseActor;
const uint64_t mRequestedVersion;
const bool mIsDeleteOp;
@@ -285,9 +271,6 @@ private:
// Only destroyed by BackgroundFactoryChild.
~BackgroundFactoryRequestChild();
void
SetDatabaseActor(BackgroundDatabaseChild* aActor);
bool
HandleResponse(nsresult aResponse);
-4
View File
@@ -265,10 +265,6 @@ VideoData::SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
return false;
}
if (!ValidateBufferAndPicture(aBuffer, aPicture)) {
return false;
}
PlanarYCbCrData data = ConstructPlanarYCbCrData(aInfo, aBuffer, aPicture);
aVideoImage->SetDelayedConversion(true);
+7 -21
View File
@@ -187,7 +187,7 @@ public:
{
}
VideoInfo(int32_t aWidth, int32_t aHeight)
explicit VideoInfo(int32_t aWidth, int32_t aHeight)
: VideoInfo(nsIntSize(aWidth, aHeight))
{
}
@@ -201,6 +201,7 @@ public:
, mCodecSpecificConfig(new MediaByteBuffer)
, mExtraData(new MediaByteBuffer)
, mRotation(kDegree_0)
, mImageRect(nsIntRect(nsIntPoint(), aSize))
{
}
@@ -262,28 +263,15 @@ public:
nsIntRect ImageRect() const
{
if (!mImageRect) {
if (mImageRect.width < 0 || mImageRect.height < 0) {
return nsIntRect(0, 0, mImage.width, mImage.height);
}
return *mImageRect;
return mImageRect;
}
void SetImageRect(const nsIntRect& aRect)
{
mImageRect = Some(aRect);
}
void ResetImageRect() {
mImageRect.reset();
}
// Adopts an image size decoded from the bitstream. The picture rectangle is
// expressed relative to the image size, so a change in size invalidates it
// and it is discarded; an unchanged size keeps the existing rectangle.
void AdoptImageSize(const gfx::IntSize& aImage) {
if (mImage != aImage) {
ResetImageRect();
}
mImage = aImage;
mImageRect = aRect;
}
// Returned the crop rectangle scaled to aWidth/aHeight size relative to
@@ -344,11 +332,9 @@ public:
uint8_t mBitDepth = 8;
private:
friend struct IPC::ParamTraits<VideoInfo>;
// mImage may be cropped; currently only used with the WebM container.
// If unset, no cropping is to occur.
Maybe<nsIntRect> mImageRect;
// A negative width or height indicate that no cropping is to occur.
nsIntRect mImageRect;
// Indicates whether or not frames may contain alpha information.
bool mAlphaPresent = false;
+3 -2
View File
@@ -25,7 +25,7 @@ namespace IPC {
WriteParam(aMsg, aParam.mDisplay);
WriteParam(aMsg, aParam.mStereoMode);
WriteParam(aMsg, aParam.mImage);
WriteParam(aMsg, aParam.mImageRect);
WriteParam(aMsg, aParam.ImageRect());
}
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
@@ -35,7 +35,8 @@ namespace IPC {
ReadParam(aMsg, aIter, &aResult->mDisplay) &&
ReadParam(aMsg, aIter, &aResult->mStereoMode) &&
ReadParam(aMsg, aIter, &aResult->mImage) &&
ReadParam(aMsg, aIter, &aResult->mImageRect)) {
ReadParam(aMsg, aIter, &imageRect)) {
aResult->SetImageRect(imageRect);
return true;
}
return false;
@@ -847,15 +847,12 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample,
RefPtr<layers::PlanarYCbCrImage> image =
new IMFYCbCrImage(buffer, twoDBuffer);
if (!VideoData::SetVideoDataToImage(image,
mVideoInfo,
b,
pictureRegion,
false)) {
LOG("CreateBasicVideoFrame: failed to set video data to image (shmem path)");
return E_FAIL;
}
VideoData::SetVideoDataToImage(image,
mVideoInfo,
b,
pictureRegion,
false);
RefPtr<VideoData> v =
VideoData::CreateFromImage(mVideoInfo,
aStreamOffset,
@@ -307,7 +307,8 @@ H264Converter::UpdateConfigFromExtraData(MediaByteBuffer* aExtraData)
if (mp4_demuxer::H264::DecodeSPSFromExtraData(aExtraData, spsdata) &&
spsdata.pic_width > 0 && spsdata.pic_height > 0) {
mp4_demuxer::H264::EnsureSPSIsSane(spsdata);
mCurrentConfig.AdoptImageSize(gfx::IntSize(spsdata.pic_width, spsdata.pic_height));
mCurrentConfig.mImage.width = spsdata.pic_width;
mCurrentConfig.mImage.height = spsdata.pic_height;
mCurrentConfig.mDisplay.width = spsdata.display_width;
mCurrentConfig.mDisplay.height = spsdata.display_height;
}
-2
View File
@@ -18,8 +18,6 @@ interface mixin DocumentOrShadowRoot {
readonly attribute Element? activeElement;
readonly attribute StyleSheetList styleSheets;
[Throws]
attribute object adoptedStyleSheets;
readonly attribute Element? pointerLockElement;
[LenientSetter, Func="nsDocument::IsUnprefixedFullscreenEnabled"]
+2 -14
View File
@@ -294,12 +294,12 @@ nsXMLContentSink::DidBuildModel(bool aTerminated)
}
}
mDocumentChildren.Clear();
mXSLTProcessor->SetSourceContentModel(mDocument, mDocumentChildren);
// Since the processor now holds a reference to us we drop our reference
// to it to avoid owning cycles
mXSLTProcessor = nullptr;
} else {
}
else {
// Kick off layout for non-XSLT transformed documents.
// Check if we want to prettyprint
@@ -881,12 +881,6 @@ nsXMLContentSink::SetDocElement(int32_t aNameSpaceID,
if (!mDocumentChildren.IsEmpty()) {
for (nsIContent* child : mDocumentChildren) {
if (MOZ_UNLIKELY(child->GetParentNode())) {
child->Remove();
if (MOZ_UNLIKELY(child->GetParentNode())) {
return false;
}
}
mDocument->AppendChildTo(child, false);
}
mDocumentChildren.Clear();
@@ -997,12 +991,6 @@ nsXMLContentSink::HandleStartElement(const char16_t *aName,
if (!SetDocElement(nameSpaceID, localName, content) && appendContent) {
NS_ENSURE_TRUE(parent, NS_ERROR_UNEXPECTED);
if (MOZ_UNLIKELY(content->GetParentNode())) {
content->Remove();
if (MOZ_UNLIKELY(content->GetParentNode())) {
return NS_ERROR_UNEXPECTED;
}
}
parent->AppendChildTo(content, false);
}
}
+1 -1
View File
@@ -5159,7 +5159,7 @@ HTMLEditor::IsAcceptableInputEvent(WidgetGUIEvent* aGUIEvent)
// If the event is a mouse event, we need to check if the target content is
// the focused editing host or its descendant.
if (aGUIEvent->AsMouseEventBase()) {
RefPtr<nsIContent> editingHost = GetActiveEditingHost();
nsIContent* editingHost = GetActiveEditingHost();
// If there is no active editing host, we cannot handle the mouse event
// correctly.
if (!editingHost) {
+2 -5
View File
@@ -1082,9 +1082,6 @@ ChromeTooltipListener::ChromeTooltipListener(nsWebBrowser* aInBrowser,
ChromeTooltipListener::~ChromeTooltipListener()
{
if (mTooltipTimer) {
mTooltipTimer->Cancel();
}
}
// Hook up things to the chrome like context menus and tooltips, if the chrome
@@ -1332,7 +1329,7 @@ void
ChromeTooltipListener::sTooltipCallback(nsITimer* aTimer,
void* aChromeTooltipListener)
{
RefPtr<ChromeTooltipListener> self = static_cast<ChromeTooltipListener*>(aChromeTooltipListener);
auto self = static_cast<ChromeTooltipListener*>(aChromeTooltipListener);
if (self && self->mPossibleTooltipNode) {
// The actual coordinates we want to put the tooltip at are relative to the
// toplevel docshell of our mWebBrowser. We know what the screen
@@ -1377,7 +1374,7 @@ ChromeTooltipListener::sTooltipCallback(nsITimer* aTimer,
self->mPossibleTooltipNode, getter_Copies(tooltipText),
getter_Copies(directionText), &textFound);
if (self->mPossibleTooltipNode && textFound) {
if (textFound) {
nsString tipText(tooltipText);
nsString dirText(directionText);
LayoutDeviceIntPoint screenDot = widget->WidgetToScreenOffset();
@@ -358,8 +358,7 @@ gl::Error Image9::setManagedSurface(IDirect3DSurface9 *surface)
surface->GetDesc(&desc);
ASSERT(desc.Pool == D3DPOOL_MANAGED);
if ((GLsizei)desc.Width == mWidth && (GLsizei)desc.Height == mHeight &&
desc.Format == mD3DFormat)
if ((GLsizei)desc.Width == mWidth && (GLsizei)desc.Height == mHeight)
{
if (mSurface)
{
File diff suppressed because it is too large. Load diff
+3 -7
View File
@@ -632,13 +632,9 @@ NVImage::GetAsSourceSurface()
// Convert the current NV12 or NV21 data to YUV420P so that we can follow the
// logics in PlanarYCbCrImage::GetAsSourceSurface().
auto bufferLength = CheckedInt<uint32_t>(mData.mYSize.height) * mData.mYStride +
CheckedInt<uint32_t>(mData.mCbCrSize.height) * mData.mCbCrSize.width * 2;
if (!bufferLength.isValid()) {
NS_ERROR("Image buffer length exceeds integer limits.");
return nullptr;
}
uint8_t* buffer = new uint8_t[bufferLength.value()];
const int bufferLength = mData.mYSize.height * mData.mYStride +
mData.mCbCrSize.height * mData.mCbCrSize.width * 2;
uint8_t* buffer = new uint8_t[bufferLength];
Data aData = mData;
aData.mCbCrStride = aData.mCbCrSize.width;
@@ -40,7 +40,7 @@ static void SK_BLITBWMASK_NAME(const SkPixmap& dst, const SkMask& srcMask,
const uint8_t* bits = srcMask.getAddr1(cx, cy);
SK_BLITBWMASK_DEVTYPE* device = dst.SK_BLITBWMASK_GETADDR(cx, cy);
if (cx == maskLeft && clip.fRight == srcMask.fBounds.fRight && (clip.width() & 7) == 0)
if (cx == maskLeft && clip.fRight == srcMask.fBounds.fRight)
{
do {
SK_BLITBWMASK_DEVTYPE* dst = device;
+6 -5
View File
@@ -702,16 +702,17 @@ void SkScalerContext_CairoFT::generateMetrics(SkGlyph* glyph)
case FT_GLYPH_FORMAT_BITMAP:
if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
glyph->fMaskFormat = SkMask::kARGB32_Format;
} else if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY ||
isLCD(fRec)) {
glyph->fMaskFormat = SkMask::kA8_Format;
}
if (isLCD(fRec)) {
fRec.fMaskFormat = SkMask::kA8_Format;
}
if (fHaveShape) {
// Ensure filtering is preserved when the bitmap is transformed.
// Otherwise, the result will look horrifically aliased.
if (glyph->fMaskFormat == SkMask::kBW_Format) {
glyph->fMaskFormat = SkMask::kA8_Format;
if (fRec.fMaskFormat == SkMask::kBW_Format) {
fRec.fMaskFormat = SkMask::kA8_Format;
}
// Apply the shape matrix to the glyph's bounding box.
+2 -3
View File
@@ -587,9 +587,8 @@ gfxFontUtils::MapCharToGlyphFormat4(const uint8_t* aBuf, uint32_t aLength,
const AutoSwap_PRUint16* idDelta = &startCodes[segCount];
const AutoSwap_PRUint16* idRangeOffset = &idDelta[segCount];
// Sanity-check that the fixed-size arrays don't exceed the buffer or the
// current subtable.
const uint8_t* const limit = aBuf + std::min(aLength, uint32_t(cmap4->length));
// Sanity-check that the fixed-size arrays don't exceed the buffer.
const uint8_t* const limit = aBuf + aLength;
if ((const uint8_t*)(&idRangeOffset[segCount]) > limit) {
return 0; // broken font, just bail out safely
}
+1 -1
View File
@@ -2761,7 +2761,7 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, uint32_t aNextCh,
ufe->Load();
ff.CheckState(mSkipDrawing);
}
RefPtr<gfxFontEntry> pfe = ufe->GetPlatformFontEntry();
gfxFontEntry* pfe = ufe->GetPlatformFontEntry();
if (pfe && pfe->HasCharacter(aCh)) {
font = GetFontAt(i, aCh);
if (font) {
+1 -3
View File
@@ -44,8 +44,7 @@ class ExpandingMemoryStream : public ots::OTSStream {
public:
ExpandingMemoryStream(size_t initial, size_t limit)
: mLength(initial), mLimit(limit), mOff(0) {
mPtr = moz_xmalloc(initial);
std::memset(mPtr, 0, initial);
mPtr = moz_xmalloc(mLength);
}
~ExpandingMemoryStream() {
@@ -75,7 +74,6 @@ public:
newLength = mLimit;
}
mPtr = moz_xrealloc(mPtr, newLength);
std::memset(static_cast<char*>(mPtr) + mLength, 0, newLength - mLength);
mLength = newLength;
return WriteRaw(data, length);
}
+9 -9
View File
@@ -94,6 +94,8 @@ RasterImage::RasterImage(ImageURL* aURI /* = nullptr */) :
//******************************************************************************
RasterImage::~RasterImage()
{
mIsBeingDestroyed = true;
// Make sure our SourceBuffer is marked as complete. This will ensure that any
// outstanding decoders terminate.
if (!mSourceBuffer->IsComplete()) {
@@ -429,17 +431,15 @@ RasterImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey)
{
MOZ_ASSERT(mProgressTracker);
if (mIsBeingDestroyed) {
return;
}
bool animatedFramesDiscarded = aSurfaceKey.Playback() == PlaybackType::eAnimated;
RefPtr<ProgressTracker> progressTracker = mProgressTracker;
NS_DispatchToMainThread(NS_NewRunnableFunction(
[progressTracker, animatedFramesDiscarded]() -> void {
RefPtr<Image> image = progressTracker->GetImage();
if (!image) {
return;
}
static_cast<RasterImage*>(image.get())
->OnSurfaceDiscardedInternal(animatedFramesDiscarded);
RefPtr<RasterImage> image = this;
NS_DispatchToMainThread(NS_NewRunnableFunction([=]() -> void {
image->OnSurfaceDiscardedInternal(animatedFramesDiscarded);
}));
}
+3
View File
@@ -17,6 +17,7 @@
#ifndef mozilla_image_RasterImage_h
#define mozilla_image_RasterImage_h
#include "mozilla/Atomics.h"
#include "Image.h"
#include "nsCOMPtr.h"
#include "imgIContainer.h"
@@ -402,6 +403,8 @@ private: // data
// This is currently only used for statistics
int32_t mDecodeCount;
Atomic<bool> mIsBeingDestroyed{false};
// A weak pointer to our ImageContainer, which stays alive only as long as
// the layer system needs it.
WeakPtr<layers::ImageContainer> mImageContainer;
-1
View File
@@ -214,7 +214,6 @@ def update_data_file(topsrcdir):
'-DUCONFIG_NO_TRANSLITERATION ' +
'-DUCONFIG_NO_REGULAR_EXPRESSIONS ' +
'-DUCONFIG_NO_BREAK_ITERATION ' +
'-DUCONFIG_NO_MF2 ' +
'-DU_CHARSET_IS_UTF8')
})
+1
View File
@@ -7,6 +7,7 @@
#include "nsIInputStream.h"
#include "nsReadLine.h"
#include "nsStreamUtils.h"
#include <algorithm>
#include "mozilla/dom/EncodingUtils.h"
using mozilla::dom::EncodingUtils;
@@ -184,8 +184,17 @@ sub genTest {
<p>
__END__
foreach my $key (sort { $a <=> $b } keys %$hash) {
# Bug 1476304: we exclude Georgian letters U+10D0..10FF because of lack
# of widespread font support for the corresponding Mtavruli characters
# at this time (July 2018).
# This condition is to be removed once the major platforms ship with
# fonts that support U+1C90..1CBF.
my $skippedGeorgian = $whichMapping eq "upper" && $key >= 0x10D0 && $key <= 0x10FF;
print OUT "<!-- " if $skippedGeorgian;
printf OUT "&#x%04X;", $key;
print OUT " -->" if $skippedGeorgian;
print OUT " <!-- $charName{$key} -->" if exists $charName{$key};
print OUT " <!-- Temporarily skipped, see bug 1476304. -->" if $skippedGeorgian;
print OUT "\n";
}
print OUT <<__END__;
@@ -211,8 +220,17 @@ __END__
<p>
__END__
foreach my $key (sort { $a <=> $b } keys %$hash) {
# Bug 1476304: we exclude Georgian letters U+10D0..10FF because of lack
# of widespread font support for the corresponding Mtavruli characters
# at this time (July 2018).
# This condition is to be removed once the major platforms ship with
# fonts that support U+1C90..1CBF.
my $skippedGeorgian = $whichMapping eq "upper" && $key >= 0x10D0 && $key <= 0x10FF;
print OUT "<!-- " if $skippedGeorgian;
print OUT join('', map { sprintf("&#x%s;", $_) } split(/ /, $hash->{$key}));
print OUT " -->" if $skippedGeorgian;
print OUT " <!-- $charName{$key} -->" if exists $charName{$key};
print OUT " <!-- Temporarily skipped, see bug 1476304. -->" if $skippedGeorgian;
print OUT "\n";
}
print OUT <<__END__;
+3 -1
View File
@@ -54,6 +54,8 @@ class MOZ_NON_PARAM JS_PUBLIC_API(ProfilingFrameIterator)
// activation (if any) comes around.
void* savedPrevJitTop_;
JS::AutoCheckCannotGC nogc_;
static const unsigned StorageSpace = 8 * sizeof(void*);
alignas(void*) unsigned char storage_[StorageSpace];
@@ -142,7 +144,7 @@ class MOZ_NON_PARAM JS_PUBLIC_API(ProfilingFrameIterator)
void iteratorConstruct();
void iteratorDestroy();
bool iteratorDone();
} JS_HAZ_GC_INVALIDATED;
};
JS_FRIEND_API(bool)
IsProfilingEnabledForContext(JSContext* cx);
+7 -16
View File
@@ -238,21 +238,16 @@ static inline JS::Value PoisonedObjectValue(JSObject* obj);
namespace detail {
constexpr int CanonicalizedNaNSignBit = 0;
constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000ULL;
// A legacy MIPS ABI can run on hardware whose native NaN encoding does not
// match the encoding selected by the compiler. Determine the canonical NaN
// from an actual floating-point operation during JS initialization.
#if defined(__mips__) && !defined(__mips_nan2008) && \
!defined(__mips_nan_2008)
# define JS_RUNTIME_CANONICAL_NAN
extern JS_PUBLIC_DATA(uint64_t) CanonicalizedNaNBits;
#if defined(__mips__) && !defined(__mips_nan2008)
constexpr uint64_t CanonicalizedNaNSignificand = 0x7FFFFFFFFFFFFULL;
#else
constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000ULL;
#endif
constexpr uint64_t CanonicalizedNaNBits =
mozilla::SpecificNaNBits<double,
detail::CanonicalizedNaNSignBit,
detail::CanonicalizedNaNSignificand>::value;
#endif
} // namespace detail
@@ -265,7 +260,8 @@ constexpr uint64_t CanonicalizedNaNBits =
static MOZ_ALWAYS_INLINE double
GenericNaN()
{
return mozilla::BitwiseCast<double>(detail::CanonicalizedNaNBits);
return mozilla::SpecificNaN<double>(detail::CanonicalizedNaNSignBit,
detail::CanonicalizedNaNSignificand);
}
/* MSVC with PGO miscompiles this function. */
@@ -359,11 +355,6 @@ class MOZ_NON_PARAM alignas(8) Value
}
void setDouble(double d) {
#if defined(JS_RUNTIME_CANONICAL_NAN) && defined(JS_PUNBOX64)
// A non-canonical NaN can overlap the punbox64 tag space. Normalize
// it before storing it so it cannot be mistaken for a GC pointer.
d = CanonicalizeNaN(d);
#endif
// Don't assign to data.asDouble to fix a miscompilation with
// GCC 5.2.1 and 5.3.1. See bug 1312488.
data = layout(d);
+2 -8
View File
@@ -69,11 +69,7 @@ WeakRef_deref_impl(JSContext* cx, const CallArgs& args)
}
if (data->isObject()) {
// Use unbarrieredGet() to avoid barriers on potentially invalid memory.
JSObject* target = data->objectTarget.unbarrieredGet();
// Ensure pointer is not null.
// During WeakRef deref, if the target was collected, it will be nullptr.
JSObject* target = data->objectTarget.get();
if (target) {
RootedValue kept(cx, ObjectValue(*target));
if (!cx->runtime()->addWeakRefKeptObject(cx, kept))
@@ -84,9 +80,7 @@ WeakRef_deref_impl(JSContext* cx, const CallArgs& args)
}
} else {
MOZ_ASSERT(data->isSymbol());
JS::Symbol* target = data->symbolTarget.unbarrieredGet();
// Ensure pointer is not null.
JS::Symbol* target = data->symbolTarget.get();
if (target) {
RootedValue kept(cx, SymbolValue(target));
if (!cx->runtime()->addWeakRefKeptObject(cx, kept))
+3 -2
View File
@@ -1235,9 +1235,10 @@ def writeCLDRLanguageTagLikelySubtagsTest(println, data, url):
# Step 2: Lookup.
searches = ((language, script, region),
(language, script, None),
(language, None, region),
(language, None, None))
(language, script, None),
(language, None, None),
("und", script, None))
search = next(search for search in searches if search in likely_subtags)
(language_s, script_s, region_s) = search
+1 -6
View File
@@ -714,18 +714,13 @@ class GCRuntime
#endif // DEBUG
bool isInsideUnsafeRegion() { return inUnsafeRegion != 0; }
void enterUnsafeRegion() {
MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
++inUnsafeRegion;
}
void enterUnsafeRegion() { ++inUnsafeRegion; }
void leaveUnsafeRegion() {
MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
MOZ_ASSERT(inUnsafeRegion > 0);
--inUnsafeRegion;
}
void verifyIsSafeToGC() {
MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
MOZ_DIAGNOSTIC_ASSERT(!isInsideUnsafeRegion(),
"[AutoAssertNoGC] possible GC in GC-unsafe region");
}
+6 -6
View File
@@ -19,7 +19,7 @@ using namespace js;
using namespace js::gc;
static void
IterateCompartmentsArenasCellsUnbarriered(JSContext* cx, Zone* zone, void* data,
IterateCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data,
JSIterateCompartmentCallback compartmentCallback,
IterateArenaCallback arenaCallback,
IterateCellCallback cellCallback)
@@ -34,14 +34,14 @@ IterateCompartmentsArenasCellsUnbarriered(JSContext* cx, Zone* zone, void* data,
for (ArenaIter aiter(zone, thingKind); !aiter.done(); aiter.next()) {
Arena* arena = aiter.get();
(*arenaCallback)(cx, data, arena, traceKind, thingSize);
for (ArenaCellIterUnbarriered iter(arena); !iter.done(); iter.next())
for (ArenaCellIter iter(arena); !iter.done(); iter.next())
(*cellCallback)(cx, data, iter.getCell(), traceKind, thingSize);
}
}
}
void
js::IterateHeapUnbarriered(JSContext* cx, void* data,
js::IterateZonesCompartmentsArenasCells(JSContext* cx, void* data,
IterateZoneCallback zoneCallback,
JSIterateCompartmentCallback compartmentCallback,
IterateArenaCallback arenaCallback,
@@ -51,13 +51,13 @@ js::IterateHeapUnbarriered(JSContext* cx, void* data,
for (ZonesIter zone(cx, WithAtoms); !zone.done(); zone.next()) {
(*zoneCallback)(cx, data, zone);
IterateCompartmentsArenasCellsUnbarriered(cx, zone, data,
IterateCompartmentsArenasCells(cx, zone, data,
compartmentCallback, arenaCallback, cellCallback);
}
}
void
js::IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data,
js::IterateZoneCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data,
IterateZoneCallback zoneCallback,
JSIterateCompartmentCallback compartmentCallback,
IterateArenaCallback arenaCallback,
@@ -66,7 +66,7 @@ js::IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data,
AutoPrepareForTracing prop(cx, WithAtoms);
(*zoneCallback)(cx, data, zone);
IterateCompartmentsArenasCellsUnbarriered(cx, zone, data,
IterateCompartmentsArenasCells(cx, zone, data,
compartmentCallback, arenaCallback, cellCallback);
}
+4 -4
View File
@@ -902,8 +902,8 @@ class MacroAssembler : public MacroAssemblerSpecific
inline void rotateLeft(Imm32 count, Register input, Register dest) PER_SHARED_ARCH;
inline void rotateLeft(Register count, Register input, Register dest) PER_SHARED_ARCH;
inline void rotateLeft64(Imm32 count, Register64 input, Register64 dest) DEFINED_ON(x64, mips64, loongarch64);
inline void rotateLeft64(Register count, Register64 input, Register64 dest) DEFINED_ON(x64, mips64, loongarch64);
inline void rotateLeft64(Imm32 count, Register64 input, Register64 dest) DEFINED_ON(x64, loongarch64);
inline void rotateLeft64(Register count, Register64 input, Register64 dest) DEFINED_ON(x64, loongarch64);
inline void rotateLeft64(Imm32 count, Register64 input, Register64 dest, Register temp)
DEFINED_ON(x86, x64, arm, mips32, mips64, loongarch64);
inline void rotateLeft64(Register count, Register64 input, Register64 dest, Register temp)
@@ -911,8 +911,8 @@ class MacroAssembler : public MacroAssemblerSpecific
inline void rotateRight(Imm32 count, Register input, Register dest) PER_SHARED_ARCH;
inline void rotateRight(Register count, Register input, Register dest) PER_SHARED_ARCH;
inline void rotateRight64(Imm32 count, Register64 input, Register64 dest) DEFINED_ON(x64, mips64, loongarch64);
inline void rotateRight64(Register count, Register64 input, Register64 dest) DEFINED_ON(x64, mips64, loongarch64);
inline void rotateRight64(Imm32 count, Register64 input, Register64 dest) DEFINED_ON(x64, loongarch64);
inline void rotateRight64(Register count, Register64 input, Register64 dest) DEFINED_ON(x64, loongarch64);
inline void rotateRight64(Imm32 count, Register64 input, Register64 dest, Register temp)
DEFINED_ON(x86, x64, arm, mips32, mips64, loongarch64);
inline void rotateRight64(Register count, Register64 input, Register64 dest, Register temp)
@@ -16,11 +16,6 @@
namespace js {
namespace jit {
static uint32_t CountPhysBits(FloatRegisters::SetType bits) {
MOZ_ASSERT((bits & ~FloatRegisters::AllPhysMask) == 0);
return mozilla::CountPopulation32(uint32_t(bits));
}
Registers::Code Registers::FromName(const char* name) {
for (size_t i = 0; i < TotalPhys; i++) {
if (strcmp(GetName(i), name) == 0) {
@@ -42,47 +37,43 @@ FloatRegisters::Code FloatRegisters::FromName(const char* name) {
}
FloatRegisterSet FloatRegister::ReduceSetForPush(const FloatRegisterSet& s) {
SetType bits = s.bits();
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
// Exclude registers already represented by a wider alias. Higher alias banks
// are wider, so preserve only the widest live view of each physical register.
bits &= ~(bits >> (1 * FloatRegisters::TotalPhys));
bits &= ~(bits >> (2 * FloatRegisters::TotalPhys));
return FloatRegisterSet(bits);
LiveFloatRegisterSet ret;
for (FloatRegisterIterator iter(s); iter.more(); ++iter) {
ret.addUnchecked(FromCode((*iter).encoding()));
}
return ret.set();
}
uint32_t FloatRegister::GetSizeInBytes(const FloatRegisterSet& s) {
return s.size() * sizeof(FloatRegisters::RegisterContent);
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
return s.size() * sizeof(double);
}
uint32_t FloatRegister::GetPushSizeInBytes(const FloatRegisterSet& s) {
SetType all = s.bits();
SetType set128b =
(all >> (uint32_t(FloatRegisters::Simd128) * FloatRegisters::TotalPhys)) &
FloatRegisters::AllPhysMask;
SetType doubleSet =
(all >> (uint32_t(FloatRegisters::Double) * FloatRegisters::TotalPhys)) &
FloatRegisters::AllPhysMask;
SetType singleSet =
(all >> (uint32_t(FloatRegisters::Single) * FloatRegisters::TotalPhys)) &
FloatRegisters::AllPhysMask;
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
SetType set64b = doubleSet & ~set128b;
SetType set32b = singleSet & ~set64b & ~set128b;
return CountPhysBits(set128b) * (4 * sizeof(int32_t)) +
CountPhysBits(set64b) * sizeof(double) +
CountPhysBits(set32b) * sizeof(float);
return s.size() * sizeof(double);
}
uint32_t FloatRegister::getRegisterDumpOffsetInBytes() {
return encoding() * sizeof(FloatRegisters::RegisterContent);
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
return encoding() * sizeof(double);
}
bool CPUFlagsHaveBeenComputed() {
// The LoongArch64 backend does not currently gate code generation on
// optional CPU features.
// TODO(loongarch64): Add CPU flags support.
return true;
}
@@ -249,9 +249,9 @@ class FloatRegisters {
// Eight bits: (invalid << 7) | (kind << 5) | encoding
typedef uint8_t Code;
typedef FPRegisterID Encoding;
typedef unsigned __int128 SetType;
typedef uint64_t SetType;
enum Kind : uint8_t { Double, Single, Simd128, NumTypes };
enum Kind : uint8_t { Double, Single, NumTypes };
static constexpr Code Invalid = 0x80;
@@ -285,11 +285,7 @@ class FloatRegisters {
<< (uint32_t(Single) * TotalPhys);
static const SetType SpreadDouble = SetType(1)
<< (uint32_t(Double) * TotalPhys);
static const SetType SpreadSimd128 = SetType(1)
<< (uint32_t(Simd128) * TotalPhys);
static const SetType SpreadScalar = SpreadSingle | SpreadDouble;
static const SetType SpreadVector = SpreadSimd128;
static const SetType Spread = SpreadScalar | SpreadVector;
static const SetType Spread = SpreadSingle | SpreadDouble;
static const SetType AllPhysMask = ((SetType(1) << TotalPhys) - 1);
static const SetType AllMask = AllPhysMask * Spread;
@@ -297,16 +293,13 @@ class FloatRegisters {
static const SetType AllDoubleMask = AllPhysMask * SpreadDouble;
static const SetType NoneMask = SetType(0);
// LoongArch64 callee-saved floating-point registers are f24-f31.
// TODO(loongarch64): Much less than ARM64 here.
static const SetType NonVolatileMask =
((SetType(1) << FloatRegisters::f24) |
(SetType(1) << FloatRegisters::f25) |
(SetType(1) << FloatRegisters::f26) |
(SetType(1) << FloatRegisters::f27) |
(SetType(1) << FloatRegisters::f28) |
(SetType(1) << FloatRegisters::f29) |
(SetType(1) << FloatRegisters::f30) |
(SetType(1) << FloatRegisters::f31)) * Spread;
SetType((1 << FloatRegisters::f24) | (1 << FloatRegisters::f25) |
(1 << FloatRegisters::f26) | (1 << FloatRegisters::f27) |
(1 << FloatRegisters::f28) | (1 << FloatRegisters::f29) |
(1 << FloatRegisters::f30) | (1 << FloatRegisters::f31)) *
Spread;
static const SetType VolatileMask = AllMask & ~NonVolatileMask;
@@ -324,8 +317,6 @@ class FloatRegisters {
union RegisterContent {
float s;
double d;
int32_t i4[4];
float s4[4];
};
static constexpr Encoding encoding(Code c) {
@@ -368,35 +359,26 @@ struct FloatRegister {
typedef Codes::SetType SetType;
static uint32_t SetSize(SetType x) {
static_assert(sizeof(SetType) == 16, "SetType must be 128 bits");
static_assert(sizeof(SetType) == 8, "SetType must be 64 bits");
x |= x >> FloatRegisters::TotalPhys;
x |= x >> (2 * FloatRegisters::TotalPhys);
x &= FloatRegisters::AllPhysMask;
return mozilla::CountPopulation32(x);
}
static uint32_t FirstBit(SetType x) {
MOZ_ASSERT(x != 0);
uint64_t low = uint64_t(x);
if (low) {
return mozilla::CountTrailingZeroes64(low);
}
return 64 + mozilla::CountTrailingZeroes64(uint64_t(x >> 64));
static_assert(sizeof(SetType) == 8, "SetType");
return mozilla::CountTrailingZeroes64(x);
}
static uint32_t LastBit(SetType x) {
MOZ_ASSERT(x != 0);
uint64_t high = uint64_t(x >> 64);
if (high) {
return 127 - mozilla::CountLeadingZeroes64(high);
}
return 63 - mozilla::CountLeadingZeroes64(uint64_t(x));
static_assert(sizeof(SetType) == 8, "SetType");
return 63 - mozilla::CountLeadingZeroes64(x);
}
private:
// These fields only hold valid values: an invalid register is always
// represented as a valid encoding and kind with the invalid_ bit set.
uint8_t encoding_; // 32 encodings
uint8_t kind_; // Double, Single, Simd128
uint8_t kind_; // Double, Single; more later
bool invalid_;
typedef Codes::Kind Kind;
@@ -405,8 +387,6 @@ struct FloatRegister {
union RegisterContent {
float s;
double d;
int32_t i4[4];
float s4[4];
};
constexpr FloatRegister(Encoding encoding, Kind kind)
@@ -437,7 +417,7 @@ struct FloatRegister {
}
bool isSimd128() const {
MOZ_ASSERT(!invalid_);
return kind_ == FloatRegisters::Simd128;
return false;
}
bool isInvalid() const { return invalid_; }
@@ -450,19 +430,13 @@ struct FloatRegister {
return FloatRegister(Encoding(encoding_), FloatRegisters::Double);
}
FloatRegister doubleOverlay() const { return asDouble(); }
FloatRegister asSimd128() const {
MOZ_ASSERT(!invalid_);
return FloatRegister(Encoding(encoding_), FloatRegisters::Simd128);
}
FloatRegister asSimd128() const { MOZ_CRASH(); }
constexpr uint32_t size() const {
MOZ_ASSERT(!invalid_);
if (kind_ == FloatRegisters::Double) {
return sizeof(double);
}
if (kind_ == FloatRegisters::Simd128) {
return 4 * sizeof(int32_t);
}
MOZ_ASSERT(kind_ == FloatRegisters::Single);
return sizeof(float);
}
+17 -598
View File
@@ -49,6 +49,11 @@ void js::jit::PatchJump(CodeLocationJump& jump_, CodeLocationLabel label,
// Note this is used for inter-wasm calls and may pass arguments and results
// in floating point registers even if the system ABI does not.
// TODO(loongarch64): Inconsistent with LoongArch's calling convention.
// LoongArch floating-point parameters calling convention:
// The first eight floating-point parameters should be passed in f0-f7, and
// the other floating point parameters will be passed like integer parameters.
// But we just pass the other floating-point parameters on stack here.
ABIArg ABIArgGenerator::next(MIRType type) {
switch (type) {
case MIRType::Int32:
@@ -65,40 +70,16 @@ ABIArg ABIArgGenerator::next(MIRType type) {
}
case MIRType::Float32:
case MIRType::Double: {
if (floatRegIndex_ < NumFloatArgRegs) {
current_ = ABIArg(FloatRegister(
FloatRegisters::Encoding(floatRegIndex_ + f0.encoding()),
type == MIRType::Double ? FloatRegisters::Double
: FloatRegisters::Single));
floatRegIndex_++;
break;
}
if (intRegIndex_ == NumIntArgRegs) {
if (floatRegIndex_ == NumFloatArgRegs) {
current_ = ABIArg(stackOffset_);
stackOffset_ += sizeof(double);
break;
}
current_ = ABIArg(Register::FromCode(intRegIndex_ + a0.encoding()));
intRegIndex_++;
break;
}
case MIRType::Int8x16:
case MIRType::Int16x8:
case MIRType::Int32x4:
case MIRType::Float32x4:
case MIRType::Bool8x16:
case MIRType::Bool16x8:
case MIRType::Bool32x4: {
if (floatRegIndex_ < NumFloatArgRegs) {
current_ = ABIArg(FloatRegister(
FloatRegisters::Encoding(floatRegIndex_ + f0.encoding()),
FloatRegisters::Simd128));
floatRegIndex_++;
break;
}
stackOffset_ = AlignBytes(stackOffset_, SimdMemoryAlignment);
current_ = ABIArg(stackOffset_);
stackOffset_ += Simd128DataSize;
current_ = ABIArg(FloatRegister(
FloatRegisters::Encoding(floatRegIndex_ + f0.encoding()),
type == MIRType::Double ? FloatRegisters::Double
: FloatRegisters::Single));
floatRegIndex_++;
break;
}
default:
@@ -353,19 +334,8 @@ void AssemblerLOONGARCH64::WriteInstStatic(uint32_t x, uint32_t* dest) {
}
BufferOffset AssemblerLOONGARCH64::haltingAlign(int alignment) {
BufferOffset ret;
MOZ_ASSERT(m_buffer.isAligned(4));
MOZ_ASSERT((alignment & (alignment - 1)) == 0);
while (size() & (alignment - 1)) {
BufferOffset tmp(size());
as_break(WASM_TRAP);
if (!ret.assigned()) {
ret = tmp;
}
}
return ret;
// TODO(loongarch64): Implement a proper halting align.
return nopAlign(alignment);
}
BufferOffset AssemblerLOONGARCH64::nopAlign(int alignment) {
@@ -466,30 +436,10 @@ InstImm AssemblerLOONGARCH64::getBranchCode(JumpOrCall jumpOrCall) {
}
InstImm AssemblerLOONGARCH64::getBranchCode(Register rj, Register rd, Condition c) {
switch (c) {
case AssemblerLOONGARCH64::Equal:
return InstImm(op_beq, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::NotEqual:
return InstImm(op_bne, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::Above:
return InstImm(op_bltu, BOffImm16(0), rd, rj);
case AssemblerLOONGARCH64::AboveOrEqual:
return InstImm(op_bgeu, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::Below:
return InstImm(op_bltu, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::BelowOrEqual:
return InstImm(op_bgeu, BOffImm16(0), rd, rj);
case AssemblerLOONGARCH64::GreaterThan:
return InstImm(op_blt, BOffImm16(0), rd, rj);
case AssemblerLOONGARCH64::GreaterThanOrEqual:
return InstImm(op_bge, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::LessThan:
return InstImm(op_blt, BOffImm16(0), rj, rd);
case AssemblerLOONGARCH64::LessThanOrEqual:
return InstImm(op_bge, BOffImm16(0), rd, rj);
default:
MOZ_CRASH("Condition not supported.");
}
// beq, bne
MOZ_ASSERT(c == AssemblerLOONGARCH64::Equal || c == AssemblerLOONGARCH64::NotEqual);
return InstImm(c == AssemblerLOONGARCH64::Equal ? op_beq : op_bne, BOffImm16(0),
rj, rd);
}
InstImm AssemblerLOONGARCH64::getBranchCode(Register rj, Condition c) {
@@ -1060,118 +1010,6 @@ BufferOffset AssemblerLOONGARCH64::as_st_d(Register rd, Register rj, int32_t si1
return writeInst(InstImm(op_st_d, si12, rj, rd, 12).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vld(FloatRegister vd, Register rj,
int32_t si12) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(is_intN(si12, 12));
spew("vld %3s,%3s,0x%x", vd.name(), rj.name(), si12);
return writeInst(InstImm(op_vld, si12, rj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vst(FloatRegister vd, Register rj,
int32_t si12) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(is_intN(si12, 12));
spew("vst %3s,%3s,0x%x", vd.name(), rj.name(), si12);
return writeInst(InstImm(op_vst, si12, rj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_clt_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.clt.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_clt_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_ceq_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.ceq.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_ceq_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_cle_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.cle.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_cle_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_cun_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.cun.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_cun_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_cult_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.cult.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_cult_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_cule_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.cule.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_cule_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfcmp_cune_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfcmp.cune.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfcmp_cune_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vbitsel_v(FloatRegister vd,
FloatRegister vj,
FloatRegister vk,
FloatRegister va) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
MOZ_ASSERT(va.isSimd128());
spew("vbitsel.v %3s,%3s,%3s,%3s", vd.name(), vj.name(), vk.name(),
va.name());
return writeInst(InstReg(op_vbitsel_v, va, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vshuf_b(FloatRegister vd,
FloatRegister vj,
FloatRegister vk,
FloatRegister va) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
MOZ_ASSERT(va.isSimd128());
spew("vshuf.b %3s,%3s,%3s,%3s", vd.name(), vj.name(), vk.name(),
va.name());
return writeInst(InstReg(op_vshuf_b, va, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_ldx_b(Register rd, Register rj, Register rk) {
spew("ldx_b %3s,%3s,%3s", rd.name(), rj.name(), rk.name());
return writeInst(InstReg(op_ldx_b, rk, rj, rd).encode());
@@ -1230,425 +1068,6 @@ BufferOffset AssemblerLOONGARCH64::as_stx_d(Register rd, Register rj, Register r
return writeInst(InstReg(op_stx_d, rk, rj, rd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vldx(FloatRegister vd, Register rj,
Register rk) {
MOZ_ASSERT(vd.isSimd128());
spew("vldx %3s,%3s,%3s", vd.name(), rj.name(), rk.name());
return writeInst(InstReg(op_vldx, rk, rj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vstx(FloatRegister vd, Register rj,
Register rk) {
MOZ_ASSERT(vd.isSimd128());
spew("vstx %3s,%3s,%3s", vd.name(), rj.name(), rk.name());
return writeInst(InstReg(op_vstx, rk, rj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vseq_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vseq.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vseq_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsle_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsle.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsle_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsle_wu(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsle.wu %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsle_wu, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vslt_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vslt.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vslt_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vslt_wu(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vslt.wu %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vslt_wu, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vadd_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vadd.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vadd_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsub_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsub.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsub_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vmax_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vmax.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vmax_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vmin_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vmin.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vmin_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vmax_wu(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vmax.wu %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vmax_wu, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vmin_wu(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vmin.wu %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vmin_wu, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vmul_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vmul.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vmul_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsll_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsll.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsll_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsrl_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsrl.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsrl_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vsra_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vsra.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vsra_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vilvl_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vilvl.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vilvl_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vilvh_w(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vilvh.w %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vilvh_w, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vand_v(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vand.v %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vand_v, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vor_v(FloatRegister vd, FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vor.v %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vor_v, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vxor_v(FloatRegister vd, FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vxor.v %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vxor_v, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vnor_v(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vnor.v %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vnor_v, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vandn_v(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vandn.v %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vandn_v, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfadd_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfadd.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfadd_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfsub_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfsub.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfsub_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfmul_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfmul.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfmul_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfmax_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfmax.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfmax_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vfmin_s(FloatRegister vd,
FloatRegister vj,
FloatRegister vk) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(vk.isSimd128());
spew("vfmin.s %3s,%3s,%3s", vd.name(), vj.name(), vk.name());
return writeInst(InstReg(op_vfmin_s, vk, vj, vd).encode());
}
BufferOffset AssemblerLOONGARCH64::as_vneg_w(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vneg.w %3s,%3s", vd.name(), vj.name());
return writeInst(op_vneg_w | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vfsqrt_s(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vfsqrt.s %3s,%3s", vd.name(), vj.name());
return writeInst(op_vfsqrt_s | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vfrecip_s(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vfrecip.s %3s,%3s", vd.name(), vj.name());
return writeInst(op_vfrecip_s | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vfrsqrt_s(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vfrsqrt.s %3s,%3s", vd.name(), vj.name());
return writeInst(op_vfrsqrt_s | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vfrint_s(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vfrint.s %3s,%3s", vd.name(), vj.name());
return writeInst(op_vfrint_s | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vffint_s_w(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vffint.s.w %3s,%3s", vd.name(), vj.name());
return writeInst(op_vffint_s_w | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vftint_w_s(FloatRegister vd,
FloatRegister vj) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
spew("vftint.w.s %3s,%3s", vd.name(), vj.name());
return writeInst(op_vftint_w_s | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vreplgr2vr_w(FloatRegister vd,
Register rj) {
MOZ_ASSERT(vd.isSimd128());
spew("vreplgr2vr.w %3s,%3s", vd.name(), rj.name());
return writeInst(op_vreplgr2vr_w | RJ(rj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vreplvei_w(FloatRegister vd,
FloatRegister vj,
uint32_t lane) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(lane < 4);
spew("vreplvei.w %3s,%3s,%u", vd.name(), vj.name(), lane);
return writeInst(op_vreplvei_w | (lane << RKShift) | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vinsgr2vr_w(FloatRegister vd,
Register rj,
uint32_t lane) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(lane < 4);
spew("vinsgr2vr.w %3s,%3s,%u", vd.name(), rj.name(), lane);
return writeInst(op_vinsgr2vr_w | (lane << RKShift) | RJ(rj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vpickve2gr_w(Register rd,
FloatRegister vj,
uint32_t lane) {
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(lane < 4);
spew("vpickve2gr.w %3s,%3s,%u", rd.name(), vj.name(), lane);
return writeInst(op_vpickve2gr_w | (lane << RKShift) | FJ(vj) | RD(rd));
}
BufferOffset AssemblerLOONGARCH64::as_vpickve2gr_wu(Register rd,
FloatRegister vj,
uint32_t lane) {
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(lane < 4);
spew("vpickve2gr.wu %3s,%3s,%u", rd.name(), vj.name(), lane);
return writeInst(op_vpickve2gr_wu | (lane << RKShift) | FJ(vj) | RD(rd));
}
BufferOffset AssemblerLOONGARCH64::as_vslli_w(FloatRegister vd,
FloatRegister vj,
uint32_t imm) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(imm < 32);
spew("vslli.w %3s,%3s,%u", vd.name(), vj.name(), imm);
return writeInst(op_vslli_w | (imm << RKShift) | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vsrli_w(FloatRegister vd,
FloatRegister vj,
uint32_t imm) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(imm < 32);
spew("vsrli.w %3s,%3s,%u", vd.name(), vj.name(), imm);
return writeInst(op_vsrli_w | (imm << RKShift) | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vsrai_w(FloatRegister vd,
FloatRegister vj,
uint32_t imm) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(vj.isSimd128());
MOZ_ASSERT(imm < 32);
spew("vsrai.w %3s,%3s,%u", vd.name(), vj.name(), imm);
return writeInst(op_vsrai_w | (imm << RKShift) | FJ(vj) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_vldi(FloatRegister vd, int32_t imm) {
MOZ_ASSERT(vd.isSimd128());
MOZ_ASSERT(is_intN(imm, 13));
spew("vldi %3s,%d", vd.name(), imm);
return writeInst(op_vldi | ((imm & Imm13Mask) << Imm13Shift) | FD(vd));
}
BufferOffset AssemblerLOONGARCH64::as_ldptr_w(Register rd, Register rj,
int32_t si14) {
MOZ_ASSERT(is_intN(si14, 16) && ((si14 & 0x3) == 0));
+12 -147
View File
@@ -101,8 +101,7 @@ static constexpr Register64 ReturnReg64(ReturnReg);
static constexpr FloatRegister ReturnFloat32Reg{FloatRegisters::f0,
FloatRegisters::Single};
static constexpr FloatRegister ReturnDoubleReg = f0;
static constexpr FloatRegister ReturnSimd128Reg{FloatRegisters::f0,
FloatRegisters::Simd128};
static constexpr FloatRegister ReturnSimd128Reg = InvalidFloatReg;
static constexpr Register ScratchRegister = t7;
static constexpr Register SecondScratchReg = t8;
@@ -122,8 +121,7 @@ struct SecondScratchRegisterScope : public AutoRegisterScope {
static constexpr FloatRegister ScratchFloat32Reg{FloatRegisters::f23,
FloatRegisters::Single};
static constexpr FloatRegister ScratchDoubleReg = f23;
static constexpr FloatRegister ScratchSimd128Reg{FloatRegisters::f23,
FloatRegisters::Simd128};
static constexpr FloatRegister ScratchSimd128Reg = InvalidFloatReg;
struct ScratchFloat32Scope : public AutoFloatRegisterScope {
explicit ScratchFloat32Scope(MacroAssembler& masm)
@@ -228,20 +226,11 @@ static constexpr Register WasmJitEntryReturnScratch = t1;
static constexpr uint32_t ABIStackAlignment = 16;
static constexpr uint32_t CodeAlignment = 16;
// Does this architecture support SIMD conversions between Uint32x4 and
// Float32x4?
static constexpr bool SupportsUint32x4FloatConversions = false;
// Does this architecture support comparisons of unsigned integer vectors?
static constexpr bool SupportsUint8x16Compares = false;
static constexpr bool SupportsUint16x8Compares = false;
static constexpr bool SupportsUint32x4Compares = false;
// This boolean indicates whether we support SIMD instructions flavoured for
// this architecture or not. Rather than a method in the LIRGenerator, it is
// here such that it is accessible from the entire codebase. Once full support
// for SIMD is reached on all tier-1 platforms, this constant can be deleted.
static constexpr bool SupportsSimd = true;
static constexpr bool SupportsSimd = false;
static constexpr uint32_t JitStackAlignment = 16;
static constexpr uint32_t JitStackValueAlignment =
@@ -250,8 +239,8 @@ static_assert(JitStackAlignment % sizeof(Value) == 0 &&
JitStackValueAlignment >= 1,
"Stack alignment should be a non-zero multiple of sizeof(Value)");
// LoongArch LSX SIMD vectors are 128 bits wide, so use 16-byte alignment for
// SIMD constants and wasm stack alignment even while SIMD codegen is disabled.
// TODO(loongarch64): this is just a filler to prevent a build failure. The
// LoongArch SIMD alignment requirements still need to be explored.
static constexpr uint32_t SimdMemoryAlignment = 16;
static_assert(CodeAlignment % SimdMemoryAlignment == 0,
@@ -271,8 +260,9 @@ static constexpr uint32_t WasmCheckedTailEntryOffset = 16u;
static constexpr Scale ScalePointer = TimesEight;
// LoongArch instruction encoding constants. The assembler models the encodings
// used by this backend as register, immediate, and jump instruction records.
// TODO(loongarch64): Add LoongArch instruction types description.
// LoongArch instruction encoding constants.
static const uint32_t RJShift = 5;
static const uint32_t RJBits = 5;
static const uint32_t RKShift = 10;
@@ -313,8 +303,6 @@ static const uint32_t Imm6Shift = 10;
static const uint32_t Imm6Bits = 6;
static const uint32_t Imm12Shift = 10;
static const uint32_t Imm12Bits = 12;
static const uint32_t Imm13Shift = 5;
static const uint32_t Imm13Bits = 13;
static const uint32_t Imm14Shift = 10;
static const uint32_t Imm14Bits = 14;
static const uint32_t Imm15Shift = 0;
@@ -345,7 +333,6 @@ static const uint32_t CODEMask = (1 << CODEBits) - 1;
static const uint32_t Imm5Mask = (1 << Imm5Bits) - 1;
static const uint32_t Imm6Mask = (1 << Imm6Bits) - 1;
static const uint32_t Imm12Mask = (1 << Imm12Bits) - 1;
static const uint32_t Imm13Mask = (1 << Imm13Bits) - 1;
static const uint32_t Imm14Mask = (1 << Imm14Bits) - 1;
static const uint32_t Imm15Mask = (1 << Imm15Bits) - 1;
static const uint32_t Imm16Mask = (1 << Imm16Bits) - 1;
@@ -357,11 +344,11 @@ static const uint32_t BOffImm21Mask = ((1 << Imm21Bits) - 1) << Imm21Shift;
static const uint32_t BOffImm26Mask = ((1 << Imm26Bits) - 1) << Imm26Shift;
static const uint32_t RegMask = Registers::Total - 1;
// TODO(loongarch64) Change to syscall?
static const uint32_t MAX_BREAK_CODE = 1024 - 1;
// Use LoongArch BRK for wasm traps and debug breakpoints. Signal handling code
// decodes the BRK immediate to recover the wasm trap kind.
static const uint32_t WASM_TRAP = 6; // BRK_OVERFLOW
// TODO(loongarch64) Change to LoongArch instruction type.
class Instruction;
class InstReg;
class InstImm;
@@ -441,17 +428,6 @@ enum OpcodeField {
op_fst_s = 0xadU << 22,
op_fld_d = 0xaeU << 22,
op_fst_d = 0xafU << 22,
op_vld = 0x2c000000,
op_vst = 0x2c400000,
op_vfcmp_clt_s = 0x0c510000,
op_vfcmp_ceq_s = 0x0c520000,
op_vfcmp_cle_s = 0x0c530000,
op_vfcmp_cun_s = 0x0c540000,
op_vfcmp_cult_s = 0x0c550000,
op_vfcmp_cule_s = 0x0c570000,
op_vfcmp_cune_s = 0x0c5c0000,
op_vbitsel_v = 0x0d100000,
op_vshuf_b = 0x0d500000,
op_bstr_w = 0x3U << 21, // BSTRINS_W & BSTRPICK_W
op_fmadd_s = 0x81U << 20,
op_fmadd_d = 0x82U << 20,
@@ -554,51 +530,6 @@ enum OpcodeField {
op_fldx_d = 0x7068U << 15,
op_fstx_s = 0x7070U << 15,
op_fstx_d = 0x7078U << 15,
op_vldx = 0x38400000,
op_vstx = 0x38440000,
op_vseq_w = 0x70010000,
op_vsle_w = 0x70030000,
op_vsle_wu = 0x70050000,
op_vslt_w = 0x70070000,
op_vslt_wu = 0x70090000,
op_vadd_w = 0x700b0000,
op_vsub_w = 0x700d0000,
op_vmax_w = 0x70710000,
op_vmin_w = 0x70730000,
op_vmax_wu = 0x70750000,
op_vmin_wu = 0x70770000,
op_vmul_w = 0x70850000,
op_vsll_w = 0x70e90000,
op_vsrl_w = 0x70eb0000,
op_vsra_w = 0x70ed0000,
op_vilvl_w = 0x711b0000,
op_vilvh_w = 0x711d0000,
op_vand_v = 0x71260000,
op_vor_v = 0x71268000,
op_vxor_v = 0x71270000,
op_vnor_v = 0x71278000,
op_vandn_v = 0x71280000,
op_vfadd_s = 0x71308000,
op_vfsub_s = 0x71328000,
op_vfmul_s = 0x71388000,
op_vfmax_s = 0x713c8000,
op_vfmin_s = 0x713e8000,
op_vneg_w = 0x729c3800,
op_vfsqrt_s = 0x729ce400,
op_vfrecip_s = 0x729cf400,
op_vfrsqrt_s = 0x729d0400,
op_vfrint_s = 0x729d3400,
op_vffint_s_w = 0x729e0000,
op_vftint_w_s = 0x729e3000,
op_vreplgr2vr_w = 0x729f0800,
op_vreplvei_w = 0x72f7e000,
op_vinsgr2vr_w = 0x72ebe000,
op_vpickve2gr_w = 0x72efe000,
op_vpickve2gr_wu = 0x72f3e000,
op_vslli_w = 0x732c8000,
op_vsrli_w = 0x73308000,
op_vsrai_w = 0x73348000,
op_vldi = 0x73e00000,
op_amswap_w = 0x70c0U << 15,
op_amswap_d = 0x70c1U << 15,
op_amadd_w = 0x70c2U << 15,
@@ -935,8 +866,7 @@ class LOONGBufferWithExecutableCopy : public LOONGBuffer {
class AssemblerLOONGARCH64 : public AssemblerShared {
public:
// Keep the shared condition vocabulary so shared MacroAssembler and
// CodeGenerator code can lower comparisons without per-use remapping.
// TODO(loongarch64): Should we remove these conditions here?
enum Condition {
Equal,
NotEqual,
@@ -1321,26 +1251,6 @@ class AssemblerLOONGARCH64 : public AssemblerShared {
BufferOffset as_st_h(Register rd, Register rj, int32_t si12);
BufferOffset as_st_w(Register rd, Register rj, int32_t si12);
BufferOffset as_st_d(Register rd, Register rj, int32_t si12);
BufferOffset as_vld(FloatRegister vd, Register rj, int32_t si12);
BufferOffset as_vst(FloatRegister vd, Register rj, int32_t si12);
BufferOffset as_vfcmp_clt_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_ceq_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_cle_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_cun_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_cult_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_cule_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vfcmp_cune_s(FloatRegister vd, FloatRegister vj,
FloatRegister vk);
BufferOffset as_vbitsel_v(FloatRegister vd, FloatRegister vj,
FloatRegister vk, FloatRegister va);
BufferOffset as_vshuf_b(FloatRegister vd, FloatRegister vj, FloatRegister vk,
FloatRegister va);
BufferOffset as_ldx_b(Register rd, Register rj, Register rk);
BufferOffset as_ldx_h(Register rd, Register rj, Register rk);
@@ -1353,51 +1263,6 @@ class AssemblerLOONGARCH64 : public AssemblerShared {
BufferOffset as_stx_h(Register rd, Register rj, Register rk);
BufferOffset as_stx_w(Register rd, Register rj, Register rk);
BufferOffset as_stx_d(Register rd, Register rj, Register rk);
BufferOffset as_vldx(FloatRegister vd, Register rj, Register rk);
BufferOffset as_vstx(FloatRegister vd, Register rj, Register rk);
BufferOffset as_vseq_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsle_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsle_wu(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vslt_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vslt_wu(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vadd_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsub_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vmax_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vmin_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vmax_wu(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vmin_wu(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vmul_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsll_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsrl_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vsra_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vilvl_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vilvh_w(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vand_v(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vor_v(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vxor_v(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vnor_v(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vandn_v(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vfadd_s(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vfsub_s(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vfmul_s(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vfmax_s(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vfmin_s(FloatRegister vd, FloatRegister vj, FloatRegister vk);
BufferOffset as_vneg_w(FloatRegister vd, FloatRegister vj);
BufferOffset as_vfsqrt_s(FloatRegister vd, FloatRegister vj);
BufferOffset as_vfrecip_s(FloatRegister vd, FloatRegister vj);
BufferOffset as_vfrsqrt_s(FloatRegister vd, FloatRegister vj);
BufferOffset as_vfrint_s(FloatRegister vd, FloatRegister vj);
BufferOffset as_vffint_s_w(FloatRegister vd, FloatRegister vj);
BufferOffset as_vftint_w_s(FloatRegister vd, FloatRegister vj);
BufferOffset as_vreplgr2vr_w(FloatRegister vd, Register rj);
BufferOffset as_vreplvei_w(FloatRegister vd, FloatRegister vj, uint32_t lane);
BufferOffset as_vinsgr2vr_w(FloatRegister vd, Register rj, uint32_t lane);
BufferOffset as_vpickve2gr_w(Register rd, FloatRegister vj, uint32_t lane);
BufferOffset as_vpickve2gr_wu(Register rd, FloatRegister vj, uint32_t lane);
BufferOffset as_vslli_w(FloatRegister vd, FloatRegister vj, uint32_t imm);
BufferOffset as_vsrli_w(FloatRegister vd, FloatRegister vj, uint32_t imm);
BufferOffset as_vsrai_w(FloatRegister vd, FloatRegister vj, uint32_t imm);
BufferOffset as_vldi(FloatRegister vd, int32_t imm);
BufferOffset as_ldptr_w(Register rd, Register rj, int32_t si14);
BufferOffset as_ldptr_d(Register rd, Register rj, int32_t si14);
@@ -1614,7 +1479,7 @@ class AssemblerLOONGARCH64 : public AssemblerShared {
return false;
#endif
}
static bool SupportsSimd() { return true; }
static bool SupportsSimd() { return false; }
static bool SupportsUnalignedAccesses() { return true; }
static bool SupportsFastUnalignedFPAccesses() { return true; }
@@ -833,14 +833,7 @@ CodeGeneratorLoongArch64::visitWrapInt64ToInt32(LWrapInt64ToInt32* lir)
else
masm.ma_sll(output, ToRegister(input), Imm32(0));
} else {
if (input->isMemory())
masm.load32(Address(ToAddress(input).base,
ToAddress(input).offset + sizeof(int32_t)),
output);
else {
masm.ma_dsrl(output, ToRegister(input), Imm32(32));
masm.ma_sll(output, output, Imm32(0));
}
MOZ_CRASH("Not implemented.");
}
}
@@ -1017,37 +1010,15 @@ CodeGeneratorLoongArch64::visitTestI64AndBranch(LTestI64AndBranch* lir)
emitBranch(input.reg, Imm32(0), Assembler::NonZero, ifTrue, ifFalse);
}
void
CodeGeneratorLoongArch64::visitWasmStackArg(LWasmStackArg* ins)
{
MIRType type = ins->mir()->input()->type();
if (IsSimdType(type)) {
MOZ_ASSERT(ins->arg()->isFloatReg());
Address dst(StackPointer, ins->mir()->spOffset());
FloatRegister src = ToFloatRegister(ins->arg()).asSimd128();
if (type == MIRType::Float32x4)
masm.storeAlignedSimd128Float(src, dst);
else
masm.storeAlignedSimd128Int(src, dst);
return;
}
CodeGeneratorMIPSShared::visitWasmStackArg(ins);
}
void
CodeGeneratorLoongArch64::setReturnDoubleRegs(LiveRegisterSet* regs)
{
MOZ_ASSERT(ReturnFloat32Reg.encoding() == FloatRegisters::f0);
MOZ_ASSERT(ReturnDoubleReg.encoding() == FloatRegisters::f0);
MOZ_ASSERT(ReturnSimd128Reg.encoding() == FloatRegisters::f0);
FloatRegister f1 = { FloatRegisters::f1, FloatRegisters::Single };
regs->add(ReturnFloat32Reg);
regs->add(f1);
regs->add(ReturnDoubleReg);
regs->add(ReturnSimd128Reg);
}
void
@@ -65,7 +65,6 @@ class CodeGeneratorLoongArch64 : public CodeGeneratorMIPSShared
void visitWasmUnalignedLoadI64(LWasmUnalignedLoadI64* lir);
void visitWasmStoreI64(LWasmStoreI64* ins);
void visitWasmUnalignedStoreI64(LWasmUnalignedStoreI64* ins);
void visitWasmStackArg(LWasmStackArg* ins);
void visitWasmLoadGlobalVarI64(LWasmLoadGlobalVarI64* ins);
void visitWasmStoreGlobalVarI64(LWasmStoreGlobalVarI64* ins);
void visitWasmSelectI64(LWasmSelectI64* ins);
@@ -6,8 +6,6 @@
#include "jit/loongarch64/MacroAssembler-loongarch64.h"
#include <cstring>
#include "jsmath.h"
#include "jit/Bailouts.h"
@@ -957,13 +955,8 @@ void MacroAssemblerLOONGARCH64::ma_subPtrTestOverflow(Register rd, Register rj,
void MacroAssemblerLOONGARCH64::ma_subPtrTestOverflow(Register rd, Register rj,
Imm32 imm, Label* overflow) {
if (imm.value == INT32_MIN) {
SecondScratchRegisterScope scratch2(asMasm());
ma_li(scratch2, imm);
ma_subPtrTestOverflow(rd, rj, scratch2, overflow);
return;
}
// TODO(loongarch64): Check subPtrTestOverflow
MOZ_ASSERT(imm.value != INT32_MIN);
ma_addPtrTestOverflow(rd, rj, Imm32(-imm.value), overflow);
}
@@ -1301,20 +1294,10 @@ void MacroAssemblerLOONGARCH64::ma_cmp_set(Register rd, Register rj, ImmPtr imm,
void MacroAssemblerLOONGARCH64::ma_cmp_set(Register rd, Address address, Imm32 imm,
Condition c) {
// TODO(loongarch64): 32-bit ma_cmp_set?
SecondScratchRegisterScope scratch2(asMasm());
switch (c) {
case Above:
case AboveOrEqual:
case Below:
case BelowOrEqual:
ma_ld_wu(scratch2, address);
ma_cmp_set(rd, Register(scratch2), ImmWord(uint32_t(imm.value)), c);
break;
default:
ma_ld_w(scratch2, address);
ma_cmp_set(rd, Register(scratch2), imm, c);
break;
}
ma_ld_w(scratch2, address);
ma_cmp_set(rd, Register(scratch2), imm, c);
}
void MacroAssemblerLOONGARCH64::ma_cmp_set(Register rd, Address address,
@@ -1401,36 +1384,6 @@ void MacroAssemblerLOONGARCH64::ma_fst_d(FloatRegister src, Address address) {
}
}
void MacroAssemblerLOONGARCH64::ma_vld(FloatRegister dest, Address address) {
MOZ_ASSERT(dest.isSimd128());
int32_t offset = address.offset;
Register base = address.base;
if (is_intN(offset, 12)) {
as_vld(dest, base, offset);
} else {
ScratchRegisterScope scratch(asMasm());
MOZ_ASSERT(base != scratch);
ma_li(scratch, Imm32(offset));
as_vldx(dest, base, scratch);
}
}
void MacroAssemblerLOONGARCH64::ma_vst(FloatRegister src, Address address) {
MOZ_ASSERT(src.isSimd128());
int32_t offset = address.offset;
Register base = address.base;
if (is_intN(offset, 12)) {
as_vst(src, base, offset);
} else {
ScratchRegisterScope scratch(asMasm());
MOZ_ASSERT(base != scratch);
ma_li(scratch, Imm32(offset));
as_vstx(src, base, scratch);
}
}
void MacroAssemblerLOONGARCH64::ma_pop(FloatRegister f) {
if (f.isDouble()) {
as_fld_d(f, StackPointer, 0);
@@ -1894,19 +1847,12 @@ void MacroAssemblerLOONGARCH64::storeUnalignedFloat32(
}
// Branches when done from within loongarch-specific code.
// TODO(loongarch64) Optimize ma_b
void MacroAssemblerLOONGARCH64::ma_b(Register lhs, Register rhs, Label* label,
Condition c, JumpKind jumpKind) {
switch (c) {
case Equal:
case NotEqual:
case Above:
case AboveOrEqual:
case Below:
case BelowOrEqual:
case GreaterThan:
case GreaterThanOrEqual:
case LessThan:
case LessThanOrEqual:
asMasm().branchWithCode(getBranchCode(lhs, rhs, c), label, jumpKind);
break;
case Always:
@@ -1919,8 +1865,12 @@ void MacroAssemblerLOONGARCH64::ma_b(Register lhs, Register rhs, Label* label,
MOZ_ASSERT(lhs == rhs);
asMasm().branchWithCode(getBranchCode(lhs, c), label, jumpKind);
break;
default:
MOZ_CRASH("Invalid condition.");
default: {
Condition cond = ma_cmp(ScratchRegister, lhs, rhs, c);
asMasm().branchWithCode(getBranchCode(ScratchRegister, cond), label,
jumpKind);
break;
}
}
}
@@ -2096,12 +2046,6 @@ void MacroAssemblerLOONGARCH64::ma_fst_s(FloatRegister ft, BaseIndex address) {
asMasm().ma_fst_s(ft, Address(scratch2, address.offset));
}
void MacroAssemblerLOONGARCH64::ma_vst(FloatRegister ft, BaseIndex address) {
SecondScratchRegisterScope scratch2(asMasm());
asMasm().computeScaledAddress(address, scratch2);
asMasm().ma_vst(ft, Address(scratch2, address.offset));
}
void MacroAssemblerLOONGARCH64::ma_fld_d(FloatRegister ft, const BaseIndex& src) {
SecondScratchRegisterScope scratch2(asMasm());
asMasm().computeScaledAddress(src, scratch2);
@@ -2114,12 +2058,6 @@ void MacroAssemblerLOONGARCH64::ma_fld_s(FloatRegister ft, const BaseIndex& src)
asMasm().ma_fld_s(ft, Address(scratch2, src.offset));
}
void MacroAssemblerLOONGARCH64::ma_vld(FloatRegister ft, const BaseIndex& src) {
SecondScratchRegisterScope scratch2(asMasm());
asMasm().computeScaledAddress(src, scratch2);
asMasm().ma_vld(ft, Address(scratch2, src.offset));
}
void MacroAssemblerLOONGARCH64::ma_bc_s(FloatRegister lhs, FloatRegister rhs,
Label* label, DoubleCondition c,
JumpKind jumpKind, FPConditionBit fcc) {
@@ -2452,390 +2390,6 @@ void MacroAssemblerLOONGARCH64::loadFloat32(const BaseIndex& src,
asMasm().ma_fld_s(dest, src);
}
void MacroAssemblerLOONGARCH64::loadUnalignedSimd128Float(const Address& src,
FloatRegister dest) {
asMasm().ma_vld(dest.asSimd128(), src);
}
void MacroAssemblerLOONGARCH64::loadUnalignedSimd128Float(const BaseIndex& src,
FloatRegister dest) {
asMasm().ma_vld(dest.asSimd128(), src);
}
void MacroAssemblerLOONGARCH64::storeUnalignedSimd128Float(FloatRegister src,
const Address& dest) {
asMasm().ma_vst(src.asSimd128(), dest);
}
void MacroAssemblerLOONGARCH64::storeUnalignedSimd128Float(FloatRegister src,
const BaseIndex& dest) {
asMasm().ma_vst(src.asSimd128(), dest);
}
void MacroAssemblerLOONGARCH64::loadConstantSimd128Int(const SimdConstant& v,
FloatRegister dest) {
uint64_t words[2];
memcpy(words, v.bytes(), sizeof(words));
ma_add_d(StackPointer, StackPointer, Imm32(-Simd128DataSize));
{
ScratchRegisterScope scratch(asMasm());
ma_li(scratch, ImmWord(words[0]));
ma_st_d(scratch, Address(StackPointer, 0));
ma_li(scratch, ImmWord(words[1]));
ma_st_d(scratch, Address(StackPointer, sizeof(uint64_t)));
}
loadAlignedSimd128Int(Address(StackPointer, 0), dest);
ma_add_d(StackPointer, StackPointer, Imm32(Simd128DataSize));
}
void MacroAssemblerLOONGARCH64::loadConstantSimd128Float(const SimdConstant& v,
FloatRegister dest) {
loadConstantSimd128Int(v, dest);
}
void MacroAssemblerLOONGARCH64::moveSimd128Float(FloatRegister src,
FloatRegister dest) {
src = src.asSimd128();
dest = dest.asSimd128();
if (src == dest) {
return;
}
as_vor_v(dest, src, src);
}
void MacroAssemblerLOONGARCH64::zeroSimd128Float(FloatRegister dest) {
dest = dest.asSimd128();
as_vxor_v(dest, dest, dest);
}
void MacroAssemblerLOONGARCH64::createInt32x4(Register lane0, Register lane1,
Register lane2, Register lane3,
FloatRegister dest) {
dest = dest.asSimd128();
as_vreplgr2vr_w(dest, lane0);
as_vinsgr2vr_w(dest, lane1, 1);
as_vinsgr2vr_w(dest, lane2, 2);
as_vinsgr2vr_w(dest, lane3, 3);
}
void MacroAssemblerLOONGARCH64::splatX4(Register input, FloatRegister output) {
as_vreplgr2vr_w(output.asSimd128(), input);
}
void MacroAssemblerLOONGARCH64::splatX4(FloatRegister input,
FloatRegister output) {
as_vreplvei_w(output.asSimd128(), input.asSimd128(), 0);
}
void MacroAssemblerLOONGARCH64::extractLaneInt32x4(FloatRegister input,
Register output,
unsigned lane) {
as_vpickve2gr_w(output, input.asSimd128(), lane);
}
void MacroAssemblerLOONGARCH64::extractLaneFloat32x4(FloatRegister input,
FloatRegister output,
unsigned lane,
bool canonicalize) {
ScratchRegisterScope scratch(asMasm());
as_vpickve2gr_w(scratch, input.asSimd128(), lane);
moveToFloat32(scratch, output);
if (canonicalize) {
asMasm().canonicalizeFloat(output);
}
}
void MacroAssemblerLOONGARCH64::insertLaneSimdInt(FloatRegister input,
Register value,
FloatRegister output,
unsigned lane,
unsigned numLanes) {
MOZ_ASSERT(numLanes == 4);
if (input != output) {
moveSimd128Int(input, output);
}
as_vinsgr2vr_w(output.asSimd128(), value, lane);
}
void MacroAssemblerLOONGARCH64::insertLaneFloat32x4(FloatRegister input,
FloatRegister value,
FloatRegister output,
unsigned lane) {
if (input != output) {
moveSimd128Float(input, output);
}
ScratchRegisterScope scratch(asMasm());
moveFromFloat32(value, scratch);
as_vinsgr2vr_w(output.asSimd128(), scratch, lane);
}
void MacroAssemblerLOONGARCH64::addInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vadd_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::subInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vsub_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::mulInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vmul_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::minInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vmin_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::maxInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vmax_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::minUint32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vmin_wu(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::maxUint32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vmax_wu(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::negInt32x4(FloatRegister input,
FloatRegister dest) {
as_vneg_w(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::shiftLeftInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vsll_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::shiftRightInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vsra_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::unsignedShiftRightInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vsrl_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::shiftLeftInt32x4(FloatRegister lhs, Imm32 rhs,
FloatRegister dest) {
as_vslli_w(dest.asSimd128(), lhs.asSimd128(), rhs.value & 31);
}
void MacroAssemblerLOONGARCH64::shiftRightInt32x4(FloatRegister lhs, Imm32 rhs,
FloatRegister dest) {
as_vsrai_w(dest.asSimd128(), lhs.asSimd128(), rhs.value & 31);
}
void MacroAssemblerLOONGARCH64::unsignedShiftRightInt32x4(FloatRegister lhs,
Imm32 rhs,
FloatRegister dest) {
as_vsrli_w(dest.asSimd128(), lhs.asSimd128(), rhs.value & 31);
}
void MacroAssemblerLOONGARCH64::compareInt32x4Equal(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vseq_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareInt32x4LessThan(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vslt_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareInt32x4LessThanOrEqual(
FloatRegister lhs, FloatRegister rhs, FloatRegister dest) {
as_vsle_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareUint32x4LessThan(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vslt_wu(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareUint32x4LessThanOrEqual(
FloatRegister lhs, FloatRegister rhs, FloatRegister dest) {
as_vsle_wu(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::addFloat32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfadd_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::subFloat32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfsub_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::mulFloat32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfmul_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::minFloat32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfmin_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::maxFloat32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfmax_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::sqrtFloat32x4(FloatRegister input,
FloatRegister dest) {
as_vfsqrt_s(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::reciprocalApproximationFloat32x4(
FloatRegister input, FloatRegister dest) {
as_vfrecip_s(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::reciprocalSqrtApproximationFloat32x4(
FloatRegister input, FloatRegister dest) {
as_vfrsqrt_s(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::roundFloat32x4(FloatRegister input,
FloatRegister dest) {
as_vfrint_s(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::convertInt32x4ToFloat32x4(FloatRegister input,
FloatRegister dest) {
as_vffint_s_w(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::convertFloat32x4ToInt32x4(FloatRegister input,
FloatRegister dest) {
as_vftint_w_s(dest.asSimd128(), input.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4Equal(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfcmp_ceq_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4NotEqual(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfcmp_cune_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4LessThan(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfcmp_clt_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4LessThanOrEqual(
FloatRegister lhs, FloatRegister rhs, FloatRegister dest) {
as_vfcmp_cle_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4Unordered(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vfcmp_cun_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4UnorderedLessThan(
FloatRegister lhs, FloatRegister rhs, FloatRegister dest) {
as_vfcmp_cult_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::compareFloat32x4UnorderedLessThanOrEqual(
FloatRegister lhs, FloatRegister rhs, FloatRegister dest) {
as_vfcmp_cule_s(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::interleaveLowInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vilvl_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::interleaveHighInt32x4(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vilvh_w(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitselectSimd128(FloatRegister mask,
FloatRegister onTrue,
FloatRegister onFalse,
FloatRegister dest) {
as_vbitsel_v(dest.asSimd128(), onFalse.asSimd128(), onTrue.asSimd128(),
mask.asSimd128());
}
void MacroAssemblerLOONGARCH64::shuffleBytesSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister control,
FloatRegister dest) {
as_vshuf_b(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128(),
control.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitwiseAndSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vand_v(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitwiseOrSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vor_v(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitwiseXorSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vxor_v(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitwiseNorSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vnor_v(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::bitwiseAndNotSimd128(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest) {
as_vandn_v(dest.asSimd128(), lhs.asSimd128(), rhs.asSimd128());
}
void MacroAssemblerLOONGARCH64::wasmLoadImpl(const wasm::MemoryAccessDesc& access,
Register memoryBase, Register ptr,
Register ptrScratch,
@@ -2962,8 +2516,7 @@ void MacroAssemblerLOONGARCH64Compat::wasmLoadI64Impl(
as_ldx_w(output.reg, memoryBase, ptr);
break;
case Scalar::Uint32:
// Uint32 loads must clear the upper 32 bits before the value is consumed
// by 64-bit wasm operations.
// TODO(loongarch64): Why need zero-extension here?
as_ldx_wu(output.reg, memoryBase, ptr);
break;
case Scalar::Int64:
@@ -3064,18 +2617,14 @@ void MacroAssembler::PushRegsInMask(LiveRegisterSet set) {
storePtr(*iter, Address(StackPointer, diff));
}
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
for (FloatRegisterBackwardIterator iter(set.fpus().reduceSetForPush());
iter.more(); ++iter) {
FloatRegister reg = *iter;
diff -= reg.size();
if (reg.isSingle()) {
storeFloat32(reg, Address(StackPointer, diff));
} else if (reg.isSimd128()) {
storeUnalignedSimd128Float(reg, Address(StackPointer, diff));
} else {
MOZ_ASSERT(reg.isDouble());
storeDouble(reg, Address(StackPointer, diff));
}
diff -= sizeof(double);
storeDouble(*iter, Address(StackPointer, diff));
}
MOZ_ASSERT(diff == 0);
}
@@ -3093,19 +2642,15 @@ void MacroAssembler::PopRegsInMaskIgnore(LiveRegisterSet set,
}
}
#ifdef ENABLE_WASM_SIMD
# error "Needs more careful logic if SIMD is enabled"
#endif
for (FloatRegisterBackwardIterator iter(set.fpus().reduceSetForPush());
iter.more(); ++iter) {
FloatRegister reg = *iter;
diff -= reg.size();
diff -= sizeof(double);
if (!ignore.has(*iter)) {
if (reg.isSingle()) {
loadFloat32(Address(StackPointer, diff), reg);
} else if (reg.isSimd128()) {
loadUnalignedSimd128Float(Address(StackPointer, diff), reg);
} else {
MOZ_ASSERT(reg.isDouble());
loadDouble(Address(StackPointer, diff), reg);
}
loadDouble(Address(StackPointer, diff), *iter);
}
}
MOZ_ASSERT(diff == 0);
@@ -199,8 +199,6 @@ class MacroAssemblerLOONGARCH64 : public Assembler {
void ma_fld_d(FloatRegister ft, Address address);
void ma_fst_d(FloatRegister ft, Address address);
void ma_fst_s(FloatRegister ft, Address address);
void ma_vld(FloatRegister vt, Address address);
void ma_vst(FloatRegister vt, Address address);
void ma_pop(FloatRegister f);
void ma_push(FloatRegister f);
@@ -453,11 +451,9 @@ class MacroAssemblerLOONGARCH64 : public Assembler {
void ma_fst_d(FloatRegister src, BaseIndex address);
void ma_fst_s(FloatRegister src, BaseIndex address);
void ma_vst(FloatRegister src, BaseIndex address);
void ma_fld_d(FloatRegister dest, const BaseIndex& src);
void ma_fld_s(FloatRegister dest, const BaseIndex& src);
void ma_vld(FloatRegister dest, const BaseIndex& src);
// FP branches
void ma_bc_s(FloatRegister lhs, FloatRegister rhs, Label* label,
@@ -635,139 +631,6 @@ class MacroAssemblerLOONGARCH64 : public Assembler {
void loadFloat32(const Address& addr, FloatRegister dest);
void loadFloat32(const BaseIndex& src, FloatRegister dest);
void loadUnalignedSimd128Float(const Address& src, FloatRegister dest);
void loadUnalignedSimd128Float(const BaseIndex& src, FloatRegister dest);
void storeUnalignedSimd128Float(FloatRegister src, const Address& dest);
void storeUnalignedSimd128Float(FloatRegister src, const BaseIndex& dest);
void loadAlignedSimd128Float(const Address& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void loadAlignedSimd128Float(const BaseIndex& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void storeAlignedSimd128Float(FloatRegister src, const Address& dest) {
storeUnalignedSimd128Float(src, dest);
}
void storeAlignedSimd128Float(FloatRegister src, const BaseIndex& dest) {
storeUnalignedSimd128Float(src, dest);
}
void loadConstantSimd128Float(const SimdConstant& v, FloatRegister dest);
void loadConstantSimd128Int(const SimdConstant& v, FloatRegister dest);
void moveSimd128Float(FloatRegister src, FloatRegister dest);
void moveSimd128Int(FloatRegister src, FloatRegister dest) {
moveSimd128Float(src, dest);
}
void zeroSimd128Float(FloatRegister dest);
void zeroSimd128Int(FloatRegister dest) { zeroSimd128Float(dest); }
void createInt32x4(Register lane0, Register lane1, Register lane2,
Register lane3, FloatRegister dest);
void splatX4(Register input, FloatRegister output);
void splatX4(FloatRegister input, FloatRegister output);
void extractLaneInt32x4(FloatRegister input, Register output, unsigned lane);
void extractLaneFloat32x4(FloatRegister input, FloatRegister output,
unsigned lane, bool canonicalize);
void insertLaneSimdInt(FloatRegister input, Register value,
FloatRegister output, unsigned lane,
unsigned numLanes);
void insertLaneFloat32x4(FloatRegister input, FloatRegister value,
FloatRegister output, unsigned lane);
void addInt32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void subInt32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void mulInt32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void minInt32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void maxInt32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void minUint32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void maxUint32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void negInt32x4(FloatRegister input, FloatRegister dest);
void shiftLeftInt32x4(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void shiftRightInt32x4(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void unsignedShiftRightInt32x4(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void shiftLeftInt32x4(FloatRegister lhs, Imm32 rhs, FloatRegister dest);
void shiftRightInt32x4(FloatRegister lhs, Imm32 rhs, FloatRegister dest);
void unsignedShiftRightInt32x4(FloatRegister lhs, Imm32 rhs,
FloatRegister dest);
void compareInt32x4Equal(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareInt32x4LessThan(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareInt32x4LessThanOrEqual(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareUint32x4LessThan(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareUint32x4LessThanOrEqual(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void addFloat32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void subFloat32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void mulFloat32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void minFloat32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void maxFloat32x4(FloatRegister lhs, FloatRegister rhs, FloatRegister dest);
void sqrtFloat32x4(FloatRegister input, FloatRegister dest);
void reciprocalApproximationFloat32x4(FloatRegister input, FloatRegister dest);
void reciprocalSqrtApproximationFloat32x4(FloatRegister input,
FloatRegister dest);
void roundFloat32x4(FloatRegister input, FloatRegister dest);
void convertInt32x4ToFloat32x4(FloatRegister input, FloatRegister dest);
void convertFloat32x4ToInt32x4(FloatRegister input, FloatRegister dest);
void compareFloat32x4Equal(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4NotEqual(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4LessThan(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4LessThanOrEqual(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4Unordered(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4UnorderedLessThan(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void compareFloat32x4UnorderedLessThanOrEqual(FloatRegister lhs,
FloatRegister rhs,
FloatRegister dest);
void interleaveLowInt32x4(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void interleaveHighInt32x4(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void bitselectSimd128(FloatRegister mask, FloatRegister onTrue,
FloatRegister onFalse, FloatRegister dest);
void shuffleBytesSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister control, FloatRegister dest);
void bitwiseAndSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void bitwiseOrSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void bitwiseXorSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void bitwiseNorSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void bitwiseAndNotSimd128(FloatRegister lhs, FloatRegister rhs,
FloatRegister dest);
void loadUnalignedSimd128Int(const Address& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void loadUnalignedSimd128Int(const BaseIndex& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void loadAlignedSimd128Int(const Address& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void loadAlignedSimd128Int(const BaseIndex& src, FloatRegister dest) {
loadUnalignedSimd128Float(src, dest);
}
void storeUnalignedSimd128Int(FloatRegister src, const Address& dest) {
storeUnalignedSimd128Float(src, dest);
}
void storeUnalignedSimd128Int(FloatRegister src, const BaseIndex& dest) {
storeUnalignedSimd128Float(src, dest);
}
void storeAlignedSimd128Int(FloatRegister src, const Address& dest) {
storeUnalignedSimd128Float(src, dest);
}
void storeAlignedSimd128Int(FloatRegister src, const BaseIndex& dest) {
storeUnalignedSimd128Float(src, dest);
}
protected:
void wasmLoadImpl(const wasm::MemoryAccessDesc& access, Register memoryBase,
@@ -10,75 +10,6 @@
using namespace js;
using namespace js::jit;
Address
MoveEmitterLoongArch64::cycleSlot(uint32_t slot, uint32_t subslot) const
{
int32_t offset = masm.framePushed() - pushedAtCycle_;
MOZ_ASSERT(Imm16::IsInSignedRange(offset));
return Address(StackPointer, offset + slot * Simd128DataSize + subslot);
}
void
MoveEmitterLoongArch64::emit(const MoveResolver& moves)
{
if (moves.numCycles()) {
masm.reserveStack(moves.numCycles() * Simd128DataSize);
pushedAtCycle_ = masm.framePushed();
}
for (size_t i = 0; i < moves.numMoves(); i++)
emit(moves.getMove(i));
}
void
MoveEmitterLoongArch64::emit(const MoveOp& move)
{
const MoveOperand& from = move.from();
const MoveOperand& to = move.to();
if (move.isCycleEnd() && move.isCycleBegin()) {
breakCycle(from, to, move.endCycleType(), move.cycleBeginSlot());
completeCycle(from, to, move.type(), move.cycleEndSlot());
return;
}
if (move.isCycleEnd()) {
MOZ_ASSERT(inCycle_);
completeCycle(from, to, move.type(), move.cycleEndSlot());
MOZ_ASSERT(inCycle_ > 0);
inCycle_--;
return;
}
if (move.isCycleBegin()) {
breakCycle(from, to, move.endCycleType(), move.cycleBeginSlot());
inCycle_++;
}
switch (move.type()) {
case MoveOp::FLOAT32:
emitFloat32Move(from, to);
break;
case MoveOp::DOUBLE:
emitDoubleMove(from, to);
break;
case MoveOp::INT32:
emitInt32Move(from, to);
break;
case MoveOp::GENERAL:
emitMove(from, to);
break;
case MoveOp::SIMD128INT:
emitSimd128IntMove(from, to);
break;
case MoveOp::SIMD128FLOAT:
emitSimd128FloatMove(from, to);
break;
default:
MOZ_CRASH("Unexpected move type");
}
}
void
MoveEmitterLoongArch64::breakCycle(const MoveOperand& from, const MoveOperand& to,
MoveOp::Type type, uint32_t slotId)
@@ -102,24 +33,6 @@ MoveEmitterLoongArch64::breakCycle(const MoveOperand& from, const MoveOperand& t
masm.storeDouble(to.floatReg(), cycleSlot(slotId));
}
break;
case MoveOp::SIMD128INT:
if (to.isMemory()) {
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Int(getAdjustedAddress(to), temp);
masm.storeAlignedSimd128Int(temp, cycleSlot(slotId));
} else {
masm.storeAlignedSimd128Int(to.floatReg(), cycleSlot(slotId));
}
break;
case MoveOp::SIMD128FLOAT:
if (to.isMemory()) {
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Float(getAdjustedAddress(to), temp);
masm.storeAlignedSimd128Float(temp, cycleSlot(slotId));
} else {
masm.storeAlignedSimd128Float(to.floatReg(), cycleSlot(slotId));
}
break;
case MoveOp::INT32:
if (to.isMemory()) {
Register temp = tempReg();
@@ -168,24 +81,6 @@ MoveEmitterLoongArch64::completeCycle(const MoveOperand& from, const MoveOperand
masm.loadDouble(cycleSlot(slotId), to.floatReg());
}
break;
case MoveOp::SIMD128INT:
if (to.isMemory()) {
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Int(cycleSlot(slotId), temp);
masm.storeAlignedSimd128Int(temp, getAdjustedAddress(to));
} else {
masm.loadAlignedSimd128Int(cycleSlot(slotId), to.floatReg());
}
break;
case MoveOp::SIMD128FLOAT:
if (to.isMemory()) {
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Float(cycleSlot(slotId), temp);
masm.storeAlignedSimd128Float(temp, getAdjustedAddress(to));
} else {
masm.loadAlignedSimd128Float(cycleSlot(slotId), to.floatReg());
}
break;
case MoveOp::INT32:
MOZ_ASSERT(slotId == 0);
if (to.isMemory()) {
@@ -213,56 +108,6 @@ MoveEmitterLoongArch64::completeCycle(const MoveOperand& from, const MoveOperand
}
}
void
MoveEmitterLoongArch64::emitSimd128IntMove(const MoveOperand& from, const MoveOperand& to)
{
MOZ_ASSERT_IF(from.isFloatReg(), from.floatReg().isSimd128());
MOZ_ASSERT_IF(to.isFloatReg(), to.floatReg().isSimd128());
if (from.isFloatReg()) {
if (to.isFloatReg()) {
masm.moveSimd128Int(from.floatReg(), to.floatReg());
} else {
MOZ_ASSERT(to.isMemory());
masm.storeAlignedSimd128Int(from.floatReg(), getAdjustedAddress(to));
}
} else if (to.isFloatReg()) {
MOZ_ASSERT(from.isMemory());
masm.loadAlignedSimd128Int(getAdjustedAddress(from), to.floatReg());
} else {
MOZ_ASSERT(from.isMemory());
MOZ_ASSERT(to.isMemory());
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Int(getAdjustedAddress(from), temp);
masm.storeAlignedSimd128Int(temp, getAdjustedAddress(to));
}
}
void
MoveEmitterLoongArch64::emitSimd128FloatMove(const MoveOperand& from, const MoveOperand& to)
{
MOZ_ASSERT_IF(from.isFloatReg(), from.floatReg().isSimd128());
MOZ_ASSERT_IF(to.isFloatReg(), to.floatReg().isSimd128());
if (from.isFloatReg()) {
if (to.isFloatReg()) {
masm.moveSimd128Float(from.floatReg(), to.floatReg());
} else {
MOZ_ASSERT(to.isMemory());
masm.storeAlignedSimd128Float(from.floatReg(), getAdjustedAddress(to));
}
} else if (to.isFloatReg()) {
MOZ_ASSERT(from.isMemory());
masm.loadAlignedSimd128Float(getAdjustedAddress(from), to.floatReg());
} else {
MOZ_ASSERT(from.isMemory());
MOZ_ASSERT(to.isMemory());
FloatRegister temp = ScratchSimd128Reg;
masm.loadAlignedSimd128Float(getAdjustedAddress(from), temp);
masm.storeAlignedSimd128Float(temp, getAdjustedAddress(to));
}
}
void
MoveEmitterLoongArch64::emitDoubleMove(const MoveOperand& from, const MoveOperand& to)
{
@@ -13,13 +13,7 @@ namespace jit {
class MoveEmitterLoongArch64 : public MoveEmitterMIPSShared
{
Address cycleSlot(uint32_t slot, uint32_t subslot = 0) const;
void emitDoubleMove(const MoveOperand& from, const MoveOperand& to);
void emitSimd128IntMove(const MoveOperand& from, const MoveOperand& to);
void emitSimd128FloatMove(const MoveOperand& from, const MoveOperand& to);
void emit(const MoveOp& move);
void breakCycle(const MoveOperand& from, const MoveOperand& to,
MoveOp::Type type, uint32_t slot);
void completeCycle(const MoveOperand& from, const MoveOperand& to,
@@ -29,8 +23,6 @@ class MoveEmitterLoongArch64 : public MoveEmitterMIPSShared
MoveEmitterLoongArch64(MacroAssembler& masm)
: MoveEmitterMIPSShared(masm)
{ }
void emit(const MoveResolver& moves);
};
typedef MoveEmitterLoongArch64 MoveEmitter;
@@ -874,13 +874,6 @@ MacroAssembler::branchTestSymbol(Condition cond, Register tag, Label* label)
ma_b(tag, ImmTag(JSVAL_TAG_SYMBOL), label, cond);
}
void
MacroAssembler::branchTestBigInt(Condition cond, Register tag, Label* label)
{
MOZ_ASSERT(cond == Equal || cond == NotEqual);
ma_b(tag, ImmTag(JSVAL_TAG_BIGINT), label, cond);
}
void
MacroAssembler::branchTestSymbol(Condition cond, const BaseIndex& address, Label* label)
{
@@ -614,25 +614,6 @@ CodeGeneratorMIPS64::visitExtendInt32ToInt64(LExtendInt32ToInt64* lir)
masm.ma_sll(output, ToRegister(input), Imm32(0));
}
void
CodeGeneratorMIPS64::visitSignExtendInt64(LSignExtendInt64* lir)
{
Register64 input = ToRegister64(lir->getInt64Operand(0));
Register64 output = ToOutRegister64(lir);
switch (lir->mode()) {
case MSignExtendInt64::Byte:
masm.move8SignExtend(input.reg, output.reg);
break;
case MSignExtendInt64::Half:
masm.move16SignExtend(input.reg, output.reg);
break;
case MSignExtendInt64::Word:
masm.ma_sll(output.reg, input.reg, Imm32(0));
break;
}
}
void
CodeGeneratorMIPS64::visitWrapInt64ToInt32(LWrapInt64ToInt32* lir)
{
-1
View File
@@ -62,7 +62,6 @@ class CodeGeneratorMIPS64 : public CodeGeneratorMIPSShared
void visitWasmReinterpretFromI64(LWasmReinterpretFromI64* lir);
void visitWasmReinterpretToI64(LWasmReinterpretToI64* lir);
void visitExtendInt32ToInt64(LExtendInt32ToInt64* lir);
void visitSignExtendInt64(LSignExtendInt64* lir);
void visitWrapInt64ToInt32(LWrapInt64ToInt32* lir);
void visitClzI64(LClzI64* lir);
void visitCtzI64(LCtzI64* lir);
-6
View File
@@ -184,9 +184,3 @@ LIRGeneratorMIPS64::visitRandom(MRandom* ins)
temp());
defineFixed(lir, ins, LFloatReg(ReturnDoubleReg));
}
void
LIRGeneratorMIPS64::visitSignExtendInt64(MSignExtendInt64* ins)
{
defineInt64(new(alloc()) LSignExtendInt64(useInt64RegisterAtStart(ins->input())), ins);
}
-1
View File
@@ -46,7 +46,6 @@ class LIRGeneratorMIPS64 : public LIRGeneratorMIPSShared
void visitUnbox(MUnbox* unbox);
void visitReturn(MReturn* ret);
void visitRandom(MRandom* ins);
void visitSignExtendInt64(MSignExtendInt64* ins);
};
typedef LIRGeneratorMIPS64 LIRGeneratorSpecific;
@@ -364,18 +364,6 @@ MacroAssembler::rshift64Arithmetic(Register shift, Register64 dest)
// ===============================================================
// Rotation functions
void
MacroAssembler::rotateLeft64(Imm32 count, Register64 src, Register64 dest)
{
rotateLeft64(count, src, dest, InvalidReg);
}
void
MacroAssembler::rotateLeft64(Register count, Register64 src, Register64 dest)
{
rotateLeft64(count, src, dest, InvalidReg);
}
void
MacroAssembler::rotateLeft64(Imm32 count, Register64 src, Register64 dest, Register temp)
{
@@ -394,18 +382,6 @@ MacroAssembler::rotateLeft64(Register count, Register64 src, Register64 dest, Re
ma_drol(dest.reg, src.reg, count);
}
void
MacroAssembler::rotateRight64(Imm32 count, Register64 src, Register64 dest)
{
rotateRight64(count, src, dest, InvalidReg);
}
void
MacroAssembler::rotateRight64(Register count, Register64 src, Register64 dest)
{
rotateRight64(count, src, dest, InvalidReg);
}
void
MacroAssembler::rotateRight64(Imm32 count, Register64 src, Register64 dest, Register temp)
{
+3 -8
View File
@@ -1497,17 +1497,17 @@ MacroAssemblerMIPS64Compat::unboxSymbol(Register src, Register dest)
void MacroAssemblerMIPS64Compat::unboxBigInt(const ValueOperand& operand, Register dest)
{
unboxNonDouble(operand, dest);
unboxNonDouble(operand, dest, JSVAL_TYPE_BIGINT);
}
void MacroAssemblerMIPS64Compat::unboxBigInt(Register src, Register dest)
{
ma_dext(dest, src, Imm32(0), Imm32(JSVAL_TAG_SHIFT));
unboxNonDouble(src, dest, JSVAL_TYPE_BIGINT);
}
void MacroAssemblerMIPS64Compat::unboxBigInt(const Address& src, Register dest)
{
unboxNonDouble(src, dest);
unboxNonDouble(src, dest, JSVAL_TYPE_BIGINT);
}
void
@@ -1559,11 +1559,6 @@ MacroAssemblerMIPS64Compat::unboxPrivate(const ValueOperand& src, Register dest)
void
MacroAssemblerMIPS64Compat::boxDouble(FloatRegister src, const ValueOperand& dest)
{
#if defined(JS_RUNTIME_CANONICAL_NAN)
// Legacy-ABI MIPS hardware can produce NaN payloads that overlap the
// punbox64 tag space. Normalize them before creating a JS::Value.
asMasm().canonicalizeDouble(src);
#endif
as_dmfc1(dest.valueReg(), src);
}
-12
View File
@@ -173,18 +173,6 @@ ICUnaryArith_Int32::Compiler::generateStubCode(MacroAssembler& masm)
masm.neg32(ExtractTemp0);
masm.tagValue(JSVAL_TYPE_INT32, ExtractTemp0, R0);
break;
case JSOP_INC: {
masm.unboxInt32(R0, ExtractTemp0);
masm.ma_addTestOverflow(ExtractTemp0, ExtractTemp0, Imm32(1), &failure);
masm.tagValue(JSVAL_TYPE_INT32, ExtractTemp0, R0);
break;
}
case JSOP_DEC: {
masm.unboxInt32(R0, ExtractTemp0);
masm.ma_subTestOverflow(ExtractTemp0, ExtractTemp0, Imm32(1), &failure);
masm.tagValue(JSVAL_TYPE_INT32, ExtractTemp0, R0);
break;
}
default:
MOZ_CRASH("Unexpected op");
return false;
+2 -3
View File
@@ -85,9 +85,8 @@ CodeGeneratorShared::CodeGeneratorShared(MIRGenerator* gen, LIRGraph* graph, Mac
MOZ_ASSERT(graph->argumentSlotCount() == 0);
frameDepth_ += gen->wasmMaxStackArgBytes();
if (SupportsSimd) {
frameDepth_ = AlignBytes(frameDepth_, SimdMemoryAlignment);
}
static_assert(!SupportsSimd, "we need padding so that local slots are SIMD-aligned and "
"the stack must be kept SIMD-aligned too.");
if (gen->performsCall()) {
// An MWasmCall does not align the stack pointer at calls sites but
+2 -22
View File
@@ -902,28 +902,8 @@ namespace js {
// scheduledForDestruction will be set on the compartment, which will cause
// some extra GC activity to try to free the compartment.
template<typename T> inline void SetMaybeAliveFlag(T* thing) {}
template<> inline void SetMaybeAliveFlag(JSObject* thing) {
// During GC marking of WeakRefs, 'thing' might be an invalid/dangling
// pointer. Verify compartment is accessible.
if (MOZ_LIKELY(thing)) {
JSCompartment* comp = thing->compartment();
if (MOZ_LIKELY(comp)) {
comp->maybeAlive = true;
}
}
}
template<> inline void SetMaybeAliveFlag(JSScript* thing) {
// During GC marking of WeakRefs, 'thing' might be an invalid/dangling
// pointer. Verify compartment is accessible.
if (MOZ_LIKELY(thing)) {
JSCompartment* comp = thing->compartment();
if (MOZ_LIKELY(comp)) {
comp->maybeAlive = true;
}
}
}
template<> inline void SetMaybeAliveFlag(JSObject* thing) {thing->compartment()->maybeAlive = true;}
template<> inline void SetMaybeAliveFlag(JSScript* thing) {thing->compartment()->maybeAlive = true;}
inline js::Handle<js::GlobalObject*>
ExclusiveContext::global() const
+1 -1
View File
@@ -1148,7 +1148,7 @@ js::DumpHeap(JSContext* cx, FILE* fp, js::DumpHeapNurseryBehaviour nurseryBehavi
fprintf(dtrc.output, "==========\n");
dtrc.prefix = "> ";
IterateHeapUnbarriered(cx, &dtrc,
IterateZonesCompartmentsArenasCells(cx, &dtrc,
DumpHeapVisitZone,
DumpHeapVisitCompartment,
DumpHeapVisitArena,
+10 -19
View File
@@ -3646,22 +3646,14 @@ GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoLockForExclusiveAcces
}
/*
* Atoms are not in the cross-compartment map. If there are any zones that
* are not being collected then we cannot collect the atoms zone, otherwise
* the non-collected zones could contain pointers to atoms that we would
* miss.
* Atoms are not in the cross-compartment map. So if there are any
* zones that are not being collected, we are not allowed to collect
* atoms. Otherwise, the non-collected zones could contain pointers
* to atoms that we would miss.
*
* If keepAtoms() is true then either an instance of AutoKeepAtoms is
* currently on the stack or parsing is currently happening on another
* thread. In either case we don't have information about which atoms are
* roots, so we must skip collecting atoms.
*
* Note that only affects the first slice of an incremental GC since root
* marking is completed before we return to the mutator.
*
* Off-main-thread parsing is inhibited after the start of GC which prevents
* races between creating atoms during parsing and sweeping atoms on the
* main thread.
* keepAtoms() will only change on the main thread, which we are currently
* on. If the value of keepAtoms() changes between GC slices, then we'll
* cancel the incremental GC. See IsIncrementalGCSafe.
*/
if (isFull && !rt->keepAtoms()) {
@@ -5618,6 +5610,9 @@ gc::IsIncrementalGCUnsafe(JSRuntime* rt)
{
MOZ_ASSERT(!rt->mainThread.suppressGC);
if (rt->keepAtoms())
return gc::AbortReason::KeepAtomsSet;
if (!rt->gc.isIncrementalGCAllowed())
return gc::AbortReason::IncrementalDisabled;
@@ -5791,10 +5786,6 @@ GCRuntime::gcCycle(bool nonincrementalByAPI, SliceBudget& budget, JS::gcreason::
State prevState = incrementalState;
// We don't allow off-main-thread parsing to start while we're doing an
// incremental GC.
MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->exclusiveThreadsPresent());
if (nonincrementalByAPI) {
// Reset any in progress incremental GC if this was triggered via the
// API. This isn't required for correctness, but sometimes during tests
+3 -6
View File
@@ -56,7 +56,7 @@ enum class State {
D(None) \
D(NonIncrementalRequested) \
D(AbortRequested) \
D(Unused1) \
D(KeepAtomsSet) \
D(IncrementalDisabled) \
D(ModeChange) \
D(MallocBytesTrigger) \
@@ -1065,12 +1065,9 @@ typedef void (*IterateCellCallback)(JSRuntime* rt, void* data, void* thing,
* This function calls |zoneCallback| on every zone, |compartmentCallback| on
* every compartment, |arenaCallback| on every in-use arena, and |cellCallback|
* on every in-use cell in the GC heap.
*
* Note that no read barrier is triggered on the cells passed to cellCallback,
* so no these pointers must not escape the callback.
*/
extern void
IterateHeapUnbarriered(JSContext* cx, void* data,
IterateZonesCompartmentsArenasCells(JSContext* cx, void* data,
IterateZoneCallback zoneCallback,
JSIterateCompartmentCallback compartmentCallback,
IterateArenaCallback arenaCallback,
@@ -1081,7 +1078,7 @@ IterateHeapUnbarriered(JSContext* cx, void* data,
* single zone.
*/
extern void
IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data,
IterateZoneCompartmentsArenasCells(JSContext* cx, Zone* zone, void* data,
IterateZoneCallback zoneCallback,
JSIterateCompartmentCallback compartmentCallback,
IterateArenaCallback arenaCallback,
+2 -8
View File
@@ -147,6 +147,8 @@ class ArenaCellIterImpl
void init(Arena* arena, CellIterNeedsBarrier mayNeedBarrier) {
MOZ_ASSERT(!initialized);
MOZ_ASSERT(arena);
MOZ_ASSERT_IF(!mayNeedBarrier,
CurrentThreadIsPerformingGC() || CurrentThreadIsGCSweeping());
initialized = true;
AllocKind kind = arena->getAllocKind();
firstThingOffset = Arena::firstThingOffset(kind);
@@ -234,14 +236,6 @@ class ArenaCellIterUnderFinalize : public ArenaCellIterImpl
}
};
class ArenaCellIterUnbarriered : public ArenaCellIterImpl
{
public:
explicit ArenaCellIterUnbarriered(Arena* arena)
: ArenaCellIterImpl(arena, CellIterDoesntNeedBarrier)
{}
};
template <typename T>
class ZoneCellIter;
+1 -8
View File
@@ -940,14 +940,7 @@ GlobalHelperThreadState::maxParseThreads() const
if (IsHelperThreadSimulatingOOM(js::oom::THREAD_TYPE_PARSE))
return 1;
// Use the number of logical processors in a system.
if (cpuCount < 4)
return 2;
//return cpuCount - 2;
// XXX Issue #3172 XXX
// For the time being, return a hard-coded value of 2 on all targets and CPUs.
// It's unclear where the contention happens, but it has shown to be detrimental
// especially on *nixes and older hardware.
return 2;
return cpuCount;
}
size_t
-33
View File
@@ -8,8 +8,6 @@
#include "js/Initialization.h"
#include "mozilla/Assertions.h"
#include "mozilla/Casting.h"
#include "mozilla/FloatingPoint.h"
#include <ctype.h>
@@ -21,7 +19,6 @@
#include "jit/ExecutableAllocator.h"
#include "jit/Ion.h"
#include "js/Utility.h"
#include "js/Value.h"
#include "unicode/uclean.h"
#include "unicode/utypes.h"
#include "vm/DateTime.h"
@@ -37,31 +34,6 @@ using js::FutexRuntime;
InitState JS::detail::libraryInitState;
// MIPS-specific
#if defined(JS_RUNTIME_CANONICAL_NAN)
namespace JS {
namespace detail {
JS_PUBLIC_DATA(uint64_t) CanonicalizedNaNBits;
} // namespace detail
} // namespace JS
// MIPS-specific
static void
SetupCanonicalNaN()
{
// Use a real hardware operation. A legacy MIPS ABI can run on hardware
// whose NaN behavior does not match the compiler's predefined NAN value.
volatile double infinity = mozilla::PositiveInfinity<double>();
volatile double hardwareNaN = infinity - infinity;
uint64_t hardwareNaNBits = mozilla::BitwiseCast<uint64_t>(hardwareNaN);
hardwareNaNBits &= ~mozilla::FloatingPoint<double>::kSignBit;
// The selected NaN must remain a double in the JS::Value representation.
MOZ_RELEASE_ASSERT(JS::Value::fromRawBits(hardwareNaNBits).isDouble());
JS::detail::CanonicalizedNaNBits = hardwareNaNBits;
}
#endif
#ifdef DEBUG
static unsigned
MessageParameterCount(const char* format)
@@ -104,11 +76,6 @@ JS::detail::InitWithFailureDiagnostic(bool isDebugBuild)
MOZ_ASSERT(!JSRuntime::hasLiveRuntimes(),
"how do we have live runtimes before JS_Init?");
// MIPS-specific
#if defined(JS_RUNTIME_CANONICAL_NAN)
SetupCanonicalNaN();
#endif
PRMJ_NowInit();
// The first invocation of `ProcessCreation` creates a temporary thread
+2 -2
View File
@@ -770,7 +770,7 @@ CollectRuntimeStatsHelper(JSContext* cx, RuntimeStats* rtStats, ObjectPrivateVis
StatsClosure closure(rtStats, opv, anonymize);
if (!closure.init())
return false;
IterateHeapUnbarriered(cx, &closure,
IterateZonesCompartmentsArenasCells(cx, &closure,
StatsZoneCallback,
StatsCompartmentCallback,
StatsArenaCallback,
@@ -916,7 +916,7 @@ AddSizeOfTab(JSContext* cx, HandleObject obj, MallocSizeOf mallocSizeOf, ObjectP
StatsClosure closure(&rtStats, opv, /* anonymize = */ false);
if (!closure.init())
return false;
IterateHeapUnbarrieredForZone(cx, zone, &closure,
IterateZoneCompartmentsArenasCells(cx, zone, &closure,
StatsZoneCallback,
StatsCompartmentCallback,
StatsArenaCallback,
+2 -1
View File
@@ -1740,7 +1740,8 @@ JS::ProfilingFrameIterator::ProfilingFrameIterator(JSContext* cx, const Register
: rt_(cx),
sampleBufferGen_(sampleBufferGen),
activation_(nullptr),
savedPrevJitTop_(nullptr)
savedPrevJitTop_(nullptr),
nogc_(cx)
{
if (!cx->spsProfiler.enabled())
MOZ_CRASH("ProfilingFrameIterator called when spsProfiler not enabled for runtime.");
+1
View File
@@ -1059,6 +1059,7 @@ wasm::GenerateInterruptExit(MacroAssembler& masm, Label* throwLabel)
// jump scratch to resume execution.
masm.subFromStackPtr(Imm32(sizeof(intptr_t)));
masm.setFramePushed(0);
static_assert(!SupportsSimd, "high lanes of SIMD registers need to be saved too.");
masm.PushRegsInMask(AllRegsExceptSP);
// Save the unaligned stack pointer in a non-volatile register, then align
+26 -64
View File
@@ -261,7 +261,7 @@ RestyleManager::ContentStateChanged(nsIContent* aContent,
ContentStateChangedInternal(aElement, aStateMask, &changeHint, &restyleHint);
PostRestyleEvent(aElement, restyleHint, changeHint);
RestyleForHasPseudoClassChange(aElement, aStateMask);
RestyleForHasPseudoClassChange(aElement);
}
// Forwarded nsIMutationObserver method, to handle restyling.
@@ -282,12 +282,6 @@ RestyleManager::AttributeWillChange(Element* aElement,
aNewValue,
rsdata);
PostRestyleEvent(aElement, rshint, nsChangeHint(0), &rsdata);
// Class values are preparsed by Element before this notification. Compare
// membership now: AttributeChanged need not receive the previous value.
if (aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::_class) {
RestyleForHasPseudoClassChange(aElement, EventStates(), aAttribute,
aNewValue, true);
}
}
// Forwarded nsIMutationObserver method, to handle restyling (and
@@ -379,68 +373,30 @@ RestyleManager::AttributeChanged(Element* aElement,
aOldValue,
rsdata);
PostRestyleEvent(aElement, rshint, hint, &rsdata);
if (aNameSpaceID != kNameSpaceID_None || aAttribute != nsGkAtoms::_class) {
RestyleForHasPseudoClassChange(aElement, EventStates(), aAttribute);
}
RestyleForHasPseudoClassChange(aElement);
}
void
RestyleManager::RestyleForHasPseudoClassChange(nsINode* aNode,
EventStates aStateMask,
nsIAtom* aAttribute,
const nsAttrValue* aNewClasses,
bool aCompareClasses)
bool
RestyleManager::RestyleForHasPseudoClassChange(nsINode* aNode)
{
MOZ_ASSERT(!aAttribute || aNode->IsElement());
if (!aNode->OwnerDoc()->GetProperty(nsGkAtoms::hasSelectorDependency)) {
return;
}
using Dependency = nsCSSRuleUtils::HasSelectorDependency;
auto restyleAnchor = [&](Element* aAnchor, Dependency* aDependency) {
nsRestyleHint hint = eRestyle_Subtree;
if (aDependency->mRestyleLaterSiblings) {
hint = nsRestyleHint(hint | eRestyle_LaterSiblings);
}
PostRestyleEvent(aAnchor, hint, nsChangeHint(0));
};
Element* affectedRoot = nullptr;
for (nsINode* node = aNode; node; node = node->GetParentNode()) {
auto* dependency = static_cast<Dependency*>(
node->GetProperty(nsGkAtoms::hasSelectorDependency));
if (!dependency) {
if (!node->GetProperty(nsGkAtoms::hasSelectorDependency)) {
continue;
}
if (node->IsElement() && dependency->MightDependOnChange(
node->AsElement(), aNode, aStateMask, aAttribute, aNewClasses,
aCompareClasses, false)) {
restyleAnchor(node->AsElement(), dependency);
}
if (!dependency->MightAffectSiblingAnchor(
node, aNode, aStateMask, aAttribute, aNewClasses, aCompareClasses)) {
continue;
}
// The parent is an index of sibling anchors, not itself an anchor. Keep
// unrelated subtrees out of the restyle, including mutations deep inside
// a sibling whose :has() argument only inspects the sibling element.
bool nodeIsFollowingSibling = true;
for (nsIContent* child = node->GetFirstChild(); child;
child = child->GetNextSibling()) {
if (child == aNode) {
nodeIsFollowingSibling = false;
}
if (!child->IsElement()) {
continue;
}
auto* siblingDependency = static_cast<Dependency*>(
child->GetProperty(nsGkAtoms::hasSelectorDependency));
if (siblingDependency && siblingDependency->MightDependOnChange(
child->AsElement(), aNode, aStateMask, aAttribute, aNewClasses,
aCompareClasses, true, nodeIsFollowingSibling)) {
restyleAnchor(child->AsElement(), siblingDependency);
}
if (node->IsElement()) {
affectedRoot = node->AsElement();
} else if (ShadowRoot* shadow = ShadowRoot::FromNode(node)) {
affectedRoot = shadow->GetHost();
}
}
if (!affectedRoot) {
return false;
}
PostRestyleEvent(affectedRoot, eRestyle_Subtree, nsChangeHint(0));
return true;
}
/* static */ uint64_t
@@ -469,7 +425,9 @@ RestyleManager::RestyleForAppend(nsIContent* aContainer,
nsIContent* aFirstNewContent)
{
// The container cannot be a document, but might be a ShadowRoot.
RestyleForHasPseudoClassChange(aContainer);
if (RestyleForHasPseudoClassChange(aContainer)) {
return;
}
if (!aContainer->IsElement()) {
return;
@@ -560,7 +518,9 @@ RestyleManager::RestyleForInsertOrChange(nsINode* aContainer,
nsIContent* aChild)
{
// The container might be a document or a ShadowRoot.
RestyleForHasPseudoClassChange(aContainer);
if (RestyleForHasPseudoClassChange(aContainer)) {
return;
}
if (!aContainer->IsElement()) {
return;
@@ -652,7 +612,9 @@ RestyleManager::ContentRemoved(nsINode* aContainer,
nsIContent* aFollowingSibling)
{
// The container might be a document or a ShadowRoot.
RestyleForHasPseudoClassChange(aContainer);
if (RestyleForHasPseudoClassChange(aContainer)) {
return;
}
if (!aContainer->IsElement()) {
return;
+3 -8
View File
@@ -314,14 +314,9 @@ public:
// the container is null, no work is needed.
void RestyleForAppend(nsIContent* aContainer, nsIContent* aFirstNewContent);
// Restyle affected :has() anchors, retaining normal mutation invalidation.
// With no state/attribute, aNode is the container of a content mutation.
// Class changes are compared before mutation, while both values are known.
void RestyleForHasPseudoClassChange(nsINode* aNode,
EventStates aStateMask = EventStates(),
nsIAtom* aAttribute = nullptr,
const nsAttrValue* aNewClasses = nullptr,
bool aCompareClasses = false);
// Restyle a subtree containing any :has() anchor affected by a change at
// or below aNode. Returns true when such a restyle was posted.
bool RestyleForHasPseudoClassChange(nsINode* aNode);
// Process any pending restyles. This should be called after
// CreateNeededFrames.
+4 -9
View File
@@ -185,18 +185,15 @@ struct InlineBackgroundData
mPIStartBorderData.SetCoord(joinedBorderArea.x);
}
} else if (mPIStartBorderData.mFrame) {
// Copy data to a temporary object so that computing the
// continous rect here doesn't clobber our normal state.
InlineBackgroundData temp = *this;
if (mVertical) {
mPIStartBorderData.SetCoord(temp.GetContinuousRect(mPIStartBorderData.mFrame).y);
mPIStartBorderData.SetCoord(GetContinuousRect(mPIStartBorderData.mFrame).y);
} else {
mPIStartBorderData.SetCoord(temp.GetContinuousRect(mPIStartBorderData.mFrame).x);
mPIStartBorderData.SetCoord(GetContinuousRect(mPIStartBorderData.mFrame).x);
}
}
} else {
// ... and restore it when possible.
mPIStartBorderData.SetCoord(saved.mCoord);
mPIStartBorderData.mCoord = saved.mCoord;
}
if (mVertical) {
if (joinedBorderArea.y > mPIStartBorderData.mCoord) {
@@ -345,7 +342,6 @@ protected:
// Start with the previous flow frame as our continuation point
// is the total of the widths of the previous frames.
nsIFrame* inlineFrame = GetPrevContinuation(aFrame);
bool changedLines = false;
while (inlineFrame) {
if (!mPIStartBorderData.mFrame &&
!(mVertical ? inlineFrame->GetSkipSides().Top()
@@ -354,9 +350,8 @@ protected:
}
nsRect rect = inlineFrame->GetRect();
mContinuationPoint += mVertical ? rect.height : rect.width;
if (mBidiEnabled && (changedLines || !AreOnSameLine(aFrame, inlineFrame))) {
if (mBidiEnabled && !AreOnSameLine(aFrame, inlineFrame)) {
mLineContinuationPoint += mVertical ? rect.height : rect.width;
changedLines = true;
}
mUnbrokenMeasure += mVertical ? rect.height : rect.width;
mBoundingBox.UnionRect(mBoundingBox, rect);
+1 -5
View File
@@ -8938,11 +8938,7 @@ PresShell::DidDoReflow(bool aInterruptible)
{
mFrameConstructor->EndUpdate();
if (!mHandlingCallbacks) {
mHandlingCallbacks = true; // Prevent recursion
HandlePostedReflowCallbacks(aInterruptible);
mHandlingCallbacks = false;
}
HandlePostedReflowCallbacks(aInterruptible);
nsCOMPtr<nsIDocShell> docShell = mPresContext->GetDocShell();
if (docShell) {
-2
View File
@@ -926,8 +926,6 @@ protected:
bool mAsyncResizeTimerIsActive : 1;
bool mInResize : 1;
bool mHandlingCallbacks : 1;
bool mApproximateFrameVisibilityVisited : 1;
+2 -2
View File
@@ -164,9 +164,9 @@ nsFileControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
// We should be able to interact with the element by doing drag and drop.
mContent->AddSystemEventListener(NS_LITERAL_STRING("drop"),
mMouseListener, false, false);
mMouseListener, false);
mContent->AddSystemEventListener(NS_LITERAL_STRING("dragover"),
mMouseListener, false, false);
mMouseListener, false);
SyncDisabledState();
+8 -7
View File
@@ -235,17 +235,18 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
WritingMode wm = GetWritingMode();
LogicalSize availSize = aButtonReflowInput.ComputedSize(wm);
// The anonymous button-content frame cannot have a continuation. Give it
// unconstrained available block-size so flex/grid layout does not treat a
// definite button block-size as a fragmentainer constraint. Its computed
// block-size is overridden separately below when it needs to be definite.
availSize.BSize(wm) = NS_INTRINSICSIZE;
// Identify if the inner anonymous block is actually functioning as a flex or grid container.
nsIAtom* kidType = aFirstKid->GetType();
bool isFlexOrGrid = (kidType == nsGkAtoms::flexContainerFrame ||
kidType == nsGkAtoms::gridContainerFrame);
// Preserve the button's definite BSize ONLY for flex/grid children so they
// see a definite containing block main size. For standard buttons, clobber
// to intrinsic so standard vertical centering (extraSpace) calculations work.
if (!isFlexOrGrid || aButtonReflowInput.ComputedBSize() == NS_INTRINSICSIZE) {
availSize.BSize(wm) = NS_INTRINSICSIZE;
}
// shorthand for a value we need to use in a bunch of places
const LogicalMargin& clbp = aButtonReflowInput.ComputedLogicalBorderPadding();
@@ -259,7 +260,7 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
availSize);
// Apply the definite BSize directly on the inner reflow input ONLY if it's
// a flex or grid container, without constraining its available BSize.
// a flex or grid container, allowing it to be used as-is.
if (isFlexOrGrid && aButtonReflowInput.ComputedBSize() != NS_INTRINSICSIZE) {
contentsReflowInput.SetComputedBSize(aButtonReflowInput.ComputedBSize());
}
+1 -9
View File
@@ -1781,7 +1781,6 @@ CSSStyleSheet::DidDirty()
MOZ_ASSERT(!mInner->mComplete || mDirty,
"caller must have called WillDirty()");
ClearRuleCascades();
NotifyAdopterRuleChanged();
}
void
@@ -1871,20 +1870,13 @@ CSSStyleSheet::InsertRuleInternal(const nsAString& aRule,
RefPtr<css::Rule> rule;
aRv = css.ParseRule(aRule, mInner->mSheetURI, mInner->mBaseURI,
mInner->mPrincipal, getter_AddRefs(rule));
// A syntax error from web content is an expected insertRule() outcome. The
// binding reports it to script; do not flood debug stderr as well.
if (aRv.Failed()) {
if (NS_WARN_IF(aRv.Failed())) {
return 0;
}
// Hierarchy checking.
int32_t newType = rule->GetType();
if (IsConstructed() && newType == css::Rule::IMPORT_RULE) {
aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
return 0;
}
// check that we're not inserting before a charset rule
css::Rule* nextRule = mInner->mOrderedRules.SafeObjectAt(aIndex);
if (nextRule) {
+2 -6
View File
@@ -639,12 +639,8 @@ Declaration::GetPropertyValueInternal(
}
if (revertCount == totalCount) {
// Simplify serialization below by serializing revert up-front.
// eCSSUnit_Revert carries the cascade origin, so it cannot use the
// nsCSSValue constructor reserved for valueless units.
nsCSSValue revert;
revert.SetRevertValue(SheetType::Unknown);
revert.AppendToString(eCSSProperty_UNKNOWN, aValue,
nsCSSValue::eNormalized);
nsCSSValue(eCSSUnit_Revert).AppendToString(eCSSProperty_UNKNOWN, aValue,
nsCSSValue::eNormalized);
return;
}
if (revertLayerCount == totalCount) {
-3
View File
@@ -24,7 +24,6 @@
#include "nsNameSpaceManager.h"
#include "nsXMLNameSpaceMap.h"
#include "nsCSSParser.h"
#include "nsCSSRuleUtils.h"
#include "nsCSSPseudoClasses.h"
#include "nsCSSAnonBoxes.h"
#include "nsTArray.h"
@@ -1010,7 +1009,6 @@ nsCSSSelectorList::~nsCSSSelectorList()
nsCSSSelector*
nsCSSSelectorList::AddSelector(char16_t aOperator)
{
mHasSelectorData = nullptr;
nsCSSSelector* newSel = new nsCSSSelector();
if (mSelectors) {
@@ -1028,7 +1026,6 @@ nsCSSSelectorList::AddSelector(char16_t aOperator)
void
nsCSSSelectorList::RemoveRightmostSelector()
{
mHasSelectorData = nullptr;
nsCSSSelector* current = mSelectors;
mSelectors = mSelectors->mNext;
MOZ_ASSERT(mSelectors,
-4
View File
@@ -34,7 +34,6 @@
class nsIAtom;
struct nsCSSSelectorList;
struct nsCSSHasSelectorData;
namespace mozilla {
enum class CSSPseudoClassType : uint8_t;
@@ -319,9 +318,6 @@ struct nsCSSSelectorList {
// stored as their leftmost selector. This flag keeps that implementation
// detail out of serialization and is preserved by cloning.
bool mIsRelativeSelector;
// Immutable dependency metadata, collected lazily for a :has() argument.
// Nodes retain this data independently of the stylesheet's lifetime.
RefPtr<nsCSSHasSelectorData> mHasSelectorData;
protected:
friend class inDOMUtils;
nsCSSSelectorList* Clone(bool aDeep) const;
+1 -62
View File
@@ -28,7 +28,6 @@ StyleSheet::StyleSheet(css::SheetParsingMode aParsingMode)
, mDisabled(false)
, mConstructed(false)
, mDisallowModification(false)
, mAdoptionCount(0)
, mDocumentAssociationMode(NotOwnedByDocument)
{
}
@@ -43,7 +42,6 @@ StyleSheet::StyleSheet(const StyleSheet& aCopy,
, mDisabled(aCopy.mDisabled)
, mConstructed(aCopy.mConstructed)
, mDisallowModification(false)
, mAdoptionCount(0)
// We only use this constructor during cloning. It's the cloner's
// responsibility to notify us if we end up being owned by a document.
, mDocumentAssociationMode(NotOwnedByDocument)
@@ -60,7 +58,7 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(StyleSheet)
NS_IMPL_CYCLE_COLLECTING_RELEASE(StyleSheet)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(StyleSheet, mConstructorDocument)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(StyleSheet)
mozilla::dom::CSSStyleSheetParsingMode
StyleSheet::ParsingModeDOM()
@@ -261,69 +259,10 @@ StyleSheet::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
sheet->SetPrincipal(principal);
sheet->SetComplete();
sheet->SetConstructed();
sheet->SetConstructorDocument(document);
return sheet.forget();
}
void
StyleSheet::AddAdopter(nsIDocument* aDocument)
{
MOZ_ASSERT(IsConstructed());
MOZ_ASSERT(aDocument);
MOZ_ASSERT(ConstructorDocument() == aDocument);
if (mAdoptionCount++ == 0) {
SetAssociatedDocument(aDocument, NotOwnedByDocument);
}
}
void
StyleSheet::AddAdopter(dom::ShadowRoot* aShadowRoot)
{
MOZ_ASSERT(aShadowRoot);
mAdopterShadowRoots.AppendElement(aShadowRoot);
AddAdopter(aShadowRoot->OwnerDoc());
}
void
StyleSheet::RemoveAdopter(nsIDocument* aDocument)
{
MOZ_ASSERT(IsConstructed());
MOZ_ASSERT(aDocument);
MOZ_ASSERT(ConstructorDocument() == aDocument);
MOZ_ASSERT(mAdoptionCount > 0);
if (mAdoptionCount == 0) {
return;
}
if (--mAdoptionCount == 0 && !IsOwnedByDocument()) {
ClearAssociatedDocument();
}
}
void
StyleSheet::RemoveAdopter(dom::ShadowRoot* aShadowRoot)
{
MOZ_ASSERT(aShadowRoot);
mAdopterShadowRoots.RemoveElement(aShadowRoot);
RemoveAdopter(aShadowRoot->OwnerDoc());
}
void
StyleSheet::NotifyAdopterRuleChanged()
{
for (size_t i = 0; i < mAdopterShadowRoots.Length(); ++i) {
dom::ShadowRoot* shadowRoot = mAdopterShadowRoots[i];
if (mAdopterShadowRoots.IndexOf(shadowRoot) == i) {
shadowRoot->StyleSheetChanged();
}
}
}
dom::CSSRuleList*
StyleSheet::GetCssRules(nsIPrincipal& aSubjectPrincipal,
ErrorResult& aRv)
+1 -18
View File
@@ -12,7 +12,6 @@
#include "mozilla/CORSMode.h"
#include "nsIDOMCSSStyleSheet.h"
#include "nsTArray.h"
#include "nsWrapperCache.h"
class nsIDocument;
@@ -27,7 +26,6 @@ struct StyleSheetInfo;
namespace dom {
class CSSRuleList;
class ShadowRoot;
class SRIMetadata;
} // namespace dom
@@ -195,13 +193,6 @@ public:
inline void DidDirty();
inline void AssertHasUniqueInner();
bool IsConstructed() const { return mConstructed; }
nsIDocument* ConstructorDocument() const { return mConstructorDocument; }
void AddAdopter(nsIDocument* aDocument);
void RemoveAdopter(nsIDocument* aDocument);
void AddAdopter(dom::ShadowRoot* aShadowRoot);
void RemoveAdopter(dom::ShadowRoot* aShadowRoot);
private:
// Get a handle to the various stylesheet bits which live on the 'inner' for
// gecko stylesheets.
@@ -215,12 +206,8 @@ private:
bool AreRulesAvailable(nsIPrincipal& aSubjectPrincipal,
ErrorResult& aRv);
bool IsConstructed() const { return mConstructed; }
void SetConstructed() { mConstructed = true; }
void SetConstructorDocument(nsIDocument* aDocument)
{
MOZ_ASSERT(IsConstructed());
mConstructorDocument = aDocument;
}
bool IsModificationDisallowed() const { return mDisallowModification; }
protected:
@@ -230,13 +217,10 @@ protected:
// it will set the principal of the inner to the subject principal.
void SubjectSubsumesInnerPrincipal(nsIPrincipal& aSubjectPrincipal,
ErrorResult& aRv);
void NotifyAdopterRuleChanged();
nsString mTitle;
nsIDocument* mDocument; // weak ref; parents maintain this for their children
RefPtr<nsIDocument> mConstructorDocument;
nsINode* mOwningNode; // weak ref
nsTArray<dom::ShadowRoot*> mAdopterShadowRoots; // weak; roots unadopt on unlink/destruction
// mParsingMode controls access to nonstandard style constructs that
// are not safe for use on the public Web but necessary in UA sheets
@@ -246,7 +230,6 @@ protected:
bool mDisabled;
bool mConstructed;
bool mDisallowModification;
uint32_t mAdoptionCount;
// mDocumentAssociationMode determines whether mDocument directly owns us (in
// the sense that if it's known-live then we're known-live). Always
+6 -4
View File
@@ -13454,16 +13454,18 @@ bool
CSSParserImpl::ParseAspectRatioRatio(nsCSSValue& aValue)
{
nsCSSValue width;
if (ParseNonNegativeVariant(width, VARIANT_NUMBER | VARIANT_CALC,
nullptr) != CSSParseResult::Ok) {
if (!ParseSingleTokenNonNegativeVariant(width,
VARIANT_NUMBER | VARIANT_CALC,
nullptr)) {
return false;
}
nsCSSValue height;
height.SetFloatValue(1.0f, eCSSUnit_Number);
if (ExpectSymbol('/', true)) {
if (ParseNonNegativeVariant(height, VARIANT_NUMBER | VARIANT_CALC,
nullptr) != CSSParseResult::Ok) {
if (!ParseSingleTokenNonNegativeVariant(height,
VARIANT_NUMBER | VARIANT_CALC,
nullptr)) {
return false;
}
}
+2 -2
View File
@@ -77,9 +77,9 @@ CSS_PSEUDO_CLASS(is, ":is", 0, "layout.css.is-where-pseudo.enabled")
CSS_PSEUDO_CLASS(matches, ":matches", 0, "layout.css.is-where-pseudo.enabled")
CSS_PSEUDO_CLASS(any, ":any", 0, "layout.css.is-where-pseudo.enabled")
CSS_PSEUDO_CLASS(where, ":where", 0, "layout.css.is-where-pseudo.enabled")
CSS_PSEUDO_CLASS(has, ":has", 0, "layout.css.has-pseudo.enabled")
CSS_PSEUDO_CLASS(has, ":has", 0, "")
CSS_PSEUDO_CLASS(mozHasRelativeAnchor, ":-moz-has-relative-anchor",
CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS_AND_CHROME, "layout.css.has-pseudo.enabled")
CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS_AND_CHROME, "")
CSS_PSEUDO_CLASS(firstChild, ":first-child", 0, "")
CSS_PSEUDO_CLASS(firstNode, ":-moz-first-node", 0, "")
Loaded 100 of 130 files, more files were not shown because too many files have changed in this diff. Show more