memcmp in BIR
The snippet can be accessed without any authentication.
Authored by
Griffin, Matt J Dr (PG/R - Comp Sci & Elec Eng)
BIR representation of UCRT's memcmp
implementation distributed with VS Community 2022 (17.5).
Analysed with options: -dbir
--optimization-level=3
--bil-enable-intrinsics=llvm:lfence
memcmp.bir 8.48 KiB
00494ef8: sub memcmp(memcmp_s1, memcmp_s2, memcmp_n, memcmp_result)
0049cde9: memcmp_s1 :: in out u64 = RDI
0049cdea: memcmp_s2 :: in out u64 = RSI
0049cdeb: memcmp_n :: in u64 = RDX
0049cdec: memcmp_result :: out u32 = RAX
001452e3:
00145316: RDX := RDX - RCX
0014534d: #12567515 := R8 - 8
00145351: CF := R8 < 8
00145361: PF := ~low:1[let $2660 = #12567515 >> 4 ^ #12567515 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00145369: ZF := 0 = #12567515
00145370: when CF goto %0014536d
00494ef9: goto %00146ee5
00146ee5:
00146ef5: #12567338 := low:8[RCX] & 7
00146efb: CF := 0
00146f03: PF := ~low:1[let $2660 = #12567338 >> 4 ^ #12567338 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146f0b: ZF := 0 = #12567338
00146f12: when ZF goto %00146f0f
00494efa: goto %00146f55
00146f55:
00494efb: goto %00146f57
00146f57:
00146f61: RAX := high:56[RAX].mem[RCX]
00146f88: #12567334 := low:8[RAX] - mem[RCX + RDX]
00146f8f: CF := low:8[RAX] < mem[RCX + RDX]
00146fa5: PF := ~low:1[let $2660 = #12567334 >> 4 ^ #12567334 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146fad: ZF := 0 = #12567334
00146fb3: when ~ZF goto %001453d5
00494efc: goto %00146fb7
00146fb7:
00146fd3: RCX := RCX + 1
00147009: R8 := R8 - 1
00147021: ZF := 0 = R8
00147033: #12567328 := low:8[RCX] & 7
00147039: CF := 0
00147041: PF := ~low:1[let $2660 = #12567328 >> 4 ^ #12567328 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00147049: ZF := 0 = #12567328
0014704f: when ~ZF goto %00146f57
00494efd: goto %00146f0f
00146f0f:
00146f1b: R9 := R8
00146f30: #12567336 := R9
00146f34: R9 := R9 >> 3
00146f38: CF := high:1[#12567336 << 0x3D]
00146f40: ZF := 0 = R9
00146f45: PF := ~low:1[let $2660 = R9 >> 4 ^ R9 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146f51: when ~ZF goto %0014547d
00494efe: goto %0014536d
0014547d:
00145490: #12567503 := R9
00145494: R9 := R9 >> 2
00145498: CF := high:1[#12567503 << 0x3E]
001454a0: ZF := 0 = R9
001454a5: PF := ~low:1[let $2660 = R9 >> 4 ^ R9 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
001454b2: when ZF goto %001454af
00494eff: goto %00146bf5
00146bf5:
00146bfd: RAX := mem[RCX, el]:u64
00146c24: #12567358 := RAX - mem[RCX + RDX, el]:u64
00146c2b: CF := RAX < mem[RCX + RDX, el]:u64
00146c41: PF := ~low:1[let $2660 = #12567358 >> 4 ^ #12567358 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146c49: ZF := 0 = #12567358
00146c4f: when ~ZF goto %0014554d
00494f00: goto %00146c53
00146c53:
00146c5b: RAX := mem[RCX + 8, el]:u64
00146c82: #12567356 := RAX - mem[RCX + RDX + 8, el]:u64
00146c89: CF := RAX < mem[RCX + RDX + 8, el]:u64
00146c9f: PF := ~low:1[let $2660 = #12567356 >> 4 ^ #12567356 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146ca7: ZF := 0 = #12567356
00146cad: when ~ZF goto %00146bb5
00494f01: goto %00146cb1
00146cb1:
00146cb9: RAX := mem[RCX + 0x10, el]:u64
00146ce0: #12567354 := RAX - mem[RCX + RDX + 0x10, el]:u64
00146ce7: CF := RAX < mem[RCX + RDX + 0x10, el]:u64
00146cfd: PF := ~low:1[let $2660 = #12567354 >> 4 ^ #12567354 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146d05: ZF := 0 = #12567354
00146d0b: when ~ZF goto %00146b75
00494f02: goto %00146d0f
00146d0f:
00146d17: RAX := mem[RCX + 0x18, el]:u64
00146d3e: #12567352 := RAX - mem[RCX + RDX + 0x18, el]:u64
00146d5b: PF := ~low:1[let $2660 = #12567352 >> 4 ^ #12567352 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146d63: ZF := 0 = #12567352
00146d69: when ~ZF goto %00146b35
00494f03: goto %00146d6d
00146b35:
00146b50: #12567367 := RCX
00146b54: RCX := RCX + 8
00146b59: CF := RCX < #12567367
00146b6b: PF := ~low:1[let $2660 = RCX >> 4 ^ RCX in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146b73: ZF := 0 = RCX
00494f04: goto %00146b75
00146b75:
00146b90: #12567364 := RCX
00146b94: RCX := RCX + 8
00146b99: CF := RCX < #12567364
00146bab: PF := ~low:1[let $2660 = RCX >> 4 ^ RCX in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146bb3: ZF := 0 = RCX
00494f05: goto %00146bb5
00146bb5:
00146bd0: #12567361 := RCX
00146bd4: RCX := RCX + 8
00146bd9: CF := RCX < #12567361
00146beb: PF := ~low:1[let $2660 = RCX >> 4 ^ RCX in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146bf3: ZF := 0 = RCX
00494f06: goto %0014554d
00146d6d:
00146d88: #12567350 := RCX
00146d8c: RCX := RCX + 0x20
00146d91: CF := RCX < #12567350
00146dab: ZF := 0 = RCX
00146dc7: R9 := R9 - 1
00146dd7: PF := ~low:1[let $2660 = R9 >> 4 ^ R9 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146ddf: ZF := 0 = R9
00146de5: when ~ZF goto %00146bf5
00494f07: goto %00146de9
00146de9:
00146df9: R8 := R8 & 0x1F
00146dff: CF := 0
00146e07: PF := ~low:1[let $2660 = R8 >> 4 ^ R8 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146e0f: ZF := 0 = R8
00494f08: goto %001454af
001454af:
001454bb: R9 := R8
001454d0: #12567501 := R9
001454d4: R9 := R9 >> 3
001454d8: CF := high:1[#12567501 << 0x3D]
001454e0: ZF := 0 = R9
001454e5: PF := ~low:1[let $2660 = R9 >> 4 ^ R9 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
001454f1: when ZF goto %0014536d
00494f09: goto %001454f5
001454f5:
001454fd: RAX := mem[RCX, el]:u64
00145524: #12567499 := RAX - mem[RCX + RDX, el]:u64
0014552b: CF := RAX < mem[RCX + RDX, el]:u64
00145541: PF := ~low:1[let $2660 = #12567499 >> 4 ^ #12567499 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00145549: ZF := 0 = #12567499
00145550: when ~ZF goto %0014554d
00494f0a: goto %00146a8d
0014554d:
0014555d: RCX := mem[RDX + RCX, el]:u64
00145573: RAX := extract:7:0[RAX].extract:15:8[RAX].extract:23:16[RAX].extract:31:24[RAX].extract:39:32[RAX].extract:47:40[RAX].extract:55:48[RAX].extract:63:56[RAX]
00145589: RCX := extract:7:0[RCX].extract:15:8[RCX].extract:23:16[RCX].extract:31:24[RCX].extract:39:32[RCX].extract:47:40[RCX].extract:55:48[RCX].extract:63:56[RCX]
001455ab: CF := RAX < RCX
001455ea: #12567495 := low:32[RAX]
001455ee: #12567494 := low:32[RAX]
001455f4: RAX := pad:64[#12567494 - #12567495 + pad:32[CF]]
00145604: CF := #12567494 < #12567495 + pad:32[CF] | #12567495 + pad:32[CF] < #12567495
00145634: #12567491 := low:32[RAX]
00145639: RAX := pad:64[#12567491 - 0xFFFFFFFF + pad:32[CF]]
0014564f: PF := ~low:1[let $2660 = low:32[RAX] >> 4 ^ low:32[RAX] in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00145657: ZF := 0 = low:32[RAX]
00145664: #12567489 := mem[RSP, el]:u64
00145668: RSP := RSP + 8
0014566b: call #12567489 with noreturn
00146a8d:
00146aa8: #12567373 := RCX
00146aac: RCX := RCX + 8
00146ab1: CF := RCX < #12567373
00146acb: ZF := 0 = RCX
00146ae7: R9 := R9 - 1
00146af7: PF := ~low:1[let $2660 = R9 >> 4 ^ R9 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146aff: ZF := 0 = R9
00146b05: when ~ZF goto %001454f5
00494f0b: goto %00146b09
00146b09:
00146b19: R8 := R8 & 7
00146b1f: CF := 0
00146b27: PF := ~low:1[let $2660 = R8 >> 4 ^ R8 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146b2f: ZF := 0 = R8
00146b33: goto %0014536d
0014536d:
00145383: #12567513 := R8
00145389: CF := 0
00145391: PF := ~low:1[let $2660 = #12567513 >> 4 ^ #12567513 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00145399: ZF := 0 = #12567513
001453a0: when ZF goto %0014539d
00494f0c: goto %00146e11
00146e11:
00146e1b: RAX := high:56[RAX].mem[RCX]
00146e42: #12567344 := low:8[RAX] - mem[RCX + RDX]
00146e49: CF := low:8[RAX] < mem[RCX + RDX]
00146e5f: PF := ~low:1[let $2660 = #12567344 >> 4 ^ #12567344 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146e67: ZF := 0 = #12567344
00146e6d: when ~ZF goto %001453d5
00494f0d: goto %00146e71
001453d5:
001453f8: #12567510 := low:32[RAX]
001453fc: #12567509 := low:32[RAX]
00145402: RAX := pad:64[#12567509 - #12567510 + pad:32[CF]]
00145412: CF := #12567509 < #12567510 + pad:32[CF] | #12567510 + pad:32[CF] < #12567510
00145442: #12567506 := low:32[RAX]
00145447: RAX := pad:64[#12567506 - 0xFFFFFFFF + pad:32[CF]]
0014545d: PF := ~low:1[let $2660 = low:32[RAX] >> 4 ^ low:32[RAX] in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00145465: ZF := 0 = low:32[RAX]
00145472: #12567504 := mem[RSP, el]:u64
00145476: RSP := RSP + 8
00145479: call #12567504 with noreturn
00146e71:
00146e8d: RCX := RCX + 1
00146ea7: ZF := 0 = RCX
00146ec3: R8 := R8 - 1
00146ed3: PF := ~low:1[let $2660 = R8 >> 4 ^ R8 in let $2661 = $2660 >> 2 ^ $2660 in $2661 >> 1 ^ $2661]
00146edb: ZF := 0 = R8
00146ee1: when ~ZF goto %00146e11
00494f0e: goto %0014539d
0014539d:
001453ad: RAX := 0
001453b3: ZF := 1
001453b6: PF := 1
001453cc: #12567511 := mem[RSP, el]:u64
001453d0: RSP := RSP + 8
001453d3: call #12567511 with noreturn
-
Comprehensive Guides for Analytical and Reflective Essays are essential for structuring your thoughts and presenting a well-organized argument. If you're preparing for a speech, consider using funny persuasive speech topics that will not only entertain but also engage your audience, leaving them with memorable takeaways.
Please register or sign in to comment