v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
extension-riscv-f.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
9// RV32F Standard Extension
10
11void AssemblerRISCVF::flw(FPURegister rd, Register rs1, int16_t imm12) {
12 GenInstrLoadFP_ri(0b010, rd, rs1, imm12);
13}
14
15void AssemblerRISCVF::fsw(FPURegister source, Register base, int16_t imm12) {
16 GenInstrStoreFP_rri(0b010, base, source, imm12);
17}
18
21 GenInstrR4(0b00, MADD, rd, rs1, rs2, rs3, frm);
22}
23
26 GenInstrR4(0b00, MSUB, rd, rs1, rs2, rs3, frm);
27}
28
31 GenInstrR4(0b00, NMSUB, rd, rs1, rs2, rs3, frm);
32}
33
36 GenInstrR4(0b00, NMADD, rd, rs1, rs2, rs3, frm);
37}
38
40 FPURoundingMode frm) {
41 GenInstrALUFP_rr(0b0000000, frm, rd, rs1, rs2);
42}
43
45 FPURoundingMode frm) {
46 GenInstrALUFP_rr(0b0000100, frm, rd, rs1, rs2);
47}
48
50 FPURoundingMode frm) {
51 GenInstrALUFP_rr(0b0001000, frm, rd, rs1, rs2);
52}
53
55 FPURoundingMode frm) {
56 GenInstrALUFP_rr(0b0001100, frm, rd, rs1, rs2);
57}
58
60 FPURoundingMode frm) {
61 GenInstrALUFP_rr(0b0101100, frm, rd, rs1, zero_reg);
62}
63
65 FPURegister rs2) {
66 GenInstrALUFP_rr(0b0010000, 0b000, rd, rs1, rs2);
67}
68
70 FPURegister rs2) {
71 GenInstrALUFP_rr(0b0010000, 0b001, rd, rs1, rs2);
72}
73
75 FPURegister rs2) {
76 GenInstrALUFP_rr(0b0010000, 0b010, rd, rs1, rs2);
77}
78
80 GenInstrALUFP_rr(0b0010100, 0b000, rd, rs1, rs2);
81}
82
84 GenInstrALUFP_rr(0b0010100, 0b001, rd, rs1, rs2);
85}
86
88 FPURoundingMode frm) {
89 GenInstrALUFP_rr(0b1100000, frm, rd, rs1, zero_reg);
90}
91
93 FPURoundingMode frm) {
94 GenInstrALUFP_rr(0b1100000, frm, rd, rs1, ToRegister(1));
95}
96
98 GenInstrALUFP_rr(0b1110000, 0b000, rd, rs1, zero_reg);
99}
100
102 GenInstrALUFP_rr(0b1010000, 0b010, rd, rs1, rs2);
103}
104
106 GenInstrALUFP_rr(0b1010000, 0b001, rd, rs1, rs2);
107}
108
110 GenInstrALUFP_rr(0b1010000, 0b000, rd, rs1, rs2);
111}
112
114 GenInstrALUFP_rr(0b1110000, 0b001, rd, rs1, zero_reg);
115}
116
118 FPURoundingMode frm) {
119 GenInstrALUFP_rr(0b1101000, frm, rd, rs1, zero_reg);
120}
121
123 FPURoundingMode frm) {
124 GenInstrALUFP_rr(0b1101000, frm, rd, rs1, ToRegister(1));
125}
126
128 GenInstrALUFP_rr(0b1111000, 0b000, rd, rs1, zero_reg);
129}
130
131#ifdef V8_TARGET_ARCH_RISCV64
132// RV64F Standard Extension (in addition to RV32F)
133
134void AssemblerRISCVF::fcvt_l_s(Register rd, FPURegister rs1,
135 FPURoundingMode frm) {
136 GenInstrALUFP_rr(0b1100000, frm, rd, rs1, ToRegister(2));
137}
138
139void AssemblerRISCVF::fcvt_lu_s(Register rd, FPURegister rs1,
140 FPURoundingMode frm) {
141 GenInstrALUFP_rr(0b1100000, frm, rd, rs1, ToRegister(3));
142}
143
144void AssemblerRISCVF::fcvt_s_l(FPURegister rd, Register rs1,
145 FPURoundingMode frm) {
146 GenInstrALUFP_rr(0b1101000, frm, rd, rs1, ToRegister(2));
147}
148
149void AssemblerRISCVF::fcvt_s_lu(FPURegister rd, Register rs1,
150 FPURoundingMode frm) {
151 GenInstrALUFP_rr(0b1101000, frm, rd, rs1, ToRegister(3));
152}
153#endif
154
155} // namespace internal
156} // namespace v8
void fsgnjn_s(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fmax_s(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fmadd_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fmv_w_x(FPURegister rd, Register rs1)
void feq_s(Register rd, FPURegister rs1, FPURegister rs2)
void fsgnjx_s(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fsw(FPURegister source, Register base, int16_t imm12)
void fdiv_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fadd_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fcvt_s_w(FPURegister rd, Register rs1, FPURoundingMode frm=RNE)
void fsub_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fcvt_wu_s(Register rd, FPURegister rs1, FPURoundingMode frm=RNE)
void flt_s(Register rd, FPURegister rs1, FPURegister rs2)
void fclass_s(Register rd, FPURegister rs1)
void fsgnj_s(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fmv_x_w(Register rd, FPURegister rs1)
void fle_s(Register rd, FPURegister rs1, FPURegister rs2)
void fcvt_w_s(Register rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fnmadd_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fmin_s(FPURegister rd, FPURegister rs1, FPURegister rs2)
void fmul_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURoundingMode frm=RNE)
void fsqrt_s(FPURegister rd, FPURegister rs1, FPURoundingMode frm=RNE)
void fmsub_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
void fcvt_s_wu(FPURegister rd, Register rs1, FPURoundingMode frm=RNE)
void flw(FPURegister rd, Register rs1, int16_t imm12)
void fnmsub_s(FPURegister rd, FPURegister rs1, FPURegister rs2, FPURegister rs3, FPURoundingMode frm=RNE)
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