1/* 2 * support for floating-point hardware 3 */ 4 5#include "mem.h" 6 7/* on some models mtmsr doesn't synchronise enough (eg, 603e) */ 8#define MSRSYNC SYNC; ISYNC 9 10#define FPON(X, Y)\ 11 MOVW MSR, X;\ 12 OR $FPE, X, Y;\ 13 SYNC;\ 14 ISYNC;\ 15 MOVW Y, MSR;\ 16 MSRSYNC 17 18#define FPOFF(X,Y)\ 19 MOVW MSR, X;\ 20 RLWNM $0, X, $~FPE, Y;\ 21 SYNC;\ 22 ISYNC;\ 23 MOVW Y, MSR;\ 24 MSRSYNC 25 26#define FPPREV(X)\ 27 SYNC;\ 28 ISYNC;\ 29 MOVW X, MSR;\ 30 MSRSYNC 31 32TEXT kfpinit(SB), $0 33 MOVFL $0,FPSCR(7) 34 MOVFL $0xD,FPSCR(6) /* VE, OE, ZE */ 35 MOVFL $0, FPSCR(5) 36 MOVFL $0, FPSCR(3) 37 MOVFL $0, FPSCR(2) 38 MOVFL $0, FPSCR(1) 39 MOVFL $0, FPSCR(0) 40 41 FMOVD $4503601774854144.0, F27 42 FMOVD $0.5, F29 43 FSUB F29, F29, F28 44 FADD F29, F29, F30 45 FADD F30, F30, F31 46 FMOVD F28, F0 47 FMOVD F28, F1 48 FMOVD F28, F2 49 FMOVD F28, F3 50 FMOVD F28, F4 51 FMOVD F28, F5 52 FMOVD F28, F6 53 FMOVD F28, F7 54 FMOVD F28, F8 55 FMOVD F28, F9 56 FMOVD F28, F10 57 FMOVD F28, F11 58 FMOVD F28, F12 59 FMOVD F28, F13 60 FMOVD F28, F14 61 FMOVD F28, F15 62 FMOVD F28, F16 63 FMOVD F28, F17 64 FMOVD F28, F18 65 FMOVD F28, F19 66 FMOVD F28, F20 67 FMOVD F28, F21 68 FMOVD F28, F22 69 FMOVD F28, F23 70 FMOVD F28, F24 71 FMOVD F28, F25 72 FMOVD F28, F26 73 RETURN 74 75TEXT getfpscr(SB), $8 76 FPON(R4, R5) 77 MOVFL FPSCR, F3 78 FMOVD F3, -8(SP) 79 MOVW -4(SP), R3 80 FPPREV(R4) 81 RETURN 82 83TEXT fpsave(SB), $0 84 FPON(R4, R4) 85 86 FMOVD F0,0(R3) 87 FMOVD F1,8(R3) 88 FMOVD F2,16(R3) 89 FMOVD F3,24(R3) 90 FMOVD F4,32(R3) 91 FMOVD F5,40(R3) 92 FMOVD F6,48(R3) 93 FMOVD F7,56(R3) 94 FMOVD F8,64(R3) 95 FMOVD F9,72(R3) 96 FMOVD F10,80(R3) 97 FMOVD F11,88(R3) 98 FMOVD F12,96(R3) 99 FMOVD F13,104(R3) 100 FMOVD F14,112(R3) 101 FMOVD F15,120(R3) 102 FMOVD F16,128(R3) 103 FMOVD F17,136(R3) 104 FMOVD F18,144(R3) 105 FMOVD F19,152(R3) 106 FMOVD F20,160(R3) 107 FMOVD F21,168(R3) 108 FMOVD F22,176(R3) 109 FMOVD F23,184(R3) 110 FMOVD F24,192(R3) 111 FMOVD F25,200(R3) 112 FMOVD F26,208(R3) 113 FMOVD F27,216(R3) 114 FMOVD F28,224(R3) 115 FMOVD F29,232(R3) 116 FMOVD F30,240(R3) 117 FMOVD F31,248(R3) 118 119 MOVFL FPSCR, F0 120 FMOVD F0, 256(R3) 121 MOVFL $0,FPSCR(7) 122 MOVFL $0xD,FPSCR(6) /* VE, OE, ZE */ 123 MOVFL $0, FPSCR(5) 124 MOVFL $0, FPSCR(4) 125 MOVFL $0, FPSCR(3) 126 MOVFL $0, FPSCR(2) 127 MOVFL $0, FPSCR(1) 128 MOVFL $0, FPSCR(0) 129 130 FPOFF(R4, R4) 131 RETURN 132 133TEXT fprestore(SB), $0 134 FPON(R4, R4) 135 136 FMOVD 256(R3), F0 137 MOVFL F0, FPSCR 138 FMOVD 0(R3), F0 139 FMOVD 8(R3), F1 140 FMOVD 16(R3), F2 141 FMOVD 24(R3), F3 142 FMOVD 32(R3), F4 143 FMOVD 40(R3), F5 144 FMOVD 48(R3), F6 145 FMOVD 56(R3), F7 146 FMOVD 64(R3), F8 147 FMOVD 72(R3), F9 148 FMOVD 80(R3), F10 149 FMOVD 88(R3), F11 150 FMOVD 96(R3), F12 151 FMOVD 104(R3), F13 152 FMOVD 112(R3), F14 153 FMOVD 120(R3), F15 154 FMOVD 128(R3), F16 155 FMOVD 136(R3), F17 156 FMOVD 144(R3), F18 157 FMOVD 152(R3), F19 158 FMOVD 160(R3), F20 159 FMOVD 168(R3), F21 160 FMOVD 176(R3), F22 161 FMOVD 184(R3), F23 162 FMOVD 192(R3), F24 163 FMOVD 200(R3), F25 164 FMOVD 208(R3), F26 165 FMOVD 216(R3), F27 166 FMOVD 224(R3), F28 167 FMOVD 232(R3), F29 168 FMOVD 240(R3), F30 169 FMOVD 248(R3), F31 170 171 RETURN 172 173TEXT clrfptrap(SB), $0 174 FPON(R4, R5) 175 MOVFL $0, FPSCR(5) 176 MOVFL $0, FPSCR(3) 177 MOVFL $0, FPSCR(2) 178 MOVFL $0, FPSCR(1) 179 MOVFL $0, FPSCR(0) 180 FPPREV(R4) 181 RETURN 182 183TEXT fpinit(SB), $0 184 FPON(R4, R5) 185 BL kfpinit(SB) 186 RETURN 187 188TEXT fpoff(SB), $0 189 FPOFF(R4, R5) 190 RETURN 191 192 193TEXT FPsave(SB), 1, $0 194 FPON(R4, R5) 195 MOVFL FPSCR, F0 196 FMOVD F0, 0(R3) 197 FPPREV(R4) 198 RETURN 199 200TEXT FPrestore(SB), 1, $0 201 FPON(R4, R5) 202 FMOVD 0(R3), F0 203 MOVFL F0, FPSCR 204 FPPREV(R4) 205 RETURN 206