Skip to content

Commit

Permalink
Add vfcmp
Browse files Browse the repository at this point in the history
  • Loading branch information
jiegec committed Dec 11, 2023
1 parent 7909736 commit afef4f4
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 6 deletions.
6 changes: 0 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@ Arranged from QEMU implementation and [GCC Intrinsics](https://gcc.gnu.org/onlin

TODO List:

### vfcmp.cond.s/d

Vector Float Compare

<cmp>: See fcmp.cond.s/d instruction

### vld

Vector Load
Expand Down
105 changes: 105 additions & 0 deletions docs/lsx_float/vfcmp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Float Comparison

## __m128i __lsx_vfcmp_cond_s (__m128 a, __m128 b)

### Synopsis

```c++
__m128i __lsx_vfcmp_cond_s (__m128 a, __m128 b)
#include <lsxintrin.h>
Instruction: vfcmp.cond.s vr, vr
CPU Flags: LSX
```
`cond` can be one of:
- `caf`: Quiet Always False
- `ceq`: Quiet Equal
- `cle`: Quiet Less than or Equal
- `clt`: Quiet Less than
- `cne`: Quiet Not Equal
- `cor`: Quiet Ordered
- `cueq`: Quiet Unordered Equal
- `cule`: Quiet Unordered Less than or Equal
- `cult`: Quiet Unordered Less than
- `cun`: Quiet Unordered
- `cune`: Quiet Unordered Not Equal
- `saf`: Signaling Always False
- `seq`: Signaling Equal
- `sle`: Signaling Less than or Equal
- `slt`: Signaling Less than
- `sne`: Signaling Not Equal
- `sor`: Signaling Ordered
- `sueq`: Signaling Unordered Equal
- `sule`: Signaling Unordered Less than or Equal
- `sult`: Signaling Unordered Less than
- `sun`: Signaling Unordered
- `sune`: Signaling Unordered Not Equal
### Description
Compare single precision floating point elements from `a` and `b`, save the comparison result into `dst`.
### Operation
```c++
for (int i = 0;i < 4;i++) {
if (fp_compare(cond, a.fp32[i], b.fp32[i])) {
dst.word[i] = 0xFFFFFFFF;
} else {
dst.word[i] = 0;
}
}
```

## __m128i __lsx_vfcmp_cond_d (__m128d a, __m128d b)

### Synopsis

```c++
__m128i __lsx_vfcmp_cond_d (__m128d a, __m128d b)
#include <lsxintrin.h>
Instruction: vfcmp.cond.d vr, vr
CPU Flags: LSX
```
`cond` can be one of:
- `caf`: Quiet Always False
- `ceq`: Quiet Equal
- `cle`: Quiet Less than or Equal
- `clt`: Quiet Less than
- `cne`: Quiet Not Equal
- `cor`: Quiet Ordered
- `cueq`: Quiet Unordered Equal
- `cule`: Quiet Unordered Less than or Equal
- `cult`: Quiet Unordered Less than
- `cun`: Quiet Unordered
- `cune`: Quiet Unordered Not Equal
- `saf`: Signaling Always False
- `seq`: Signaling Equal
- `sle`: Signaling Less than or Equal
- `slt`: Signaling Less than
- `sne`: Signaling Not Equal
- `sor`: Signaling Ordered
- `sueq`: Signaling Unordered Equal
- `sule`: Signaling Unordered Less than or Equal
- `sult`: Signaling Unordered Less than
- `sun`: Signaling Unordered
- `sune`: Signaling Unordered Not Equal
### Description
Compare double precision floating point elements from `a` and `b`, save the comparison result into `dst`.
### Operation
```c++
for (int i = 0;i < 2;i++) {
if (fp_compare(cond, a.fp64[i], b.fp64[i])) {
dst.word[i] = 0xFFFFFFFFFFFFFFFF;
} else {
dst.word[i] = 0;
}
}
```

0 comments on commit afef4f4

Please sign in to comment.