mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Implement punbox Value -> {Type,Payload} conversion helpers.
This commit is contained in:
parent
882f581f03
commit
efe74a5af3
@ -93,7 +93,6 @@ class Assembler : public BaseAssembler
|
|||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Don't really need this..? */
|
|
||||||
void loadValue(Address address, RegisterID dst) {
|
void loadValue(Address address, RegisterID dst) {
|
||||||
loadPtr(address, dst);
|
loadPtr(address, dst);
|
||||||
}
|
}
|
||||||
@ -102,39 +101,42 @@ class Assembler : public BaseAssembler
|
|||||||
loadPtr(address, dst);
|
loadPtr(address, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void convertValueToType(RegisterID val) {
|
||||||
|
andPtr(Imm64(JSVAL_TAG_MASK), val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void convertValueToPayload(RegisterID val) {
|
||||||
|
andPtr(Imm64(JSVAL_PAYLOAD_MASK), val);
|
||||||
|
}
|
||||||
|
|
||||||
void loadValueThenType(Address address, RegisterID val, RegisterID type) {
|
void loadValueThenType(Address address, RegisterID val, RegisterID type) {
|
||||||
loadValue(valueOf(address), val);
|
loadValue(valueOf(address), val);
|
||||||
if (val != type)
|
if (val != type)
|
||||||
move(val, type);
|
move(val, type);
|
||||||
andPtr(Imm64(JSVAL_TAG_MASK), type);
|
convertValueToType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadValueThenType(BaseIndex address, RegisterID val, RegisterID type) {
|
void loadValueThenType(BaseIndex address, RegisterID val, RegisterID type) {
|
||||||
loadValue(valueOf(address), val);
|
loadValue(valueOf(address), val);
|
||||||
if (val != type)
|
if (val != type)
|
||||||
move(val, type);
|
move(val, type);
|
||||||
andPtr(Imm64(JSVAL_TAG_MASK), type);
|
convertValueToType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadValueThenPayload(Address address, RegisterID val, RegisterID payload) {
|
void loadValueThenPayload(Address address, RegisterID val, RegisterID payload) {
|
||||||
loadValue(valueOf(address), val);
|
loadValue(valueOf(address), val);
|
||||||
if (val != payload)
|
if (val != payload)
|
||||||
move(val, payload);
|
move(val, payload);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), payload);
|
convertValueToPayload(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadValueThenPayload(BaseIndex address, RegisterID val, RegisterID payload) {
|
void loadValueThenPayload(BaseIndex address, RegisterID val, RegisterID payload) {
|
||||||
loadValue(valueOf(address), val);
|
loadValue(valueOf(address), val);
|
||||||
if (val != payload)
|
if (val != payload)
|
||||||
move(val, payload);
|
move(val, payload);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), payload);
|
convertValueToPayload(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: All this gets to go.
|
|
||||||
* This needs to be part of the FrameState, since it will
|
|
||||||
* be performing register allocation.
|
|
||||||
*/
|
|
||||||
void loadTypeTag(Address address, RegisterID reg) {
|
void loadTypeTag(Address address, RegisterID reg) {
|
||||||
loadValueThenType(valueOf(address), reg, reg);
|
loadValueThenType(valueOf(address), reg, reg);
|
||||||
}
|
}
|
||||||
@ -145,14 +147,14 @@ class Assembler : public BaseAssembler
|
|||||||
|
|
||||||
void storeTypeTag(ImmShiftedTag imm, Address address) {
|
void storeTypeTag(ImmShiftedTag imm, Address address) {
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), Registers::ValueReg);
|
convertValueToPayload(Registers::ValueReg);
|
||||||
orPtr(imm, Registers::ValueReg);
|
orPtr(imm, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
}
|
}
|
||||||
|
|
||||||
void storeTypeTag(ImmShiftedTag imm, BaseIndex address) {
|
void storeTypeTag(ImmShiftedTag imm, BaseIndex address) {
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), Registers::ValueReg);
|
convertValueToPayload(Registers::ValueReg);
|
||||||
orPtr(imm, Registers::ValueReg);
|
orPtr(imm, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
}
|
}
|
||||||
@ -160,7 +162,7 @@ class Assembler : public BaseAssembler
|
|||||||
void storeTypeTag(RegisterID reg, Address address) {
|
void storeTypeTag(RegisterID reg, Address address) {
|
||||||
/* The type tag must be stored in shifted format. */
|
/* The type tag must be stored in shifted format. */
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), Registers::ValueReg);
|
convertValueToPayload(Registers::ValueReg);
|
||||||
orPtr(reg, Registers::ValueReg);
|
orPtr(reg, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
|
|
||||||
@ -169,7 +171,7 @@ class Assembler : public BaseAssembler
|
|||||||
void storeTypeTag(RegisterID reg, BaseIndex address) {
|
void storeTypeTag(RegisterID reg, BaseIndex address) {
|
||||||
/* The type tag must be stored in shifted format. */
|
/* The type tag must be stored in shifted format. */
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_PAYLOAD_MASK), Registers::ValueReg);
|
convertValueToPayload(Registers::ValueReg);
|
||||||
orPtr(reg, Registers::ValueReg);
|
orPtr(reg, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
}
|
}
|
||||||
@ -185,7 +187,7 @@ class Assembler : public BaseAssembler
|
|||||||
void storePayload(RegisterID reg, Address address) {
|
void storePayload(RegisterID reg, Address address) {
|
||||||
/* Not for doubles. */
|
/* Not for doubles. */
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_TAG_MASK), Registers::ValueReg);
|
convertValueToType(Registers::ValueReg);
|
||||||
orPtr(reg, Registers::ValueReg);
|
orPtr(reg, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
}
|
}
|
||||||
@ -193,7 +195,7 @@ class Assembler : public BaseAssembler
|
|||||||
void storePayload(RegisterID reg, BaseIndex address) {
|
void storePayload(RegisterID reg, BaseIndex address) {
|
||||||
/* Not for doubles. */
|
/* Not for doubles. */
|
||||||
loadValue(valueOf(address), Registers::ValueReg);
|
loadValue(valueOf(address), Registers::ValueReg);
|
||||||
andPtr(Imm64(JSVAL_TAG_MASK), Registers::ValueReg);
|
convertValueToType(Registers::ValueReg);
|
||||||
orPtr(reg, Registers::ValueReg);
|
orPtr(reg, Registers::ValueReg);
|
||||||
storePtr(Registers::ValueReg, valueOf(address));
|
storePtr(Registers::ValueReg, valueOf(address));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user