Skip to content

Commit 06847fb

Browse files
Ilya RezvovV8 LUCI CQ
authored andcommitted
[wasm] Introduce F16 value type
Bug: 337998764 Change-Id: Ibb31ffa9f3ae8c309c277983cafb8a5dc45aa55a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5703478 Reviewed-by: Shu-yu Guo <[email protected]> Commit-Queue: Ilya Rezvov <[email protected]> Reviewed-by: Jakob Kummerow <[email protected]> Cr-Commit-Position: refs/heads/main@{#95069}
1 parent c9e9f27 commit 06847fb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+195
-8
lines changed

src/codegen/machine-type.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ const char* MachineReprToString(MachineRepresentation rep) {
3939
return "kRepWord32";
4040
case MachineRepresentation::kWord64:
4141
return "kRepWord64";
42+
case MachineRepresentation::kFloat16:
43+
return "kRepFloat16";
4244
case MachineRepresentation::kFloat32:
4345
return "kRepFloat32";
4446
case MachineRepresentation::kFloat64:

src/codegen/machine-type.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ enum class MachineRepresentation : uint8_t {
4848
// point into the sandbox.
4949
kSandboxedPointer,
5050
// FP and SIMD representations must be last, and in order of increasing size.
51+
kFloat16,
5152
kFloat32,
5253
kFloat64,
5354
kSimd128,
5455
kSimd256,
55-
kFirstFPRepresentation = kFloat32,
56+
kFirstFPRepresentation = kFloat16,
5657
kLastRepresentation = kSimd256
5758
};
5859

@@ -66,6 +67,7 @@ bool IsSubtype(MachineRepresentation rep1, MachineRepresentation rep2);
6667
ASSERT_CONSECUTIVE(Word8, Word16)
6768
ASSERT_CONSECUTIVE(Word16, Word32)
6869
ASSERT_CONSECUTIVE(Word32, Word64)
70+
ASSERT_CONSECUTIVE(Float16, Float32)
6971
ASSERT_CONSECUTIVE(Float32, Float64)
7072
ASSERT_CONSECUTIVE(Float64, Simd128)
7173
ASSERT_CONSECUTIVE(Simd128, Simd256)
@@ -205,6 +207,10 @@ class MachineType {
205207
return MachineType(MachineRepresentation::kWord64,
206208
MachineSemantic::kUnsignedBigInt64);
207209
}
210+
constexpr static MachineType Float16() {
211+
return MachineType(MachineRepresentation::kFloat16,
212+
MachineSemantic::kNumber);
213+
}
208214
constexpr static MachineType Float32() {
209215
return MachineType(MachineRepresentation::kFloat32,
210216
MachineSemantic::kNumber);
@@ -282,6 +288,8 @@ class MachineType {
282288
return isSigned ? MachineType::Int32() : MachineType::Uint32();
283289
case MachineRepresentation::kWord64:
284290
return isSigned ? MachineType::Int64() : MachineType::Uint64();
291+
case MachineRepresentation::kFloat16:
292+
return MachineType::Float16();
285293
case MachineRepresentation::kFloat32:
286294
return MachineType::Float32();
287295
case MachineRepresentation::kFloat64:
@@ -433,6 +441,7 @@ V8_EXPORT_PRIVATE inline constexpr int ElementSizeLog2Of(
433441
case MachineRepresentation::kWord8:
434442
return 0;
435443
case MachineRepresentation::kWord16:
444+
case MachineRepresentation::kFloat16:
436445
return 1;
437446
case MachineRepresentation::kWord32:
438447
case MachineRepresentation::kFloat32:

src/compiler/backend/arm/instruction-selector-arm.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,8 @@ void InstructionSelectorT<Adapter>::VisitLoad(node_t node) {
999999
case MachineRepresentation::kSimd128:
10001000
opcode = kArmVld1S128;
10011001
break;
1002+
case MachineRepresentation::kFloat16:
1003+
UNIMPLEMENTED();
10021004
case MachineRepresentation::kSimd256: // Fall through.
10031005
case MachineRepresentation::kCompressedPointer: // Fall through.
10041006
case MachineRepresentation::kCompressed: // Fall through.
@@ -1041,6 +1043,8 @@ ArchOpcode GetStoreOpcode(MachineRepresentation rep) {
10411043
return kArmStr;
10421044
case MachineRepresentation::kSimd128:
10431045
return kArmVst1S128;
1046+
case MachineRepresentation::kFloat16:
1047+
UNIMPLEMENTED();
10441048
case MachineRepresentation::kSimd256: // Fall through.
10451049
case MachineRepresentation::kCompressedPointer: // Fall through.
10461050
case MachineRepresentation::kCompressed: // Fall through.

src/compiler/backend/arm64/instruction-selector-arm64.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,8 @@ std::tuple<InstructionCode, ImmediateMode> GetStoreOpcodeAndImmediate(
12551255
opcode = kArm64StrQ;
12561256
immediate_mode = kNoImmediate;
12571257
break;
1258+
case MachineRepresentation::kFloat16:
1259+
UNIMPLEMENTED();
12581260
case MachineRepresentation::kSimd256:
12591261
case MachineRepresentation::kMapWord:
12601262
// We never store directly to protected pointers from generated code.
@@ -1772,6 +1774,8 @@ void InstructionSelectorT<Adapter>::VisitLoad(node_t node) {
17721774
opcode = kArm64LdrQ;
17731775
immediate_mode = kNoImmediate;
17741776
break;
1777+
case MachineRepresentation::kFloat16:
1778+
UNIMPLEMENTED();
17751779
case MachineRepresentation::kSimd256: // Fall through.
17761780
case MachineRepresentation::kMapWord: // Fall through.
17771781
case MachineRepresentation::kIndirectPointer: // Fall through.

src/compiler/backend/ia32/instruction-selector-ia32.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,8 @@ ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) {
637637
case MachineRepresentation::kSimd128:
638638
opcode = kIA32Movdqu;
639639
break;
640+
case MachineRepresentation::kFloat16:
641+
UNIMPLEMENTED();
640642
case MachineRepresentation::kSimd256: // Fall through.
641643
case MachineRepresentation::kCompressedPointer: // Fall through.
642644
case MachineRepresentation::kCompressed: // Fall through.
@@ -1130,6 +1132,8 @@ ArchOpcode GetStoreOpcode(MachineRepresentation rep) {
11301132
return kIA32Movl;
11311133
case MachineRepresentation::kSimd128:
11321134
return kIA32Movdqu;
1135+
case MachineRepresentation::kFloat16:
1136+
UNIMPLEMENTED();
11331137
case MachineRepresentation::kSimd256: // Fall through.
11341138
case MachineRepresentation::kCompressedPointer: // Fall through.
11351139
case MachineRepresentation::kCompressed: // Fall through.

src/compiler/backend/instruction.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,9 @@ std::ostream& operator<<(std::ostream& os, const InstructionOperand& op) {
261261
case MachineRepresentation::kWord64:
262262
os << "|w64";
263263
break;
264+
case MachineRepresentation::kFloat16:
265+
os << "|f16";
266+
break;
264267
case MachineRepresentation::kFloat32:
265268
os << "|f32";
266269
break;
@@ -1036,6 +1039,7 @@ static MachineRepresentation FilterRepresentation(MachineRepresentation rep) {
10361039
case MachineRepresentation::kBit:
10371040
case MachineRepresentation::kWord8:
10381041
case MachineRepresentation::kWord16:
1042+
case MachineRepresentation::kFloat16:
10391043
return InstructionSequence::DefaultRepresentation();
10401044
case MachineRepresentation::kWord32:
10411045
case MachineRepresentation::kWord64:

src/compiler/backend/instruction.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ class LocationOperand : public InstructionOperand {
582582
case MachineRepresentation::kBit:
583583
case MachineRepresentation::kWord8:
584584
case MachineRepresentation::kWord16:
585+
case MachineRepresentation::kFloat16:
585586
case MachineRepresentation::kNone:
586587
return false;
587588
case MachineRepresentation::kMapWord:
@@ -1829,6 +1830,7 @@ class V8_EXPORT_PRIVATE InstructionSequence final
18291830
int representation_mask() const { return representation_mask_; }
18301831
bool HasFPVirtualRegisters() const {
18311832
constexpr int kFPRepMask =
1833+
RepresentationBit(MachineRepresentation::kFloat16) |
18321834
RepresentationBit(MachineRepresentation::kFloat32) |
18331835
RepresentationBit(MachineRepresentation::kFloat64) |
18341836
RepresentationBit(MachineRepresentation::kSimd128) |

src/compiler/backend/register-allocation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ inline int ByteWidthForStackSlot(MachineRepresentation rep) {
5656
case MachineRepresentation::kWord8:
5757
case MachineRepresentation::kWord16:
5858
case MachineRepresentation::kWord32:
59+
case MachineRepresentation::kFloat16:
5960
case MachineRepresentation::kFloat32:
6061
case MachineRepresentation::kSandboxedPointer:
6162
return kSystemPointerSize;

src/compiler/backend/register-allocator.cc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,13 +1361,15 @@ SpillRange* RegisterAllocationData::AssignSpillRangeToLiveRange(
13611361
void RegisterAllocationData::MarkFixedUse(MachineRepresentation rep,
13621362
int index) {
13631363
switch (rep) {
1364+
case MachineRepresentation::kFloat16:
13641365
case MachineRepresentation::kFloat32:
13651366
case MachineRepresentation::kSimd128:
13661367
case MachineRepresentation::kSimd256:
13671368
if (kFPAliasing == AliasingKind::kOverlap) {
13681369
fixed_fp_register_use_->Add(index);
13691370
} else if (kFPAliasing == AliasingKind::kIndependent) {
1370-
if (rep == MachineRepresentation::kFloat32) {
1371+
if (rep == MachineRepresentation::kFloat16 ||
1372+
rep == MachineRepresentation::kFloat32) {
13711373
fixed_fp_register_use_->Add(index);
13721374
} else {
13731375
fixed_simd128_register_use_->Add(index);
@@ -1395,13 +1397,15 @@ void RegisterAllocationData::MarkFixedUse(MachineRepresentation rep,
13951397

13961398
bool RegisterAllocationData::HasFixedUse(MachineRepresentation rep, int index) {
13971399
switch (rep) {
1400+
case MachineRepresentation::kFloat16:
13981401
case MachineRepresentation::kFloat32:
13991402
case MachineRepresentation::kSimd128:
14001403
case MachineRepresentation::kSimd256: {
14011404
if (kFPAliasing == AliasingKind::kOverlap) {
14021405
return fixed_fp_register_use_->Contains(index);
14031406
} else if (kFPAliasing == AliasingKind::kIndependent) {
1404-
if (rep == MachineRepresentation::kFloat32) {
1407+
if (rep == MachineRepresentation::kFloat16 ||
1408+
rep == MachineRepresentation::kFloat32) {
14051409
return fixed_fp_register_use_->Contains(index);
14061410
} else {
14071411
return fixed_simd128_register_use_->Contains(index);
@@ -1430,13 +1434,15 @@ bool RegisterAllocationData::HasFixedUse(MachineRepresentation rep, int index) {
14301434
void RegisterAllocationData::MarkAllocated(MachineRepresentation rep,
14311435
int index) {
14321436
switch (rep) {
1437+
case MachineRepresentation::kFloat16:
14331438
case MachineRepresentation::kFloat32:
14341439
case MachineRepresentation::kSimd128:
14351440
case MachineRepresentation::kSimd256:
14361441
if (kFPAliasing == AliasingKind::kOverlap) {
14371442
assigned_double_registers_->Add(index);
14381443
} else if (kFPAliasing == AliasingKind::kIndependent) {
1439-
if (rep == MachineRepresentation::kFloat32) {
1444+
if (rep == MachineRepresentation::kFloat16 ||
1445+
rep == MachineRepresentation::kFloat32) {
14401446
assigned_double_registers_->Add(index);
14411447
} else {
14421448
assigned_simd128_registers_->Add(index);
@@ -1857,6 +1863,7 @@ TopLevelLiveRange* LiveRangeBuilder::FixedFPLiveRangeFor(
18571863
&data()->fixed_double_live_ranges();
18581864
if (kFPAliasing == AliasingKind::kCombine) {
18591865
switch (rep) {
1866+
case MachineRepresentation::kFloat16:
18601867
case MachineRepresentation::kFloat32:
18611868
num_regs = config()->num_float_registers();
18621869
live_ranges = &data()->fixed_float_live_ranges();

src/compiler/backend/x64/instruction-selector-x64.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,8 @@ ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) {
10601060
case MachineRepresentation::kSimd256: // Fall through.
10611061
opcode = kX64Movdqu256;
10621062
break;
1063+
case MachineRepresentation::kFloat16:
1064+
UNIMPLEMENTED();
10631065
case MachineRepresentation::kNone: // Fall through.
10641066
case MachineRepresentation::kMapWord: // Fall through.
10651067
case MachineRepresentation::kIndirectPointer: // Fall through.
@@ -1102,6 +1104,8 @@ ArchOpcode GetStoreOpcode(StoreRepresentation store_rep) {
11021104
return kX64Movdqu;
11031105
case MachineRepresentation::kSimd256:
11041106
return kX64Movdqu256;
1107+
case MachineRepresentation::kFloat16:
1108+
UNIMPLEMENTED();
11051109
case MachineRepresentation::kNone:
11061110
case MachineRepresentation::kMapWord:
11071111
// We never store directly to protected pointers from generated code.

src/compiler/js-native-context-specialization.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3090,6 +3090,7 @@ JSNativeContextSpecialization::BuildPropertyStore(
30903090
case MachineRepresentation::kWord16:
30913091
case MachineRepresentation::kWord32:
30923092
case MachineRepresentation::kWord64:
3093+
case MachineRepresentation::kFloat16:
30933094
case MachineRepresentation::kFloat32:
30943095
case MachineRepresentation::kSimd128:
30953096
case MachineRepresentation::kSimd256:

src/compiler/load-elimination.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,6 +1091,7 @@ Reduction LoadElimination::ReduceLoadElement(Node* node) {
10911091
case MachineRepresentation::kWord16:
10921092
case MachineRepresentation::kWord32:
10931093
case MachineRepresentation::kWord64:
1094+
case MachineRepresentation::kFloat16:
10941095
case MachineRepresentation::kFloat32:
10951096
case MachineRepresentation::kCompressedPointer:
10961097
case MachineRepresentation::kCompressed:
@@ -1151,6 +1152,7 @@ Reduction LoadElimination::ReduceStoreElement(Node* node) {
11511152
case MachineRepresentation::kWord16:
11521153
case MachineRepresentation::kWord32:
11531154
case MachineRepresentation::kWord64:
1155+
case MachineRepresentation::kFloat16:
11541156
case MachineRepresentation::kFloat32:
11551157
case MachineRepresentation::kCompressedPointer:
11561158
case MachineRepresentation::kCompressed:
@@ -1451,6 +1453,7 @@ LoadElimination::IndexRange LoadElimination::FieldIndexOf(
14511453
UNREACHABLE();
14521454
case MachineRepresentation::kWord8:
14531455
case MachineRepresentation::kWord16:
1456+
case MachineRepresentation::kFloat16:
14541457
case MachineRepresentation::kFloat32:
14551458
// Currently untracked.
14561459
return IndexRange::Invalid();

src/compiler/machine-graph-verifier.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,7 @@ class MachineRepresentationChecker {
10421042
case MachineRepresentation::kProtectedPointer:
10431043
case MachineRepresentation::kIndirectPointer:
10441044
case MachineRepresentation::kSandboxedPointer:
1045+
case MachineRepresentation::kFloat16:
10451046
case MachineRepresentation::kFloat32:
10461047
case MachineRepresentation::kFloat64:
10471048
case MachineRepresentation::kSimd128:

src/compiler/machine-operator.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ std::ostream& operator<<(std::ostream& os, TruncateKind kind) {
879879
V(Int64MulWithOverflow, Operator::kAssociative | Operator::kCommutative)
880880

881881
#define MACHINE_TYPE_LIST(V) \
882+
V(Float16) \
882883
V(Float32) \
883884
V(Float64) \
884885
V(Simd128) \
@@ -902,6 +903,7 @@ std::ostream& operator<<(std::ostream& os, TruncateKind kind) {
902903
V(Simd256)
903904

904905
#define MACHINE_REPRESENTATION_LIST(V) \
906+
V(kFloat16) \
905907
V(kFloat32) \
906908
V(kFloat64) \
907909
V(kSimd128) \

src/compiler/representation-change.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ Node* RepresentationChanger::GetRepresentationFor(
220220
DCHECK_EQ(TypeCheckKind::kNone, use_info.type_check());
221221
return GetTaggedRepresentationFor(node, output_rep, output_type,
222222
use_info.truncation());
223+
case MachineRepresentation::kFloat16:
223224
case MachineRepresentation::kFloat32:
224225
DCHECK_EQ(TypeCheckKind::kNone, use_info.type_check());
225226
return GetFloat32RepresentationFor(node, output_rep, output_type,

src/compiler/simplified-lowering.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) {
152152
return UseInfo::AnyTagged();
153153
case MachineRepresentation::kFloat64:
154154
return UseInfo::TruncatingFloat64();
155+
case MachineRepresentation::kFloat16:
155156
case MachineRepresentation::kFloat32:
156157
return UseInfo::Float32();
157158
case MachineRepresentation::kWord8:

src/compiler/turboshaft/operations.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,7 @@ const RegisterRepresentation& RepresentationFor(wasm::ValueType type) {
14811481
return kWord32;
14821482
case wasm::kI64:
14831483
return kWord64;
1484+
case wasm::kF16:
14841485
case wasm::kF32:
14851486
return kFloat32;
14861487
case wasm::kF64:

src/compiler/turboshaft/representations.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ std::ostream& operator<<(std::ostream& os, MemoryRepresentation rep) {
4747
return os << "Int64";
4848
case MemoryRepresentation::Uint64():
4949
return os << "Uint64";
50+
case MemoryRepresentation::Float16():
51+
return os << "Float16";
5052
case MemoryRepresentation::Float32():
5153
return os << "Float32";
5254
case MemoryRepresentation::Float64():

0 commit comments

Comments
 (0)