1#ifndef __ASSEMBLER__ 2# define __ASSEMBLER__ 1 3#endif 4#include "crypto/sparc_arch.h" 5 6#ifdef __arch64__ 7.register %g2,#scratch 8.register %g3,#scratch 9#endif 10 11.text 12.align 32 13.globl des_t4_key_expand 14.type des_t4_key_expand,#function 15des_t4_key_expand: 16 andcc %o0, 0x7, %g0 17 .word 0x91b20300 !alignaddr %o0,%g0,%o0 18 bz,pt %icc, 1f 19 ldd [%o0 + 0x00], %f0 20 ldd [%o0 + 0x08], %f2 21 .word 0x81b00902 !faligndata %f0,%f2,%f0 221: .word 0x81b026c0 !des_kexpand %f0,0,%f0, 23 .word 0x85b026c1 !des_kexpand %f0,1,%f2, 24 std %f0, [%o1 + 0x00] 25 .word 0x8db0a6c3 !des_kexpand %f2,3,%f6, 26 std %f2, [%o1 + 0x08] 27 .word 0x89b0a6c2 !des_kexpand %f2,2,%f4, 28 .word 0x95b1a6c3 !des_kexpand %f6,3,%f10, 29 std %f6, [%o1 + 0x18] 30 .word 0x91b1a6c2 !des_kexpand %f6,2,%f8, 31 std %f4, [%o1 + 0x10] 32 .word 0x9db2a6c3 !des_kexpand %f10,3,%f14, 33 std %f10, [%o1 + 0x28] 34 .word 0x99b2a6c2 !des_kexpand %f10,2,%f12, 35 std %f8, [%o1 + 0x20] 36 .word 0xa1b3a6c1 !des_kexpand %f14,1,%f16, 37 std %f14, [%o1 + 0x38] 38 .word 0xa9b426c3 !des_kexpand %f16,3,%f20, 39 std %f12, [%o1 + 0x30] 40 .word 0xa5b426c2 !des_kexpand %f16,2,%f18, 41 std %f16, [%o1 + 0x40] 42 .word 0xb1b526c3 !des_kexpand %f20,3,%f24, 43 std %f20, [%o1 + 0x50] 44 .word 0xadb526c2 !des_kexpand %f20,2,%f22, 45 std %f18, [%o1 + 0x48] 46 .word 0xb9b626c3 !des_kexpand %f24,3,%f28, 47 std %f24, [%o1 + 0x60] 48 .word 0xb5b626c2 !des_kexpand %f24,2,%f26, 49 std %f22, [%o1 + 0x58] 50 .word 0xbdb726c1 !des_kexpand %f28,1,%f30, 51 std %f28, [%o1 + 0x70] 52 std %f26, [%o1 + 0x68] 53 retl 54 std %f30, [%o1 + 0x78] 55.size des_t4_key_expand,.-des_t4_key_expand 56.globl des_t4_cbc_encrypt 57.align 32 58des_t4_cbc_encrypt: 59 cmp %o2, 0 60 be,pn SIZE_T_CC, .Lcbc_abort 61 srln %o2, 0, %o2 ! needed on v8+, "nop" on v9 62 ld [%o4 + 0], %f0 ! load ivec 63 ld [%o4 + 4], %f1 64 65 and %o0, 7, %g1 66 andn %o0, 7, %o0 67 sll %g1, 3, %g1 68 mov 0xff, %g3 69 prefetch [%o0], 20 70 prefetch [%o0 + 63], 20 71 sub %g0, %g1, %g2 72 and %o1, 7, %g4 73 .word 0x93b24340 !alignaddrl %o1,%g0,%o1 74 srl %g3, %g4, %g3 75 srlx %o2, 3, %o2 76 movrz %g4, 0, %g3 77 prefetch [%o1], 22 78 79 ldd [%o3 + 0x00], %f4 ! load key schedule 80 ldd [%o3 + 0x08], %f6 81 ldd [%o3 + 0x10], %f8 82 ldd [%o3 + 0x18], %f10 83 ldd [%o3 + 0x20], %f12 84 ldd [%o3 + 0x28], %f14 85 ldd [%o3 + 0x30], %f16 86 ldd [%o3 + 0x38], %f18 87 ldd [%o3 + 0x40], %f20 88 ldd [%o3 + 0x48], %f22 89 ldd [%o3 + 0x50], %f24 90 ldd [%o3 + 0x58], %f26 91 ldd [%o3 + 0x60], %f28 92 ldd [%o3 + 0x68], %f30 93 ldd [%o3 + 0x70], %f32 94 ldd [%o3 + 0x78], %f34 95 96.Ldes_cbc_enc_loop: 97 ldx [%o0 + 0], %g4 98 brz,pt %g1, 4f 99 nop 100 101 ldx [%o0 + 8], %g5 102 sllx %g4, %g1, %g4 103 srlx %g5, %g2, %g5 104 or %g5, %g4, %g4 1054: 106 .word 0x85b02304 !movxtod %g4,%f2 107 prefetch [%o0 + 8+63], 20 108 add %o0, 8, %o0 109 .word 0x81b08d80 !fxor %f2,%f0,%f0 ! ^= ivec 110 prefetch [%o1 + 63], 22 111 112 .word 0x81b02680 !des_ip %f0,%f0,, 113 .word 0x80c90126 !des_round %f4,%f6,%f0,%f0 114 .word 0x80ca012a !des_round %f8,%f10,%f0,%f0 115 .word 0x80cb012e !des_round %f12,%f14,%f0,%f0 116 .word 0x80cc0132 !des_round %f16,%f18,%f0,%f0 117 .word 0x80cd0136 !des_round %f20,%f22,%f0,%f0 118 .word 0x80ce013a !des_round %f24,%f26,%f0,%f0 119 .word 0x80cf013e !des_round %f28,%f30,%f0,%f0 120 .word 0x80c84123 !des_round %f32,%f34,%f0,%f0 121 .word 0x81b026a0 !des_iip %f0,%f0,, 122 123 brnz,pn %g3, 2f 124 sub %o2, 1, %o2 125 126 std %f0, [%o1 + 0] 127 brnz,pt %o2, .Ldes_cbc_enc_loop 128 add %o1, 8, %o1 129 130 st %f0, [%o4 + 0] ! write out ivec 131 retl 132 st %f1, [%o4 + 4] 133.Lcbc_abort: 134 retl 135 nop 136 137.align 16 1382: ldxa [%o0]0x82, %g4 ! avoid read-after-write hazard 139 ! and ~4x deterioration 140 ! in inp==out case 141 .word 0x85b00900 !faligndata %f0,%f0,%f2 ! handle unaligned output 142 143 stda %f2, [%o1 + %g3]0xc0 ! partial store 144 add %o1, 8, %o1 145 orn %g0, %g3, %g3 146 stda %f2, [%o1 + %g3]0xc0 ! partial store 147 148 brnz,pt %o2, .Ldes_cbc_enc_loop+4 149 orn %g0, %g3, %g3 150 151 st %f0, [%o4 + 0] ! write out ivec 152 retl 153 st %f1, [%o4 + 4] 154.type des_t4_cbc_encrypt,#function 155.size des_t4_cbc_encrypt,.-des_t4_cbc_encrypt 156 157.globl des_t4_cbc_decrypt 158.align 32 159des_t4_cbc_decrypt: 160 cmp %o2, 0 161 be,pn SIZE_T_CC, .Lcbc_abort 162 srln %o2, 0, %o2 ! needed on v8+, "nop" on v9 163 ld [%o4 + 0], %f2 ! load ivec 164 ld [%o4 + 4], %f3 165 166 and %o0, 7, %g1 167 andn %o0, 7, %o0 168 sll %g1, 3, %g1 169 mov 0xff, %g3 170 prefetch [%o0], 20 171 prefetch [%o0 + 63], 20 172 sub %g0, %g1, %g2 173 and %o1, 7, %g4 174 .word 0x93b24340 !alignaddrl %o1,%g0,%o1 175 srl %g3, %g4, %g3 176 srlx %o2, 3, %o2 177 movrz %g4, 0, %g3 178 prefetch [%o1], 22 179 180 ldd [%o3 + 0x78], %f4 ! load key schedule 181 ldd [%o3 + 0x70], %f6 182 ldd [%o3 + 0x68], %f8 183 ldd [%o3 + 0x60], %f10 184 ldd [%o3 + 0x58], %f12 185 ldd [%o3 + 0x50], %f14 186 ldd [%o3 + 0x48], %f16 187 ldd [%o3 + 0x40], %f18 188 ldd [%o3 + 0x38], %f20 189 ldd [%o3 + 0x30], %f22 190 ldd [%o3 + 0x28], %f24 191 ldd [%o3 + 0x20], %f26 192 ldd [%o3 + 0x18], %f28 193 ldd [%o3 + 0x10], %f30 194 ldd [%o3 + 0x08], %f32 195 ldd [%o3 + 0x00], %f34 196 197.Ldes_cbc_dec_loop: 198 ldx [%o0 + 0], %g4 199 brz,pt %g1, 4f 200 nop 201 202 ldx [%o0 + 8], %g5 203 sllx %g4, %g1, %g4 204 srlx %g5, %g2, %g5 205 or %g5, %g4, %g4 2064: 207 .word 0x81b02304 !movxtod %g4,%f0 208 prefetch [%o0 + 8+63], 20 209 add %o0, 8, %o0 210 prefetch [%o1 + 63], 22 211 212 .word 0x81b02680 !des_ip %f0,%f0,, 213 .word 0x80c90126 !des_round %f4,%f6,%f0,%f0 214 .word 0x80ca012a !des_round %f8,%f10,%f0,%f0 215 .word 0x80cb012e !des_round %f12,%f14,%f0,%f0 216 .word 0x80cc0132 !des_round %f16,%f18,%f0,%f0 217 .word 0x80cd0136 !des_round %f20,%f22,%f0,%f0 218 .word 0x80ce013a !des_round %f24,%f26,%f0,%f0 219 .word 0x80cf013e !des_round %f28,%f30,%f0,%f0 220 .word 0x80c84123 !des_round %f32,%f34,%f0,%f0 221 .word 0x81b026a0 !des_iip %f0,%f0,, 222 223 .word 0x81b08d80 !fxor %f2,%f0,%f0 ! ^= ivec 224 .word 0x85b02304 !movxtod %g4,%f2 225 226 brnz,pn %g3, 2f 227 sub %o2, 1, %o2 228 229 std %f0, [%o1 + 0] 230 brnz,pt %o2, .Ldes_cbc_dec_loop 231 add %o1, 8, %o1 232 233 st %f2, [%o4 + 0] ! write out ivec 234 retl 235 st %f3, [%o4 + 4] 236 237.align 16 2382: ldxa [%o0]0x82, %g4 ! avoid read-after-write hazard 239 ! and ~4x deterioration 240 ! in inp==out case 241 .word 0x81b00900 !faligndata %f0,%f0,%f0 ! handle unaligned output 242 243 stda %f0, [%o1 + %g3]0xc0 ! partial store 244 add %o1, 8, %o1 245 orn %g0, %g3, %g3 246 stda %f0, [%o1 + %g3]0xc0 ! partial store 247 248 brnz,pt %o2, .Ldes_cbc_dec_loop+4 249 orn %g0, %g3, %g3 250 251 st %f2, [%o4 + 0] ! write out ivec 252 retl 253 st %f3, [%o4 + 4] 254.type des_t4_cbc_decrypt,#function 255.size des_t4_cbc_decrypt,.-des_t4_cbc_decrypt 256.globl des_t4_ede3_cbc_encrypt 257.align 32 258des_t4_ede3_cbc_encrypt: 259 cmp %o2, 0 260 be,pn SIZE_T_CC, .Lcbc_abort 261 srln %o2, 0, %o2 ! needed on v8+, "nop" on v9 262 ld [%o4 + 0], %f0 ! load ivec 263 ld [%o4 + 4], %f1 264 265 and %o0, 7, %g1 266 andn %o0, 7, %o0 267 sll %g1, 3, %g1 268 mov 0xff, %g3 269 prefetch [%o0], 20 270 prefetch [%o0 + 63], 20 271 sub %g0, %g1, %g2 272 and %o1, 7, %g4 273 .word 0x93b24340 !alignaddrl %o1,%g0,%o1 274 srl %g3, %g4, %g3 275 srlx %o2, 3, %o2 276 movrz %g4, 0, %g3 277 prefetch [%o1], 22 278 279 ldd [%o3 + 0x00], %f4 ! load key schedule 280 ldd [%o3 + 0x08], %f6 281 ldd [%o3 + 0x10], %f8 282 ldd [%o3 + 0x18], %f10 283 ldd [%o3 + 0x20], %f12 284 ldd [%o3 + 0x28], %f14 285 ldd [%o3 + 0x30], %f16 286 ldd [%o3 + 0x38], %f18 287 ldd [%o3 + 0x40], %f20 288 ldd [%o3 + 0x48], %f22 289 ldd [%o3 + 0x50], %f24 290 ldd [%o3 + 0x58], %f26 291 ldd [%o3 + 0x60], %f28 292 ldd [%o3 + 0x68], %f30 293 ldd [%o3 + 0x70], %f32 294 ldd [%o3 + 0x78], %f34 295 296.Ldes_ede3_cbc_enc_loop: 297 ldx [%o0 + 0], %g4 298 brz,pt %g1, 4f 299 nop 300 301 ldx [%o0 + 8], %g5 302 sllx %g4, %g1, %g4 303 srlx %g5, %g2, %g5 304 or %g5, %g4, %g4 3054: 306 .word 0x85b02304 !movxtod %g4,%f2 307 prefetch [%o0 + 8+63], 20 308 add %o0, 8, %o0 309 .word 0x81b08d80 !fxor %f2,%f0,%f0 ! ^= ivec 310 prefetch [%o1 + 63], 22 311 312 .word 0x81b02680 !des_ip %f0,%f0,, 313 .word 0x80c90126 !des_round %f4,%f6,%f0,%f0 314 .word 0x80ca012a !des_round %f8,%f10,%f0,%f0 315 .word 0x80cb012e !des_round %f12,%f14,%f0,%f0 316 .word 0x80cc0132 !des_round %f16,%f18,%f0,%f0 317 ldd [%o3 + 0x100-0x08], %f36 318 ldd [%o3 + 0x100-0x10], %f38 319 .word 0x80cd0136 !des_round %f20,%f22,%f0,%f0 320 ldd [%o3 + 0x100-0x18], %f40 321 ldd [%o3 + 0x100-0x20], %f42 322 .word 0x80ce013a !des_round %f24,%f26,%f0,%f0 323 ldd [%o3 + 0x100-0x28], %f44 324 ldd [%o3 + 0x100-0x30], %f46 325 .word 0x80cf013e !des_round %f28,%f30,%f0,%f0 326 ldd [%o3 + 0x100-0x38], %f48 327 ldd [%o3 + 0x100-0x40], %f50 328 .word 0x80c84123 !des_round %f32,%f34,%f0,%f0 329 ldd [%o3 + 0x100-0x48], %f52 330 ldd [%o3 + 0x100-0x50], %f54 331 .word 0x81b026a0 !des_iip %f0,%f0,, 332 333 ldd [%o3 + 0x100-0x58], %f56 334 ldd [%o3 + 0x100-0x60], %f58 335 .word 0x81b02680 !des_ip %f0,%f0,, 336 ldd [%o3 + 0x100-0x68], %f60 337 ldd [%o3 + 0x100-0x70], %f62 338 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 339 ldd [%o3 + 0x100-0x78], %f36 340 ldd [%o3 + 0x100-0x80], %f38 341 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 342 .word 0x80cb412f !des_round %f44,%f46,%f0,%f0 343 .word 0x80cc4133 !des_round %f48,%f50,%f0,%f0 344 ldd [%o3 + 0x100+0x00], %f40 345 ldd [%o3 + 0x100+0x08], %f42 346 .word 0x80cd4137 !des_round %f52,%f54,%f0,%f0 347 ldd [%o3 + 0x100+0x10], %f44 348 ldd [%o3 + 0x100+0x18], %f46 349 .word 0x80ce413b !des_round %f56,%f58,%f0,%f0 350 ldd [%o3 + 0x100+0x20], %f48 351 ldd [%o3 + 0x100+0x28], %f50 352 .word 0x80cf413f !des_round %f60,%f62,%f0,%f0 353 ldd [%o3 + 0x100+0x30], %f52 354 ldd [%o3 + 0x100+0x38], %f54 355 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 356 ldd [%o3 + 0x100+0x40], %f56 357 ldd [%o3 + 0x100+0x48], %f58 358 .word 0x81b026a0 !des_iip %f0,%f0,, 359 360 ldd [%o3 + 0x100+0x50], %f60 361 ldd [%o3 + 0x100+0x58], %f62 362 .word 0x81b02680 !des_ip %f0,%f0,, 363 ldd [%o3 + 0x100+0x60], %f36 364 ldd [%o3 + 0x100+0x68], %f38 365 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 366 ldd [%o3 + 0x100+0x70], %f40 367 ldd [%o3 + 0x100+0x78], %f42 368 .word 0x80cb412f !des_round %f44,%f46,%f0,%f0 369 .word 0x80cc4133 !des_round %f48,%f50,%f0,%f0 370 .word 0x80cd4137 !des_round %f52,%f54,%f0,%f0 371 .word 0x80ce413b !des_round %f56,%f58,%f0,%f0 372 .word 0x80cf413f !des_round %f60,%f62,%f0,%f0 373 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 374 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 375 .word 0x81b026a0 !des_iip %f0,%f0,, 376 377 brnz,pn %g3, 2f 378 sub %o2, 1, %o2 379 380 std %f0, [%o1 + 0] 381 brnz,pt %o2, .Ldes_ede3_cbc_enc_loop 382 add %o1, 8, %o1 383 384 st %f0, [%o4 + 0] ! write out ivec 385 retl 386 st %f1, [%o4 + 4] 387 388.align 16 3892: ldxa [%o0]0x82, %g4 ! avoid read-after-write hazard 390 ! and ~2x deterioration 391 ! in inp==out case 392 .word 0x85b00900 !faligndata %f0,%f0,%f2 ! handle unaligned output 393 394 stda %f2, [%o1 + %g3]0xc0 ! partial store 395 add %o1, 8, %o1 396 orn %g0, %g3, %g3 397 stda %f2, [%o1 + %g3]0xc0 ! partial store 398 399 brnz,pt %o2, .Ldes_ede3_cbc_enc_loop+4 400 orn %g0, %g3, %g3 401 402 st %f0, [%o4 + 0] ! write out ivec 403 retl 404 st %f1, [%o4 + 4] 405.type des_t4_ede3_cbc_encrypt,#function 406.size des_t4_ede3_cbc_encrypt,.-des_t4_ede3_cbc_encrypt 407 408.globl des_t4_ede3_cbc_decrypt 409.align 32 410des_t4_ede3_cbc_decrypt: 411 cmp %o2, 0 412 be,pn SIZE_T_CC, .Lcbc_abort 413 srln %o2, 0, %o2 ! needed on v8+, "nop" on v9 414 ld [%o4 + 0], %f2 ! load ivec 415 ld [%o4 + 4], %f3 416 417 and %o0, 7, %g1 418 andn %o0, 7, %o0 419 sll %g1, 3, %g1 420 mov 0xff, %g3 421 prefetch [%o0], 20 422 prefetch [%o0 + 63], 20 423 sub %g0, %g1, %g2 424 and %o1, 7, %g4 425 .word 0x93b24340 !alignaddrl %o1,%g0,%o1 426 srl %g3, %g4, %g3 427 srlx %o2, 3, %o2 428 movrz %g4, 0, %g3 429 prefetch [%o1], 22 430 431 ldd [%o3 + 0x100+0x78], %f4 ! load key schedule 432 ldd [%o3 + 0x100+0x70], %f6 433 ldd [%o3 + 0x100+0x68], %f8 434 ldd [%o3 + 0x100+0x60], %f10 435 ldd [%o3 + 0x100+0x58], %f12 436 ldd [%o3 + 0x100+0x50], %f14 437 ldd [%o3 + 0x100+0x48], %f16 438 ldd [%o3 + 0x100+0x40], %f18 439 ldd [%o3 + 0x100+0x38], %f20 440 ldd [%o3 + 0x100+0x30], %f22 441 ldd [%o3 + 0x100+0x28], %f24 442 ldd [%o3 + 0x100+0x20], %f26 443 ldd [%o3 + 0x100+0x18], %f28 444 ldd [%o3 + 0x100+0x10], %f30 445 ldd [%o3 + 0x100+0x08], %f32 446 ldd [%o3 + 0x100+0x00], %f34 447 448.Ldes_ede3_cbc_dec_loop: 449 ldx [%o0 + 0], %g4 450 brz,pt %g1, 4f 451 nop 452 453 ldx [%o0 + 8], %g5 454 sllx %g4, %g1, %g4 455 srlx %g5, %g2, %g5 456 or %g5, %g4, %g4 4574: 458 .word 0x81b02304 !movxtod %g4,%f0 459 prefetch [%o0 + 8+63], 20 460 add %o0, 8, %o0 461 prefetch [%o1 + 63], 22 462 463 .word 0x81b02680 !des_ip %f0,%f0,, 464 .word 0x80c90126 !des_round %f4,%f6,%f0,%f0 465 .word 0x80ca012a !des_round %f8,%f10,%f0,%f0 466 .word 0x80cb012e !des_round %f12,%f14,%f0,%f0 467 .word 0x80cc0132 !des_round %f16,%f18,%f0,%f0 468 ldd [%o3 + 0x80+0x00], %f36 469 ldd [%o3 + 0x80+0x08], %f38 470 .word 0x80cd0136 !des_round %f20,%f22,%f0,%f0 471 ldd [%o3 + 0x80+0x10], %f40 472 ldd [%o3 + 0x80+0x18], %f42 473 .word 0x80ce013a !des_round %f24,%f26,%f0,%f0 474 ldd [%o3 + 0x80+0x20], %f44 475 ldd [%o3 + 0x80+0x28], %f46 476 .word 0x80cf013e !des_round %f28,%f30,%f0,%f0 477 ldd [%o3 + 0x80+0x30], %f48 478 ldd [%o3 + 0x80+0x38], %f50 479 .word 0x80c84123 !des_round %f32,%f34,%f0,%f0 480 ldd [%o3 + 0x80+0x40], %f52 481 ldd [%o3 + 0x80+0x48], %f54 482 .word 0x81b026a0 !des_iip %f0,%f0,, 483 484 ldd [%o3 + 0x80+0x50], %f56 485 ldd [%o3 + 0x80+0x58], %f58 486 .word 0x81b02680 !des_ip %f0,%f0,, 487 ldd [%o3 + 0x80+0x60], %f60 488 ldd [%o3 + 0x80+0x68], %f62 489 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 490 ldd [%o3 + 0x80+0x70], %f36 491 ldd [%o3 + 0x80+0x78], %f38 492 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 493 .word 0x80cb412f !des_round %f44,%f46,%f0,%f0 494 .word 0x80cc4133 !des_round %f48,%f50,%f0,%f0 495 ldd [%o3 + 0x80-0x08], %f40 496 ldd [%o3 + 0x80-0x10], %f42 497 .word 0x80cd4137 !des_round %f52,%f54,%f0,%f0 498 ldd [%o3 + 0x80-0x18], %f44 499 ldd [%o3 + 0x80-0x20], %f46 500 .word 0x80ce413b !des_round %f56,%f58,%f0,%f0 501 ldd [%o3 + 0x80-0x28], %f48 502 ldd [%o3 + 0x80-0x30], %f50 503 .word 0x80cf413f !des_round %f60,%f62,%f0,%f0 504 ldd [%o3 + 0x80-0x38], %f52 505 ldd [%o3 + 0x80-0x40], %f54 506 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 507 ldd [%o3 + 0x80-0x48], %f56 508 ldd [%o3 + 0x80-0x50], %f58 509 .word 0x81b026a0 !des_iip %f0,%f0,, 510 511 ldd [%o3 + 0x80-0x58], %f60 512 ldd [%o3 + 0x80-0x60], %f62 513 .word 0x81b02680 !des_ip %f0,%f0,, 514 ldd [%o3 + 0x80-0x68], %f36 515 ldd [%o3 + 0x80-0x70], %f38 516 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 517 ldd [%o3 + 0x80-0x78], %f40 518 ldd [%o3 + 0x80-0x80], %f42 519 .word 0x80cb412f !des_round %f44,%f46,%f0,%f0 520 .word 0x80cc4133 !des_round %f48,%f50,%f0,%f0 521 .word 0x80cd4137 !des_round %f52,%f54,%f0,%f0 522 .word 0x80ce413b !des_round %f56,%f58,%f0,%f0 523 .word 0x80cf413f !des_round %f60,%f62,%f0,%f0 524 .word 0x80c94127 !des_round %f36,%f38,%f0,%f0 525 .word 0x80ca412b !des_round %f40,%f42,%f0,%f0 526 .word 0x81b026a0 !des_iip %f0,%f0,, 527 528 .word 0x81b08d80 !fxor %f2,%f0,%f0 ! ^= ivec 529 .word 0x85b02304 !movxtod %g4,%f2 530 531 brnz,pn %g3, 2f 532 sub %o2, 1, %o2 533 534 std %f0, [%o1 + 0] 535 brnz,pt %o2, .Ldes_ede3_cbc_dec_loop 536 add %o1, 8, %o1 537 538 st %f2, [%o4 + 0] ! write out ivec 539 retl 540 st %f3, [%o4 + 4] 541 542.align 16 5432: ldxa [%o0]0x82, %g4 ! avoid read-after-write hazard 544 ! and ~3x deterioration 545 ! in inp==out case 546 .word 0x81b00900 !faligndata %f0,%f0,%f0 ! handle unaligned output 547 548 stda %f0, [%o1 + %g3]0xc0 ! partial store 549 add %o1, 8, %o1 550 orn %g0, %g3, %g3 551 stda %f0, [%o1 + %g3]0xc0 ! partial store 552 553 brnz,pt %o2, .Ldes_ede3_cbc_dec_loop+4 554 orn %g0, %g3, %g3 555 556 st %f2, [%o4 + 0] ! write out ivec 557 retl 558 st %f3, [%o4 + 4] 559.type des_t4_ede3_cbc_decrypt,#function 560.size des_t4_ede3_cbc_decrypt,.-des_t4_ede3_cbc_decrypt 561.asciz "DES for SPARC T4, David S. Miller, Andy Polyakov" 562.align 4 563