// Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build 386 || amd64 || arm64 || ppc64 || ppc64le || s390x || wasm
+//go:build 386 || amd64 || arm64 || ppc64 || ppc64le || riscv64 || s390x || wasm
 
 package math
 
 
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !386 && !amd64 && !arm64 && !ppc64 && !ppc64le && !s390x && !wasm
+//go:build !386 && !amd64 && !arm64 && !ppc64 && !ppc64le && !riscv64 && !s390x && !wasm
 
 package math
 
 
--- /dev/null
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "textflag.h"
+
+#define PosInf 0x7FF0000000000000
+
+// The rounding mode of RISC-V is different from Go spec.
+
+#define ROUNDFN(NAME, MODE)    \
+TEXT NAME(SB),NOSPLIT,$0;      \
+       MOVD    x+0(FP), F0;    \
+       /* whether x is NaN */; \
+       FEQD    F0, F0, X6;     \
+       BNEZ    X6, 3(PC);      \
+       /* return NaN if x is NaN */; \
+       MOVD    F0, ret+8(FP);  \
+       RET;                    \
+       MOV     $PosInf, X6;    \
+       FMVDX   X6, F1;         \
+       FABSD   F0, F2;         \
+       /* if abs(x) > +Inf, return Inf instead of round(x) */; \
+       FLTD    F1, F2, X6;     \
+       /* Inf should keep same signed with x then return */;   \
+       BEQZ    X6, 3(PC); \
+       FCVTLD.MODE     F0, X6; \
+       FCVTDL  X6, F1;         \
+       /* rounding will drop signed bit in RISCV, restore it */; \
+       FSGNJD  F0, F1, F0;     \
+       MOVD    F0, ret+8(FP);  \
+       RET
+
+// func archFloor(x float64) float64
+ROUNDFN(·archFloor, RDN)
+
+// func archCeil(x float64) float64
+ROUNDFN(·archCeil, RUP)
+
+// func archTrunc(x float64) float64
+ROUNDFN(·archTrunc, RTZ)