do proper rounding, no rounding for SH=0 (for now), add tests
[openpower-isa.git] / openpower / isa / butterfly.mdwn
1 <!-- SVP64 Butterfly DCT Instructions here described are based on -->
2
3 <!-- PLEASE NOTE THESE ARE UNAPPROVED AND DRAFT, NOT SUBMITTED TO OPF ISA WG -->
4
5 # [DRAFT] Integer Butterfly Multiply Add/Sub FFT/DCT
6
7 A-Form
8
9 * maddsubrs RT,RA,SH,RB
10
11 Pseudo-code:
12
13 n <- SH
14 sum <- (RT) + (RA)
15 diff <- (RT) - (RA)
16 prod1 <- MULS(RB, sum)[XLEN:(XLEN*2)-1]
17 prod2 <- MULS(RB, diff)[XLEN:(XLEN*2)-1]
18 if n = 0 then
19 #round <- EXTS([0]*(XLEN-1) || [1]*1)
20 #prod1 <- ROTL64(prod1, 1)
21 #prod2 <- ROTL64(prod2, 1)
22 #prod1 <- prod1 + round
23 #prod2 <- prod2 + round
24 #res1 <- ROTL64(prod1, XLEN-1)
25 #res2 <- ROTL64(prod2, XLEN-1)
26 #m <- MASK(1, (XLEN-1))
27 RT <- prod1
28 RS <- prod2
29 else
30 round <- EXTS([0]*(XLEN -n -1) || [1]*1 || [0]*(n-1))
31 prod1 <- prod1 + round
32 prod2 <- prod2 + round
33 res1 <- ROTL64(prod1, XLEN-n)
34 res2 <- ROTL64(prod2, XLEN-n)
35 m <- MASK(n, (XLEN-1))
36 signbit1 <- prod1[0]
37 signbit2 <- prod2[0]
38 smask1 <- ([signbit1]*XLEN) & ¬m
39 smask2 <- ([signbit2]*XLEN) & ¬m
40 RT <- (res1 & m | smask1)
41 RS <- (res2 & m | smask2)
42
43 Special Registers Altered:
44
45 None