Skip to content

Commit

Permalink
Add vftint.w.d
Browse files Browse the repository at this point in the history
  • Loading branch information
jiegec committed Dec 13, 2023
1 parent 49ebab3 commit b1ce0f7
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 12 deletions.
12 changes: 1 addition & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,9 @@ TODO List:

### vffint.s.l

### vffint.w.d

### vffintrm.w.d

### vffintrp.w.d

### vffintrz.w.d

### vffintrne.w.d

### vfrstpi.b/h

### vffint.s.w/wu/d.l/d.lu
### vffint.s.w/s.wu/d.l/d.lu

### vffintl.d.w

Expand Down
9 changes: 9 additions & 0 deletions code/gen_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,15 @@
file=f,
)
print(f"}}", file=f)
if width == "d":
for rounding in ["", "rm", "rp", "rz", "rne"]:
with open(f"vftint{rounding}_w_{width}.h", "w") as f:
print(f"for (int i = 0;i < {128 // w};i++) {{", file=f)
print(
f" dst.{int_m}[i] = (i < {64 // w}) ? (s{int_w})a.{m}[i] : (s{int_w})b.{m}[i]; // rounding mode is not expressed in C",
file=f,
)
print(f"}}", file=f)

for name in ["max", "min"]:
with open(f"vf{name}_{width}.h", "w") as f:
Expand Down
5 changes: 5 additions & 0 deletions code/vftint_w_d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (int i = 0; i < 2; i++) {
dst.dword[i] = (i < 1)
? (s64)a.fp64[i]
: (s64)b.fp64[i]; // rounding mode is not expressed in C
}
5 changes: 5 additions & 0 deletions code/vftintrm_w_d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (int i = 0; i < 2; i++) {
dst.dword[i] = (i < 1)
? (s64)a.fp64[i]
: (s64)b.fp64[i]; // rounding mode is not expressed in C
}
5 changes: 5 additions & 0 deletions code/vftintrne_w_d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (int i = 0; i < 2; i++) {
dst.dword[i] = (i < 1)
? (s64)a.fp64[i]
: (s64)b.fp64[i]; // rounding mode is not expressed in C
}
5 changes: 5 additions & 0 deletions code/vftintrp_w_d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (int i = 0; i < 2; i++) {
dst.dword[i] = (i < 1)
? (s64)a.fp64[i]
: (s64)b.fp64[i]; // rounding mode is not expressed in C
}
5 changes: 5 additions & 0 deletions code/vftintrz_w_d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (int i = 0; i < 2; i++) {
dst.dword[i] = (i < 1)
? (s64)a.fp64[i]
: (s64)b.fp64[i]; // rounding mode is not expressed in C
}
8 changes: 7 additions & 1 deletion docs/lsx/float_conversion.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,10 @@ Convert single precision floating point elements in `a` and `b` to half precisio
{{ vftint('', 'lu', 'd') }}
{{ vftint('', 'wu', 's') }}
{{ vftint('rz', 'lu', 'd') }}
{{ vftint('rz', 'wu', 's') }}
{{ vftint('rz', 'wu', 's') }}

{{ vftint_w_d('') }}
{{ vftint_w_d('rm') }}
{{ vftint_w_d('rp') }}
{{ vftint_w_d('rz') }}
{{ vftint_w_d('rne') }}
9 changes: 9 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,15 @@ def vftint_l_s(rounding, low_high):
desc=f"Convert single-precision floating point elements in {half} part of `a` to 64-bit integer, {rounding_mode}.",
)

@env.macro
def vftint_w_d(rounding):
rounding_mode = get_rounding_mode(rounding)
return instruction(
intrinsic=f"__m128i __lsx_vftint{rounding}_w_d (__m128 a, __m128 b)",
instr=f"vftint{rounding}.w.d vr, vr",
desc=f"Convert double-precision floating point elements in `a` and `b` to 32-bit integer, {rounding_mode}.",
)

@env.macro
def vftint(rounding, name, name2):
if name2 == "d":
Expand Down

0 comments on commit b1ce0f7

Please sign in to comment.