v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
extension-riscv-d.cc
Go to the documentation of this file.
1// Copyright 2022 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
5
6namespace v8 {
7namespace internal {
8// RV32D Standard Extension
9
10void AssemblerRISCVD::fld(FPURegister rd, Register rs1, int16_t imm12) {
11 GenInstrLoadFP_ri(0b011, rd, rs1, imm12);
12}
13
14void AssemblerRISCVD::fsd(FPURegister source, Register base, int16_t imm12) {
15 GenInstrStoreFP_rri(0b011, base, source, imm12);
16}
17
20 GenInstrR4(0b01, MADD, rd, rs1, rs2, rs3, frm);
21}
22
25 GenInstrR4(0b01, MSUB, rd, rs1, rs2, rs3, frm);
26}
27
30 GenInstrR4(0b01, NMSUB, rd, rs1, rs2, rs3, frm);
31}
32
35 GenInstrR4(0b01, NMADD, rd, rs1, rs2, rs3, frm);
36}
37
39 FPURoundingMode frm) {
40 GenInstrALUFP_rr(0b0000001, frm, rd, rs1, rs2);
41}
42
44 FPURoundingMode frm) {
45 GenInstrALUFP_rr(0b0000101, frm, rd, rs1, rs2);
46}
47
49 FPURoundingMode frm) {
50 GenInstrALUFP_rr(0b0001001, frm, rd, rs1, rs2);
51}
52
54 FPURoundingMode frm) {
55 GenInstrALUFP_rr(0b0001101, frm, rd, rs1, rs2);
56}
57
59 FPURoundingMode frm) {
60 GenInstrALUFP_rr(0b0101101, frm, rd, rs1, zero_reg);
61}
62
64 FPURegister rs2) {
65 GenInstrALUFP_rr(0b0010001, 0b000, rd, rs1, rs2);
66}
67
69 FPURegister rs2) {
70 GenInstrALUFP_rr(0b0010001, 0b001, rd, rs1, rs2);
71}
72
74 FPURegister rs2) {
75 GenInstrALUFP_rr(0b0010001, 0b010, rd, rs1, rs2);
76}
77
79 GenInstrALUFP_rr(0b0010101, 0b000, rd, rs1, rs2);
80}
81
83 GenInstrALUFP_rr(0b0010101, 0b001, rd, rs1, rs2);
84}
85
87 FPURoundingMode frm) {
88 GenInstrALUFP_rr(0b0100000, frm, rd, rs1, ToRegister(1));
89}
90
92 FPURoundingMode frm) {
93 GenInstrALUFP_rr(0b0100001, frm, rd, rs1, zero_reg);
94}
95
97 GenInstrALUFP_rr(0b1010001, 0b010, rd, rs1, rs2);
98}
99
101 GenInstrALUFP_rr(0b1010001, 0b001, rd, rs1, rs2);
102}
103
105 GenInstrALUFP_rr(0b1010001, 0b000, rd, rs1, rs2);
106}
107
109 GenInstrALUFP_rr(0b1110001, 0b001, rd, rs1, zero_reg);
110}
111
113 FPURoundingMode frm) {
114 GenInstrALUFP_rr(0b1100001, frm, rd, rs1, zero_reg);
115}
116
118 FPURoundingMode frm) {
119 GenInstrALUFP_rr(0b1100001, frm, rd, rs1, ToRegister(1));
120}
121
123 FPURoundingMode frm) {
124 GenInstrALUFP_rr(0b1101001, frm, rd, rs1, zero_reg);
125}
126
128 FPURoundingMode frm) {
129 GenInstrALUFP_rr(0b1101001, frm, rd, rs1, ToRegister(1));
130}
131
132#ifdef V8_TARGET_ARCH_RISCV64
133// RV64D Standard Extension (in addition to RV32D)
134
135void AssemblerRISCVD::fcvt_l_d(Register rd, FPURegister rs1,
136 FPURoundingMode frm) {
137 GenInstrALUFP_rr(0b1100001, frm, rd, rs1, ToRegister(2));
138}
139
140void AssemblerRISCVD::fcvt_lu_d(Register rd, FPURegister rs1,
141 FPURoundingMode frm) {
142 GenInstrALUFP_rr(0b1100001, frm, rd, rs1, ToRegister(3));
143}
144
145void AssemblerRISCVD::fmv_x_d(Register rd, FPURegister rs1) {
146 GenInstrALUFP_rr(0b1110001, 0b000, rd, rs1, zero_reg);
147}
148
149void AssemblerRISCVD::fcvt_d_l(FPURegister rd, Register rs1,
150 FPURoundingMode frm) {
151 GenInstrALUFP_rr(0b1101001, frm, rd, rs1, ToRegister(2));
152}
153
154void AssemblerRISCVD::fcvt_d_lu(FPURegister rd, Register rs1,
155 FPURoundingMode frm) {
156 GenInstrALUFP_rr(0b1101001, frm, rd, rs1, ToRegister(3));
157}
158
159void AssemblerRISCVD::fmv_d_x(FPURegister rd, Register rs1) {
160 GenInstrALUFP_rr(0b1111001, 0b000, rd, rs1, zero_reg);
161}
162#endif
163
164} // namespace internal
165} // namespace v8
void fsgnjx_d(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fcvt_wu_d(Register rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fsub_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fcvt_s_d(FPURegister rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fsgnjn_d(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fadd_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void flt_d(Register rd, FPURegister rs1, FPURegister rs2)
void fcvt_d_s(FPURegister rd, FPURegister rs1, FPURoundingMode frm=RNE)
void feq_d(Register rd, FPURegister rs1, FPURegister rs2)
void fcvt_w_d(Register rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fle_d(Register rd, FPURegister rs1, FPURegister rs2)
void fnmsub_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fsgnj_d(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fcvt_d_w(FPURegister rd, Register rs1, FPURoundingMode frm=RNE)
void fsqrt_d(FPURegister rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fld(FPURegister rd, Register rs1, int16_t imm12)
void fsd(FPURegister source, Register base, int16_t imm12)
void fdiv_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fnmadd_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fmax_d(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fmul_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fmsub_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fmadd_d(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fcvt_d_wu(FPURegister rd, Register rs1, FPURoundingMode frm=RNE)
void fmin_d(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fclass_d(Register rd, FPURegister rs1)
void GenInstrR4(uint8_t funct2, BaseOpcode opcode, Register rd, Register rs1, Register rs2, Register rs3, FPURoundingMode frm)
void GenInstrStoreFP_rri(uint8_t funct3, Register rs1, FPURegister rs2, int16_t imm12)
void GenInstrALUFP_rr(uint8_t funct7, uint8_t funct3, FPURegister rd, FPURegister rs1, FPURegister rs2)
void GenInstrLoadFP_ri(uint8_t funct3, FPURegister rd, Register rs1, int16_t imm12)
constexpr DataProcessing3SourceOp MSUB
Register ToRegister(int num)
constexpr DataProcessing3SourceOp MADD