@@ -93,8 +93,44 @@ void cdorth(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
9393
9494 regm_t PSW = pretregs & mPSW;
9595
96+ bool isPair = isRegisterPair(true , ty, 0 );
97+
9698 if (tyfloating(ty1))
9799 {
100+ if (isPair)
101+ {
102+ assert (sz != 32 ); // TODO AArch64
103+ Rd = findreg(retregs & INSTR .LSW );
104+ Rn = findreg(retregs1 & INSTR .LSW );
105+ Rm = findreg(retregs2 & INSTR .LSW );
106+
107+ reg_t Rd0 = findreg(retregs & INSTR .MSW );
108+ reg_t Rn0 = findreg(retregs1 & INSTR .MSW );
109+ reg_t Rm0 = findreg(retregs2 & INSTR .MSW );
110+
111+ const ftype = INSTR .szToFtype(sz / 2 );
112+ switch (e.Eoper)
113+ {
114+ // FADD/FSUB (extended register)
115+ // http://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#addsub_ext
116+ case OPadd:
117+ cdb.gen1(INSTR .fadd_float(ftype,Rm0,Rn0,Rd0)); // FADD Rd0,Rn0,Rm0 LSW
118+ cdb.gen1(INSTR .fadd_float(ftype,Rm,Rn,Rd)); // FADD Rd,Rn,Rm MSW
119+ break ;
120+
121+ case OPmin:
122+ cdb.gen1(INSTR .fsub_float(ftype,Rm0,Rn0,Rd0)); // FSUB Rd0,Rn0,Rm0 LSW
123+ cdb.gen1(INSTR .fsub_float(ftype,Rm,Rn,Rd)); // FSUB Rd,Rn,Rm MSW
124+ break ;
125+
126+ default :
127+ assert (0 );
128+ }
129+ pretregs = retregs | PSW ;
130+ fixresult(cdb,e,retregs,pretregs);
131+ return ;
132+ }
133+
98134 if (sz == 16 ) // 128 bit float
99135 {
100136 uint clib;
0 commit comments